Beispiel #1
0
// 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;
}
Beispiel #2
0
// 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;
}
Beispiel #3
0
// 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

}
Beispiel #6
0
// 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;
}
Beispiel #7
0
// 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;
}