IM920のライブラリ

Revision:
0:ccdeb3bea793
Child:
1:11ae0d702ecc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IM920.h	Thu Aug 10 19:34:50 2017 +0000
@@ -0,0 +1,370 @@
+#ifndef _IM920_H_
+#define _IM920_H_
+#include "mbed.h"
+
+#define IM920_BUFF_SIZE 160
+
+const int FUNC_NUMBER = 256;
+
+
+typedef enum im920_buff_classify{
+    BUFF_A = 0,
+    BUFF_B = 1
+}IM920_Buff_Classify;
+
+//解析方法に関する変数
+const int WAIT_TIME_US = 1000;
+typedef enum{
+    DATA_STRING = 0,        //データの文字列
+    RESPONSE_STRING = 1,    //OKかNGのレスポンスの文字列
+    NORMAL_STRING = 2,
+    OTHER_STRING = 3,
+    RECEIVE_ID = 4,
+    INTERACTIVE_STRING = 5
+}IM920_Analyze_Selector;
+
+
+
+static IM920_Buff_Classify AB = BUFF_A;
+
+class IM920{
+    public:
+        IM920(Serial &serial, Serial &pc, int baudrate = 19200);
+    private:  
+        Serial *ser;
+        Serial *_pc;
+        
+        //バッファ関連の変数
+        char buff_A[IM920_BUFF_SIZE];
+        char buff_B[IM920_BUFF_SIZE];
+        char* readBuffAddr;
+        char* writeBuffAddr;
+         
+        
+        char im920_dataLength;
+        char im920_sendBuff[129];
+        
+        int nodeNumber;
+        //インタラクティブモードから復帰できるかを示すフラグ
+        //1ならインタラクティブモード、0なら通常モード
+        int interactiveFlag;
+        
+        IM920_Analyze_Selector AS;
+        
+    public:
+    
+        union IM920_CAST{
+            double d;
+            float f;
+            long l;
+            int i;
+            short s;
+            char c;
+            char u[8];
+        };
+        union IM920_CAST im920_cast; 
+        
+        char data[64];
+        int sendDataSize;
+        void (*p_callFunc[256])(void);
+        char node;
+        char RSSI;//受信強度
+        int rID;//受信した送信機ID
+        int ID; //自分の固有ID
+        
+        /**
+          @note 無線機の設定を変更するわけではない
+          @bref IM920XSとの通信ボーレート変更
+          @param baudrate 1200,2400,4800,9600,19200,38400,57600 or 115200
+        */
+        void baud(int baudrate){
+            ser->baud(baudrate);   
+        }
+        
+        /**
+          @bref インタラクティブモードへ移行する,@で復帰
+        */
+        void interactiveMode();
+        
+        /**
+          @bref 16進数文字列データから数値データを取得します
+        */
+        void data_analyze();
+        
+        /**
+          @bref データ処理関数を設定
+          @param *funcAddr 関数ポインタ、void型引数無し関数のみ設定可
+          @param header 関数を選択する0~255のヘッダー
+        */
+        void attach(void (*funcAddr)(void), unsigned header);
+    
+        /**
+          @bref パラメータ不揮発メモリ書き込み許可モードへ移行
+        */
+        bool enableWrite();
+        
+            /**
+              @bref パラメータ不揮発メモリ書き込み不許可モードへ移行
+            */     
+        bool disableWrite();
+        
+            /**
+              @bref 固有IDを読み出す
+            */
+        int readID();
+        
+        /**
+          @bref ノード番号をセットする
+        */
+        bool setNodeNumber(char nodeNum);   
+        
+        /**
+          @bref ノード番号を読み出す
+        */
+        int readNodeNumber();   
+        
+        /**
+            @bref 受信する無線機IDを一つ登録する
+        */
+        bool setReceiveID(int ID);
+        
+        /**
+          @bref 登録されている受信IDを表示する
+        */
+        void readReceiveID();
+        
+        /**
+          @bref 登録されている受信IDを全消去する
+        */
+        bool eraseReceiveID();      
+        
+        /**
+          @bref 使用する周波数chを設定する
+        */
+        bool setChannel(char ch);   
+        
+        /**
+          @bref 使用する周波数chを読み出す
+        */
+        char readChannel();         
+        
+        /**
+          @bref アスキーコードの文字列で送受信ができるようにする
+        */
+        bool enableCharacterIO();   
+        
+        /**
+          @bref バイナリ送受信モードへ移行
+        */
+        bool disableCharacterIO();  
+        
+        /**
+          @bref 送信バッファにdouble型を一つ入れる
+        */
+        void write(double val);
+        
+        /**
+          @bref 送信バッファにlong型を一つ入れる
+        */
+        void write(long val);
+        
+        /**
+          @bref 送信バッファにfloat型を一つ入れる
+        */
+        void write(float val);
+        /**
+          @bref 送信バッファにint型を一つ入れる
+        */
+        void write(int val);
+        
+        /**
+          @bref 送信バッファにshort型を一つ入れる
+        */
+        void write(short val);
+        
+        /**
+          @bref 送信バッファにchar型を一つ入れる
+        */
+        void write(char val);
+        
+        /**
+          @bref 送信バッファにfloat型を複数入れる
+        */
+       // void write(float *array, int count);
+        
+        template <typename T> void write(T *array, int count){
+            for(int i = 0;i < count; i++){
+                write(array[i]);   
+            }
+        }
+        /**
+          @bref 送信バッファを送信する
+        */
+        void send();
+        
+        /**
+          @bref 送信バッファにヘッダーを付ける、writeする前に使う
+        */
+        void header(char headerNumber){
+            write(headerNumber);
+        }
+        
+        /**
+          @bref デバッグ用、受信バッファを表示
+        */
+        void im920_debug();
+        
+        /**
+          @bref インタラクティブモードでコマンドを表示する
+        */
+        void printFormat();
+        
+        /**
+          @bref データ配列をshort型に変換する
+          @param array データのchar型配列、データの始まるアドレスを入れる
+        */
+        short toShort(char *array);
+        short toShort(int i){
+            return toShort(&data[i]);   
+        }
+        
+        /**
+          @bref データ配列をint型に変換する
+          @param array データのchar型配列、データの始まるアドレスを入れる
+        */
+        int toInt(char *array);
+        int toInt(int i){
+            return toInt(&data[i]);   
+        }
+        /**
+          @bref データ配列をfloat型に変換する
+          @param array データのchar型配列、データの始まるアドレスを入れる
+        */
+        float toFloat(char *array);
+        float toFloat(int i){
+            return toFloat(&data[i]);   
+        }
+        /**
+          @bref データ配列をlong型に変換する
+          @param array データのchar型配列、データの始まるアドレスを入れる
+        */
+        long toLong(char *array);
+        long toLong(int i){
+            return toLong(&data[i]);   
+        }
+        
+        /**
+          @bref データ配列をdouble型に変換する
+          @param array データのchar型配列、データの始まるアドレスを入れる
+        */
+        double toDouble(char *array);
+        double toDouble(int i){
+            return toDouble(&data[i]);   
+        }
+        /**
+          @bref チェックサムを計算する
+          @param count データの個数、何byteか
+        */
+        char im920CheckSum(int count);
+        
+        /**
+          @bref 受信データのチェックサムの計算結果を入れる
+        */
+        char receiveCheckSum;
+     
+    private:
+        
+        /**
+          @bref 1文字受信するごとに呼ばれ、受信バッファに入れる
+        */
+        void im920Handler();
+        
+        char checkSum;
+
+        /**
+          @bref 何もしない関数
+        */
+        static void dummyFunc(void);
+        
+        /**
+          @bref 16進数文字を数値に変換する関数 
+        */
+        int asciiToNumber(char c);
+};
+
+inline void IM920::write(double val){
+    if(sendDataSize <= 56){
+        im920_cast.d = val;
+        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]
+                                , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]);
+        sendDataSize += 8;
+        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];
+    }
+}
+
+inline void IM920::write(long val){
+    if(sendDataSize <= 56){
+        im920_cast.l = val;
+        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]
+                                , im920_cast.u[3], im920_cast.u[4], im920_cast.u[5], im920_cast.u[6], im920_cast.u[7]);   
+        sendDataSize += 8;
+        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];
+    }   
+}
+
+inline void IM920::write(float val){
+    if(sendDataSize <= 60){
+        im920_cast.f = val;
+        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]);
+        sendDataSize += 4;
+        checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];   
+    }
+}
+inline void IM920::write(int val){
+    if(sendDataSize <= 60){
+        im920_cast.i = val;
+        sprintf(im920_sendBuff, "%s%08X", im920_sendBuff, (uint32_t)val);
+        sendDataSize += 4; 
+        checkSum = checkSum ^ im920_cast.u[3] ^ im920_cast.u[2] ^ im920_cast.u[1] ^ im920_cast.u[0];  
+    }   
+}
+inline void IM920::write(short val){
+    if(sendDataSize <= 62){
+        im920_cast.s = val;
+        sprintf(im920_sendBuff, "%s%04X", im920_sendBuff, (uint16_t)val);
+        sendDataSize += 2;   
+        checkSum = checkSum ^ im920_cast.u[1] ^ im920_cast.u[0];
+    }
+}
+inline void IM920::write(char val){
+    if(sendDataSize < 64){
+        im920_cast.c = val;
+        sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, (uint8_t)val); 
+        sendDataSize += 1; 
+        checkSum = im920_cast.u[0] ^ '0'; 
+    }   
+}
+/*
+inline void IM920::write(float *array, int count){
+    if(sendDataSize < (64 - (4*count))){
+        for(int i = 0; i < count; i++){
+            write((float)array[i]);   
+        }
+    }   
+}*/
+
+inline void IM920::send(){
+    if(sendDataSize > 0){
+        AS = RESPONSE_STRING;
+        //write(checkSum);
+        //sprintf(im920_sendBuff, "%s%02X", im920_sendBuff, checkSum);
+        im920_sendBuff[128] = '\0';//もしバッファがあふれて文字列になっていなかったら
+        ser->printf("TXDA %s\r\n", im920_sendBuff);
+        printf("send -> TXDA %s\r\n", im920_sendBuff);
+        sendDataSize = 0;//初期化
+        memset(im920_sendBuff, '\0', 129);
+        AS = DATA_STRING;   
+    }   
+}
+
+#endif
\ No newline at end of file