skuska
Revision 0:7a5957039c5f, committed 2017-12-23
- Comitter:
- radovan
- Date:
- Sat Dec 23 14:20:57 2017 +0000
- Commit message:
- skuska
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 7a5957039c5f main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Dec 23 14:20:57 2017 +0000 @@ -0,0 +1,683 @@ +#include "mbed.h" +#include "MMA8451Q.h" + +#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) +PinName const SDA = PTE25; +PinName const SCL = PTE24; +#elif defined (TARGET_KL05Z) +PinName const SDA = PTB4; +PinName const SCL = PTB3; +#elif defined (TARGET_K20D50M) +PinName const SDA = PTB1; +PinName const SCL = PTB0; +#else +#error TARGET NOT DEFINED +#endif + +#define MMA8451_I2C_ADDRESS (0x1d<<1) +/////////////////////////////////////// +#define ELEVATOR_BUTTONf_FAMILY 0xc0 +#define DIODEf_FAMILY 0x10 +#define LIMIT_SWITCH_FAMILY 0xe0 +#define ELEVATOR_BUTTONc_FAMILY 0xb0 +#define DIODEc_FAMILY 0x20 + +#define ELEVATOR_CABIN 0xf0 +#define MOTOR 0xf1 +#define WATCHDOG_TIMER 0xfe + +#define INFORMATION_DISPLAY 0x30 +//crc pri mojej adrese 0xAA +#define CRC_LEDc2OFF 0xd2 +#define CRC_LEDc2ON 0x8c +#define CRC_LEDc3OFF 0x79 +#define CRC_LEDc3ON 0x27 +#define CRC_LEDc1OFF 0x36 +#define CRC_LEDc1ON 0x68 +#define CRC_LEDc0OFF 0x9d +#define CRC_LEDc0ON 0xc3 +#define CRC_LEDc4OFF 0x03 +#define CRC_LEDc4ON 0x5d + +#define CRC_ELElock 0xda +#define CRC_ELEunlock 0x84 + +#define CRC_MOTORdown 0xfc +#define CRC_MOTORstop 0x71 +#define CRC_MOTORup 0xf7 + +#define CRC_INFDd4 0x9a +#define CRC_INFDd3 0x19 +#define CRC_INFDd2 0x47 +#define CRC_INFDd1 0xa5 + +#define CRC_INFDn3 0xdd +#define CRC_INFDn4 0x5e +#define CRC_INFDn2 0x83 +#define CRC_INFDn1 0x61 +#define CRC_INFDn0 0x5a + +#define CRC_INFDu0 0xcb +#define CRC_INFDu1 0xf0 +#define CRC_INFDu2 0x12 +#define CRC_INFDu3 0x4c + +#define CRC_LEDf3OFF 0xa7 +#define CRC_LEDf3ON 0xf9 +#define CRC_LEDf4OFF 0xdd +#define CRC_LEDf4ON 0x83 +#define CRC_LEDf2OFF 0x0c +#define CRC_LEDf2ON 0x52 +#define CRC_LEDf1OFF 0xe8 +#define CRC_LEDf1ON 0xb6 +#define CRC_LEDf0OFF 0x43 +#define CRC_LEDf0ON 0x1d + +#define CRC_WATCHDOG 0x4f + +InterruptIn intin(PTA15); +MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); +Serial pc(USBTX, USBRX,57600); +char odpovedzac[4]; +char poziadavky[5]= {'N','N','N','N','N'}; +char poziciaVytahu=0x04; +char bufpole[200]; +int zb=0; +int kb=0; +char smerPohybu=0x03; +char aktualnePoschodie='4'; +unsigned char spravaVS[10]; + +void posli(int pokial); +void watchdogReset(); +/** +*void citaj() +*funkcia volana pri vzniknuti prerusenia pre citanie od serioveho portu +*do kruhoveho buffera "bufpole" nacita 1 znak. +*/ +void citaj() +{ + while(pc.readable()==1) { + bufpole[kb]=pc.getc(); + kb=(kb+1)%200; + } +} +/** +*void prerusenieACC() +*funkcia volana pri vzniknuti prerusenia od accelerometra +*posle simulatoru spravu pre zastavenie vytahu +*/ +void prerusenieACC() +{ + uint8_t datan[1]; + acc.readRegs(0x0C,datan,1); + + if((datan[0]&0x04)==0x04) { + acc.readRegs(0x16,datan,1); + char breakOn[6]= {0xA0,0xf,0xAA,0x01,0x01,0x08}; + //poslem spravu + for(int ind=0; ind<6; ind++) { + while(pc.writable()==0) {} + pc.putc(breakOn[ind]); + } + + } +} +/** +*void main() +*nastavuje akcelerometer pre vytvaranie prerusenia pre freefall +*spracovava v nekonecnej slucke spravy z kruhoveho buffera +*v pravidelnych intervaloch resetuje watchdog +*/ +int main() +{ + spravaVS[0]=0xA0;//zaciatok + spravaVS[2]=0xAA;//ja + + Timer timerReset; + + pc.attach(&citaj,pc.RxIrq); + timerReset.start(); + intin.fall(&prerusenieACC); + + uint8_t pomPole[2] = {0x2A, 0x20}; + acc.writeRegs(pomPole, 2); + + pomPole[0]=0x15; + pomPole[1]=0xB8; + acc.writeRegs(pomPole,2); + + pomPole[0]=0x17; + pomPole[1]=0x03; + acc.writeRegs(pomPole,2); + + pomPole[0]=0x18; + pomPole[1]=0x06; + acc.writeRegs(pomPole,2); + + pomPole[0]=0x2D; + pomPole[1]=0x04; + acc.writeRegs(pomPole,2); + + pomPole[0]=0x2E; + pomPole[1]=0x00; + acc.writeRegs(pomPole,2); + + uint8_t data[1]; + acc.readRegs(0x2A,data,1); + data[0]=data[0]| 0x01; + + pomPole[0]=0x2A; + pomPole[1]=data[0]; + acc.writeRegs(pomPole,2); + + watchdogReset(); + int cas=timerReset.read_ms(); + while(true) { + + int pocetdat=0; + if(zb<=kb) { + pocetdat=kb-zb; + } else { + pocetdat=(199-zb)+1+kb; + } + + if(pocetdat>4&&pocetdat>=4+bufpole[zb+3]+1) {//spracuvavam spravu + odpovedzac[0]=bufpole[zb]; + zb=(zb+1)%200; + + odpovedzac[1]=bufpole[zb]; + zb=(zb+1)%200; + + odpovedzac[2]=bufpole[zb]; + zb=(zb+1)%200; + + odpovedzac[3]=bufpole[zb]; + + int v=odpovedzac[3]+1; + char data; + for(int ind=0; ind<v; ind++) { + zb=(zb+1)%200; + if(ind==0) { + data= bufpole[zb]; + } + } + zb=(zb+1)%200; + + char rodina=(odpovedzac[2]&0xf0); + char jedinec=(odpovedzac[2]&0x0f); + watchdogReset(); + + if(rodina==ELEVATOR_BUTTONf_FAMILY) { + + if(poziadavky[0]=='N'&&jedinec!=poziciaVytahu) { + + poziadavky[0]=jedinec;//ulozim na ktore poschodie ma vytah ist + //svietim diodu na poschodi + spravaVS[1]=DIODEf_FAMILY|jedinec;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x01;//data + + if(jedinec==0x04) { + spravaVS[5]=CRC_LEDf4ON; + } else if(jedinec==0x03) { + spravaVS[5]=CRC_LEDf3ON; + } else if(jedinec==0x02) { + spravaVS[5]=CRC_LEDf2ON; + } else if(jedinec==0x01) { + spravaVS[5]=CRC_LEDf1ON; + } else { + spravaVS[5]=CRC_LEDf0ON; + } + posli(6); + + //zamykam vytah + spravaVS[1]=ELEVATOR_CABIN;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x01;//data + spravaVS[5]=CRC_ELElock; + posli(6); + + //uved motor do pohybu + spravaVS[1]=MOTOR;//prijimatel + spravaVS[3]=5;//pocet dat + spravaVS[4]=0x2;//pohni vytah + + if(poziadavky[0]>poziciaVytahu) { + smerPohybu=0x01; + spravaVS[5]=0x64; + spravaVS[6]=0x00; + spravaVS[7]=0x00; + spravaVS[8]=0x00; + spravaVS[9]=CRC_MOTORup; + } else { + smerPohybu=0x02; + spravaVS[5]=0x9C; + spravaVS[6]=0xFF; + spravaVS[7]=0xFF; + spravaVS[8]=0xFF; + spravaVS[9]=CRC_MOTORdown; + } + posli(10); + + //zobrazenie pohybu + spravaVS[1]=INFORMATION_DISPLAY;//prijimatel + spravaVS[3]=2;//pocet dat + spravaVS[4]=smerPohybu;//data + spravaVS[5]=aktualnePoschodie;//data + + if(smerPohybu==0x02) { //smer pohybu dole + if(aktualnePoschodie=='4') { + spravaVS[6]=CRC_INFDd4; + } else if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDd3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDd2; + } else { + spravaVS[6]=CRC_INFDd1; + } + } else {//smer pohybu hore + if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDu3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDu2; + } else if(aktualnePoschodie=='1') { + spravaVS[6]=CRC_INFDu1; + } else { + spravaVS[6]=CRC_INFDu0; + } + } + posli(7); + + }//if poziadavky[0]=='N'&&poziadavky[0]!=poziciaVytahu + + } else if(rodina==ELEVATOR_BUTTONc_FAMILY) { + + //ak bolo stlacene tlacidlo na inom poschodi ako akualnom a tato poziadavka este nie je v poli + if(poziciaVytahu!=jedinec) { + char pom=0x00; + char pohni=0x00; + for(int i=0; i<5; i++) { + if(poziadavky[i]==jedinec) { + pom=0x01; + } + if(poziadavky[i]=='N'&&pom==0x00) { + poziadavky[i]=jedinec; + pom=0x02; + if(i==0) { + pohni=0x03; + } + break; + } + } + if(pom==0x02) { + //zasvieti diodu vnutri vytahu + spravaVS[1]=DIODEc_FAMILY|jedinec;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x01;//data + + if(jedinec==0x04) { + spravaVS[5]=CRC_LEDc4ON; + } else if(jedinec==0x03) { + spravaVS[5]=CRC_LEDc3ON; + } else if(jedinec==0x02) { + spravaVS[5]=CRC_LEDc2ON; + } else if(jedinec==0x01) { + spravaVS[5]=CRC_LEDc1ON; + } else { + spravaVS[5]=CRC_LEDc0ON; + } + posli(6); + + } + + if(pohni==0x03) { + //uzamknutie vytahu + spravaVS[1]=ELEVATOR_CABIN;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x01;//data + spravaVS[5]=CRC_ELElock; + posli(6); + + //uved motor do pohybu + spravaVS[1]=MOTOR;//prijimatel + spravaVS[3]=5;//pocet dat + spravaVS[4]=0x2;//data + + if(poziadavky[0]>poziciaVytahu) { + smerPohybu=0x01; + spravaVS[5]=0x64; + spravaVS[6]=0x00; + spravaVS[7]=0x00; + spravaVS[8]=0x00; + spravaVS[9]=CRC_MOTORup; + + } else { + smerPohybu=0x02; + spravaVS[5]=0x9C; + spravaVS[6]=0xFF; + spravaVS[7]=0xFF; + spravaVS[8]=0xFF; + spravaVS[9]=CRC_MOTORdown; + } + posli(10); + + //zobrazenie pohybu + spravaVS[1]=INFORMATION_DISPLAY;//prijimatel + spravaVS[3]=2;//pocet dat + spravaVS[4]=smerPohybu;//data + spravaVS[5]=aktualnePoschodie;//data + + if(smerPohybu==0x02) { //smer pohybu dole + if(aktualnePoschodie=='4') { + spravaVS[6]=CRC_INFDd4; + } else if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDd3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDd2; + } else { + spravaVS[6]=CRC_INFDd1; + } + } else {//smer pohybu hore + if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDu3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDu2; + } else if(aktualnePoschodie=='1') { + spravaVS[6]=CRC_INFDu1; + } else { + spravaVS[6]=CRC_INFDu0; + } + } + posli(7); + } + } + + } else if(rodina==LIMIT_SWITCH_FAMILY) { + + if(data==0x01&&poziadavky[0]==jedinec) { //dalej od switchu + //zastavenie vytahu + spravaVS[1]=MOTOR;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x1;//data + spravaVS[5]=CRC_MOTORstop; + posli(6); + + } else if(data==0x02&&poziadavky[0]==jedinec) { //blizko pri switchi spravne poschodie + //posunutie poziadaviek + for(int i=0; i<4; i++) { + poziadavky[i]=poziadavky[i+1]; + } + poziadavky[4]='N'; + poziciaVytahu=jedinec; + //odomknutie vytahu + spravaVS[1]=ELEVATOR_CABIN;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x00;//data + spravaVS[5]=CRC_ELEunlock; + posli(6); + + //zhasnutie diody na poschodi + spravaVS[1]=DIODEf_FAMILY|jedinec;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x00;//data + + if(jedinec==0x04) { + spravaVS[5]=CRC_LEDf4OFF; + } else if(jedinec==0x03) { + spravaVS[5]=CRC_LEDf3OFF; + } else if(jedinec==0x02) { + spravaVS[5]=CRC_LEDf2OFF; + } else if(jedinec==0x01) { + spravaVS[5]=CRC_LEDf1OFF; + } else { + spravaVS[5]=CRC_LEDf0OFF; + } + + posli(6); + + //zhasne diodu vnutri vytahu + spravaVS[1]=DIODEc_FAMILY|jedinec;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x00;//data + + if(jedinec==0x04) { + spravaVS[5]=CRC_LEDc4OFF; + aktualnePoschodie='4'; + } else if(jedinec==0x03) { + spravaVS[5]=CRC_LEDc3OFF; + aktualnePoschodie='3'; + } else if(jedinec==0x02) { + spravaVS[5]=CRC_LEDc2OFF; + aktualnePoschodie='2'; + } else if(jedinec==0x01) { + spravaVS[5]=CRC_LEDc1OFF; + aktualnePoschodie='1'; + } else { + spravaVS[5]=CRC_LEDc0OFF; + aktualnePoschodie='P'; + } + + posli(6); + + smerPohybu=0x03; + //zobrazenie pohybu + spravaVS[1]=INFORMATION_DISPLAY;//prijimatel + spravaVS[3]=2;//pocet dat + spravaVS[4]=smerPohybu;//data + spravaVS[5]=aktualnePoschodie;//data + + if(jedinec==0x04) { + spravaVS[6]=CRC_INFDn4; + } else if(jedinec==0x03) { + spravaVS[6]=CRC_INFDn3; + } else if(jedinec==0x02) { + spravaVS[6]=CRC_INFDn2; + } else if(jedinec==0x01) { + spravaVS[6]=CRC_INFDn1; + } else { + spravaVS[6]=CRC_INFDn0; + } + posli(7); + watchdogReset(); + + //cakam vzdy po zastaveni vytahu + int zac; + Timer cakaj; + for(int t=0; t<=10; t++) { + cakaj.start(); + zac=cakaj.read_ms(); + while(true) { + if((cakaj.read_ms()-zac)>=500) { + watchdogReset(); + break; + } + } + + cakaj.stop(); + cakaj.reset(); + } + + if(poziadavky[0]!='N') { //ak este mam niekde ist tak spustim vytah + + //uzamknutie vytahu + spravaVS[1]=ELEVATOR_CABIN;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x01;//data + spravaVS[5]=CRC_ELElock; + posli(6); + + //uved motor do pohybu + spravaVS[1]=MOTOR;//prijimatel + spravaVS[3]=5;//pocet dat + spravaVS[4]=0x2;//data + + if(poziadavky[0]>poziciaVytahu) { + smerPohybu=0x01; + spravaVS[5]=0x64; + spravaVS[6]=0x00; + spravaVS[7]=0x00; + spravaVS[8]=0x00; + spravaVS[9]=CRC_MOTORup; + + } else { + smerPohybu=0x02; + spravaVS[5]=0x9C; + spravaVS[6]=0xFF; + spravaVS[7]=0xFF; + spravaVS[8]=0xFF; + spravaVS[9]=CRC_MOTORdown; + } + posli(10); + + //zobrazenie pohybu + spravaVS[1]=INFORMATION_DISPLAY;//prijimatel + spravaVS[3]=2;//pocet dat + spravaVS[4]=smerPohybu;//data + spravaVS[5]=aktualnePoschodie;//data + + if(smerPohybu==0x02) { //smer pohybu dole + if(aktualnePoschodie=='4') { + spravaVS[6]=CRC_INFDd4; + } else if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDd3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDd2; + } else { + spravaVS[6]=CRC_INFDd1; + } + } else {//smer pohybu hore + if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDu3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDu2; + } else if(aktualnePoschodie=='1') { + spravaVS[6]=CRC_INFDu1; + } else { + spravaVS[6]=CRC_INFDu0; + } + } + posli(7); + } + + } else if(data==0x02&&poziadavky[0]!=jedinec) {//blizko ale nezastavujem + + if(jedinec==0x04) { + aktualnePoschodie='4'; + } else if(jedinec==0x03) { + aktualnePoschodie='3'; + } else if(jedinec==0x02) { + aktualnePoschodie='2'; + } else if(jedinec==0x01) { + aktualnePoschodie='1'; + } else { + aktualnePoschodie='P'; + } + + //zobrazenie pohybu + spravaVS[1]=INFORMATION_DISPLAY;//prijimatel + spravaVS[3]=2;//pocet dat + spravaVS[4]=smerPohybu;//data + spravaVS[5]=aktualnePoschodie;//data + + if(smerPohybu==0x02) { //smer pohybu dole + if(aktualnePoschodie=='4') { + spravaVS[6]=CRC_INFDd4; + } else if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDd3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDd2; + } else { + spravaVS[6]=CRC_INFDd1; + } + } else {//smer pohybu hore + if(aktualnePoschodie=='3') { + spravaVS[6]=CRC_INFDu3; + } else if(aktualnePoschodie=='2') { + spravaVS[6]=CRC_INFDu2; + } else if(aktualnePoschodie=='1') { + spravaVS[6]=CRC_INFDu1; + } else { + spravaVS[6]=CRC_INFDu0; + } + } + posli(7); + } + }//LIMIT_SWITCH_FAMILY + }//sprava dostatocne velka + if((timerReset.read_ms()-cas)>=600) { + watchdogReset(); + cas=timerReset.read_ms(); + } + }//while true +}//main +/** +*void posli() +*posle spravu z pola spravaVS pokial nedostane potvrdzujucu odpoved do 200ms posiela spravu znova +*@param <pokial> pocet znakov na odoslanie +*/ +void posli(int pokial) +{ + Timer timer; + int potvrdenie=0; + timer.start(); + while(potvrdenie==0) { + //poslem spravu + for(int ind=0; ind<pokial; ind++) { + while(pc.writable()==0) {} + pc.putc(spravaVS[ind]); + } + int pocdat=0; + int begin=timer.read_ms(); + while((timer.read_ms()-begin)<200) { + if(zb<=kb) { + pocdat=kb-zb; + } else { + pocdat=200-zb+kb; + } + char prerus=0x00; + for(int t=0; t<=pocdat-5; t++) { + if(bufpole[(zb+t)%200]==0xA0&&bufpole[(zb+t+3)%200]==0x00) { + int k=(zb+t-1)%200;//index dat od ktoreho treba zacat presuvat + if(t==0) { + zb=(zb+5)%200; + prerus=0x01; + break; + } + while(true) { + bufpole[(k+5)%200]=bufpole[k]; + if(k==zb) { + zb=(zb+5)%200; + break; + } + k--; + if(k<0) { + k=199; + } + }//while + prerus=0x01; + break; + } //if + }//for + if(prerus==0x01) { + potvrdenie=1; + break; + } + }//while timer + }//while potvrdenie==0 + timer.stop(); + timer.reset(); + +}//koniec posli +/* +*void watchdogReset() +*psole spravu pre resetovanie watchdogu caka na potvrdenie +*/ +void watchdogReset() +{ + spravaVS[1]=WATCHDOG_TIMER;//prijimatel + spravaVS[3]=1;//pocet dat + spravaVS[4]=0x05;//data + spravaVS[5]=CRC_WATCHDOG;//data + posli(6); +} \ No newline at end of file