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:55:23 2015 +0000
Revision:
0:56ca0aab95fc
Child:
1:806df0da28dc
Ant Run (game) ; FRDM-KL25Z + 8x8 RG shield (project  MPOA - VUT v Brne)

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