Nerve-SerialConnect is a part of System Nerve Essentials by Numazu Robocon Team.

Dependencies:   AsyncSerial

Committer:
babylonica
Date:
Sat Jan 26 14:36:48 2019 +0000
Revision:
1:a8fa09ff3ee9
Parent:
0:28807ec7ed26
Add dependences

Who changed what in which revision?

UserRevisionLine numberNew contents of line
babylonica 0:28807ec7ed26 1 // -*- coding:utf-8-unix -*-
babylonica 0:28807ec7ed26 2 /*!
babylonica 0:28807ec7ed26 3 @file SerialConnect.cpp
babylonica 0:28807ec7ed26 4 @author Takuma Kawamura <bitpositive@MacBook-Pro-13.local>
babylonica 0:28807ec7ed26 5 @date Wed Jan 23 13:40:32 2019
babylonica 0:28807ec7ed26 6
babylonica 0:28807ec7ed26 7 @brief Nerve-SerialConnect
babylonica 0:28807ec7ed26 8
babylonica 0:28807ec7ed26 9 MbedのUARTポートを使って,uint8_t(unsigned char)型の配列を送受信するためのライブラリ.割り込み処理を使うため効率的.チェックサムやバイト間タイムアウトを搭載しているので安全かつ,完全な状態で通信を行うことができる.
babylonica 0:28807ec7ed26 10
babylonica 0:28807ec7ed26 11 @version 1.0
babylonica 0:28807ec7ed26 12
babylonica 0:28807ec7ed26 13 @see Mbed OS 2のリビジョンは,必ずRev.146以下にすること.
babylonica 0:28807ec7ed26 14
babylonica 0:28807ec7ed26 15 @copyright T.Kawamura (C) 2019 <contact@bit-plus.work>
babylonica 0:28807ec7ed26 16
babylonica 0:28807ec7ed26 17 */
babylonica 0:28807ec7ed26 18
babylonica 0:28807ec7ed26 19 #include "SerialConnect.hpp"
babylonica 0:28807ec7ed26 20
babylonica 0:28807ec7ed26 21
babylonica 0:28807ec7ed26 22 SerialConnect::SerialConnect( PinName txpin, PinName rxpin, uint32_t payload_size, uint32_t baudrate, uint32_t uart_fifo_buffer_size )
babylonica 0:28807ec7ed26 23 : payload_size( payload_size ), load_status( STATE_WAIT_HEADER ), payload_data_count( 0 )
babylonica 0:28807ec7ed26 24 {
babylonica 0:28807ec7ed26 25 serial_port = new AsyncSerial( txpin, rxpin, baudrate, uart_fifo_buffer_size );
babylonica 0:28807ec7ed26 26
babylonica 0:28807ec7ed26 27 time_out_timer = new Timer;
babylonica 0:28807ec7ed26 28 time_out_timer->stop();
babylonica 0:28807ec7ed26 29 time_out_timer->reset();
babylonica 0:28807ec7ed26 30
babylonica 0:28807ec7ed26 31 memset( recieved_payload, 0, NSC_MAX_PACKET_SIZE );
babylonica 0:28807ec7ed26 32 }
babylonica 0:28807ec7ed26 33
babylonica 0:28807ec7ed26 34 SerialConnect::~SerialConnect( void )
babylonica 0:28807ec7ed26 35 {
babylonica 0:28807ec7ed26 36 delete serial_port;
babylonica 0:28807ec7ed26 37 delete time_out_timer;
babylonica 0:28807ec7ed26 38 }
babylonica 0:28807ec7ed26 39
babylonica 0:28807ec7ed26 40 void SerialConnect::send( const uint8_t *payload_array )
babylonica 0:28807ec7ed26 41 {
babylonica 0:28807ec7ed26 42 uint8_t checksum = 0;
babylonica 0:28807ec7ed26 43
babylonica 0:28807ec7ed26 44 send_buffer[0] = NSC_HEADER;
babylonica 0:28807ec7ed26 45 send_buffer[1] = payload_size;
babylonica 0:28807ec7ed26 46 for( int i = 0; i < payload_size; i++ ) {
babylonica 0:28807ec7ed26 47 send_buffer[i + 2] = payload_array[i];
babylonica 0:28807ec7ed26 48 checksum += payload_array[i];
babylonica 0:28807ec7ed26 49 }
babylonica 0:28807ec7ed26 50 send_buffer[payload_size + 2] = checksum;
babylonica 0:28807ec7ed26 51 send_buffer[payload_size + 3] = NSC_FOOTER;
babylonica 0:28807ec7ed26 52
babylonica 0:28807ec7ed26 53 serial_port->write( send_buffer, payload_size + 4 );
babylonica 0:28807ec7ed26 54
babylonica 0:28807ec7ed26 55 return;
babylonica 0:28807ec7ed26 56 }
babylonica 0:28807ec7ed26 57
babylonica 0:28807ec7ed26 58 update_result_e SerialConnect::update( void )
babylonica 0:28807ec7ed26 59 {
babylonica 0:28807ec7ed26 60 uint8_t data;
babylonica 0:28807ec7ed26 61 uint32_t i;
babylonica 0:28807ec7ed26 62 uint8_t checksum = 0;
babylonica 0:28807ec7ed26 63
babylonica 0:28807ec7ed26 64 if( serial_port->readable() > 0 ) {
babylonica 0:28807ec7ed26 65
babylonica 0:28807ec7ed26 66 if( time_out_timer->read_ms() > NSC_TIMEOUT && load_status != STATE_WAIT_HEADER ){
babylonica 0:28807ec7ed26 67 load_status = STATE_WAIT_HEADER;
babylonica 0:28807ec7ed26 68 }
babylonica 0:28807ec7ed26 69 time_out_timer->stop();
babylonica 0:28807ec7ed26 70 time_out_timer->reset();
babylonica 0:28807ec7ed26 71
babylonica 0:28807ec7ed26 72 data = serial_port->getc(); // 1byte取得
babylonica 0:28807ec7ed26 73
babylonica 0:28807ec7ed26 74 switch( load_status ) {
babylonica 0:28807ec7ed26 75 case STATE_WAIT_HEADER:
babylonica 0:28807ec7ed26 76 if( data == NSC_HEADER ) { // '@'
babylonica 0:28807ec7ed26 77 load_status = STATE_WAIT_LENGTH;
babylonica 0:28807ec7ed26 78 }
babylonica 0:28807ec7ed26 79 break;
babylonica 0:28807ec7ed26 80
babylonica 0:28807ec7ed26 81 case STATE_WAIT_LENGTH:
babylonica 0:28807ec7ed26 82 if( data == payload_size ) {
babylonica 0:28807ec7ed26 83 load_status = STATE_WAIT_PAYLOAD;
babylonica 0:28807ec7ed26 84 } else {
babylonica 0:28807ec7ed26 85 load_status = STATE_WAIT_HEADER;
babylonica 0:28807ec7ed26 86 }
babylonica 0:28807ec7ed26 87 break;
babylonica 0:28807ec7ed26 88
babylonica 0:28807ec7ed26 89 case STATE_WAIT_PAYLOAD:
babylonica 0:28807ec7ed26 90 if( payload_data_count < payload_size - 1 ) {
babylonica 0:28807ec7ed26 91 recv_buffer[payload_data_count] = data;
babylonica 0:28807ec7ed26 92 payload_data_count++;
babylonica 0:28807ec7ed26 93 } else {
babylonica 0:28807ec7ed26 94 recv_buffer[payload_data_count] = data;
babylonica 0:28807ec7ed26 95 payload_data_count = 0;
babylonica 0:28807ec7ed26 96 load_status = STATE_WAIT_CHECKSUM;
babylonica 0:28807ec7ed26 97 }
babylonica 0:28807ec7ed26 98 break;
babylonica 0:28807ec7ed26 99
babylonica 0:28807ec7ed26 100 case STATE_WAIT_CHECKSUM:
babylonica 0:28807ec7ed26 101 for( i = 0; i < payload_size; i++ ) {
babylonica 0:28807ec7ed26 102 checksum += recv_buffer[i];
babylonica 0:28807ec7ed26 103 }
babylonica 0:28807ec7ed26 104
babylonica 0:28807ec7ed26 105 if( data == checksum ) {
babylonica 0:28807ec7ed26 106 load_status = STATE_WAIT_FOOTER;
babylonica 0:28807ec7ed26 107 } else {
babylonica 0:28807ec7ed26 108 load_status = STATE_WAIT_HEADER;
babylonica 0:28807ec7ed26 109 }
babylonica 0:28807ec7ed26 110 break;
babylonica 0:28807ec7ed26 111
babylonica 0:28807ec7ed26 112 case STATE_WAIT_FOOTER:
babylonica 0:28807ec7ed26 113 if( data == NSC_FOOTER ) { // LF
babylonica 0:28807ec7ed26 114 for( i = 0; i < payload_size; i++ ) {
babylonica 0:28807ec7ed26 115 recieved_payload[i] = recv_buffer[i];
babylonica 0:28807ec7ed26 116 }
babylonica 0:28807ec7ed26 117 load_status = STATE_WAIT_HEADER;
babylonica 0:28807ec7ed26 118
babylonica 0:28807ec7ed26 119 return READY;
babylonica 0:28807ec7ed26 120 } else {
babylonica 0:28807ec7ed26 121 load_status = STATE_WAIT_HEADER;
babylonica 0:28807ec7ed26 122 }
babylonica 0:28807ec7ed26 123
babylonica 0:28807ec7ed26 124 break;
babylonica 0:28807ec7ed26 125 }
babylonica 0:28807ec7ed26 126 }
babylonica 0:28807ec7ed26 127
babylonica 0:28807ec7ed26 128 time_out_timer->start();
babylonica 0:28807ec7ed26 129
babylonica 0:28807ec7ed26 130 return NOT_READY;
babylonica 0:28807ec7ed26 131 }