
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.
main.cpp@0:b4a961ac4a97, 2017-01-13 (annotated)
- 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?
User | Revision | Line number | New 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 |