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

Dependencies:   AsyncSerial

Committer:
babylonica
Date:
Sat Jan 26 14:31:03 2019 +0000
Revision:
0:28807ec7ed26
First Commit. (beta)

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.hpp
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 @see このソースコードのコメントにはDoxygen方式を使っています.Doxygenを使ってコンパイルすることで,html形式のAPIドキュメントを生成できます.
babylonica 0:28807ec7ed26 16
babylonica 0:28807ec7ed26 17 @copyright T.Kawamura (C) 2019 <contact@bit-plus.work>
babylonica 0:28807ec7ed26 18
babylonica 0:28807ec7ed26 19 */
babylonica 0:28807ec7ed26 20
babylonica 0:28807ec7ed26 21 #ifndef NSC_SENDRECV_H
babylonica 0:28807ec7ed26 22 #define NSC_SENDRECV_H
babylonica 0:28807ec7ed26 23
babylonica 0:28807ec7ed26 24 // Includes ////////////////////////////////////////////////////////////////////
babylonica 0:28807ec7ed26 25 #include "mbed.h" // mbed OS 2.0 Rev 146
babylonica 0:28807ec7ed26 26 #include <cstring>
babylonica 0:28807ec7ed26 27 // mbed のサイトからAsyncSerialをインポートすること
babylonica 0:28807ec7ed26 28 #include "AsyncSerial.hpp"
babylonica 0:28807ec7ed26 29
babylonica 0:28807ec7ed26 30 using namespace std;
babylonica 0:28807ec7ed26 31
babylonica 0:28807ec7ed26 32 // Definitions ////////////////////////////////////////////////////////////////
babylonica 0:28807ec7ed26 33 #define NSC_HEADER 0x40
babylonica 0:28807ec7ed26 34 #define NSC_FOOTER 0x0A
babylonica 0:28807ec7ed26 35 #define NSC_TIMEOUT 1000
babylonica 0:28807ec7ed26 36
babylonica 0:28807ec7ed26 37 #ifndef NSC_MAX_PACKET_SIZE
babylonica 0:28807ec7ed26 38 #define NSC_MAX_PACKET_SIZE 128
babylonica 0:28807ec7ed26 39 #endif
babylonica 0:28807ec7ed26 40
babylonica 0:28807ec7ed26 41 // 受信状態
babylonica 0:28807ec7ed26 42 enum loadstate_e{
babylonica 0:28807ec7ed26 43 STATE_WAIT_HEADER,
babylonica 0:28807ec7ed26 44 STATE_WAIT_LENGTH,
babylonica 0:28807ec7ed26 45 STATE_WAIT_PAYLOAD,
babylonica 0:28807ec7ed26 46 STATE_WAIT_CHECKSUM,
babylonica 0:28807ec7ed26 47 STATE_WAIT_FOOTER
babylonica 0:28807ec7ed26 48 };
babylonica 0:28807ec7ed26 49 // 受信結果取得用
babylonica 0:28807ec7ed26 50 enum update_result_e{
babylonica 0:28807ec7ed26 51 NOT_READY,
babylonica 0:28807ec7ed26 52 READY
babylonica 0:28807ec7ed26 53 };
babylonica 0:28807ec7ed26 54
babylonica 0:28807ec7ed26 55 // Class //////////////////////////////////////////////////////////////////////
babylonica 0:28807ec7ed26 56 /*!
babylonica 0:28807ec7ed26 57 @class SerialConnect
babylonica 0:28807ec7ed26 58 @brief NSC形式パケットの送受信
babylonica 0:28807ec7ed26 59 */
babylonica 0:28807ec7ed26 60 class SerialConnect {
babylonica 0:28807ec7ed26 61 private:
babylonica 0:28807ec7ed26 62
babylonica 0:28807ec7ed26 63 // シリアルポート
babylonica 0:28807ec7ed26 64 AsyncSerial *serial_port;
babylonica 0:28807ec7ed26 65 // バイト間タイムアウト用タイマ
babylonica 0:28807ec7ed26 66 Timer *time_out_timer;
babylonica 0:28807ec7ed26 67 // 送信パケットのバッファ
babylonica 0:28807ec7ed26 68 uint8_t send_buffer[NSC_MAX_PACKET_SIZE];
babylonica 0:28807ec7ed26 69 // ペイロードの大きさ(Byte)
babylonica 0:28807ec7ed26 70 int payload_size;
babylonica 0:28807ec7ed26 71 // 状態遷移用
babylonica 0:28807ec7ed26 72 loadstate_e load_status;
babylonica 0:28807ec7ed26 73 // パケットの受信処理で使用するバッファ
babylonica 0:28807ec7ed26 74 uint8_t recv_buffer[NSC_MAX_PACKET_SIZE];
babylonica 0:28807ec7ed26 75 // ペイロードの受信完了データの大きさ
babylonica 0:28807ec7ed26 76 uint8_t payload_data_count;
babylonica 0:28807ec7ed26 77 // ペイロードの格納場所
babylonica 0:28807ec7ed26 78 uint8_t recieved_payload[NSC_MAX_PACKET_SIZE];
babylonica 0:28807ec7ed26 79
babylonica 0:28807ec7ed26 80
babylonica 0:28807ec7ed26 81 public:
babylonica 0:28807ec7ed26 82 /*!
babylonica 0:28807ec7ed26 83 @brief コンストラクタ
babylonica 0:28807ec7ed26 84 片方向通信でTx, Rxのどちらかのピンを使わない場合は,ピン番号を"NC"とすること.
babylonica 0:28807ec7ed26 85
babylonica 0:28807ec7ed26 86 @param txpin パケットを送信するピン(PinNames.hで定義されたもの)
babylonica 0:28807ec7ed26 87 @param rxpin パケットを受信するピン(PinNames.hで定義されたもの)
babylonica 0:28807ec7ed26 88 @param payload_size やりとりするパケットのペイロードの大きさ(Byte)
babylonica 0:28807ec7ed26 89 @param baudrate ボーレート(省略可,デフォルトは115200bps)
babylonica 0:28807ec7ed26 90 @param uart_fifo_buffer_size UARTのリングバッファのサイズ(省略可,デフォルトは256Byte)
babylonica 0:28807ec7ed26 91 */
babylonica 0:28807ec7ed26 92 SerialConnect(PinName txpin, PinName rxpin, uint32_t payload_size, uint32_t baudrate=115200, uint32_t uart_fifo_buffer_size=256);
babylonica 0:28807ec7ed26 93
babylonica 0:28807ec7ed26 94 /*!
babylonica 0:28807ec7ed26 95 @brief デストラクタ
babylonica 0:28807ec7ed26 96 */
babylonica 0:28807ec7ed26 97 virtual ~SerialConnect( void );
babylonica 0:28807ec7ed26 98
babylonica 0:28807ec7ed26 99 /*!
babylonica 0:28807ec7ed26 100 @brief パケットの送信
babylonica 0:28807ec7ed26 101
babylonica 0:28807ec7ed26 102 @param uint8_t* payload_array 送信したい配列のポインタ
babylonica 0:28807ec7ed26 103 */
babylonica 0:28807ec7ed26 104 virtual void send( const uint8_t *payload_array );
babylonica 0:28807ec7ed26 105
babylonica 0:28807ec7ed26 106 /*!
babylonica 0:28807ec7ed26 107 @brief パケット受信処理を行う
babylonica 0:28807ec7ed26 108
babylonica 0:28807ec7ed26 109 メインループ内で毎回必ずこのメソッドを呼び、返り値を見てOKならペイロードの格納が完了しています。
babylonica 0:28807ec7ed26 110
babylonica 0:28807ec7ed26 111 @retval update_result_e READY ペイロードの正常な受信および格納が完了
babylonica 0:28807ec7ed26 112 @retval update_result_e NOT_READY ペイロードの受信処理が続行中
babylonica 0:28807ec7ed26 113 */
babylonica 0:28807ec7ed26 114 virtual update_result_e update( void );
babylonica 0:28807ec7ed26 115
babylonica 0:28807ec7ed26 116 /*!
babylonica 0:28807ec7ed26 117 @brief ペイロードのGetter
babylonica 0:28807ec7ed26 118
babylonica 0:28807ec7ed26 119 格納済みのペイロードを読み出します。
babylonica 0:28807ec7ed26 120 配列の要素取得と同じように、インデックスを引数として渡します。
babylonica 0:28807ec7ed26 121
babylonica 0:28807ec7ed26 122 注意: 必ずupdateメソッドでペイロードの受信完了を確認し,その後実行してください
babylonica 0:28807ec7ed26 123
babylonica 0:28807ec7ed26 124 @param index 要素のインデックス
babylonica 0:28807ec7ed26 125
babylonica 0:28807ec7ed26 126 @return uint8_t 要素
babylonica 0:28807ec7ed26 127 */
babylonica 0:28807ec7ed26 128 virtual uint8_t get_payload_by_1byte( uint8_t index ) { return recieved_payload[index]; }
babylonica 0:28807ec7ed26 129
babylonica 0:28807ec7ed26 130 };
babylonica 0:28807ec7ed26 131
babylonica 0:28807ec7ed26 132
babylonica 0:28807ec7ed26 133 #endif // NSC_SENDRECV_H