desloges-libioulle / Mbed 2 deprecated app3_coordinator

Dependencies:   mbed-rtos mbed EthernetInterface

Revision:
2:ff0b74e5e62c
Parent:
0:671a7b7e4673
Child:
3:05ba7be59773
--- a/main.cpp	Sun Feb 12 17:00:40 2017 +0000
+++ b/main.cpp	Sun Feb 12 17:11:58 2017 +0000
@@ -52,6 +52,8 @@
 #define ROOTER_MAX 2
 Rooter rooters[ROOTER_MAX];
 int rooterCount = 0;
+
+Mutex rooterMutex;
 /*******************************************************/
 /**********************UTILITIES************************/
 /*******************************************************/
@@ -161,10 +163,6 @@
     
     SetCheckSum(buffer);
     
-    if (!ValidateCheckSum(buffer)){
-        pc.printf("CheckSum problem\r\n");
-    }
-    
     while(true){
         XBeeSend(buffer, dataLength + AT_MIN_SIZE + FRAME_MIN_SIZE);
     
@@ -200,10 +198,45 @@
     XBeeSendATCommand(true, "AC", nullptr, 0);
 }
 
+void XbeeSendRemoteAtCommand(long long int addr64, short addr16, char opt, char * type, char * data, int dataLength){
+    char buffer[128];
+    buffer[START_IDX] = START;
+    buffer[LENGTH_MSB_IDX] = (dataLength + REMOTE_AT_RQST_MIN_SIZE) >> 8;
+    buffer[LENGTH_LSB_IDX] = (dataLength + REMOTE_AT_RQST_MIN_SIZE) & 0xff;
+    buffer[API_ID_IDX] = API_ID_REMOTE_AT_RQST;
+    buffer[FRAME_ID_IDX] = GetFrameID();
+    memcpy(&buffer[REMOTE_AT_RQST_64BIT_MSB_IDX], &addr64, ADDR_64BIT_SIZE);
+    memcpy(&buffer[REMOTE_AT_RQST_16BIT_MSB_IDX], &addr16, ADDR_16BIT_SIZE);
+    buffer[REMOTE_AT_RQST_OPT_IDX] = opt;
+    memcpy(&buffer[REMOTE_AT_RQST_AT_CMD1_IDX], type, AT_CMD_ID_SIZE);
+    memcpy(&buffer[REMOTE_AT_RQST_AT_PARAM_IDX], data, dataLength);
+    
+    SetCheckSum(buffer);
+    
+    while(true){
+        XBeeSend(buffer, dataLength + REMOTE_AT_RQST_MIN_SIZE + FRAME_MIN_SIZE);
+    
+        Thread::signal_wait(RESPONSE_SIGNAL);
+        
+        switch (responseStatus){
+        case REMOTE_AT_CMD_RSP_STATUS_OK:
+            return;
+        default:
+            pc.printf("This AT error occured : %02x\r\n", responseStatus);
+            break;
+        }
+    }
+}
+
 /*******************************************************/
 /**********************XBEE READ************************/
 /*******************************************************/
 
+void HandleAtRemoteCommandResponse(char * cmd){
+    responseStatus = cmd[REMOTE_CMD_RSP_STATUS_IDX];
+    XBeeProducer->signal_set(RESPONSE_SIGNAL);
+}
+
 void HandleBtnPacket(char* cmd){
     ButtonEvent* evt = btnPool.alloc();
     memcpy(evt->id, BTN_ID, 3);
@@ -221,6 +254,26 @@
 }
 
 void HandleXbeeReceivedPacket(char * cmd){
+    if (rooterCount < ROOTER_MAX){
+        Rooter r;
+        r.addr64 = Get64Addr(cmd, RECEIVED_PACKET_64BIT_MSB_IDX);
+        r.addr16 = Get16Addr(cmd, RECEIVED_PACKET_16BIT_MSB_IDX);
+        
+        bool found = false;
+        for (int i = 0; i < rooterCount; ++i){
+            if (rooters[i] == r){
+                found = true;
+                break;
+            }
+        }
+        if (!found){
+            rooterMutex.lock();
+            rooters[rooterCount] = r;
+            ++rooterCount;
+            rooterMutex.unlock();
+        }
+    }
+    
     if (cmd[RECEIVED_PACKET_DATA_IDX] == BTN_ID[0] && 
         cmd[RECEIVED_PACKET_DATA_IDX + 1] == BTN_ID[1] && 
         cmd[RECEIVED_PACKET_DATA_IDX + 2] == BTN_ID[2]){
@@ -261,6 +314,12 @@
     case API_ID_MODEM_STATUS:
         HandleXbeeModemStatus(cmd);
         break;
+    case API_ID_RECEIVED_PACKET:
+        HandleXbeeReceivedPacket(cmd);
+        break;
+    case API_ID_REMOTE_CMD_RSP:
+        HandleAtRemoteCommandResponse(cmd);
+        break;
     default:
         pc.printf("Unhandle XBee Command received : %02x\r\n", cmd[API_ID_IDX]);
     }
@@ -315,6 +374,14 @@
     }
 }
 
+void ToggleRemoteRooters(){
+    rooterMutex.lock();
+    for(int i = 0; i < rooterCount; ++i){
+        
+    }
+    rooterMutex.unlock();
+}
+
 bool ProducerInit(){
     if (!InitXBee()){
         pc.printf("Connection problem with the XBee\r\n");
@@ -338,7 +405,7 @@
     
     while(true){
         Thread::signal_wait(TICKER_SIGNAL);
-        // Send Remote AT Command
+        ToggleRemoteRooters();
     }
 }