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

Dependents:   HYBRYD2018_IZU_GROUND_STATION HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_GNDv1 Hybrid_IZU2019 ... more

Committer:
Sigma884
Date:
Tue Feb 19 14:59:40 2019 +0000
Revision:
5:edea51bbe249
Parent:
3:4e3a413e04d9
?

Who changed what in which revision?

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