
control simulation of elevator
komunikacia.cpp@1:7dea46c9d8dc, 2019-01-23 (annotated)
- Committer:
- kicin2
- Date:
- Wed Jan 23 23:52:27 2019 +0000
- Revision:
- 1:7dea46c9d8dc
- Parent:
- 0:62c18ef61b61
version 1.0.2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kicin2 | 0:62c18ef61b61 | 1 | /** |
kicin2 | 0:62c18ef61b61 | 2 | * @file komunikacia.cpp |
kicin2 | 0:62c18ef61b61 | 3 | * @brief Súbor obsahuje funkcie pre základnú komunikáciu medzi výťahom a vývojovou doskou |
kicin2 | 0:62c18ef61b61 | 4 | * @author Benedikt Kicin |
kicin2 | 0:62c18ef61b61 | 5 | * @date 21.1.2018 |
kicin2 | 0:62c18ef61b61 | 6 | */ |
kicin2 | 0:62c18ef61b61 | 7 | |
kicin2 | 0:62c18ef61b61 | 8 | #include <stdio.h> |
kicin2 | 0:62c18ef61b61 | 9 | #include "mbed.h" |
kicin2 | 0:62c18ef61b61 | 10 | #include "ovladanie.h" |
kicin2 | 0:62c18ef61b61 | 11 | |
kicin2 | 0:62c18ef61b61 | 12 | int *packet; |
kicin2 | 0:62c18ef61b61 | 13 | int packetOK; |
kicin2 | 0:62c18ef61b61 | 14 | Serial pc(USBTX, USBRX); |
kicin2 | 0:62c18ef61b61 | 15 | |
kicin2 | 0:62c18ef61b61 | 16 | DigitalOut rLed(LED1); |
kicin2 | 0:62c18ef61b61 | 17 | DigitalOut gLed(LED2); |
kicin2 | 0:62c18ef61b61 | 18 | DigitalOut bLed(LED3); |
kicin2 | 0:62c18ef61b61 | 19 | |
kicin2 | 0:62c18ef61b61 | 20 | /** |
kicin2 | 0:62c18ef61b61 | 21 | * Pole CRC hodnôt pre CRC8 |
kicin2 | 0:62c18ef61b61 | 22 | */ |
kicin2 | 0:62c18ef61b61 | 23 | int arr[] = {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, |
kicin2 | 0:62c18ef61b61 | 24 | 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, |
kicin2 | 0:62c18ef61b61 | 25 | 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, |
kicin2 | 0:62c18ef61b61 | 26 | 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, |
kicin2 | 0:62c18ef61b61 | 27 | 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, |
kicin2 | 0:62c18ef61b61 | 28 | 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, |
kicin2 | 0:62c18ef61b61 | 29 | 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, |
kicin2 | 0:62c18ef61b61 | 30 | 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, |
kicin2 | 0:62c18ef61b61 | 31 | 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, |
kicin2 | 0:62c18ef61b61 | 32 | 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, |
kicin2 | 0:62c18ef61b61 | 33 | 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, |
kicin2 | 0:62c18ef61b61 | 34 | 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, |
kicin2 | 0:62c18ef61b61 | 35 | 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, |
kicin2 | 0:62c18ef61b61 | 36 | 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, |
kicin2 | 0:62c18ef61b61 | 37 | 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, |
kicin2 | 0:62c18ef61b61 | 38 | 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 |
kicin2 | 0:62c18ef61b61 | 39 | }; |
kicin2 | 0:62c18ef61b61 | 40 | |
kicin2 | 0:62c18ef61b61 | 41 | /** |
kicin2 | 0:62c18ef61b61 | 42 | * Funkcia ktorá vypočítava CRC8(kontrolný súčet) z prijatých dát |
kicin2 | 0:62c18ef61b61 | 43 | * @param newPacket - pole dát, z ktorého sa vyčítajú jednotlivé, potrebné dáta |
kicin2 | 0:62c18ef61b61 | 44 | * @param sizeOfPacket - veľkosť prijatého poľa dát paketu |
kicin2 | 0:62c18ef61b61 | 45 | */ |
kicin2 | 0:62c18ef61b61 | 46 | //paket(startBit, receiveP, sendP, sizeData, data, CRC) |
kicin2 | 0:62c18ef61b61 | 47 | //crc(receive, send, data) |
kicin2 | 0:62c18ef61b61 | 48 | int crc(int newPacket[],int sizeOfPacket) //nacitanie celeho paketu a jeho dlzky |
kicin2 | 0:62c18ef61b61 | 49 | { |
kicin2 | 0:62c18ef61b61 | 50 | int sizeData = newPacket[3]; //velkost dat, paket o velkosti pola 4 |
kicin2 | 0:62c18ef61b61 | 51 | int messg[sizeData+2]; |
kicin2 | 0:62c18ef61b61 | 52 | int j=0; |
kicin2 | 0:62c18ef61b61 | 53 | for (int i=0; i<sizeOfPacket; i++) { |
kicin2 | 0:62c18ef61b61 | 54 | if ( i == 1 || i== 2 || (i>3 && i<= 3+sizeData)) { |
kicin2 | 0:62c18ef61b61 | 55 | messg[j]=newPacket[i]; |
kicin2 | 0:62c18ef61b61 | 56 | j++; |
kicin2 | 0:62c18ef61b61 | 57 | } |
kicin2 | 0:62c18ef61b61 | 58 | } |
kicin2 | 0:62c18ef61b61 | 59 | int n =0; |
kicin2 | 0:62c18ef61b61 | 60 | int crc =0; |
kicin2 | 0:62c18ef61b61 | 61 | int pom = sizeof(messg)/sizeof(messg[0]); |
kicin2 | 0:62c18ef61b61 | 62 | |
kicin2 | 0:62c18ef61b61 | 63 | for (int i =0; i< pom; i++) { |
kicin2 | 0:62c18ef61b61 | 64 | n = messg[i]; |
kicin2 | 0:62c18ef61b61 | 65 | crc = arr[crc ^ n]; |
kicin2 | 0:62c18ef61b61 | 66 | n++; |
kicin2 | 0:62c18ef61b61 | 67 | } |
kicin2 | 0:62c18ef61b61 | 68 | return crc; |
kicin2 | 0:62c18ef61b61 | 69 | } |
kicin2 | 0:62c18ef61b61 | 70 | |
kicin2 | 0:62c18ef61b61 | 71 | /** |
kicin2 | 0:62c18ef61b61 | 72 | * Funkcia ktorá odošle paket simulátoru |
kicin2 | 0:62c18ef61b61 | 73 | * @param newPacket Paket - pole dát, ktoré sa odošlú |
kicin2 | 0:62c18ef61b61 | 74 | */ |
kicin2 | 0:62c18ef61b61 | 75 | void sendTo(int* newPacket) |
kicin2 | 0:62c18ef61b61 | 76 | { |
kicin2 | 0:62c18ef61b61 | 77 | if(newPacket[0]== 0xA0 && newPacket[2] == 0x00) { //0xA0 - doska; 0x00 - vytah |
kicin2 | 0:62c18ef61b61 | 78 | int sizeOfPacket = newPacket[3]+4; //4+1 velkost |
kicin2 | 0:62c18ef61b61 | 79 | int crcDat = crc(newPacket, sizeOfPacket); |
kicin2 | 0:62c18ef61b61 | 80 | for (int i=0; i<sizeOfPacket; i++) { |
kicin2 | 0:62c18ef61b61 | 81 | pc.putc(newPacket[i]); |
kicin2 | 0:62c18ef61b61 | 82 | } |
kicin2 | 0:62c18ef61b61 | 83 | pc.putc(crcDat); //prida jedno pole nakoniec paketu pre crc kod |
kicin2 | 0:62c18ef61b61 | 84 | } |
kicin2 | 0:62c18ef61b61 | 85 | } |
kicin2 | 0:62c18ef61b61 | 86 | |
kicin2 | 0:62c18ef61b61 | 87 | /** |
kicin2 | 0:62c18ef61b61 | 88 | * Funkcia ktorá prijíme paket zo simulátora |
kicin2 | 0:62c18ef61b61 | 89 | */ |
kicin2 | 0:62c18ef61b61 | 90 | void receiveFrom(void) |
kicin2 | 0:62c18ef61b61 | 91 | { |
kicin2 | 0:62c18ef61b61 | 92 | int pomArr[4]; |
kicin2 | 0:62c18ef61b61 | 93 | for (int i=0; i<=3; i++) { |
kicin2 | 0:62c18ef61b61 | 94 | pomArr[i]=pc.getc(); //do pomocneho pola si ulozime data o pakete okrem crc |
kicin2 | 0:62c18ef61b61 | 95 | } |
kicin2 | 0:62c18ef61b61 | 96 | if (pomArr[0] == 0xA0) { //ak som odosielatelom ja (resp. doska) |
kicin2 | 0:62c18ef61b61 | 97 | int sizePaket = pomArr[3] + 4; //s crc ak je 5 //inak 4 -> cely paket bez CRC-cka |
kicin2 | 0:62c18ef61b61 | 98 | int pomArr2[sizePaket]; |
kicin2 | 0:62c18ef61b61 | 99 | for (i=0; i<=sizePaket; i++) { |
kicin2 | 0:62c18ef61b61 | 100 | if(i<=3) { |
kicin2 | 0:62c18ef61b61 | 101 | pomArr2[i]=pomArr[i]; |
kicin2 | 0:62c18ef61b61 | 102 | } else { |
kicin2 | 0:62c18ef61b61 | 103 | pomArr2[i]= pc.getc(); |
kicin2 | 0:62c18ef61b61 | 104 | } |
kicin2 | 0:62c18ef61b61 | 105 | } |
kicin2 | 0:62c18ef61b61 | 106 | //bLed=0; |
kicin2 | 0:62c18ef61b61 | 107 | // kontrola spravneho prijatia - ci som prijemca, data nie su prazdne, rovna sa crc (crc je zhohne) |
kicin2 | 0:62c18ef61b61 | 108 | if (pomArr2[1] == 0x00 && pomArr2[4] != 0 && pomArr2[sizePaket] == crc(pomArr2,sizePaket)) { |
kicin2 | 0:62c18ef61b61 | 109 | //rLed=0; |
kicin2 | 0:62c18ef61b61 | 110 | packet = new int[sizePaket]; //ak je velkost pola mensia ako potrebujeme, zvacsi sa |
kicin2 | 0:62c18ef61b61 | 111 | for (i=0; i<sizePaket; i++) { |
kicin2 | 0:62c18ef61b61 | 112 | packet[i]=pomArr2[i]; |
kicin2 | 0:62c18ef61b61 | 113 | } |
kicin2 | 0:62c18ef61b61 | 114 | packetOK = 1; //celkova kontrola paketu prebehla ok |
kicin2 | 0:62c18ef61b61 | 115 | } |
kicin2 | 0:62c18ef61b61 | 116 | *pomArr2=0; //vycistime si pomocne pole2 |
kicin2 | 0:62c18ef61b61 | 117 | } |
kicin2 | 0:62c18ef61b61 | 118 | } |
kicin2 | 0:62c18ef61b61 | 119 | |
kicin2 | 0:62c18ef61b61 | 120 | /** |
kicin2 | 0:62c18ef61b61 | 121 | * Funkcia ktorá zhasne LED diódy, inicializuje prenosovú rýchlosť |
kicin2 | 0:62c18ef61b61 | 122 | * nastaví prerušenie na príjem znaku |
kicin2 | 0:62c18ef61b61 | 123 | */ |
kicin2 | 0:62c18ef61b61 | 124 | void commIrq() |
kicin2 | 0:62c18ef61b61 | 125 | { |
kicin2 | 0:62c18ef61b61 | 126 | rLed = 1; |
kicin2 | 0:62c18ef61b61 | 127 | bLed = 1; |
kicin2 | 0:62c18ef61b61 | 128 | gLed = 1; |
kicin2 | 0:62c18ef61b61 | 129 | pc.baud(57600); |
kicin2 | 0:62c18ef61b61 | 130 | pc.attach(&receiveFrom, Serial::RxIrq); //prerusenie |
kicin2 | 0:62c18ef61b61 | 131 | } |