This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
roox gerrit-no-reply at lists.osmocom.orgroox has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/19487 ) Change subject: Implemented rand() and automove for snake. ...................................................................... Implemented rand() and automove for snake. Change-Id: I94bf887160a4a58423b93fcfd47c92e09404507c --- M src/target/firmware/abb/twl3025.c M src/target/firmware/apps/snake_game/main.c 2 files changed, 73 insertions(+), 32 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/87/19487/1 diff --git a/src/target/firmware/abb/twl3025.c b/src/target/firmware/abb/twl3025.c index 55ff2ad..5b792d6 100644 --- a/src/target/firmware/abb/twl3025.c +++ b/src/target/firmware/abb/twl3025.c @@ -229,9 +229,10 @@ twl3025_reg_write(VRPCDEV, 0x01); } -void twl3025_power_off_now(void) { - /* The phone will restart if the power butten has not been released. - * This can be useful for development. */ +void twl3025_power_off_now(void) +{ + /* The phone will restart if the power butten has not been released. + * This can be useful for development. */ unsigned long flags; local_firq_save(flags); twl3025_reg_write(VRPCDEV, 0x01); diff --git a/src/target/firmware/apps/snake_game/main.c b/src/target/firmware/apps/snake_game/main.c index a4e8296..c263df4 100644 --- a/src/target/firmware/apps/snake_game/main.c +++ b/src/target/firmware/apps/snake_game/main.c @@ -48,6 +48,16 @@ #include <fb/framebuffer.h> #include <battery/battery.h> +unsigned long next = 1; +/* This is not a good random number generator ... */ +int rand(void) { + next = next * 110351 + 12; + return (unsigned int)(next & 0x7fff); +} +void srand(unsigned int seed) { + next = seed; +} + #define BLANK 0 #define HEAD 1 #define TAIL 2 @@ -60,6 +70,10 @@ #define STDLEN 3 #define HEIGHT 7 #define WIDTH 16 + +/* Time in ms to wait to the next auto move of the snake. */ +#define WAIT_TIME_AUTOMOVE 300 + struct position { int x; int y; @@ -75,14 +89,16 @@ void increaseBodyAge(); void setFood() { int x, y, c; - /* for (c = 0; c < 10;c++) { */ - /* x = rand() % (WIDTH -1); */ - /* y = rand() % (HEIGHT -1); */ - /* if (field[x][y] == BLANK) { */ - /* field[x][y] = FOOD; */ - /* return; */ - /* } */ - /* } */ + for (c = 0; c < 10;c++) { + x = rand() % (WIDTH -1); + y = rand() % (HEIGHT -1); + if (DEBUG > 0) printf("Next %u\n", next); + if (DEBUG > 0) printf("Rand (%d|%d)\n", x, y); + if (field[x][y] == BLANK) { + field[x][y] = FOOD; + return; + } + } for (x = 0; x < WIDTH; x++) { for (y = 0; y < HEIGHT; y++) { if (field[x][y] == BLANK) { @@ -98,25 +114,29 @@ { x = 6 * x; y = 8 * (y+1) -3; - printf("Put string %s to (%d|%d)\n", text, x, y); + if (DEBUG > 1) printf("Put string %s to (%d|%d)\n", text, x, y); fb_gotoxy(x, y); fb_putstr(text, framebuffer->width); } -void movepos(char dim) { + + +char Move; +void movepos(char move) { + Move = move; setItem(pos.x, pos.y, SBODY); - switch (dim) { - case 'Y': pos.y++;break; - case 'y': pos.y--;break; - case 'X': pos.x++;break; - case 'x': pos.x--;break; + switch (move) { + case 'h': pos.x--;break; + case 'j': pos.y++;break; + case 'k': pos.y--;break; + case 'l': pos.x++;break; } - switch (dim) { - case 'Y': case 'y': + switch (move) { + case 'j': case 'k': if (pos.y == -1) pos.y = HEIGHT -1; else if (pos.y == HEIGHT) pos.y = 0; increaseBodyAge(); break; - case 'X': case 'x': + case 'l': case 'h': if (pos.x == -1) pos.x = WIDTH -1; else if (pos.x == WIDTH) pos.x = 0; increaseBodyAge(); @@ -125,6 +145,21 @@ setItem(pos.x, pos.y, HEAD); printField(); } +void movepos_timer_cb(void *p) { + struct osmo_timer_list *tmr = (struct osmo_timer_list*)p; + if (DEBUG > 0) printf("Auto move %c\n", Move); + movepos(Move); + + osmo_timer_schedule(tmr, WAIT_TIME_AUTOMOVE); +} +static struct osmo_timer_list move_snake_timer = { + .cb = &movepos_timer_cb, + .data = &move_snake_timer +}; +void movepos_keypress(char keypress) { + Move = keypress; + osmo_timer_schedule(&move_snake_timer, 0); +} void increaseBodyAge() { int y, x; @@ -309,15 +344,12 @@ calypso_clk_dump(); puts(hr); - keypad_set_handler(&key_handler); - /* Dump clock config after PLL set */ calypso_clk_dump(); puts(hr); fb_clear(); bl_level(255); - /* srand(23); // need time or other changing value */ intro(); delay_ms(5000); @@ -343,6 +375,10 @@ pos.x = framebuffer->width/(6 * 2); pos.y = framebuffer->height/(8 * 2); setItem(pos.x, pos.y, HEAD); + + osmo_timers_update(); + srand(battery_info.bat_volt_mV); + if (DEBUG > 0) printf("Initialize random number generator with %d\n", battery_info.bat_volt_mV); setFood(); printf("Put string to (%d|%d)\n", pos.x, pos.y); printField(); @@ -350,6 +386,7 @@ sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb); sercomm_register_rx_cb(SC_DLCI_L1A_L23, l1a_l23_rx_cb); + keypad_set_handler(&key_handler); /* beyond this point we only react to interrupts */ puts("entering interrupt loop\n"); @@ -364,19 +401,22 @@ void key_handler(enum key_codes code, enum key_states state) { + if (!osmo_timer_pending(&move_snake_timer)) { + osmo_timer_schedule(&move_snake_timer,WAIT_TIME_AUTOMOVE); + } if (state != PRESSED) return; switch (code) { case KEY_0: bl_level(0);break; case KEY_1: bl_level(10);break; - case KEY_2: movepos('y');break; + case KEY_2: movepos_keypress('k');break; case KEY_3: bl_level(30);break; - case KEY_4: movepos('x');break; + case KEY_4: movepos_keypress('h');break; case KEY_5: bl_level(50);break; - case KEY_6: movepos('X');break; + case KEY_6: movepos_keypress('l');break; case KEY_7: bl_level(150);break; - case KEY_8: movepos('Y');break; + case KEY_8: movepos_keypress('j');break; case KEY_9: bl_level(255);break; // used to be display_puts... break; @@ -395,10 +435,10 @@ case KEY_POWER: twl3025_power_off_now(); break; - case KEY_RIGHT: movepos('X'); break; - case KEY_LEFT: movepos('x'); break; - case KEY_UP: movepos('y'); break; - case KEY_DOWN: movepos('Y'); break; + case KEY_RIGHT: movepos_keypress('l'); break; + case KEY_LEFT: movepos_keypress('h'); break; + case KEY_UP: movepos_keypress('k'); break; + case KEY_DOWN: movepos_keypress('j'); break; default: break; } -- To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/19487 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-Change-Id: I94bf887160a4a58423b93fcfd47c92e09404507c Gerrit-Change-Number: 19487 Gerrit-PatchSet: 1 Gerrit-Owner: roox <mardnh at gmx.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200801/4dd15668/attachment.htm>