![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
New xbee sent protocol
Dependencies: mbed C12832 XBee
main.cpp
- Committer:
- nnoitre
- Date:
- 2016-03-23
- Revision:
- 3:a7a7dc5e687f
- Parent:
- 2:2bf280435a91
- Child:
- 4:ccfba1cbb448
File content as of revision 3:a7a7dc5e687f:
#include "mbed.h" #include "C12832.h" #include "XBee.h" DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); InterruptIn down(p12); InterruptIn left(p13); InterruptIn up(p15); InterruptIn right(p16); Serial xbee(p9,p10); C12832 lcd(p5, p7, p6, p8, p11); //Used for the LCD char Source=0b00000010; //ID hardcoden char Des=0b00000001; char Item,Status,Checksum; int i; bool sending=1; char control[6]; int teller; Timer t; //methode om te verzenden void send(){ xbee.putc(0x7E); //beginflag xbee.putc(Source); //waarvan wordt er verzonden xbee.putc(Des); //naar waar wordt er verzonden xbee.putc(Item); //over welke knop gaat het xbee.putc(Status); //wat is de nieuwe status van de knop xbee.putc(Checksum);//controle van het bericht xbee.putc(0x7E); //eindflag } //methode als de joystick omhoog komt void CalChecksumup(){ Status=0b00000000; //status op "omhoog zetten" myled1=1; lcd.cls(); lcd.locate(0,3); if(up.read()&&!left.read()&&!right.read()){ //als de joystick enkel omhoog staat lcd.printf("up"); Item=0b00000000; //item wordt joystick 0° } if(up.read()&&right.read()){ //als de joystick enkel rechtsomhoog staat lcd.printf("upright"); Item=0b00000001; //item wordt joystick 45° } if(right.read()&&!up.read()&&!down.read()){ //als de joystick rechts staat lcd.printf("right"); Item=0b00000010; //item wordt joystick 90° } if(down.read()&&right.read()){ //als de joystick rechtsomlaag staat lcd.printf("downright"); Item=0b00000011; //item wordt joystick 135° } if(down.read()&&!left.read()&&!right.read()){//als de joystick omlaag staat lcd.printf("down"); Item=0b00000100; //item wordt joystick 180° } if(down.read()&&left.read()){ //als joystick linkomlaag staat lcd.printf("downleft"); Item=0b00000101; //item wordt joystick 225° } if(left.read()&&!up.read()&&!down.read()){ //als joystick link staat lcd.printf("left"); Item=0b00000110; //item wordt joystick 270° } if(up.read()&&left.read()){ //als joystick linksomhoog staat lcd.printf("upleft"); Item=0b00000111; //item wordt joystick 315° } Checksum=(Source+Des+Item+Status)%255; //de checksum wordt berekend sending=0; //sending wordt op nul gezet zodat de xbee kan lezen send(); //de methode send wordt aangeroepen t.start(); //een timer wordt gestart } //methode als de joystick terug losgelaten worden void CalChecksumdown(){ Status=0b00000001; //status wordt op omlaag gezet myled1=0; lcd.cls(); lcd.locate(0,3); if(Item==0b00000000){ //als de joystick omhoog stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000000; } if(Item==0b00000001){ //als de joystick rechtsomhoog stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000001; if(up.read()){ //als de joystick naar omhoog verplaatst wordt, wordt de status overschreven naar hoog en de item naar 0° Item=0b00000000; Status=0b00000000; } if(right.read()){ //als de joystick naar rechts verplaatst wordt, wordt de status overschreven naar hoog en de item naar 90° Item=0b00000010; Status=0b00000000; } } if(Item==0b00000010){ //als de joystick naar rechts stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000010; } if(Item==0b00000011){ //als de joystick naar rechtsonder stond wordt dezel als omlaag verzonden lcd.printf("back"); Item=0b00000011; if(right.read()){ //als de joystick naar rechts verplaatst wordt, wordt de status overschreven naar hoog en de item naar 90° Item=0b00000010; Status=0b00000000; } if(down.read()){ //als de joystick naar onder verplaatst wordt, wordt de status overschreven naar hoog en de item naar 180° Item=0b00000100; Status=0b00000000; } } if(Item==0b00000100){ //als de joystick naar onder stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000100; } if(Item==0b00000101){ //als de joystick naar linksonder stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000101; if(down.read()){ //als de joystick naar onder verplaatst wordt, wordt de status overschreven naar hoog en de item naar 180° Item=0b00000100; Status=0b00000000; } if(left.read()){ //als de joystick naar links verplaatst wordt, wordt de status overschreven naar hoog en de item naar 270° Item=0b00000110; Status=0b00000000; } } if(Item==0b00000110){ //als de joystick naar links stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000110; } if(Item==0b00000111){ //als de joystick naar linksboven stond wordt deze als omlaag verzonden lcd.printf("back"); Item=0b00000111; if(left.read()){ //als de joystick naar links verplaatst wordt, wordt de status overschreven naar hoog en de item naar 270° Item=0b00000110; Status=0b00000000; } if(up.read()){ //als de joystick naar boven verplaatst wordt, wordt de status overschreven naar hoog en de item naar 0° Item=0b00000000; Status=0b00000000; } } Checksum=(Source+Des+Item+Status)%255;// de checksum wordt berekend sending=0; //sending wordt op 0 gezet zodat de xbee kan ontvangne send(); //de send methode wordt aangeroepen t.start(); //de timer wordt gestart } int main() { xbee.baud(57600);//initatilatien van de xbee while(1) { if(sending){//als sendeing =1 is kan er verzonden worden //als de joystick omhoog of terug bewogen word zal de functie up of down aangeroepen worden up.rise(&CalChecksumup); up.fall(&CalChecksumdown); down.rise(&CalChecksumup); down.fall(&CalChecksumdown); left.rise(&CalChecksumup); left.fall(&CalChecksumdown); right.rise(&CalChecksumup); right.fall(&CalChecksumdown); } if(!sending){ //als sending =0 is kan de xbee de ack of nack lezen if(xbee.readable()) { //Checks if the data is readable xbee.gets(control,6); //de xbee leest de ontvangen frame in de array in if(control[0]==0x7D){ //als de beginflag ontvangen is wordt er gekeken of de eindflag juist ontvangen is if(control[5]==0x7D){ //als de eindflag juist ontvangne is wordt de checksum gecontroleerd Checksum=(control[1]+control[2]+control[3])%255; if(Checksum==control[4]){ //als de checksum correct is wordt er bekeken of het ACK of NACK signaal ontvan is if(control[3]==0b00001111){ //als het ACK ontvangen is sending=1; //sending wordt terug op 1 gezet waardoor er terug een knop verzonden kan worden lcd.cls(); lcd.locate(0,3); lcd.printf("ACK"); t.stop(); //de timer wordt gestopt en gereset t.reset(); teller=0; //de teller wordt op nul gezet while(i<7){ //de controle array wordt gewist control[i]=0; i++; } i=0; } if(control[3]==0b11110000){ //als de checksum niet correct is lcd.cls(); lcd.locate(0,3); lcd.printf("NACK"); if(teller<10){ //wordt er max 10 maal de frames herzonden send(); teller++; } if(teller==10){ //als het signaal na 10 maal niet correct wordt doorgestuurd wordt het ge negeert sending=1; teller=0; } lcd.cls(); lcd.locate(0,3); lcd.printf("NO REACTION"); } } } if(t>=1){ //als er na 1 seconden geen signaal aankomt wordt deze herzonden t.stop(); t.reset(); send(); t.start(); } } } } } }