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:
Fri Dec 27 16:04:44 2019 +0000
Revision:
81:737dff75e013
Parent:
80:77210aa1ad9c
add use of touch sensor

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 81:737dff75e013 42 // #include "meirio_num11x14.h"
batman52 80:77210aa1ad9c 43
batman52 81:737dff75e013 44 #if(TOUCH_EN)
batman52 81:737dff75e013 45 #include "sx9500.h"
batman52 81:737dff75e013 46 #endif
batman52 80:77210aa1ad9c 47
batman52 80:77210aa1ad9c 48 /**************************** Define I/O **************************************/
batman52 80:77210aa1ad9c 49
batman52 80:77210aa1ad9c 50 /* LEDS */
batman52 80:77210aa1ad9c 51 DigitalOut led_blue(LED_BLUE, 1); // 1 = OFF
batman52 80:77210aa1ad9c 52 DigitalOut led_red(LED_RED, 1);
batman52 81:737dff75e013 53 DigitalOut led_green(PTE7,1); // 1 --> OFF, 0 --> ON
batman52 80:77210aa1ad9c 54
batman52 80:77210aa1ad9c 55 /* Rapid IoT Buttons */
batman52 81:737dff75e013 56 #if(!TOUCH_EN)
batman52 80:77210aa1ad9c 57 // InterruptIn in(PTA4);
batman52 80:77210aa1ad9c 58 InterruptIn in(PTE28);
batman52 80:77210aa1ad9c 59 InterruptIn inB1(PTE9);
batman52 80:77210aa1ad9c 60 // InterruptIn SW1(PTE8);
batman52 80:77210aa1ad9c 61 // DigitalIn SW3(PTE10);
batman52 80:77210aa1ad9c 62 // DigitalIn SW4(PTE28);
batman52 81:737dff75e013 63 #endif // !TOUCH_EN
batman52 80:77210aa1ad9c 64
batman52 81:737dff75e013 65 /* LCD */
batman52 80:77210aa1ad9c 66 DigitalOut lcd_light(PTE12, 1); // 1 = ON, 0 = OFF
batman52 80:77210aa1ad9c 67 ColorMemLCD display( PTB22, PTB23, PTB21, PTB20, PTD15, PTD9, "TFT");
batman52 80:77210aa1ad9c 68
batman52 81:737dff75e013 69 /* Touch sensor */
batman52 81:737dff75e013 70 #if(TOUCH_EN)
batman52 81:737dff75e013 71 I2C i2c0(I2C_SDA , I2C_SCL ); // I2C_SCL = PTC10, I2C_SDA = PTC11,
batman52 81:737dff75e013 72 SX9500 touch(i2c0, PTA24, PTA9); // TOUCH_TXEN = PTA24, TOUCH_INT = PTA9
batman52 81:737dff75e013 73 DigitalOut touch_rst(PTA2,1); // TOUCH_RST = PTA2
batman52 81:737dff75e013 74 InterruptIn touch_int(PTA9);
batman52 81:737dff75e013 75 #endif
batman52 81:737dff75e013 76
batman52 80:77210aa1ad9c 77 /**************************** Define Timers ***********************************/
batman52 80:77210aa1ad9c 78
batman52 80:77210aa1ad9c 79 // LowPowerTicker ticker;
batman52 80:77210aa1ad9c 80 Ticker ticker;
batman52 80:77210aa1ad9c 81
batman52 80:77210aa1ad9c 82 /**************************** Global variables ********************************/
batman52 80:77210aa1ad9c 83
batman52 80:77210aa1ad9c 84 /* Flag that is set to true when the display is refreshed */
batman52 80:77210aa1ad9c 85 volatile bool refreshed = false;
batman52 80:77210aa1ad9c 86
batman52 80:77210aa1ad9c 87 /* Flag that is set to true by the ticker. Makes the gecko move at regular time intervals */
batman52 80:77210aa1ad9c 88 volatile bool updateDisplay = true;
batman52 80:77210aa1ad9c 89
batman52 80:77210aa1ad9c 90 /* A flag that ensures the controller to only read one click per frame */
batman52 80:77210aa1ad9c 91 volatile bool PBenabled = true;
batman52 80:77210aa1ad9c 92
batman52 80:77210aa1ad9c 93 /* Direction in which the gecko moves */
batman52 80:77210aa1ad9c 94 Direction dir = UP;
batman52 80:77210aa1ad9c 95
batman52 80:77210aa1ad9c 96 uint8_t score = 0;
batman52 80:77210aa1ad9c 97
batman52 80:77210aa1ad9c 98 /**************************** Define callback handlers ************************/
batman52 80:77210aa1ad9c 99 void tickerCallback(void);
batman52 80:77210aa1ad9c 100
batman52 80:77210aa1ad9c 101 /* Push button handlers */
batman52 80:77210aa1ad9c 102 void in_handler_B0();
batman52 80:77210aa1ad9c 103 void in_handler_B1();
batman52 80:77210aa1ad9c 104
batman52 80:77210aa1ad9c 105 /* Define game modes */
batman52 80:77210aa1ad9c 106 typedef enum {
batman52 80:77210aa1ad9c 107 PLAY, STOP
batman52 80:77210aa1ad9c 108 } Modes;
batman52 80:77210aa1ad9c 109
batman52 80:77210aa1ad9c 110 /* Set the game mode */
batman52 80:77210aa1ad9c 111 Modes mode = PLAY;
batman52 80:77210aa1ad9c 112
batman52 81:737dff75e013 113 #if(TOUCH_EN)
batman52 81:737dff75e013 114 void in_handler_touch()
batman52 81:737dff75e013 115 {
batman52 81:737dff75e013 116 /*
batman52 81:737dff75e013 117 SX9500_TouchState_t ts;
batman52 81:737dff75e013 118
batman52 81:737dff75e013 119 if (PBenabled) {
batman52 81:737dff75e013 120 ts = touch.read_proximity_sensors();
batman52 81:737dff75e013 121
batman52 81:737dff75e013 122 if(ts.downPressed && (dir != UP) )
batman52 81:737dff75e013 123 dir = DOWN;
batman52 81:737dff75e013 124 if(ts.rightPressed && (dir != LEFT) )
batman52 81:737dff75e013 125 dir = RIGHT;
batman52 81:737dff75e013 126 if(ts.upPressed && (dir != DOWN) )
batman52 81:737dff75e013 127 dir = UP;
batman52 81:737dff75e013 128 if(ts.leftPressed && (dir != RIGHT) )
batman52 81:737dff75e013 129 dir = LEFT;
batman52 81:737dff75e013 130 // if(!ts.downPressed && !ts.rightPressed && !ts.upPressed && !ts.leftPressed )
batman52 81:737dff75e013 131
batman52 81:737dff75e013 132 PBenabled = false;
batman52 81:737dff75e013 133 touch.service();
batman52 81:737dff75e013 134 }
batman52 81:737dff75e013 135 */
batman52 81:737dff75e013 136
batman52 81:737dff75e013 137 led_green = !led_green;
batman52 81:737dff75e013 138
batman52 81:737dff75e013 139 }
batman52 81:737dff75e013 140
batman52 81:737dff75e013 141 void touch_service()
batman52 81:737dff75e013 142 {
batman52 81:737dff75e013 143 SX9500_TouchState_t ts;
batman52 81:737dff75e013 144
batman52 81:737dff75e013 145 if (PBenabled) {
batman52 81:737dff75e013 146 ts = touch.read_proximity_sensors();
batman52 81:737dff75e013 147
batman52 81:737dff75e013 148 if(ts.downPressed && (dir != UP) )
batman52 81:737dff75e013 149 dir = DOWN;
batman52 81:737dff75e013 150 if(ts.rightPressed && (dir != LEFT) )
batman52 81:737dff75e013 151 dir = RIGHT;
batman52 81:737dff75e013 152 if(ts.upPressed && (dir != DOWN) )
batman52 81:737dff75e013 153 dir = UP;
batman52 81:737dff75e013 154 if(ts.leftPressed && (dir != RIGHT) )
batman52 81:737dff75e013 155 dir = LEFT;
batman52 81:737dff75e013 156 // if(!ts.downPressed && !ts.rightPressed && !ts.upPressed && !ts.leftPressed )
batman52 81:737dff75e013 157
batman52 81:737dff75e013 158 PBenabled = false;
batman52 81:737dff75e013 159 touch.service();
batman52 81:737dff75e013 160 }
batman52 81:737dff75e013 161
batman52 81:737dff75e013 162 // led_green = !led_green;
batman52 81:737dff75e013 163
batman52 81:737dff75e013 164 }
batman52 81:737dff75e013 165
batman52 81:737dff75e013 166 #else // TOUCH_EN
batman52 80:77210aa1ad9c 167 void in_handler_B0()
batman52 80:77210aa1ad9c 168 {
batman52 80:77210aa1ad9c 169 /* Only change the direction if push button is enabled */
batman52 80:77210aa1ad9c 170 if (PBenabled) {
batman52 80:77210aa1ad9c 171 switch (dir) {
batman52 80:77210aa1ad9c 172 case (UP):
batman52 80:77210aa1ad9c 173 dir = LEFT;
batman52 80:77210aa1ad9c 174 break;
batman52 80:77210aa1ad9c 175 case (DOWN):
batman52 80:77210aa1ad9c 176 dir = RIGHT;
batman52 80:77210aa1ad9c 177 break;
batman52 80:77210aa1ad9c 178 case (RIGHT):
batman52 80:77210aa1ad9c 179 dir = UP;
batman52 80:77210aa1ad9c 180 break;
batman52 80:77210aa1ad9c 181 case (LEFT):
batman52 80:77210aa1ad9c 182 dir = DOWN;
batman52 80:77210aa1ad9c 183 break;
batman52 80:77210aa1ad9c 184 }
batman52 80:77210aa1ad9c 185 PBenabled = false;
batman52 80:77210aa1ad9c 186 }
batman52 80:77210aa1ad9c 187 }
batman52 80:77210aa1ad9c 188
batman52 80:77210aa1ad9c 189 void in_handler_B1()
batman52 80:77210aa1ad9c 190 {
batman52 80:77210aa1ad9c 191 /* Only change the direction if push button is enabled */
batman52 80:77210aa1ad9c 192 if (PBenabled) {
batman52 80:77210aa1ad9c 193 switch (dir) {
batman52 80:77210aa1ad9c 194 case UP:
batman52 80:77210aa1ad9c 195 dir = RIGHT;
batman52 80:77210aa1ad9c 196 break;
batman52 80:77210aa1ad9c 197 case DOWN:
batman52 80:77210aa1ad9c 198 dir = LEFT;
batman52 80:77210aa1ad9c 199 break;
batman52 80:77210aa1ad9c 200 case RIGHT:
batman52 80:77210aa1ad9c 201 dir = DOWN;
batman52 80:77210aa1ad9c 202 break;
batman52 80:77210aa1ad9c 203 case LEFT:
batman52 80:77210aa1ad9c 204 dir = UP;
batman52 80:77210aa1ad9c 205 break;
batman52 80:77210aa1ad9c 206 }
batman52 80:77210aa1ad9c 207 PBenabled = false;
batman52 80:77210aa1ad9c 208 }
batman52 80:77210aa1ad9c 209 }
batman52 81:737dff75e013 210 #endif // TOUCH_EN
batman52 80:77210aa1ad9c 211
batman52 80:77210aa1ad9c 212 /* Callback functions */
batman52 80:77210aa1ad9c 213 #define POLLING_LOOP 3
batman52 80:77210aa1ad9c 214 void pollingUpdate(void)
batman52 80:77210aa1ad9c 215 {
batman52 80:77210aa1ad9c 216 static uint8_t idx = POLLING_LOOP;
batman52 80:77210aa1ad9c 217 idx--;
batman52 80:77210aa1ad9c 218 if(idx==0) {
batman52 80:77210aa1ad9c 219 display.polling();
batman52 80:77210aa1ad9c 220 idx = POLLING_LOOP;
batman52 81:737dff75e013 221 // led_blue = !led_blue;
batman52 80:77210aa1ad9c 222 }
batman52 80:77210aa1ad9c 223
batman52 80:77210aa1ad9c 224 }
batman52 80:77210aa1ad9c 225
batman52 80:77210aa1ad9c 226 void tickerCallback(void)
batman52 80:77210aa1ad9c 227 {
batman52 80:77210aa1ad9c 228 updateDisplay = true;
batman52 80:77210aa1ad9c 229
batman52 80:77210aa1ad9c 230 /* Enable push buttons if the display is refreshed */
batman52 80:77210aa1ad9c 231 PBenabled = refreshed;
batman52 80:77210aa1ad9c 232
batman52 81:737dff75e013 233 // led_red = !led_red;
batman52 80:77210aa1ad9c 234 }
batman52 80:77210aa1ad9c 235
batman52 80:77210aa1ad9c 236 void refreshCallback(void)
batman52 80:77210aa1ad9c 237 {
batman52 80:77210aa1ad9c 238 refreshed = true;
batman52 80:77210aa1ad9c 239 }
batman52 80:77210aa1ad9c 240
batman52 80:77210aa1ad9c 241 /**************************** Fill the boarder ********************************/
batman52 80:77210aa1ad9c 242
batman52 80:77210aa1ad9c 243 void fillEdge(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)
batman52 80:77210aa1ad9c 244 {
batman52 80:77210aa1ad9c 245 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 246 display.window(x,y,w,h);
batman52 80:77210aa1ad9c 247 #endif
batman52 80:77210aa1ad9c 248
batman52 80:77210aa1ad9c 249 display.fill (x,y,w,h, color);
batman52 80:77210aa1ad9c 250
batman52 80:77210aa1ad9c 251 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 252 display.update();
batman52 80:77210aa1ad9c 253 #endif
batman52 80:77210aa1ad9c 254 }
batman52 80:77210aa1ad9c 255
batman52 80:77210aa1ad9c 256 void fillBoarder(){
batman52 80:77210aa1ad9c 257
batman52 80:77210aa1ad9c 258 // fill score header
batman52 80:77210aa1ad9c 259 fillEdge(0, 0, DISPLAY_WIDTH, TOPEDGE*STEPSIZE, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 260
batman52 80:77210aa1ad9c 261 // Fill right edge
batman52 80:77210aa1ad9c 262 fillEdge(DISPLAY_WIDTH - (BOARDERWIDTH/2), TOPEDGE*STEPSIZE + BOARDERWIDTH/2, 1, BOARD_HEIGHT*STEPSIZE, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 263
batman52 80:77210aa1ad9c 264 for (uint8_t i=0;i<=BOARD_HEIGHT;i++){
batman52 80:77210aa1ad9c 265 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2);j++){
batman52 80:77210aa1ad9c 266 display.pixel(BOARD_WIDTH*STEPSIZE + BOARDERWIDTH/2 +j, (i+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 267 }
batman52 80:77210aa1ad9c 268 }
batman52 80:77210aa1ad9c 269
batman52 80:77210aa1ad9c 270 // Fill bottom edge
batman52 80:77210aa1ad9c 271 fillEdge(BOARDERWIDTH/2, (BOARD_HEIGHT+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2, BOARD_WIDTH*STEPSIZE, 1, FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 272
batman52 80:77210aa1ad9c 273 for (uint8_t i=0;i<=BOARD_WIDTH;i++){
batman52 80:77210aa1ad9c 274 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2);j++){
batman52 80:77210aa1ad9c 275 display.pixel(i*STEPSIZE + BOARDERWIDTH/2 +j, (BOARD_HEIGHT+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 276 }
batman52 80:77210aa1ad9c 277 }
batman52 80:77210aa1ad9c 278
batman52 80:77210aa1ad9c 279 // Fill left edge
batman52 80:77210aa1ad9c 280 fillEdge(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2, 1, BOARD_HEIGHT*STEPSIZE, Black);
batman52 80:77210aa1ad9c 281
batman52 80:77210aa1ad9c 282 for (uint8_t i=0;i<=BOARD_HEIGHT;i++){
batman52 80:77210aa1ad9c 283 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2 - 1);j++){
batman52 80:77210aa1ad9c 284 // display.pixel(j, (i+TOPEDGE)*STEPSIZE + BOARDERWIDTH/2+j, Black);
batman52 80:77210aa1ad9c 285 display.pixel(j, (i+TOPEDGE)*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 286 }
batman52 80:77210aa1ad9c 287 }
batman52 80:77210aa1ad9c 288
batman52 80:77210aa1ad9c 289 // Fill top edge
batman52 80:77210aa1ad9c 290 fillEdge(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2 - 1, BOARD_WIDTH*STEPSIZE, 1, Black);
batman52 80:77210aa1ad9c 291
batman52 80:77210aa1ad9c 292 for (uint8_t i=0;i<=BOARD_WIDTH;i++){
batman52 80:77210aa1ad9c 293 for (uint8_t j=0;j<(DISPLAY_WIDTH-BOARD_WIDTH*STEPSIZE - BOARDERWIDTH/2 - 1);j++){
batman52 80:77210aa1ad9c 294 // display.pixel(i*STEPSIZE + BOARDERWIDTH/2 + j, TOPEDGE*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 295 display.pixel(i*STEPSIZE + j, TOPEDGE*STEPSIZE + j, Black);
batman52 80:77210aa1ad9c 296 }
batman52 80:77210aa1ad9c 297 }
batman52 80:77210aa1ad9c 298
batman52 80:77210aa1ad9c 299 }
batman52 80:77210aa1ad9c 300
batman52 80:77210aa1ad9c 301
batman52 80:77210aa1ad9c 302 void display_clear_all(void)
batman52 80:77210aa1ad9c 303 {
batman52 80:77210aa1ad9c 304 display.foreground(FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 305 display.background(BACKGROUND_COLOR);
batman52 80:77210aa1ad9c 306
batman52 80:77210aa1ad9c 307 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 308 int j;
batman52 80:77210aa1ad9c 309 int Divide = 8; // separate for 8 windows to save memory
batman52 80:77210aa1ad9c 310 int Block = LCD_DISP_HEIGHT / Divide;
batman52 80:77210aa1ad9c 311
batman52 80:77210aa1ad9c 312 for(j = 0 ; j <Divide ; j++) {
batman52 80:77210aa1ad9c 313 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 314 display.cls();
batman52 80:77210aa1ad9c 315 display.update();
batman52 80:77210aa1ad9c 316 }
batman52 80:77210aa1ad9c 317 #else
batman52 80:77210aa1ad9c 318 display.window(0, 0, LCD_DISP_WIDTH, LCD_DISP_HEIGHT);
batman52 80:77210aa1ad9c 319 display.cls();
batman52 80:77210aa1ad9c 320 display.update();
batman52 80:77210aa1ad9c 321 #endif
batman52 80:77210aa1ad9c 322
batman52 80:77210aa1ad9c 323 }
batman52 80:77210aa1ad9c 324
batman52 80:77210aa1ad9c 325 void display_score(void)
batman52 80:77210aa1ad9c 326 {
batman52 80:77210aa1ad9c 327 int j = 0;
batman52 80:77210aa1ad9c 328 int Block = 27; // Text Font height;
batman52 80:77210aa1ad9c 329
batman52 80:77210aa1ad9c 330 display.foreground(White);
batman52 80:77210aa1ad9c 331 display.background(Black);
batman52 80:77210aa1ad9c 332
batman52 80:77210aa1ad9c 333 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 334 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 335 #else
batman52 80:77210aa1ad9c 336 display.window(0, 0, LCD_DISP_WIDTH, LCD_DISP_HEIGHT);
batman52 80:77210aa1ad9c 337 #endif
batman52 80:77210aa1ad9c 338
batman52 80:77210aa1ad9c 339 display.fill(0,0,LCD_DISP_WIDTH, Block, Black);
batman52 80:77210aa1ad9c 340
batman52 80:77210aa1ad9c 341 display.locate(4, j*Block);
batman52 80:77210aa1ad9c 342 display.printf("Score: %02d", score);
batman52 80:77210aa1ad9c 343 #if(MULTI_UPDATE)
batman52 80:77210aa1ad9c 344 display.update();
batman52 80:77210aa1ad9c 345 #else
batman52 80:77210aa1ad9c 346 // reduce buffer window size to game area for faster refresh rate
batman52 80:77210aa1ad9c 347 display.window(BOARDERWIDTH/2, TOPEDGE*STEPSIZE + BOARDERWIDTH/2, BOARD_WIDTH * STEPSIZE, BOARD_HEIGHT * STEPSIZE);
batman52 80:77210aa1ad9c 348 #endif
batman52 80:77210aa1ad9c 349 display.foreground(FOREGROUND_COLOR);
batman52 80:77210aa1ad9c 350 display.background(BACKGROUND_COLOR);
batman52 80:77210aa1ad9c 351 }
batman52 80:77210aa1ad9c 352
batman52 80:77210aa1ad9c 353 #define GAME_OVER_X 40
batman52 80:77210aa1ad9c 354 void display_game_over(void)
batman52 80:77210aa1ad9c 355 {
batman52 80:77210aa1ad9c 356 int j = 3;
batman52 80:77210aa1ad9c 357 int Block = 27; // Text Font height: 6 lines of text
batman52 80:77210aa1ad9c 358
batman52 80:77210aa1ad9c 359 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 360 display.locate(GAME_OVER_X, j*Block);
batman52 80:77210aa1ad9c 361 display.printf("GAME");
batman52 80:77210aa1ad9c 362 display.update();
batman52 80:77210aa1ad9c 363
batman52 80:77210aa1ad9c 364 j++;
batman52 80:77210aa1ad9c 365 display.window(0, j*Block, LCD_DISP_WIDTH, Block);
batman52 80:77210aa1ad9c 366 display.locate(GAME_OVER_X, j*Block);
batman52 80:77210aa1ad9c 367 display.printf("OVER!");
batman52 80:77210aa1ad9c 368 display.update();
batman52 80:77210aa1ad9c 369 }
batman52 80:77210aa1ad9c 370
batman52 80:77210aa1ad9c 371 /**************************** MAIN ********************************************/
batman52 80:77210aa1ad9c 372 int main()
batman52 80:77210aa1ad9c 373 {
batman52 81:737dff75e013 374 #if(TOUCH_EN)
batman52 81:737dff75e013 375 wait(1);
batman52 81:737dff75e013 376 touch.reset();
batman52 81:737dff75e013 377 wait(0.3); // wait until the reset has finished
batman52 81:737dff75e013 378 touch.init();
batman52 81:737dff75e013 379 wait(0.3);
batman52 81:737dff75e013 380 touch.set_active(true);
batman52 81:737dff75e013 381 wait(0.3);
batman52 81:737dff75e013 382 touch_int.fall(in_handler_touch);
batman52 81:737dff75e013 383 #else // TOUCH_EN
batman52 80:77210aa1ad9c 384 /* Initialize pushbutton handlers */
batman52 80:77210aa1ad9c 385 in.fall(in_handler_B0);
batman52 80:77210aa1ad9c 386 inB1.fall(in_handler_B1);
batman52 81:737dff75e013 387 #endif // TOUCH_EN
batman52 80:77210aa1ad9c 388
batman52 80:77210aa1ad9c 389 /* Enable the LCD */
batman52 80:77210aa1ad9c 390 display.command_AllClear();
batman52 80:77210aa1ad9c 391 display.set_font( (unsigned char*)Prototype24x27 );
batman52 80:77210aa1ad9c 392
batman52 80:77210aa1ad9c 393 #if TICKER_EN
batman52 80:77210aa1ad9c 394 /* Start generating the 3Hz call */
batman52 80:77210aa1ad9c 395 ticker.attach(&tickerCallback, 0.3333f);
batman52 80:77210aa1ad9c 396 #endif
batman52 80:77210aa1ad9c 397
batman52 80:77210aa1ad9c 398 /* Reset the LCD to a blank state. (All white) */
batman52 80:77210aa1ad9c 399 display_clear_all();
batman52 80:77210aa1ad9c 400 fillBoarder();
batman52 80:77210aa1ad9c 401 display_score();
batman52 80:77210aa1ad9c 402
batman52 80:77210aa1ad9c 403 Gecko gck;
batman52 80:77210aa1ad9c 404 Food fd;
batman52 80:77210aa1ad9c 405 gck.draw(display);
batman52 80:77210aa1ad9c 406 fd.draw(display);
batman52 80:77210aa1ad9c 407
batman52 80:77210aa1ad9c 408 /* Push update to the display */
batman52 80:77210aa1ad9c 409 display.update();
batman52 80:77210aa1ad9c 410
batman52 80:77210aa1ad9c 411 /* Main loop */
batman52 80:77210aa1ad9c 412 while (1) {
batman52 80:77210aa1ad9c 413 #if(TICKER_EN)
batman52 80:77210aa1ad9c 414 sleep();
batman52 80:77210aa1ad9c 415 #else
batman52 80:77210aa1ad9c 416 wait(0.2);
batman52 80:77210aa1ad9c 417 #endif
batman52 80:77210aa1ad9c 418
batman52 80:77210aa1ad9c 419 // update button status
batman52 80:77210aa1ad9c 420 refreshCallback();
batman52 80:77210aa1ad9c 421 #if(!TICKER_EN)
batman52 80:77210aa1ad9c 422 tickerCallback();
batman52 80:77210aa1ad9c 423 #endif
batman52 80:77210aa1ad9c 424
batman52 81:737dff75e013 425 #if(TOUCH_EN)
batman52 81:737dff75e013 426 touch_service();
batman52 81:737dff75e013 427 #endif
batman52 81:737dff75e013 428
batman52 80:77210aa1ad9c 429 if (updateDisplay && refreshed && (mode==PLAY)) {
batman52 80:77210aa1ad9c 430 updateDisplay = false;
batman52 80:77210aa1ad9c 431 refreshed = false;
batman52 80:77210aa1ad9c 432 pollingUpdate();
batman52 80:77210aa1ad9c 433
batman52 80:77210aa1ad9c 434 gck.move(display, dir);
batman52 80:77210aa1ad9c 435
batman52 80:77210aa1ad9c 436 if (fd.isEaten(gck)) {
batman52 80:77210aa1ad9c 437 fd.reset(display, gck);
batman52 80:77210aa1ad9c 438 gck.increaseLength(display, dir);
batman52 80:77210aa1ad9c 439
batman52 80:77210aa1ad9c 440 /* Redraw gecko */
batman52 80:77210aa1ad9c 441 gck.draw(display);
batman52 80:77210aa1ad9c 442
batman52 80:77210aa1ad9c 443 /* Update the score */
batman52 80:77210aa1ad9c 444 score++;
batman52 80:77210aa1ad9c 445 display_score();
batman52 80:77210aa1ad9c 446 }
batman52 80:77210aa1ad9c 447
batman52 80:77210aa1ad9c 448 if (gck.selfCollision()) {
batman52 80:77210aa1ad9c 449 mode = STOP;
batman52 80:77210aa1ad9c 450 gck.move(display, dir);
batman52 80:77210aa1ad9c 451 display_game_over();
batman52 80:77210aa1ad9c 452 }
batman52 80:77210aa1ad9c 453
batman52 80:77210aa1ad9c 454 /* Update display */
batman52 80:77210aa1ad9c 455 refreshed = false;
batman52 80:77210aa1ad9c 456 display.update();
batman52 80:77210aa1ad9c 457 }
batman52 80:77210aa1ad9c 458 }
batman52 79:0431b9fd3dc0 459 }