Semestrálna práca VÝTAH Roman Ciesarík

Dependencies:   MMA8451Q mbed

main.cpp

Committer:
Ciesarik3
Date:
2018-01-08
Revision:
11:a9918a8441a9
Parent:
10:346a5a5936b9

File content as of revision 11:a9918a8441a9:

#include "mbed.h"
#include "headre.h"
#include "FreeFall.h"

Serial pc(USBTX, USBRX, 57600);

int i;
unsigned int velkost;
char crc=0x00;

DigitalOut myled(LED3);
DigitalOut myled2(LED2);

char prijemSpravy[30];
char diode_DATA[]={0x00,0x01};
int diode_cislo[]={0,0,0,0,0};
int stav=5;
int poradie[]={0,0,0,0,0};

char buffer_kto[100];
char buffer_co[100];
int buff_index=0;
int cyklus=0;

int main()
{
    pc.attach(&prijmemSpravu);
    init_freeFall();
    
    while(true)
    {
        rozhodni();
        if(freeFall_status())
            {
                zamkni();
                stop();
                myled=1;
                myled2=1;
                break;
            }
    }   
}

void pohyb(int kam)
{
    zamkni();
    if (stav <kam) {hore();vytahDisplay(1,kam);}
    if (stav >kam) {dole();vytahDisplay(2,kam);}

}

void prijmemSpravu()
{
    myled=0; 

    for (int j=0;j<4;j++)
    {
        while(true)
        {
            if(pc.readable()==1)
            {
                prijemSpravy[j]=pc.getc(); 
                break;                                 
            }
        }    
    }
    
    int pom= prijemSpravy[3] + 1;
    
    for (int j=0;j<pom;j++)
    {
        while(true)
        {
            if(pc.readable()==1)
            {
                prijemSpravy[j+4]=pc.getc();
                break;                                  
            }
        }    
    }
    buffer_kto[buff_index]=prijemSpravy[2];
    buffer_co[buff_index]=prijemSpravy[4];
       
    myled=1; 
    pc.attach(&prijmemSpravu);
}

void rozhodni()
{ 
    myled2=0; 
    char bData=buffer_co[cyklus];
    switch(buffer_kto[cyklus])
    {
        case 0xb4: /* vytah tla4idlo 4 poschodie   */
            poslemSpravu(VYTAH_DIODA_4,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[4]=1; 
            pohyb(4);
        break;
        
        case 0xb3: /* vytah tla4idlo 3 poschodie   */
            poslemSpravu(VYTAH_DIODA_3,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[3]=1;
            pohyb(3);
        break;
        
        case 0xb2: /* vytah tla4idlo 2 poschodie   */
            poslemSpravu(VYTAH_DIODA_2,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[2]=1;
            pohyb(2);
        break;
        
        case 0xb1: /* vytah tla4idlo 1 poschodie   */
            poslemSpravu(VYTAH_DIODA_1,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[1]=1;
            pohyb(1);
        break;
        
        case 0xb0: /* vytah tla4idlo pr9zemie   */
            poslemSpravu(VYTAH_DIODA_P,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[0]=1;
            pohyb(0);
        break;
        
        case 0xc4: /* chodba tla4idlo 4 poschodie   */
            poslemSpravu(POSCHODIE_DIODA_4,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[4]=1;
            pohyb(4);
        break;
        
        case 0xc3: /* chodba tla4idlo 3 poschodie   */
            poslemSpravu(POSCHODIE_DIODA_3,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[3]=1;
            pohyb(3);
        break;
        
        case 0xc2: /* chodba tla4idlo 2 poschodie   */
            poslemSpravu(POSCHODIE_DIODA_2,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[2]=1;
            pohyb(2);
        break;
        
        case 0xc1: /* chodba tla4idlo 1 poschodie   */
            poslemSpravu(POSCHODIE_DIODA_1,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[1]=1;
            pohyb(1);
        break;
        
        case 0xc0: /* chodba tla4idlo pr9zemie   */
            poslemSpravu(POSCHODIE_DIODA_P,0xCC,0x01, &diode_DATA[1]);
            diode_cislo[0]=1;
            pohyb(0);
        break;
        
        
        
        
        case 0xe4: /* info pre odomknutie 4 poschodie   */
            if(bData==0x01&&diode_cislo[4]==1)
            {   
                stop();
                poslemSpravu(VYTAH_DIODA_4,0xCC,0x01, &diode_DATA[0]);
                poslemSpravu(POSCHODIE_DIODA_4,0xCC,0x01, &diode_DATA[0]);
                diode_cislo[4]=0;
                stav=4;
            }
            
            if(bData==0x02&&stav==4)
            {
                wait(1);
                odomkni();
            
                if (diode_cislo[3]==1) pohyb(0);
                else if (diode_cislo[2]==1) pohyb(1);
                else if (diode_cislo[1]==1) pohyb(2);
                else if (diode_cislo[0]==1) pohyb(3);
            }
        break;
        
        case 0xe3: /* info pre odomknutie 3 poschodie   */
            if(bData==0x01&&diode_cislo[3]==1)
            {
                stop();
                poslemSpravu(VYTAH_DIODA_3,0xCC,0x01, &diode_DATA[0]);
                poslemSpravu(POSCHODIE_DIODA_3,0xCC,0x01, &diode_DATA[0]);
                diode_cislo[3]=0;
                stav=3;
            }
            
            if(bData==0x02&&stav==3)
            {
                wait(1);
                odomkni();

                if (diode_cislo[4]==1) pohyb(0);
                else if (diode_cislo[2]==1) pohyb(1);
                else if (diode_cislo[1]==1) pohyb(2);
                else if (diode_cislo[0]==1) pohyb(4);
            }
        break;
        
        case 0xe2: /* info pre odomknutie 2 poschodie   */
            if(bData==0x01&&diode_cislo[2]==1)
            {
                stop();
                poslemSpravu(VYTAH_DIODA_2,0xCC,0x01, &diode_DATA[0]);
                poslemSpravu(POSCHODIE_DIODA_2,0xCC,0x01, &diode_DATA[0]);
                diode_cislo[2]=0;
                stav=2;
            }
            
            if(bData==0x02&&stav==2)
            {
                wait(1);
                odomkni();
        
                if (diode_cislo[0]==1) pohyb(0);
                else if (diode_cislo[1]==1) pohyb(1);
                else if (diode_cislo[3]==1) pohyb(3);
                else if (diode_cislo[4]==1) pohyb(4);
                }
        break;
        
        case 0xe1: /* info pre odomknutie 1 poschodie   */
            if(bData==0x01&&diode_cislo[1]==1)
            {
                stop();
                poslemSpravu(VYTAH_DIODA_1,0xCC,0x01, &diode_DATA[0]);
                poslemSpravu(POSCHODIE_DIODA_1,0xCC,0x01, &diode_DATA[0]);
                diode_cislo[1]=0;
                stav=1;
            }
            
            if(bData==0x02&&stav==1)
            {
                wait(1);
                odomkni();
        
                if (diode_cislo[0]==1) pohyb(0);
                else if (diode_cislo[2]==1) pohyb(2);
                else if (diode_cislo[3]==1) pohyb(3);
                else if (diode_cislo[4]==1) pohyb(4);
            }

        break;
        
        case 0xe0: /* info pre odomknutie prízemie   */
            if(bData==0x01&&diode_cislo[0]==1)
            {
                stop();
                poslemSpravu(VYTAH_DIODA_P,0xCC,0x01, &diode_DATA[0]);
                poslemSpravu(POSCHODIE_DIODA_P,0xCC,0x01, &diode_DATA[0]);
                diode_cislo[0]=0;
                stav=0;
            }
            
            if(bData==0x02&&stav==0)
            {
                wait(1);
                odomkni();
                
                if (diode_cislo[1]==1) pohyb(1);
                else if (diode_cislo[2]==1) pohyb(2);
                else if (diode_cislo[3]==1) pohyb(3);
                else if (diode_cislo[4]==1) pohyb(4);}
        break;

        default: break;
    }  
 
    myled=1; 
}

void poslemSpravu(char adrRX, char adrTX, int velkost, char DATA[] )
{
    crc=0x00;
    char odosli[5+velkost];
    odosli[0]=0xA0;
    odosli[1]=adrRX;
    odosli[2]=adrTX;
    odosli[3]=velkost;

    crc=crc8table[crc^adrRX];
    crc=crc8table[crc^adrTX];

    for (i=0; i<velkost; i++) 
    {
        odosli[4+i]=DATA[i];
    }

    for (i=0; i<velkost; i++) 
    {
        crc=crc8table[crc^DATA[i]];
    }

    odosli[velkost+4]=crc;

    for (i=0; i<velkost+5; i++) 
    {
        pc.putc(odosli[i]);
    }

}