From cd434fbd698f280aecb94e39e07e3ce9b30d6604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Sun, 23 Sep 2018 14:17:42 +0200 Subject: [PATCH] [XBee] Added method to apply parameter changes --- src/modules/XBee.cpp | 85 ++++++++++++++++++++++++++++++++++---------- src/modules/XBee.h | 4 ++- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/modules/XBee.cpp b/src/modules/XBee.cpp index 82417068..1aeb87e8 100644 --- a/src/modules/XBee.cpp +++ b/src/modules/XBee.cpp @@ -10,35 +10,50 @@ XBee::XBee(Module* mod) { int16_t XBee::begin(long speed) { // set Arduino pins - pinMode(A4, OUTPUT); + /*pinMode(A4, OUTPUT); pinMode(A5, OUTPUT); pinMode(3, OUTPUT); digitalWrite(A4, LOW); digitalWrite(A5, LOW); - digitalWrite(3, HIGH); - + digitalWrite(3, HIGH);*/ + // set module properties _mod->baudrate = speed; _mod->init(USE_UART, INT_NONE); + // reset module + pinMode(_mod->int1(), OUTPUT); + delay(10); + digitalWrite(_mod->int1(), HIGH); + delay(500); + digitalWrite(_mod->int1(), LOW); + delay(500); + pinMode(_mod->int1(), INPUT); + delay(500); + // wait for boot - delay(2000); + delay(3000); // empty UART buffer (garbage data) _mod->ATemptyBuffer(); // send test frame (get baudrate setting) uint8_t frameID = _frameID++; - sendApiFrame(XBEE_API_FRAME_AT_COMMAND, frameID, "BD"); + sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "BD"); delay(20); // get response code - return(readApiFrame(frameID, 4)); + int16_t state = readApiFrame(frameID, 4); + if(state != ERR_NONE) { + return(state); + } + + return(state); } int16_t XBee::transmit(uint8_t* dest, const char* payload, uint8_t radius) { uint8_t destNetwork[] = {0xFF, 0xFE}; - return(transmit(dest, destNetwork, payload)); + return(transmit(dest, destNetwork, payload, radius)); } int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, uint8_t radius) { @@ -133,11 +148,17 @@ int16_t XBee::setPanId(uint8_t* panId) { // send frame uint8_t frameID = _frameID++; - sendApiFrame(XBEE_API_FRAME_AT_COMMAND, frameID, cmd, 10); + sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, cmd, 10); delay(40); // get response code - return(readApiFrame(frameID, 4)); + int16_t state = readApiFrame(frameID, 4); + if(state != ERR_NONE) { + return(state); + } + + // confirm changes + return(confirmChanges()); } XBeeSerial::XBeeSerial(Module* mod) : ISerial(mod) { @@ -256,23 +277,47 @@ bool XBeeSerial::enterCmdMode() { DEBUG_PRINT(i + 1); DEBUG_PRINTLN_STR(" of 10 tries)"); - pinMode(3, OUTPUT); + pinMode(_mod->int1(), OUTPUT); delay(10); - digitalWrite(3, HIGH); + digitalWrite(_mod->int1(), HIGH); delay(500); - digitalWrite(3, LOW); + digitalWrite(_mod->int1(), LOW); delay(500); - pinMode(3, INPUT); + pinMode(_mod->int1(), INPUT); delay(500); _mod->ATsendCommand("ATCN"); - - if(i == 9) { - DEBUG_PRINTLN_STR("Terminated, check your wiring. Is AT FW uploaded?"); - return(false); - } } } + + DEBUG_PRINTLN_STR("Terminated, check your wiring. Is AT FW uploaded?"); + return(false); +} + +int16_t XBee::confirmChanges() { + // save changes to non-volatile memory + uint8_t frameID = _frameID++; + sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "WR"); + delay(40); + + // get response code + int16_t state = readApiFrame(frameID, 4); + if(state != ERR_NONE) { + return(state); + } + + // apply changes + frameID = _frameID++; + sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "AC"); + delay(40); + + // get response code + state = readApiFrame(frameID, 4); + if(state != ERR_NONE) { + return(state); + } + + return(state); } void XBee::sendApiFrame(uint8_t type, uint8_t id, const char* data) { @@ -308,6 +353,7 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length } int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos) { + // TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen. // get number of bytes in response uint16_t numBytes = getNumBytes(10000, 5); if(numBytes == 0) { @@ -337,6 +383,7 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos) { return(ERR_FRAME_UNEXPECTED_ID); } + // codePos does not include start delimiter and frame ID uint8_t code = resp[codePos]; delete[] resp; return(code); @@ -345,7 +392,7 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos) { uint16_t XBee::getNumBytes(uint32_t timeout, size_t minBytes) { // wait for available data uint32_t start = millis(); - while(_mod->ModuleSerial->available() < minBytes) { + while((size_t)_mod->ModuleSerial->available() < minBytes) { if(millis() - start >= timeout) { return(0); } diff --git a/src/modules/XBee.h b/src/modules/XBee.h index 8d96bc62..200786ec 100644 --- a/src/modules/XBee.h +++ b/src/modules/XBee.h @@ -12,7 +12,7 @@ // API frame IDs #define XBEE_API_FRAME_AT_COMMAND 0x08 -#define XBEE_API_FRAME_AT_COMMAND_PARAMETER 0x09 +#define XBEE_API_FRAME_AT_COMMAND_QUEUE 0x09 #define XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST 0x10 #define XBEE_API_FRAME_ZIGBEE_ADDRESS_EXPLICIT 0x11 #define XBEE_API_FRAME_REMOTE_COMMAND 0x17 @@ -73,6 +73,8 @@ class XBee { char* _packetData; uint8_t _packetSource[8]; + int16_t confirmChanges(); + void sendApiFrame(uint8_t type, uint8_t id, const char* data); void sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length); int16_t readApiFrame(uint8_t frameID, uint8_t codePos);