This is the router node
Dependencies: mbed-rtos mbed Zigbee_communication
Diff: main.cpp
- Revision:
- 11:c24adeda1b8c
- Parent:
- 10:ad02e8725236
diff -r ad02e8725236 -r c24adeda1b8c main.cpp --- 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) {