920MHz帯無線通信モジュールIM920のライブラリ

Dependents:   Hybrid_OB2021_MAIN Hybrid_OB2021_GROUND pressure_control_system pressure_control_receiver ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers IM920.h Source File

IM920.h

00001 #ifndef _IM920_H_
00002 #define _IM920_H_
00003 #include "mbed.h"
00004 
00005 #define IM920_BUFF_SIZE 160
00006 
00007 const int FUNC_NUMBER = 256;
00008 
00009 
00010 typedef enum im920_buff_classify{
00011     BUFF_A = 0,
00012     BUFF_B = 1
00013 }IM920_Buff_Classify;
00014 
00015 //解析方法に関する変数
00016 const int WAIT_TIME_US = 1000;
00017 typedef enum{
00018     DATA_STRING = 0,        //データの文字列
00019     RESPONSE_STRING = 1,    //OKかNGのレスポンスの文字列
00020     NORMAL_STRING = 2,
00021     OTHER_STRING = 3,
00022     RECEIVE_ID = 4,
00023     INTERACTIVE_STRING = 5
00024 }IM920_Analyze_Selector;
00025 
00026 
00027 
00028 static IM920_Buff_Classify AB = BUFF_A;
00029 
00030 class IM920{
00031     public:
00032         IM920(Serial &serial, Serial &pc, int baudrate = 19200);
00033     private:  
00034         Serial *ser;
00035         Serial *_pc;
00036         
00037         //バッファ関連の変数
00038         char buff_A[IM920_BUFF_SIZE];
00039         char buff_B[IM920_BUFF_SIZE];
00040         char* readBuffAddr;
00041         char* writeBuffAddr;
00042          
00043         
00044         char im920_dataLength;
00045         char im920_sendBuff[129];
00046         
00047         int nodeNumber;
00048         //インタラクティブモードから復帰できるかを示すフラグ
00049         //1ならインタラクティブモード、0なら通常モード
00050         int interactiveFlag;
00051         
00052         IM920_Analyze_Selector AS;
00053         
00054     public:
00055     
00056         union IM920_CAST{
00057             double d;
00058             float f;
00059             long l;
00060             int i;
00061             short s;
00062             char c;
00063             char u[8];
00064         };
00065         union IM920_CAST im920_cast; 
00066         
00067         char data[64];
00068         int sendDataSize;
00069         void (*p_callFunc[256])(void);
00070         char node;
00071         char RSSI;//受信強度
00072         int rID;//受信した送信機ID
00073         int ID; //自分の固有ID
00074         
00075         /**
00076           @note 無線機の設定を変更するわけではない
00077           @bref IM920XSとの通信ボーレート変更
00078           @param baudrate 1200,2400,4800,9600,19200,38400,57600 or 115200
00079         */
00080         void baud(int baudrate){
00081             ser->baud(baudrate);   
00082         }
00083         
00084         /**
00085           @bref インタラクティブモードへ移行する,@で復帰
00086         */
00087         void interactiveMode();
00088         
00089         /**
00090           @bref 16進数文字列データから数値データを取得します
00091         */
00092         void data_analyze();
00093         
00094         /**
00095           @bref データ処理関数を設定
00096           @param *funcAddr 関数ポインタ、void型引数無し関数のみ設定可
00097           @param header 関数を選択する0~255のヘッダー
00098         */
00099         void attach(void (*funcAddr)(void), unsigned header);
00100     
00101         /**
00102           @bref パラメータ不揮発メモリ書き込み許可モードへ移行
00103         */
00104         bool enableWrite();
00105         
00106             /**
00107               @bref パラメータ不揮発メモリ書き込み不許可モードへ移行
00108             */     
00109         bool disableWrite();
00110         
00111             /**
00112               @bref 固有IDを読み出す
00113             */
00114         int readID();
00115         
00116         /**
00117           @bref ノード番号をセットする
00118         */
00119         bool setNodeNumber(char nodeNum);   
00120         
00121         /**
00122           @bref ノード番号を読み出す
00123         */
00124         int readNodeNumber();   
00125         
00126         /**
00127             @bref 受信する無線機IDを一つ登録する
00128         */
00129         bool setReceiveID(int ID);
00130         
00131         /**
00132           @bref 登録されている受信IDを表示する
00133         */
00134         void readReceiveID();
00135         
00136         /**
00137           @bref 登録されている受信IDを全消去する
00138         */
00139         bool eraseReceiveID();      
00140         
00141         /**
00142           @bref 使用する周波数chを設定する
00143         */
00144         bool setChannel(char ch);   
00145         
00146         /**
00147           @bref 使用する周波数chを読み出す
00148         */
00149         char readChannel();         
00150         
00151         /**
00152           @bref アスキーコードの文字列で送受信ができるようにする
00153         */
00154         bool enableCharacterIO();   
00155         
00156         /**
00157           @bref バイナリ送受信モードへ移行
00158         */
00159         bool disableCharacterIO();  
00160         
00161         /**
00162           @bref 送信バッファにdouble型を一つ入れる
00163         */
00164         void write(double val);
00165         
00166         /**
00167           @bref 送信バッファにlong型を一つ入れる
00168         */
00169         void write(long val);
00170         
00171         /**
00172           @bref 送信バッファにfloat型を一つ入れる
00173         */
00174         void write(float val);
00175         /**
00176           @bref 送信バッファにint型を一つ入れる
00177         */
00178         void write(int val);
00179         
00180         /**
00181           @bref 送信バッファにshort型を一つ入れる
00182         */
00183         void write(short val);
00184         
00185         /**
00186           @bref 送信バッファにchar型を一つ入れる
00187         */
00188         void write(char val);
00189         
00190         /**
00191           @bref 送信バッファにfloat型を複数入れる
00192         */
00193        // void write(float *array, int count);
00194         
00195         template <typename T> void write(T *array, int count){
00196             for(int i = 0;i < count; i++){
00197                 write(array[i]);   
00198             }
00199         }
00200         /**
00201           @bref 送信バッファを送信する
00202         */
00203         void send();
00204         
00205         /**
00206           @bref 送信バッファにヘッダーを付ける、writeする前に使う
00207         */
00208         void header(char headerNumber){
00209             write(headerNumber);
00210         }
00211         
00212         /**
00213           @bref デバッグ用、受信バッファを表示
00214         */
00215         void im920_debug();
00216         
00217         /**
00218           @bref インタラクティブモードでコマンドを表示する
00219         */
00220         void printFormat();
00221         
00222         /**
00223           @bref データ配列をshort型に変換する
00224           @param array データのchar型配列、データの始まるアドレスを入れる
00225         */
00226         short toShort(char *array);
00227         short toShort(int i){
00228             return toShort(&data[i]);   
00229         }
00230         
00231         /**
00232           @bref データ配列をint型に変換する
00233           @param array データのchar型配列、データの始まるアドレスを入れる
00234         */
00235         int toInt(char *array);
00236         int toInt(int i){
00237             return toInt(&data[i]);   
00238         }
00239         /**
00240           @bref データ配列をfloat型に変換する
00241           @param array データのchar型配列、データの始まるアドレスを入れる
00242         */
00243         float toFloat(char *array);
00244         float toFloat(int i){
00245             return toFloat(&data[i]);   
00246         }
00247         /**
00248           @bref データ配列をlong型に変換する
00249           @param array データのchar型配列、データの始まるアドレスを入れる
00250         */
00251         long toLong(char *array);
00252         long toLong(int i){
00253             return toLong(&data[i]);   
00254         }
00255         
00256         /**
00257           @bref データ配列をdouble型に変換する
00258           @param array データのchar型配列、データの始まるアドレスを入れる
00259         */
00260         double toDouble(char *array);
00261         double toDouble(int i){
00262             return toDouble(&data[i]);   
00263         }
00264         /**
00265           @bref チェックサムを計算する
00266           @param count データの個数、何byteか
00267         */
00268         char im920CheckSum(int count);
00269         
00270         /**
00271           @bref 受信データのチェックサムの計算結果を入れる
00272         */
00273         char receiveCheckSum;
00274      
00275     private:
00276         
00277         /**
00278           @bref 1文字受信するごとに呼ばれ、受信バッファに入れる
00279         */
00280         void im920Handler();
00281         
00282         char checkSum;
00283 
00284         /**
00285           @bref 何もしない関数
00286         */
00287         static void dummyFunc(void);
00288         
00289         /**
00290           @bref 16進数文字を数値に変換する関数 
00291         */
00292         int asciiToNumber(char c);
00293 };
00294 
00295 inline void IM920::write(double val){
00296     if(sendDataSize <= 56){
00297         im920_cast.d = val;
00298         sprintf(im920_sendBuff, "%s%02X%02X%02X%02X%02X%02X%02X%02X", im920_sendBuff, im920_cast.u[0], im920_cast.u[1], im920_cast.u[2]
00299                                 , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]);
00300         sendDataSize += 8;
00301         checkSum = checkSum ^ im920_cast.u[7] ^ im920_cast.u[6] ^ im920_cast.u[5] ^ im920_cast.u[4] ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];
00302     }
00303 }
00304 
00305 inline void IM920::write(long val){
00306     if(sendDataSize <= 56){
00307         im920_cast.l = val;
00308         sprintf(im920_sendBuff, "%s%02X%02X%02X%02X%02X%02X%02X%02X", im920_sendBuff, im920_cast.u[0], im920_cast.u[1], im920_cast.u[2]
00309                                 , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]);   
00310         sendDataSize += 8;
00311         checkSum = checkSum ^ im920_cast.u[7] ^ im920_cast.u[6] ^ im920_cast.u[5] ^ im920_cast.u[4] ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];
00312     }   
00313 }
00314 
00315 inline void IM920::write(float val){
00316     if(sendDataSize <= 60){
00317         im920_cast.f = val;
00318         sprintf(im920_sendBuff, "%s%02X%02X%02X%02X",  im920_sendBuff, im920_cast.u[0],im920_cast.u[1],im920_cast.u[2],im920_cast.u[3]);
00319         sendDataSize += 4;
00320         checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];   
00321     }
00322 }
00323 inline void IM920::write(int val){
00324     if(sendDataSize <= 60){
00325         im920_cast.i = val;
00326         sprintf(im920_sendBuff, "%s%08X", im920_sendBuff, (uint32_t)val);
00327         sendDataSize += 4; 
00328         checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];  
00329     }   
00330 }
00331 inline void IM920::write(short val){
00332     if(sendDataSize <= 62){
00333         im920_cast.s = val;
00334         sprintf(im920_sendBuff, "%s%04X", im920_sendBuff, (uint16_t)val);
00335         sendDataSize += 2;   
00336         checkSum = checkSum ^ im920_cast.u[1] ^ im920_cast.u[0];
00337     }
00338 }
00339 inline void IM920::write(char val){
00340     if(sendDataSize < 64){
00341         im920_cast.c = val;
00342         sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, (uint8_t)val); 
00343         sendDataSize += 1; 
00344         checkSum = im920_cast.u[0] ^ '0'; 
00345     }   
00346 }
00347 /*
00348 inline void IM920::write(float *array, int count){
00349     if(sendDataSize < (64 - (4*count))){
00350         for(int i = 0; i < count; i++){
00351             write((float)array[i]);   
00352         }
00353     }   
00354 }*/
00355 
00356 inline void IM920::send(){
00357     if(sendDataSize > 0){
00358         AS = RESPONSE_STRING;
00359         //write(checkSum);
00360         //sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, checkSum);
00361         im920_sendBuff[128] = '\0';//もしバッファがあふれて文字列になっていなかったら
00362         ser->printf("TXDA %s\r\n", im920_sendBuff);
00363         //printf("send -> TXDA %s\r\n", im920_sendBuff);
00364         sendDataSize = 0;//初期化
00365         memset(im920_sendBuff, '\0', 129);
00366         AS = DATA_STRING;   
00367     }   
00368 }
00369 
00370 #endif