This is the router node

Dependencies:   mbed-rtos mbed Zigbee_communication

Revision:
11:c24adeda1b8c
Parent:
10:ad02e8725236
--- a/main.cpp	Tue Feb 14 19:47:34 2017 +0000
+++ b/main.cpp	Wed Feb 15 05:55:49 2017 +0000
@@ -9,18 +9,25 @@
 #include "rtos.h"
 #include "xbee.h"
 
-// 4269
 Mail<char, 250> mymail;
-XBee xbee(p8, p13, p14, &mymail);
+Mail<char[254], 25> receivedFrameResponses;
+XBee xbee(p8, p13, p14, &mymail, NULL, NULL);
+
+typedef struct {
+  char         messageId; //Frame Id of message and waiting signal
+  osThreadId   threadId;  //Thread pointer to wake thread
+} waiting_thread_t;
+ 
+Mail<waiting_thread_t, 254> waitingQueue;
 
 Serial pc(USBTX, USBRX);
 DigitalOut myled(LED1);
-DigitalOut myled2(LED2);
 DigitalIn bouton(p30);
 I2C accel(p28, p27);
 
 Thread *accelerometre_thread;
 Thread *bouton_thread;
+//Thread *thread_waker;
 
 void ReadSerial()
 {
@@ -30,14 +37,29 @@
     xbee.SendATCommand('S', 'L');
 }
 
+void WaitOnId(char id)
+{
+    // Envoyer une requete d'attente
+    waiting_thread_t *waitTicket = waitingQueue.alloc();
+    waitTicket->messageId = id;
+    waitTicket->threadId = osThreadGetId(); 
+    waitingQueue.put(waitTicket);
+    
+    // Attendre
+    osSignalWait(id, osWaitForever);
+}
+
 void InitialisePANID(char PANIDMSB, char PANIDLSB)
 {
     char PanID[2] = {PANIDMSB, PANIDLSB};
+    char idwait = 0;
     
-    xbee.SendATCommand('I', 'D', &PanID[0], 2);
-    xbee.SendATCommand('W', 'R');
-    wait(2);
-    xbee.SendATCommand('A', 'C');
+    idwait = xbee.SendATCommand('I', 'D', &PanID[0], 2);
+    //WaitOnId(idwait);
+    idwait = xbee.SendATCommand('W', 'R');
+    //WaitOnId(idwait);
+    idwait = xbee.SendATCommand('A', 'C');
+    //WaitOnId(idwait);
 }
 
 void xbee_reader()
@@ -73,7 +95,6 @@
     accel.read(addr_accel, &CTRL_REG1[1], 1);
     CTRL_REG1[1] = CTRL_REG1[1] & 0b11111110;
     accel.write(addr_accel, CTRL_REG1, 2);
-    pc.printf("CTRL_REG1 STANBY : %i\r\n", CTRL_REG1[1] & 0b11111110);
     
     // Set in +-2g with FS bits
     // Register XYZ_DATA_CFG : 0x0E
@@ -82,7 +103,6 @@
     accel.read(addr_accel, &XYZ_DATA_CFG[1], 1);
     XYZ_DATA_CFG[1] = XYZ_DATA_CFG[1] & FS_BITS_mask;
     accel.write(addr_accel, XYZ_DATA_CFG, 2);
-    pc.printf("XYZ_DATA_CFG +-2g : %i\r\n", XYZ_DATA_CFG[1] & FS_BITS_mask);
     
     // Read CTRL_REG1 to set it back with bit 1 to set in active mode
     // Register CTRL_REG1 : 0x2A
@@ -90,7 +110,6 @@
     accel.read(addr_accel, &CTRL_REG1[1], 1);
     CTRL_REG1[1] = CTRL_REG1[1] | 1;
     accel.write(addr_accel, CTRL_REG1, 2);
-    pc.printf("CTRL_REG1 ACTIVE : %i\r\n", CTRL_REG1[1] | 1); 
 }
 
 void accelerometre_reader()
@@ -107,9 +126,8 @@
     
     while(1)
     {
-        //myled2 = 1;
         Thread::signal_wait(1, osWaitForever);
-        //myled2 = 0;
+        wait(0.2); // Pour décaller du boutton
         
         accel.write(addr_accel, OUT, 1, true);
         accel.read(addr_accel, &OUT[1], 6);
@@ -126,8 +144,7 @@
         dataOut[2] = Angle;
         
         // Envoyer les données
-        xbee.ZigBeeTransmit(0xFFFE, 0x00000000, 0x00000000, &dataOut[0], 3);
-        pc.printf("Angle : %d\r\n", Angle);
+        xbee.ZigBeeTransmit(0x0000, 0x00000000, 0x00000000, &dataOut[0], 3);
     }
 }
 
@@ -144,9 +161,7 @@
         dataOut[1] = (bouton == 1);
         
         // Envoyer les données
-        xbee.ZigBeeTransmit(0xFFFE, 0x00000000, 0x00000000, &dataOut[0], 2);
-        //xbee.BroadcastHelloWorld();
-        pc.printf("Bouton : %d\r\n", bouton == 1);
+        xbee.ZigBeeTransmit(0x0000, 0x00000000, 0x00000000, &dataOut[0], 2);
     }
 }
 
@@ -159,37 +174,66 @@
     (*bouton_thread).signal_set(1);
 }
 
+void wake_threads()
+{
+    // Essaie de thread permettant à un autre thread d'attendre la réception d'un Frame ID
+    int smallWait = 5;
+    osThreadId inWait[254] = {0};
+
+    while (true) {
+        osEvent evt = waitingQueue.get(smallWait);
+        if (evt.status == osEventMail) {
+            waiting_thread_t *waitingThread = (waiting_thread_t*)evt.value.p;
+            printf("Frame Id : %d\n\r", waitingThread->messageId);
+            printf("Thread Id : %d\n\r", waitingThread->threadId);
+            inWait[waitingThread->messageId] = waitingThread->threadId;
+            waitingQueue.free(waitingThread);
+        }
+        osEvent evt2 = receivedFrameResponses.get(smallWait);
+        if (evt2.status == osEventMail) {
+            char *receivedResponse = (char*)evt2.value.p;
+            printf("Frame Id : %d\n\r", receivedResponse[4]);
+            if (inWait[receivedResponse[4]] != 0)
+            {
+                osSignalSet(inWait[receivedResponse[4]], receivedResponse[4]);
+                inWait[receivedResponse[4]] = 0;
+            }
+            receivedFrameResponses.free((char(*)[254])receivedResponse);
+        }
+    }
+}
+
 int main() 
 {
     int addr_accel = 0x1D<<1;
     
     Ticker ticker;
     
-    
-    //Ticker accelerometre;
-    //Ticker bouton;
-    
     pc.printf("\r\nI am router\r\n");
     
+    AccelerometreSetup(addr_accel);
+    pc.printf("accelerometre initialiser");
+    wait(2);
     Thread thread(xbee_reader);
     Thread thread_printer(console_printer);
+    //Thread waking_threads(wake_threads);
+    
+    InitialisePANID(0x42, 0x69);
+    
     Thread thread_accelerometre(accelerometre_reader);
     Thread thread_bouton(bouton_reader);
     
     accelerometre_thread = &thread_accelerometre;
     bouton_thread = &thread_bouton;
-    
-    wait(2);
-    AccelerometreSetup(addr_accel);
-    //accelerometre.attach(&accelerometre_reader, 1);
-    //bouton.attach(&bouton_reader, 1);
+    //thread_waker = &waking_threads;
+
     ReadSerial();
-    InitialisePANID(0x42, 0x69);
     wait(1);
     xbee.SendATCommand('M', 'Y');
     xbee.SendATCommand('O', 'P');
     wait(1);
-    ticker.attach(&tick, 2);
+    ticker.attach(&tick, 3);
+    
     
     while(1) {