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