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

Dependencies:   MMA8451Q RGB mbed

Committer:
tomas_dca
Date:
Thu Jan 08 11:57:28 2015 +0000
Revision:
1:806df0da28dc
Parent:
0:56ca0aab95fc
Child:
2:3735ddc47ec7
fixed broken pin PTC7

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 0:56ca0aab95fc 305 sym_clr = led_ant;
tomas_dca 0:56ca0aab95fc 306
tomas_dca 0:56ca0aab95fc 307 break;
tomas_dca 0:56ca0aab95fc 308 case 3:
tomas_dca 0:56ca0aab95fc 309 case 4:
tomas_dca 0:56ca0aab95fc 310 case 5:
tomas_dca 0:56ca0aab95fc 311 case 6:
tomas_dca 0:56ca0aab95fc 312 case 7:
tomas_dca 0:56ca0aab95fc 313 case 8:
tomas_dca 0:56ca0aab95fc 314 case 9:
tomas_dca 0:56ca0aab95fc 315 case 10:
tomas_dca 0:56ca0aab95fc 316 // close loop
tomas_dca 0:56ca0aab95fc 317 sym_col++;
tomas_dca 0:56ca0aab95fc 318 break;
tomas_dca 0:56ca0aab95fc 319 case 11:
tomas_dca 0:56ca0aab95fc 320 sym_col = 100;
tomas_dca 0:56ca0aab95fc 321 // show score again
tomas_dca 0:56ca0aab95fc 322 break;
tomas_dca 0:56ca0aab95fc 323 default:
tomas_dca 0:56ca0aab95fc 324 // erase old symbol
tomas_dca 0:56ca0aab95fc 325 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 326 // load score
tomas_dca 0:56ca0aab95fc 327 score_cnt_temp = score_cnt;
tomas_dca 0:56ca0aab95fc 328 // init new char;
tomas_dca 0:56ca0aab95fc 329 sym_act = translate(score_cnt_temp % 10);
tomas_dca 0:56ca0aab95fc 330 sym_col = 0;
tomas_dca 0:56ca0aab95fc 331 }
tomas_dca 0:56ca0aab95fc 332
tomas_dca 0:56ca0aab95fc 333 // shift matrix
tomas_dca 0:56ca0aab95fc 334 if((sym_col < 12))
tomas_dca 0:56ca0aab95fc 335 {
tomas_dca 0:56ca0aab95fc 336 for(uint8_t j = 5; j > 0;j--) // rows
tomas_dca 0:56ca0aab95fc 337 {
tomas_dca 0:56ca0aab95fc 338 for(uint8_t i = 0; i < 7;i++) // columns
tomas_dca 0:56ca0aab95fc 339 {
tomas_dca 0:56ca0aab95fc 340 matrix[j][7-i] = matrix[j][6-i];
tomas_dca 0:56ca0aab95fc 341 }
tomas_dca 0:56ca0aab95fc 342 // add new column to matrix
tomas_dca 0:56ca0aab95fc 343 // find actual bit sym_col, assign color
tomas_dca 0:56ca0aab95fc 344 matrix[j][0] = sym_clr * ((((0x1 << sym_col) << (3*j)) & sym_act) > 0);
tomas_dca 0:56ca0aab95fc 345 }
tomas_dca 0:56ca0aab95fc 346 }
tomas_dca 0:56ca0aab95fc 347 }
tomas_dca 0:56ca0aab95fc 348
tomas_dca 0:56ca0aab95fc 349 // buttons
tomas_dca 0:56ca0aab95fc 350 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 351 {
tomas_dca 0:56ca0aab95fc 352 game_state = pause;
tomas_dca 0:56ca0aab95fc 353 color = color_orange;
tomas_dca 0:56ca0aab95fc 354
tomas_dca 0:56ca0aab95fc 355 // reset score show
tomas_dca 0:56ca0aab95fc 356 sym_col = 100;
tomas_dca 0:56ca0aab95fc 357
tomas_dca 0:56ca0aab95fc 358 // RESET LABYRINT
tomas_dca 0:56ca0aab95fc 359 game_state = ready;
tomas_dca 0:56ca0aab95fc 360
tomas_dca 0:56ca0aab95fc 361 time = timer.read_ms() + 200; //debounce
tomas_dca 0:56ca0aab95fc 362 }
tomas_dca 0:56ca0aab95fc 363
tomas_dca 0:56ca0aab95fc 364 break;
tomas_dca 0:56ca0aab95fc 365 }
tomas_dca 0:56ca0aab95fc 366 case pause:
tomas_dca 0:56ca0aab95fc 367 {
tomas_dca 0:56ca0aab95fc 368 // PAUSE
tomas_dca 0:56ca0aab95fc 369
tomas_dca 0:56ca0aab95fc 370 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 371 {
tomas_dca 0:56ca0aab95fc 372 // RESET LABYRINT
tomas_dca 0:56ca0aab95fc 373
tomas_dca 0:56ca0aab95fc 374 color = color_orange;
tomas_dca 0:56ca0aab95fc 375 // prepare matrix for labyrint
tomas_dca 0:56ca0aab95fc 376 prepare_matrix();
tomas_dca 0:56ca0aab95fc 377 wait(0.4f);
tomas_dca 0:56ca0aab95fc 378
tomas_dca 0:56ca0aab95fc 379 // generate new playground
tomas_dca 0:56ca0aab95fc 380 reload_matrix();
tomas_dca 0:56ca0aab95fc 381 wait(0.2f);
tomas_dca 0:56ca0aab95fc 382
tomas_dca 0:56ca0aab95fc 383 color = color_red;
tomas_dca 0:56ca0aab95fc 384
tomas_dca 0:56ca0aab95fc 385 }
tomas_dca 0:56ca0aab95fc 386 else
tomas_dca 0:56ca0aab95fc 387 // RETURN
tomas_dca 0:56ca0aab95fc 388 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 389 {
tomas_dca 0:56ca0aab95fc 390 color = color_green;
tomas_dca 0:56ca0aab95fc 391 if(!learning)
tomas_dca 0:56ca0aab95fc 392 {
tomas_dca 0:56ca0aab95fc 393 game_state = game;
tomas_dca 0:56ca0aab95fc 394
tomas_dca 0:56ca0aab95fc 395 // haaahaaaa :D
tomas_dca 0:56ca0aab95fc 396 score_cnt = 0;
tomas_dca 0:56ca0aab95fc 397 }
tomas_dca 0:56ca0aab95fc 398 else
tomas_dca 0:56ca0aab95fc 399 {
tomas_dca 0:56ca0aab95fc 400 game_state = learn;
tomas_dca 0:56ca0aab95fc 401 }
tomas_dca 0:56ca0aab95fc 402
tomas_dca 0:56ca0aab95fc 403 time = timer.read_ms() + 200; //debounce
tomas_dca 0:56ca0aab95fc 404 }
tomas_dca 0:56ca0aab95fc 405
tomas_dca 0:56ca0aab95fc 406 break;
tomas_dca 0:56ca0aab95fc 407 }
tomas_dca 0:56ca0aab95fc 408 case game:
tomas_dca 0:56ca0aab95fc 409 case learn:
tomas_dca 0:56ca0aab95fc 410 {
tomas_dca 0:56ca0aab95fc 411 // GAME
tomas_dca 0:56ca0aab95fc 412
tomas_dca 0:56ca0aab95fc 413 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 414 {
tomas_dca 0:56ca0aab95fc 415 // rotate block
tomas_dca 0:56ca0aab95fc 416 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 417 rotate_lab(row, column);
tomas_dca 0:56ca0aab95fc 418 }
tomas_dca 0:56ca0aab95fc 419 else
tomas_dca 0:56ca0aab95fc 420 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 421 {
tomas_dca 0:56ca0aab95fc 422 // pause
tomas_dca 0:56ca0aab95fc 423 color = color_red;
tomas_dca 0:56ca0aab95fc 424 game_state = pause;
tomas_dca 0:56ca0aab95fc 425
tomas_dca 0:56ca0aab95fc 426 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 427 // wait for action
tomas_dca 0:56ca0aab95fc 428 // RETURN or RESET
tomas_dca 0:56ca0aab95fc 429 }
tomas_dca 0:56ca0aab95fc 430
tomas_dca 0:56ca0aab95fc 431 break;
tomas_dca 0:56ca0aab95fc 432 }
tomas_dca 0:56ca0aab95fc 433 case ready:
tomas_dca 0:56ca0aab95fc 434 {
tomas_dca 0:56ca0aab95fc 435 // RESET LAB
tomas_dca 0:56ca0aab95fc 436
tomas_dca 0:56ca0aab95fc 437 color = color_orange;
tomas_dca 0:56ca0aab95fc 438
tomas_dca 0:56ca0aab95fc 439 // prepare matrix for labyrint
tomas_dca 0:56ca0aab95fc 440 prepare_matrix();
tomas_dca 0:56ca0aab95fc 441 wait(0.4f);
tomas_dca 0:56ca0aab95fc 442
tomas_dca 0:56ca0aab95fc 443 // generate new playground
tomas_dca 0:56ca0aab95fc 444 reload_matrix();
tomas_dca 0:56ca0aab95fc 445 wait(0.2f);
tomas_dca 0:56ca0aab95fc 446
tomas_dca 0:56ca0aab95fc 447 game_state = pause;
tomas_dca 0:56ca0aab95fc 448
tomas_dca 0:56ca0aab95fc 449 color = color_red;
tomas_dca 0:56ca0aab95fc 450 break;
tomas_dca 0:56ca0aab95fc 451 }
tomas_dca 0:56ca0aab95fc 452 default:
tomas_dca 0:56ca0aab95fc 453 {
tomas_dca 0:56ca0aab95fc 454 // TEST
tomas_dca 0:56ca0aab95fc 455
tomas_dca 0:56ca0aab95fc 456
tomas_dca 0:56ca0aab95fc 457 // arrows
tomas_dca 0:56ca0aab95fc 458
tomas_dca 0:56ca0aab95fc 459 // set new 0 point (offset)
tomas_dca 0:56ca0aab95fc 460 if( BTN_R && !BTN_L && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 461 {
tomas_dca 0:56ca0aab95fc 462 color = color_green;
tomas_dca 0:56ca0aab95fc 463 game_state = save;
tomas_dca 0:56ca0aab95fc 464 wait(0.4f);
tomas_dca 0:56ca0aab95fc 465 game_state = test;
tomas_dca 0:56ca0aab95fc 466 color = color_orange;
tomas_dca 0:56ca0aab95fc 467
tomas_dca 0:56ca0aab95fc 468 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 469 }
tomas_dca 0:56ca0aab95fc 470
tomas_dca 0:56ca0aab95fc 471 if( BTN_L && !BTN_R && (time < timer.read_ms()))
tomas_dca 0:56ca0aab95fc 472 {
tomas_dca 0:56ca0aab95fc 473 // generate new playground
tomas_dca 0:56ca0aab95fc 474 game_state = ready;
tomas_dca 0:56ca0aab95fc 475
tomas_dca 0:56ca0aab95fc 476 time = timer.read_ms() + 200; // debounce
tomas_dca 0:56ca0aab95fc 477 }
tomas_dca 0:56ca0aab95fc 478 }
tomas_dca 0:56ca0aab95fc 479 }
tomas_dca 0:56ca0aab95fc 480 }
tomas_dca 0:56ca0aab95fc 481 }
tomas_dca 0:56ca0aab95fc 482
tomas_dca 0:56ca0aab95fc 483
tomas_dca 0:56ca0aab95fc 484 void accelerometer()
tomas_dca 0:56ca0aab95fc 485 {
tomas_dca 0:56ca0aab95fc 486 // offset
tomas_dca 0:56ca0aab95fc 487 static float xAngle_offset = 0;
tomas_dca 0:56ca0aab95fc 488 static float yAngle_offset = 0;
tomas_dca 0:56ca0aab95fc 489
tomas_dca 0:56ca0aab95fc 490 if((game_state == test) || (game_state == game) || (game_state == save) || (game_state == learn))
tomas_dca 0:56ca0aab95fc 491 {
tomas_dca 0:56ca0aab95fc 492 float ax, ay, az;
tomas_dca 0:56ca0aab95fc 493 float xAngle, yAngle;
tomas_dca 0:56ca0aab95fc 494
tomas_dca 0:56ca0aab95fc 495 ax = acc.getAccX();
tomas_dca 0:56ca0aab95fc 496 ay = acc.getAccY();
tomas_dca 0:56ca0aab95fc 497 az = acc.getAccZ();
tomas_dca 0:56ca0aab95fc 498
tomas_dca 0:56ca0aab95fc 499
tomas_dca 0:56ca0aab95fc 500 xAngle = atan( ax / (sqrt((ay)*(ay) + (az)*(az)))) * 60;
tomas_dca 0:56ca0aab95fc 501 yAngle = atan( ay / (sqrt((ax)*(ax) + (az)*(az)))) * 60;
tomas_dca 0:56ca0aab95fc 502
tomas_dca 0:56ca0aab95fc 503 if(game_state == save)
tomas_dca 0:56ca0aab95fc 504 {
tomas_dca 0:56ca0aab95fc 505 xAngle_offset = xAngle;
tomas_dca 0:56ca0aab95fc 506 yAngle_offset = yAngle;
tomas_dca 0:56ca0aab95fc 507 }
tomas_dca 0:56ca0aab95fc 508 else
tomas_dca 0:56ca0aab95fc 509 {
tomas_dca 0:56ca0aab95fc 510 xAngle -= xAngle_offset;
tomas_dca 0:56ca0aab95fc 511 yAngle -= yAngle_offset;
tomas_dca 0:56ca0aab95fc 512 }
tomas_dca 0:56ca0aab95fc 513
tomas_dca 0:56ca0aab95fc 514 // find maximum
tomas_dca 0:56ca0aab95fc 515 if(abs(xAngle) >= abs(yAngle))
tomas_dca 0:56ca0aab95fc 516 {
tomas_dca 0:56ca0aab95fc 517 if(xAngle >= MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 518 {
tomas_dca 0:56ca0aab95fc 519 // +X
tomas_dca 0:56ca0aab95fc 520 acc_dir = up;
tomas_dca 0:56ca0aab95fc 521 }
tomas_dca 0:56ca0aab95fc 522 else
tomas_dca 0:56ca0aab95fc 523 if(xAngle <= -MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 524 {
tomas_dca 0:56ca0aab95fc 525 // -X
tomas_dca 0:56ca0aab95fc 526 acc_dir = down;
tomas_dca 0:56ca0aab95fc 527 }
tomas_dca 0:56ca0aab95fc 528 else
tomas_dca 0:56ca0aab95fc 529 if(abs(xAngle) <= IDLE_ANGLE)
tomas_dca 0:56ca0aab95fc 530 {
tomas_dca 0:56ca0aab95fc 531 if(game_state == test)
tomas_dca 0:56ca0aab95fc 532 confirm_dir();
tomas_dca 0:56ca0aab95fc 533 else
tomas_dca 0:56ca0aab95fc 534 move_cursor();
tomas_dca 0:56ca0aab95fc 535 }
tomas_dca 0:56ca0aab95fc 536 }
tomas_dca 0:56ca0aab95fc 537 else
tomas_dca 0:56ca0aab95fc 538 {
tomas_dca 0:56ca0aab95fc 539 if(yAngle >= MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 540 {
tomas_dca 0:56ca0aab95fc 541 // +Y
tomas_dca 0:56ca0aab95fc 542 acc_dir = left;
tomas_dca 0:56ca0aab95fc 543 }
tomas_dca 0:56ca0aab95fc 544 else
tomas_dca 0:56ca0aab95fc 545 if(yAngle <= -MOVE_ANGLE)
tomas_dca 0:56ca0aab95fc 546 {
tomas_dca 0:56ca0aab95fc 547 // -Y
tomas_dca 0:56ca0aab95fc 548 acc_dir = right;
tomas_dca 0:56ca0aab95fc 549 }
tomas_dca 0:56ca0aab95fc 550 else
tomas_dca 0:56ca0aab95fc 551 if(abs(yAngle) <= IDLE_ANGLE)
tomas_dca 0:56ca0aab95fc 552 {
tomas_dca 0:56ca0aab95fc 553 if(game_state == test)
tomas_dca 0:56ca0aab95fc 554 confirm_dir();
tomas_dca 0:56ca0aab95fc 555 else
tomas_dca 0:56ca0aab95fc 556 move_cursor();
tomas_dca 0:56ca0aab95fc 557 }
tomas_dca 0:56ca0aab95fc 558
tomas_dca 0:56ca0aab95fc 559 }
tomas_dca 0:56ca0aab95fc 560
tomas_dca 0:56ca0aab95fc 561 if(acc_dir != idle)
tomas_dca 0:56ca0aab95fc 562 {
tomas_dca 0:56ca0aab95fc 563 if(game_state == test)
tomas_dca 0:56ca0aab95fc 564 {
tomas_dca 0:56ca0aab95fc 565 fill_matrix(template_arrow, led_ant);
tomas_dca 0:56ca0aab95fc 566
tomas_dca 0:56ca0aab95fc 567
tomas_dca 0:56ca0aab95fc 568 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 569 {
tomas_dca 0:56ca0aab95fc 570 case down:
tomas_dca 0:56ca0aab95fc 571 rotate_matrix();
tomas_dca 0:56ca0aab95fc 572 case right:
tomas_dca 0:56ca0aab95fc 573 rotate_matrix();
tomas_dca 0:56ca0aab95fc 574 case up:
tomas_dca 0:56ca0aab95fc 575 rotate_matrix();
tomas_dca 0:56ca0aab95fc 576 case left:
tomas_dca 0:56ca0aab95fc 577 break;
tomas_dca 0:56ca0aab95fc 578 default:
tomas_dca 0:56ca0aab95fc 579 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 580 }
tomas_dca 0:56ca0aab95fc 581 }
tomas_dca 0:56ca0aab95fc 582 }
tomas_dca 0:56ca0aab95fc 583 }
tomas_dca 0:56ca0aab95fc 584 }
tomas_dca 0:56ca0aab95fc 585
tomas_dca 0:56ca0aab95fc 586 void move_cursor(void)
tomas_dca 0:56ca0aab95fc 587 {
tomas_dca 0:56ca0aab95fc 588 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 589 {
tomas_dca 0:56ca0aab95fc 590 case up:
tomas_dca 0:56ca0aab95fc 591 if(row == 6)
tomas_dca 0:56ca0aab95fc 592 row = 0;
tomas_dca 0:56ca0aab95fc 593 else
tomas_dca 0:56ca0aab95fc 594 row +=2;
tomas_dca 0:56ca0aab95fc 595 break;
tomas_dca 0:56ca0aab95fc 596 case right:
tomas_dca 0:56ca0aab95fc 597 if(column == 6)
tomas_dca 0:56ca0aab95fc 598 column = 0;
tomas_dca 0:56ca0aab95fc 599 else
tomas_dca 0:56ca0aab95fc 600 column +=2;
tomas_dca 0:56ca0aab95fc 601 break;
tomas_dca 0:56ca0aab95fc 602 case down:
tomas_dca 0:56ca0aab95fc 603 if(row == 0)
tomas_dca 0:56ca0aab95fc 604 row = 6;
tomas_dca 0:56ca0aab95fc 605 else
tomas_dca 0:56ca0aab95fc 606 row -=2;
tomas_dca 0:56ca0aab95fc 607 break;
tomas_dca 0:56ca0aab95fc 608 case left:
tomas_dca 0:56ca0aab95fc 609 if(column == 0)
tomas_dca 0:56ca0aab95fc 610 column = 6;
tomas_dca 0:56ca0aab95fc 611 else
tomas_dca 0:56ca0aab95fc 612 column -=2;
tomas_dca 0:56ca0aab95fc 613 break;
tomas_dca 0:56ca0aab95fc 614 default:
tomas_dca 0:56ca0aab95fc 615 break;
tomas_dca 0:56ca0aab95fc 616 }
tomas_dca 0:56ca0aab95fc 617 acc_dir = idle;
tomas_dca 0:56ca0aab95fc 618 }
tomas_dca 0:56ca0aab95fc 619
tomas_dca 0:56ca0aab95fc 620 void confirm_dir(void)
tomas_dca 0:56ca0aab95fc 621 {
tomas_dca 0:56ca0aab95fc 622 fill_matrix(template_arrow, led_lab);
tomas_dca 0:56ca0aab95fc 623
tomas_dca 0:56ca0aab95fc 624 switch(acc_dir)
tomas_dca 0:56ca0aab95fc 625 {
tomas_dca 0:56ca0aab95fc 626 case down:
tomas_dca 0:56ca0aab95fc 627 rotate_matrix();
tomas_dca 0:56ca0aab95fc 628 case right:
tomas_dca 0:56ca0aab95fc 629 rotate_matrix();
tomas_dca 0:56ca0aab95fc 630 case up:
tomas_dca 0:56ca0aab95fc 631 rotate_matrix();
tomas_dca 0:56ca0aab95fc 632 case left:
tomas_dca 0:56ca0aab95fc 633 break;
tomas_dca 0:56ca0aab95fc 634 default:
tomas_dca 0:56ca0aab95fc 635 fill_matrix(template_fill, led_free);
tomas_dca 0:56ca0aab95fc 636 }
tomas_dca 0:56ca0aab95fc 637 acc_dir = idle;
tomas_dca 0:56ca0aab95fc 638 }
tomas_dca 0:56ca0aab95fc 639
tomas_dca 0:56ca0aab95fc 640 void show_matrix(void)
tomas_dca 0:56ca0aab95fc 641 {
tomas_dca 0:56ca0aab95fc 642 // labyrint block selection
tomas_dca 0:56ca0aab95fc 643 static uint8_t mask = 0; // on/off -> blink
tomas_dca 0:56ca0aab95fc 644
tomas_dca 0:56ca0aab95fc 645 mask++;
tomas_dca 0:56ca0aab95fc 646
tomas_dca 0:56ca0aab95fc 647 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 648 {
tomas_dca 0:56ca0aab95fc 649 ROW0 = 0x0001 & j;
tomas_dca 0:56ca0aab95fc 650 ROW1 = 0x0002 & j;
tomas_dca 0:56ca0aab95fc 651 ROW2 = 0x0004 & j;
tomas_dca 0:56ca0aab95fc 652
tomas_dca 0:56ca0aab95fc 653 COLG0 = ~matrix[j][0] & led_lab;
tomas_dca 0:56ca0aab95fc 654 COLG1 = ~matrix[j][1] & led_lab;
tomas_dca 0:56ca0aab95fc 655 COLG2 = ~matrix[j][2] & led_lab;
tomas_dca 0:56ca0aab95fc 656 COLG3 = ~matrix[j][3] & led_lab;
tomas_dca 0:56ca0aab95fc 657 COLG4 = ~matrix[j][4] & led_lab;
tomas_dca 0:56ca0aab95fc 658 COLG5 = ~matrix[j][5] & led_lab;
tomas_dca 0:56ca0aab95fc 659 COLG6 = ~matrix[j][6] & led_lab;
tomas_dca 0:56ca0aab95fc 660 COLG7 = ~matrix[j][7] & led_lab;
tomas_dca 0:56ca0aab95fc 661
tomas_dca 0:56ca0aab95fc 662 COLR0 = ~matrix[j][0] & led_ant;
tomas_dca 0:56ca0aab95fc 663 COLR1 = ~matrix[j][1] & led_ant;
tomas_dca 0:56ca0aab95fc 664 COLR2 = ~matrix[j][2] & led_ant;
tomas_dca 0:56ca0aab95fc 665 COLR3 = ~matrix[j][3] & led_ant;
tomas_dca 0:56ca0aab95fc 666 COLR4 = ~matrix[j][4] & led_ant;
tomas_dca 0:56ca0aab95fc 667 COLR5 = ~matrix[j][5] & led_ant;
tomas_dca 0:56ca0aab95fc 668 COLR6 = ~matrix[j][6] & led_ant;
tomas_dca 0:56ca0aab95fc 669 COLR7 = ~matrix[j][7] & led_ant;
tomas_dca 0:56ca0aab95fc 670
tomas_dca 0:56ca0aab95fc 671
tomas_dca 0:56ca0aab95fc 672 // blik cursor (block)
tomas_dca 0:56ca0aab95fc 673 if(((row == j) || ((row+1) == j)) && ((mask % 0x17) < 0xD) && ((game_state == game || (game_state == learn))))
tomas_dca 0:56ca0aab95fc 674 {
tomas_dca 0:56ca0aab95fc 675 switch(column)
tomas_dca 0:56ca0aab95fc 676 {
tomas_dca 0:56ca0aab95fc 677 case 0:
tomas_dca 0:56ca0aab95fc 678 COLG0 = ~led_free;
tomas_dca 0:56ca0aab95fc 679 COLR0 = ~led_free;
tomas_dca 0:56ca0aab95fc 680 COLG1 = ~led_free;
tomas_dca 0:56ca0aab95fc 681 COLR1 = ~led_free;
tomas_dca 0:56ca0aab95fc 682 break;
tomas_dca 0:56ca0aab95fc 683 case 2:
tomas_dca 0:56ca0aab95fc 684 COLG2 = ~led_free;
tomas_dca 0:56ca0aab95fc 685 COLR2 = ~led_free;
tomas_dca 0:56ca0aab95fc 686 COLG3 = ~led_free;
tomas_dca 0:56ca0aab95fc 687 COLR3 = ~led_free;
tomas_dca 0:56ca0aab95fc 688 break;
tomas_dca 0:56ca0aab95fc 689 case 4:
tomas_dca 0:56ca0aab95fc 690 COLG4 = ~led_free;
tomas_dca 0:56ca0aab95fc 691 COLR4 = ~led_free;
tomas_dca 0:56ca0aab95fc 692 COLG5 = ~led_free;
tomas_dca 0:56ca0aab95fc 693 COLR5 = ~led_free;
tomas_dca 0:56ca0aab95fc 694 break;
tomas_dca 0:56ca0aab95fc 695 case 6:
tomas_dca 0:56ca0aab95fc 696 COLG6 = ~led_free;
tomas_dca 0:56ca0aab95fc 697 COLR6 = ~led_free;
tomas_dca 0:56ca0aab95fc 698 COLG7 = ~led_free;
tomas_dca 0:56ca0aab95fc 699 COLR7 = ~led_free;
tomas_dca 0:56ca0aab95fc 700 break;
tomas_dca 0:56ca0aab95fc 701 default:
tomas_dca 0:56ca0aab95fc 702 break;
tomas_dca 0:56ca0aab95fc 703 }
tomas_dca 0:56ca0aab95fc 704 }
tomas_dca 0:56ca0aab95fc 705
tomas_dca 0:56ca0aab95fc 706 wait(brightness);
tomas_dca 0:56ca0aab95fc 707
tomas_dca 0:56ca0aab95fc 708 COLG0 = ~led_free;
tomas_dca 0:56ca0aab95fc 709 COLG1 = ~led_free;
tomas_dca 0:56ca0aab95fc 710 COLG2 = ~led_free;
tomas_dca 0:56ca0aab95fc 711 COLG3 = ~led_free;
tomas_dca 0:56ca0aab95fc 712 COLG4 = ~led_free;
tomas_dca 0:56ca0aab95fc 713 COLG5 = ~led_free;
tomas_dca 0:56ca0aab95fc 714 COLG6 = ~led_free;
tomas_dca 0:56ca0aab95fc 715 COLG7 = ~led_free;
tomas_dca 0:56ca0aab95fc 716
tomas_dca 0:56ca0aab95fc 717 COLR0 = ~led_free;
tomas_dca 0:56ca0aab95fc 718 COLR1 = ~led_free;
tomas_dca 0:56ca0aab95fc 719 COLR2 = ~led_free;
tomas_dca 0:56ca0aab95fc 720 COLR3 = ~led_free;
tomas_dca 0:56ca0aab95fc 721 COLR4 = ~led_free;
tomas_dca 0:56ca0aab95fc 722 COLR5 = ~led_free;
tomas_dca 0:56ca0aab95fc 723 COLR6 = ~led_free;
tomas_dca 0:56ca0aab95fc 724 COLR7 = ~led_free;
tomas_dca 0:56ca0aab95fc 725 }
tomas_dca 0:56ca0aab95fc 726 }
tomas_dca 0:56ca0aab95fc 727
tomas_dca 0:56ca0aab95fc 728 void fill_matrix(uint64_t temp, uint8_t color)
tomas_dca 0:56ca0aab95fc 729 {
tomas_dca 0:56ca0aab95fc 730 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 731 {
tomas_dca 0:56ca0aab95fc 732 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 733 {
tomas_dca 0:56ca0aab95fc 734 matrix[j][i] = color * ( 0 < (temp & (0x8000000000000000>>((8*j)+i)))); // print template to the matrix
tomas_dca 0:56ca0aab95fc 735 }
tomas_dca 0:56ca0aab95fc 736 }
tomas_dca 0:56ca0aab95fc 737 }
tomas_dca 0:56ca0aab95fc 738
tomas_dca 0:56ca0aab95fc 739 void rotate_matrix(void)
tomas_dca 0:56ca0aab95fc 740 {
tomas_dca 0:56ca0aab95fc 741 uint8_t temp[8][8];
tomas_dca 0:56ca0aab95fc 742
tomas_dca 0:56ca0aab95fc 743 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 744 {
tomas_dca 0:56ca0aab95fc 745 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 746 {
tomas_dca 0:56ca0aab95fc 747 temp[7-i][j] = matrix[j][i];
tomas_dca 0:56ca0aab95fc 748 }
tomas_dca 0:56ca0aab95fc 749 }
tomas_dca 0:56ca0aab95fc 750
tomas_dca 0:56ca0aab95fc 751 for(uint8_t j = 0; j < 8;j++)
tomas_dca 0:56ca0aab95fc 752 {
tomas_dca 0:56ca0aab95fc 753 for(uint8_t i = 0; i < 8;i++)
tomas_dca 0:56ca0aab95fc 754 {
tomas_dca 0:56ca0aab95fc 755 matrix[j][i] = temp[j][i];
tomas_dca 0:56ca0aab95fc 756 }
tomas_dca 0:56ca0aab95fc 757 }
tomas_dca 0:56ca0aab95fc 758 }
tomas_dca 0:56ca0aab95fc 759
tomas_dca 0:56ca0aab95fc 760 void rotate_lab(uint8_t lab_row, uint8_t lab_col)
tomas_dca 0:56ca0aab95fc 761 {
tomas_dca 0:56ca0aab95fc 762 // if block is labyrint only
tomas_dca 0:56ca0aab95fc 763 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 764 {
tomas_dca 0:56ca0aab95fc 765 uint8_t temp;
tomas_dca 0:56ca0aab95fc 766
tomas_dca 0:56ca0aab95fc 767 temp = matrix[lab_row][lab_col];
tomas_dca 0:56ca0aab95fc 768 matrix[lab_row][lab_col] = matrix[lab_row][lab_col+1];
tomas_dca 0:56ca0aab95fc 769 matrix[lab_row][lab_col+1] = matrix[lab_row+1][lab_col+1];
tomas_dca 0:56ca0aab95fc 770 matrix[lab_row+1][lab_col+1] = matrix[lab_row+1][lab_col];
tomas_dca 0:56ca0aab95fc 771 matrix[lab_row+1][lab_col] = temp;
tomas_dca 0:56ca0aab95fc 772
tomas_dca 0:56ca0aab95fc 773 // change block type (because of turn clockwise and Anticlockwise too)
tomas_dca 0:56ca0aab95fc 774 if(matrix[lab_row][lab_col+1] == led_lab)
tomas_dca 0:56ca0aab95fc 775 {
tomas_dca 0:56ca0aab95fc 776 if((matrix[lab_row][lab_col] == led_lab) && (matrix[lab_row+1][lab_col] == led_lab))
tomas_dca 0:56ca0aab95fc 777 {
tomas_dca 0:56ca0aab95fc 778 matrix[lab_row][lab_col] = led_free;
tomas_dca 0:56ca0aab95fc 779 matrix[lab_row][lab_col+1] = led_lab;
tomas_dca 0:56ca0aab95fc 780 matrix[lab_row+1][lab_col+1] = led_free;
tomas_dca 0:56ca0aab95fc 781 matrix[lab_row+1][lab_col] = led_free;
tomas_dca 0:56ca0aab95fc 782 }
tomas_dca 0:56ca0aab95fc 783 else
tomas_dca 0:56ca0aab95fc 784 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 785 {
tomas_dca 0:56ca0aab95fc 786 matrix[lab_row][lab_col] = led_lab;
tomas_dca 0:56ca0aab95fc 787 matrix[lab_row+1][lab_col] = led_lab;
tomas_dca 0:56ca0aab95fc 788 matrix[lab_row+1][lab_col+1] = led_free;
tomas_dca 0:56ca0aab95fc 789 }
tomas_dca 0:56ca0aab95fc 790 }
tomas_dca 0:56ca0aab95fc 791
tomas_dca 0:56ca0aab95fc 792 }
tomas_dca 0:56ca0aab95fc 793 }
tomas_dca 0:56ca0aab95fc 794
tomas_dca 0:56ca0aab95fc 795 void prepare_matrix(void)
tomas_dca 0:56ca0aab95fc 796 {
tomas_dca 0:56ca0aab95fc 797 // only used blocks are re-generate
tomas_dca 0:56ca0aab95fc 798 fill_matrix(template_fill, led_used);
tomas_dca 0:56ca0aab95fc 799
tomas_dca 0:56ca0aab95fc 800 // reset counter
tomas_dca 0:56ca0aab95fc 801 if(game_state != game)
tomas_dca 0:56ca0aab95fc 802 score_cnt = 0;
tomas_dca 0:56ca0aab95fc 803
tomas_dca 0:56ca0aab95fc 804 // start marker position
tomas_dca 0:56ca0aab95fc 805 row = 2;
tomas_dca 0:56ca0aab95fc 806 column = 2;
tomas_dca 0:56ca0aab95fc 807
tomas_dca 0:56ca0aab95fc 808 // start symbol (home)
tomas_dca 0:56ca0aab95fc 809 matrix[4][2] = led_free;
tomas_dca 0:56ca0aab95fc 810 matrix[5][2] = led_free;
tomas_dca 0:56ca0aab95fc 811 matrix[4][3] = led_lab;
tomas_dca 0:56ca0aab95fc 812 matrix[5][3] = led_ant;
tomas_dca 0:56ca0aab95fc 813
tomas_dca 0:56ca0aab95fc 814 // start ant position
tomas_dca 0:56ca0aab95fc 815 ant_row = 5;
tomas_dca 0:56ca0aab95fc 816 ant_column = 3;
tomas_dca 0:56ca0aab95fc 817
tomas_dca 0:56ca0aab95fc 818 // new direction
tomas_dca 0:56ca0aab95fc 819 ant_dir = down;
tomas_dca 0:56ca0aab95fc 820 }
tomas_dca 0:56ca0aab95fc 821
tomas_dca 0:56ca0aab95fc 822 void reload_matrix(void)
tomas_dca 0:56ca0aab95fc 823 {
tomas_dca 0:56ca0aab95fc 824 for(uint8_t j = 0; j < 4;j++)
tomas_dca 0:56ca0aab95fc 825 {
tomas_dca 0:56ca0aab95fc 826 for(uint8_t i = 0; i < 4;i++)
tomas_dca 0:56ca0aab95fc 827 {
tomas_dca 0:56ca0aab95fc 828 int8_t block;
tomas_dca 0:56ca0aab95fc 829 int8_t shift;
tomas_dca 0:56ca0aab95fc 830
tomas_dca 0:56ca0aab95fc 831 // if labyrint part == used => generate new part
tomas_dca 0:56ca0aab95fc 832 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 833 {
tomas_dca 0:56ca0aab95fc 834 switch( rand() % 3 )
tomas_dca 0:56ca0aab95fc 835 {
tomas_dca 0:56ca0aab95fc 836 case 0:
tomas_dca 0:56ca0aab95fc 837 block = lab_turn_big;
tomas_dca 0:56ca0aab95fc 838 break;
tomas_dca 0:56ca0aab95fc 839 case 1:
tomas_dca 0:56ca0aab95fc 840 block = lab_turn_small;
tomas_dca 0:56ca0aab95fc 841 break;
tomas_dca 0:56ca0aab95fc 842 case 2:
tomas_dca 0:56ca0aab95fc 843 block = lab_straight;
tomas_dca 0:56ca0aab95fc 844 break;
tomas_dca 0:56ca0aab95fc 845 default:
tomas_dca 0:56ca0aab95fc 846 block = 0x0f;
tomas_dca 0:56ca0aab95fc 847 }
tomas_dca 0:56ca0aab95fc 848
tomas_dca 0:56ca0aab95fc 849 shift = rand() % 4;
tomas_dca 0:56ca0aab95fc 850 matrix[2*j][2*i] = led_lab * ( 1 & block >> (shift % 4)); // 0
tomas_dca 0:56ca0aab95fc 851 matrix[2*j][(2*i)+1] = led_lab * ( 1 & (block >> (++shift % 4))); // 1
tomas_dca 0:56ca0aab95fc 852 matrix[(2*j)+1][2*i] = led_lab * ( 1 & (block >> (++shift % 4))); // 2
tomas_dca 0:56ca0aab95fc 853 matrix[(2*j)+1][(2*i)+1] = led_lab * ( 1 & (block >> (++shift % 4))); // 3
tomas_dca 0:56ca0aab95fc 854
tomas_dca 0:56ca0aab95fc 855 // one block == one point
tomas_dca 0:56ca0aab95fc 856 if(game_state == game)
tomas_dca 0:56ca0aab95fc 857 score_cnt++;
tomas_dca 0:56ca0aab95fc 858 }
tomas_dca 0:56ca0aab95fc 859 }
tomas_dca 0:56ca0aab95fc 860 }
tomas_dca 0:56ca0aab95fc 861 }
tomas_dca 0:56ca0aab95fc 862
tomas_dca 0:56ca0aab95fc 863 void ant_move(void)
tomas_dca 0:56ca0aab95fc 864 {
tomas_dca 0:56ca0aab95fc 865 // ant_dir
tomas_dca 0:56ca0aab95fc 866 // enum left(1), up(2), right(3), down(4)
tomas_dca 0:56ca0aab95fc 867
tomas_dca 0:56ca0aab95fc 868
tomas_dca 0:56ca0aab95fc 869 if((game_state == game) || (game_state == learn))
tomas_dca 0:56ca0aab95fc 870 {
tomas_dca 0:56ca0aab95fc 871
tomas_dca 0:56ca0aab95fc 872 // old pixel
tomas_dca 0:56ca0aab95fc 873 matrix[ant_row][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 874
tomas_dca 0:56ca0aab95fc 875 // find new pixel
tomas_dca 0:56ca0aab95fc 876 if((ant_dir % 2) == 0)
tomas_dca 0:56ca0aab95fc 877 {
tomas_dca 0:56ca0aab95fc 878 // up, down
tomas_dca 0:56ca0aab95fc 879 if(((ant_row + (ant_dir == down)) % 2) == 0)
tomas_dca 0:56ca0aab95fc 880 {
tomas_dca 0:56ca0aab95fc 881 // 1. type move
tomas_dca 0:56ca0aab95fc 882 /* | str in */ if(matrix[ant_row + 1 - (2 * (ant_dir == down))][ant_column] == led_lab)
tomas_dca 0:56ca0aab95fc 883 {
tomas_dca 0:56ca0aab95fc 884 // go straight (in block)
tomas_dca 0:56ca0aab95fc 885 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 886 ant_row += 1 - (2 * (ant_dir == down));
tomas_dca 0:56ca0aab95fc 887 }
tomas_dca 0:56ca0aab95fc 888 else
tomas_dca 0:56ca0aab95fc 889 {
tomas_dca 0:56ca0aab95fc 890 /* | 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 891 {
tomas_dca 0:56ca0aab95fc 892 // mark used block
tomas_dca 0:56ca0aab95fc 893 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 894 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 895 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 896
tomas_dca 0:56ca0aab95fc 897 if((ant_column % 2) == 0)
tomas_dca 0:56ca0aab95fc 898 {
tomas_dca 0:56ca0aab95fc 899 ant_dir = left;
tomas_dca 0:56ca0aab95fc 900 }
tomas_dca 0:56ca0aab95fc 901 else
tomas_dca 0:56ca0aab95fc 902 {
tomas_dca 0:56ca0aab95fc 903 ant_dir = right;
tomas_dca 0:56ca0aab95fc 904 }
tomas_dca 0:56ca0aab95fc 905
tomas_dca 0:56ca0aab95fc 906 // turn (out block)
tomas_dca 0:56ca0aab95fc 907 ant_column += -1 + (2 * (ant_column % 2));
tomas_dca 0:56ca0aab95fc 908 }
tomas_dca 0:56ca0aab95fc 909 else
tomas_dca 0:56ca0aab95fc 910 // reload matrix
tomas_dca 0:56ca0aab95fc 911 if((ant_column == 7) || (ant_column == 0))
tomas_dca 0:56ca0aab95fc 912 {
tomas_dca 0:56ca0aab95fc 913 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 914 {
tomas_dca 0:56ca0aab95fc 915 // mark used block
tomas_dca 0:56ca0aab95fc 916 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 917 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 918 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 919
tomas_dca 0:56ca0aab95fc 920 reload_matrix();
tomas_dca 0:56ca0aab95fc 921
tomas_dca 0:56ca0aab95fc 922 if(ant_column == 0)
tomas_dca 0:56ca0aab95fc 923 {
tomas_dca 0:56ca0aab95fc 924 ant_column = 7;
tomas_dca 0:56ca0aab95fc 925 ant_dir = left;
tomas_dca 0:56ca0aab95fc 926 }
tomas_dca 0:56ca0aab95fc 927 else
tomas_dca 0:56ca0aab95fc 928 {
tomas_dca 0:56ca0aab95fc 929 ant_column = 0;
tomas_dca 0:56ca0aab95fc 930 ant_dir = right;
tomas_dca 0:56ca0aab95fc 931 }
tomas_dca 0:56ca0aab95fc 932 }
tomas_dca 0:56ca0aab95fc 933 else
tomas_dca 0:56ca0aab95fc 934 {
tomas_dca 0:56ca0aab95fc 935 // GAME OVER
tomas_dca 0:56ca0aab95fc 936 if(game_state == game)
tomas_dca 0:56ca0aab95fc 937 game_state = score;
tomas_dca 0:56ca0aab95fc 938 }
tomas_dca 0:56ca0aab95fc 939 }
tomas_dca 0:56ca0aab95fc 940 else
tomas_dca 0:56ca0aab95fc 941 {
tomas_dca 0:56ca0aab95fc 942 // GAME OVER
tomas_dca 0:56ca0aab95fc 943 if(game_state == game)
tomas_dca 0:56ca0aab95fc 944 game_state = score;
tomas_dca 0:56ca0aab95fc 945 }
tomas_dca 0:56ca0aab95fc 946 }
tomas_dca 0:56ca0aab95fc 947 }
tomas_dca 0:56ca0aab95fc 948 else
tomas_dca 0:56ca0aab95fc 949 if(((ant_row + (ant_dir == down)) % 2) == 1)
tomas_dca 0:56ca0aab95fc 950 {
tomas_dca 0:56ca0aab95fc 951 // 2. type move
tomas_dca 0:56ca0aab95fc 952 /* | turn in */ if(matrix[ant_row][ant_column + 1 - (2 * (ant_column % 2))] == led_lab)
tomas_dca 0:56ca0aab95fc 953 {
tomas_dca 0:56ca0aab95fc 954 if((ant_column % 2) == 0)
tomas_dca 0:56ca0aab95fc 955 {
tomas_dca 0:56ca0aab95fc 956 ant_dir = right;
tomas_dca 0:56ca0aab95fc 957 }
tomas_dca 0:56ca0aab95fc 958 else
tomas_dca 0:56ca0aab95fc 959 {
tomas_dca 0:56ca0aab95fc 960 ant_dir = left;
tomas_dca 0:56ca0aab95fc 961 }
tomas_dca 0:56ca0aab95fc 962
tomas_dca 0:56ca0aab95fc 963 // turn (in block)
tomas_dca 0:56ca0aab95fc 964 ant_column += 1 - (2 * (ant_column % 2));
tomas_dca 0:56ca0aab95fc 965
tomas_dca 0:56ca0aab95fc 966 }
tomas_dca 0:56ca0aab95fc 967 else
tomas_dca 0:56ca0aab95fc 968 {
tomas_dca 0:56ca0aab95fc 969 // go straight (out block)
tomas_dca 0:56ca0aab95fc 970 /* | str out */
tomas_dca 0:56ca0aab95fc 971 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 972 {
tomas_dca 0:56ca0aab95fc 973 // mark used block
tomas_dca 0:56ca0aab95fc 974 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 975 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 976 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 977
tomas_dca 0:56ca0aab95fc 978 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 979 ant_row += 1 - (2 * (ant_dir == down));
tomas_dca 0:56ca0aab95fc 980 }
tomas_dca 0:56ca0aab95fc 981 else
tomas_dca 0:56ca0aab95fc 982 // reload matrix
tomas_dca 0:56ca0aab95fc 983 if((ant_row == 7) || (ant_row == 0))
tomas_dca 0:56ca0aab95fc 984 {
tomas_dca 0:56ca0aab95fc 985 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 986 {
tomas_dca 0:56ca0aab95fc 987 // mark used block
tomas_dca 0:56ca0aab95fc 988 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 989 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 990 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 991
tomas_dca 0:56ca0aab95fc 992 reload_matrix();
tomas_dca 0:56ca0aab95fc 993
tomas_dca 0:56ca0aab95fc 994 if(ant_dir == down)
tomas_dca 0:56ca0aab95fc 995 ant_row = 7;
tomas_dca 0:56ca0aab95fc 996 else
tomas_dca 0:56ca0aab95fc 997 ant_row = 0;
tomas_dca 0:56ca0aab95fc 998 }
tomas_dca 0:56ca0aab95fc 999 else
tomas_dca 0:56ca0aab95fc 1000 {
tomas_dca 0:56ca0aab95fc 1001 // GAME OVER
tomas_dca 0:56ca0aab95fc 1002 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1003 game_state = score;
tomas_dca 0:56ca0aab95fc 1004 }
tomas_dca 0:56ca0aab95fc 1005 }
tomas_dca 0:56ca0aab95fc 1006 else
tomas_dca 0:56ca0aab95fc 1007 {
tomas_dca 0:56ca0aab95fc 1008 // GAME OVER
tomas_dca 0:56ca0aab95fc 1009 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1010 game_state = score;
tomas_dca 0:56ca0aab95fc 1011 }
tomas_dca 0:56ca0aab95fc 1012 }
tomas_dca 0:56ca0aab95fc 1013 }
tomas_dca 0:56ca0aab95fc 1014
tomas_dca 0:56ca0aab95fc 1015 }
tomas_dca 0:56ca0aab95fc 1016 // right, left
tomas_dca 0:56ca0aab95fc 1017 else
tomas_dca 0:56ca0aab95fc 1018 {
tomas_dca 0:56ca0aab95fc 1019 if(((ant_column + (ant_dir == right)) % 2) == 1)
tomas_dca 0:56ca0aab95fc 1020 {
tomas_dca 0:56ca0aab95fc 1021 // 1. type move
tomas_dca 0:56ca0aab95fc 1022 /* - str in */
tomas_dca 0:56ca0aab95fc 1023 if(matrix[ant_row][ant_column - 1 + (2 * ( ant_dir == right))] == led_lab )
tomas_dca 0:56ca0aab95fc 1024 {
tomas_dca 0:56ca0aab95fc 1025 // go straight (in block)
tomas_dca 0:56ca0aab95fc 1026 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 1027 ant_column += - 1 + (2 * ( ant_dir == right));
tomas_dca 0:56ca0aab95fc 1028
tomas_dca 0:56ca0aab95fc 1029 }
tomas_dca 0:56ca0aab95fc 1030 else
tomas_dca 0:56ca0aab95fc 1031 /* - turn out */
tomas_dca 0:56ca0aab95fc 1032 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 1033 {
tomas_dca 0:56ca0aab95fc 1034 // mark used block
tomas_dca 0:56ca0aab95fc 1035 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1036 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1037 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1038
tomas_dca 0:56ca0aab95fc 1039 if((ant_row % 2) == 0)
tomas_dca 0:56ca0aab95fc 1040 {
tomas_dca 0:56ca0aab95fc 1041 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1042 }
tomas_dca 0:56ca0aab95fc 1043 else
tomas_dca 0:56ca0aab95fc 1044 {
tomas_dca 0:56ca0aab95fc 1045 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1046 }
tomas_dca 0:56ca0aab95fc 1047
tomas_dca 0:56ca0aab95fc 1048 // turn (out block)
tomas_dca 0:56ca0aab95fc 1049 ant_row += -1 + (2 * (ant_row % 2));
tomas_dca 0:56ca0aab95fc 1050
tomas_dca 0:56ca0aab95fc 1051 }
tomas_dca 0:56ca0aab95fc 1052 else
tomas_dca 0:56ca0aab95fc 1053 // reload matrix
tomas_dca 0:56ca0aab95fc 1054 if((ant_row == 7) || (ant_row == 0))
tomas_dca 0:56ca0aab95fc 1055 {
tomas_dca 0:56ca0aab95fc 1056 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 1057 {
tomas_dca 0:56ca0aab95fc 1058 // mark used block
tomas_dca 0:56ca0aab95fc 1059 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1060 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1061 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1062
tomas_dca 0:56ca0aab95fc 1063 reload_matrix();
tomas_dca 0:56ca0aab95fc 1064
tomas_dca 0:56ca0aab95fc 1065 if(ant_row == 0)
tomas_dca 0:56ca0aab95fc 1066 {
tomas_dca 0:56ca0aab95fc 1067 ant_row = 7;
tomas_dca 0:56ca0aab95fc 1068 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1069 }
tomas_dca 0:56ca0aab95fc 1070 else
tomas_dca 0:56ca0aab95fc 1071 {
tomas_dca 0:56ca0aab95fc 1072 ant_row = 0;
tomas_dca 0:56ca0aab95fc 1073 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1074 }
tomas_dca 0:56ca0aab95fc 1075 }
tomas_dca 0:56ca0aab95fc 1076 else
tomas_dca 0:56ca0aab95fc 1077 {
tomas_dca 0:56ca0aab95fc 1078 // GAME OVER
tomas_dca 0:56ca0aab95fc 1079 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1080 game_state = score;
tomas_dca 0:56ca0aab95fc 1081 }
tomas_dca 0:56ca0aab95fc 1082 }
tomas_dca 0:56ca0aab95fc 1083 else
tomas_dca 0:56ca0aab95fc 1084 {
tomas_dca 0:56ca0aab95fc 1085 // GAME OVER
tomas_dca 0:56ca0aab95fc 1086 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1087 game_state = score;
tomas_dca 0:56ca0aab95fc 1088 }
tomas_dca 0:56ca0aab95fc 1089 }
tomas_dca 0:56ca0aab95fc 1090 else
tomas_dca 0:56ca0aab95fc 1091 {
tomas_dca 0:56ca0aab95fc 1092 // 2. type move
tomas_dca 0:56ca0aab95fc 1093 /* - turn in */ if(matrix[ant_row + 1 - (2 * (ant_dir == right))][ant_column] == led_lab)
tomas_dca 0:56ca0aab95fc 1094 {
tomas_dca 0:56ca0aab95fc 1095 if((ant_row % 2) == 0)
tomas_dca 0:56ca0aab95fc 1096 {
tomas_dca 0:56ca0aab95fc 1097 ant_dir = up;
tomas_dca 0:56ca0aab95fc 1098 }
tomas_dca 0:56ca0aab95fc 1099 else
tomas_dca 0:56ca0aab95fc 1100 {
tomas_dca 0:56ca0aab95fc 1101 ant_dir = down;
tomas_dca 0:56ca0aab95fc 1102 }
tomas_dca 0:56ca0aab95fc 1103
tomas_dca 0:56ca0aab95fc 1104 // turn (in block)
tomas_dca 0:56ca0aab95fc 1105 ant_row += 1 - (2 * (ant_row % 2));
tomas_dca 0:56ca0aab95fc 1106 }
tomas_dca 0:56ca0aab95fc 1107 /* - str out */
tomas_dca 0:56ca0aab95fc 1108 else
tomas_dca 0:56ca0aab95fc 1109 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 1110 {
tomas_dca 0:56ca0aab95fc 1111 // mark used block
tomas_dca 0:56ca0aab95fc 1112 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1113 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1114 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1115
tomas_dca 0:56ca0aab95fc 1116 // go straight (out block)
tomas_dca 0:56ca0aab95fc 1117 ant_column += -1 + (2 * ( ant_dir == right));
tomas_dca 0:56ca0aab95fc 1118
tomas_dca 0:56ca0aab95fc 1119 // ant_dir = ant_dir;
tomas_dca 0:56ca0aab95fc 1120 }
tomas_dca 0:56ca0aab95fc 1121 else
tomas_dca 0:56ca0aab95fc 1122 // reload matrix
tomas_dca 0:56ca0aab95fc 1123 if((ant_column == 7) || (ant_column == 0))
tomas_dca 0:56ca0aab95fc 1124 {
tomas_dca 0:56ca0aab95fc 1125 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 1126 {
tomas_dca 0:56ca0aab95fc 1127 // mark used block
tomas_dca 0:56ca0aab95fc 1128 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column] = led_used;
tomas_dca 0:56ca0aab95fc 1129 matrix[ant_row][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1130 matrix[ant_row + 1 - (2* (ant_row % 2))][ant_column + 1 - (2* (ant_column % 2))] = led_used;
tomas_dca 0:56ca0aab95fc 1131
tomas_dca 0:56ca0aab95fc 1132 reload_matrix();
tomas_dca 0:56ca0aab95fc 1133
tomas_dca 0:56ca0aab95fc 1134 if(ant_dir == left)
tomas_dca 0:56ca0aab95fc 1135 ant_column = 7;
tomas_dca 0:56ca0aab95fc 1136 else
tomas_dca 0:56ca0aab95fc 1137 ant_column = 0;
tomas_dca 0:56ca0aab95fc 1138 }
tomas_dca 0:56ca0aab95fc 1139 else
tomas_dca 0:56ca0aab95fc 1140 {
tomas_dca 0:56ca0aab95fc 1141 // GAME OVER
tomas_dca 0:56ca0aab95fc 1142 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1143 game_state = score;
tomas_dca 0:56ca0aab95fc 1144 }
tomas_dca 0:56ca0aab95fc 1145 }
tomas_dca 0:56ca0aab95fc 1146 else
tomas_dca 0:56ca0aab95fc 1147 {
tomas_dca 0:56ca0aab95fc 1148 // GAME OVER
tomas_dca 0:56ca0aab95fc 1149 if(game_state == game)
tomas_dca 0:56ca0aab95fc 1150 game_state = score;
tomas_dca 0:56ca0aab95fc 1151 }
tomas_dca 0:56ca0aab95fc 1152 }
tomas_dca 0:56ca0aab95fc 1153 }
tomas_dca 0:56ca0aab95fc 1154 matrix[ant_row][ant_column] = led_ant;
tomas_dca 0:56ca0aab95fc 1155 }
tomas_dca 0:56ca0aab95fc 1156 }
tomas_dca 0:56ca0aab95fc 1157
tomas_dca 0:56ca0aab95fc 1158 uint32_t translate(uint8_t number)
tomas_dca 0:56ca0aab95fc 1159 {
tomas_dca 0:56ca0aab95fc 1160 uint32_t ret;
tomas_dca 0:56ca0aab95fc 1161
tomas_dca 0:56ca0aab95fc 1162
tomas_dca 0:56ca0aab95fc 1163 // translate numbers to symbols
tomas_dca 0:56ca0aab95fc 1164 for(uint8_t j = 0; j < 5;j++)
tomas_dca 0:56ca0aab95fc 1165 {
tomas_dca 0:56ca0aab95fc 1166 switch(number)
tomas_dca 0:56ca0aab95fc 1167 {
tomas_dca 0:56ca0aab95fc 1168 case 0:
tomas_dca 0:56ca0aab95fc 1169 ret = zero;
tomas_dca 0:56ca0aab95fc 1170 break;
tomas_dca 0:56ca0aab95fc 1171 case 1:
tomas_dca 0:56ca0aab95fc 1172 ret = one;
tomas_dca 0:56ca0aab95fc 1173 break;
tomas_dca 0:56ca0aab95fc 1174 case 2:
tomas_dca 0:56ca0aab95fc 1175 ret = two;
tomas_dca 0:56ca0aab95fc 1176 break;
tomas_dca 0:56ca0aab95fc 1177 case 3:
tomas_dca 0:56ca0aab95fc 1178 ret = three;
tomas_dca 0:56ca0aab95fc 1179 break;
tomas_dca 0:56ca0aab95fc 1180 case 4:
tomas_dca 0:56ca0aab95fc 1181 ret = four;
tomas_dca 0:56ca0aab95fc 1182 break;
tomas_dca 0:56ca0aab95fc 1183 case 5:
tomas_dca 0:56ca0aab95fc 1184 ret = five;
tomas_dca 0:56ca0aab95fc 1185 break;
tomas_dca 0:56ca0aab95fc 1186 case 6:
tomas_dca 0:56ca0aab95fc 1187 ret = six;
tomas_dca 0:56ca0aab95fc 1188 break;
tomas_dca 0:56ca0aab95fc 1189 case 7:
tomas_dca 0:56ca0aab95fc 1190 ret = seven;
tomas_dca 0:56ca0aab95fc 1191 break;
tomas_dca 0:56ca0aab95fc 1192 case 8:
tomas_dca 0:56ca0aab95fc 1193 ret = eight;
tomas_dca 0:56ca0aab95fc 1194 break;
tomas_dca 0:56ca0aab95fc 1195 default:
tomas_dca 0:56ca0aab95fc 1196 ret = nine;
tomas_dca 0:56ca0aab95fc 1197 break;
tomas_dca 0:56ca0aab95fc 1198 }
tomas_dca 0:56ca0aab95fc 1199 }
tomas_dca 0:56ca0aab95fc 1200
tomas_dca 0:56ca0aab95fc 1201 return(ret);
tomas_dca 0:56ca0aab95fc 1202 }