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

Dependencies:   MMA8451Q mbed

main.cpp

Committer:
Ciesarik3
Date:
2018-01-07
Revision:
9:51cf1120b4f4
Parent:
8:9686195ddf1d
Child:
10:346a5a5936b9

File content as of revision 9:51cf1120b4f4:

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

Serial pc(USBTX, USBRX, 57600);

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

char crc8table[256] = {
    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
};

// crc [0xA0, prijem, odosielatel, vrlkost dat , data (256),crc]
//char odosli[5+sizeof(DATA)];
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();
    //dole();
while(true)
{
     //init_freeFall();
    rozhodni();
    if(freeFall_status()){
            zamkni();
            stop();
            myled=1;
            myled2=1;
            break;
            }
   /* for(int i=0;i<5;i++)
        if(diode_cislo[i]!=0)
        {
            if(i<stav){dole();break;}
            else {hore();break;}
        }
       */
/*
      if(cyklus<100)
        {
            rozhodni(buffer_kto[cyklus], buffer_co[cyklus]);
            cyklus++;
        }
    else
    {
       cyklus=0; 
       rozhodni(buffer_kto[cyklus], buffer_co[cyklus]);
       cyklus++; 
    }
*/
    
    /*stop();
    wait(1);
    hore();*/
}   
}

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

/*
    switch(stav)
    {
        case 5: dole(); break;
        case 4: 
            if(diode_cislo[4]==1)
         break;
        case 3: break;
        case 2: break;
        case 1: break;
        case 0: break;
        default: break;
    }*/
}
void vytahDisplay(int smer, int poschodie)
{
    char dPole [2];
    switch(smer)
    {
        
        case  0: dPole[0]=0xFF; break;
        case  1: dPole[0]=0x01; break;//hore
        case  2: dPole[0]=0x02; break;//dole
    }
    switch(poschodie)
    {
        case 0: dPole[1]=0x50; break;
        case 1: dPole[1]=0x31; break;
        case 2: dPole[1]=0x32; break;
        case 3: dPole[1]=0x33; break;
        case 4: dPole[1]=0x34; break;
        default:
                dPole[1]=0x2D;
    }

    poslemSpravu(DISPLAY, 0xcc, 0x02, dPole);
}


void zamkni()
{   
    
    char DATA[]= {0x01};
    poslemSpravu(VYTAH,0xcc,sizeof(DATA),DATA);
}

void odomkni()
{
    wait(1);
    char DATA[]= {0x00};
    poslemSpravu(VYTAH,0xcc,sizeof(DATA),DATA);
    wait(1);
}

void stop()
{
    char DATA[]= {0x01};
    poslemSpravu(MOTOR,0xcc,sizeof(DATA),DATA);
}

void hore()
{
    char DATA[]= {0x02,0x64,0x00,0x00,0x00};
    poslemSpravu(MOTOR,0xcc,sizeof(DATA),DATA);   
}

void dole()
{
    char DATA[]= {0x02,0x9c,0xff,0xff,0xff};
    poslemSpravu(MOTOR,0xcc,sizeof(DATA),DATA);
}

void prijmemSpravu()
{
    //pc.attach(&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;                                  
            }
        }    
    }
   // if(buff_index<100)
     //   {
            buffer_kto[buff_index]=prijemSpravy[2];
            buffer_co[buff_index]=prijemSpravy[4];
       //     buff_index++;
        /*}
    else
    {
       buff_index=0; 
       buffer_kto[buff_index]=prijemSpravy[2];
       buffer_co[buff_index]=prijemSpravy[4];
       buff_index++; 
    }*/
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();//}
            /*for (int kk=0;kk<5;kk++)
            {}*/
            if (diode_cislo[0]==1) pohyb(0);
            else 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;
        
        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[0]==1) pohyb(0);
            else 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;
        
        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();//}

            //vytahDisplay(2,2);

            if (diode_cislo[0]==1) pohyb(0);
            else 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;
        
        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[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;
        
        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[0]==1) pohyb(0);
            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;
        
        
        
        
        
        case 0xf: /* zachranna brzda */
            
        break;
        
        case 0xfe: /* watchdog */
            
        break;
        default: break;
    }  
    /*if(cyklus<100)
        {
            //rozhodni(buffer_kto[cyklus], buffer_co[cyklus]);
            cyklus++;
        }
    else
    {
       cyklus=0; 
       //rozhodni(buffer_kto[cyklus], buffer_co[cyklus]);
       //cyklus++; 
    }
*/ //pc.attach(&prijmemSpravu);
    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]);
    }

}