semestralka
Dependencies: FRDM_MMA8451Q mbed
Vytah.cpp
00001 #include "mbed.h" 00002 #include "Header.h" 00003 #include "adresarik.h" 00004 00005 00006 00007 int main() 00008 { 00009 term.baud(57600); 00010 term.attach(&prerusVysielanie, Serial::RxIrq); 00011 00012 inicializuj(); 00013 sleduj_cas.attach(&watchdog, 1.4); 00014 sleduj_lcd.attach(&lcd_display,0.5); 00015 acc.MotionDetection(&nudzovaBrzda); 00016 00017 while(1) { 00018 tlacitkoStena(); 00019 tlacitkoVytah(); 00020 } 00021 } 00022 00023 /*****KOmunikacia******************************************************/ 00024 /*sekcia ktora riadi komunikaciu*/ 00025 00026 void posliSpravu(int addrRx, int addrTx,int dataSize, int aData[]) 00027 { 00028 00029 int aPacket[5+dataSize]; 00030 aPacket[0] = 0xA0; 00031 aPacket[1] = addrRx; 00032 aPacket[2] = addrTx; 00033 aPacket[3] = dataSize; 00034 00035 for(int i = 0; i < dataSize; i++){ 00036 aPacket[4+i] = aData[i]; 00037 } 00038 00039 int crc = getCrc(addrRx, addrTx, dataSize, aData); 00040 aPacket[4+dataSize] = crc; 00041 00042 00043 prijmi = 0; 00044 00045 for(int i = 0; i < ARRAY_SIZE(aPacket); i++){ 00046 term.putc(aPacket[i]); 00047 } 00048 } 00049 00050 int getCrc(int addrRx, int addrTx, int dataSize, int aData[]) 00051 { 00052 int aCRC[] = {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 00053 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 00054 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 00055 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 00056 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 00057 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 00058 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 00059 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 00060 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 00061 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 00062 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 00063 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 00064 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 00065 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 00066 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 00067 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 00068 }; 00069 int crc = 0; 00070 crc = aCRC[crc ^ addrRx]; 00071 crc = aCRC[crc ^ addrTx]; 00072 for(int i = 0; i < dataSize; i++){ 00073 crc = aCRC[crc ^ aData[i]]; 00074 } 00075 return crc; 00076 } 00077 00078 void inicializuj() 00079 { 00080 inicializacia = 1; 00081 resetuj_watchdog(); 00082 uvolniNB(); 00083 dole(); 00084 } 00085 00086 void prerusVysielanie() 00087 { 00088 00089 00090 prijmi = 1; 00091 for(int i = 0; i < 4; i++) { 00092 adresa[i] = term.getc(); 00093 } 00094 00095 00096 if(adresa[3] == 0x00) { 00097 sprava[0] = term.getc(); 00098 }else{ 00099 for(int i = 0; i < adresa[3]; i++){ 00100 sprava[i]=term.getc(); 00101 } 00102 adresa[4]=term.getc(); 00103 if(adresa[4] == getCrc(adresa[1], adresa[2],adresa[3],sprava)){ 00104 00105 } 00106 } 00107 00108 riadeniePohybu(); 00109 00110 00111 } 00112 /****Pohy**************************************************************************/ 00113 /***sekcia Pohybu******************************************************************/ 00114 00115 00116 00117 int dajPoziciu() 00118 { 00119 int pozicia; 00120 switch(adresa[2]){ 00121 case SWITCH_P:{ 00122 pozicia = SWITCH_P; 00123 cisloPochodia_dislpej = 0; 00124 break; 00125 } 00126 case SWITCH_1:{ 00127 pozicia = SWITCH_1; 00128 cisloPochodia_dislpej = 1; 00129 break; 00130 } 00131 case SWITCH_2:{ 00132 pozicia = SWITCH_2; 00133 cisloPochodia_dislpej = 2; 00134 break; 00135 } 00136 case SWITCH_3:{ 00137 pozicia = SWITCH_3; 00138 cisloPochodia_dislpej = 3; 00139 break; 00140 } 00141 case SWITCH_4:{ 00142 pozicia = SWITCH_4; 00143 cisloPochodia_dislpej = 4; 00144 break; 00145 } 00146 } 00147 return pozicia; 00148 } 00149 00150 void tlacitkoVytah() 00151 { 00152 if(prijmi == 1){ 00153 switch(adresa[2]){ 00154 case C_P_BUTTON:{ 00155 00156 p_0 = 1; 00157 init_kabina++; 00158 if(kere_poschodie > 0){ 00159 dole(); 00160 }else if(kere_poschodie < 0){ 00161 hore(); 00162 }else{ 00163 if(init_pohyb == 0){ 00164 p_0 = 0; 00165 00166 } 00167 } 00168 prijmi = 0; 00169 break; 00170 } 00171 case C_1_BUTTON:{ 00172 00173 p_1 = 1; 00174 init_kabina++; 00175 if(kere_poschodie > 1){ 00176 dole(); 00177 }else if(kere_poschodie < 1){ 00178 hore(); 00179 }else{ 00180 if(init_pohyb == 0){ 00181 p_1 = 0; 00182 00183 } 00184 } 00185 prijmi = 0; 00186 break; 00187 } 00188 case C_2_BUTTON:{ 00189 00190 p_2 = 1; 00191 init_kabina++; 00192 if(kere_poschodie > 2){ 00193 dole(); 00194 }else if(kere_poschodie < 2){ 00195 hore(); 00196 }else{ 00197 if(init_pohyb == 0){ 00198 p_2 = 0; 00199 00200 } 00201 } 00202 prijmi = 0; 00203 break; 00204 } 00205 case C_3_BUTTON:{ 00206 00207 p_3 = 1; 00208 init_kabina++; 00209 if(kere_poschodie > 3){ 00210 dole(); 00211 }else if(kere_poschodie < 3){ 00212 hore(); 00213 }else{ 00214 if(init_pohyb == 0){ 00215 p_3 = 0; 00216 00217 } 00218 } 00219 prijmi = 0; 00220 break; 00221 } 00222 case C_4_BUTTON:{ 00223 00224 p_4 = 1; 00225 init_kabina++; 00226 if(kere_poschodie > 4){ 00227 dole(); 00228 }else if(kere_poschodie < 4){ 00229 hore(); 00230 }else{ 00231 if(init_pohyb == 0){ 00232 p_4 = 0; 00233 00234 } 00235 } 00236 prijmi = 0; 00237 break; 00238 } 00239 } 00240 } 00241 } 00242 00243 void tlacitkoStena() 00244 { 00245 if(prijmi == 1){ 00246 switch(adresa[2]){ 00247 case W_P_BUTTON:{ 00248 00249 p_0 = 1; 00250 stena++; 00251 if(kere_poschodie > 0){ 00252 dole(); 00253 }else if(kere_poschodie < 0){ 00254 hore(); 00255 }else{ 00256 if(init_pohyb == 0){ 00257 p_0 = 0; 00258 00259 } 00260 } 00261 prijmi = 0; 00262 break; 00263 } 00264 case W_1_BUTTON:{ 00265 00266 p_1 = 1; 00267 stena++; 00268 if(kere_poschodie > 1){ 00269 dole(); 00270 }else if(kere_poschodie < 1){ 00271 hore(); 00272 }else{ 00273 if(init_pohyb == 0){ 00274 p_1 = 0; 00275 00276 } 00277 } 00278 prijmi = 0; 00279 break; 00280 } 00281 case W_2_BUTTON:{ 00282 00283 p_2 = 1; 00284 stena++; 00285 if(kere_poschodie > 2){ 00286 dole(); 00287 }else if(kere_poschodie < 2){ 00288 hore(); 00289 }else{ 00290 if(init_pohyb == 0){ 00291 p_2 = 0; 00292 00293 } 00294 } 00295 prijmi = 0; 00296 break; 00297 } 00298 case W_3_BUTTON:{ 00299 00300 p_3 = 1; 00301 stena++; 00302 if(kere_poschodie > 3){ 00303 dole(); 00304 }else if(kere_poschodie < 3){ 00305 hore(); 00306 }else{ 00307 if(init_pohyb == 0){ 00308 p_3 = 0; 00309 00310 } 00311 } 00312 prijmi = 0; 00313 break; 00314 } 00315 case W_4_BUTTON:{ 00316 00317 p_4 = 1; 00318 stena++; 00319 if(kere_poschodie > 4){ 00320 dole(); 00321 }else if(kere_poschodie < 4){ 00322 hore(); 00323 }else{ 00324 if(init_pohyb == 0){ 00325 p_4 = 0; 00326 00327 } 00328 } 00329 prijmi = 0; 00330 break; 00331 } 00332 } 00333 } 00334 } 00335 00336 void dockajNaPoschodi(){ 00337 dockaj++; 00338 if(dockaj > 5){ 00339 dockaj = 0; 00340 cakajNaPoschodi.detach(); 00341 pohniSa(); 00342 } 00343 } 00344 00345 void zamkni() 00346 { 00347 int aDataIn[] = {0x01}; 00348 int dataSize = ARRAY_SIZE(aDataIn); 00349 posliSpravu(C_LOCK,0x00,dataSize, aDataIn); 00350 } 00351 void unzamkni() 00352 { 00353 int aDataIn[] = {0x00}; 00354 int dataSize = ARRAY_SIZE(aDataIn); 00355 posliSpravu(C_LOCK,0x00,dataSize, aDataIn); 00356 } 00357 00358 void hore() 00359 { 00360 if(dockaj == 0){ 00361 pohyb++; 00362 if(init_pohyb == 0){ 00363 init_pohyb = 1; 00364 zamkni(); 00365 int aDataIn[] = {0x2, 0x64, 0x00, 0x00, 0x00}; 00366 int dataSize = ARRAY_SIZE(aDataIn); 00367 posliSpravu(MOTOR,0x00,dataSize, aDataIn); 00368 smer = 1; 00369 } 00370 if(pohyb > 2){ 00371 pohyb = 0; 00372 init_pohyb = 1; 00373 zamkni(); 00374 int aDataIn[] = {0x2, 0x64, 0x00, 0x00, 0x00}; 00375 int dataSize = ARRAY_SIZE(aDataIn); 00376 posliSpravu(MOTOR,0x00,dataSize, aDataIn); 00377 smer = 1; 00378 } 00379 } 00380 } 00381 00382 void dole() 00383 { 00384 if(dockaj == 0){ 00385 pohyb++; 00386 if(init_pohyb == 0){ 00387 init_pohyb = -1; 00388 zamkni(); 00389 int aDataIn[] = {0x2, 0x9C, 0xff, 0xff, 0xff}; 00390 int dataSize = ARRAY_SIZE(aDataIn); 00391 posliSpravu(MOTOR,0x00,dataSize, aDataIn); 00392 smer = -1; 00393 } 00394 if(pohyb > 2){ 00395 pohyb = 0; 00396 init_pohyb = -1; 00397 zamkni(); 00398 int aDataIn[] = {0x2, 0x9C, 0xff, 0xff, 0xff}; 00399 int dataSize = ARRAY_SIZE(aDataIn); 00400 posliSpravu(MOTOR,0x00,dataSize, aDataIn); 00401 smer = -1; 00402 } 00403 } 00404 } 00405 00406 void zastav() 00407 { 00408 if(dockaj == 0){ 00409 init_pohyb = 0; 00410 int aDataIn[] = {0x1}; 00411 int dataSize = ARRAY_SIZE(aDataIn); 00412 posliSpravu(MOTOR,0x00,dataSize, aDataIn); 00413 delayer.attach(&zamkni, 0.4); 00414 } 00415 } 00416 00417 00418 void pohniSa() 00419 { 00420 switch(kere_poschodie){ 00421 case 0:{ 00422 if (p_1 == 1 || p_2 == 1 || p_3 == 1 || p_4 == 1){ 00423 hore(); 00424 } 00425 break; 00426 } 00427 case 1:{ 00428 if(smer == -1){ 00429 if(p_0 == 1){ 00430 dole(); 00431 }else if (p_2 == 1 || p_3 == 1 || p_4 == 1){ 00432 hore(); 00433 } 00434 }else if(smer == 1){ 00435 if (p_2 == 1 || p_3 == 1 || p_4 == 1){ 00436 hore(); 00437 }else if(p_0 == 1){ 00438 dole(); 00439 } 00440 } 00441 break; 00442 } 00443 case 2:{ 00444 if(smer == -1){ 00445 if(p_0 == 1 || p_1 == 1){ 00446 dole(); 00447 }else if(p_3 == 1 || p_4 == 1){ 00448 hore(); 00449 } 00450 }else if(smer == 1){ 00451 if(p_3 == 1 || p_4 == 1){ 00452 hore(); 00453 }else if(p_0 == 1 || p_1 == 1){ 00454 dole(); 00455 } 00456 } 00457 break; 00458 } 00459 case 3:{ 00460 if(smer == -1){ 00461 if (p_0 == 1 || p_1 == 1 || p_2 == 1){ 00462 dole(); 00463 }else if(p_4 == 1){ 00464 hore(); 00465 } 00466 }else if(smer == 1){ 00467 if(p_4 == 1){ 00468 hore(); 00469 }else if(p_0 == 1 || p_1 == 1 || p_2 == 1){ 00470 dole(); 00471 } 00472 } 00473 break; 00474 } 00475 case 4:{ 00476 if(p_0 == 1 || p_1 == 1 || p_2 == 1 || p_3 == 1){ 00477 dole(); 00478 } 00479 break; 00480 } 00481 } 00482 } 00483 00484 00485 00486 void nudzovaBrzda() 00487 { 00488 int aDataIn[] = {0x01}; 00489 int dataSize = ARRAY_SIZE(aDataIn); 00490 posliSpravu(EM_BRAKE,0x00,dataSize, aDataIn); 00491 } 00492 00493 void uvolniNB() 00494 { 00495 int aDataIn[] = {0x00}; 00496 int dataSize = ARRAY_SIZE(aDataIn); 00497 posliSpravu(EM_BRAKE,0x00,dataSize, aDataIn); 00498 } 00499 00500 void lcd_display() 00501 { 00502 int aDataIn[2]; 00503 int dataSize = ARRAY_SIZE(aDataIn); 00504 switch(init_pohyb){ 00505 case 0:{ 00506 aDataIn[0] = 0x03; 00507 break; 00508 } 00509 case 1:{ 00510 aDataIn[0] = 0x01; 00511 break; 00512 } 00513 case -1:{ 00514 aDataIn[0] = 0x02; 00515 break; 00516 } 00517 } 00518 switch(cisloPochodia_dislpej){ 00519 case 0:{ 00520 aDataIn[1] = 0x50; 00521 break; 00522 } 00523 case 1:{ 00524 aDataIn[1] = 0x31; 00525 break; 00526 } 00527 case 2:{ 00528 aDataIn[1] = 0x32; 00529 break; 00530 } 00531 case 3:{ 00532 aDataIn[1] = 0x33; 00533 break; 00534 } 00535 case 4:{ 00536 aDataIn[1] = 0x34; 00537 break; 00538 } 00539 } 00540 if(cisloPochodia_dislpej != disp_poschodie){ 00541 posliSpravu(C_LCD,0x00,dataSize, aDataIn); 00542 }else if(init_pohyb != disp_poschodieSmer){ 00543 posliSpravu(C_LCD,0x00,dataSize, aDataIn); 00544 } 00545 disp_poschodie = cisloPochodia_dislpej; 00546 disp_poschodieSmer = init_pohyb; 00547 } 00548 00549 void riadeniePohybu() 00550 { 00551 if (dajPoziciu() != pozicia){ 00552 if(inicializacia == 1){ 00553 if(dajPoziciu() == SWITCH_P){ 00554 inicializacia = 0; 00555 zastav(); 00556 } 00557 }else{ 00558 if(smer == 1){ 00559 if(p_0 == 1){ 00560 if(dajPoziciu() == SWITCH_P){ 00561 zastav(); 00562 if(init_kabina > 0){ 00563 00564 init_kabina--; 00565 } 00566 if(stena > 0){ 00567 00568 stena--; 00569 } 00570 p_0 = 0; 00571 kere_poschodie = 0; 00572 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00573 } 00574 }else if(p_1 == 1){ 00575 if(dajPoziciu() == SWITCH_1){ 00576 zastav(); 00577 if(init_kabina > 0){ 00578 00579 init_kabina--; 00580 } 00581 if(stena > 0){ 00582 00583 stena--; 00584 } 00585 p_1 = 0; 00586 kere_poschodie = 1; 00587 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00588 } 00589 }else if(p_2 == 1){ 00590 if(dajPoziciu() == SWITCH_2){ 00591 zastav(); 00592 if(init_kabina > 0){ 00593 00594 init_kabina--; 00595 } 00596 if(stena > 0){ 00597 00598 stena--; 00599 } 00600 p_2 = 0; 00601 kere_poschodie = 2; 00602 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00603 } 00604 }else if(p_3 == 1){ 00605 if(dajPoziciu() == SWITCH_3){ 00606 zastav(); 00607 if(init_kabina > 0){ 00608 00609 init_kabina--; 00610 } 00611 if(stena > 0){ 00612 00613 stena--; 00614 } 00615 p_3 = 0; 00616 kere_poschodie = 3; 00617 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00618 } 00619 }else if(p_4 == 1){ 00620 if(dajPoziciu() == SWITCH_4){ 00621 zastav(); 00622 if(init_kabina > 0){ 00623 00624 init_kabina--; 00625 } 00626 if(stena > 0){ 00627 00628 stena--; 00629 } 00630 p_4 = 0; 00631 kere_poschodie = 4; 00632 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00633 } 00634 } 00635 }else if(smer == -1){ 00636 if(p_4 == 1){ 00637 if(dajPoziciu() == SWITCH_4){ 00638 zastav(); 00639 if(init_kabina > 0){ 00640 00641 init_kabina--; 00642 } 00643 if(stena > 0){ 00644 00645 stena--; 00646 } 00647 p_4 = 0; 00648 kere_poschodie = 4; 00649 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00650 } 00651 }else if(p_3 == 1){ 00652 if(dajPoziciu() == SWITCH_3){ 00653 zastav(); 00654 if(init_kabina > 0){ 00655 00656 init_kabina--; 00657 } 00658 if(stena > 0){ 00659 00660 stena--; 00661 } 00662 p_3 = 0; 00663 kere_poschodie = 3; 00664 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00665 } 00666 }else if(p_2 == 1){ 00667 if(dajPoziciu() == SWITCH_2){ 00668 zastav(); 00669 if(init_kabina > 0){ 00670 00671 init_kabina--; 00672 } 00673 if(stena > 0){ 00674 00675 stena--; 00676 } 00677 p_2 = 0; 00678 kere_poschodie = 2; 00679 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00680 } 00681 }else if(p_1 == 1){ 00682 if(dajPoziciu() == SWITCH_1){ 00683 zastav(); 00684 if(init_kabina > 0){ 00685 00686 init_kabina--; 00687 } 00688 if(stena > 0){ 00689 00690 stena--; 00691 } 00692 p_1 = 0; 00693 kere_poschodie = 1; 00694 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00695 } 00696 }else if(p_0 == 1){ 00697 if(dajPoziciu() == SWITCH_P){ 00698 zastav(); 00699 if(init_kabina > 0){ 00700 00701 init_kabina--; 00702 } 00703 if(stena > 0){ 00704 00705 stena--; 00706 } 00707 p_0 = 0; 00708 kere_poschodie = 0; 00709 cakajNaPoschodi.attach(&dockajNaPoschodi, 0.5); 00710 } 00711 } 00712 } 00713 } 00714 } 00715 pozicia = dajPoziciu(); 00716 } 00717 00718 void watchdog() 00719 { 00720 int aDataIn[] = {0x00}; 00721 int dataSize = ARRAY_SIZE(aDataIn); 00722 posliSpravu(WATCHDOG,0x00,dataSize, aDataIn); 00723 } 00724 00725 void resetuj_watchdog() 00726 { 00727 int aDataIn[] = {0x01}; 00728 int dataSize = ARRAY_SIZE(aDataIn); 00729 posliSpravu(WATCHDOG,0x00,dataSize, aDataIn); 00730 } 00731
Generated on Tue Jul 26 2022 01:07:32 by 1.7.2