mini code pour xbee
Dependencies: mbed ConfigFile EthernetInterface WebSocketClient mbed-rtos
Fork of app4Coordo by
Revision 7:891d50fe1ee5, committed 2014-02-25
- Comitter:
- passelin
- Date:
- Tue Feb 25 18:11:05 2014 +0000
- Parent:
- 6:2ab1318e2b02
- Commit message:
- Comments added
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 2ab1318e2b02 -r 891d50fe1ee5 main.cpp --- a/main.cpp Tue Feb 25 15:15:11 2014 +0000 +++ b/main.cpp Tue Feb 25 18:11:05 2014 +0000 @@ -1,3 +1,16 @@ +/******************************************************************************************* +* FILE: Coordonator +* File name: main.cpp +* Authors: Pierluc Asselin & Marc-Antoine Dupuis +* Object: S5 Info - APP5 +* Original Date: 22/02/2014 +* Last Modified: 25/02/2014 +********************************************************************************************/ + + +/******************* + INCLUDES +*******************/ #include "mbed.h" #include <string> #include <sstream> @@ -5,32 +18,54 @@ #include "EthernetInterface.h" #include "Websocket.h" -// Pins + +/******************* + PINS +*******************/ DigitalOut myled(LED1); DigitalOut myled2(LED2); DigitalOut reset(p8); -// Serial COMs + +/******************* + SERIAL +*******************/ Serial pc(USBTX, USBRX); Serial xbee(p13, p14); -// Variables + +/******************* + VARIABLES +*******************/ char url_s[BUFSIZ]; char dataBuf[20]; int dataBuf_i; bool trame_ready; string panID; -// Ethernet interface + +/******************* + ETHERNET +*******************/ EthernetInterface eth; -// Configuration file + +/******************* + CONFIG FILE +*******************/ LocalFileSystem local("local"); ConfigFile cfg; -// State machine ENUM +/******************* + STATE MACHINE ENUM +*******************/ enum {STEP_START, STEP_LENGTH, STEP_TYPE, STEP_MAC, STEP_NET, STEP_OPT, STEP_DATA, STEP_CHECK}; + +/******************* +configInit +This function get the information from the configuration init file. +*******************/ void configInit() { char *key1 = "PANID"; @@ -48,42 +83,59 @@ */ if (cfg.getValue(key1, &value[0], sizeof(value))) { + // Get PanID std::stringstream panID_s(value); panID_s >> panID; - pc.printf("'%s'='%s'\n\r", key1, value); } if (cfg.getValue(key2, &value[0], sizeof(value))) { + // Get URL of web socket memcpy(url_s,value,BUFSIZ); } } - +/******************* +eth_ws_init +This function initialize the ethernet port and the web socket connection +*******************/ void eth_ws_init(Websocket* ws) { + // Init and connect to ethernet port eth.init(); eth.connect(); + // Get IP adress pc.printf("IP Address is %s\n\r", eth.getIPAddress()); + // Wait 2 seconds since we just connected to the network wait(2); + // Connect to the web socket if(!ws->connect()) { error("Failure establish connection to the WebSocket.\n\r"); } } - +/******************* +xbee_init +This function initialize the xbee module and set his panID +*******************/ void xbee_init() { + // Reset the xbee reset = 0; wait_ms(400); reset = 1; + + // Wait for the xbee to be ready to receive data wait(4); + + // Build trame and send the PanID to the xbee int panID_size; int panID_array[8]; int i; long int panID_d; + panID_size = panID.length(); //vérifie si le panID est pair ou impair if(panID_size%2 != 0) { @@ -115,14 +167,12 @@ checkSum = checkSum + 0x09 + 0x47 + 0x49 + 0x44; while(i>=0) { - pc.printf(" \n\r valeur = %d",panID_array[i]); xbee.putc(panID_array[i]); checkSum += panID_array[i]; i--; } checkSum = 0xff - checkSum; xbee.putc(checkSum); // checksum - pc.printf("\n\r %d %x", checkSum,checkSum); xbee.putc(0x7E); // start delimeter xbee.putc(0x00); // length @@ -144,11 +194,16 @@ xbee.putc(0x28); //checksum } - +/******************* +xbee_receive +This function receive and decode the information from the xbee communication +*******************/ void xbee_receive() { + // Initialize step-machine static int state = STEP_START; + // Get the next caracter from xbee char data = xbee.getc(); static int length_i; @@ -156,9 +211,10 @@ static int mac_i; static int net_i; + // Step-Machine switch(state) { - case STEP_START: if(data == 0x7E) + case STEP_START: if(data == 0x7E) // Verifie if Start byte is OK. { state = STEP_LENGTH; length_i = 0; @@ -167,7 +223,7 @@ } break; - case STEP_LENGTH: length += data; + case STEP_LENGTH: length += data; //Read the length in the next 2 bytes. length_i++; if(length_i == 2) { @@ -176,7 +232,7 @@ } break; - case STEP_TYPE: if(data == 0x90) //Receive packet + case STEP_TYPE: if(data == 0x90) // Verifie if Type byte is OK. { state = STEP_MAC; mac_i = 0; @@ -187,7 +243,7 @@ } break; - case STEP_MAC: mac_i++; + case STEP_MAC: mac_i++; // Skip the next 8 bytes. We do not need the 64bits MAC adresse since we already receive the data. xbee already accepted it if(mac_i == 8) { state = STEP_NET; @@ -195,14 +251,14 @@ } break; - case STEP_NET: net_i++; + case STEP_NET: net_i++; // Skip the next 2 bytes. We do not need the 16bits adresse since we already receive the data. xbee already accepted it if(net_i == 2) { state = STEP_OPT; } break; - case STEP_OPT: if(data == 0x01) + case STEP_OPT: if(data == 0x01) // Verifie that the option bytes is OK { state = STEP_DATA; } @@ -212,7 +268,7 @@ } break; - case STEP_DATA: length--; + case STEP_DATA: length--; // Get the data. The number of bytes to read is given by the length previously detected. dataBuf[dataBuf_i] = data; dataBuf_i++; if(length == 0) @@ -223,47 +279,52 @@ } break; - case STEP_CHECK: //check CS + case STEP_CHECK: //check ChecksumS state = STEP_START; break; } } - +/******************* +main +This is the main function of the coordinator program +*******************/ int main() { - + // Get the data from config init file configInit(); + // Create the web socket with the specified URl from the cofig init file Websocket ws(url_s); + + // Initialize the ethernet port and the web socket eth_ws_init(&ws); + // initialize the xbee communication and the PAN xbee_init(); - + // Light on SENDING led and RECEIVING led (led1, led2) myled = 1; myled2 = 1; + // initialise the confimation received flag trame_ready = false; + //Main loop while(1) { + // If data is received from the xbee, toggle RECEIVING led and analyse the data if(xbee.readable()) { xbee_receive(); myled2 = ! myled2; } - + + // if received trame is complete, send it to the web socket and reset the confirmation flag. if(trame_ready == true) { - ws.send(dataBuf); - - //pc.printf(dataBuf); - //pc.printf("\n\r"); + ws.send(dataBuf); trame_ready = false; } } - - //ws.close(); - // eth.disconnect(); }