control simulation of elevator

Dependencies:   mbed TSI

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?

UserRevisionLine numberNew 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 }