Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-rtos mbed EthernetInterface
Diff: main.cpp
- 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(); } }