RTno is communicating library and framework which allows you to make your embedded device capable of communicating with RT-middleware world. RT-middleware is a platform software to realize Robotic system. In RTM, robots are developed by constructing robotics technologies\' elements (components) named RT-component. Therefore, the RTno helps you to create your own RT-component with your mbed and arduino. To know how to use your RTno device, visit here: http://ysuga.net/robot_e/rtm_e/rtc_e/1065?lang=en To know about RT-middleware and RT-component, visit http://www.openrtm.org
Dependencies: EthernetInterface mbed-rtos
Revision 1:f74116b37bc9, committed 2013-07-08
- Comitter:
- ysuga
- Date:
- Mon Jul 08 07:14:30 2013 +0000
- Parent:
- 0:5f7bc45bc2e8
- Child:
- 2:cd91d780177c
- Commit message:
- Update for V4 RTno
Changed in this revision
--- a/EtherTcp.cpp Mon Jun 24 06:42:11 2013 +0000
+++ b/EtherTcp.cpp Mon Jul 08 07:14:30 2013 +0000
@@ -17,7 +17,7 @@
#define ETCP_RX_BUFFER_SIZE 128
-unsigned char etcp_rx_buffer[ETCP_RX_BUFFER_SIZE];
+uint8_t etcp_rx_buffer[ETCP_RX_BUFFER_SIZE];
int etcp_rx_buffer_pointer_head = 0;
int etcp_rx_buffer_pointer_tail = 0;
Host m_Client;
@@ -128,9 +128,9 @@
}
}
-char EtherTcp_getc()
+uint8_t EtherTcp_getc()
{
- char c;
- etcp_rx_buffer_pop((unsigned char*)&c);
+ uint8_t c;
+ etcp_rx_buffer_pop(&c);
return c;
}
--- a/EtherTcp.h Mon Jun 24 06:42:11 2013 +0000 +++ b/EtherTcp.h Mon Jul 08 07:14:30 2013 +0000 @@ -9,6 +9,6 @@ void EtherTcp_putc(const char c); uint8_t EtherTcp_available(); -char EtherTcp_getc(); +uint8_t EtherTcp_getc(); #endif // #ifndef ETHER_HEADER_INCLUDED
--- a/Packet.h Mon Jun 24 06:42:11 2013 +0000
+++ b/Packet.h Mon Jul 08 07:14:30 2013 +0000
@@ -17,10 +17,14 @@
#define INVALID_PACKET_DATASIZE 66
// Packet Settings
+#define STARTING_HEADER_SIZE 2
#define PACKET_HEADER_SIZE 2
#define INTERFACE 0
#define DATA_LENGTH 1
-#define DATA_START_ADDR 2
+//#define DATA_START_ADDR 2+4
+
+#define PACKET_STARTING_CHARACTOR_0 0x0a
+#define PACKET_STARTING_CHARACTOR_1 0x0a
enum {
RTC_STATE_CREATED='C',
--- a/RTno.cpp Mon Jun 24 06:42:11 2013 +0000
+++ b/RTno.cpp Mon Jul 08 07:14:30 2013 +0000
@@ -21,10 +21,7 @@
// module private variables.
#define PRIVATE static
-// static value declaration.
-void(*SerialDevice_putc)(const char c);
-uint8_t(*SerialDevice_available)();
-char(*SerialDevice_getc)();
+extern DigitalOut led3;
PRIVATE int8_t m_pPacketBuffer[PACKET_BUFFER_SIZE];
@@ -71,16 +68,16 @@
}
}
-
/**
* Arduino Loop routine.
* This function is repeadedly called when arduino is turned on.
*/
void loop() {
int8_t ret;
- ret = Transport_ReceivePacket(m_pPacketBuffer);
+ int32_t timeout = 20*1000;
+ ret = Transport_ReceivePacket((uint8_t*)m_pPacketBuffer, timeout);
if(ret < 0) { // Timeout Error or Checksum Error
- Transport_SendPacket(PACKET_ERROR, 1, &ret);
+ Transport_SendPacket(PACKET_ERROR, 1, (int8_t*)&ret);
} else if (ret == 0) {
} else if (ret > 0) { // Packet is successfully received
if (m_pPacketBuffer[INTERFACE] == GET_PROFILE) {
@@ -94,17 +91,17 @@
} else {
switch(EC_get_component_state()) {
case RTC_STATE_ERROR:
- _PacketHandlerOnError();
- break;
+ _PacketHandlerOnError();
+ break;
case RTC_STATE_INACTIVE:
- _PacketHandlerOnInactive();
- break;
+ _PacketHandlerOnInactive();
+ break;
case RTC_STATE_ACTIVE:
- _PacketHandlerOnActive();
- break;
+ _PacketHandlerOnActive();
+ break;
case RTC_STATE_NONE:
- ret = RTNO_NONE;
- Transport_SendPacket(m_pPacketBuffer[INTERFACE], 1, &ret);
+ ret = RTNO_NONE;
+ Transport_SendPacket(m_pPacketBuffer[INTERFACE], 1, (int8_t*)&ret);
break;
default: // if m_Condition is unknown...
@@ -226,15 +223,16 @@
Transport_SendPacket(EXECUTE, 1, &ret);
break;
case SEND_DATA: {
- PortBase* pInPort = RTnoProfile_getInPort((const char*)&(m_pPacketBuffer[DATA_START_ADDR+2]), m_pPacketBuffer[DATA_START_ADDR]);
+ PortBase* pInPort = RTnoProfile_getInPort((char*)m_pPacketBuffer + 2 + 2, m_pPacketBuffer[2]);
if(pInPort == NULL) {
-
+ ret = RTNO_ERROR;
+ Transport_SendPacket(SEND_DATA, 1, &ret);
} else {
- PortBuffer* pBuffer = pInPort->pPortBuffer;
- EC_suspend();
- pBuffer->push(pBuffer,&(m_pPacketBuffer[DATA_START_ADDR+2+m_pPacketBuffer[DATA_START_ADDR]]), m_pPacketBuffer[DATA_START_ADDR+1]);
- EC_resume();
- Transport_SendPacket(SEND_DATA, 1, &ret);
+ PortBuffer* pBuffer = pInPort->pPortBuffer;
+ EC_suspend();
+ pBuffer->push(pBuffer,&(m_pPacketBuffer[2 + 2 + m_pPacketBuffer[2]]), m_pPacketBuffer[2+1]);
+ EC_resume();
+ Transport_SendPacket(SEND_DATA, 1, &ret);
}
}
break;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SerialDevice.cpp Mon Jul 08 07:14:30 2013 +0000
@@ -0,0 +1,37 @@
+#include "mbed.h"
+#include "SerialDevice.h"
+
+// static value declaration.
+void(*SerialDevice_putc)(const char c);
+uint8_t(*SerialDevice_available)();
+uint8_t(*SerialDevice_getc)();
+
+int32_t INFINITE = -1;
+
+#if 1
+static Timer timer;
+#endif
+
+int8_t SerialDevice_read(uint8_t* buffer, const uint8_t size, const int32_t &wait_usec)
+{
+ int32_t us;
+ timer.reset();
+ timer.start();
+ for(unsigned int i = 0;i < size;i++) {
+ while (1) {
+ if(SerialDevice_available() > 0) {
+ break;
+ }
+ us = timer.read_us();
+ if (us >= wait_usec && wait_usec != INFINITE) {
+ timer.stop();
+ return -TIMEOUT;
+ }
+ }
+ buffer[i] = SerialDevice_getc();
+ }
+ timer.stop();
+ return size;
+}
+
+
--- a/SerialDevice.h Mon Jun 24 06:42:11 2013 +0000 +++ b/SerialDevice.h Mon Jul 08 07:14:30 2013 +0000 @@ -3,8 +3,13 @@ #include <stdint.h> +#define TIMEOUT 1 + + extern void(*SerialDevice_putc)(const char c); extern uint8_t(*SerialDevice_available)(); -extern char(*SerialDevice_getc)(); +extern uint8_t(*SerialDevice_getc)(); +extern int32_t INFINITE; +int8_t SerialDevice_read(uint8_t* buffer, const uint8_t size, const int32_t &wait_usec=INFINITE); #endif
--- a/Transport.cpp Mon Jun 24 06:42:11 2013 +0000
+++ b/Transport.cpp Mon Jul 08 07:14:30 2013 +0000
@@ -1,6 +1,7 @@
#define RTNO_SUBMODULE_DEFINE
#include <stdint.h>
#include "mbed.h"
+
#include "Transport.h"
#include "Packet.h"
@@ -11,17 +12,22 @@
int8_t Transport_SendPacket(const char interface, const uint8_t data_length, const int8_t* packet_data) {
- uint8_t sum = 0;
- uint8_t sender[4] = {'U', 'A', 'R', 'T'};
+ uint8_t sum = 0;//0x0a + 0x0a;
+
+ uint8_t header[2] = {0x0a, 0x0a};
+ SerialDevice_putc(header[0]);
+ SerialDevice_putc(header[1]);
+
SerialDevice_putc(interface);
sum += interface;
SerialDevice_putc(data_length);
sum += data_length;
- for(uint8_t i = 0;i < 4;i++) {
- sum += sender[i];
- SerialDevice_putc(sender[i]);
- }
+ //uint8_t sender[4] = {'U', 'A', 'R', 'T'};
+ //for(uint8_t i = 0;i < 4;i++) {
+ //sum += sender[i];
+ // SerialDevice_putc(sender[i]);
+ //}
for(uint8_t i = 0;i < data_length;i++) {
sum += packet_data[i];
@@ -31,59 +37,60 @@
return PACKET_HEADER_SIZE + data_length + 1;
}
-int8_t Transport_ReceivePacket(int8_t* packet) {
+/**
+ * Transport_ReceivePacket
+ * ¥arg packet
+ * ¥arg timeout
+ */
+int8_t Transport_ReceivePacket(uint8_t* packet, const uint32_t& timeout) {
uint8_t counter = 0;
- uint8_t sum = 0;
-
- if(SerialDevice_available() == 0) {
- return 0;
- }
-
- while(SerialDevice_available() < PACKET_HEADER_SIZE) {
- wait(PACKET_WAITING_DELAY/1000.0);
- counter++;
- if(counter == PACKET_WAITING_COUNT) {
- return -TIMEOUT;
+ uint8_t buf;
+ int8_t ret;
+ while(1) {
+ if((ret=SerialDevice_read(&buf, 1, timeout)) < 0) {
+ return 0;
}
- }
- packet[INTERFACE] = SerialDevice_getc();
- sum += packet[INTERFACE];
- packet[DATA_LENGTH] = SerialDevice_getc();
- sum += packet[DATA_LENGTH];
-
- counter = 0;
- while(SerialDevice_available() < 4) {
- wait(PACKET_WAITING_DELAY/1000.0);
- counter++;
- if(counter == PACKET_WAITING_COUNT) {
- return -TIMEOUT;
+ if (buf != PACKET_STARTING_CHARACTOR_0) {
+ counter++;
+ continue;
+ }
+ if((ret=SerialDevice_read(&buf, 1, timeout)) < 0) {
+ return 0;
}
- }
- for(uint8_t i = 0;i < 4;i++) {
- uint8_t val = SerialDevice_getc();
- sum += val;
- }
-
- for(uint8_t i = 0;i < packet[DATA_LENGTH];i++) {
- counter = 0;
- while(SerialDevice_available() == 0) {
- wait(PACKET_WAITING_DELAY/1000.0);
+ if (buf != PACKET_STARTING_CHARACTOR_1) {
counter++;
- if(counter == PACKET_WAITING_COUNT) {
- return -DATA_TIMEOUT;
- }
+ continue;
}
- packet[PACKET_HEADER_SIZE+i] = SerialDevice_getc();
- sum += packet[PACKET_HEADER_SIZE+i];
+ break;
}
- while(SerialDevice_available() == 0) {
- ;
+
+ if((ret=SerialDevice_read(packet, PACKET_HEADER_SIZE, timeout)) < 0) {
+ return ret;
+ }
+
+ //if((ret=SerialDevice_read(packet+PACKET_HEADER_SIZE,
+ // 4,
+ // timeout)) < 0) {
+ // return ret;
+ //}
+
+ if((ret=SerialDevice_read(packet+PACKET_HEADER_SIZE,
+ packet[DATA_LENGTH],
+ timeout)) < 0) {
+ return ret;
}
- uint8_t checksum = SerialDevice_getc();
+
+ if((ret=SerialDevice_read(&buf, 1, timeout)) < 0) {
+ return ret;
+ }
- if(sum != checksum) {
+ uint8_t sum = 0;//PACKET_STARTING_CHARACTOR_0 + PACKET_STARTING_CHARACTOR_1;
+ for(uint8_t i = 0;i < PACKET_HEADER_SIZE+packet[DATA_LENGTH];i++) {
+ sum += packet[i];
+ }
+ if(buf != sum) {
return -CHECKSUM_ERROR;
}
- return PACKET_HEADER_SIZE + packet[DATA_LENGTH] + 1;
+ return PACKET_HEADER_SIZE + packet[DATA_LENGTH];
}
--- a/Transport.h Mon Jun 24 06:42:11 2013 +0000 +++ b/Transport.h Mon Jul 08 07:14:30 2013 +0000 @@ -7,7 +7,7 @@ int8_t Transport_init(); int8_t Transport_SendPacket(const char interface, const uint8_t data_length, const int8_t* packet_data); - -int8_t Transport_ReceivePacket(int8_t* packet); + +int8_t Transport_ReceivePacket(uint8_t* packet, const uint32_t &timeout=INFINITE); #endif
--- a/UART.cpp Mon Jun 24 06:42:11 2013 +0000
+++ b/UART.cpp Mon Jul 08 07:14:30 2013 +0000
@@ -3,7 +3,7 @@
#include "mbed.h"
#include "UART.h"
-#define UART_RX_BUFFER_SIZE 128
+#define UART_RX_BUFFER_SIZE 64
static Serial *m_pSerial;
unsigned char uart_rx_buffer[UART_RX_BUFFER_SIZE];
@@ -14,8 +14,8 @@
/**
* Push data to ring buffer.
*/
-int uart_rx_buffer_push(unsigned char c) {
- uart_rx_buffer[uart_rx_buffer_pointer_tail] = c;
+int uart_rx_buffer_push(unsigned char* c) {
+ uart_rx_buffer[uart_rx_buffer_pointer_tail] = *c;
uart_rx_buffer_pointer_tail++;
if(uart_rx_buffer_pointer_tail >= UART_RX_BUFFER_SIZE) {
uart_rx_buffer_pointer_tail = 0;
@@ -23,6 +23,8 @@
return 0;
}
+
+
/**
* Pop data fron ring buffer
*/
@@ -44,7 +46,8 @@
}
void rx_isr(void) {
- uart_rx_buffer_push(m_pSerial->getc());
+ int8_t c = m_pSerial->getc();
+ uart_rx_buffer_push((uint8_t*)&c);
}
@@ -77,6 +80,9 @@
}
void UART_putc(const char c) {
+ while(!m_pSerial->writeable()) {
+ wait_us(100);
+ }
m_pSerial->putc(c);
}
@@ -86,7 +92,7 @@
}
-char UART_getc()
+uint8_t UART_getc()
{
unsigned char c;
uart_rx_buffer_pop(&c);
--- a/UART.h Mon Jun 24 06:42:11 2013 +0000 +++ b/UART.h Mon Jul 08 07:14:30 2013 +0000 @@ -6,6 +6,6 @@ void UART_init(unsigned char num, unsigned long baudrate); void UART_putc(const char c); uint8_t UART_available(); -char UART_getc(); +uint8_t UART_getc(); #endif
Yuki Suga