XbeeApi

Dependents:   XbeeAPI Hybrid_main_FirstEdtion

Revision:
1:34007fc9235e
Parent:
0:bca23ad9e6b5
Child:
2:30220fb0e20e
--- a/XbeeApiLib.cpp	Fri Jan 20 08:13:54 2017 +0000
+++ b/XbeeApiLib.cpp	Fri Mar 10 06:08:40 2017 +0000
@@ -2,7 +2,7 @@
 #include <XbeeApiLib.h>
 #include <string>
 
-XbeeApi::XbeeApi(PinName Tx, PinName Rx, int BaudRate) : Xbee(Tx, Rx, BaudRate){
+XbeeApi::XbeeApi(PinName Tx, PinName Rx, int BaudRate, void (*onPacketReceived)(int, char*)) : Xbee(Tx, Rx, BaudRate){
     //Xbee = Serial(Tx, Rx, BaudRate);
     //Xbee.baud(BaudRate);
     
@@ -11,6 +11,8 @@
         address[i].IsAvailable = false;
     }
     IsTransmitting = false;
+    SetInterrupt(true);
+    OnPacketReceived = onPacketReceived;
 }
 
 void XbeeApi::SetAddress(int Num, unsigned long HIGH, unsigned long LOW){
@@ -18,7 +20,7 @@
         address[Num].ADR[3 - i] = reinterpret_cast<char (&)[sizeof(HIGH)]>(HIGH)[i];
         address[Num].ADR[7 - i] = reinterpret_cast<char (&)[sizeof(LOW)]>(LOW)[i];
     }
-    address[Num].IsAvailable = true;
+    address[Num].IsAvailable = false;
     address[Num].sum = 0;
     //EndPacket()でチェックサムを計算する際、宛先アドレスもチェックサムに含まれる
     //宛先アドレスは頻繁に変更されないので、アドレス分の合計だけを先にまとめて計算しておく
@@ -66,6 +68,20 @@
     }
 }
 
+//long型の数値をバイト列として書き込む
+//リトルエンディアン(位の大きい数字ほどバイト列では後ろになる)であることに注意
+void XbeeApi::Write(long long val){
+    if(sizeof(val) < 128 - itr){
+        for(int i = 0;i < sizeof(val);i++){
+            buf[itr + i] = reinterpret_cast<char (&)[sizeof(val)]>(val)[i];
+        }
+        itr += sizeof(val);
+    }else{
+        buf[17] = 0x00;
+        EndPacket();
+    }
+}
+
 //double型の数値をバイト列として書き込む
 //リトルエンディアン(位の大きい数字ほどバイト列では後ろになる)であることに注意
 void XbeeApi::Write(double val){
@@ -94,40 +110,6 @@
     }
 }
 
-/*void XbeeApi::EndPacket(){
-    if(itr != 0){
-        CheckSum += 0x12;
-        for(int i = 0;i < itr;i++){
-            CheckSum += buf[i];
-        }
-        for(int i = 0; i < 4;i++){
-            if(address[i].IsAvailable == true){
-                Xbee.putc(0x7E);    //パケットの先頭を表す
-                WriteWithEsc((char)(itr + 14) >> 8);
-                WriteWithEsc((char)(itr + 14) & 0x00FF);
-                WriteWithEsc(0x10);
-                WriteWithEsc(0x00);         //ここを01にするとxbeeは送信の成否の判定を行うようになる(クソ重い)
-                //宛先アドレスを書き込む
-                for(int j = 0;j < 8;j++){
-                    WriteWithEsc(address[i].ADR[j]);
-                }
-                WriteWithEsc(address[i].ADR16bit[0]);
-                WriteWithEsc(address[i].ADR16bit[1]);
-                WriteWithEsc(0x01);
-                WriteWithEsc(0x01);
-                //データを書き込む
-                for(int j = 0;j < itr;j++){
-                    WriteWithEsc(buf[j]);
-                }
-                //チェックサムを書き込む
-                WriteWithEsc((char)(0xFF - (CheckSum + address[i].sum + address[i].ADR16bit[0] + address[i].ADR16bit[1]) & 0xFF));
-            }
-        }
-        CheckSum = 0;
-        itr = 0;
-    }
-}*/
-
 void XbeeApi::EndPacket(){
     if(itr != 0){
         buf[0] = 0x7E;    //パケットの先頭を表す
@@ -202,7 +184,6 @@
 
 //データ受信時の処理 1バイトごとに呼び出される必要がある
 void XbeeApi::OnDataReceived(){
-    static DigitalOut LED(LED1);
     static bool EscFlag = false;
     static int PacketLength = 0;
     static bool IsReceivingPacket = false;
@@ -226,31 +207,32 @@
                 RxBuf[ReceivedBytesCounter] = message;
             }
             ReceivedBytesCounter++;
+            if(ReceivedBytesCounter >= 256){
+                IsReceivingPacket = false;      //受信バッファを溢れる場合は、パケットの読み込みを中止する  次に0x7Eを受信するまで再開されない
+            }
         }
         //この時点でReceivedBytesCounterには受信したデータのバイト数が入っている
         //2バイト目と3バイト目はパケットの長さを表している
         if(RxBuf[0] == 0x7E){
-            if(ReceivedBytesCounter == 3){
+            if(ReceivedBytesCounter == 3){                      //パケットの3バイト目までを受信した時点で、パケットの長さを計算できる
                 PacketLength = 255 * RxBuf[1] + RxBuf[2];
             }
-            if(ReceivedBytesCounter > 3 && ReceivedBytesCounter == PacketLength + 4){
+            if(ReceivedBytesCounter > 3 && ReceivedBytesCounter == PacketLength + 4){   //パケットの長さと同じだけのデータを受信したら
                 int sum = 0;
                 for(int i = 3; i < ReceivedBytesCounter - 1; i++){       //先頭3バイトとチェックサム以外のすべてのバイトを合計
                     sum += RxBuf[i];
                 }
-                if((char)(0xFF - sum & 0xFF) == RxBuf[ReceivedBytesCounter - 1]){
+                if((char)(0xFF - sum & 0xFF) == RxBuf[ReceivedBytesCounter - 1]){   //チェックサムが一致するならば
                     //ここにデータ受信時の処理を書く
                     //パケット受信直後なので、多少時間のかかる処理でも問題ないはず
-                    if(RxBuf[3] == 0x90){
-                        int DataLength = PacketLength - 12;
-                        //パケットタイプ0x90は地上局から送信されたデータが16バイト目 すなわち RxBuf[15] から格納されている
+                    if(RxBuf[3] == 0x90){                                           // パケットタイプ0x90は他のXbeeから送信されたデータを表す
+                        int DataLength = PacketLength - 12;                         //データ本体の長さは パケットの長さ - 12 ここでいう「パケットの長さ」に、最初の3バイトとチェックサムは含まない
+                        OnPacketReceived(DataLength, &RxBuf[15]);                   //パケットタイプ0x90は地上局から送信されたデータが16バイト目 すなわち RxBuf[15] から格納されている
+                        //OnPacketReceived(DataLength + 16, RxBuf);   //デバッグ用 パケットすべてを渡す場合
                         if(DataLength == 2 && RxBuf[15] == 0x59 && RxBuf[16] == 0x4D){
-                            LED = !LED;
                             address[0].ADR16bit[0] = RxBuf[12];
                             address[0].ADR16bit[1] = RxBuf[13];
-                        }
-                        if(DataLength == 2 && RxBuf[15] == 0x5E){
-                            
+                            address[0].IsAvailable = true;
                         }
                     }
                 }
@@ -265,6 +247,8 @@
         Xbee.attach(callback(this, &XbeeApi::OnDataReceived), Serial::RxIrq);
         Xbee.attach(callback(this, &XbeeApi::OnTransmitEnabled), Serial::TxIrq);
     }else{
+        Xbee.attach(NULL, Serial::RxIrq);
+        Xbee.attach(NULL, Serial::TxIrq);
     }
 }