This was school project with LED matrix with special shield. Unfortunately, comments are in czech language but I think the program is quite easy to understand. It´s unusable without the shield, but the basis can be used esewhere.

Dependencies:   MMA8451Q mbed

Committer:
xtypov00
Date:
Fri Jan 13 14:52:48 2017 +0000
Revision:
0:b4a961ac4a97
This was school project with special shield with LED matrix. Unfortunately, comments are in czech language, but I thing the program is quite simple to understand. It?s unusable without the shileld, but the basis can be use eslewhere.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xtypov00 0:b4a961ac4a97 1 #include "mbed.h"
xtypov00 0:b4a961ac4a97 2 #include "MMA8451Q.h" //knihovna akcelerometru
xtypov00 0:b4a961ac4a97 3
xtypov00 0:b4a961ac4a97 4 #define MMA8451_I2C_ADDRESS (0x1d<<1) //definice pro akcelerometr
xtypov00 0:b4a961ac4a97 5 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); //obsluha akcelerometru
xtypov00 0:b4a961ac4a97 6
xtypov00 0:b4a961ac4a97 7 void AdresRadku(int line); //adresování řádků
xtypov00 0:b4a961ac4a97 8 void Zobraz(void); //funkce zprostředkující zobrazení
xtypov00 0:b4a961ac4a97 9 void Inicializace(void); //inicalizace počáteční polohy svodidel a auta hráče
xtypov00 0:b4a961ac4a97 10 void SvodidlaPohyb(void); //samostatný pohyb svodidel
xtypov00 0:b4a961ac4a97 11 void AutaPohyb(void); //generování a pohyb aut počítače
xtypov00 0:b4a961ac4a97 12 void Pohyb(void); //ovládání pozice auta hráče pomocí akcelerometru
xtypov00 0:b4a961ac4a97 13 void Kolize(void); //detekce kolize auta hráče s auty počítače
xtypov00 0:b4a961ac4a97 14 void Reset(void); //restart hry
xtypov00 0:b4a961ac4a97 15
xtypov00 0:b4a961ac4a97 16 Ticker disptick; //definice časovače pro volání funkce zobrazení
xtypov00 0:b4a961ac4a97 17 Ticker tick; //definice časovače pro volání funkce pohybu svodidel - 1px/s
xtypov00 0:b4a961ac4a97 18 Ticker tick2; //definice časovače pro volání funkce pohybu aut počítače - 1px/0.25s
xtypov00 0:b4a961ac4a97 19
xtypov00 0:b4a961ac4a97 20 int randVector[] = {0,1,0,1,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,1}; //vektor náhodných čísel
xtypov00 0:b4a961ac4a97 21 int pocitadlo = 0; //pomocná proměnná pro vyber z náhodného vektoru
xtypov00 0:b4a961ac4a97 22 int rowAuto = 0;
xtypov00 0:b4a961ac4a97 23 int pomAuto;
xtypov00 0:b4a961ac4a97 24 int pomAuto2;
xtypov00 0:b4a961ac4a97 25 int poloha = 4;
xtypov00 0:b4a961ac4a97 26 float ay;
xtypov00 0:b4a961ac4a97 27 float prah;
xtypov00 0:b4a961ac4a97 28 int kolize;
xtypov00 0:b4a961ac4a97 29
xtypov00 0:b4a961ac4a97 30 //definování pinů pro zelenou barvu
xtypov00 0:b4a961ac4a97 31 DigitalOut zelena0(PTC7);
xtypov00 0:b4a961ac4a97 32 DigitalOut zelena1(PTC6);
xtypov00 0:b4a961ac4a97 33 DigitalOut zelena2(PTC5);
xtypov00 0:b4a961ac4a97 34 DigitalOut zelena3(PTC4);
xtypov00 0:b4a961ac4a97 35 DigitalOut zelena4(PTC3);
xtypov00 0:b4a961ac4a97 36 DigitalOut zelena5(PTC2);
xtypov00 0:b4a961ac4a97 37 DigitalOut zelena6(PTC1);
xtypov00 0:b4a961ac4a97 38 DigitalOut zelena7(PTC0);
xtypov00 0:b4a961ac4a97 39
xtypov00 0:b4a961ac4a97 40 //definování pinů pro červenou barvu
xtypov00 0:b4a961ac4a97 41 DigitalOut cervena0(PTC17);
xtypov00 0:b4a961ac4a97 42 DigitalOut cervena1(PTC16);
xtypov00 0:b4a961ac4a97 43 DigitalOut cervena2(PTC13);
xtypov00 0:b4a961ac4a97 44 DigitalOut cervena3(PTC12);
xtypov00 0:b4a961ac4a97 45 DigitalOut cervena4(PTC11);
xtypov00 0:b4a961ac4a97 46 DigitalOut cervena5(PTC10);
xtypov00 0:b4a961ac4a97 47 DigitalOut cervena6(PTC9);
xtypov00 0:b4a961ac4a97 48 DigitalOut cervena7(PTC8);
xtypov00 0:b4a961ac4a97 49
xtypov00 0:b4a961ac4a97 50 //definování pinů pro adresování řádků
xtypov00 0:b4a961ac4a97 51 DigitalOut ln0(PTB0);
xtypov00 0:b4a961ac4a97 52 DigitalOut ln1(PTB1);
xtypov00 0:b4a961ac4a97 53 DigitalOut ln2(PTB2); //2^3 = 8...8 radku kodovany binar. hodnotama
xtypov00 0:b4a961ac4a97 54
xtypov00 0:b4a961ac4a97 55
xtypov00 0:b4a961ac4a97 56 // pracovní pole pro matici čerevných LED
xtypov00 0:b4a961ac4a97 57 // |0||1||2||3||4||5||6||7|
xtypov00 0:b4a961ac4a97 58 int poleCerveny[8][8] = {
xtypov00 0:b4a961ac4a97 59 {0, 0, 0, 0, 0, 0, 0, 0}, //0
xtypov00 0:b4a961ac4a97 60 {0, 0, 0, 0, 0, 0, 0, 0}, //1
xtypov00 0:b4a961ac4a97 61 {0, 0, 0, 0, 0, 0, 0, 0}, //2
xtypov00 0:b4a961ac4a97 62 {0, 0, 0, 0, 0, 0, 0, 0}, //3
xtypov00 0:b4a961ac4a97 63 {0, 0, 0, 0, 0, 0, 0, 0}, //4
xtypov00 0:b4a961ac4a97 64 {0, 0, 0, 0, 0, 0, 0, 0}, //5
xtypov00 0:b4a961ac4a97 65 {0, 0, 0, 0, 0, 0, 0, 0}, //6
xtypov00 0:b4a961ac4a97 66 {0, 0, 0, 0, 0, 0, 0, 0}, };//7
xtypov00 0:b4a961ac4a97 67
xtypov00 0:b4a961ac4a97 68 // pracovní pole pro matici zelených LED
xtypov00 0:b4a961ac4a97 69 int poleZeleny[8][8] = {
xtypov00 0:b4a961ac4a97 70 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 71 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 72 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 73 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 74 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 75 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 76 {0, 0, 0, 0, 0, 0, 0, 0},
xtypov00 0:b4a961ac4a97 77 {0, 0, 0, 0, 0, 0, 0, 0}, };
xtypov00 0:b4a961ac4a97 78
xtypov00 0:b4a961ac4a97 79
xtypov00 0:b4a961ac4a97 80
xtypov00 0:b4a961ac4a97 81
xtypov00 0:b4a961ac4a97 82
xtypov00 0:b4a961ac4a97 83
xtypov00 0:b4a961ac4a97 84 /*----------------------------------------------------------------------------*/
xtypov00 0:b4a961ac4a97 85 // MAIN //
xtypov00 0:b4a961ac4a97 86 /*----------------------------------------------------------------------------*/
xtypov00 0:b4a961ac4a97 87
xtypov00 0:b4a961ac4a97 88 int main()
xtypov00 0:b4a961ac4a97 89 {
xtypov00 0:b4a961ac4a97 90 Inicializace(); //inicalizace počáteční polohy oranžových svodidel a zeleného auta hráče
xtypov00 0:b4a961ac4a97 91 disptick.attach(&Zobraz, 0.002); //nastavení časovače pro rozsvicování displeye
xtypov00 0:b4a961ac4a97 92 tick.attach(&SvodidlaPohyb, 1); //nastavení časovače pro volání funkce zabezpečující pohyb svodidel
xtypov00 0:b4a961ac4a97 93 tick2.attach(&AutaPohyb, 0.25); //nastavení časovače pro volání funkce zabezpečující pohyb aut počítače
xtypov00 0:b4a961ac4a97 94 while(1)
xtypov00 0:b4a961ac4a97 95 {
xtypov00 0:b4a961ac4a97 96 Pohyb(); //ovládání pozice auta hráče pomocí akcelerometru
xtypov00 0:b4a961ac4a97 97 Kolize(); //detekce kolize auta hráče s auty počítače
xtypov00 0:b4a961ac4a97 98 }
xtypov00 0:b4a961ac4a97 99 }
xtypov00 0:b4a961ac4a97 100 /*----------------------------------------------------------------------------*/
xtypov00 0:b4a961ac4a97 101 // //
xtypov00 0:b4a961ac4a97 102 /*----------------------------------------------------------------------------*/
xtypov00 0:b4a961ac4a97 103
xtypov00 0:b4a961ac4a97 104
xtypov00 0:b4a961ac4a97 105
xtypov00 0:b4a961ac4a97 106
xtypov00 0:b4a961ac4a97 107
xtypov00 0:b4a961ac4a97 108
xtypov00 0:b4a961ac4a97 109
xtypov00 0:b4a961ac4a97 110 /*---------------------------------Zobraz-------------------------------------*/
xtypov00 0:b4a961ac4a97 111
xtypov00 0:b4a961ac4a97 112 //rozsvicování matice na základě stavu pracovních polí v aktuálním kroku
xtypov00 0:b4a961ac4a97 113 void Zobraz(void)
xtypov00 0:b4a961ac4a97 114 {
xtypov00 0:b4a961ac4a97 115 static int line = 0; //proměná inicializující prnví řádek
xtypov00 0:b4a961ac4a97 116
xtypov00 0:b4a961ac4a97 117 AdresRadku(line); //adresování řádků pomocí funkce AdresRadku()
xtypov00 0:b4a961ac4a97 118
xtypov00 0:b4a961ac4a97 119 //Rozsvicování LEDek je zajištěno jejich uzeměním - tedy, když je na řídící vstup přivedena 0.
xtypov00 0:b4a961ac4a97 120 //Z důvodu lepší oirentace při práci bylo využito negace, aby v následujícím algoritmu rozsvícení LEDek
xtypov00 0:b4a961ac4a97 121 //způsobovalo číslo 1.
xtypov00 0:b4a961ac4a97 122
xtypov00 0:b4a961ac4a97 123 //rozsvicování zelených LED
xtypov00 0:b4a961ac4a97 124 zelena0 =! poleZeleny[line][0];
xtypov00 0:b4a961ac4a97 125 zelena1 =! poleZeleny[line][1];
xtypov00 0:b4a961ac4a97 126 zelena2 =! poleZeleny[line][2];
xtypov00 0:b4a961ac4a97 127 zelena3 =! poleZeleny[line][3];
xtypov00 0:b4a961ac4a97 128 zelena4 =! poleZeleny[line][4];
xtypov00 0:b4a961ac4a97 129 zelena5 =! poleZeleny[line][5];
xtypov00 0:b4a961ac4a97 130 zelena6 =! poleZeleny[line][6];
xtypov00 0:b4a961ac4a97 131 zelena7 =! poleZeleny[line][7];
xtypov00 0:b4a961ac4a97 132
xtypov00 0:b4a961ac4a97 133 //rozsvícení červených LED
xtypov00 0:b4a961ac4a97 134 cervena0 =! poleCerveny[line][0];
xtypov00 0:b4a961ac4a97 135 cervena1 =! poleCerveny[line][1];
xtypov00 0:b4a961ac4a97 136 cervena2 =! poleCerveny[line][2];
xtypov00 0:b4a961ac4a97 137 cervena3 =! poleCerveny[line][3];
xtypov00 0:b4a961ac4a97 138 cervena4 =! poleCerveny[line][4];
xtypov00 0:b4a961ac4a97 139 cervena5 =! poleCerveny[line][5];
xtypov00 0:b4a961ac4a97 140 cervena6 =! poleCerveny[line][6];
xtypov00 0:b4a961ac4a97 141 cervena7 =! poleCerveny[line][7];
xtypov00 0:b4a961ac4a97 142 //v případě, že na stejné pozici svící obě LEDky, je barva oranžová
xtypov00 0:b4a961ac4a97 143
xtypov00 0:b4a961ac4a97 144 wait(0.001); //zpožděni-aby se to stihlo rozsvitit
xtypov00 0:b4a961ac4a97 145 line++; //přepis proměnné na další řádek
xtypov00 0:b4a961ac4a97 146 if(line == 8) //v případě,že dojde na konec,jede se od zacatku
xtypov00 0:b4a961ac4a97 147 {
xtypov00 0:b4a961ac4a97 148 line = 0;
xtypov00 0:b4a961ac4a97 149 }
xtypov00 0:b4a961ac4a97 150 }
xtypov00 0:b4a961ac4a97 151
xtypov00 0:b4a961ac4a97 152
xtypov00 0:b4a961ac4a97 153 /*--------------------------------AdresRadku----------------------------------*/
xtypov00 0:b4a961ac4a97 154 //adresování řádků
xtypov00 0:b4a961ac4a97 155 void AdresRadku(int line)
xtypov00 0:b4a961ac4a97 156 {
xtypov00 0:b4a961ac4a97 157 switch(line)
xtypov00 0:b4a961ac4a97 158 {
xtypov00 0:b4a961ac4a97 159 case 0: ln0 = 0;
xtypov00 0:b4a961ac4a97 160 ln1 = 0;
xtypov00 0:b4a961ac4a97 161 ln2 = 0;
xtypov00 0:b4a961ac4a97 162 break;
xtypov00 0:b4a961ac4a97 163 case 1: ln0 = 1;
xtypov00 0:b4a961ac4a97 164 ln1 = 0;
xtypov00 0:b4a961ac4a97 165 ln2 = 0;
xtypov00 0:b4a961ac4a97 166 break;
xtypov00 0:b4a961ac4a97 167 case 2: ln0 = 0;
xtypov00 0:b4a961ac4a97 168 ln1 = 1;
xtypov00 0:b4a961ac4a97 169 ln2 = 0;
xtypov00 0:b4a961ac4a97 170 break;
xtypov00 0:b4a961ac4a97 171 case 3: ln0 = 1;
xtypov00 0:b4a961ac4a97 172 ln1 = 1;
xtypov00 0:b4a961ac4a97 173 ln2 = 0;
xtypov00 0:b4a961ac4a97 174 break;
xtypov00 0:b4a961ac4a97 175 case 4: ln0 = 0;
xtypov00 0:b4a961ac4a97 176 ln1 = 0;
xtypov00 0:b4a961ac4a97 177 ln2 = 1;
xtypov00 0:b4a961ac4a97 178 break;
xtypov00 0:b4a961ac4a97 179 case 5: ln0 = 1;
xtypov00 0:b4a961ac4a97 180 ln1 = 0;
xtypov00 0:b4a961ac4a97 181 ln2 = 1;
xtypov00 0:b4a961ac4a97 182 break;
xtypov00 0:b4a961ac4a97 183 case 6: ln0 = 0;
xtypov00 0:b4a961ac4a97 184 ln1 = 1;
xtypov00 0:b4a961ac4a97 185 ln2 = 1;
xtypov00 0:b4a961ac4a97 186 break;
xtypov00 0:b4a961ac4a97 187 case 7: ln0 = 1;
xtypov00 0:b4a961ac4a97 188 ln1 = 1;
xtypov00 0:b4a961ac4a97 189 ln2 = 1;
xtypov00 0:b4a961ac4a97 190 break;
xtypov00 0:b4a961ac4a97 191 default: break;
xtypov00 0:b4a961ac4a97 192 }
xtypov00 0:b4a961ac4a97 193 }
xtypov00 0:b4a961ac4a97 194
xtypov00 0:b4a961ac4a97 195
xtypov00 0:b4a961ac4a97 196 /*--------------------------------Inicializace--------------------------------*/
xtypov00 0:b4a961ac4a97 197 void Inicializace(void){
xtypov00 0:b4a961ac4a97 198 int col;
xtypov00 0:b4a961ac4a97 199 int row;
xtypov00 0:b4a961ac4a97 200 /*------------inicializace svodidel--------------*/
xtypov00 0:b4a961ac4a97 201 for(col=0;col < 8; col = col+7)
xtypov00 0:b4a961ac4a97 202 {
xtypov00 0:b4a961ac4a97 203 for(row = 0; row < 8; row++)
xtypov00 0:b4a961ac4a97 204 {
xtypov00 0:b4a961ac4a97 205 if(row == 0 ||row == 4)
xtypov00 0:b4a961ac4a97 206 {
xtypov00 0:b4a961ac4a97 207 poleCerveny[row][col]=0;
xtypov00 0:b4a961ac4a97 208 poleZeleny[row][col]=0;
xtypov00 0:b4a961ac4a97 209 }
xtypov00 0:b4a961ac4a97 210 else
xtypov00 0:b4a961ac4a97 211 {
xtypov00 0:b4a961ac4a97 212 poleCerveny[row][col]=1;
xtypov00 0:b4a961ac4a97 213 poleZeleny[row][col]=1;
xtypov00 0:b4a961ac4a97 214 }
xtypov00 0:b4a961ac4a97 215 }
xtypov00 0:b4a961ac4a97 216 }
xtypov00 0:b4a961ac4a97 217 /*----inicializace auta hráče - pozice napravo---*/
xtypov00 0:b4a961ac4a97 218 poleZeleny[4][4] = 1;
xtypov00 0:b4a961ac4a97 219 poleZeleny[5][4] = 1;
xtypov00 0:b4a961ac4a97 220 poleZeleny[6][4] = 1;
xtypov00 0:b4a961ac4a97 221 poleZeleny[4][5] = 1;
xtypov00 0:b4a961ac4a97 222 poleZeleny[5][5] = 1;
xtypov00 0:b4a961ac4a97 223 poleZeleny[6][5] = 1;
xtypov00 0:b4a961ac4a97 224 }
xtypov00 0:b4a961ac4a97 225
xtypov00 0:b4a961ac4a97 226
xtypov00 0:b4a961ac4a97 227 /*--------------------------------SvodidlaPohyb-------------------------------*/
xtypov00 0:b4a961ac4a97 228 void SvodidlaPohyb(void)
xtypov00 0:b4a961ac4a97 229 {
xtypov00 0:b4a961ac4a97 230 int col;
xtypov00 0:b4a961ac4a97 231 int row;
xtypov00 0:b4a961ac4a97 232 int pom1; //pomocná proměnná
xtypov00 0:b4a961ac4a97 233
xtypov00 0:b4a961ac4a97 234 pom1 = poleCerveny[7][0]; //uloží hodnotu v poslendím 8. radku
xtypov00 0:b4a961ac4a97 235
xtypov00 0:b4a961ac4a97 236 //posune svodidla o 1 pozici směrem dolu při každém zavolání funkce
xtypov00 0:b4a961ac4a97 237 for(col=0;col < 8; col = col+7) //pracuje pouze v 1. a v posledním sloupci
xtypov00 0:b4a961ac4a97 238 {
xtypov00 0:b4a961ac4a97 239 for(row = 7; row > 0; row--) //7. až 1. řádek přepíše na 8. až 2.
xtypov00 0:b4a961ac4a97 240 {
xtypov00 0:b4a961ac4a97 241 poleCerveny[row][col] = poleCerveny[row-1][col];
xtypov00 0:b4a961ac4a97 242 poleZeleny[row][col] = poleZeleny[row-1][col];
xtypov00 0:b4a961ac4a97 243 }
xtypov00 0:b4a961ac4a97 244 }
xtypov00 0:b4a961ac4a97 245 //poslední řádek přepíše jako 1.
xtypov00 0:b4a961ac4a97 246 poleCerveny[0][0] = pom1;
xtypov00 0:b4a961ac4a97 247 poleCerveny[0][7] = pom1;
xtypov00 0:b4a961ac4a97 248 poleZeleny[0][0] = pom1;
xtypov00 0:b4a961ac4a97 249 poleZeleny[0][7] = pom1;
xtypov00 0:b4a961ac4a97 250 }
xtypov00 0:b4a961ac4a97 251
xtypov00 0:b4a961ac4a97 252
xtypov00 0:b4a961ac4a97 253 /*--------------------------------AutaPohyb-----------------------------------*/
xtypov00 0:b4a961ac4a97 254 void AutaPohyb(void)
xtypov00 0:b4a961ac4a97 255 {
xtypov00 0:b4a961ac4a97 256
xtypov00 0:b4a961ac4a97 257 int col2; //sloupec, ve kterém se auto počítače nachází - mění se podle hodnot randVectoru
xtypov00 0:b4a961ac4a97 258
xtypov00 0:b4a961ac4a97 259
xtypov00 0:b4a961ac4a97 260 //"pocitadlo" = pozice v randVectoru; začíná se od počáteční pozice 0
xtypov00 0:b4a961ac4a97 261 //"rowAuto" - zajišťuje posun aut; počáteční hodnota je 0, ale 1. auto se objeví až po zavolání funkce
xtypov00 0:b4a961ac4a97 262
xtypov00 0:b4a961ac4a97 263 if(randVector[pocitadlo] == 1) //když bude aktuální hodnota randVectoru rovna 1, auto počítače bude nalevo
xtypov00 0:b4a961ac4a97 264 {
xtypov00 0:b4a961ac4a97 265 col2 = 2; //levý (3.) sloupec
xtypov00 0:b4a961ac4a97 266 poleCerveny[rowAuto][col2] = 1;
xtypov00 0:b4a961ac4a97 267 poleCerveny[rowAuto][col2+1] = 1;
xtypov00 0:b4a961ac4a97 268 }
xtypov00 0:b4a961ac4a97 269 else //při hodnotě 0 bude auto počítače napravo
xtypov00 0:b4a961ac4a97 270 {
xtypov00 0:b4a961ac4a97 271 col2 = 4; //pravý (5.) sloupec
xtypov00 0:b4a961ac4a97 272 poleCerveny[rowAuto][col2] = 1;
xtypov00 0:b4a961ac4a97 273 poleCerveny[rowAuto][col2+1] = 1;
xtypov00 0:b4a961ac4a97 274 }
xtypov00 0:b4a961ac4a97 275 rowAuto++; //zvýší hodnotu o 1, aby se v náseledující iteraci auto počítače objevilo na dalším čádku
xtypov00 0:b4a961ac4a97 276
xtypov00 0:b4a961ac4a97 277 //----zhasínání LEDek, kterými prošlo auto počítače----//
xtypov00 0:b4a961ac4a97 278 if(rowAuto > 3)
xtypov00 0:b4a961ac4a97 279 {
xtypov00 0:b4a961ac4a97 280 poleCerveny[rowAuto-4][col2] =! 1;
xtypov00 0:b4a961ac4a97 281 poleCerveny[rowAuto-4][col2+1] =! 1;
xtypov00 0:b4a961ac4a97 282 }
xtypov00 0:b4a961ac4a97 283 else if(rowAuto > 4)
xtypov00 0:b4a961ac4a97 284 {
xtypov00 0:b4a961ac4a97 285 poleCerveny[rowAuto-5][col2] =! 1;
xtypov00 0:b4a961ac4a97 286 poleCerveny[rowAuto-5][col2+1] =! 1;
xtypov00 0:b4a961ac4a97 287 }
xtypov00 0:b4a961ac4a97 288 else if(rowAuto > 5)
xtypov00 0:b4a961ac4a97 289 {
xtypov00 0:b4a961ac4a97 290 poleCerveny[rowAuto-6][col2] =! 1;
xtypov00 0:b4a961ac4a97 291 poleCerveny[rowAuto-6][col2+1] =! 1;
xtypov00 0:b4a961ac4a97 292 }
xtypov00 0:b4a961ac4a97 293 else if(rowAuto > 6)
xtypov00 0:b4a961ac4a97 294 {
xtypov00 0:b4a961ac4a97 295 poleCerveny[rowAuto-7][col2] =! 1;
xtypov00 0:b4a961ac4a97 296 poleCerveny[rowAuto-7][col2+1] =! 1;
xtypov00 0:b4a961ac4a97 297 }
xtypov00 0:b4a961ac4a97 298 else if(rowAuto > 7)
xtypov00 0:b4a961ac4a97 299 {
xtypov00 0:b4a961ac4a97 300 poleCerveny[rowAuto-8][col2] =! 1;
xtypov00 0:b4a961ac4a97 301 poleCerveny[rowAuto-8][col2+1] =! 1;
xtypov00 0:b4a961ac4a97 302 }
xtypov00 0:b4a961ac4a97 303
xtypov00 0:b4a961ac4a97 304 else if(rowAuto == 1)
xtypov00 0:b4a961ac4a97 305 {
xtypov00 0:b4a961ac4a97 306 poleCerveny[5][pomAuto] =! 1;
xtypov00 0:b4a961ac4a97 307 poleCerveny[5][pomAuto+1] =! 1;
xtypov00 0:b4a961ac4a97 308 }
xtypov00 0:b4a961ac4a97 309
xtypov00 0:b4a961ac4a97 310 else if(rowAuto == 2)
xtypov00 0:b4a961ac4a97 311 {
xtypov00 0:b4a961ac4a97 312 poleCerveny[6][pomAuto2] =! 1;
xtypov00 0:b4a961ac4a97 313 poleCerveny[6][pomAuto2+1] =! 1;
xtypov00 0:b4a961ac4a97 314 }
xtypov00 0:b4a961ac4a97 315
xtypov00 0:b4a961ac4a97 316 else if(rowAuto == 3)
xtypov00 0:b4a961ac4a97 317 {
xtypov00 0:b4a961ac4a97 318 poleCerveny[7][2] =! 1;
xtypov00 0:b4a961ac4a97 319 poleCerveny[7][4] =! 1;
xtypov00 0:b4a961ac4a97 320 poleCerveny[7][3] =! 1;
xtypov00 0:b4a961ac4a97 321 poleCerveny[7][5] =! 1;
xtypov00 0:b4a961ac4a97 322 }
xtypov00 0:b4a961ac4a97 323
xtypov00 0:b4a961ac4a97 324 //----opakovaní cyklu + další pohola auta počítače----//
xtypov00 0:b4a961ac4a97 325 if(rowAuto > 7) //jakmile řádky dojedou na konec, jede se od začátku
xtypov00 0:b4a961ac4a97 326 {
xtypov00 0:b4a961ac4a97 327 rowAuto = 0;
xtypov00 0:b4a961ac4a97 328 pocitadlo++; //zvýšení proměnné o 1, aby aktualizovala pozice nového auta počítače
xtypov00 0:b4a961ac4a97 329 }
xtypov00 0:b4a961ac4a97 330
xtypov00 0:b4a961ac4a97 331 //pokud cyklus dojede na konec randVectoru, jede se opět od začátku
xtypov00 0:b4a961ac4a97 332 int n = sizeof(randVector) / sizeof(randVector[0]);
xtypov00 0:b4a961ac4a97 333 if(pocitadlo > n-1) //n =10, ale indexuju max do 9
xtypov00 0:b4a961ac4a97 334 {
xtypov00 0:b4a961ac4a97 335 pocitadlo = 0;
xtypov00 0:b4a961ac4a97 336 }
xtypov00 0:b4a961ac4a97 337 // pomocné proměnné, které si pamatují, v jaké pozici bylo auto počítače v předchozím cyklu
xtypov00 0:b4a961ac4a97 338 // z důvodu postupného smazání tohoto starého auta
xtypov00 0:b4a961ac4a97 339 pomAuto2=pomAuto; //pozice starého auta v před-předposlední pozici
xtypov00 0:b4a961ac4a97 340 pomAuto = col2; //pozice starého auta v předposlední pozici
xtypov00 0:b4a961ac4a97 341 }
xtypov00 0:b4a961ac4a97 342
xtypov00 0:b4a961ac4a97 343
xtypov00 0:b4a961ac4a97 344 /*-----------------------------------Pohyb------------------------------------*/
xtypov00 0:b4a961ac4a97 345 void Pohyb(void)
xtypov00 0:b4a961ac4a97 346 {
xtypov00 0:b4a961ac4a97 347 prah = 0.3; //nastavení prahu, vymezující úhel detekce
xtypov00 0:b4a961ac4a97 348 ay = float(acc.getAccY()); //odečítání Y-ové osy akcelerometru
xtypov00 0:b4a961ac4a97 349
xtypov00 0:b4a961ac4a97 350
xtypov00 0:b4a961ac4a97 351 if((ay > prah)) //náklon vpravo
xtypov00 0:b4a961ac4a97 352 {
xtypov00 0:b4a961ac4a97 353 poloha =4; //pravý (5.) sloupec
xtypov00 0:b4a961ac4a97 354 //rožnout auto hráče napravo
xtypov00 0:b4a961ac4a97 355 poleZeleny[4][poloha] = 1;
xtypov00 0:b4a961ac4a97 356 poleZeleny[5][poloha] = 1;
xtypov00 0:b4a961ac4a97 357 poleZeleny[6][poloha] = 1;
xtypov00 0:b4a961ac4a97 358 poleZeleny[4][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 359 poleZeleny[5][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 360 poleZeleny[6][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 361 //zhasnout auto hráče vlevo
xtypov00 0:b4a961ac4a97 362 poleZeleny[4][poloha-2] =! 1;
xtypov00 0:b4a961ac4a97 363 poleZeleny[5][poloha-2] =! 1;
xtypov00 0:b4a961ac4a97 364 poleZeleny[6][poloha-2] =! 1;
xtypov00 0:b4a961ac4a97 365 poleZeleny[4][poloha-1] =! 1;
xtypov00 0:b4a961ac4a97 366 poleZeleny[5][poloha-1] =! 1;
xtypov00 0:b4a961ac4a97 367 poleZeleny[6][poloha-1] =! 1;
xtypov00 0:b4a961ac4a97 368 }
xtypov00 0:b4a961ac4a97 369 else if((ay < -prah)) //náklon vlevo
xtypov00 0:b4a961ac4a97 370 {
xtypov00 0:b4a961ac4a97 371 poloha =2; //levý (3.) sloupec
xtypov00 0:b4a961ac4a97 372 //rožnout auto hráče vlevo
xtypov00 0:b4a961ac4a97 373 poleZeleny[4][poloha] = 1;
xtypov00 0:b4a961ac4a97 374 poleZeleny[5][poloha] = 1;
xtypov00 0:b4a961ac4a97 375 poleZeleny[6][poloha] = 1;
xtypov00 0:b4a961ac4a97 376 poleZeleny[4][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 377 poleZeleny[5][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 378 poleZeleny[6][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 379 //zhasnout auto hráče vpravo
xtypov00 0:b4a961ac4a97 380 poleZeleny[4][poloha+2] =! 1;
xtypov00 0:b4a961ac4a97 381 poleZeleny[5][poloha+2] =! 1;
xtypov00 0:b4a961ac4a97 382 poleZeleny[6][poloha+2] =! 1;
xtypov00 0:b4a961ac4a97 383 poleZeleny[4][poloha+3] =! 1;
xtypov00 0:b4a961ac4a97 384 poleZeleny[5][poloha+3] =! 1;
xtypov00 0:b4a961ac4a97 385 poleZeleny[6][poloha+3] =! 1;
xtypov00 0:b4a961ac4a97 386 }
xtypov00 0:b4a961ac4a97 387 }
xtypov00 0:b4a961ac4a97 388
xtypov00 0:b4a961ac4a97 389
xtypov00 0:b4a961ac4a97 390 /*-----------------------------------Kolize-----------------------------------*/
xtypov00 0:b4a961ac4a97 391 void Kolize(void)
xtypov00 0:b4a961ac4a97 392 {
xtypov00 0:b4a961ac4a97 393 //detekování překryvu matice červených LEDek a matice zelených LEDek
xtypov00 0:b4a961ac4a97 394 //detekce probíha pouze ve dvou krajních bodech, ktere dostatečně pokrývají všechny možné kolize
xtypov00 0:b4a961ac4a97 395 //poloha těchto bodů je závislá pouze na proměnné "poloha", která určuje, zda jsou vpravo či v levo
xtypov00 0:b4a961ac4a97 396 if (poleZeleny[4][poloha] == poleCerveny[4][poloha] || poleZeleny[6][poloha] == poleCerveny[6][poloha])
xtypov00 0:b4a961ac4a97 397 {
xtypov00 0:b4a961ac4a97 398
xtypov00 0:b4a961ac4a97 399 //při detekci kolize dojde ke zmražení všech pohybů
xtypov00 0:b4a961ac4a97 400 tick.detach();
xtypov00 0:b4a961ac4a97 401 tick2.detach();
xtypov00 0:b4a961ac4a97 402
xtypov00 0:b4a961ac4a97 403 //-----zobrazí se oranžový vrak auta-----//
xtypov00 0:b4a961ac4a97 404 poleZeleny[4][poloha-1] = 1;
xtypov00 0:b4a961ac4a97 405 poleZeleny[5][poloha] = 1;
xtypov00 0:b4a961ac4a97 406 poleZeleny[6][poloha-1] = 1;
xtypov00 0:b4a961ac4a97 407 poleZeleny[4][poloha+2] = 1;
xtypov00 0:b4a961ac4a97 408 poleZeleny[5][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 409 poleZeleny[6][poloha+2] = 1;
xtypov00 0:b4a961ac4a97 410
xtypov00 0:b4a961ac4a97 411 poleCerveny[4][poloha-1] = 1;
xtypov00 0:b4a961ac4a97 412 poleCerveny[5][poloha] = 1;
xtypov00 0:b4a961ac4a97 413 poleCerveny[6][poloha-1] = 1;
xtypov00 0:b4a961ac4a97 414 poleCerveny[4][poloha+2] = 1;
xtypov00 0:b4a961ac4a97 415 poleCerveny[5][poloha+1] = 1;
xtypov00 0:b4a961ac4a97 416 poleCerveny[6][poloha+2] = 1;
xtypov00 0:b4a961ac4a97 417
xtypov00 0:b4a961ac4a97 418 //prosvitalo puvodni zeleny auto
xtypov00 0:b4a961ac4a97 419 poleZeleny[4][poloha] =! 1;
xtypov00 0:b4a961ac4a97 420 poleZeleny[4][poloha+1] =! 1;
xtypov00 0:b4a961ac4a97 421 poleZeleny[6][poloha] =! 1;
xtypov00 0:b4a961ac4a97 422 poleZeleny[6][poloha+1] =! 1;
xtypov00 0:b4a961ac4a97 423
xtypov00 0:b4a961ac4a97 424 wait(2); //zachování tohoto statického obrazu na dobu 2s
xtypov00 0:b4a961ac4a97 425 Reset(); // zavolá funkci reset
xtypov00 0:b4a961ac4a97 426 }
xtypov00 0:b4a961ac4a97 427 }
xtypov00 0:b4a961ac4a97 428
xtypov00 0:b4a961ac4a97 429
xtypov00 0:b4a961ac4a97 430
xtypov00 0:b4a961ac4a97 431 /*-----------------------------------Kolize-----------------------------------*/
xtypov00 0:b4a961ac4a97 432 void Reset(void)
xtypov00 0:b4a961ac4a97 433 {
xtypov00 0:b4a961ac4a97 434 int col;
xtypov00 0:b4a961ac4a97 435 int row;
xtypov00 0:b4a961ac4a97 436
xtypov00 0:b4a961ac4a97 437 //---na 2s se zobrazí pouze červené LED na celé ploše matice---//
xtypov00 0:b4a961ac4a97 438 for(col = 0; col < 8; col++)
xtypov00 0:b4a961ac4a97 439 {
xtypov00 0:b4a961ac4a97 440 for(row = 0; row < 8; row++)
xtypov00 0:b4a961ac4a97 441 {
xtypov00 0:b4a961ac4a97 442 poleZeleny[row][col]=0;
xtypov00 0:b4a961ac4a97 443 poleCerveny[row][col]=1;
xtypov00 0:b4a961ac4a97 444 }
xtypov00 0:b4a961ac4a97 445 }
xtypov00 0:b4a961ac4a97 446 wait(2);
xtypov00 0:b4a961ac4a97 447
xtypov00 0:b4a961ac4a97 448 //--------proběhne resetovací fáze--------//
xtypov00 0:b4a961ac4a97 449 //zhasnutí celé LED matice
xtypov00 0:b4a961ac4a97 450 for(col = 0; col < 8; col++)
xtypov00 0:b4a961ac4a97 451 {
xtypov00 0:b4a961ac4a97 452 for(row = 0; row < 8; row++)
xtypov00 0:b4a961ac4a97 453 {
xtypov00 0:b4a961ac4a97 454 poleCerveny[row][col]=0;
xtypov00 0:b4a961ac4a97 455 }
xtypov00 0:b4a961ac4a97 456 }
xtypov00 0:b4a961ac4a97 457
xtypov00 0:b4a961ac4a97 458 //re-inicializace
xtypov00 0:b4a961ac4a97 459 Inicializace();
xtypov00 0:b4a961ac4a97 460 pocitadlo = 0;
xtypov00 0:b4a961ac4a97 461 rowAuto = 0;
xtypov00 0:b4a961ac4a97 462 poloha =4;
xtypov00 0:b4a961ac4a97 463
xtypov00 0:b4a961ac4a97 464 //zrušení zmražení všech pohybů
xtypov00 0:b4a961ac4a97 465 tick.attach(&SvodidlaPohyb, 1);
xtypov00 0:b4a961ac4a97 466 tick2.attach(&AutaPohyb, 0.25);
xtypov00 0:b4a961ac4a97 467 }
xtypov00 0:b4a961ac4a97 468
xtypov00 0:b4a961ac4a97 469
xtypov00 0:b4a961ac4a97 470
xtypov00 0:b4a961ac4a97 471
xtypov00 0:b4a961ac4a97 472
xtypov00 0:b4a961ac4a97 473