NXP Rapid IoT prototyping kit port of Silabs "hungry gecko" smake-like game. https://os.mbed.com/teams/SiliconLabs/code/Hungry_gecko/

Dependencies:   lib_sx9500 GraphicsDisplay ColorMemLCD Large_fonts

See a detailed description of this project on Hackster.io . https://www.hackster.io/marcomerli/riotwear-snake-ca6dfc

Committer:
batman52
Date:
Thu Dec 26 16:47:58 2019 +0000
Revision:
80:77210aa1ad9c
Parent:
79:0431b9fd3dc0
Child:
81:737dff75e013
NXP Rapid IoT prototyping kit port of Silabs "Hhungry Gecko" ( https://os.mbed.com/teams/SiliconLabs/code/Hungry_gecko/ ) snake-like game.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
batman52 80:77210aa1ad9c 1 /***************************************************************************//**
batman52 80:77210aa1ad9c 2 * @file main.cpp
batman52 80:77210aa1ad9c 3 * @brief Demo program for game Hungry Gecko
batman52 80:77210aa1ad9c 4 *******************************************************************************
batman52 80:77210aa1ad9c 5 * @section License
batman52 80:77210aa1ad9c 6 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
batman52 80:77210aa1ad9c 7 *******************************************************************************
batman52 80:77210aa1ad9c 8 *
batman52 80:77210aa1ad9c 9 * Permission is granted to anyone to use this software for any purpose,
batman52 80:77210aa1ad9c 10 * including commercial applications, and to alter it and redistribute it
batman52 80:77210aa1ad9c 11 * freely, subject to the following restrictions:
batman52 80:77210aa1ad9c 12 *
batman52 80:77210aa1ad9c 13 * 1. The origin of this software must not be misrepresented; you must not
batman52 80:77210aa1ad9c 14 * claim that you wrote the original software.
batman52 80:77210aa1ad9c 15 * 2. Altered source versions must be plainly marked as such, and must not be
batman52 80:77210aa1ad9c 16 * misrepresented as being the original software.
batman52 80:77210aa1ad9c 17 * 3. This notice may not be removed or altered from any source distribution.
batman52 80:77210aa1ad9c 18 *
batman52 80:77210aa1ad9c 19 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
batman52 80:77210aa1ad9c 20 * obligation to support this Software. Silicon Labs is providing the
batman52 80:77210aa1ad9c 21 * Software "AS IS", with no express or implied warranties of any kind,
batman52 80:77210aa1ad9c 22 * including, but not limited to, any implied warranties of merchantability
batman52 80:77210aa1ad9c 23 * or fitness for any particular purpose or warranties against infringement
batman52 80:77210aa1ad9c 24 * of any proprietary rights of a third party.
batman52 80:77210aa1ad9c 25 *
batman52 80:77210aa1ad9c 26 * Silicon Labs will not be liable for any consequential, incidental, or
batman52 80:77210aa1ad9c 27 * special damages, or any other relief, or for any claim by any third party,
batman52 80:77210aa1ad9c 28 * arising from your use of this Software.
batman52 80:77210aa1ad9c 29 *
batman52 80:77210aa1ad9c 30 ******************************************************************************/
batman52 80:77210aa1ad9c 31
batman52 80:77210aa1ad9c 32 // #include "LS013B7DH03.h"
batman52 80:77210aa1ad9c 33 #include "gecko.h"
batman52 80:77210aa1ad9c 34 #include "food.h"
batman52 80:77210aa1ad9c 35 #include "settings.h"
batman52 80:77210aa1ad9c 36
batman52 80:77210aa1ad9c 37 // Rapid IoT LCD stuff
batman52 80:77210aa1ad9c 38 #include "ColorMemLCD.h"
batman52 80:77210aa1ad9c 39 #include "string"
batman52 80:77210aa1ad9c 40 #include "Prototype24x27.h"
batman52 80:77210aa1ad9c 41 #include "Prototype_num21x25.h"
batman52 80:77210aa1ad9c 42 #include "meirio_num11x14.h"
batman52 80:77210aa1ad9c 43
batman52 80:77210aa1ad9c 44
batman52 80:77210aa1ad9c 45 /**************************** Define I/O **************************************/
batman52 80:77210aa1ad9c 46
batman52 80:77210aa1ad9c 47 /* LEDS */
batman52 80:77210aa1ad9c 48 DigitalOut led_blue(LED_BLUE, 1); // 1 = OFF
batman52 80:77210aa1ad9c 49 DigitalOut led_red(LED_RED, 1);
batman52 80:77210aa1ad9c 50
batman52 80:77210aa1ad9c 51 /* Rapid IoT Buttons */
batman52 80:77210aa1ad9c 52 // InterruptIn in(PTA4);
batman52 80:77210aa1ad9c 53 InterruptIn in(PTE28);
batman52 80:77210aa1ad9c 54 InterruptIn inB1(PTE9);
batman52 80:77210aa1ad9c 55 // InterruptIn SW1(PTE8);
batman52 80:77210aa1ad9c 56 // DigitalIn SW3(PTE10);
batman52 80:77210aa1ad9c 57 // DigitalIn SW4(PTE28);
batman52 80:77210aa1ad9c 58
batman52 80:77210aa1ad9c 59 DigitalOut lcd_light(PTE12, 1); // 1 = ON, 0 = OFF
batman52 80:77210aa1ad9c 60 ColorMemLCD display( PTB22, PTB23, PTB21, PTB20, PTD15, PTD9, "TFT");
batman52 80:77210aa1ad9c 61
batman52 80:77210aa1ad9c 62 /**************************** Define Timers ***********************************/
batman52 80:77210aa1ad9c 63
batman52 80:77210aa1ad9c 64 // LowPowerTicker ticker;
batman52 80:77210aa1ad9c 65 Ticker ticker;
batman52 80:77210aa1ad9c 66
batman52 80:77210aa1ad9c 67 /**************************** Global variables ********************************/
batman52 80:77210aa1ad9c 68
batman52 80:77210aa1ad9c 69 /* Flag that is set to true when the display is refreshed */
batman52 80:77210aa1ad9c 70 volatile bool refreshed = false;
batman52 80:77210aa1ad9c 71
batman52 80:77210aa1ad9c 72 /* Flag that is set to true by the ticker. Makes the gecko move at regular time intervals */
batman52 80:77210aa1ad9c 73 volatile bool updateDisplay = true;
batman52 80:77210aa1ad9c 74
batman52 80:77210aa1ad9c 75 /* A flag that ensures the controller to only read one click per frame */
batman52 80:77210aa1ad9c 76 volatile bool PBenabled = true;
batman52 80:77210aa1ad9c 77
batman52 80:77210aa1ad9c 78 /* Direction in which the gecko moves */
batman52 80:77210aa1ad9c 79 Direction dir = UP;
batman52 80:77210aa1ad9c 80
batman52 80:77210aa1ad9c 81 uint8_t score = 0;
batman52 80:77210aa1ad9c 82
batman52 80:77210aa1ad9c 83 /**************************** Define callback handlers ************************/
batman52 80:77210aa1ad9c 84 void tickerCallback(void);
batman52 80:77210aa1ad9c 85
batman52 80:77210aa1ad9c 86 /* Push button handlers */
batman52 80:77210aa1ad9c 87 void in_handler_B0();
batman52 80:77210aa1ad9c 88 void in_handler_B1();
batman52 80:77210aa1ad9c 89
batman52 80:77210aa1ad9c 90 /* Define game modes */
batman52 80:77210aa1ad9c 91 typedef enum {
batman52 80:77210aa1ad9c 92 PLAY, STOP
batman52 80:77210aa1ad9c 93 } Modes;
batman52 80:77210aa1ad9c 94
batman52 80:77210aa1ad9c 95 /* Set the game mode */
batman52 80:77210aa1ad9c 96 Modes mode = PLAY;
batman52 80:77210aa1ad9c 97
batman52 80:77210aa1ad9c 98 void in_handler_B0()
batman52 80:77210aa1ad9c 99 {
batman52 80:77210aa1ad9c 100 /* Only change the direction if push button is enabled */
batman52 80:77210aa1ad9c 101 if (PBenabled) {
batman52 80:77210aa1ad9c 102 switch (dir) {
batman52 80:77210aa1ad9c 103 case (UP):
batman52 80:77210aa1ad9c 104 dir = LEFT;
batman52 80:77210aa1ad9c 105 break;
batman52 80:77210aa1ad9c 106 case (DOWN):
batman52 80:77210aa1ad9c 107 dir = RIGHT;
batman52 80:77210aa1ad9c 108 break;
batman52 80:77210aa1ad9c 109 case (RIGHT):
batman52 80:77210aa1ad9c 110 dir = UP;
batman52 80:77210aa1ad9c 111 break;
batman52 80:77210aa1ad9c 112 case (LEFT):
batman52 80:77210aa1ad9c 113 dir = DOWN;
batman52 80:77210aa1ad9c 114 break;
batman52 80:77210aa1ad9c 115 }
batman52 80:77210aa1ad9c 116 PBenabled = false;
batman52 80:77210aa1ad9c 117 }
batman52 80:77210aa1ad9c 118 }
batman52 80:77210aa1ad9c 119
batman52 80:77210aa1ad9c 120 void in_handler_B1()
batman52 80:77210aa1ad9c 121 {
batman52 80:77210aa1ad9c 122 /* Only change the direction if push button is enabled */
batman52 80:77210aa1ad9c 123 if (PBenabled) {
batman52 80:77210aa1ad9c 124 switch (dir) {
batman52 80:77210aa1ad9c 125 case UP:
batman52 80:77210aa1ad9c 126 dir = RIGHT;
batman52 80:77210aa1ad9c 127 break;
batman52 80:77210aa1ad9c 128 case DOWN:
batman52 80:77210aa1ad9c 129 dir = LEFT;
batman52 80:77210aa1ad9c 130 break;
batman52 80:77210aa1ad9c 131 case RIGHT:
batman52 80:77210aa1ad9c 132 dir = DOWN;
batman52 80:77210aa1ad9c 133 break;
batman52 80:77210aa1ad9c 134 case LEFT:
batman52 80:77210aa1ad9c 135 dir = UP;
batman52 80:77210aa1ad9c 136 break;
batman52 80:77210aa1ad9c 137 }
batman52 80:77210aa1ad9c 138 PBenabled = false;
batman52 80:77210aa1ad9c 139 }
batman52 80:77210aa1ad9c 140 }
batman52 80:77210aa1ad9c 141
batman52 80:77210aa1ad9c 142
batman52 80:77210aa1ad9c 143 /* Callback functions */
batman52 80:77210aa1ad9c 144 #define POLLING_LOOP 3
batman52 80:77210aa1ad9c 145 void pollingUpdate(void)
batman52 80:77210aa1ad9c 146 {
batman52 80:77210aa1ad9c 147 static uint8_t idx = POLLING_LOOP;
batman52 80:77210aa1ad9c 148 idx--;
batman52 80:77210aa1ad9c 149 if(idx==0) {
batman52 80:77210aa1ad9c 150 display.polling();
batman52 80:77210aa1ad9c 151 idx = POLLING_LOOP;
batman52 80:77210aa1ad9c 152 led_blue = !led_blue;
batman52 80:77210aa1ad9c 153 }
batman52 80:77210aa1ad9c 154
batman52 80:77210aa1ad9c 155 }
batman52 80:77210aa1ad9c 156
batman52 80:77210aa1ad9c 157 void tickerCallback(void)
batman52 80:77210aa1ad9c 158 {
batman52 80:77210aa1ad9c 159 updateDisplay = true;
batman52 80:77210aa1ad9c 160
batman52 80:77210aa1ad9c 161 /* Enable push buttons if the display is refreshed */
batman52 80:77210aa1ad9c 162 PBenabled = refreshed;
batman52 80:77210aa1ad9c 163
batman52 80:77210aa1ad9c 164 led_red = !led_red;
batman52 80:77210aa1ad9c 165 }
batman52 80:77210aa1ad9c 166
batman52 80:77210aa1ad9c 167 void refreshCallback(void)
batman52 80:77210aa1ad9c 168 {
batman52 80:77210aa1ad9c 169 refreshed = true;
batman52 80:77210aa1ad9c 170 }
batman52 80:77210aa1ad9c 171
batman52 80:77210aa1ad9c 172 /**************************** Fill the boarder ********************************/
batman52 80:77210aa1ad9c 173
batman52 80:77210aa1ad9c 174 void fillEdge(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)
batman52 80:77210aa1ad9c 175 {
batman52 80:77210aa1ad9c 176 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 177 display.window(x,y,w,h);
batman52 80:77210aa1ad9c 178 #endif
batman52 80:77210aa1ad9c 179
batman52 80:77210aa1ad9c 180 display.fill (x,y,w,h, color);
batman52 80:77210aa1ad9c 181
batman52 80:77210aa1ad9c 182 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 183 display.update();
batman52 80:77210aa1ad9c 184 #endif
batman52 80:77210aa1ad9c 185 }
batman52 80:77210aa1ad9c 186
batman52 80:77210aa1ad9c 187 void fillBoarder(){
batman52 80:77210aa1ad9c 188
batman52 80:77210aa1ad9c 189 // fill score header
batman52 80:77210aa1ad9c 190 fillEdge(0, 0, DISPLAY_WIDTH, TOPEDGE*STEPSIZE, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 191
batman52 80:77210aa1ad9c 192 // Fill right edge
batman52 80:77210aa1ad9c 193 fillEdge(DISPLAY_WIDTH - (BOARDERWIDTH/2), TOPEDGE*STEPSIZE + BOARDERWIDTH/2, 1, BOARD_HEIGHT*STEPSIZE, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 194
batman52 80:77210aa1ad9c 195 for (uint8_t i=0;i<=BOARD_HEIGHT;i++){
batman52 80:77210aa1ad9c 196 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2);j++){
batman52 80:77210aa1ad9c 197 display.pixel(BOARD_WIDTH*STEPSIZE + BOARDERWIDTH/2 +j, (i+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 198 }
batman52 80:77210aa1ad9c 199 }
batman52 80:77210aa1ad9c 200
batman52 80:77210aa1ad9c 201 // Fill bottom edge
batman52 80:77210aa1ad9c 202 fillEdge(BOARDERWIDTH/2, (BOARD_HEIGHT+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2, BOARD_WIDTH*STEPSIZE, 1, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 203
batman52 80:77210aa1ad9c 204 for (uint8_t i=0;i<=BOARD_WIDTH;i++){
batman52 80:77210aa1ad9c 205 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2);j++){
batman52 80:77210aa1ad9c 206 display.pixel(i*STEPSIZE + BOARDERWIDTH/2 +j, (BOARD_HEIGHT+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 207 }
batman52 80:77210aa1ad9c 208 }
batman52 80:77210aa1ad9c 209
batman52 80:77210aa1ad9c 210 // Fill left edge
batman52 80:77210aa1ad9c 211 fillEdge(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2, 1, BOARD_HEIGHT*STEPSIZE, Black);
batman52 80:77210aa1ad9c 212
batman52 80:77210aa1ad9c 213 for (uint8_t i=0;i<=BOARD_HEIGHT;i++){
batman52 80:77210aa1ad9c 214 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2 - 1);j++){
batman52 80:77210aa1ad9c 215 // display.pixel(j, (i+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 216 display.pixel(j, (i+TOPEDGE)*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 217 }
batman52 80:77210aa1ad9c 218 }
batman52 80:77210aa1ad9c 219
batman52 80:77210aa1ad9c 220 // Fill top edge
batman52 80:77210aa1ad9c 221 fillEdge(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2 - 1, BOARD_WIDTH*STEPSIZE, 1, Black);
batman52 80:77210aa1ad9c 222
batman52 80:77210aa1ad9c 223 for (uint8_t i=0;i<=BOARD_WIDTH;i++){
batman52 80:77210aa1ad9c 224 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2 - 1);j++){
batman52 80:77210aa1ad9c 225 // display.pixel(i*STEPSIZE + BOARDERWIDTH/2 + j, TOPEDGE*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 226 display.pixel(i*STEPSIZE + j, TOPEDGE*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 227 }
batman52 80:77210aa1ad9c 228 }
batman52 80:77210aa1ad9c 229
batman52 80:77210aa1ad9c 230 }
batman52 80:77210aa1ad9c 231
batman52 80:77210aa1ad9c 232
batman52 80:77210aa1ad9c 233 void display_clear_all(void)
batman52 80:77210aa1ad9c 234 {
batman52 80:77210aa1ad9c 235 display.foreground(FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 236 display.background(BACKGROUND_COLOR);
batman52 80:77210aa1ad9c 237
batman52 80:77210aa1ad9c 238 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 239 int j;
batman52 80:77210aa1ad9c 240 int Divide = 8; // separate for 8 windows to save memory
batman52 80:77210aa1ad9c 241 int Block = LCD_DISP_HEIGHT / Divide;
batman52 80:77210aa1ad9c 242
batman52 80:77210aa1ad9c 243 for(j = 0 ; j <Divide ; j++) {
batman52 80:77210aa1ad9c 244 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 245 display.cls();
batman52 80:77210aa1ad9c 246 display.update();
batman52 80:77210aa1ad9c 247 }
batman52 80:77210aa1ad9c 248 #else
batman52 80:77210aa1ad9c 249 display.window(0, 0, LCD_DISP_WIDTH, LCD_DISP_HEIGHT);
batman52 80:77210aa1ad9c 250 display.cls();
batman52 80:77210aa1ad9c 251 display.update();
batman52 80:77210aa1ad9c 252 #endif
batman52 80:77210aa1ad9c 253
batman52 80:77210aa1ad9c 254 }
batman52 80:77210aa1ad9c 255
batman52 80:77210aa1ad9c 256 void display_score(void)
batman52 80:77210aa1ad9c 257 {
batman52 80:77210aa1ad9c 258 int j = 0;
batman52 80:77210aa1ad9c 259 int Block = 27; // Text Font height;
batman52 80:77210aa1ad9c 260
batman52 80:77210aa1ad9c 261 display.foreground(White);
batman52 80:77210aa1ad9c 262 display.background(Black);
batman52 80:77210aa1ad9c 263
batman52 80:77210aa1ad9c 264 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 265 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 266 #else
batman52 80:77210aa1ad9c 267 display.window(0, 0, LCD_DISP_WIDTH, LCD_DISP_HEIGHT);
batman52 80:77210aa1ad9c 268 #endif
batman52 80:77210aa1ad9c 269
batman52 80:77210aa1ad9c 270 display.fill(0,0,LCD_DISP_WIDTH, Block, Black);
batman52 80:77210aa1ad9c 271
batman52 80:77210aa1ad9c 272 display.locate(4, j*Block);
batman52 80:77210aa1ad9c 273 display.printf("Score: %02d", score);
batman52 80:77210aa1ad9c 274 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 275 display.update();
batman52 80:77210aa1ad9c 276 #else
batman52 80:77210aa1ad9c 277 // reduce buffer window size to game area for faster refresh rate
batman52 80:77210aa1ad9c 278 display.window(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2, BOARD_WIDTH * STEPSIZE, BOARD_HEIGHT * STEPSIZE);
batman52 80:77210aa1ad9c 279 #endif
batman52 80:77210aa1ad9c 280 display.foreground(FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 281 display.background(BACKGROUND_COLOR);
batman52 80:77210aa1ad9c 282 }
batman52 80:77210aa1ad9c 283
batman52 80:77210aa1ad9c 284 #define GAME_OVER_X 40
batman52 80:77210aa1ad9c 285 void display_game_over(void)
batman52 80:77210aa1ad9c 286 {
batman52 80:77210aa1ad9c 287 int j = 3;
batman52 80:77210aa1ad9c 288 int Block = 27; // Text Font height: 6 lines of text
batman52 80:77210aa1ad9c 289
batman52 80:77210aa1ad9c 290 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 291 display.locate(GAME_OVER_X, j*Block);
batman52 80:77210aa1ad9c 292 display.printf("GAME");
batman52 80:77210aa1ad9c 293 display.update();
batman52 80:77210aa1ad9c 294
batman52 80:77210aa1ad9c 295 j++;
batman52 80:77210aa1ad9c 296 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 297 display.locate(GAME_OVER_X, j*Block);
batman52 80:77210aa1ad9c 298 display.printf("OVER!");
batman52 80:77210aa1ad9c 299 display.update();
batman52 80:77210aa1ad9c 300 }
batman52 80:77210aa1ad9c 301
batman52 80:77210aa1ad9c 302 /**************************** MAIN ********************************************/
batman52 80:77210aa1ad9c 303 int main()
batman52 80:77210aa1ad9c 304 {
batman52 80:77210aa1ad9c 305 /* Initialize pushbutton handlers */
batman52 80:77210aa1ad9c 306 in.fall(in_handler_B0);
batman52 80:77210aa1ad9c 307 inB1.fall(in_handler_B1);
batman52 80:77210aa1ad9c 308
batman52 80:77210aa1ad9c 309 /* Enable the LCD */
batman52 80:77210aa1ad9c 310 display.command_AllClear();
batman52 80:77210aa1ad9c 311 display.set_font( (unsigned char*)Prototype24x27 );
batman52 80:77210aa1ad9c 312
batman52 80:77210aa1ad9c 313 #if TICKER_EN
batman52 80:77210aa1ad9c 314 /* Start generating the 3Hz call */
batman52 80:77210aa1ad9c 315 ticker.attach(&tickerCallback, 0.3333f);
batman52 80:77210aa1ad9c 316 #endif
batman52 80:77210aa1ad9c 317
batman52 80:77210aa1ad9c 318 /* Reset the LCD to a blank state. (All white) */
batman52 80:77210aa1ad9c 319 display_clear_all();
batman52 80:77210aa1ad9c 320 fillBoarder();
batman52 80:77210aa1ad9c 321 display_score();
batman52 80:77210aa1ad9c 322
batman52 80:77210aa1ad9c 323 Gecko gck;
batman52 80:77210aa1ad9c 324 Food fd;
batman52 80:77210aa1ad9c 325 gck.draw(display);
batman52 80:77210aa1ad9c 326 fd.draw(display);
batman52 80:77210aa1ad9c 327
batman52 80:77210aa1ad9c 328 /* Push update to the display */
batman52 80:77210aa1ad9c 329 display.update();
batman52 80:77210aa1ad9c 330
batman52 80:77210aa1ad9c 331 /* Main loop */
batman52 80:77210aa1ad9c 332 while (1) {
batman52 80:77210aa1ad9c 333 #if(TICKER_EN)
batman52 80:77210aa1ad9c 334 sleep();
batman52 80:77210aa1ad9c 335 #else
batman52 80:77210aa1ad9c 336 wait(0.2);
batman52 80:77210aa1ad9c 337 #endif
batman52 80:77210aa1ad9c 338
batman52 80:77210aa1ad9c 339 // update button status
batman52 80:77210aa1ad9c 340 refreshCallback();
batman52 80:77210aa1ad9c 341 #if(!TICKER_EN)
batman52 80:77210aa1ad9c 342 tickerCallback();
batman52 80:77210aa1ad9c 343 #endif
batman52 80:77210aa1ad9c 344
batman52 80:77210aa1ad9c 345 if (updateDisplay && refreshed && (mode==PLAY)) {
batman52 80:77210aa1ad9c 346 updateDisplay = false;
batman52 80:77210aa1ad9c 347 refreshed = false;
batman52 80:77210aa1ad9c 348 pollingUpdate();
batman52 80:77210aa1ad9c 349
batman52 80:77210aa1ad9c 350 gck.move(display, dir);
batman52 80:77210aa1ad9c 351
batman52 80:77210aa1ad9c 352 if (fd.isEaten(gck)) {
batman52 80:77210aa1ad9c 353 fd.reset(display, gck);
batman52 80:77210aa1ad9c 354 gck.increaseLength(display, dir);
batman52 80:77210aa1ad9c 355
batman52 80:77210aa1ad9c 356 /* Redraw gecko */
batman52 80:77210aa1ad9c 357 gck.draw(display);
batman52 80:77210aa1ad9c 358
batman52 80:77210aa1ad9c 359 /* Update the score */
batman52 80:77210aa1ad9c 360 score++;
batman52 80:77210aa1ad9c 361 display_score();
batman52 80:77210aa1ad9c 362 }
batman52 80:77210aa1ad9c 363
batman52 80:77210aa1ad9c 364 if (gck.selfCollision()) {
batman52 80:77210aa1ad9c 365 mode = STOP;
batman52 80:77210aa1ad9c 366 gck.move(display, dir);
batman52 80:77210aa1ad9c 367 display_game_over();
batman52 80:77210aa1ad9c 368 }
batman52 80:77210aa1ad9c 369
batman52 80:77210aa1ad9c 370 /* Update display */
batman52 80:77210aa1ad9c 371 refreshed = false;
batman52 80:77210aa1ad9c 372 display.update();
batman52 80:77210aa1ad9c 373 }
batman52 80:77210aa1ad9c 374 }
batman52 79:0431b9fd3dc0 375 }