Ejemplo n.º 1
0
char FT232R_send(unsigned char * msg,unsigned char length)
{
	if (USB_getMode() != DATAMODE)
		if ( !USB_setMode(DATAMODE) ) //switch to data mode
			return 0;  //dataMode failed
	
	USB_send(msg,length); //send the msg

return 1; //success
}
Ejemplo n.º 2
0
void CM730_SendStatus(unsigned char id, unsigned char error, unsigned int length, char* data) {
	unsigned char checksum = 0;
	char buffer[length + 6];

	buffer[0] = 0xFF;
	buffer[1] = 0xFF;
	buffer[2] = id;
	buffer[3] = 2 + length;
	buffer[4] = error;
	for (unsigned int i = 0; i < length; i++) {
		buffer[5 + i] = data[i];
		checksum += data[i];
	}
	buffer[length + 5] = (~(id + (2 + length) + error + checksum) & 0xFF);
	USB_send(buffer, length + 6);
}
Ejemplo n.º 3
0
void CM730_Main() {
	char usbBuffer[128];
	char usbSendBuffer[64];

	Servo_SetPowerState(0);

	memset(&cm730_currentMessage, 0, sizeof(cm730_currentMessage));
	memset(&cm730_lastMessage, 0, sizeof(cm730_lastMessage));
	cm730_state = CM730_STATE_IDLE;
	cm730_messageProcessed = 1;

	uart0_SetBaudrate(AT91B_DBGU_BAUD_RATE);
	mCM730OldUart0Callback = uart0_AssignCharReceivedCallback(CM730_ProcessChar);
	mCM730OldUart1Callback = uart1_AssignCharReceivedCallback(CM730_ProcessServoChar);
#ifndef DEBUG_X86
	mCM730OldUart0TXBufCallback = uart0_AssignTxReadyCallback(CM730_ExtTXBufferEmpty);
#endif
	while (1) {
		// Send chars in TX buffer via USB
		if (CM730_TXBufferReadPos != CM730_TXBufferWritePos) {
			unsigned char idx = 0;
			do {
				usbSendBuffer[idx] = CM730_TXBuffer[CM730_TXBufferReadPos];
				idx++;
				CM730_TXBufferReadPos = (CM730_TXBufferReadPos + 1) % TX_BUFFER_SIZE;
			} while (CM730_TXBufferReadPos != CM730_TXBufferWritePos && idx < sizeof(usbSendBuffer));
			USB_send(usbSendBuffer, idx);
		}

		// Look for USB chars, when available feed to parser
		int read = USBRead_nonblocking(&usbBuffer[0], sizeof(usbBuffer));
		if (read > 0) {
			for (unsigned char i = 0; i < read; ++i) {
				CM730_ProcessChar(usbBuffer[i]);
			}
		}

		// Read button state
		unsigned char v = 0;
		if (UI_GetKeyState_NoDebounce(0)) v |= 0x1;
		if (UI_GetKeyState_NoDebounce(1)) v |= 0x2;
		cm730_data[P_BUTTON] = v;
		// Update IMU
    	IMU_accel_update();
    	IMU_gyro_update();
		WRITE_WORD(P_ACC_Z, imu_AccelX_raw);
		WRITE_WORD(P_ACC_Y, imu_AccelZ_raw);
		WRITE_WORD(P_ACC_X, imu_AccelY_raw);
		WRITE_WORD(P_GYRO_Z, imu_GyroX_raw);
		WRITE_WORD(P_GYRO_Y, imu_GyroY_raw);
		WRITE_WORD(P_GYRO_X, imu_GyroZ_raw);

		if (cm730_messageProcessed == 0) { // Message waiting
			if (cm730_lastMessage.type == CM730_MY_ID || cm730_lastMessage.type == CM730_BROADCAST) {
				//if (cm730_lastMessage.type == CM730_BROADCAST) {
				//	dbgu_printf("[CM730] Received broadcast\r\n");
				//}
				if (cm730_lastMessage.instruction == CM730_CMD_WRITE) {
					if (cm730_lastMessage.length == 2) {
						//dbgu_printf("[CM730] Received byte write request: %d @ %d\r\n", cm730_lastMessage.data[0], cm730_lastMessage.data[1]);
						if (cm730_lastMessage.data[0] == P_DXL_POWER) {
							Servo_SetPowerState(cm730_lastMessage.data[1]);
							cm730_data[P_DXL_POWER] = cm730_lastMessage.data[1];
						}
					} else if (cm730_lastMessage.length == 3) {
						//dbgu_printf("[CM730] Received word write request: %d @ %d\r\n", cm730_lastMessage.data[0], cm730_lastMessage.data[1] | (cm730_lastMessage.data[2] << 8));
					}
					if (cm730_lastMessage.type != CM730_BROADCAST) {
						CM730_SendStatus(cm730_lastMessage.type, 0, 0, NULL);
					}
				} else if (cm730_lastMessage.instruction == CM730_CMD_PING) {
					//dbgu_printf("[CM730] Received ping request\r\n");
					if (cm730_lastMessage.type != CM730_BROADCAST) {
						CM730_SendStatus(cm730_lastMessage.type, 0, 0, NULL);
					}
				} else if (cm730_lastMessage.instruction == CM730_CMD_SYNC_WRITE) {
					//unsigned char start_addr = cm730_lastMessage.data[0];
					//unsigned char len = cm730_lastMessage.data[1];
					//for(unsigned char i = 2; i < cm730_lastMessage.length; i += (len + 1)) {
					//	unsigned char id = cm730_lastMessage.data[i];
					//	if (id == CM730_MY_ID) {
							//dbgu_printf("[CM730] Received sync write request: %d bytes from %d\r\n", len, start_addr);
					//	}
					//}
				} else if (cm730_lastMessage.instruction == CM730_CMD_BULK_READ) {
					struct parser_message bulk_message;
					memcpy(&bulk_message, &cm730_lastMessage, sizeof(struct parser_message));
					unsigned char num = (bulk_message.length - 1) / 3;
					unsigned char last_id = 0xFF;
					for(char i = 0; i < num; ++i) {
						unsigned char id = bulk_message.data[(3*i) + 2];
						unsigned char len = bulk_message.data[(3*i) + 1];
						unsigned char addr = bulk_message.data[(3*i) + 3];
						if (id == CM730_MY_ID) {
							//dbgu_printf("[CM730] Received bulk read request for %d bytes from %d\r\n", len, addr);
							if (last_id == 0xFF) { // We are the first in the list
								//process
								if (addr + (len - 1) >= sizeof(cm730_data)) {
									CM730_SendStatus(CM730_MY_ID, CM730_ERROR_RANGE, 0, NULL);
								} else {
									CM730_SendStatus(CM730_MY_ID, 0, len, &cm730_data[addr]);
								}
								break;
							} else {
								// wait
								while (1) {
									cm730_messageProcessed = 1; // Message processed
									//TODO: Add timeout
									while (cm730_messageProcessed == 1); // Wait for new message
									if (cm730_currentMessage.type == last_id) {
										break;
									}
								}
								if (addr + (len - 1) >= sizeof(cm730_data)) {
									CM730_SendStatus(CM730_MY_ID, CM730_ERROR_RANGE, 0, NULL);
								} else {
									CM730_SendStatus(CM730_MY_ID, 0, len, &cm730_data[addr]);
								}
								break;
							}
						}
						last_id = id;
					}
				} else {
					dbgu_printf("[CM730] Unknown instruction: %d (data length: %d)\r\n", cm730_lastMessage.instruction, cm730_lastMessage.length);
				}
			//} else {
			//	dbgu_printf("[CM730] Received instruction for ID %d\r\n", cm730_lastMessage.type);
			}

			cm730_messageProcessed = 1; // Message processed
		}
	}

	uart0_SetBaudrate(AT91_BAUD_RATE_EXT);
	uart0_AssignCharReceivedCallback(mCM730OldUart0Callback);
	uart1_AssignCharReceivedCallback(mCM730OldUart1Callback);
#ifndef DEBUG_X86
	uart0_AssignTxReadyCallback(mCM730OldUart0TXBufCallback);
#endif

	Servo_SetPowerState(1);
}