![](/media/cache/profiles/dream_vangogh.jpg.50x50_q85.jpg)
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
main.cpp@80:77210aa1ad9c, 2019-12-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |