control simulation of elevator

Dependencies:   mbed TSI

komunikacia.cpp

Committer:
kicin2
Date:
2019-01-23
Revision:
1:7dea46c9d8dc
Parent:
0:62c18ef61b61

File content as of revision 1:7dea46c9d8dc:

/**
*   @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
}