<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/19490">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware/app: Initial commit for the game Snake<br><br>Change-Id: I3c3f012552f2a7474ade911fc071c89e55e19352<br>---<br>A src/target/firmware/apps/snake_game/main.c<br>1 file changed, 521 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/apps/snake_game/main.c b/src/target/firmware/apps/snake_game/main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..44dda9a</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/apps/snake_game/main.c</span><br><span>@@ -0,0 +1,521 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* The game Snake as Free Software for Calypso Phone */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2013 by Marcel `sdrfnord` McKinnon <sdrfnord@gmx.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#define DEBUG 1</span><br><span style="color: hsl(120, 100%, 40%);">+#define KNRM  "\x1B[0m"</span><br><span style="color: hsl(120, 100%, 40%);">+#define UNDERLINE  "\x1B[4m"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <delay.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rffe.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <keypad.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <board.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <abb/twl3025.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/trf6151.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/clock.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/tpu.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/tsp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/dsp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/irq.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/backlight.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <comm/sercomm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <comm/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <fb/framebuffer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <battery/battery.h></span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+{</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void srand(unsigned int seed)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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 style="color: hsl(120, 100%, 40%);">+#define BLANK 0</span><br><span style="color: hsl(120, 100%, 40%);">+#define HEAD 1</span><br><span style="color: hsl(120, 100%, 40%);">+#define TAIL 2</span><br><span style="color: hsl(120, 100%, 40%);">+#define HEAD_FOOD 3</span><br><span style="color: hsl(120, 100%, 40%);">+#define FOOD 9</span><br><span style="color: hsl(120, 100%, 40%);">+#define SBODY 20</span><br><span style="color: hsl(120, 100%, 40%);">+/* The numbers above 20 are the distance to the head.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 21 is direly behind the head.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define STDLEN 3</span><br><span style="color: hsl(120, 100%, 40%);">+#define HEIGHT 7</span><br><span style="color: hsl(120, 100%, 40%);">+#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 style="color: hsl(120, 100%, 40%);">+struct position {</span><br><span style="color: hsl(120, 100%, 40%);">+    int x;</span><br><span style="color: hsl(120, 100%, 40%);">+        int y;</span><br><span style="color: hsl(120, 100%, 40%);">+} pos;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t field[WIDTH][HEIGHT];</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t score = 0, lenght = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+enum errors { ALLRIGHT, SNAKE_COL } err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void printField();</span><br><span style="color: hsl(120, 100%, 40%);">+void setItem(int, int, int);</span><br><span style="color: hsl(120, 100%, 40%);">+void movepos(char);</span><br><span style="color: hsl(120, 100%, 40%);">+void increaseBodyAge();</span><br><span style="color: hsl(120, 100%, 40%);">+void setFood()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int x, y, c;</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</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Next %u\n", next);</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Rand (%d|%d)\n", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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 style="color: hsl(120, 100%, 40%);">+     for (x = 0; x < WIDTH; x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              for (y = 0; y < HEIGHT; 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%);">+#if DEBUG > 0</span><br><span style="color: hsl(120, 100%, 40%);">+                         printf("Set without rand (%d|%d) %d\n", x, y,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      c);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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 style="color: hsl(120, 100%, 40%);">+     }</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%);">+static void print_snake_str(char *text, int16_t x, int16_t y)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      x = 6 * x;</span><br><span style="color: hsl(120, 100%, 40%);">+    y = 8 * (y + 1) - 3;</span><br><span style="color: hsl(120, 100%, 40%);">+#if DEBUG > 1</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("Put string %s to (%d|%d)\n", text, x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+   fb_gotoxy(x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_putstr(text, framebuffer->width);</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%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  Move = move;</span><br><span style="color: hsl(120, 100%, 40%);">+  setItem(pos.x, pos.y, SBODY);</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 style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (move) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case 'j':</span><br><span style="color: hsl(120, 100%, 40%);">+     case 'k':</span><br><span style="color: hsl(120, 100%, 40%);">+             if (pos.y == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      pos.y = HEIGHT - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           else if (pos.y == HEIGHT)</span><br><span style="color: hsl(120, 100%, 40%);">+                     pos.y = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            increaseBodyAge();</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 'l':</span><br><span style="color: hsl(120, 100%, 40%);">+     case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+             if (pos.x == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      pos.x = WIDTH - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (pos.x == WIDTH)</span><br><span style="color: hsl(120, 100%, 40%);">+                      pos.x = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            increaseBodyAge();</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     setItem(pos.x, pos.y, HEAD);</span><br><span style="color: hsl(120, 100%, 40%);">+  printField();</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%);">+void movepos_timer_cb(void *p)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("Auto move %c\n", Move);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void movepos_keypress(char keypress)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void increaseBodyAge()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int y, x;</span><br><span style="color: hsl(120, 100%, 40%);">+     lenght = SBODY + STDLEN + score;</span><br><span style="color: hsl(120, 100%, 40%);">+      for (x = 0; x < WIDTH; x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              for (y = 0; y < HEIGHT; y++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (field[x][y] >= lenght)</span><br><span style="color: hsl(120, 100%, 40%);">+                         field[x][y] = BLANK;</span><br><span style="color: hsl(120, 100%, 40%);">+                  else if (field[x][y] >= SBODY)</span><br><span style="color: hsl(120, 100%, 40%);">+                             field[x][y]++;</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void setItem(int x, int y, int item)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (item == HEAD) {</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (field[x][y]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case FOOD:</span><br><span style="color: hsl(120, 100%, 40%);">+                    score++;</span><br><span style="color: hsl(120, 100%, 40%);">+                      setFood();</span><br><span style="color: hsl(120, 100%, 40%);">+                    item = HEAD_FOOD;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case BLANK:</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      err = SNAKE_COL;</span><br><span style="color: hsl(120, 100%, 40%);">+                      score--;</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%);">+     field[x][y] = item;</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%);">+void resetField()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* system("clear"); */</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("\033[H\033[2J");</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%);">+void printField()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fb_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+   int x, y;</span><br><span style="color: hsl(120, 100%, 40%);">+     for (y = 0; y < HEIGHT; y++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             for (x = 0; x < WIDTH; x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      switch (field[x][y]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        case BLANK:</span><br><span style="color: hsl(120, 100%, 40%);">+                           break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case HEAD:</span><br><span style="color: hsl(120, 100%, 40%);">+                            print_snake_str("O", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+                         break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case HEAD_FOOD:</span><br><span style="color: hsl(120, 100%, 40%);">+                               print_snake_str("P", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+                         break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case FOOD:</span><br><span style="color: hsl(120, 100%, 40%);">+                            print_snake_str("#", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+                         break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        default:</span><br><span style="color: hsl(120, 100%, 40%);">+                              if (field[x][y] == lenght)</span><br><span style="color: hsl(120, 100%, 40%);">+                                    print_snake_str(";", x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+                         else</span><br><span style="color: hsl(120, 100%, 40%);">+                                  print_snake_str("o", x, y);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Score: %d\n", score);</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_gotoxy(0, framebuffer->height - 9);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_lineto(framebuffer->width - 1, framebuffer->cursor_y);</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_gotoxy(0, framebuffer->height - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     char text[16];</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (err) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case SNAKE_COL:</span><br><span style="color: hsl(120, 100%, 40%);">+               fb_putstr("The snake ate itself!!!", framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+                err = ALLRIGHT;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              sprintf(text, "Score: %d", score);</span><br><span style="color: hsl(120, 100%, 40%);">+          fb_putstr(text, framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+               framebuffer->cursor_x = 45;</span><br><span style="color: hsl(120, 100%, 40%);">+                fb_putstr("OsmocomBB", framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if DEBUG > 0</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("Pos X: %d, Y: %d\n", pos.x, pos.y);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     for (y = -1; y < HEIGHT; y++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            for (x = -1; x < WIDTH; x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (y == -1 || x == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (x == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                                  printf(" %2d: ", y);</span><br><span style="color: hsl(120, 100%, 40%);">+                                else if (y == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                                     printf(UNDERLINE " %2d" KNRM,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       x);</span><br><span style="color: hsl(120, 100%, 40%);">+                   } else</span><br><span style="color: hsl(120, 100%, 40%);">+                                printf(" %2d", field[x][y]);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             puts("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+int cursor = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+#define NEIGH_LINES    ((framebuffer->height +8) / 8)</span><br><span style="color: hsl(120, 100%, 40%);">+static void print_display(char *text, int *y, int c)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    /* skip lines, given by cursor */</span><br><span style="color: hsl(120, 100%, 40%);">+     (*y)++;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (c >= (*y)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Line %d: Return c >= y\n", *y);</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%);">+     /* skip, if end of display area is reached */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((*y) - c > NEIGH_LINES) {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Line %d: Return\n", *y);</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 style="color: hsl(120, 100%, 40%);">+   fb_gotoxy(0, -3 + (((*y) - c - 1) << 3));</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_putstr(text, framebuffer->width);</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%);">+void fb_clear_fancy(uint8_t delay)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t x, y;</span><br><span style="color: hsl(120, 100%, 40%);">+ fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     for (x = 0; x < framebuffer->width; x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              for (y = 0; y < framebuffer->height; y++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     fb_set_p(x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+           delay_ms(delay);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* for (x = 0; x < framebuffer->width; x++) { */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (; x >= 0; x--) {</span><br><span style="color: hsl(120, 100%, 40%);">+              for (y = 0; y < framebuffer->height; y++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     fb_set_p(x, y);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+           delay_ms(delay);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_WHITE);</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%);">+void intro()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfont(FB_FONT_HELVB14);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fb_gotoxy(framebuffer->width / 2 - 7 * 3, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_putstr("Snake", framebuffer->width - 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    fb_gotoxy(14, framebuffer->height - 5);</span><br><span style="color: hsl(120, 100%, 40%);">+    fb_setfont(FB_FONT_HELVR08);</span><br><span style="color: hsl(120, 100%, 40%);">+  fb_putstr("Version: " GIT_SHORTHASH, framebuffer->width - 4);</span><br><span style="color: hsl(120, 100%, 40%);">+    fb_gotoxy(0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_boxto(framebuffer->width - 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_boxto(framebuffer->width - 2, framebuffer->height - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_boxto(0, framebuffer->height - 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_boxto(1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("(%u, %u)\n", framebuffer->width, framebuffer->height);</span><br><span style="color: hsl(120, 100%, 40%);">+        fb_gotoxy(2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_lineto(framebuffer->width - 3, framebuffer->height - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_gotoxy(2, framebuffer->height - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_lineto(framebuffer->width - 3, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_flush();</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%);">+/* Main Program */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *hr =</span><br><span style="color: hsl(120, 100%, 40%);">+    "======================================================================\n";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void key_handler(enum key_codes code, enum key_states state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void console_rx_cb(uint8_t dlci, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (dlci != SC_DLCI_CONSOLE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("Message for unknown DLCI %u\n", dlci);</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 style="color: hsl(120, 100%, 40%);">+   printf("Message on console DLCI: '%s'\n", msg->data);</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_free(msg);</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%);">+static void l1a_l23_rx_cb(uint8_t dlci, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        puts("l1a_l23_rx_cb: ");</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < msg->len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("%02x ", msg->data[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+   puts("\n");</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%);">+int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ board_init(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      puts("\n\nOsmocomBB Test sdrfnord (revision " GIT_REVISION ")\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Dump device identification */</span><br><span style="color: hsl(120, 100%, 40%);">+      dump_dev_id();</span><br><span style="color: hsl(120, 100%, 40%);">+        puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Dump clock config before PLL set */</span><br><span style="color: hsl(120, 100%, 40%);">+        calypso_clk_dump();</span><br><span style="color: hsl(120, 100%, 40%);">+   puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Dump clock config after PLL set */</span><br><span style="color: hsl(120, 100%, 40%);">+ calypso_clk_dump();</span><br><span style="color: hsl(120, 100%, 40%);">+   puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fb_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+   bl_level(255);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timers_update();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       intro();</span><br><span style="color: hsl(120, 100%, 40%);">+      delay_ms(5000);</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_clear_fancy(20);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfont(FB_FONT_HELVR08);</span><br><span style="color: hsl(120, 100%, 40%);">+  fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ pos.x = framebuffer->width / (6 * 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      pos.y = framebuffer->height / (8 * 2);</span><br><span style="color: hsl(120, 100%, 40%);">+     setItem(pos.x, pos.y, HEAD);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (battery_info.bat_volt_mV == 0)</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</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Initialize random number generator with %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      battery_info.bat_volt_mV);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+    setFood();</span><br><span style="color: hsl(120, 100%, 40%);">+    printField();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+       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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* beyond this point we only react to interrupts */</span><br><span style="color: hsl(120, 100%, 40%);">+   puts("entering interrupt loop\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_timers_update();</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%);">+   twl3025_power_off();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (1) {</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void key_handler(enum key_codes code, enum key_states state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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 style="color: hsl(120, 100%, 40%);">+     if (state != PRESSED)</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%);">+     switch (code) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case KEY_0:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(0);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_1:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(10);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_2:</span><br><span style="color: hsl(120, 100%, 40%);">+           movepos_keypress('k');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_3:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(30);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_4:</span><br><span style="color: hsl(120, 100%, 40%);">+           movepos_keypress('h');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_5:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(50);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_6:</span><br><span style="color: hsl(120, 100%, 40%);">+           movepos_keypress('l');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_7:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(150);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_8:</span><br><span style="color: hsl(120, 100%, 40%);">+           movepos_keypress('j');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_9:</span><br><span style="color: hsl(120, 100%, 40%);">+           bl_level(255);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                // used to be display_puts...</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_STAR:</span><br><span style="color: hsl(120, 100%, 40%);">+                // used to be display puts...</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_HASH:</span><br><span style="color: hsl(120, 100%, 40%);">+                // used to be display puts...</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_LEFT_SB:</span><br><span style="color: hsl(120, 100%, 40%);">+             bl_mode_pwl(1);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_RIGHT_SB:</span><br><span style="color: hsl(120, 100%, 40%);">+            bl_mode_pwl(0);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_POWER:</span><br><span style="color: hsl(120, 100%, 40%);">+               twl3025_power_off_now();</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_RIGHT:</span><br><span style="color: hsl(120, 100%, 40%);">+               movepos_keypress('l');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_LEFT:</span><br><span style="color: hsl(120, 100%, 40%);">+                movepos_keypress('h');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+          movepos_keypress('k');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+                movepos_keypress('j');</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/19490">change 19490</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/+/19490"/><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: I3c3f012552f2a7474ade911fc071c89e55e19352 </div>
<div style="display:none"> Gerrit-Change-Number: 19490 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: roox <mardnh@gmx.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>