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:   EthernetNetIf

Dependents:   RTnoV3_LED RTnoV3_Template RTnoV3_ADC RTnoV3_Timer ... more

Committer:
ysuga
Date:
Thu Feb 09 02:33:10 2012 +0000
Revision:
0:9fac71a0bff3
RTno Version 3: RTno is a software library and tool to connect embedded devices like arduino and mbed to RT-middleware world.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ysuga 0:9fac71a0bff3 1 #define RTNO_SUBMODULE_DEFINE
ysuga 0:9fac71a0bff3 2 #include <stdint.h>
ysuga 0:9fac71a0bff3 3 #include "mbed.h"
ysuga 0:9fac71a0bff3 4 #include "Transport.h"
ysuga 0:9fac71a0bff3 5 #include "Packet.h"
ysuga 0:9fac71a0bff3 6
ysuga 0:9fac71a0bff3 7 int8_t Transport_init()
ysuga 0:9fac71a0bff3 8 {
ysuga 0:9fac71a0bff3 9 return 0;
ysuga 0:9fac71a0bff3 10 }
ysuga 0:9fac71a0bff3 11
ysuga 0:9fac71a0bff3 12
ysuga 0:9fac71a0bff3 13 int8_t Transport_SendPacket(const char interface, const uint8_t data_length, const int8_t* packet_data) {
ysuga 0:9fac71a0bff3 14 uint8_t sum = 0;
ysuga 0:9fac71a0bff3 15 uint8_t sender[4] = {'U', 'A', 'R', 'T'};
ysuga 0:9fac71a0bff3 16 SerialDevice_putc(interface);
ysuga 0:9fac71a0bff3 17 sum += interface;
ysuga 0:9fac71a0bff3 18 SerialDevice_putc(data_length);
ysuga 0:9fac71a0bff3 19 sum += data_length;
ysuga 0:9fac71a0bff3 20
ysuga 0:9fac71a0bff3 21 for(uint8_t i = 0;i < 4;i++) {
ysuga 0:9fac71a0bff3 22 sum += sender[i];
ysuga 0:9fac71a0bff3 23 SerialDevice_putc(sender[i]);
ysuga 0:9fac71a0bff3 24 }
ysuga 0:9fac71a0bff3 25
ysuga 0:9fac71a0bff3 26 for(uint8_t i = 0;i < data_length;i++) {
ysuga 0:9fac71a0bff3 27 sum += packet_data[i];
ysuga 0:9fac71a0bff3 28 SerialDevice_putc(packet_data[i]);
ysuga 0:9fac71a0bff3 29 }
ysuga 0:9fac71a0bff3 30 SerialDevice_putc(sum);
ysuga 0:9fac71a0bff3 31 return PACKET_HEADER_SIZE + data_length + 1;
ysuga 0:9fac71a0bff3 32 }
ysuga 0:9fac71a0bff3 33
ysuga 0:9fac71a0bff3 34 int8_t Transport_ReceivePacket(int8_t* packet) {
ysuga 0:9fac71a0bff3 35 uint8_t counter = 0;
ysuga 0:9fac71a0bff3 36 uint8_t sum = 0;
ysuga 0:9fac71a0bff3 37
ysuga 0:9fac71a0bff3 38 if(SerialDevice_available() == 0) {
ysuga 0:9fac71a0bff3 39 return 0;
ysuga 0:9fac71a0bff3 40 }
ysuga 0:9fac71a0bff3 41
ysuga 0:9fac71a0bff3 42 while(SerialDevice_available() < PACKET_HEADER_SIZE) {
ysuga 0:9fac71a0bff3 43 wait(PACKET_WAITING_DELAY/1000.0);
ysuga 0:9fac71a0bff3 44 counter++;
ysuga 0:9fac71a0bff3 45 if(counter == PACKET_WAITING_COUNT) {
ysuga 0:9fac71a0bff3 46 return -TIMEOUT;
ysuga 0:9fac71a0bff3 47 }
ysuga 0:9fac71a0bff3 48 }
ysuga 0:9fac71a0bff3 49 packet[INTERFACE] = SerialDevice_getc();
ysuga 0:9fac71a0bff3 50 sum += packet[INTERFACE];
ysuga 0:9fac71a0bff3 51 packet[DATA_LENGTH] = SerialDevice_getc();
ysuga 0:9fac71a0bff3 52 sum += packet[DATA_LENGTH];
ysuga 0:9fac71a0bff3 53
ysuga 0:9fac71a0bff3 54 counter = 0;
ysuga 0:9fac71a0bff3 55 while(SerialDevice_available() < 4) {
ysuga 0:9fac71a0bff3 56 wait(PACKET_WAITING_DELAY/1000.0);
ysuga 0:9fac71a0bff3 57 counter++;
ysuga 0:9fac71a0bff3 58 if(counter == PACKET_WAITING_COUNT) {
ysuga 0:9fac71a0bff3 59 return -TIMEOUT;
ysuga 0:9fac71a0bff3 60 }
ysuga 0:9fac71a0bff3 61 }
ysuga 0:9fac71a0bff3 62 for(uint8_t i = 0;i < 4;i++) {
ysuga 0:9fac71a0bff3 63 uint8_t val = SerialDevice_getc();
ysuga 0:9fac71a0bff3 64 sum += val;
ysuga 0:9fac71a0bff3 65 }
ysuga 0:9fac71a0bff3 66
ysuga 0:9fac71a0bff3 67 for(uint8_t i = 0;i < packet[DATA_LENGTH];i++) {
ysuga 0:9fac71a0bff3 68 counter = 0;
ysuga 0:9fac71a0bff3 69 while(SerialDevice_available() == 0) {
ysuga 0:9fac71a0bff3 70 wait(PACKET_WAITING_DELAY/1000.0);
ysuga 0:9fac71a0bff3 71 counter++;
ysuga 0:9fac71a0bff3 72 if(counter == PACKET_WAITING_COUNT) {
ysuga 0:9fac71a0bff3 73 return -DATA_TIMEOUT;
ysuga 0:9fac71a0bff3 74 }
ysuga 0:9fac71a0bff3 75 }
ysuga 0:9fac71a0bff3 76 packet[PACKET_HEADER_SIZE+i] = SerialDevice_getc();
ysuga 0:9fac71a0bff3 77 sum += packet[PACKET_HEADER_SIZE+i];
ysuga 0:9fac71a0bff3 78 }
ysuga 0:9fac71a0bff3 79
ysuga 0:9fac71a0bff3 80 while(SerialDevice_available() == 0) {
ysuga 0:9fac71a0bff3 81 ;
ysuga 0:9fac71a0bff3 82 }
ysuga 0:9fac71a0bff3 83 uint8_t checksum = SerialDevice_getc();
ysuga 0:9fac71a0bff3 84
ysuga 0:9fac71a0bff3 85 if(sum != checksum) {
ysuga 0:9fac71a0bff3 86 return -CHECKSUM_ERROR;
ysuga 0:9fac71a0bff3 87 }
ysuga 0:9fac71a0bff3 88 return PACKET_HEADER_SIZE + packet[DATA_LENGTH] + 1;
ysuga 0:9fac71a0bff3 89 }