// Wait for the response to the join message uint8_t EndDevice::joiningWaitResponse() { DEBUG_MSG("[JOINING WAIT RESPONSE]"); if (hasTimedOut()) { // Timed out waiting for a response to the join message disableTimeout(); State = EndDeviceError; return TICK_JOIN_TIMEOUT; } else if (xbee.getResponse().isAvailable()) { if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) { ZBRxResponse zbrr; xbee.getResponse().getZBRxResponse(zbrr); if (zbrr.getDataLength() == 1 && zbrr.getData()[0] == 'K') { // Got a correct response disableTimeout(); State = EndDeviceIdle; return TICK_JOIN_OK; } else { // TODO: Got wrong response, ignore it? State = EndDeviceError; return TICK_JOIN_BAD_MSG; // XXX: Not sure if this check/return value is needed really } } else { // TODO: Other type of message } } return TICK_OK; }
// Recieve data from the base station. uint8_t EndDevice::requestWait() { DEBUG_MSG("[REQUEST WAIT]"); if (hasTimedOut()) { // Timed out waiting for more data disableTimeout(); // Discard the partially received data dataEnd = data; // Retry the update 4 times. timesTimeout++; if (timesTimeout > 3) { State = EndDeviceError; timesTimeout = 0; return TICK_UPDATE_TIMEOUT; } else { State = EndDeviceRequestSend; } } else if (xbee.getResponse().isAvailable()) { if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) { DEBUG_MSG(" GOT PACKET"); // Has a data packet disableTimeout(); ZBRxResponse zbrr; xbee.getResponse().getZBRxResponse(zbrr); // Copy the data into the buffer memcpy(dataEnd, zbrr.getData(), zbrr.getDataLength()); dataEnd += zbrr.getDataLength(); // Test if this was the final data packet for this message if (zbrr.getData()[zbrr.getDataLength()-1] == 0) { timesTimeout = 0; // Reset timeout counter as we got a complete message DEBUG_MSG(" GOT MSG"); DEBUG_MSG((char *) data); State = EndDeviceIdle; dataEnd = data; return TICK_NEW_MSG; } else { setTimeout(5000); } } else { // TODO: Other type of message } } return TICK_OK; }
// Set timeout for associaton to complete uint8_t EndDevice::start() { DEBUG_MSG("[START]"); updateFlag = false; // Make sure this flag is reset as it may stay active if radio is reset while the flag is active disableTimeout(); // Make sure the timer is not active afte a reset wakeupFlag = false; setTimeout(10000); State = EndDeviceFormingNetwork; return TICK_OK; }
void setMD49commands(void) { //set acceleration if command changed since last set of acceleration if (i2cdata[2] NOT currentAcceleration) { setAcceleration(i2cdata[2]); } //set new mode only if changed if (i2cdata[3] NOT currentMode) { setMode(i2cdata[3]); } //set speed continuously, when timeout is enabled if (statusTimeout == 1) { setSpeed1(i2cdata[0]); setSpeed2(i2cdata[1]); } //set speed once changed, when timeout is disabled if (statusTimeout == 0) { if (recentSpeed1 != i2cdata[0]) { setSpeed1(i2cdata[0]); } if (recentSpeed2 != i2cdata[1]) { setSpeed2(i2cdata[1]); } } //reset encoders if byte was checked if (i2cdata[4] == 1) { resetEncoders(); i2cdata[4] = 0; } //set regulator if changed if (i2cdata[5] == 0) { if (statusRegulator NOT i2cdata[5]) { disableRegulator(); } } else if (i2cdata[5] == 1) { if (statusRegulator NOT i2cdata[5]) { enableRegulator(); } } // set timeout if changed if (i2cdata[6] == 0) { if (statusTimeout NOT i2cdata[6]) { disableTimeout(); } } else if (i2cdata[6] == 1) { if (statusTimeout NOT i2cdata[6]) { enableTimeout(); } } }
void init_MD49data(void) { // init bytes 0-14 (Commands) i2cdata[0] = 128; // default: speed1=0 recentSpeed1 = i2cdata[0]; // save last set speed1 i2cdata[1] = 128; // default: speed2=0 recentSpeed2 = i2cdata[1]; // save last set speed2 i2cdata[2] = 5; // default: acceleration=5 currentAcceleration = i2cdata[2]; // save last set acceleration i2cdata[3] = 0; // default: mode=0 currentMode = i2cdata[3]; // save last set Mode setMode(0); // set default mode i2cdata[4] = 0; // default: reset encoders=0 i2cdata[5] = 1; // default: enabled regulator enableRegulator(); //disableRegulator(); statusRegulator = i2cdata[5]; // save current state of regulator i2cdata[6] = 0; // default: disabled timeout //enableTimeout(); disableTimeout(); statusTimeout = i2cdata[6]; // save current state of timeout i2cdata[7] = 0; // default encoder1 value byte 1 i2cdata[8] = 0; // default encoder1 value byte 2 i2cdata[9] = 0; // default encoder1 value byte 3 i2cdata[10] = 0; // default encoder1 value byte 4 i2cdata[11] = 0; // default encoder2 value byte 1 i2cdata[12] = 0; // default encoder2 value byte 2 i2cdata[13] = 0; // default encoder2 value byte 3 i2cdata[14] = 0; // default encoder2 value byte 4 // init bytes 15-32 (Data) i2cdata[15] = 0; // default encoder1 value byte 1 i2cdata[16] = 0; // default encoder1 value byte 2 i2cdata[17] = 0; // default encoder1 value byte 3 i2cdata[18] = 0; // default encoder1 value byte 4 i2cdata[19] = 0; // default encoder2 value byte 1 i2cdata[20] = 0; // default encoder2 value byte 2 i2cdata[21] = 0; // default encoder2 value byte 3 i2cdata[22] = 0; // default encoder2 value byte 4 i2cdata[23] = 128; // default speed1 is zero i2cdata[24] = 128; // default speed2 is zero i2cdata[25] = 0; // default: volts i2cdata[26] = 0; // default: current1 i2cdata[27] = 0; // default: current2 i2cdata[28] = 0; // default: error i2cdata[29] = 5; // default: acceleration i2cdata[30] = 0; // default: mode i2cdata[31] = 1; // default: enabled regulator i2cdata[32] = 0; // default: disabled timeout }
// Send the reset command to the radio, ignoring any ongoing activities uint8_t EndDevice::resetStart() { DEBUG_MSG("[RESET START]"); // Reset everything resetFlag = false; disableTimeout(); dataEnd = data; // Issue reset command uint8_t cmd[] = {'N', 'R'}; AtCommandRequest atcr(cmd); xbee.send(atcr); State = EndDeviceResetWait; return TICK_OK; }
// Waits for the "Associated" modem status message uint8_t EndDevice::formingNetwork() { DEBUG_MSG("[FORMING NETWORK]"); if (hasTimedOut()) { DEBUG_MSG("TIMEOUT"); State = EndDeviceError; return TICK_ASSOC_FAIL; // TODO: Check association status and return appropriate error message. } if (xbee.getResponse().isAvailable()) { if (xbee.getResponse().getApiId() == MODEM_STATUS_RESPONSE) { ModemStatusResponse msr; xbee.getResponse().getModemStatusResponse(msr); if (msr.getStatus() == ASSOCIATED) { disableTimeout(); State = EndDeviceJoiningSend; } else { // TODO: Not associated meddelande } } else { // TODO: Annan meddelande-typ } } return TICK_OK; }