920MHz帯無線機モジュール ES920LR用ライブラリ いわゆるLoRaWAN

Dependents:   HYBRYD2018_IZU_GROUND_STATION HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_GNDv1 Hybrid_IZU2019 ... more

Committer:
Gaku0606
Date:
Tue Feb 20 02:08:18 2018 +0000
Revision:
0:3dede5174e85
Child:
1:febb32df437c
ver 0.2.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gaku0606 0:3dede5174e85 1 #pragma once
Gaku0606 0:3dede5174e85 2 /*
Gaku0606 0:3dede5174e85 3 * ES920LR ライブラリ ver0.2.1
Gaku0606 0:3dede5174e85 4 * RSSI値、アドレス付与はまだ未対応です。
Gaku0606 0:3dede5174e85 5 * データ形式はbinaryです。asciiには未対応です。
Gaku0606 0:3dede5174e85 6 * 設定の変更はあらかじめ行うという形式です。
Gaku0606 0:3dede5174e85 7 */
Gaku0606 0:3dede5174e85 8
Gaku0606 0:3dede5174e85 9 #include "mbed.h"
Gaku0606 0:3dede5174e85 10
Gaku0606 0:3dede5174e85 11 const int ES920LR_BUFF_SIZE = 70;
Gaku0606 0:3dede5174e85 12 const int ES920LR_FUNC_NUMBER = 256;
Gaku0606 0:3dede5174e85 13 const int ES920LR_DATA_INTERVAL = 10000;//[us]
Gaku0606 0:3dede5174e85 14
Gaku0606 0:3dede5174e85 15 /**
Gaku0606 0:3dede5174e85 16 @brief 920MHz帯無線機ES920LRを簡単に使えるクラス
Gaku0606 0:3dede5174e85 17 */
Gaku0606 0:3dede5174e85 18
Gaku0606 0:3dede5174e85 19
Gaku0606 0:3dede5174e85 20 class ES920LR {
Gaku0606 0:3dede5174e85 21
Gaku0606 0:3dede5174e85 22 public:
Gaku0606 0:3dede5174e85 23
Gaku0606 0:3dede5174e85 24 typedef enum END_COMMAND {
Gaku0606 0:3dede5174e85 25 endl = 1,
Gaku0606 0:3dede5174e85 26 asciiEnd = 2
Gaku0606 0:3dede5174e85 27 }end_command;
Gaku0606 0:3dede5174e85 28
Gaku0606 0:3dede5174e85 29
Gaku0606 0:3dede5174e85 30 //ノード種別設定
Gaku0606 0:3dede5174e85 31 typedef enum NODE {
Gaku0606 0:3dede5174e85 32 Coordinator = 1,
Gaku0606 0:3dede5174e85 33 EndDevice = 2
Gaku0606 0:3dede5174e85 34 }nodeNumber;
Gaku0606 0:3dede5174e85 35
Gaku0606 0:3dede5174e85 36 //帯域幅
Gaku0606 0:3dede5174e85 37 typedef enum BAND_WIDTH {
Gaku0606 0:3dede5174e85 38 _62_5kHz = 3,
Gaku0606 0:3dede5174e85 39 _125kHz = 4,
Gaku0606 0:3dede5174e85 40 _250kHz = 5,
Gaku0606 0:3dede5174e85 41 _500kHz = 6
Gaku0606 0:3dede5174e85 42 }band_width;
Gaku0606 0:3dede5174e85 43
Gaku0606 0:3dede5174e85 44 //転送モード選択
Gaku0606 0:3dede5174e85 45 typedef enum TRANSMODE {
Gaku0606 0:3dede5174e85 46 Payload = 1,
Gaku0606 0:3dede5174e85 47 Frame = 2
Gaku0606 0:3dede5174e85 48 }transmode;
Gaku0606 0:3dede5174e85 49
Gaku0606 0:3dede5174e85 50 typedef enum ON_OFF {
Gaku0606 0:3dede5174e85 51 OFF = 2,
Gaku0606 0:3dede5174e85 52 ON = 1
Gaku0606 0:3dede5174e85 53 }on_off;
Gaku0606 0:3dede5174e85 54
Gaku0606 0:3dede5174e85 55 typedef enum Operation {
Gaku0606 0:3dede5174e85 56 Configuration = 1,
Gaku0606 0:3dede5174e85 57 Operation = 2
Gaku0606 0:3dede5174e85 58 }operation;
Gaku0606 0:3dede5174e85 59
Gaku0606 0:3dede5174e85 60
Gaku0606 0:3dede5174e85 61 typedef enum es920lr_buff_classify {
Gaku0606 0:3dede5174e85 62 BUFF_A = 0,
Gaku0606 0:3dede5174e85 63 BUFF_B = 1
Gaku0606 0:3dede5174e85 64 }ES920LR_Buff_Classify;
Gaku0606 0:3dede5174e85 65
Gaku0606 0:3dede5174e85 66 //解析方法に関する変数
Gaku0606 0:3dede5174e85 67 const int WAIT_TIME_US = 1000;
Gaku0606 0:3dede5174e85 68
Gaku0606 0:3dede5174e85 69 typedef enum {
Gaku0606 0:3dede5174e85 70 DATA_STRING = 0, //データの文字列
Gaku0606 0:3dede5174e85 71 RESPONSE_STRING = 1, //OKかNGのレスポンスの文字列
Gaku0606 0:3dede5174e85 72 NORMAL_STRING = 2,
Gaku0606 0:3dede5174e85 73 OTHER_STRING = 3,
Gaku0606 0:3dede5174e85 74 RECEIVE_ID = 4,
Gaku0606 0:3dede5174e85 75 INTERACTIVE_STRING = 5
Gaku0606 0:3dede5174e85 76 }ES920LR_Analyze_Selector;
Gaku0606 0:3dede5174e85 77
Gaku0606 0:3dede5174e85 78
Gaku0606 0:3dede5174e85 79 public:
Gaku0606 0:3dede5174e85 80 ES920LR(Serial &serial, const int baud = 115200){
Gaku0606 0:3dede5174e85 81 AB = BUFF_A;
Gaku0606 0:3dede5174e85 82 ser = &serial;
Gaku0606 0:3dede5174e85 83 _baud = baud;
Gaku0606 0:3dede5174e85 84 ser->baud(_baud);
Gaku0606 0:3dede5174e85 85 init();
Gaku0606 0:3dede5174e85 86 ser->attach(this, &ES920LR::es920lrHandler, Serial::RxIrq);//受信割り込み設定
Gaku0606 0:3dede5174e85 87 _es920lr_timer.start();//タイマースタート
Gaku0606 0:3dede5174e85 88 printf("hello world\r\n");
Gaku0606 0:3dede5174e85 89 }
Gaku0606 0:3dede5174e85 90
Gaku0606 0:3dede5174e85 91 private:
Gaku0606 0:3dede5174e85 92
Gaku0606 0:3dede5174e85 93 Serial * ser;
Gaku0606 0:3dede5174e85 94 Timer _es920lr_timer;
Gaku0606 0:3dede5174e85 95 int _baud;
Gaku0606 0:3dede5174e85 96
Gaku0606 0:3dede5174e85 97
Gaku0606 0:3dede5174e85 98 //バッファ関連の変数
Gaku0606 0:3dede5174e85 99 char buff_A[ES920LR_BUFF_SIZE];
Gaku0606 0:3dede5174e85 100 char buff_B[ES920LR_BUFF_SIZE];
Gaku0606 0:3dede5174e85 101 char* readBuffAddr;
Gaku0606 0:3dede5174e85 102 char* writeBuffAddr;
Gaku0606 0:3dede5174e85 103 ES920LR_Buff_Classify AB;
Gaku0606 0:3dede5174e85 104
Gaku0606 0:3dede5174e85 105 int es920lr_dataLength;
Gaku0606 0:3dede5174e85 106
Gaku0606 0:3dede5174e85 107 union ES920LR_CAST {
Gaku0606 0:3dede5174e85 108 double d;
Gaku0606 0:3dede5174e85 109 float f;
Gaku0606 0:3dede5174e85 110 long l;
Gaku0606 0:3dede5174e85 111 int i;
Gaku0606 0:3dede5174e85 112 short s;
Gaku0606 0:3dede5174e85 113 char c;
Gaku0606 0:3dede5174e85 114 char u[8];
Gaku0606 0:3dede5174e85 115 };
Gaku0606 0:3dede5174e85 116 union ES920LR_CAST es920lr_cast;
Gaku0606 0:3dede5174e85 117
Gaku0606 0:3dede5174e85 118 char data[51];
Gaku0606 0:3dede5174e85 119 int sendDataSize;
Gaku0606 0:3dede5174e85 120 void(*p_callFunc[256])(void);
Gaku0606 0:3dede5174e85 121 char sendBuff[52];
Gaku0606 0:3dede5174e85 122
Gaku0606 0:3dede5174e85 123 nodeNumber _nodeNumber;//ノード種別
Gaku0606 0:3dede5174e85 124 band_width _band_width;//帯域幅
Gaku0606 0:3dede5174e85 125 int _diffusivity;//拡散率
Gaku0606 0:3dede5174e85 126 int _ch;//チャンネル
Gaku0606 0:3dede5174e85 127 ON_OFF _ack;//ack受信設定
Gaku0606 0:3dede5174e85 128 ON_OFF _rcvid;//レシーブID表示設定
Gaku0606 0:3dede5174e85 129 transmode _transmode;//転送モード
Gaku0606 0:3dede5174e85 130 operation _operation;//起動モード
Gaku0606 0:3dede5174e85 131 int _baudrate;//UART速度
Gaku0606 0:3dede5174e85 132 int _power;//出力
Gaku0606 0:3dede5174e85 133 int _sendtime;//自動送信時間
Gaku0606 0:3dede5174e85 134 char _senddata[51];//自動送信データ
Gaku0606 0:3dede5174e85 135 uint16_t _panid;//PANネットワークアドレス
Gaku0606 0:3dede5174e85 136 uint16_t _ownid;//自ノードのネットワークアドレス
Gaku0606 0:3dede5174e85 137 uint16_t _dstid;//送信先ノードのネットワークアドレス
Gaku0606 0:3dede5174e85 138 ON_OFF _rssiAdd;//RSSI値を付加するかどうか
Gaku0606 0:3dede5174e85 139
Gaku0606 0:3dede5174e85 140 int sendIndex;//送信バッファの現在のインデックス,1以上51以下
Gaku0606 0:3dede5174e85 141 int responseFlag = 0;//送信後のレスポンスを受け取るかどうか
Gaku0606 0:3dede5174e85 142
Gaku0606 0:3dede5174e85 143 public:
Gaku0606 0:3dede5174e85 144
Gaku0606 0:3dede5174e85 145 char rssi[5];//最新の電波強度
Gaku0606 0:3dede5174e85 146 char rcvPANID[5];
Gaku0606 0:3dede5174e85 147 char rcvADDR[5];
Gaku0606 0:3dede5174e85 148 char header;//最新のデータのヘッダー
Gaku0606 0:3dede5174e85 149
Gaku0606 0:3dede5174e85 150 void init(){
Gaku0606 0:3dede5174e85 151 _nodeNumber = Coordinator;
Gaku0606 0:3dede5174e85 152 _band_width = _125kHz;
Gaku0606 0:3dede5174e85 153 _diffusivity = 7;//拡散率
Gaku0606 0:3dede5174e85 154 _ch = 1;//チャンネル
Gaku0606 0:3dede5174e85 155 _ack = OFF;//ack受信設定
Gaku0606 0:3dede5174e85 156 _rcvid = OFF;//レシーブID表示設定
Gaku0606 0:3dede5174e85 157 _transmode = Payload;//転送モード
Gaku0606 0:3dede5174e85 158 _operation = Operation;//起動モード
Gaku0606 0:3dede5174e85 159 _baudrate = 115200;//UART速度
Gaku0606 0:3dede5174e85 160 _rssiAdd = OFF;
Gaku0606 0:3dede5174e85 161 _power = 13;
Gaku0606 0:3dede5174e85 162 _sendtime = 0;
Gaku0606 0:3dede5174e85 163 memset(sendBuff, '\0', 51);//送信バッファの初期化
Gaku0606 0:3dede5174e85 164 _panid = 0x0001;
Gaku0606 0:3dede5174e85 165 _ownid = 0x0001;
Gaku0606 0:3dede5174e85 166 _dstid = 0x0000;
Gaku0606 0:3dede5174e85 167
Gaku0606 0:3dede5174e85 168 memset(buff_A, '\0', ES920LR_BUFF_SIZE);//受信バッファの初期化
Gaku0606 0:3dede5174e85 169 memset(buff_B, '\0', ES920LR_BUFF_SIZE);
Gaku0606 0:3dede5174e85 170 readBuffAddr = buff_B;
Gaku0606 0:3dede5174e85 171 writeBuffAddr = buff_A;
Gaku0606 0:3dede5174e85 172 sendDataSize = 0;
Gaku0606 0:3dede5174e85 173 memset(data, '\0', 50);//受信データ配列の初期化
Gaku0606 0:3dede5174e85 174 for (int i = 0; i < 256; ++i) {//関数ポインタにダミー関数を設定
Gaku0606 0:3dede5174e85 175 p_callFunc[i] = NULL;//&this->dummyFunc;
Gaku0606 0:3dede5174e85 176 }
Gaku0606 0:3dede5174e85 177 es920lr_dataLength = 0;
Gaku0606 0:3dede5174e85 178 sendIndex = 1;
Gaku0606 0:3dede5174e85 179 memset(rssi, '\0', 5);
Gaku0606 0:3dede5174e85 180 memset(rcvPANID, '\0', 5);
Gaku0606 0:3dede5174e85 181 memset(rcvADDR, '\0', 5);
Gaku0606 0:3dede5174e85 182 header = 0;
Gaku0606 0:3dede5174e85 183
Gaku0606 0:3dede5174e85 184 ser->printf("start\r\n");
Gaku0606 0:3dede5174e85 185 wait(0.5f);
Gaku0606 0:3dede5174e85 186
Gaku0606 0:3dede5174e85 187 }
Gaku0606 0:3dede5174e85 188
Gaku0606 0:3dede5174e85 189 //送信バッファを送信する
Gaku0606 0:3dede5174e85 190 void send() {
Gaku0606 0:3dede5174e85 191 printf("index:%d\r\n", sendIndex);
Gaku0606 0:3dede5174e85 192 sendBuff[0] = (uint8_t)(sendIndex - 1);//sendIndexは一つ大きいので
Gaku0606 0:3dede5174e85 193 sendBuff[sendIndex + 1] = '\0';//printf用に最後にnullを追加
Gaku0606 0:3dede5174e85 194 responseFlag = 1;
Gaku0606 0:3dede5174e85 195 for (int i = 0; i <= sendIndex; ++i) {
Gaku0606 0:3dede5174e85 196 ser->putc(sendBuff[i]);
Gaku0606 0:3dede5174e85 197 }
Gaku0606 0:3dede5174e85 198 //ser->printf("%s", sendBuff);//putcにすべきだった
Gaku0606 0:3dede5174e85 199
Gaku0606 0:3dede5174e85 200 printf("send: ");
Gaku0606 0:3dede5174e85 201 for (int i = 0; i < sendIndex; ++i) {
Gaku0606 0:3dede5174e85 202 printf("%02X ", sendBuff[i]);
Gaku0606 0:3dede5174e85 203 }
Gaku0606 0:3dede5174e85 204 printf("\r\n");
Gaku0606 0:3dede5174e85 205
Gaku0606 0:3dede5174e85 206
Gaku0606 0:3dede5174e85 207 //初期化
Gaku0606 0:3dede5174e85 208 sendIndex = 1;
Gaku0606 0:3dede5174e85 209 memset(sendBuff, '\0', 52);
Gaku0606 0:3dede5174e85 210 }
Gaku0606 0:3dede5174e85 211
Gaku0606 0:3dede5174e85 212 //送信バッファに追加
Gaku0606 0:3dede5174e85 213 void Write(char arg) {
Gaku0606 0:3dede5174e85 214 if (sendIndex < 51) {//気持ち悪いが、index==51が最大
Gaku0606 0:3dede5174e85 215 es920lr_cast.c = arg;
Gaku0606 0:3dede5174e85 216 sendBuff[sendIndex] = es920lr_cast.u[0];//sendIndexは初期値1なので、+1は必要ない
Gaku0606 0:3dede5174e85 217 sendIndex += 1;
Gaku0606 0:3dede5174e85 218 }
Gaku0606 0:3dede5174e85 219 }
Gaku0606 0:3dede5174e85 220 void Write(unsigned char arg) {
Gaku0606 0:3dede5174e85 221 if (sendIndex < 51) {//気持ち悪いが、index==51が最大
Gaku0606 0:3dede5174e85 222 es920lr_cast.c = arg;
Gaku0606 0:3dede5174e85 223 sendBuff[sendIndex] = es920lr_cast.u[0];//sendIndexは初期値1なので、+1は必要ない
Gaku0606 0:3dede5174e85 224 sendIndex += 1;
Gaku0606 0:3dede5174e85 225 }
Gaku0606 0:3dede5174e85 226 }
Gaku0606 0:3dede5174e85 227 void Write(short arg) {
Gaku0606 0:3dede5174e85 228 if (sendIndex < 50) {
Gaku0606 0:3dede5174e85 229 es920lr_cast.s = arg;
Gaku0606 0:3dede5174e85 230 for (int i = 0; i < 2; ++i) {
Gaku0606 0:3dede5174e85 231 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 232 ++sendIndex;
Gaku0606 0:3dede5174e85 233 }
Gaku0606 0:3dede5174e85 234 }
Gaku0606 0:3dede5174e85 235 }
Gaku0606 0:3dede5174e85 236 void Write(unsigned short arg) {
Gaku0606 0:3dede5174e85 237 if (sendIndex < 50) {
Gaku0606 0:3dede5174e85 238 es920lr_cast.s = arg;
Gaku0606 0:3dede5174e85 239 for (int i = 0; i < 2; ++i) {
Gaku0606 0:3dede5174e85 240 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 241 ++sendIndex;
Gaku0606 0:3dede5174e85 242 }
Gaku0606 0:3dede5174e85 243 }
Gaku0606 0:3dede5174e85 244 }
Gaku0606 0:3dede5174e85 245 void Write(int arg) {
Gaku0606 0:3dede5174e85 246 if (sendIndex < 48) {
Gaku0606 0:3dede5174e85 247 es920lr_cast.i = arg;
Gaku0606 0:3dede5174e85 248 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 249 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 250 ++sendIndex;
Gaku0606 0:3dede5174e85 251 }
Gaku0606 0:3dede5174e85 252 }
Gaku0606 0:3dede5174e85 253 }
Gaku0606 0:3dede5174e85 254 void Write(unsigned int arg) {
Gaku0606 0:3dede5174e85 255 if (sendIndex < 48) {
Gaku0606 0:3dede5174e85 256 es920lr_cast.i = arg;
Gaku0606 0:3dede5174e85 257 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 258 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 259 ++sendIndex;
Gaku0606 0:3dede5174e85 260 }
Gaku0606 0:3dede5174e85 261 }
Gaku0606 0:3dede5174e85 262 }
Gaku0606 0:3dede5174e85 263 void Write(float arg) {
Gaku0606 0:3dede5174e85 264 if (sendIndex < 48) {
Gaku0606 0:3dede5174e85 265 es920lr_cast.f = arg;
Gaku0606 0:3dede5174e85 266 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 267 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 268 ++sendIndex;
Gaku0606 0:3dede5174e85 269 }
Gaku0606 0:3dede5174e85 270 }
Gaku0606 0:3dede5174e85 271 }
Gaku0606 0:3dede5174e85 272 void Write(double arg) {
Gaku0606 0:3dede5174e85 273 if (sendIndex < 44) {
Gaku0606 0:3dede5174e85 274 es920lr_cast.d = arg;
Gaku0606 0:3dede5174e85 275 for (int i = 0; i < 8; ++i) {
Gaku0606 0:3dede5174e85 276 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 277 ++sendIndex;
Gaku0606 0:3dede5174e85 278 }
Gaku0606 0:3dede5174e85 279 }
Gaku0606 0:3dede5174e85 280 }
Gaku0606 0:3dede5174e85 281 void Write(long arg) {
Gaku0606 0:3dede5174e85 282 if (sendIndex < 44) {
Gaku0606 0:3dede5174e85 283 es920lr_cast.l = arg;
Gaku0606 0:3dede5174e85 284 for (int i = 0; i < 8; ++i) {
Gaku0606 0:3dede5174e85 285 sendBuff[sendIndex] = es920lr_cast.u[i];
Gaku0606 0:3dede5174e85 286 ++sendIndex;
Gaku0606 0:3dede5174e85 287 }
Gaku0606 0:3dede5174e85 288 }
Gaku0606 0:3dede5174e85 289 }
Gaku0606 0:3dede5174e85 290
Gaku0606 0:3dede5174e85 291 /**
Gaku0606 0:3dede5174e85 292 @bref データ処理関数を設定
Gaku0606 0:3dede5174e85 293 @param *funcAddr 関数ポインタ、void型引数無し関数のみ設定可
Gaku0606 0:3dede5174e85 294 @param header 関数を選択する0~255のヘッダー
Gaku0606 0:3dede5174e85 295 */
Gaku0606 0:3dede5174e85 296 void attach(void(*funcAddr)(void), unsigned char myHeader) {
Gaku0606 0:3dede5174e85 297 p_callFunc[myHeader] = funcAddr;
Gaku0606 0:3dede5174e85 298 return;
Gaku0606 0:3dede5174e85 299 }
Gaku0606 0:3dede5174e85 300
Gaku0606 0:3dede5174e85 301 //1文字受信するたびに呼ばれ、データを受信バッファに入れる
Gaku0606 0:3dede5174e85 302 void es920lrHandler() {
Gaku0606 0:3dede5174e85 303
Gaku0606 0:3dede5174e85 304 static int index = -1;//バッファのイテレータとなる
Gaku0606 0:3dede5174e85 305 static char c = 0;//受信したデータを一旦入れる
Gaku0606 0:3dede5174e85 306 static int firstFlag = 1;//最初の1byteなら1
Gaku0606 0:3dede5174e85 307 static int dataSize = 0;
Gaku0606 0:3dede5174e85 308 static int callTime[2] = {0, 0};
Gaku0606 0:3dede5174e85 309
Gaku0606 0:3dede5174e85 310 c = ser->getc();//1byte受信
Gaku0606 0:3dede5174e85 311
Gaku0606 0:3dede5174e85 312 //printf("%02X ", c);
Gaku0606 0:3dede5174e85 313
Gaku0606 0:3dede5174e85 314 callTime[1] = _es920lr_timer.read_us();//現在の時刻を取得
Gaku0606 0:3dede5174e85 315 if (abs(callTime[1] - callTime[0]) > ES920LR_DATA_INTERVAL) {//前の呼び出しとのΔtから新しいデータか判断
Gaku0606 0:3dede5174e85 316 firstFlag = 1;
Gaku0606 0:3dede5174e85 317 }
Gaku0606 0:3dede5174e85 318 callTime[0] = callTime[1];//時刻の更新
Gaku0606 0:3dede5174e85 319
Gaku0606 0:3dede5174e85 320 //バイナリモードを想定
Gaku0606 0:3dede5174e85 321 if (firstFlag) {
Gaku0606 0:3dede5174e85 322 dataSize = (unsigned char)c;
Gaku0606 0:3dede5174e85 323 firstFlag = 0;
Gaku0606 0:3dede5174e85 324 index = 0;
Gaku0606 0:3dede5174e85 325 return;
Gaku0606 0:3dede5174e85 326 }
Gaku0606 0:3dede5174e85 327 else {
Gaku0606 0:3dede5174e85 328 writeBuffAddr[index] = c;
Gaku0606 0:3dede5174e85 329
Gaku0606 0:3dede5174e85 330 if (index == (dataSize - 1)) {//1パケット終わり
Gaku0606 0:3dede5174e85 331 firstFlag = 1;
Gaku0606 0:3dede5174e85 332 writeBuffAddr[index + 1] = '\0';//終端文字追加
Gaku0606 0:3dede5174e85 333 //printf("%s\r\n", writeBuffAddr);
Gaku0606 0:3dede5174e85 334 printf("wbuf: ");
Gaku0606 0:3dede5174e85 335 for (int i = 0; i < 49; ++i) {
Gaku0606 0:3dede5174e85 336 printf("%02X ", writeBuffAddr[i]);
Gaku0606 0:3dede5174e85 337 }
Gaku0606 0:3dede5174e85 338 printf("\r\n");
Gaku0606 0:3dede5174e85 339
Gaku0606 0:3dede5174e85 340
Gaku0606 0:3dede5174e85 341 if (AB == BUFF_A) {//現在バッファAに書き込み中
Gaku0606 0:3dede5174e85 342 readBuffAddr = buff_A;
Gaku0606 0:3dede5174e85 343 writeBuffAddr = buff_B;
Gaku0606 0:3dede5174e85 344 AB = BUFF_B;
Gaku0606 0:3dede5174e85 345 }
Gaku0606 0:3dede5174e85 346 else {//現在バッファBに書き込み中
Gaku0606 0:3dede5174e85 347 readBuffAddr = buff_B;
Gaku0606 0:3dede5174e85 348 writeBuffAddr = buff_A;
Gaku0606 0:3dede5174e85 349 AB = BUFF_A;
Gaku0606 0:3dede5174e85 350 }
Gaku0606 0:3dede5174e85 351
Gaku0606 0:3dede5174e85 352 if (!responseFlag) {//レスポンスではない
Gaku0606 0:3dede5174e85 353
Gaku0606 0:3dede5174e85 354 //es920lr_debug();
Gaku0606 0:3dede5174e85 355 data_analyze(dataSize);//data配列をつくって、rssi値などを更新
Gaku0606 0:3dede5174e85 356
Gaku0606 0:3dede5174e85 357 //デバッグ
Gaku0606 0:3dede5174e85 358 //printf("%s ", rssi);
Gaku0606 0:3dede5174e85 359 for (int i = 0; i < 49; ++i) {
Gaku0606 0:3dede5174e85 360 printf("%02X ", data[i]);
Gaku0606 0:3dede5174e85 361 }
Gaku0606 0:3dede5174e85 362 printf("\r\n");
Gaku0606 0:3dede5174e85 363 printf("header: %02X\r\n", header);
Gaku0606 0:3dede5174e85 364 printf("size: %d\r\n", dataSize);
Gaku0606 0:3dede5174e85 365
Gaku0606 0:3dede5174e85 366 //ユーザー関数呼び出し
Gaku0606 0:3dede5174e85 367 if (p_callFunc[(uint8_t)header] != NULL) {
Gaku0606 0:3dede5174e85 368 (*p_callFunc[(uint8_t)header])();
Gaku0606 0:3dede5174e85 369 }
Gaku0606 0:3dede5174e85 370 }
Gaku0606 0:3dede5174e85 371 else {//レスポンス
Gaku0606 0:3dede5174e85 372 responseFlag = 0;
Gaku0606 0:3dede5174e85 373 //デバッグ
Gaku0606 0:3dede5174e85 374 printf("res %s\r\n", readBuffAddr);
Gaku0606 0:3dede5174e85 375 }
Gaku0606 0:3dede5174e85 376 }
Gaku0606 0:3dede5174e85 377
Gaku0606 0:3dede5174e85 378 ++index;//カウントをインクリメント
Gaku0606 0:3dede5174e85 379 return;
Gaku0606 0:3dede5174e85 380 }
Gaku0606 0:3dede5174e85 381 }
Gaku0606 0:3dede5174e85 382
Gaku0606 0:3dede5174e85 383 //デバッグ用
Gaku0606 0:3dede5174e85 384 void es920lr_debug() {
Gaku0606 0:3dede5174e85 385 printf("%s\r\n", readBuffAddr);
Gaku0606 0:3dede5174e85 386 }
Gaku0606 0:3dede5174e85 387
Gaku0606 0:3dede5174e85 388 //シリアル通信の通信速度変更 ※設定を変更するわけではない
Gaku0606 0:3dede5174e85 389 void baud(int baudrate) {
Gaku0606 0:3dede5174e85 390 ser->baud(baudrate);
Gaku0606 0:3dede5174e85 391 }
Gaku0606 0:3dede5174e85 392
Gaku0606 0:3dede5174e85 393 int asciiToNumber(char c) {
Gaku0606 0:3dede5174e85 394 //printf("%c ", c);
Gaku0606 0:3dede5174e85 395 int temp = (int)c;
Gaku0606 0:3dede5174e85 396 if (temp >= 65) {//A ~ F
Gaku0606 0:3dede5174e85 397 return (temp - 55);
Gaku0606 0:3dede5174e85 398 }
Gaku0606 0:3dede5174e85 399 else {//0 ~ 9
Gaku0606 0:3dede5174e85 400 return (temp - 48);
Gaku0606 0:3dede5174e85 401 }
Gaku0606 0:3dede5174e85 402 }
Gaku0606 0:3dede5174e85 403
Gaku0606 0:3dede5174e85 404 /**
Gaku0606 0:3dede5174e85 405 @bref データを取得します
Gaku0606 0:3dede5174e85 406 */
Gaku0606 0:3dede5174e85 407 void data_analyze(int length) {
Gaku0606 0:3dede5174e85 408 static char tempStr[70] = {};
Gaku0606 0:3dede5174e85 409
Gaku0606 0:3dede5174e85 410 for (int i = 0; i < length; ++i) tempStr[i] = readBuffAddr[i];
Gaku0606 0:3dede5174e85 411
Gaku0606 0:3dede5174e85 412 memset(data, 0, 50);
Gaku0606 0:3dede5174e85 413 if (_rcvid == ON) {//相手ノードネットワークアドレス付与設定
Gaku0606 0:3dede5174e85 414 if (_rssiAdd == OFF) {
Gaku0606 0:3dede5174e85 415 //AAAABBBB!!!!...!\0
Gaku0606 0:3dede5174e85 416 // | | | +- <CR><LF>文字列終了
Gaku0606 0:3dede5174e85 417 // | | +------- データ
Gaku0606 0:3dede5174e85 418 // | +------------ 送信元アドレス
Gaku0606 0:3dede5174e85 419 // +---------------- 送信元PAN ID
Gaku0606 0:3dede5174e85 420 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 421 rcvPANID[i] = tempStr[i];
Gaku0606 0:3dede5174e85 422 rcvADDR[4 + i] = tempStr[4 + i];
Gaku0606 0:3dede5174e85 423 }
Gaku0606 0:3dede5174e85 424 header = tempStr[8];
Gaku0606 0:3dede5174e85 425 //strncpy(data, &tempStr[9], length - 9);
Gaku0606 0:3dede5174e85 426 for (int i = 0; i < length - 9; ++i) {
Gaku0606 0:3dede5174e85 427 data[i] = tempStr[9 + i];
Gaku0606 0:3dede5174e85 428 }
Gaku0606 0:3dede5174e85 429 return;
Gaku0606 0:3dede5174e85 430 }
Gaku0606 0:3dede5174e85 431 else {
Gaku0606 0:3dede5174e85 432 //1111AAAABBBB!!!!...!\0
Gaku0606 0:3dede5174e85 433 // | | | | +-- <CR><LF>文字列終了
Gaku0606 0:3dede5174e85 434 // | | | +------- データ
Gaku0606 0:3dede5174e85 435 // | | +------------ 送信元アドレス
Gaku0606 0:3dede5174e85 436 // | +---------------- 送信元PAN ID
Gaku0606 0:3dede5174e85 437 // +--------------------- RSSI値
Gaku0606 0:3dede5174e85 438 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 439 rssi[i] = tempStr[i];
Gaku0606 0:3dede5174e85 440 rcvPANID[4 + i] = tempStr[4 + i];
Gaku0606 0:3dede5174e85 441 rcvADDR[8 + i] = tempStr[8 + i];
Gaku0606 0:3dede5174e85 442 }
Gaku0606 0:3dede5174e85 443 header = tempStr[12];
Gaku0606 0:3dede5174e85 444 //strncpy(data, &tempStr[13], length - 13);
Gaku0606 0:3dede5174e85 445 for (int i = 0; i < length - 13; ++i) {
Gaku0606 0:3dede5174e85 446 data[i] = tempStr[13 + i];
Gaku0606 0:3dede5174e85 447 }
Gaku0606 0:3dede5174e85 448 }
Gaku0606 0:3dede5174e85 449 }
Gaku0606 0:3dede5174e85 450 else {//相手ノードネットワークアドレスなし
Gaku0606 0:3dede5174e85 451 if (_rssiAdd == OFF) {
Gaku0606 0:3dede5174e85 452 //!!!!...!\0
Gaku0606 0:3dede5174e85 453 header = tempStr[0];
Gaku0606 0:3dede5174e85 454 //strncpy(data, &tempStr[1], length-1);
Gaku0606 0:3dede5174e85 455 for (int i = 0; i < length - 1; ++i) {
Gaku0606 0:3dede5174e85 456 data[i] = tempStr[1 + i];
Gaku0606 0:3dede5174e85 457 }
Gaku0606 0:3dede5174e85 458 return;
Gaku0606 0:3dede5174e85 459 }
Gaku0606 0:3dede5174e85 460 else {//RSSI値付与
Gaku0606 0:3dede5174e85 461 //1111!!!!...!\0
Gaku0606 0:3dede5174e85 462 // | | +-- <CR><LF>文字列終了
Gaku0606 0:3dede5174e85 463 // | +-------- データ
Gaku0606 0:3dede5174e85 464 // +------------- RSSI値
Gaku0606 0:3dede5174e85 465 for (int i = 0; i < 4; ++i) {
Gaku0606 0:3dede5174e85 466 rssi[i] = tempStr[i];
Gaku0606 0:3dede5174e85 467 }
Gaku0606 0:3dede5174e85 468 //strncpy(data, &tempStr[5], length- 5);
Gaku0606 0:3dede5174e85 469 for (int i = 0; i < length - 5; ++i) {
Gaku0606 0:3dede5174e85 470 data[i] = tempStr[5 + i];
Gaku0606 0:3dede5174e85 471 }
Gaku0606 0:3dede5174e85 472 }
Gaku0606 0:3dede5174e85 473 }
Gaku0606 0:3dede5174e85 474
Gaku0606 0:3dede5174e85 475 }
Gaku0606 0:3dede5174e85 476
Gaku0606 0:3dede5174e85 477 //RSSI値を数値に変換する
Gaku0606 0:3dede5174e85 478 int calcRSSI() {
Gaku0606 0:3dede5174e85 479 return asciiToNumber(rssi[0]) * 4096 + asciiToNumber(rssi[1]) * 256 + asciiToNumber(rssi[2]) * 16 + asciiToNumber(rssi[3]);
Gaku0606 0:3dede5174e85 480 }
Gaku0606 0:3dede5174e85 481
Gaku0606 0:3dede5174e85 482 void dummyFunc() {
Gaku0606 0:3dede5174e85 483 printf("ATTACH NO FUNCTION\r\n");
Gaku0606 0:3dede5174e85 484 }
Gaku0606 0:3dede5174e85 485
Gaku0606 0:3dede5174e85 486 short toShort(char *array) {
Gaku0606 0:3dede5174e85 487 //es920lr_cast.s = ((uint16_t)array[0] << 8) | (uint16_t)array[1];
Gaku0606 0:3dede5174e85 488 es920lr_cast.u[0] = array[0];
Gaku0606 0:3dede5174e85 489 es920lr_cast.u[1] = array[1];
Gaku0606 0:3dede5174e85 490 return es920lr_cast.s;
Gaku0606 0:3dede5174e85 491 }
Gaku0606 0:3dede5174e85 492 short toShort(int i) {
Gaku0606 0:3dede5174e85 493 return toShort(&data[i]);
Gaku0606 0:3dede5174e85 494 }
Gaku0606 0:3dede5174e85 495
Gaku0606 0:3dede5174e85 496 int toInt(char *array) {
Gaku0606 0:3dede5174e85 497 //es920lr_cast.i = ((uint32_t)array[0] << 24) | ((uint32_t)array[1] << 16) | ((uint32_t)array[2] << 8) | (uint32_t)array[3];
Gaku0606 0:3dede5174e85 498 es920lr_cast.u[0] = array[0];
Gaku0606 0:3dede5174e85 499 es920lr_cast.u[1] = array[1];
Gaku0606 0:3dede5174e85 500 es920lr_cast.u[2] = array[2];
Gaku0606 0:3dede5174e85 501 es920lr_cast.u[3] = array[3];
Gaku0606 0:3dede5174e85 502 return es920lr_cast.i;
Gaku0606 0:3dede5174e85 503 }
Gaku0606 0:3dede5174e85 504 int toInt(int i) {
Gaku0606 0:3dede5174e85 505 return toInt(&data[i]);
Gaku0606 0:3dede5174e85 506 }
Gaku0606 0:3dede5174e85 507
Gaku0606 0:3dede5174e85 508 float toFloat(char *array) {
Gaku0606 0:3dede5174e85 509 es920lr_cast.u[0] = array[0];
Gaku0606 0:3dede5174e85 510 es920lr_cast.u[1] = array[1];
Gaku0606 0:3dede5174e85 511 es920lr_cast.u[2] = array[2];
Gaku0606 0:3dede5174e85 512 es920lr_cast.u[3] = array[3];
Gaku0606 0:3dede5174e85 513 return es920lr_cast.f;
Gaku0606 0:3dede5174e85 514 }
Gaku0606 0:3dede5174e85 515 float toFloat(int i) {
Gaku0606 0:3dede5174e85 516 return toFloat(&data[i]);
Gaku0606 0:3dede5174e85 517 }
Gaku0606 0:3dede5174e85 518
Gaku0606 0:3dede5174e85 519 double toDouble(char *array) {
Gaku0606 0:3dede5174e85 520 for (int i = 0; i< 8; ++i) {
Gaku0606 0:3dede5174e85 521 es920lr_cast.u[i] = array[i];
Gaku0606 0:3dede5174e85 522 }
Gaku0606 0:3dede5174e85 523 return es920lr_cast.d;
Gaku0606 0:3dede5174e85 524 }
Gaku0606 0:3dede5174e85 525 double toDouble(int i) {
Gaku0606 0:3dede5174e85 526 return toDouble(&data[i]);
Gaku0606 0:3dede5174e85 527 }
Gaku0606 0:3dede5174e85 528
Gaku0606 0:3dede5174e85 529 long toLong(char *array) {
Gaku0606 0:3dede5174e85 530 for (int i = 0; i < 8; ++i) {
Gaku0606 0:3dede5174e85 531 es920lr_cast.u[i] = array[i];
Gaku0606 0:3dede5174e85 532 }
Gaku0606 0:3dede5174e85 533 return es920lr_cast.l;
Gaku0606 0:3dede5174e85 534 }
Gaku0606 0:3dede5174e85 535 long toLong(int i) {
Gaku0606 0:3dede5174e85 536 return toLong(&data[i]);
Gaku0606 0:3dede5174e85 537 }
Gaku0606 0:3dede5174e85 538
Gaku0606 0:3dede5174e85 539 };
Gaku0606 0:3dede5174e85 540
Gaku0606 0:3dede5174e85 541
Gaku0606 0:3dede5174e85 542 //<<演算子オーバーロード
Gaku0606 0:3dede5174e85 543 ES920LR& operator<<(ES920LR& es, const char& arg) {
Gaku0606 0:3dede5174e85 544 es.Write(arg);
Gaku0606 0:3dede5174e85 545 return es;
Gaku0606 0:3dede5174e85 546 }
Gaku0606 0:3dede5174e85 547
Gaku0606 0:3dede5174e85 548 ES920LR& operator<<(ES920LR& es, const unsigned char& arg) {
Gaku0606 0:3dede5174e85 549 es.Write(arg);
Gaku0606 0:3dede5174e85 550 return es;
Gaku0606 0:3dede5174e85 551 }
Gaku0606 0:3dede5174e85 552
Gaku0606 0:3dede5174e85 553 ES920LR& operator<<(ES920LR& es, const short& arg) {
Gaku0606 0:3dede5174e85 554 es.Write(arg);
Gaku0606 0:3dede5174e85 555 return es;
Gaku0606 0:3dede5174e85 556 }
Gaku0606 0:3dede5174e85 557
Gaku0606 0:3dede5174e85 558 ES920LR& operator<<(ES920LR& es, const unsigned short& arg) {
Gaku0606 0:3dede5174e85 559 es.Write(arg);
Gaku0606 0:3dede5174e85 560 return es;
Gaku0606 0:3dede5174e85 561 }
Gaku0606 0:3dede5174e85 562
Gaku0606 0:3dede5174e85 563 ES920LR& operator<<(ES920LR& es, const int& arg) {
Gaku0606 0:3dede5174e85 564 es.Write(arg);
Gaku0606 0:3dede5174e85 565 return es;
Gaku0606 0:3dede5174e85 566 }
Gaku0606 0:3dede5174e85 567
Gaku0606 0:3dede5174e85 568 ES920LR& operator<<(ES920LR& es, const unsigned int& arg) {
Gaku0606 0:3dede5174e85 569 es.Write(arg);
Gaku0606 0:3dede5174e85 570 return es;
Gaku0606 0:3dede5174e85 571 }
Gaku0606 0:3dede5174e85 572
Gaku0606 0:3dede5174e85 573 ES920LR& operator<<(ES920LR& es, const long& arg) {
Gaku0606 0:3dede5174e85 574 es.Write(arg);
Gaku0606 0:3dede5174e85 575 return es;
Gaku0606 0:3dede5174e85 576 }
Gaku0606 0:3dede5174e85 577 ES920LR& operator<<(ES920LR& es, const float& arg) {
Gaku0606 0:3dede5174e85 578 es.Write(arg);
Gaku0606 0:3dede5174e85 579 return es;
Gaku0606 0:3dede5174e85 580 }
Gaku0606 0:3dede5174e85 581
Gaku0606 0:3dede5174e85 582 ES920LR& operator<<(ES920LR& es, const double& arg) {
Gaku0606 0:3dede5174e85 583 es.Write(arg);
Gaku0606 0:3dede5174e85 584 return es;
Gaku0606 0:3dede5174e85 585 }
Gaku0606 0:3dede5174e85 586
Gaku0606 0:3dede5174e85 587 void operator<<(ES920LR& es, const ES920LR::END_COMMAND cmd) {
Gaku0606 0:3dede5174e85 588
Gaku0606 0:3dede5174e85 589 switch (cmd)
Gaku0606 0:3dede5174e85 590 {
Gaku0606 0:3dede5174e85 591 case ES920LR::endl:
Gaku0606 0:3dede5174e85 592 es.send();
Gaku0606 0:3dede5174e85 593 break;
Gaku0606 0:3dede5174e85 594 case ES920LR::asciiEnd:
Gaku0606 0:3dede5174e85 595 es.Write('\r');
Gaku0606 0:3dede5174e85 596 es.Write('\n');
Gaku0606 0:3dede5174e85 597 es.send();
Gaku0606 0:3dede5174e85 598 break;
Gaku0606 0:3dede5174e85 599 }
Gaku0606 0:3dede5174e85 600
Gaku0606 0:3dede5174e85 601 }