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

Files at this revision

API Documentation at this revision

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

EtherTcp.cpp Show annotated file Show diff for this revision Revisions of this file
EtherTcp.h Show annotated file Show diff for this revision Revisions of this file
Packet.h Show annotated file Show diff for this revision Revisions of this file
RTno.cpp Show annotated file Show diff for this revision Revisions of this file
SerialDevice.cpp Show annotated file Show diff for this revision Revisions of this file
SerialDevice.h Show annotated file Show diff for this revision Revisions of this file
Transport.cpp Show annotated file Show diff for this revision Revisions of this file
Transport.h Show annotated file Show diff for this revision Revisions of this file
UART.cpp Show annotated file Show diff for this revision Revisions of this file
UART.h Show annotated file Show diff for this revision Revisions of this file
--- 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