<p>roox has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/19487">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implemented rand() and automove for snake.<br><br>Change-Id: I94bf887160a4a58423b93fcfd47c92e09404507c<br>---<br>M src/target/firmware/abb/twl3025.c<br>M src/target/firmware/apps/snake_game/main.c<br>2 files changed, 73 insertions(+), 32 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/87/19487/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/abb/twl3025.c b/src/target/firmware/abb/twl3025.c</span><br><span>index 55ff2ad..5b792d6 100644</span><br><span>--- a/src/target/firmware/abb/twl3025.c</span><br><span>+++ b/src/target/firmware/abb/twl3025.c</span><br><span>@@ -229,9 +229,10 @@</span><br><span>   twl3025_reg_write(VRPCDEV, 0x01);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void twl3025_power_off_now(void) {</span><br><span style="color: hsl(0, 100%, 40%);">-    /* The phone will restart if the power butten has not been released.</span><br><span style="color: hsl(0, 100%, 40%);">-     * This can be useful for development. */</span><br><span style="color: hsl(120, 100%, 40%);">+void twl3025_power_off_now(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The phone will restart if the power butten has not been released.</span><br><span style="color: hsl(120, 100%, 40%);">+   * This can be useful for development. */</span><br><span>    unsigned long flags;</span><br><span>         local_firq_save(flags);</span><br><span>      twl3025_reg_write(VRPCDEV, 0x01);</span><br><span>diff --git a/src/target/firmware/apps/snake_game/main.c b/src/target/firmware/apps/snake_game/main.c</span><br><span>index a4e8296..c263df4 100644</span><br><span>--- a/src/target/firmware/apps/snake_game/main.c</span><br><span>+++ b/src/target/firmware/apps/snake_game/main.c</span><br><span>@@ -48,6 +48,16 @@</span><br><span> #include <fb/framebuffer.h></span><br><span> #include <battery/battery.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+unsigned long next = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+/* This is not a good random number generator ... */</span><br><span style="color: hsl(120, 100%, 40%);">+int rand(void) {</span><br><span style="color: hsl(120, 100%, 40%);">+   next = next * 110351 + 12;</span><br><span style="color: hsl(120, 100%, 40%);">+    return (unsigned int)(next & 0x7fff);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+void srand(unsigned int seed) {</span><br><span style="color: hsl(120, 100%, 40%);">+ next = seed;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define BLANK 0</span><br><span> #define HEAD 1</span><br><span> #define TAIL 2</span><br><span>@@ -60,6 +70,10 @@</span><br><span> #define STDLEN 3</span><br><span> #define HEIGHT 7</span><br><span> #define WIDTH 16</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Time in ms to wait to the next auto move of the snake. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define WAIT_TIME_AUTOMOVE 300</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct position {</span><br><span>     int x;</span><br><span>       int y;</span><br><span>@@ -75,14 +89,16 @@</span><br><span> void increaseBodyAge();</span><br><span> void setFood() {</span><br><span>  int x, y, c;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* for (c = 0; c < 10;c++) { */</span><br><span style="color: hsl(0, 100%, 40%);">-      /*      x = rand() % (WIDTH -1); */</span><br><span style="color: hsl(0, 100%, 40%);">-     /*      y = rand() % (HEIGHT -1); */</span><br><span style="color: hsl(0, 100%, 40%);">-    /*      if (field[x][y] == BLANK) { */</span><br><span style="color: hsl(0, 100%, 40%);">-  /*              field[x][y] = FOOD; */</span><br><span style="color: hsl(0, 100%, 40%);">-  /*              return; */</span><br><span style="color: hsl(0, 100%, 40%);">-      /*      } */</span><br><span style="color: hsl(0, 100%, 40%);">-    /* } */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (c = 0; c < 10;c++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          x = rand() % (WIDTH -1);</span><br><span style="color: hsl(120, 100%, 40%);">+              y = rand() % (HEIGHT -1);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (DEBUG > 0) printf("Next %u\n", next);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (DEBUG > 0) printf("Rand (%d|%d)\n", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (field[x][y] == BLANK) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   field[x][y] = FOOD;</span><br><span style="color: hsl(120, 100%, 40%);">+                   return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span>    for (x = 0; x < WIDTH; x++) {</span><br><span>             for (y = 0; y < HEIGHT; y++) {</span><br><span>                    if (field[x][y] == BLANK) {</span><br><span>@@ -98,25 +114,29 @@</span><br><span> {</span><br><span>      x = 6 * x;</span><br><span>   y = 8 * (y+1) -3;</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("Put string %s to (%d|%d)\n", text, x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (DEBUG > 1) printf("Put string %s to (%d|%d)\n", text, x, y);</span><br><span>        fb_gotoxy(x, y);</span><br><span>     fb_putstr(text, framebuffer->width);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-void movepos(char dim) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+char Move;</span><br><span style="color: hsl(120, 100%, 40%);">+void movepos(char move) {</span><br><span style="color: hsl(120, 100%, 40%);">+       Move = move;</span><br><span>         setItem(pos.x, pos.y, SBODY);</span><br><span style="color: hsl(0, 100%, 40%);">-   switch (dim) {</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'Y': pos.y++;break;</span><br><span style="color: hsl(0, 100%, 40%);">-                case 'y': pos.y--;break;</span><br><span style="color: hsl(0, 100%, 40%);">-                case 'X': pos.x++;break;</span><br><span style="color: hsl(0, 100%, 40%);">-                case 'x': pos.x--;break;</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (move) {</span><br><span style="color: hsl(120, 100%, 40%);">+               case 'h': pos.x--;break;</span><br><span style="color: hsl(120, 100%, 40%);">+              case 'j': pos.y++;break;</span><br><span style="color: hsl(120, 100%, 40%);">+              case 'k': pos.y--;break;</span><br><span style="color: hsl(120, 100%, 40%);">+              case 'l': pos.x++;break;</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (dim) {</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'Y': case 'y':</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (move) {</span><br><span style="color: hsl(120, 100%, 40%);">+               case 'j': case 'k':</span><br><span>                  if (pos.y == -1) pos.y = HEIGHT -1;</span><br><span>                  else if (pos.y == HEIGHT) pos.y = 0;</span><br><span>                         increaseBodyAge();</span><br><span>                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'X': case 'x':</span><br><span style="color: hsl(120, 100%, 40%);">+           case 'l': case 'h':</span><br><span>                  if (pos.x == -1) pos.x = WIDTH -1;</span><br><span>                   else if (pos.x == WIDTH) pos.x = 0;</span><br><span>                  increaseBodyAge();</span><br><span>@@ -125,6 +145,21 @@</span><br><span>    setItem(pos.x, pos.y, HEAD);</span><br><span>         printField();</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+void movepos_timer_cb(void *p) {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_timer_list *tmr = (struct osmo_timer_list*)p;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (DEBUG > 0) printf("Auto move %c\n", Move);</span><br><span style="color: hsl(120, 100%, 40%);">+   movepos(Move);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_timer_schedule(tmr, WAIT_TIME_AUTOMOVE);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_timer_list move_snake_timer = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .cb = &movepos_timer_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+  .data = &move_snake_timer</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+void movepos_keypress(char keypress) {</span><br><span style="color: hsl(120, 100%, 40%);">+     Move = keypress;</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_timer_schedule(&move_snake_timer, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> void increaseBodyAge() {</span><br><span>    int y, x;</span><br><span>@@ -309,15 +344,12 @@</span><br><span>    calypso_clk_dump();</span><br><span>  puts(hr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   keypad_set_handler(&key_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        /* Dump clock config after PLL set */</span><br><span>        calypso_clk_dump();</span><br><span>  puts(hr);</span><br><span> </span><br><span>        fb_clear();</span><br><span>  bl_level(255);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* srand(23); // need time or other changing value */</span><br><span> </span><br><span>    intro();</span><br><span>     delay_ms(5000);</span><br><span>@@ -343,6 +375,10 @@</span><br><span>         pos.x = framebuffer->width/(6 * 2);</span><br><span>         pos.y = framebuffer->height/(8 * 2);</span><br><span>  setItem(pos.x, pos.y, HEAD);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timers_update();</span><br><span style="color: hsl(120, 100%, 40%);">+ srand(battery_info.bat_volt_mV);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (DEBUG > 0) printf("Initialize random number generator with %d\n", battery_info.bat_volt_mV);</span><br><span>        setFood();</span><br><span>   printf("Put string to (%d|%d)\n", pos.x, pos.y);</span><br><span>   printField();</span><br><span>@@ -350,6 +386,7 @@</span><br><span> </span><br><span>      sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb);</span><br><span>      sercomm_register_rx_cb(SC_DLCI_L1A_L23, l1a_l23_rx_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+       keypad_set_handler(&key_handler);</span><br><span> </span><br><span>    /* beyond this point we only react to interrupts */</span><br><span>  puts("entering interrupt loop\n");</span><br><span>@@ -364,19 +401,22 @@</span><br><span> </span><br><span> void key_handler(enum key_codes code, enum key_states state)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!osmo_timer_pending(&move_snake_timer)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_timer_schedule(&move_snake_timer,WAIT_TIME_AUTOMOVE);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    if (state != PRESSED)</span><br><span>                return;</span><br><span> </span><br><span>  switch (code) {</span><br><span>      case KEY_0: bl_level(0);break;</span><br><span>       case KEY_1: bl_level(10);break;</span><br><span style="color: hsl(0, 100%, 40%);">- case KEY_2: movepos('y');break;</span><br><span style="color: hsl(120, 100%, 40%);">+       case KEY_2: movepos_keypress('k');break;</span><br><span>     case KEY_3: bl_level(30);break;</span><br><span style="color: hsl(0, 100%, 40%);">- case KEY_4: movepos('x');break;</span><br><span style="color: hsl(120, 100%, 40%);">+       case KEY_4: movepos_keypress('h');break;</span><br><span>     case KEY_5: bl_level(50);break;</span><br><span style="color: hsl(0, 100%, 40%);">- case KEY_6: movepos('X');break;</span><br><span style="color: hsl(120, 100%, 40%);">+       case KEY_6: movepos_keypress('l');break;</span><br><span>     case KEY_7: bl_level(150);break;</span><br><span style="color: hsl(0, 100%, 40%);">-        case KEY_8: movepos('Y');break;</span><br><span style="color: hsl(120, 100%, 40%);">+       case KEY_8: movepos_keypress('j');break;</span><br><span>     case KEY_9: bl_level(255);break;</span><br><span>             // used to be display_puts...</span><br><span>                break;</span><br><span>@@ -395,10 +435,10 @@</span><br><span>       case KEY_POWER:</span><br><span>              twl3025_power_off_now();</span><br><span>             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case KEY_RIGHT: movepos('X'); break;</span><br><span style="color: hsl(0, 100%, 40%);">-    case KEY_LEFT:  movepos('x'); break;</span><br><span style="color: hsl(0, 100%, 40%);">-    case KEY_UP:    movepos('y'); break;</span><br><span style="color: hsl(0, 100%, 40%);">-    case KEY_DOWN:  movepos('Y'); break;</span><br><span style="color: hsl(120, 100%, 40%);">+  case KEY_RIGHT: movepos_keypress('l'); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case KEY_LEFT:  movepos_keypress('h'); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case KEY_UP:    movepos_keypress('k'); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case KEY_DOWN:  movepos_keypress('j'); break;</span><br><span>        default:</span><br><span>             break;</span><br><span>       }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/19487">change 19487</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmocom-bb/+/19487"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I94bf887160a4a58423b93fcfd47c92e09404507c </div>
<div style="display:none"> Gerrit-Change-Number: 19487 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: roox <mardnh@gmx.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>