Game Ant Run - requires 8x8 LED RG shield - project MPOA (VUT v Brne)

Dependencies:   MMA8451Q RGB mbed

Committer:
tomas_dca
Date:
Thu Jan 08 14:04:54 2015 +0000
Revision:
2:3735ddc47ec7
Parent:
1:806df0da28dc
new color for score

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tomas_dca 0:56ca0aab95fc 1 #include "mbed.h"
tomas_dca 0:56ca0aab95fc 2 #include "MMA8451Q.h"
tomas_dca 0:56ca0aab95fc 3 #include "MyColor.h"
tomas_dca 0:56ca0aab95fc 4
tomas_dca 0:56ca0aab95fc 5
tomas_dca 0:56ca0aab95fc 6
tomas_dca 0:56ca0aab95fc 7
tomas_dca 0:56ca0aab95fc 8 // LED matrix states (pixel)
tomas_dca 0:56ca0aab95fc 9
tomas_dca 0:56ca0aab95fc 10 #define led_used 3 // color orange
tomas_dca 0:56ca0aab95fc 11 #define led_lab 2 // color green
tomas_dca 0:56ca0aab95fc 12 #define led_ant 1 // color red
tomas_dca 0:56ca0aab95fc 13 #define led_free 0 // off
tomas_dca 0:56ca0aab95fc 14
tomas_dca 0:56ca0aab95fc 15 // brightness of LED matrix
tomas_dca 0:56ca0aab95fc 16 #define brightness 0.0003f // 0.001f optimal, 0.0003f for night
tomas_dca 0:56ca0aab95fc 17
tomas_dca 0:56ca0aab95fc 18 // RGB states
tomas_dca 0:56ca0aab95fc 19
tomas_dca 0:56ca0aab95fc 20 #define color_red 1.0
tomas_dca 0:56ca0aab95fc 21 #define color_orange 0.1
tomas_dca 0:56ca0aab95fc 22 #define color_green 0.3
tomas_dca 0:56ca0aab95fc 23 #define color_blue 0.5
tomas_dca 0:56ca0aab95fc 24
tomas_dca 0:56ca0aab95fc 25
tomas_dca 0:56ca0aab95fc 26
tomas_dca 0:56ca0aab95fc 27 // labyrint virtual LED matrix
tomas_dca 0:56ca0aab95fc 28 uint8_t matrix[8][8];
tomas_dca 0:56ca0aab95fc 29
tomas_dca 0:56ca0aab95fc 30 // templates for labyrint
tomas_dca 0:56ca0aab95fc 31 #define template_fill (~0) // fill all pixels
tomas_dca 0:56ca0aab95fc 32
tomas_dca 0:56ca0aab95fc 33 #define template_arrow 0x12244848241200
tomas_dca 0:56ca0aab95fc 34 /*
tomas_dca 0:56ca0aab95fc 35 * . . . . . . . .
tomas_dca 0:56ca0aab95fc 36 * . . . x . . x .
tomas_dca 0:56ca0aab95fc 37 * . . x . . x . .
tomas_dca 0:56ca0aab95fc 38 * . x . . x . . .
tomas_dca 0:56ca0aab95fc 39 * . . x . . x . .
tomas_dca 0:56ca0aab95fc 40 * . . . x . . x .
tomas_dca 0:56ca0aab95fc 41 * . . . . . . . .
tomas_dca 0:56ca0aab95fc 42 * . . . . . . . .
tomas_dca 0:56ca0aab95fc 43 */
tomas_dca 0:56ca0aab95fc 44
tomas_dca 0:56ca0aab95fc 45 #define lab_turn_big 0x0D /*
tomas_dca 0:56ca0aab95fc 46 * x x
tomas_dca 0:56ca0aab95fc 47 * . x
tomas_dca 0:56ca0aab95fc 48 */
tomas_dca 0:56ca0aab95fc 49
tomas_dca 0:56ca0aab95fc 50 #define lab_turn_small 0x08 /*
tomas_dca 0:56ca0aab95fc 51 * x .
tomas_dca 0:56ca0aab95fc 52 * . .
tomas_dca 0:56ca0aab95fc 53 */
tomas_dca 0:56ca0aab95fc 54
tomas_dca 0:56ca0aab95fc 55 #define lab_straight 0x0A /*
tomas_dca 0:56ca0aab95fc 56 * x .
tomas_dca 0:56ca0aab95fc 57 * x .
tomas_dca 0:56ca0aab95fc 58 */
tomas_dca 0:56ca0aab95fc 59
tomas_dca 0:56ca0aab95fc 60
tomas_dca 0:56ca0aab95fc 61 #define one 0xF248
tomas_dca 0:56ca0aab95fc 62 //000000001111001001001000
tomas_dca 0:56ca0aab95fc 63
tomas_dca 0:56ca0aab95fc 64 #define two 0x3D2B8
tomas_dca 0:56ca0aab95fc 65 //000000111101001010111000
tomas_dca 0:56ca0aab95fc 66
tomas_dca 0:56ca0aab95fc 67 #define three 0x39678
tomas_dca 0:56ca0aab95fc 68 //000000111001011001111000
tomas_dca 0:56ca0aab95fc 69
tomas_dca 0:56ca0aab95fc 70 #define four 0x25E48
tomas_dca 0:56ca0aab95fc 71 //000000100101111001001000
tomas_dca 0:56ca0aab95fc 72
tomas_dca 0:56ca0aab95fc 73 #define five 0x3CE78
tomas_dca 0:56ca0aab95fc 74 //000000111100111001111000
tomas_dca 0:56ca0aab95fc 75
tomas_dca 0:56ca0aab95fc 76 #define six 0x3CF78
tomas_dca 0:56ca0aab95fc 77 //000000111100111101111000
tomas_dca 0:56ca0aab95fc 78
tomas_dca 0:56ca0aab95fc 79 #define seven 0x39248
tomas_dca 0:56ca0aab95fc 80 //000000111001001001001000
tomas_dca 0:56ca0aab95fc 81
tomas_dca 0:56ca0aab95fc 82 #define eight 0x3DF78
tomas_dca 0:56ca0aab95fc 83 //000000111101111101111000
tomas_dca 0:56ca0aab95fc 84
tomas_dca 0:56ca0aab95fc 85 #define nine 0x3DE78
tomas_dca 0:56ca0aab95fc 86 //000000111101111001111000
tomas_dca 0:56ca0aab95fc 87
tomas_dca 0:56ca0aab95fc 88 #define zero 0x3DB78
tomas_dca 0:56ca0aab95fc 89 //000000111101101101111000
tomas_dca 0:56ca0aab95fc 90
tomas_dca 0:56ca0aab95fc 91
tomas_dca 0:56ca0aab95fc 92 // init LED 8x8 matrix -> port
tomas_dca 0:56ca0aab95fc 93 DigitalOut ROW0(PTB0);
tomas_dca 0:56ca0aab95fc 94 DigitalOut ROW1(PTB1);
tomas_dca 0:56ca0aab95fc 95 DigitalOut ROW2(PTB2);
tomas_dca 0:56ca0aab95fc 96
tomas_dca 0:56ca0aab95fc 97 DigitalOut COLG0(PTC0);
tomas_dca 0:56ca0aab95fc 98 DigitalOut COLG1(PTC1);
tomas_dca 0:56ca0aab95fc 99 DigitalOut COLG2(PTC2);
tomas_dca 0:56ca0aab95fc 100 DigitalOut COLG3(PTC3);
tomas_dca 0:56ca0aab95fc 101 DigitalOut COLG4(PTC4);
tomas_dca 0:56ca0aab95fc 102 DigitalOut COLG5(PTC5);
tomas_dca 0:56ca0aab95fc 103 DigitalOut COLG6(PTC6);
tomas_dca 1:806df0da28dc 104 DigitalOut COLG7(PTC7);
tomas_dca 0:56ca0aab95fc 105
tomas_dca 0:56ca0aab95fc 106 DigitalOut COLR0(PTC8);
tomas_dca 0:56ca0aab95fc 107 DigitalOut COLR1(PTC9);
tomas_dca 0:56ca0aab95fc 108 DigitalOut COLR2(PTC10);
tomas_dca 0:56ca0aab95fc 109 DigitalOut COLR3(PTC11);
tomas_dca 0:56ca0aab95fc 110 DigitalOut COLR4(PTC12);
tomas_dca 0:56ca0aab95fc 111 DigitalOut COLR5(PTC13);
tomas_dca 0:56ca0aab95fc 112 DigitalOut COLR6(PTC16);
tomas_dca 0:56ca0aab95fc 113 DigitalOut COLR7(PTC17);
tomas_dca 0:56ca0aab95fc 114
tomas_dca 0:56ca0aab95fc 115 // init LED 8x8 matrix -> port
tomas_dca 0:56ca0aab95fc 116
tomas_dca 0:56ca0aab95fc 117 // state table TEST | GAME | PAUSE
tomas_dca 0:56ca0aab95fc 118 // ----------------------------------------
tomas_dca 0:56ca0aab95fc 119 DigitalIn BTN_L(PTD7); // ->new game | ->pause | ->game
tomas_dca 0:56ca0aab95fc 120 DigitalIn BTN_R(PTD6); // new 0 state | rotate | ->new game
tomas_dca 0:56ca0aab95fc 121
tomas_dca 0:56ca0aab95fc 122
tomas_dca 0:56ca0aab95fc 123
tomas_dca 0:56ca0aab95fc 124 // define accelerometer stuffs
tomas_dca 0:56ca0aab95fc 125 #define MMA8451_I2C_ADDRESS (0x1d<<1)
tomas_dca 0:56ca0aab95fc 126 #define MOVE_ANGLE 25 // > degrees for move
tomas_dca 0:56ca0aab95fc 127 #define IDLE_ANGLE 10 // < degrees for idle state
tomas_dca 0:56ca0aab95fc 128
tomas_dca 0:56ca0aab95fc 129 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
tomas_dca 0:56ca0aab95fc 130
tomas_dca 0:56ca0aab95fc 131
tomas_dca 0:56ca0aab95fc 132
tomas_dca 0:56ca0aab95fc 133
tomas_dca 0:56ca0aab95fc 134 // index for actual block of control
tomas_dca 0:56ca0aab95fc 135 uint8_t row = 2;
tomas_dca 0:56ca0aab95fc 136 uint8_t column = 2;
tomas_dca 0:56ca0aab95fc 137
tomas_dca 0:56ca0aab95fc 138 // index for ant position
tomas_dca 0:56ca0aab95fc 139 uint8_t ant_row = 5;
tomas_dca 0:56ca0aab95fc 140 uint8_t ant_column = 3;
tomas_dca 0:56ca0aab95fc 141
tomas_dca 0:56ca0aab95fc 142 // score counter
tomas_dca 0:56ca0aab95fc 143 uint32_t score_cnt = 0;
tomas_dca 0:56ca0aab95fc 144
tomas_dca 0:56ca0aab95fc 145 // Timer ticker
tomas_dca 0:56ca0aab95fc 146 Ticker display; // display matrix of pixels
tomas_dca 0:56ca0aab95fc 147 Ticker acc_scan; // scan accelerometer move
tomas_dca 0:56ca0aab95fc 148 Ticker ant_run; // ant move
tomas_dca 0:56ca0aab95fc 149
tomas_dca 0:56ca0aab95fc 150 // periodic func. prototypes (Tickers)
tomas_dca 0:56ca0aab95fc 151 void show_matrix(void); // Ticker display
tomas_dca 0:56ca0aab95fc 152 void accelerometer(void); // Ticker acc_scan
tomas_dca 0:56ca0aab95fc 153 void ant_move(void); // Ticker ant_run
tomas_dca 0:56ca0aab95fc 154
tomas_dca 0:56ca0aab95fc 155 // func. prototypes
tomas_dca 0:56ca0aab95fc 156 void fill_matrix(uint64_t temp,uint8_t color);
tomas_dca 0:56ca0aab95fc 157 void rotate_matrix(void);
tomas_dca 0:56ca0aab95fc 158 void rotate_lab(uint8_t lab_row, uint8_t lab_col);
tomas_dca 0:56ca0aab95fc 159
tomas_dca 0:56ca0aab95fc 160 void prepare_matrix(void); // prepare matrix for new labyrint and set initial conditions
tomas_dca 0:56ca0aab95fc 161 void reload_matrix(void); // generate new labyrint blocks (only instead of used)
tomas_dca 0:56ca0aab95fc 162
tomas_dca 0:56ca0aab95fc 163 uint32_t translate(uint8_t); // number to symbol
tomas_dca 0:56ca0aab95fc 164
tomas_dca 0:56ca0aab95fc 165 // func. under accelerometer()
tomas_dca 0:56ca0aab95fc 166 void confirm_dir(void);
tomas_dca 0:56ca0aab95fc 167 void move_cursor(void);
tomas_dca 0:56ca0aab95fc 168
tomas_dca 0:56ca0aab95fc 169 // states of game
tomas_dca 0:56ca0aab95fc 170 typedef enum {ready, pause, game, test, save, learn, score} state_t;
tomas_dca 0:56ca0aab95fc 171 state_t game_state = ready;
tomas_dca 0:56ca0aab95fc 172
tomas_dca 0:56ca0aab95fc 173 /*
tomas_dca 0:56ca0aab95fc 174 * ready - ready for game (idle)
tomas_dca 0:56ca0aab95fc 175 * test - test controls
tomas_dca 0:56ca0aab95fc 176 * save - save accelerator offset
tomas_dca 0:56ca0aab95fc 177 *
tomas_dca 0:56ca0aab95fc 178 * game - ant run game
tomas_dca 0:56ca0aab95fc 179 * learn - special type of the game (without score and game over)
tomas_dca 0:56ca0aab95fc 180 * pause - pause game
tomas_dca 0:56ca0aab95fc 181 *
tomas_dca 0:56ca0aab95fc 182 * score - game over - show score
tomas_dca 0:56ca0aab95fc 183 */
tomas_dca 0:56ca0aab95fc 184
tomas_dca 0:56ca0aab95fc 185 // directions
tomas_dca 0:56ca0aab95fc 186 typedef enum {idle, left, up, right, down} direction_t;
tomas_dca 0:56ca0aab95fc 187 direction_t acc_dir = idle; // enum for move direction -> control
tomas_dca 0:56ca0aab95fc 188 direction_t ant_dir = down; // enum for move direction -> ant
tomas_dca 0:56ca0aab95fc 189
tomas_dca 0:56ca0aab95fc 190
tomas_dca 0:56ca0aab95fc 191 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tomas_dca 0:56ca0aab95fc 192 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tomas_dca 0:56ca0aab95fc 193 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tomas_dca 0:56ca0aab95fc 194 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tomas_dca 0:56ca0aab95fc 195
tomas_dca 0:56ca0aab95fc 196 int main(void)
tomas_dca 0:56ca0aab95fc 197 {
tomas_dca 0:56ca0aab95fc 198 // init RGB backlight
tomas_dca 0:56ca0aab95fc 199
tomas_dca 0:56ca0aab95fc 200 DigitalOut rled(LED_RED, 1);
tomas_dca 0:56ca0aab95fc 201 DigitalOut gled(LED_GREEN, 1);
tomas_dca 0:56ca0aab95fc 202 DigitalOut bled(LED_BLUE, 1);
tomas_dca 0:56ca0aab95fc 203
tomas_dca 0:56ca0aab95fc 204 PwmOut r (LED_RED);
tomas_dca 0:56ca0aab95fc 205 PwmOut g (LED_GREEN);
tomas_dca 0:56ca0aab95fc 206 PwmOut b (LED_BLUE);
tomas_dca 0:56ca0aab95fc 207
tomas_dca 0:56ca0aab95fc 208 MyColor color(LED_RED, LED_GREEN, LED_BLUE);
tomas_dca 0:56ca0aab95fc 209
tomas_dca 0:56ca0aab95fc 210 uint8_t learning = 0;
tomas_dca 0:56ca0aab95fc 211
tomas_dca 0:56ca0aab95fc 212 Timer timer;
tomas_dca 0:56ca0aab95fc 213 timer.start();
tomas_dca 0:56ca0aab95fc 214
tomas_dca 0:56ca0aab95fc 215 // display turn on
tomas_dca 0:56ca0aab95fc 216 display.attach(&show_matrix, 0.01); // the address of the function to be attached (show_matrix) and the interval (0.01 seconds)
tomas_dca 0:56ca0aab95fc 217 acc_scan.attach(&accelerometer, 0.1); // accelerometer 0.1 s
tomas_dca 0:56ca0aab95fc 218 ant_run.attach(&ant_move, 1.2); // ant_move 1.2 s
tomas_dca 0:56ca0aab95fc 219
tomas_dca 0:56ca0aab95fc 220 // learn mode
tomas_dca 0:56ca0aab95fc 221 if(!BTN_L && !BTN_R)
tomas_dca 0:56ca0aab95fc 222 {
tomas_dca 0:56ca0aab95fc 223
tomas_dca 0:56ca0aab95fc 224 color = color_blue;
tomas_dca 0:56ca0aab95fc 225 learning = 1;
tomas_dca 0:56ca0aab95fc 226 while(!BTN_L || !BTN_R); //debounce
tomas_dca 0:56ca0aab95fc 227 }
tomas_dca 0:56ca0aab95fc 228
tomas_dca 0:56ca0aab95fc 229 //control test
tomas_dca 0:56ca0aab95fc 230 game_state = test;
tomas_dca 0:56ca0aab95fc 231 color = color_orange;
tomas_dca 0:56ca0aab95fc 232
tomas_dca 0:56ca0aab95fc 233 // init rand() seed
tomas_dca 0:56ca0aab95fc 234 srand(timer.read_ms());
tomas_dca 0:56ca0aab95fc 235
tomas_dca 0:56ca0aab95fc 236 // init time for debounce
tomas_dca 0:56ca0aab95fc 237 int time = timer.read_ms();
tomas_dca 0:56ca0aab95fc 238
tomas_dca 0:56ca0aab95fc 239 while (true)
tomas_dca 0:56ca0aab95fc 240 {
tomas_dca 0:56ca0aab95fc 241 switch(game_state)
tomas_dca 0:56ca0aab95fc 242 {
tomas_dca 0:56ca0aab95fc 243 case score:
tomas_dca 0:56ca0aab95fc 244 {
tomas_dca 0:56ca0aab95fc 245 // SHOW SCORE
tomas_dca 0:56ca0aab95fc 246 static uint8_t go = 0; // go and show score
tomas_dca 0:56ca0aab95fc 247 static uint8_t sym_col = 100; // state of showing score
tomas_dca 0:56ca0aab95fc 248
tomas_dca 0:56ca0aab95fc 249
tomas_dca 0:56ca0aab95fc 250 if((timer.read_ms() % 600 ) > 300)
tomas_dca 0:56ca0aab95fc 251 {
tomas_dca 0:56ca0aab95fc 252 color = color_red;
tomas_dca 0:56ca0aab95fc 253
tomas_dca 0:56ca0aab95fc 254 if(go == 5)
tomas_dca 0:56ca0aab95fc 255 go = 1;
tomas_dca 0:56ca0aab95fc 256 else
tomas_dca 0:56ca0aab95fc 257 go = 6;
tomas_dca 0:56ca0aab95fc 258
tomas_dca 0:56ca0aab95fc 259 }
tomas_dca 0:56ca0aab95fc 260 else
tomas_dca 0:56ca0aab95fc 261 {
tomas_dca 0:56ca0aab95fc 262 if(go == 6)
tomas_dca 0:56ca0aab95fc 263 go = 1;
tomas_dca 0:56ca0aab95fc 264 else
tomas_dca 0:56ca0aab95fc 265 go = 5;
tomas_dca 0:56ca0aab95fc 266
tomas_dca 0:56ca0aab95fc 267 color = color_blue;
tomas_dca 0:56ca0aab95fc 268 }
tomas_dca 0:56ca0aab95fc 269
tomas_dca 0:56ca0aab95fc 270 if( go == 1 )
tomas_dca 0:56ca0aab95fc 271 {
tomas_dca 0:56ca0aab95fc 272 static uint32_t sym_act = 0;
tomas_dca 0:56ca0aab95fc 273 static uint32_t sym_clr = led_ant;
tomas_dca 0:56ca0aab95fc 274 static uint32_t score_cnt_temp = 0;
tomas_dca 0:56ca0aab95fc 275
tomas_dca 0:56ca0aab95fc 276
tomas_dca 0:56ca0aab95fc 277
tomas_dca 0:56ca0aab95fc 278 switch(sym_col)
tomas_dca 0:56ca0aab95fc 279 {
tomas_dca 0:56ca0aab95fc 280 case 0:
tomas_dca 0:56ca0aab95fc 281 case 1:
tomas_dca 0:56ca0aab95fc 282 sym_col++;
tomas_dca 0:56ca0aab95fc 283 break;
tomas_dca 0:56ca0aab95fc 284 case 2:
tomas_dca 0:56ca0aab95fc 285 score_cnt_temp -= score_cnt_temp % 10;
tomas_dca 0:56ca0aab95fc 286 score_cnt_temp /=10;
tomas_dca 0:56ca0aab95fc 287
tomas_dca 0:56ca0aab95fc 288 if(score_cnt_temp == 0)
tomas_dca 0:56ca0aab95fc 289 {
tomas_dca 0:56ca0aab95fc 290 // empty block
tomas_dca 0:56ca0aab95fc 291 sym_act = 0;
tomas_dca 0:56ca0aab95fc 292 // close ceremony
tomas_dca 0:56ca0aab95fc 293 sym_col++;
tomas_dca 0:56ca0aab95fc 294 }
tomas_dca 0:56ca0aab95fc 295 else
tomas_dca 0:56ca0aab95fc 296 {
tomas_dca 0:56ca0aab95fc 297 // next number
tomas_dca 0:56ca0aab95fc 298 sym_act = translate(score_cnt_temp % 10);
tomas_dca 0:56ca0aab95fc 299 sym_col = 0;
tomas_dca 0:56ca0aab95fc 300 }
tomas_dca 0:56ca0aab95fc 301
tomas_dca 0:56ca0aab95fc 302 if(sym_clr == led_ant)
tomas_dca 0:56ca0aab95fc 303 sym_clr = led_lab;
tomas_dca 0:56ca0aab95fc 304 else
tomas_dca 2:3735ddc47ec7 305 if(sym_clr == led_lab)
tomas_dca 2:3735ddc47ec7 306 {
tomas_dca 2:3735ddc47ec7 307 sym_clr == led_used;
tomas_dca 2:3735ddc47ec7 308 }
tomas_dca 2:3735ddc47ec7 309 else
tomas_dca 0:56ca0aab95fc 310 sym_clr = led_ant;
tomas_dca 0:56ca0aab95fc 311
tomas_dca 0:56ca0aab95fc 312 break;
tomas_dca 0:56ca0aab95fc 313 case 3:
tomas_dca 0:56ca0aab95fc 314 case 4:
tomas_dca 0:56ca0aab95fc 315 case 5:
tomas_dca 0:56ca0aab95fc 316 case 6:
tomas_dca 0:56ca0aab95fc 317 case 7:
tomas_dca 0:56ca0aab95fc 318 case 8:
tomas_dca 0:56ca0aab95fc 319 case 9:
tomas_dca 0:56ca0aab95fc 320 case 10:
tomas_dca 0:56ca0aab95fc 321 // close loop
tomas_dca 0:56ca0aab95fc 322 sym_col++;
tomas_dca 0:56ca0aab95fc 323 break;
tomas_dca 0:56ca0aab95fc 324 case 11:
tomas_dca 0:56ca0aab95fc 325 sym_col = 100;
tomas_dca 0:56ca0aab95fc 326 // show score again
tomas_dca 0:56ca0aab95fc 327 break;
tomas_dca 0:56ca0aab95fc 328 default:
tomas_dca 0:56ca0aab95fc 329 // erase old symbol
tomas_dca 0:56ca0aab95fc 330 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 331 // load score
tomas_dca 0:56ca0aab95fc 332 score_cnt_temp = score_cnt;
tomas_dca 0:56ca0aab95fc 333 // init new char;
tomas_dca 0:56ca0aab95fc 334 sym_act = translate(score_cnt_temp % 10);
tomas_dca 0:56ca0aab95fc 335 sym_col = 0;
tomas_dca 0:56ca0aab95fc 336 }
tomas_dca 0:56ca0aab95fc 337
tomas_dca 0:56ca0aab95fc 338 // shift matrix
tomas_dca 0:56ca0aab95fc 339 if((sym_col < 12))
tomas_dca 0:56ca0aab95fc 340 {
tomas_dca 0:56ca0aab95fc 341 for(uint8_t j = 5; j > 0;j--) // rows
tomas_dca 0:56ca0aab95fc 342 {
tomas_dca 0:56ca0aab95fc 343 for(uint8_t i = 0; i < 7;i++) // columns
tomas_dca 0:56ca0aab95fc 344 {
tomas_dca 0:56ca0aab95fc 345 matrix[j][7-i] = matrix[j][6-i];
tomas_dca 0:56ca0aab95fc 346 }
tomas_dca 0:56ca0aab95fc 347 // add new column to matrix
tomas_dca 0:56ca0aab95fc 348 // find actual bit sym_col, assign color
tomas_dca 0:56ca0aab95fc 349 matrix[j][0] = sym_clr * ((((0x1 << sym_col) << (3*j)) & sym_act) > 0);
tomas_dca 0:56ca0aab95fc 350 }
tomas_dca 0:56ca0aab95fc 351 }
tomas_dca 0:56ca0aab95fc 352 }
tomas_dca 0:56ca0aab95fc 353
tomas_dca 0:56ca0aab95fc 354 // buttons
tomas_dca 0:56ca0aab95fc 355 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 356 {
tomas_dca 0:56ca0aab95fc 357 game_state = pause;
tomas_dca 0:56ca0aab95fc 358 color = color_orange;
tomas_dca 0:56ca0aab95fc 359
tomas_dca 0:56ca0aab95fc 360 // reset score show
tomas_dca 0:56ca0aab95fc 361 sym_col = 100;
tomas_dca 0:56ca0aab95fc 362
tomas_dca 0:56ca0aab95fc 363 // RESET LABYRINT
tomas_dca 0:56ca0aab95fc 364 game_state = ready;
tomas_dca 0:56ca0aab95fc 365
tomas_dca 0:56ca0aab95fc 366 time = timer.read_ms() + 200; //debounce
tomas_dca 0:56ca0aab95fc 367 }
tomas_dca 0:56ca0aab95fc 368
tomas_dca 0:56ca0aab95fc 369 break;
tomas_dca 0:56ca0aab95fc 370 }
tomas_dca 0:56ca0aab95fc 371 case pause:
tomas_dca 0:56ca0aab95fc 372 {
tomas_dca 0:56ca0aab95fc 373 // PAUSE
tomas_dca 0:56ca0aab95fc 374
tomas_dca 0:56ca0aab95fc 375 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 376 {
tomas_dca 0:56ca0aab95fc 377 // RESET LABYRINT
tomas_dca 0:56ca0aab95fc 378
tomas_dca 0:56ca0aab95fc 379 color = color_orange;
tomas_dca 0:56ca0aab95fc 380 // prepare matrix for labyrint
tomas_dca 0:56ca0aab95fc 381 prepare_matrix();
tomas_dca 0:56ca0aab95fc 382 wait(0.4f);
tomas_dca 0:56ca0aab95fc 383
tomas_dca 0:56ca0aab95fc 384 // generate new playground
tomas_dca 0:56ca0aab95fc 385 reload_matrix();
tomas_dca 0:56ca0aab95fc 386 wait(0.2f);
tomas_dca 0:56ca0aab95fc 387
tomas_dca 0:56ca0aab95fc 388 color = color_red;
tomas_dca 0:56ca0aab95fc 389
tomas_dca 0:56ca0aab95fc 390 }
tomas_dca 0:56ca0aab95fc 391 else
tomas_dca 0:56ca0aab95fc 392 // RETURN
tomas_dca 0:56ca0aab95fc 393 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 394 {
tomas_dca 0:56ca0aab95fc 395 color = color_green;
tomas_dca 0:56ca0aab95fc 396 if(!learning)
tomas_dca 0:56ca0aab95fc 397 {
tomas_dca 0:56ca0aab95fc 398 game_state = game;
tomas_dca 0:56ca0aab95fc 399
tomas_dca 0:56ca0aab95fc 400 // haaahaaaa :D
tomas_dca 0:56ca0aab95fc 401 score_cnt = 0;
tomas_dca 0:56ca0aab95fc 402 }
tomas_dca 0:56ca0aab95fc 403 else
tomas_dca 0:56ca0aab95fc 404 {
tomas_dca 0:56ca0aab95fc 405 game_state = learn;
tomas_dca 0:56ca0aab95fc 406 }
tomas_dca 0:56ca0aab95fc 407
tomas_dca 0:56ca0aab95fc 408 time = timer.read_ms() + 200; //debounce
tomas_dca 0:56ca0aab95fc 409 }
tomas_dca 0:56ca0aab95fc 410
tomas_dca 0:56ca0aab95fc 411 break;
tomas_dca 0:56ca0aab95fc 412 }
tomas_dca 0:56ca0aab95fc 413 case game:
tomas_dca 0:56ca0aab95fc 414 case learn:
tomas_dca 0:56ca0aab95fc 415 {
tomas_dca 0:56ca0aab95fc 416 // GAME
tomas_dca 0:56ca0aab95fc 417
tomas_dca 0:56ca0aab95fc 418 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 419 {
tomas_dca 0:56ca0aab95fc 420 // rotate block
tomas_dca 0:56ca0aab95fc 421 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 422 rotate_lab(row, column);
tomas_dca 0:56ca0aab95fc 423 }
tomas_dca 0:56ca0aab95fc 424 else
tomas_dca 0:56ca0aab95fc 425 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 426 {
tomas_dca 0:56ca0aab95fc 427 // pause
tomas_dca 0:56ca0aab95fc 428 color = color_red;
tomas_dca 0:56ca0aab95fc 429 game_state = pause;
tomas_dca 0:56ca0aab95fc 430
tomas_dca 0:56ca0aab95fc 431 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 432 // wait for action
tomas_dca 0:56ca0aab95fc 433 // RETURN or RESET
tomas_dca 0:56ca0aab95fc 434 }
tomas_dca 0:56ca0aab95fc 435
tomas_dca 0:56ca0aab95fc 436 break;
tomas_dca 0:56ca0aab95fc 437 }
tomas_dca 0:56ca0aab95fc 438 case ready:
tomas_dca 0:56ca0aab95fc 439 {
tomas_dca 0:56ca0aab95fc 440 // RESET LAB
tomas_dca 0:56ca0aab95fc 441
tomas_dca 0:56ca0aab95fc 442 color = color_orange;
tomas_dca 0:56ca0aab95fc 443
tomas_dca 0:56ca0aab95fc 444 // prepare matrix for labyrint
tomas_dca 0:56ca0aab95fc 445 prepare_matrix();
tomas_dca 0:56ca0aab95fc 446 wait(0.4f);
tomas_dca 0:56ca0aab95fc 447
tomas_dca 0:56ca0aab95fc 448 // generate new playground
tomas_dca 0:56ca0aab95fc 449 reload_matrix();
tomas_dca 0:56ca0aab95fc 450 wait(0.2f);
tomas_dca 0:56ca0aab95fc 451
tomas_dca 0:56ca0aab95fc 452 game_state = pause;
tomas_dca 0:56ca0aab95fc 453
tomas_dca 0:56ca0aab95fc 454 color = color_red;
tomas_dca 0:56ca0aab95fc 455 break;
tomas_dca 0:56ca0aab95fc 456 }
tomas_dca 0:56ca0aab95fc 457 default:
tomas_dca 0:56ca0aab95fc 458 {
tomas_dca 0:56ca0aab95fc 459 // TEST
tomas_dca 0:56ca0aab95fc 460
tomas_dca 0:56ca0aab95fc 461
tomas_dca 0:56ca0aab95fc 462 // arrows
tomas_dca 0:56ca0aab95fc 463
tomas_dca 0:56ca0aab95fc 464 // set new 0 point (offset)
tomas_dca 0:56ca0aab95fc 465 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 466 {
tomas_dca 0:56ca0aab95fc 467 color = color_green;
tomas_dca 0:56ca0aab95fc 468 game_state = save;
tomas_dca 0:56ca0aab95fc 469 wait(0.4f);
tomas_dca 0:56ca0aab95fc 470 game_state = test;
tomas_dca 0:56ca0aab95fc 471 color = color_orange;
tomas_dca 0:56ca0aab95fc 472
tomas_dca 0:56ca0aab95fc 473 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 474 }
tomas_dca 0:56ca0aab95fc 475
tomas_dca 0:56ca0aab95fc 476 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 477 {
tomas_dca 0:56ca0aab95fc 478 // generate new playground
tomas_dca 0:56ca0aab95fc 479 game_state = ready;
tomas_dca 0:56ca0aab95fc 480
tomas_dca 0:56ca0aab95fc 481 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 482 }
tomas_dca 0:56ca0aab95fc 483 }
tomas_dca 0:56ca0aab95fc 484 }
tomas_dca 0:56ca0aab95fc 485 }
tomas_dca 0:56ca0aab95fc 486 }
tomas_dca 0:56ca0aab95fc 487
tomas_dca 0:56ca0aab95fc 488
tomas_dca 0:56ca0aab95fc 489 void accelerometer()
tomas_dca 0:56ca0aab95fc 490 {
tomas_dca 0:56ca0aab95fc 491 // offset
tomas_dca 0:56ca0aab95fc 492 static float xAngle_offset = 0;
tomas_dca 0:56ca0aab95fc 493 static float yAngle_offset = 0;
tomas_dca 0:56ca0aab95fc 494
tomas_dca 0:56ca0aab95fc 495 if((game_state == test) || (game_state == game) || (game_state == save) || (game_state == learn))
tomas_dca 0:56ca0aab95fc 496 {
tomas_dca 0:56ca0aab95fc 497 float ax, ay, az;
tomas_dca 0:56ca0aab95fc 498 float xAngle, yAngle;
tomas_dca 0:56ca0aab95fc 499
tomas_dca 0:56ca0aab95fc 500 ax = acc.getAccX();
tomas_dca 0:56ca0aab95fc 501 ay = acc.getAccY();
tomas_dca 0:56ca0aab95fc 502 az = acc.getAccZ();
tomas_dca 0:56ca0aab95fc 503
tomas_dca 0:56ca0aab95fc 504
tomas_dca 0:56ca0aab95fc 505 xAngle = atan( ax / (sqrt((ay)*(ay) + (az)*(az)))) * 60;
tomas_dca 0:56ca0aab95fc 506 yAngle = atan( ay / (sqrt((ax)*(ax) + (az)*(az)))) * 60;
tomas_dca 0:56ca0aab95fc 507
tomas_dca 0:56ca0aab95fc 508 if(game_state == save)
tomas_dca 0:56ca0aab95fc 509 {
tomas_dca 0:56ca0aab95fc 510 xAngle_offset = xAngle;
tomas_dca 0:56ca0aab95fc 511 yAngle_offset = yAngle;
tomas_dca 0:56ca0aab95fc 512 }
tomas_dca 0:56ca0aab95fc 513 else
tomas_dca 0:56ca0aab95fc 514 {
tomas_dca 0:56ca0aab95fc 515 xAngle -= xAngle_offset;
tomas_dca 0:56ca0aab95fc 516 yAngle -= yAngle_offset;
tomas_dca 0:56ca0aab95fc 517 }
tomas_dca 0:56ca0aab95fc 518
tomas_dca 0:56ca0aab95fc 519 // find maximum
tomas_dca 0:56ca0aab95fc 520 if(abs(xAngle) >= abs(yAngle))
tomas_dca 0:56ca0aab95fc 521 {
tomas_dca 0:56ca0aab95fc 522 if(xAngle >= MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 523 {
tomas_dca 0:56ca0aab95fc 524 // +X
tomas_dca 0:56ca0aab95fc 525 acc_dir = up;
tomas_dca 0:56ca0aab95fc 526 }
tomas_dca 0:56ca0aab95fc 527 else
tomas_dca 0:56ca0aab95fc 528 if(xAngle <= -MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 529 {
tomas_dca 0:56ca0aab95fc 530 // -X
tomas_dca 0:56ca0aab95fc 531 acc_dir = down;
tomas_dca 0:56ca0aab95fc 532 }
tomas_dca 0:56ca0aab95fc 533 else
tomas_dca 0:56ca0aab95fc 534 if(abs(xAngle) <= IDLE_ANGLE)
tomas_dca 0:56ca0aab95fc 535 {
tomas_dca 0:56ca0aab95fc 536 if(game_state == test)
tomas_dca 0:56ca0aab95fc 537 confirm_dir();
tomas_dca 0:56ca0aab95fc 538 else
tomas_dca 0:56ca0aab95fc 539 move_cursor();
tomas_dca 0:56ca0aab95fc 540 }
tomas_dca 0:56ca0aab95fc 541 }
tomas_dca 0:56ca0aab95fc 542 else
tomas_dca 0:56ca0aab95fc 543 {
tomas_dca 0:56ca0aab95fc 544 if(yAngle >= MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 545 {
tomas_dca 0:56ca0aab95fc 546 // +Y
tomas_dca 0:56ca0aab95fc 547 acc_dir = left;
tomas_dca 0:56ca0aab95fc 548 }
tomas_dca 0:56ca0aab95fc 549 else
tomas_dca 0:56ca0aab95fc 550 if(yAngle <= -MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 551 {
tomas_dca 0:56ca0aab95fc 552 // -Y
tomas_dca 0:56ca0aab95fc 553 acc_dir = right;
tomas_dca 0:56ca0aab95fc 554 }
tomas_dca 0:56ca0aab95fc 555 else
tomas_dca 0:56ca0aab95fc 556 if(abs(yAngle) <= IDLE_ANGLE)
tomas_dca 0:56ca0aab95fc 557 {
tomas_dca 0:56ca0aab95fc 558 if(game_state == test)
tomas_dca 0:56ca0aab95fc 559 confirm_dir();
tomas_dca 0:56ca0aab95fc 560 else
tomas_dca 0:56ca0aab95fc 561 move_cursor();
tomas_dca 0:56ca0aab95fc 562 }
tomas_dca 0:56ca0aab95fc 563
tomas_dca 0:56ca0aab95fc 564 }
tomas_dca 0:56ca0aab95fc 565
tomas_dca 0:56ca0aab95fc 566 if(acc_dir != idle)
tomas_dca 0:56ca0aab95fc 567 {
tomas_dca 0:56ca0aab95fc 568 if(game_state == test)
tomas_dca 0:56ca0aab95fc 569 {
tomas_dca 0:56ca0aab95fc 570 fill_matrix(template_arrow, led_ant);
tomas_dca 0:56ca0aab95fc 571
tomas_dca 0:56ca0aab95fc 572
tomas_dca 0:56ca0aab95fc 573 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 574 {
tomas_dca 0:56ca0aab95fc 575 case down:
tomas_dca 0:56ca0aab95fc 576 rotate_matrix();
tomas_dca 0:56ca0aab95fc 577 case right:
tomas_dca 0:56ca0aab95fc 578 rotate_matrix();
tomas_dca 0:56ca0aab95fc 579 case up:
tomas_dca 0:56ca0aab95fc 580 rotate_matrix();
tomas_dca 0:56ca0aab95fc 581 case left:
tomas_dca 0:56ca0aab95fc 582 break;
tomas_dca 0:56ca0aab95fc 583 default:
tomas_dca 0:56ca0aab95fc 584 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 585 }
tomas_dca 0:56ca0aab95fc 586 }
tomas_dca 0:56ca0aab95fc 587 }
tomas_dca 0:56ca0aab95fc 588 }
tomas_dca 0:56ca0aab95fc 589 }
tomas_dca 0:56ca0aab95fc 590
tomas_dca 0:56ca0aab95fc 591 void move_cursor(void)
tomas_dca 0:56ca0aab95fc 592 {
tomas_dca 0:56ca0aab95fc 593 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 594 {
tomas_dca 0:56ca0aab95fc 595 case up:
tomas_dca 0:56ca0aab95fc 596 if(row == 6)
tomas_dca 0:56ca0aab95fc 597 row = 0;
tomas_dca 0:56ca0aab95fc 598 else
tomas_dca 0:56ca0aab95fc 599 row +=2;
tomas_dca 0:56ca0aab95fc 600 break;
tomas_dca 0:56ca0aab95fc 601 case right:
tomas_dca 0:56ca0aab95fc 602 if(column == 6)
tomas_dca 0:56ca0aab95fc 603 column = 0;
tomas_dca 0:56ca0aab95fc 604 else
tomas_dca 0:56ca0aab95fc 605 column +=2;
tomas_dca 0:56ca0aab95fc 606 break;
tomas_dca 0:56ca0aab95fc 607 case down:
tomas_dca 0:56ca0aab95fc 608 if(row == 0)
tomas_dca 0:56ca0aab95fc 609 row = 6;
tomas_dca 0:56ca0aab95fc 610 else
tomas_dca 0:56ca0aab95fc 611 row -=2;
tomas_dca 0:56ca0aab95fc 612 break;
tomas_dca 0:56ca0aab95fc 613 case left:
tomas_dca 0:56ca0aab95fc 614 if(column == 0)
tomas_dca 0:56ca0aab95fc 615 column = 6;
tomas_dca 0:56ca0aab95fc 616 else
tomas_dca 0:56ca0aab95fc 617 column -=2;
tomas_dca 0:56ca0aab95fc 618 break;
tomas_dca 0:56ca0aab95fc 619 default:
tomas_dca 0:56ca0aab95fc 620 break;
tomas_dca 0:56ca0aab95fc 621 }
tomas_dca 0:56ca0aab95fc 622 acc_dir = idle;
tomas_dca 0:56ca0aab95fc 623 }
tomas_dca 0:56ca0aab95fc 624
tomas_dca 0:56ca0aab95fc 625 void confirm_dir(void)
tomas_dca 0:56ca0aab95fc 626 {
tomas_dca 0:56ca0aab95fc 627 fill_matrix(template_arrow, led_lab);
tomas_dca 0:56ca0aab95fc 628
tomas_dca 0:56ca0aab95fc 629 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 630 {
tomas_dca 0:56ca0aab95fc 631 case down:
tomas_dca 0:56ca0aab95fc 632 rotate_matrix();
tomas_dca 0:56ca0aab95fc 633 case right:
tomas_dca 0:56ca0aab95fc 634 rotate_matrix();
tomas_dca 0:56ca0aab95fc 635 case up:
tomas_dca 0:56ca0aab95fc 636 rotate_matrix();
tomas_dca 0:56ca0aab95fc 637 case left:
tomas_dca 0:56ca0aab95fc 638 break;
tomas_dca 0:56ca0aab95fc 639 default:
tomas_dca 0:56ca0aab95fc 640 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 641 }
tomas_dca 0:56ca0aab95fc 642 acc_dir = idle;
tomas_dca 0:56ca0aab95fc 643 }
tomas_dca 0:56ca0aab95fc 644
tomas_dca 0:56ca0aab95fc 645 void show_matrix(void)
tomas_dca 0:56ca0aab95fc 646 {
tomas_dca 0:56ca0aab95fc 647 // labyrint block selection
tomas_dca 0:56ca0aab95fc 648 static uint8_t mask = 0; // on/off -> blink
tomas_dca 0:56ca0aab95fc 649
tomas_dca 0:56ca0aab95fc 650 mask++;
tomas_dca 0:56ca0aab95fc 651
tomas_dca 0:56ca0aab95fc 652 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 653 {
tomas_dca 0:56ca0aab95fc 654 ROW0 = 0x0001 & j;
tomas_dca 0:56ca0aab95fc 655 ROW1 = 0x0002 & j;
tomas_dca 0:56ca0aab95fc 656 ROW2 = 0x0004 & j;
tomas_dca 0:56ca0aab95fc 657
tomas_dca 0:56ca0aab95fc 658 COLG0 = ~matrix[j][0] & led_lab;
tomas_dca 0:56ca0aab95fc 659 COLG1 = ~matrix[j][1] & led_lab;
tomas_dca 0:56ca0aab95fc 660 COLG2 = ~matrix[j][2] & led_lab;
tomas_dca 0:56ca0aab95fc 661 COLG3 = ~matrix[j][3] & led_lab;
tomas_dca 0:56ca0aab95fc 662 COLG4 = ~matrix[j][4] & led_lab;
tomas_dca 0:56ca0aab95fc 663 COLG5 = ~matrix[j][5] & led_lab;
tomas_dca 0:56ca0aab95fc 664 COLG6 = ~matrix[j][6] & led_lab;
tomas_dca 0:56ca0aab95fc 665 COLG7 = ~matrix[j][7] & led_lab;
tomas_dca 0:56ca0aab95fc 666
tomas_dca 0:56ca0aab95fc 667 COLR0 = ~matrix[j][0] & led_ant;
tomas_dca 0:56ca0aab95fc 668 COLR1 = ~matrix[j][1] & led_ant;
tomas_dca 0:56ca0aab95fc 669 COLR2 = ~matrix[j][2] & led_ant;
tomas_dca 0:56ca0aab95fc 670 COLR3 = ~matrix[j][3] & led_ant;
tomas_dca 0:56ca0aab95fc 671 COLR4 = ~matrix[j][4] & led_ant;
tomas_dca 0:56ca0aab95fc 672 COLR5 = ~matrix[j][5] & led_ant;
tomas_dca 0:56ca0aab95fc 673 COLR6 = ~matrix[j][6] & led_ant;
tomas_dca 0:56ca0aab95fc 674 COLR7 = ~matrix[j][7] & led_ant;
tomas_dca 0:56ca0aab95fc 675
tomas_dca 0:56ca0aab95fc 676
tomas_dca 0:56ca0aab95fc 677 // blik cursor (block)
tomas_dca 0:56ca0aab95fc 678 if(((row == j) || ((row+1) == j)) && ((mask % 0x17) < 0xD) && ((game_state == game || (game_state == learn))))
tomas_dca 0:56ca0aab95fc 679 {
tomas_dca 0:56ca0aab95fc 680 switch(column)
tomas_dca 0:56ca0aab95fc 681 {
tomas_dca 0:56ca0aab95fc 682 case 0:
tomas_dca 0:56ca0aab95fc 683 COLG0 = ~led_free;
tomas_dca 0:56ca0aab95fc 684 COLR0 = ~led_free;
tomas_dca 0:56ca0aab95fc 685 COLG1 = ~led_free;
tomas_dca 0:56ca0aab95fc 686 COLR1 = ~led_free;
tomas_dca 0:56ca0aab95fc 687 break;
tomas_dca 0:56ca0aab95fc 688 case 2:
tomas_dca 0:56ca0aab95fc 689 COLG2 = ~led_free;
tomas_dca 0:56ca0aab95fc 690 COLR2 = ~led_free;
tomas_dca 0:56ca0aab95fc 691 COLG3 = ~led_free;
tomas_dca 0:56ca0aab95fc 692 COLR3 = ~led_free;
tomas_dca 0:56ca0aab95fc 693 break;
tomas_dca 0:56ca0aab95fc 694 case 4:
tomas_dca 0:56ca0aab95fc 695 COLG4 = ~led_free;
tomas_dca 0:56ca0aab95fc 696 COLR4 = ~led_free;
tomas_dca 0:56ca0aab95fc 697 COLG5 = ~led_free;
tomas_dca 0:56ca0aab95fc 698 COLR5 = ~led_free;
tomas_dca 0:56ca0aab95fc 699 break;
tomas_dca 0:56ca0aab95fc 700 case 6:
tomas_dca 0:56ca0aab95fc 701 COLG6 = ~led_free;
tomas_dca 0:56ca0aab95fc 702 COLR6 = ~led_free;
tomas_dca 0:56ca0aab95fc 703 COLG7 = ~led_free;
tomas_dca 0:56ca0aab95fc 704 COLR7 = ~led_free;
tomas_dca 0:56ca0aab95fc 705 break;
tomas_dca 0:56ca0aab95fc 706 default:
tomas_dca 0:56ca0aab95fc 707 break;
tomas_dca 0:56ca0aab95fc 708 }
tomas_dca 0:56ca0aab95fc 709 }
tomas_dca 0:56ca0aab95fc 710
tomas_dca 0:56ca0aab95fc 711 wait(brightness);
tomas_dca 0:56ca0aab95fc 712
tomas_dca 0:56ca0aab95fc 713 COLG0 = ~led_free;
tomas_dca 0:56ca0aab95fc 714 COLG1 = ~led_free;
tomas_dca 0:56ca0aab95fc 715 COLG2 = ~led_free;
tomas_dca 0:56ca0aab95fc 716 COLG3 = ~led_free;
tomas_dca 0:56ca0aab95fc 717 COLG4 = ~led_free;
tomas_dca 0:56ca0aab95fc 718 COLG5 = ~led_free;
tomas_dca 0:56ca0aab95fc 719 COLG6 = ~led_free;
tomas_dca 0:56ca0aab95fc 720 COLG7 = ~led_free;
tomas_dca 0:56ca0aab95fc 721
tomas_dca 0:56ca0aab95fc 722 COLR0 = ~led_free;
tomas_dca 0:56ca0aab95fc 723 COLR1 = ~led_free;
tomas_dca 0:56ca0aab95fc 724 COLR2 = ~led_free;
tomas_dca 0:56ca0aab95fc 725 COLR3 = ~led_free;
tomas_dca 0:56ca0aab95fc 726 COLR4 = ~led_free;
tomas_dca 0:56ca0aab95fc 727 COLR5 = ~led_free;
tomas_dca 0:56ca0aab95fc 728 COLR6 = ~led_free;
tomas_dca 0:56ca0aab95fc 729 COLR7 = ~led_free;
tomas_dca 0:56ca0aab95fc 730 }
tomas_dca 0:56ca0aab95fc 731 }
tomas_dca 0:56ca0aab95fc 732
tomas_dca 0:56ca0aab95fc 733 void fill_matrix(uint64_t temp, uint8_t color)
tomas_dca 0:56ca0aab95fc 734 {
tomas_dca 0:56ca0aab95fc 735 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 736 {
tomas_dca 0:56ca0aab95fc 737 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 738 {
tomas_dca 0:56ca0aab95fc 739 matrix[j][i] = color * ( 0 < (temp & (0x8000000000000000>>((8*j)+i)))); // print template to the matrix
tomas_dca 0:56ca0aab95fc 740 }
tomas_dca 0:56ca0aab95fc 741 }
tomas_dca 0:56ca0aab95fc 742 }
tomas_dca 0:56ca0aab95fc 743
tomas_dca 0:56ca0aab95fc 744 void rotate_matrix(void)
tomas_dca 0:56ca0aab95fc 745 {
tomas_dca 0:56ca0aab95fc 746 uint8_t temp[8][8];
tomas_dca 0:56ca0aab95fc 747
tomas_dca 0:56ca0aab95fc 748 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 749 {
tomas_dca 0:56ca0aab95fc 750 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 751 {
tomas_dca 0:56ca0aab95fc 752 temp[7-i][j] = matrix[j][i];
tomas_dca 0:56ca0aab95fc 753 }
tomas_dca 0:56ca0aab95fc 754 }
tomas_dca 0:56ca0aab95fc 755
tomas_dca 0:56ca0aab95fc 756 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 757 {
tomas_dca 0:56ca0aab95fc 758 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 759 {
tomas_dca 0:56ca0aab95fc 760 matrix[j][i] = temp[j][i];
tomas_dca 0:56ca0aab95fc 761 }
tomas_dca 0:56ca0aab95fc 762 }
tomas_dca 0:56ca0aab95fc 763 }
tomas_dca 0:56ca0aab95fc 764
tomas_dca 0:56ca0aab95fc 765 void rotate_lab(uint8_t lab_row, uint8_t lab_col)
tomas_dca 0:56ca0aab95fc 766 {
tomas_dca 0:56ca0aab95fc 767 // if block is labyrint only
tomas_dca 0:56ca0aab95fc 768 if(((matrix[lab_row][lab_col]%2) == 0) && ((matrix[lab_row+1][lab_col]%2) == 0) && ((matrix[lab_row][lab_col+1]%2) == 0) && ((matrix[lab_row+1][lab_col+1]%2) == 0))
tomas_dca 0:56ca0aab95fc 769 {
tomas_dca 0:56ca0aab95fc 770 uint8_t temp;
tomas_dca 0:56ca0aab95fc 771
tomas_dca 0:56ca0aab95fc 772 temp = matrix[lab_row][lab_col];
tomas_dca 0:56ca0aab95fc 773 matrix[lab_row][lab_col] = matrix[lab_row][lab_col+1];
tomas_dca 0:56ca0aab95fc 774 matrix[lab_row][lab_col+1] = matrix[lab_row+1][lab_col+1];
tomas_dca 0:56ca0aab95fc 775 matrix[lab_row+1][lab_col+1] = matrix[lab_row+1][lab_col];
tomas_dca 0:56ca0aab95fc 776 matrix[lab_row+1][lab_col] = temp;
tomas_dca 0:56ca0aab95fc 777
tomas_dca 0:56ca0aab95fc 778 // change block type (because of turn clockwise and Anticlockwise too)
tomas_dca 0:56ca0aab95fc 779 if(matrix[lab_row][lab_col+1] == led_lab)
tomas_dca 0:56ca0aab95fc 780 {
tomas_dca 0:56ca0aab95fc 781 if((matrix[lab_row][lab_col] == led_lab) && (matrix[lab_row+1][lab_col] == led_lab))
tomas_dca 0:56ca0aab95fc 782 {
tomas_dca 0:56ca0aab95fc 783 matrix[lab_row][lab_col] = led_free;
tomas_dca 0:56ca0aab95fc 784 matrix[lab_row][lab_col+1] = led_lab;
tomas_dca 0:56ca0aab95fc 785 matrix[lab_row+1][lab_col+1] = led_free;
tomas_dca 0:56ca0aab95fc 786 matrix[lab_row+1][lab_col] = led_free;
tomas_dca 0:56ca0aab95fc 787 }
tomas_dca 0:56ca0aab95fc 788 else
tomas_dca 0:56ca0aab95fc 789 if((matrix[lab_row][lab_col] == led_free) && (matrix[lab_row+1][lab_col] == led_free) && (matrix[lab_row+1][lab_col+1] == led_free))
tomas_dca 0:56ca0aab95fc 790 {
tomas_dca 0:56ca0aab95fc 791 matrix[lab_row][lab_col] = led_lab;
tomas_dca 0:56ca0aab95fc 792 matrix[lab_row+1][lab_col] = led_lab;
tomas_dca 0:56ca0aab95fc 793 matrix[lab_row+1][lab_col+1] = led_free;
tomas_dca 0:56ca0aab95fc 794 }
tomas_dca 0:56ca0aab95fc 795 }
tomas_dca 0:56ca0aab95fc 796
tomas_dca 0:56ca0aab95fc 797 }
tomas_dca 0:56ca0aab95fc 798 }
tomas_dca 0:56ca0aab95fc 799
tomas_dca 0:56ca0aab95fc 800 void prepare_matrix(void)
tomas_dca 0:56ca0aab95fc 801 {
tomas_dca 0:56ca0aab95fc 802 // only used blocks are re-generate
tomas_dca 0:56ca0aab95fc 803 fill_matrix(template_fill, led_used);
tomas_dca 0:56ca0aab95fc 804
tomas_dca 0:56ca0aab95fc 805 // reset counter
tomas_dca 0:56ca0aab95fc 806 if(game_state != game)
tomas_dca 0:56ca0aab95fc 807 score_cnt = 0;
tomas_dca 0:56ca0aab95fc 808
tomas_dca 0:56ca0aab95fc 809 // start marker position
tomas_dca 0:56ca0aab95fc 810 row = 2;
tomas_dca 0:56ca0aab95fc 811 column = 2;
tomas_dca 0:56ca0aab95fc 812
tomas_dca 0:56ca0aab95fc 813 // start symbol (home)
tomas_dca 0:56ca0aab95fc 814 matrix[4][2] = led_free;
tomas_dca 0:56ca0aab95fc 815 matrix[5][2] = led_free;
tomas_dca 0:56ca0aab95fc 816 matrix[4][3] = led_lab;
tomas_dca 0:56ca0aab95fc 817 matrix[5][3] = led_ant;
tomas_dca 0:56ca0aab95fc 818
tomas_dca 0:56ca0aab95fc 819 // start ant position
tomas_dca 0:56ca0aab95fc 820 ant_row = 5;
tomas_dca 0:56ca0aab95fc 821 ant_column = 3;
tomas_dca 0:56ca0aab95fc 822
tomas_dca 0:56ca0aab95fc 823 // new direction
tomas_dca 0:56ca0aab95fc 824 ant_dir = down;
tomas_dca 0:56ca0aab95fc 825 }
tomas_dca 0:56ca0aab95fc 826
tomas_dca 0:56ca0aab95fc 827 void reload_matrix(void)
tomas_dca 0:56ca0aab95fc 828 {
tomas_dca 0:56ca0aab95fc 829 for(uint8_t j = 0; j < 4;j++)
tomas_dca 0:56ca0aab95fc 830 {
tomas_dca 0:56ca0aab95fc 831 for(uint8_t i = 0; i < 4;i++)
tomas_dca 0:56ca0aab95fc 832 {
tomas_dca 0:56ca0aab95fc 833 int8_t block;
tomas_dca 0:56ca0aab95fc 834 int8_t shift;
tomas_dca 0:56ca0aab95fc 835
tomas_dca 0:56ca0aab95fc 836 // if labyrint part == used => generate new part
tomas_dca 0:56ca0aab95fc 837 if((matrix[j*2][i*2] == led_used) && (matrix[(j*2) + 1][i*2] == led_used) && (matrix[(j*2) + 1][(i*2) + 1] == led_used) && (matrix[j*2][(i*2) + 1] == led_used))
tomas_dca 0:56ca0aab95fc 838 {
tomas_dca 0:56ca0aab95fc 839 switch( rand() % 3 )
tomas_dca 0:56ca0aab95fc 840 {
tomas_dca 0:56ca0aab95fc 841 case 0:
tomas_dca 0:56ca0aab95fc 842 block = lab_turn_big;
tomas_dca 0:56ca0aab95fc 843 break;
tomas_dca 0:56ca0aab95fc 844 case 1:
tomas_dca 0:56ca0aab95fc 845 block = lab_turn_small;
tomas_dca 0:56ca0aab95fc 846 break;
tomas_dca 0:56ca0aab95fc 847 case 2:
tomas_dca 0:56ca0aab95fc 848 block = lab_straight;
tomas_dca 0:56ca0aab95fc 849 break;
tomas_dca 0:56ca0aab95fc 850 default:
tomas_dca 0:56ca0aab95fc 851 block = 0x0f;
tomas_dca 0:56ca0aab95fc 852 }
tomas_dca 0:56ca0aab95fc 853
tomas_dca 0:56ca0aab95fc 854 shift = rand() % 4;
tomas_dca 0:56ca0aab95fc 855 matrix[2*j][2*i] = led_lab * ( 1 & block >> (shift % 4)); // 0
tomas_dca 0:56ca0aab95fc 856 matrix[2*j][(2*i)+1] = led_lab * ( 1 & (block >> (++shift % 4))); // 1
tomas_dca 0:56ca0aab95fc 857 matrix[(2*j)+1][2*i] = led_lab * ( 1 & (block >> (++shift % 4))); // 2
tomas_dca 0:56ca0aab95fc 858 matrix[(2*j)+1][(2*i)+1] = led_lab * ( 1 & (block >> (++shift % 4))); // 3
tomas_dca 0:56ca0aab95fc 859
tomas_dca 0:56ca0aab95fc 860 // one block == one point
tomas_dca 0:56ca0aab95fc 861 if(game_state == game)
tomas_dca 0:56ca0aab95fc 862 score_cnt++;
tomas_dca 0:56ca0aab95fc 863 }
tomas_dca 0:56ca0aab95fc 864 }
tomas_dca 0:56ca0aab95fc 865 }
tomas_dca 0:56ca0aab95fc 866 }
tomas_dca 0:56ca0aab95fc 867
tomas_dca 0:56ca0aab95fc 868 void ant_move(void)
tomas_dca 0:56ca0aab95fc 869 {
tomas_dca 0:56ca0aab95fc 870 // ant_dir
tomas_dca 0:56ca0aab95fc 871 // enum left(1), up(2), right(3), down(4)
tomas_dca 0:56ca0aab95fc 872
tomas_dca 0:56ca0aab95fc 873
tomas_dca 0:56ca0aab95fc 874 if((game_state == game) || (game_state == learn))
tomas_dca 0:56ca0aab95fc 875 {
tomas_dca 0:56ca0aab95fc 876
tomas_dca 0:56ca0aab95fc 877 // old pixel
tomas_dca 0:56ca0aab95fc 878 matrix[ant_row][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 879
tomas_dca 0:56ca0aab95fc 880 // find new pixel
tomas_dca 0:56ca0aab95fc 881 if((ant_dir % 2) == 0)
tomas_dca 0:56ca0aab95fc 882 {
tomas_dca 0:56ca0aab95fc 883 // up, down
tomas_dca 0:56ca0aab95fc 884 if(((ant_row + (ant_dir == down)) % 2) == 0)
tomas_dca 0:56ca0aab95fc 885 {
tomas_dca 0:56ca0aab95fc 886 // 1. type move
tomas_dca 0:56ca0aab95fc 887 /* | str in */ if(matrix[ant_row + 1 - (2 * (ant_dir == down))][ant_column] == led_lab)
tomas_dca 0:56ca0aab95fc 888 {
tomas_dca 0:56ca0aab95fc 889 // go straight (in block)
tomas_dca 0:56ca0aab95fc 890 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 891 ant_row += 1 - (2 * (ant_dir == down));
tomas_dca 0:56ca0aab95fc 892 }
tomas_dca 0:56ca0aab95fc 893 else
tomas_dca 0:56ca0aab95fc 894 {
tomas_dca 0:56ca0aab95fc 895 /* | turn out */ if((matrix[ant_row][ant_column - 1 + (2 * (ant_dir == down))] == led_lab ) && (matrix[ant_row + 1 - (2 * (ant_row % 2))][ant_column - 1 + (2 * (ant_dir == down))] == led_free ))
tomas_dca 0:56ca0aab95fc 896 {
tomas_dca 0:56ca0aab95fc 897 // mark used block
tomas_dca 0:56ca0aab95fc 898 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 899 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 900 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 901
tomas_dca 0:56ca0aab95fc 902 if((ant_column % 2) == 0)
tomas_dca 0:56ca0aab95fc 903 {
tomas_dca 0:56ca0aab95fc 904 ant_dir = left;
tomas_dca 0:56ca0aab95fc 905 }
tomas_dca 0:56ca0aab95fc 906 else
tomas_dca 0:56ca0aab95fc 907 {
tomas_dca 0:56ca0aab95fc 908 ant_dir = right;
tomas_dca 0:56ca0aab95fc 909 }
tomas_dca 0:56ca0aab95fc 910
tomas_dca 0:56ca0aab95fc 911 // turn (out block)
tomas_dca 0:56ca0aab95fc 912 ant_column += -1 + (2 * (ant_column % 2));
tomas_dca 0:56ca0aab95fc 913 }
tomas_dca 0:56ca0aab95fc 914 else
tomas_dca 0:56ca0aab95fc 915 // reload matrix
tomas_dca 0:56ca0aab95fc 916 if((ant_column == 7) || (ant_column == 0))
tomas_dca 0:56ca0aab95fc 917 {
tomas_dca 0:56ca0aab95fc 918 if((matrix[ant_row][7 * (ant_column != 7)] == led_lab) && (matrix[ant_row + 1 - (2 * (ant_row % 2))][7 * (ant_column != 7)] == led_free))
tomas_dca 0:56ca0aab95fc 919 {
tomas_dca 0:56ca0aab95fc 920 // mark used block
tomas_dca 0:56ca0aab95fc 921 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 922 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 923 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 924
tomas_dca 0:56ca0aab95fc 925 reload_matrix();
tomas_dca 0:56ca0aab95fc 926
tomas_dca 0:56ca0aab95fc 927 if(ant_column == 0)
tomas_dca 0:56ca0aab95fc 928 {
tomas_dca 0:56ca0aab95fc 929 ant_column = 7;
tomas_dca 0:56ca0aab95fc 930 ant_dir = left;
tomas_dca 0:56ca0aab95fc 931 }
tomas_dca 0:56ca0aab95fc 932 else
tomas_dca 0:56ca0aab95fc 933 {
tomas_dca 0:56ca0aab95fc 934 ant_column = 0;
tomas_dca 0:56ca0aab95fc 935 ant_dir = right;
tomas_dca 0:56ca0aab95fc 936 }
tomas_dca 0:56ca0aab95fc 937 }
tomas_dca 0:56ca0aab95fc 938 else
tomas_dca 0:56ca0aab95fc 939 {
tomas_dca 0:56ca0aab95fc 940 // GAME OVER
tomas_dca 0:56ca0aab95fc 941 if(game_state == game)
tomas_dca 0:56ca0aab95fc 942 game_state = score;
tomas_dca 0:56ca0aab95fc 943 }
tomas_dca 0:56ca0aab95fc 944 }
tomas_dca 0:56ca0aab95fc 945 else
tomas_dca 0:56ca0aab95fc 946 {
tomas_dca 0:56ca0aab95fc 947 // GAME OVER
tomas_dca 0:56ca0aab95fc 948 if(game_state == game)
tomas_dca 0:56ca0aab95fc 949 game_state = score;
tomas_dca 0:56ca0aab95fc 950 }
tomas_dca 0:56ca0aab95fc 951 }
tomas_dca 0:56ca0aab95fc 952 }
tomas_dca 0:56ca0aab95fc 953 else
tomas_dca 0:56ca0aab95fc 954 if(((ant_row + (ant_dir == down)) % 2) == 1)
tomas_dca 0:56ca0aab95fc 955 {
tomas_dca 0:56ca0aab95fc 956 // 2. type move
tomas_dca 0:56ca0aab95fc 957 /* | turn in */ if(matrix[ant_row][ant_column + 1 - (2 * (ant_column % 2))] == led_lab)
tomas_dca 0:56ca0aab95fc 958 {
tomas_dca 0:56ca0aab95fc 959 if((ant_column % 2) == 0)
tomas_dca 0:56ca0aab95fc 960 {
tomas_dca 0:56ca0aab95fc 961 ant_dir = right;
tomas_dca 0:56ca0aab95fc 962 }
tomas_dca 0:56ca0aab95fc 963 else
tomas_dca 0:56ca0aab95fc 964 {
tomas_dca 0:56ca0aab95fc 965 ant_dir = left;
tomas_dca 0:56ca0aab95fc 966 }
tomas_dca 0:56ca0aab95fc 967
tomas_dca 0:56ca0aab95fc 968 // turn (in block)
tomas_dca 0:56ca0aab95fc 969 ant_column += 1 - (2 * (ant_column % 2));
tomas_dca 0:56ca0aab95fc 970
tomas_dca 0:56ca0aab95fc 971 }
tomas_dca 0:56ca0aab95fc 972 else
tomas_dca 0:56ca0aab95fc 973 {
tomas_dca 0:56ca0aab95fc 974 // go straight (out block)
tomas_dca 0:56ca0aab95fc 975 /* | str out */
tomas_dca 0:56ca0aab95fc 976 if((matrix[ant_row + 1 - (2 * (ant_dir == down))][ant_column] == led_lab) && (matrix[ant_row + 1 - (2 * (ant_dir == down))][ant_column + 1 - (2 * (ant_column % 2))] == led_free))
tomas_dca 0:56ca0aab95fc 977 {
tomas_dca 0:56ca0aab95fc 978 // mark used block
tomas_dca 0:56ca0aab95fc 979 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 980 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 981 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 982
tomas_dca 0:56ca0aab95fc 983 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 984 ant_row += 1 - (2 * (ant_dir == down));
tomas_dca 0:56ca0aab95fc 985 }
tomas_dca 0:56ca0aab95fc 986 else
tomas_dca 0:56ca0aab95fc 987 // reload matrix
tomas_dca 0:56ca0aab95fc 988 if((ant_row == 7) || (ant_row == 0))
tomas_dca 0:56ca0aab95fc 989 {
tomas_dca 0:56ca0aab95fc 990 if((matrix[7 * (ant_row != 7)][ant_column] == led_lab) && (matrix[7 * (ant_row != 7)][ant_column + 1 - (2 * (ant_column % 2))] == led_free))
tomas_dca 0:56ca0aab95fc 991 {
tomas_dca 0:56ca0aab95fc 992 // mark used block
tomas_dca 0:56ca0aab95fc 993 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 994 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 995 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 996
tomas_dca 0:56ca0aab95fc 997 reload_matrix();
tomas_dca 0:56ca0aab95fc 998
tomas_dca 0:56ca0aab95fc 999 if(ant_dir == down)
tomas_dca 0:56ca0aab95fc 1000 ant_row = 7;
tomas_dca 0:56ca0aab95fc 1001 else
tomas_dca 0:56ca0aab95fc 1002 ant_row = 0;
tomas_dca 0:56ca0aab95fc 1003 }
tomas_dca 0:56ca0aab95fc 1004 else
tomas_dca 0:56ca0aab95fc 1005 {
tomas_dca 0:56ca0aab95fc 1006 // GAME OVER
tomas_dca 0:56ca0aab95fc 1007 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1008 game_state = score;
tomas_dca 0:56ca0aab95fc 1009 }
tomas_dca 0:56ca0aab95fc 1010 }
tomas_dca 0:56ca0aab95fc 1011 else
tomas_dca 0:56ca0aab95fc 1012 {
tomas_dca 0:56ca0aab95fc 1013 // GAME OVER
tomas_dca 0:56ca0aab95fc 1014 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1015 game_state = score;
tomas_dca 0:56ca0aab95fc 1016 }
tomas_dca 0:56ca0aab95fc 1017 }
tomas_dca 0:56ca0aab95fc 1018 }
tomas_dca 0:56ca0aab95fc 1019
tomas_dca 0:56ca0aab95fc 1020 }
tomas_dca 0:56ca0aab95fc 1021 // right, left
tomas_dca 0:56ca0aab95fc 1022 else
tomas_dca 0:56ca0aab95fc 1023 {
tomas_dca 0:56ca0aab95fc 1024 if(((ant_column + (ant_dir == right)) % 2) == 1)
tomas_dca 0:56ca0aab95fc 1025 {
tomas_dca 0:56ca0aab95fc 1026 // 1. type move
tomas_dca 0:56ca0aab95fc 1027 /* - str in */
tomas_dca 0:56ca0aab95fc 1028 if(matrix[ant_row][ant_column - 1 + (2 * ( ant_dir == right))] == led_lab )
tomas_dca 0:56ca0aab95fc 1029 {
tomas_dca 0:56ca0aab95fc 1030 // go straight (in block)
tomas_dca 0:56ca0aab95fc 1031 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 1032 ant_column += - 1 + (2 * ( ant_dir == right));
tomas_dca 0:56ca0aab95fc 1033
tomas_dca 0:56ca0aab95fc 1034 }
tomas_dca 0:56ca0aab95fc 1035 else
tomas_dca 0:56ca0aab95fc 1036 /* - turn out */
tomas_dca 0:56ca0aab95fc 1037 if((matrix[ant_row - 1 + (2 * (ant_row % 2 ))][ant_column] == led_lab ) && (matrix[ant_row - 1 + (2 * (ant_row % 2 ))][ant_column - 1 + (2 * (ant_dir == right))] == led_free ))
tomas_dca 0:56ca0aab95fc 1038 {
tomas_dca 0:56ca0aab95fc 1039 // mark used block
tomas_dca 0:56ca0aab95fc 1040 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1041 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1042 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1043
tomas_dca 0:56ca0aab95fc 1044 if((ant_row % 2) == 0)
tomas_dca 0:56ca0aab95fc 1045 {
tomas_dca 0:56ca0aab95fc 1046 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1047 }
tomas_dca 0:56ca0aab95fc 1048 else
tomas_dca 0:56ca0aab95fc 1049 {
tomas_dca 0:56ca0aab95fc 1050 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1051 }
tomas_dca 0:56ca0aab95fc 1052
tomas_dca 0:56ca0aab95fc 1053 // turn (out block)
tomas_dca 0:56ca0aab95fc 1054 ant_row += -1 + (2 * (ant_row % 2));
tomas_dca 0:56ca0aab95fc 1055
tomas_dca 0:56ca0aab95fc 1056 }
tomas_dca 0:56ca0aab95fc 1057 else
tomas_dca 0:56ca0aab95fc 1058 // reload matrix
tomas_dca 0:56ca0aab95fc 1059 if((ant_row == 7) || (ant_row == 0))
tomas_dca 0:56ca0aab95fc 1060 {
tomas_dca 0:56ca0aab95fc 1061 if((matrix[7 * (ant_row != 7)][ant_column] == led_lab) && (matrix[7 * (ant_row != 7)][ant_column + 1 - (2 * (ant_column % 2))] == led_free))
tomas_dca 0:56ca0aab95fc 1062 {
tomas_dca 0:56ca0aab95fc 1063 // mark used block
tomas_dca 0:56ca0aab95fc 1064 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1065 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1066 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1067
tomas_dca 0:56ca0aab95fc 1068 reload_matrix();
tomas_dca 0:56ca0aab95fc 1069
tomas_dca 0:56ca0aab95fc 1070 if(ant_row == 0)
tomas_dca 0:56ca0aab95fc 1071 {
tomas_dca 0:56ca0aab95fc 1072 ant_row = 7;
tomas_dca 0:56ca0aab95fc 1073 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1074 }
tomas_dca 0:56ca0aab95fc 1075 else
tomas_dca 0:56ca0aab95fc 1076 {
tomas_dca 0:56ca0aab95fc 1077 ant_row = 0;
tomas_dca 0:56ca0aab95fc 1078 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1079 }
tomas_dca 0:56ca0aab95fc 1080 }
tomas_dca 0:56ca0aab95fc 1081 else
tomas_dca 0:56ca0aab95fc 1082 {
tomas_dca 0:56ca0aab95fc 1083 // GAME OVER
tomas_dca 0:56ca0aab95fc 1084 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1085 game_state = score;
tomas_dca 0:56ca0aab95fc 1086 }
tomas_dca 0:56ca0aab95fc 1087 }
tomas_dca 0:56ca0aab95fc 1088 else
tomas_dca 0:56ca0aab95fc 1089 {
tomas_dca 0:56ca0aab95fc 1090 // GAME OVER
tomas_dca 0:56ca0aab95fc 1091 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1092 game_state = score;
tomas_dca 0:56ca0aab95fc 1093 }
tomas_dca 0:56ca0aab95fc 1094 }
tomas_dca 0:56ca0aab95fc 1095 else
tomas_dca 0:56ca0aab95fc 1096 {
tomas_dca 0:56ca0aab95fc 1097 // 2. type move
tomas_dca 0:56ca0aab95fc 1098 /* - turn in */ if(matrix[ant_row + 1 - (2 * (ant_dir == right))][ant_column] == led_lab)
tomas_dca 0:56ca0aab95fc 1099 {
tomas_dca 0:56ca0aab95fc 1100 if((ant_row % 2) == 0)
tomas_dca 0:56ca0aab95fc 1101 {
tomas_dca 0:56ca0aab95fc 1102 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1103 }
tomas_dca 0:56ca0aab95fc 1104 else
tomas_dca 0:56ca0aab95fc 1105 {
tomas_dca 0:56ca0aab95fc 1106 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1107 }
tomas_dca 0:56ca0aab95fc 1108
tomas_dca 0:56ca0aab95fc 1109 // turn (in block)
tomas_dca 0:56ca0aab95fc 1110 ant_row += 1 - (2 * (ant_row % 2));
tomas_dca 0:56ca0aab95fc 1111 }
tomas_dca 0:56ca0aab95fc 1112 /* - str out */
tomas_dca 0:56ca0aab95fc 1113 else
tomas_dca 0:56ca0aab95fc 1114 if((matrix[ant_row][ant_column - 1 + (2 * ( ant_dir == right))] == led_lab) && (matrix[ant_row + 1 - (2 * (ant_row % 2))][ant_column - 1 + (2 * ( ant_dir == right))] == led_free))
tomas_dca 0:56ca0aab95fc 1115 {
tomas_dca 0:56ca0aab95fc 1116 // mark used block
tomas_dca 0:56ca0aab95fc 1117 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1118 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1119 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1120
tomas_dca 0:56ca0aab95fc 1121 // go straight (out block)
tomas_dca 0:56ca0aab95fc 1122 ant_column += -1 + (2 * ( ant_dir == right));
tomas_dca 0:56ca0aab95fc 1123
tomas_dca 0:56ca0aab95fc 1124 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 1125 }
tomas_dca 0:56ca0aab95fc 1126 else
tomas_dca 0:56ca0aab95fc 1127 // reload matrix
tomas_dca 0:56ca0aab95fc 1128 if((ant_column == 7) || (ant_column == 0))
tomas_dca 0:56ca0aab95fc 1129 {
tomas_dca 0:56ca0aab95fc 1130 if((matrix[ant_row][7 * (ant_column != 7)] == led_lab) && (matrix[ant_row + 1 - (2 * (ant_row % 2))][7 * (ant_column != 7)] == led_free))
tomas_dca 0:56ca0aab95fc 1131 {
tomas_dca 0:56ca0aab95fc 1132 // mark used block
tomas_dca 0:56ca0aab95fc 1133 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1134 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1135 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1136
tomas_dca 0:56ca0aab95fc 1137 reload_matrix();
tomas_dca 0:56ca0aab95fc 1138
tomas_dca 0:56ca0aab95fc 1139 if(ant_dir == left)
tomas_dca 0:56ca0aab95fc 1140 ant_column = 7;
tomas_dca 0:56ca0aab95fc 1141 else
tomas_dca 0:56ca0aab95fc 1142 ant_column = 0;
tomas_dca 0:56ca0aab95fc 1143 }
tomas_dca 0:56ca0aab95fc 1144 else
tomas_dca 0:56ca0aab95fc 1145 {
tomas_dca 0:56ca0aab95fc 1146 // GAME OVER
tomas_dca 0:56ca0aab95fc 1147 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1148 game_state = score;
tomas_dca 0:56ca0aab95fc 1149 }
tomas_dca 0:56ca0aab95fc 1150 }
tomas_dca 0:56ca0aab95fc 1151 else
tomas_dca 0:56ca0aab95fc 1152 {
tomas_dca 0:56ca0aab95fc 1153 // GAME OVER
tomas_dca 0:56ca0aab95fc 1154 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1155 game_state = score;
tomas_dca 0:56ca0aab95fc 1156 }
tomas_dca 0:56ca0aab95fc 1157 }
tomas_dca 0:56ca0aab95fc 1158 }
tomas_dca 0:56ca0aab95fc 1159 matrix[ant_row][ant_column] = led_ant;
tomas_dca 0:56ca0aab95fc 1160 }
tomas_dca 0:56ca0aab95fc 1161 }
tomas_dca 0:56ca0aab95fc 1162
tomas_dca 0:56ca0aab95fc 1163 uint32_t translate(uint8_t number)
tomas_dca 0:56ca0aab95fc 1164 {
tomas_dca 0:56ca0aab95fc 1165 uint32_t ret;
tomas_dca 0:56ca0aab95fc 1166
tomas_dca 0:56ca0aab95fc 1167
tomas_dca 0:56ca0aab95fc 1168 // translate numbers to symbols
tomas_dca 0:56ca0aab95fc 1169 for(uint8_t j = 0; j < 5;j++)
tomas_dca 0:56ca0aab95fc 1170 {
tomas_dca 0:56ca0aab95fc 1171 switch(number)
tomas_dca 0:56ca0aab95fc 1172 {
tomas_dca 0:56ca0aab95fc 1173 case 0:
tomas_dca 0:56ca0aab95fc 1174 ret = zero;
tomas_dca 0:56ca0aab95fc 1175 break;
tomas_dca 0:56ca0aab95fc 1176 case 1:
tomas_dca 0:56ca0aab95fc 1177 ret = one;
tomas_dca 0:56ca0aab95fc 1178 break;
tomas_dca 0:56ca0aab95fc 1179 case 2:
tomas_dca 0:56ca0aab95fc 1180 ret = two;
tomas_dca 0:56ca0aab95fc 1181 break;
tomas_dca 0:56ca0aab95fc 1182 case 3:
tomas_dca 0:56ca0aab95fc 1183 ret = three;
tomas_dca 0:56ca0aab95fc 1184 break;
tomas_dca 0:56ca0aab95fc 1185 case 4:
tomas_dca 0:56ca0aab95fc 1186 ret = four;
tomas_dca 0:56ca0aab95fc 1187 break;
tomas_dca 0:56ca0aab95fc 1188 case 5:
tomas_dca 0:56ca0aab95fc 1189 ret = five;
tomas_dca 0:56ca0aab95fc 1190 break;
tomas_dca 0:56ca0aab95fc 1191 case 6:
tomas_dca 0:56ca0aab95fc 1192 ret = six;
tomas_dca 0:56ca0aab95fc 1193 break;
tomas_dca 0:56ca0aab95fc 1194 case 7:
tomas_dca 0:56ca0aab95fc 1195 ret = seven;
tomas_dca 0:56ca0aab95fc 1196 break;
tomas_dca 0:56ca0aab95fc 1197 case 8:
tomas_dca 0:56ca0aab95fc 1198 ret = eight;
tomas_dca 0:56ca0aab95fc 1199 break;
tomas_dca 0:56ca0aab95fc 1200 default:
tomas_dca 0:56ca0aab95fc 1201 ret = nine;
tomas_dca 0:56ca0aab95fc 1202 break;
tomas_dca 0:56ca0aab95fc 1203 }
tomas_dca 0:56ca0aab95fc 1204 }
tomas_dca 0:56ca0aab95fc 1205
tomas_dca 0:56ca0aab95fc 1206 return(ret);
tomas_dca 0:56ca0aab95fc 1207 }