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
Diff: Transport.cpp
- Revision:
- 1:f74116b37bc9
- Parent:
- 0:5f7bc45bc2e8
diff -r 5f7bc45bc2e8 -r f74116b37bc9 Transport.cpp --- 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]; }