PQ_Hybrid_Electrical_Equipment_Team / ES920LR

Dependents:   HYBRYD2018_IZU_GROUND_STATION HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_GNDv1 Hybrid_IZU2019 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ES920LR.hpp Source File

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 }