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@81:737dff75e013, 2019-12-27 (annotated)
- 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?
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 | 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 | } |