Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: HYBRYD2018_IZU_GROUND_STATION HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_GNDv1 Hybrid_IZU2019 ... more
ES920LR.hpp
00001 #pragma once 00002 /* 00003 * ES920LR ライブラリ ver0.2.2 00004 * RSSI値、アドレス付与はまだ未対応です。 00005 * データ形式はbinaryです。asciiには未対応です。 00006 * 設定の変更はあらかじめ行うという形式です。 00007 */ 00008 00009 #include "mbed.h" 00010 00011 const int ES920LR_BUFF_SIZE = 70; 00012 const int ES920LR_FUNC_NUMBER = 256; 00013 const int ES920LR_DATA_INTERVAL = 10000;//[us] 00014 00015 /** 00016 @brief 920MHz帯無線機ES920LRを簡単に使えるクラス 00017 */ 00018 00019 00020 class ES920LR { 00021 00022 public: 00023 00024 typedef enum END_COMMAND { 00025 endl = 1, 00026 asciiEnd = 2 00027 }end_command; 00028 00029 00030 //ノード種別設定 00031 typedef enum NODE { 00032 Coordinator = 1, 00033 EndDevice = 2 00034 }nodeNumber; 00035 00036 //帯域幅 00037 typedef enum BAND_WIDTH { 00038 _62_5kHz = 3, 00039 _125kHz = 4, 00040 _250kHz = 5, 00041 _500kHz = 6 00042 }band_width; 00043 00044 //転送モード選択 00045 typedef enum TRANSMODE { 00046 Payload = 1, 00047 Frame = 2 00048 }transmode; 00049 00050 typedef enum ON_OFF { 00051 OFF = 2, 00052 ON = 1 00053 }on_off; 00054 00055 typedef enum Operation { 00056 Configuration = 1, 00057 Operation = 2 00058 }operation; 00059 00060 00061 typedef enum es920lr_buff_classify { 00062 BUFF_A = 0, 00063 BUFF_B = 1 00064 }ES920LR_Buff_Classify; 00065 00066 //解析方法に関する変数 00067 const int WAIT_TIME_US = 1000; 00068 00069 typedef enum { 00070 DATA_STRING = 0, //データの文字列 00071 RESPONSE_STRING = 1, //OKかNGのレスポンスの文字列 00072 NORMAL_STRING = 2, 00073 OTHER_STRING = 3, 00074 RECEIVE_ID = 4, 00075 INTERACTIVE_STRING = 5 00076 }ES920LR_Analyze_Selector; 00077 00078 00079 public: 00080 /*ES920LR(RawSerial &serial, const int baud = 115200){ 00081 AB = BUFF_A; 00082 ser = &serial; 00083 _baud = baud; 00084 ser->baud(_baud); 00085 init(); 00086 ser->attach(this, &ES920LR::es920lrHandler, Serial::RxIrq);//受信割り込み設定 00087 _es920lr_timer.start();//タイマースタート 00088 printf("hello world\r\n"); 00089 }*/ 00090 ES920LR(RawSerial &serial, RawSerial &pc, const int baud = 115200 ){ 00091 AB = BUFF_A; 00092 ser = &serial; 00093 _pc = &pc; 00094 _baud = baud; 00095 ser->baud(_baud); 00096 init(); 00097 _es920lr_timer.start();//タイマースタート 00098 printf("hello world\r\n"); 00099 wait(2.0f); 00100 ser->attach(this, &ES920LR::es920lrHandler, Serial::RxIrq);//受信割り込み設定 00101 } 00102 private: 00103 00104 RawSerial * ser; 00105 RawSerial * _pc; 00106 Timer _es920lr_timer; 00107 int _baud; 00108 00109 00110 //バッファ関連の変数 00111 char buff_A[ES920LR_BUFF_SIZE]; 00112 char buff_B[ES920LR_BUFF_SIZE]; 00113 char* readBuffAddr; 00114 char* writeBuffAddr; 00115 ES920LR_Buff_Classify AB; 00116 00117 int es920lr_dataLength; 00118 00119 union ES920LR_CAST { 00120 double d; 00121 float f; 00122 long l; 00123 int i; 00124 short s; 00125 char c; 00126 char u[8]; 00127 }; 00128 union ES920LR_CAST es920lr_cast; 00129 00130 00131 int sendDataSize; 00132 void(*p_callFunc[256])(void); 00133 char sendBuff[52]; 00134 00135 nodeNumber _nodeNumber;//ノード種別 00136 band_width _band_width;//帯域幅 00137 int _diffusivity;//拡散率 00138 int _ch;//チャンネル 00139 ON_OFF _ack;//ack受信設定 00140 ON_OFF _rcvid;//レシーブID表示設定 00141 transmode _transmode;//転送モード 00142 operation _operation;//起動モード 00143 int _baudrate;//UART速度 00144 int _power;//出力 00145 int _sendtime;//自動送信時間 00146 char _senddata[51];//自動送信データ 00147 uint16_t _panid;//PANネットワークアドレス 00148 uint16_t _ownid;//自ノードのネットワークアドレス 00149 uint16_t _dstid;//送信先ノードのネットワークアドレス 00150 ON_OFF _rssiAdd;//RSSI値を付加するかどうか 00151 00152 int sendIndex;//送信バッファの現在のインデックス,1以上51以下 00153 int responseFlag;//送信後のレスポンスを受け取るかどうか 00154 00155 void init() { 00156 _nodeNumber = Coordinator; 00157 _band_width = _125kHz; 00158 _diffusivity = 7;//拡散率 00159 _ch = 1;//チャンネル 00160 _ack = OFF;//ack受信設定 00161 _rcvid = OFF;//レシーブID表示設定 00162 _transmode = Payload;//転送モード 00163 _operation = Operation;//起動モード 00164 _baudrate = 115200;//UART速度 00165 _rssiAdd = OFF; 00166 _power = 13; 00167 _sendtime = 0; 00168 memset(sendBuff, '\0', 51);//送信バッファの初期化 00169 _panid = 0x0001; 00170 _ownid = 0x0001; 00171 _dstid = 0x0000; 00172 00173 memset(buff_A, '\0', ES920LR_BUFF_SIZE);//受信バッファの初期化 00174 memset(buff_B, '\0', ES920LR_BUFF_SIZE); 00175 readBuffAddr = buff_B; 00176 writeBuffAddr = buff_A; 00177 sendDataSize = 0; 00178 memset(data, '\0', 50);//受信データ配列の初期化 00179 for (int i = 0; i < 256; ++i) {//関数ポインタにダミー関数を設定 00180 p_callFunc[i] = NULL;//&this->dummyFunc; 00181 } 00182 es920lr_dataLength = 0; 00183 sendIndex = 1; 00184 memset(rssi, '\0', 5); 00185 memset(rcvPANID, '\0', 5); 00186 memset(rcvADDR, '\0', 5); 00187 header = 0; 00188 responseFlag = 0; 00189 //ser->printf("start\r\n"); 00190 ser->baud(115200); 00191 wait(0.5f); 00192 00193 } 00194 00195 public: 00196 00197 char data[51]; 00198 char rssi[5];//最新の電波強度 00199 char rcvPANID[5]; 00200 char rcvADDR[5]; 00201 char header;//最新のデータのヘッダー 00202 00203 00204 00205 //送信バッファを送信する 00206 void send() { 00207 //_pc->printf("index:%d\r\n", sendIndex); 00208 sendBuff[0] = (uint8_t)(sendIndex - 1);//sendIndexは一つ大きいので 00209 sendBuff[sendIndex + 1] = '\0';//printf用に最後にnullを追加 00210 responseFlag = 1; 00211 for (int i = 0; i <= sendIndex; ++i) { 00212 ser->putc(sendBuff[i]); 00213 } 00214 //ser->printf("%s", sendBuff);//putcにすべきだった 00215 ////_pc->printf("index: %d\r\n", sendIndex); 00216 ////_pc->printf("send: "); 00217 for (int i = 0; i < sendIndex; ++i) { 00218 ////_pc->printf("%02X ", sendBuff[i]); 00219 } 00220 ////_pc->printf("\r\n"); 00221 00222 00223 //初期化 00224 sendIndex = 1; 00225 memset(sendBuff, '\0', 52); 00226 } 00227 00228 //送信バッファに追加 00229 void Write(char arg) { 00230 if (sendIndex < 51) {//気持ち悪いが、index==51が最大 00231 es920lr_cast.c = arg; 00232 sendBuff[sendIndex] = es920lr_cast.u[0];//sendIndexは初期値1なので、+1は必要ない 00233 sendIndex += 1; 00234 } 00235 } 00236 void Write(unsigned char arg) { 00237 if (sendIndex < 51) {//気持ち悪いが、index==51が最大 00238 es920lr_cast.c = arg; 00239 sendBuff[sendIndex] = es920lr_cast.u[0];//sendIndexは初期値1なので、+1は必要ない 00240 sendIndex += 1; 00241 } 00242 } 00243 void Write(short arg) { 00244 if (sendIndex < 50) { 00245 es920lr_cast.s = arg; 00246 for (int i = 0; i < 2; ++i) { 00247 sendBuff[sendIndex] = es920lr_cast.u[i]; 00248 ++sendIndex; 00249 } 00250 } 00251 } 00252 void Write(unsigned short arg) { 00253 if (sendIndex < 50) { 00254 es920lr_cast.s = arg; 00255 for (int i = 0; i < 2; ++i) { 00256 sendBuff[sendIndex] = es920lr_cast.u[i]; 00257 ++sendIndex; 00258 } 00259 } 00260 } 00261 void Write(int arg) { 00262 if (sendIndex < 48) { 00263 es920lr_cast.i = arg; 00264 for (int i = 0; i < 4; ++i) { 00265 sendBuff[sendIndex] = es920lr_cast.u[i]; 00266 ++sendIndex; 00267 } 00268 } 00269 } 00270 void Write(unsigned int arg) { 00271 if (sendIndex < 48) { 00272 es920lr_cast.i = arg; 00273 for (int i = 0; i < 4; ++i) { 00274 sendBuff[sendIndex] = es920lr_cast.u[i]; 00275 ++sendIndex; 00276 } 00277 } 00278 } 00279 void Write(float arg) { 00280 if (sendIndex < 48) { 00281 es920lr_cast.f = arg; 00282 for (int i = 0; i < 4; ++i) { 00283 sendBuff[sendIndex] = es920lr_cast.u[i]; 00284 ++sendIndex; 00285 } 00286 } 00287 } 00288 void Write(double arg) { 00289 if (sendIndex < 44) { 00290 es920lr_cast.d = arg; 00291 for (int i = 0; i < 8; ++i) { 00292 sendBuff[sendIndex] = es920lr_cast.u[i]; 00293 ++sendIndex; 00294 } 00295 } 00296 } 00297 void Write(long arg) { 00298 if (sendIndex < 44) { 00299 es920lr_cast.l = arg; 00300 for (int i = 0; i < 8; ++i) { 00301 sendBuff[sendIndex] = es920lr_cast.u[i]; 00302 ++sendIndex; 00303 } 00304 } 00305 } 00306 00307 /** 00308 @bref データ処理関数を設定 00309 @param *funcAddr 関数ポインタ、void型引数無し関数のみ設定可 00310 @param header 関数を選択する0~255のヘッダー 00311 */ 00312 void attach(void(*funcAddr)(void), unsigned char myHeader) { 00313 p_callFunc[myHeader] = funcAddr; 00314 return; 00315 } 00316 00317 int asciiToNumber(char c) { 00318 //printf("%c ", c); 00319 int temp = (int)c; 00320 if (temp >= 65) {//A ~ F 00321 return (temp - 55); 00322 } 00323 else {//0 ~ 9 00324 return (temp - 48); 00325 } 00326 } 00327 00328 //RSSI値を数値に変換する 00329 int calcRSSI() { 00330 return asciiToNumber(rssi[0]) * 4096 + asciiToNumber(rssi[1]) * 256 + asciiToNumber(rssi[2]) * 16 + asciiToNumber(rssi[3]); 00331 } 00332 00333 void dummyFunc() { 00334 printf("ATTACH NO FUNCTION\r\n"); 00335 } 00336 00337 short toShort(char *array) { 00338 //es920lr_cast.s = ((uint16_t)array[0] << 8) | (uint16_t)array[1]; 00339 es920lr_cast.u[0] = array[0]; 00340 es920lr_cast.u[1] = array[1]; 00341 return es920lr_cast.s; 00342 } 00343 short toShort(int i) { 00344 return toShort(&data[i]); 00345 } 00346 00347 int toInt(char *array) { 00348 //es920lr_cast.i = ((uint32_t)array[0] << 24) | ((uint32_t)array[1] << 16) | ((uint32_t)array[2] << 8) | (uint32_t)array[3]; 00349 es920lr_cast.u[0] = array[0]; 00350 es920lr_cast.u[1] = array[1]; 00351 es920lr_cast.u[2] = array[2]; 00352 es920lr_cast.u[3] = array[3]; 00353 return es920lr_cast.i; 00354 } 00355 int toInt(int i) { 00356 return toInt(&data[i]); 00357 } 00358 00359 float toFloat(char *array) { 00360 es920lr_cast.u[0] = array[0]; 00361 es920lr_cast.u[1] = array[1]; 00362 es920lr_cast.u[2] = array[2]; 00363 es920lr_cast.u[3] = array[3]; 00364 return es920lr_cast.f; 00365 } 00366 float toFloat(int i) { 00367 return toFloat(&data[i]); 00368 } 00369 00370 double toDouble(char *array) { 00371 for (int i = 0; i< 8; ++i) { 00372 es920lr_cast.u[i] = array[i]; 00373 } 00374 return es920lr_cast.d; 00375 } 00376 double toDouble(int i) { 00377 return toDouble(&data[i]); 00378 } 00379 00380 long toLong(char *array) { 00381 for (int i = 0; i < 8; ++i) { 00382 es920lr_cast.u[i] = array[i]; 00383 } 00384 return es920lr_cast.l; 00385 } 00386 long toLong(int i) { 00387 return toLong(&data[i]); 00388 } 00389 00390 private: 00391 //1文字受信するたびに呼ばれ、データを受信バッファに入れる 00392 void es920lrHandler() { 00393 00394 static int index = -1;//バッファのイテレータとなる 00395 static char c = 0;//受信したデータを一旦入れる 00396 static int firstFlag = 1;//最初の1byteなら1 00397 static int dataSize = 0; 00398 static int callTime[2] = {0, 0}; 00399 00400 c = ser->getc();//1byte受信 00401 00402 //_pc->printf("%02X ", c); 00403 00404 callTime[1] = _es920lr_timer.read_us();//現在の時刻を取得 00405 if (abs(callTime[1] - callTime[0]) > ES920LR_DATA_INTERVAL) {//前の呼び出しとのΔtから新しいデータか判断 00406 firstFlag = 1; 00407 } 00408 callTime[0] = callTime[1];//時刻の更新 00409 00410 //バイナリモードを想定 00411 if (firstFlag) { 00412 dataSize = (unsigned char)c; 00413 firstFlag = 0; 00414 index = 0; 00415 return; 00416 } 00417 else { 00418 writeBuffAddr[index] = c; 00419 00420 if (index == (dataSize - 1)) {//1パケット終わり 00421 firstFlag = 1; 00422 writeBuffAddr[index + 1] = '\0';//終端文字追加 00423 //printf("%s\r\n", writeBuffAddr); 00424 /*printf("wbuf: "); 00425 for (int i = 0; i < 49; ++i) { 00426 printf("%02X ", writeBuffAddr[i]); 00427 } 00428 printf("\r\n"); 00429 */ 00430 00431 00432 if (AB == BUFF_A) {//現在バッファAに書き込み中 00433 readBuffAddr = buff_A; 00434 writeBuffAddr = buff_B; 00435 AB = BUFF_B; 00436 } 00437 else {//現在バッファBに書き込み中 00438 readBuffAddr = buff_B; 00439 writeBuffAddr = buff_A; 00440 AB = BUFF_A; 00441 } 00442 00443 if (!responseFlag) {//レスポンスではない 00444 00445 //es920lr_debug(); 00446 data_analyze(dataSize);//data配列をつくって、rssi値などを更新 00447 00448 //デバッグ 00449 //printf("%s ", rssi); 00450 for (int i = 0; i < 49; ++i) { 00451 ////_pc->printf("%02X ", data[i]); 00452 } 00453 ////_pc->printf("\r\n"); 00454 ////_pc->printf("header: %02X\r\n", header); 00455 ////_pc->printf("size: %d\r\n", dataSize); 00456 00457 //ユーザー関数呼び出し 00458 if (p_callFunc[(uint8_t)header] != NULL) { 00459 (*p_callFunc[(uint8_t)header])(); 00460 } 00461 } 00462 else {//レスポンス 00463 responseFlag = 0; 00464 //デバッグ 00465 ////_pc->printf("res %s\r\n", readBuffAddr); 00466 } 00467 } 00468 00469 ++index;//カウントをインクリメント 00470 return; 00471 } 00472 } 00473 00474 //デバッグ用 00475 void es920lr_debug() { 00476 printf("%s\r\n", readBuffAddr); 00477 } 00478 00479 //シリアル通信の通信速度変更 ※設定を変更するわけではない 00480 void baud(int baudrate) { 00481 ser->baud(baudrate); 00482 } 00483 00484 00485 00486 /** 00487 @bref データを取得します 00488 */ 00489 void data_analyze(int length) { 00490 static char tempStr[70] = {}; 00491 00492 for (int i = 0; i < length; ++i) tempStr[i] = readBuffAddr[i]; 00493 00494 memset(data, 0, 50); 00495 if (_rcvid == ON) {//相手ノードネットワークアドレス付与設定 00496 if (_rssiAdd == OFF) { 00497 //AAAABBBB!!!!...!\0 00498 // | | | +- <CR><LF>文字列終了 00499 // | | +------- データ 00500 // | +------------ 送信元アドレス 00501 // +---------------- 送信元PAN ID 00502 for (int i = 0; i < 4; ++i) { 00503 rcvPANID[i] = tempStr[i]; 00504 rcvADDR[4 + i] = tempStr[4 + i]; 00505 } 00506 header = tempStr[8]; 00507 //strncpy(data, &tempStr[9], length - 9); 00508 for (int i = 0; i < length - 9; ++i) { 00509 data[i] = tempStr[9 + i]; 00510 } 00511 return; 00512 } 00513 else { 00514 //1111AAAABBBB!!!!...!\0 00515 // | | | | +-- <CR><LF>文字列終了 00516 // | | | +------- データ 00517 // | | +------------ 送信元アドレス 00518 // | +---------------- 送信元PAN ID 00519 // +--------------------- RSSI値 00520 for (int i = 0; i < 4; ++i) { 00521 rssi[i] = tempStr[i]; 00522 rcvPANID[4 + i] = tempStr[4 + i]; 00523 rcvADDR[8 + i] = tempStr[8 + i]; 00524 } 00525 header = tempStr[12]; 00526 //strncpy(data, &tempStr[13], length - 13); 00527 for (int i = 0; i < length - 13; ++i) { 00528 data[i] = tempStr[13 + i]; 00529 } 00530 } 00531 } 00532 else {//相手ノードネットワークアドレスなし 00533 if (_rssiAdd == OFF) { 00534 //!!!!...!\0 00535 header = tempStr[0]; 00536 //strncpy(data, &tempStr[1], length-1); 00537 for (int i = 0; i < length - 1; ++i) { 00538 data[i] = tempStr[1 + i]; 00539 } 00540 return; 00541 } 00542 else {//RSSI値付与 00543 //1111!!!!...!\0 00544 // | | +-- <CR><LF>文字列終了 00545 // | +-------- データ 00546 // +------------- RSSI値 00547 for (int i = 0; i < 4; ++i) { 00548 rssi[i] = tempStr[i]; 00549 } 00550 //strncpy(data, &tempStr[5], length- 5); 00551 for (int i = 0; i < length - 5; ++i) { 00552 data[i] = tempStr[5 + i]; 00553 } 00554 } 00555 } 00556 00557 } 00558 00559 00560 00561 }; 00562 00563 00564 //<<演算子オーバーロード 00565 ES920LR& operator<<(ES920LR& es, const char& arg) { 00566 es.Write(arg); 00567 return es; 00568 } 00569 00570 ES920LR& operator<<(ES920LR& es, const unsigned char& arg) { 00571 es.Write(arg); 00572 return es; 00573 } 00574 00575 ES920LR& operator<<(ES920LR& es, const short& arg) { 00576 es.Write(arg); 00577 return es; 00578 } 00579 00580 ES920LR& operator<<(ES920LR& es, const unsigned short& arg) { 00581 es.Write(arg); 00582 return es; 00583 } 00584 00585 ES920LR& operator<<(ES920LR& es, const int& arg) { 00586 es.Write(arg); 00587 return es; 00588 } 00589 00590 ES920LR& operator<<(ES920LR& es, const unsigned int& arg) { 00591 es.Write(arg); 00592 return es; 00593 } 00594 00595 ES920LR& operator<<(ES920LR& es, const long& arg) { 00596 es.Write(arg); 00597 return es; 00598 } 00599 ES920LR& operator<<(ES920LR& es, const float& arg) { 00600 es.Write(arg); 00601 return es; 00602 } 00603 00604 ES920LR& operator<<(ES920LR& es, const double& arg) { 00605 es.Write(arg); 00606 return es; 00607 } 00608 00609 void operator<<(ES920LR& es, const ES920LR::END_COMMAND cmd) { 00610 00611 switch (cmd) 00612 { 00613 case ES920LR::endl: 00614 es.send(); 00615 break; 00616 case ES920LR::asciiEnd: 00617 es.Write('\r'); 00618 es.Write('\n'); 00619 es.send(); 00620 break; 00621 } 00622 00623 }
Generated on Fri Aug 12 2022 13:20:45 by
