XBee and XBee-PRO ZigBee RF modules provide cost-effective wireless connectivity to electronic devices. They are interoperable with other ZigBee PRO feature set devices, including devices from other vendors.

Dependencies:   BufferedArray

Dependents:   MBEDminiproject

Files at this revision

API Documentation at this revision

Comitter:
yangcq88517
Date:
Thu Oct 22 22:22:12 2015 +0000
Parent:
1:3dc0ec2f9fd6
Child:
3:6b205ec8624b
Commit message:
IO sample bug fix

Changed in this revision

Helper/IOSampleDecoder.cpp Show annotated file Show diff for this revision Revisions of this file
Helper/IOSampleDecoder.h Show annotated file Show diff for this revision Revisions of this file
Indicator/ISampleResponse.h Show annotated file Show diff for this revision Revisions of this file
Indicator/XBeeRx16IOSampleIndicator.cpp Show annotated file Show diff for this revision Revisions of this file
Indicator/XBeeRx64IOSampleIndicator.cpp Show annotated file Show diff for this revision Revisions of this file
Indicator/ZigBeeIOSampleIndicator.cpp Show annotated file Show diff for this revision Revisions of this file
Type/IOSamples.cpp Show annotated file Show diff for this revision Revisions of this file
Type/IOSamples.h Show annotated file Show diff for this revision Revisions of this file
--- a/Helper/IOSampleDecoder.cpp	Thu Oct 22 20:02:11 2015 +0000
+++ b/Helper/IOSampleDecoder.cpp	Thu Oct 22 22:22:12 2015 +0000
@@ -1,21 +1,23 @@
 #include "IOSampleDecoder.h"
 
-int IOSampleDecoder::XBeeSamplesParse(IOSamples * samples, const char * IOSamplePayload, int offset)
+IOSamples * IOSampleDecoder::samples = NULL;
+
+IOSamples * IOSampleDecoder::XBeeSamplesParse(const char * IOSamplePayload, int offset)
 {
     // at least 3 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] and [analog channel mask].
     int numofsamples = IOSamplePayload[offset];
 
     if (numofsamples <= 0)
-        return 0;
+        return NULL;
 
-    if (samples!= NULL)
+    if (samples != NULL)
         delete[] samples;
 
     // first byte is the number of sample
     int index = offset + 1;
 
     samples = new IOSamples[numofsamples];
-
+    
     int digitMask = ((IOSamplePayload[index] & 0x01) << 8) | IOSamplePayload[index + 1];
     int analogMask = IOSamplePayload[index] & 0xFE;
 
@@ -23,27 +25,27 @@
     index += 2;
 
     for (int i = 0; i < numofsamples; i++) {
-        map<Pin, int> *  analog = (samples + i)->getAnalogs();
-        map<Pin, int> *  digital = (samples + i)->getDigitals();
+        map<Pin *, int> *  analog = (samples + i)->getAnalogs();
+        map<Pin *, int> *  digital = (samples + i)->getDigitals();
         if (digitMask != 0) {
             if ((digitMask & 0x01) == 0x01)
-                (*digital)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
+                (*digital)[&XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
             if ((digitMask & 0x02) == 0x02)
-                (*digital)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
+                (*digital)[&XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
             if ((digitMask & 0x04) == 0x04)
-                (*digital)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
+                (*digital)[&XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
             if ((digitMask & 0x08) == 0x08)
-                (*digital)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
+                (*digital)[&XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
             if ((digitMask & 0x10) == 0x10)
-                (*digital)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
+                (*digital)[&XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
             if ((digitMask & 0x20) == 0x20)
-                (*digital)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
+                (*digital)[&XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
             if ((digitMask & 0x40) == 0x40)
-                (*digital)[XBeePins::P16_RTS_AD6_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
+                (*digital)[&XBeePins::P16_RTS_AD6_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
             if ((digitMask & 0x80) == 0x80)
-                (*digital)[XBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
+                (*digital)[&XBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
             if (((digitMask >> 8) & 0x01) == 0x01)
-                (*digital)[XBeePins::P9_DTR_SLEEP_DIO8] = (IOSamplePayload[index] & 0x01) == 0x01 ? 1 : 0;
+                (*digital)[&XBeePins::P9_DTR_SLEEP_DIO8] = (IOSamplePayload[index] & 0x01) == 0x01 ? 1 : 0;
 
             //skip the 2 [digital sample]
             index += 2;
@@ -51,29 +53,29 @@
 
         if (analogMask != 0) {
             if ((analogMask & 0x02) == 0x02)
-                (*analog)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x04) == 0x04)
-                (*analog)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x08) == 0x08)
-                (*analog)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x10) == 0x10)
-                (*analog)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x20) == 0x20)
-                (*analog)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x40) == 0x40)
-                (*analog)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
         }
     }
 
-    return numofsamples;
+    return samples;
 }
 
-int IOSampleDecoder::ZigBeeSamplesParse(IOSamples * samples, const char * IOSamplePayload, int offset)
+IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const char * IOSamplePayload, int offset)
 {
     // at least 4 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] + 1 bytes of [analog channel mask].
 
@@ -81,9 +83,9 @@
     int numofsamples = IOSamplePayload[offset];
 
     if (numofsamples <= 0)
-        return 0;
+        return NULL;
 
-    if (samples!= NULL)
+    if (samples != NULL)
         delete[] samples;
 
     int index = offset + 1;
@@ -94,53 +96,53 @@
     samples = new IOSamples[numofsamples];
 
     for (int i = 0; i < numofsamples; i++) {
-        map<Pin, int> *  analog = (samples + i)->getAnalogs();
-        map<Pin, int> *  digital = (samples + i)->getDigitals();
+        map<Pin *, int> *  analog = (samples + i)->getAnalogs();
+        map<Pin *, int> *  digital = (samples + i)->getDigitals();
 
         if (digitMask != 0) {
             if ((digitMask & 0x01) == 0x01)
-                (*digital)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
+                (*digital)[&ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
             if ((digitMask & 0x02) == 0x02)
-                (*digital)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
+                (*digital)[&ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
             if ((digitMask & 0x04) == 0x04)
-                (*digital)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
+                (*digital)[&ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
             if ((digitMask & 0x08) == 0x08)
-                (*digital)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
+                (*digital)[&ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
             if ((digitMask & 0x10) == 0x10)
-                (*digital)[ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
+                (*digital)[&ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
             if ((digitMask & 0x20) == 0x20)
-                (*digital)[ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
+                (*digital)[&ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
             if ((digitMask & 0x40) == 0x40)
-                (*digital)[ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
+                (*digital)[&ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
             if ((digitMask & 0x80) == 0x80)
-                (*digital)[ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
+                (*digital)[&ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
 
             if (((digitMask >> 8) & 0x04) == 0x04)
-                (*digital)[ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0;
+                (*digital)[&ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0;
             if (((digitMask >> 8) & 0x08) == 0x08)
-                (*digital)[ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0;
+                (*digital)[&ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0;
             if (((digitMask >> 8) & 0x10) == 0x10)
-                (*digital)[ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0;
+                (*digital)[&ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0;
 
             index += 2;// 2 [digital sample]
         }
         if (analogMask != 0x00) { //analog mask
             if ((analogMask & 0x01) == 0x01)
-                (*analog)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x02) == 0x02)
-                (*analog)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x04) == 0x04)
-                (*analog)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x08) == 0x08)
-                (*analog)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
+                (*analog)[&ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
 
             if ((analogMask & 0x80) == 0x80)
                 (samples + i)->setSupplyVoltage((IOSamplePayload[index++] << 8) | IOSamplePayload[index++]);
         }
     }
 
-    return numofsamples;
+    return samples;
 }
\ No newline at end of file
--- a/Helper/IOSampleDecoder.h	Thu Oct 22 20:02:11 2015 +0000
+++ b/Helper/IOSampleDecoder.h	Thu Oct 22 22:22:12 2015 +0000
@@ -8,12 +8,15 @@
 
 class IOSampleDecoder
 {
+private:
+    static IOSamples * samples;
+
 public :
     // return the lenght of io ample
-    static int XBeeSamplesParse(IOSamples * samples, const char * IOSamplePayload, int offset = 0);
+    static IOSamples * XBeeSamplesParse(const char * IOSamplePayload, int offset = 0);
 
     // return the lenght of io ample
-    static int ZigBeeSamplesParse(IOSamples * samples, const char * IOSamplePayload, int offset = 0);
+    static IOSamples * ZigBeeSamplesParse(const char * IOSamplePayload, int offset = 0);
 };
 
 #endif
\ No newline at end of file
--- a/Indicator/ISampleResponse.h	Thu Oct 22 20:02:11 2015 +0000
+++ b/Indicator/ISampleResponse.h	Thu Oct 22 22:22:12 2015 +0000
@@ -8,7 +8,7 @@
 class ISampleResponse
 {
 protected:
-    IOSamples * samples;
+    //IOSamples * samples;
 
 public:
     virtual IOSamples * getIOSamples() = 0;
@@ -33,6 +33,8 @@
     /// </summary>
     /// <returns></returns>
     virtual int getRSSI() = 0;
+
+
 };
 
 #endif
\ No newline at end of file
--- a/Indicator/XBeeRx16IOSampleIndicator.cpp	Thu Oct 22 20:02:11 2015 +0000
+++ b/Indicator/XBeeRx16IOSampleIndicator.cpp	Thu Oct 22 22:22:12 2015 +0000
@@ -1,7 +1,8 @@
 #include "XBeeRx16IOSampleIndicator.h"
 
 XBeeRx16IOSampleIndicator::XBeeRx16IOSampleIndicator(APIFrame *frame)
-    : RxBase(frame) {}
+    : RxBase(frame)
+{}
 
 int XBeeRx16IOSampleIndicator::getRSSI()
 {
@@ -10,8 +11,8 @@
 
 IOSamples * XBeeRx16IOSampleIndicator::getIOSamples()
 {
-    IOSampleDecoder::XBeeSamplesParse(samples, data + 5);
-    return samples;
+    return IOSampleDecoder::XBeeSamplesParse(data + 5);
+    //return samples;
 }
 
 int XBeeRx16IOSampleIndicator::getSamplesCount()
--- a/Indicator/XBeeRx64IOSampleIndicator.cpp	Thu Oct 22 20:02:11 2015 +0000
+++ b/Indicator/XBeeRx64IOSampleIndicator.cpp	Thu Oct 22 22:22:12 2015 +0000
@@ -10,8 +10,8 @@
 
 IOSamples * XBeeRx64IOSampleIndicator::getIOSamples()
 {
-    IOSampleDecoder::XBeeSamplesParse(samples, data + 11);
-    return samples;
+    return IOSampleDecoder::XBeeSamplesParse(data + 11);
+    //return samples;
 }
 
 int XBeeRx64IOSampleIndicator::getSamplesCount()
--- a/Indicator/ZigBeeIOSampleIndicator.cpp	Thu Oct 22 20:02:11 2015 +0000
+++ b/Indicator/ZigBeeIOSampleIndicator.cpp	Thu Oct 22 22:22:12 2015 +0000
@@ -10,8 +10,8 @@
 
 IOSamples * ZigBeeIOSampleIndicator::getIOSamples()
 {
-    IOSampleDecoder::ZigBeeSamplesParse(samples, data + 12);
-    return samples;
+    return IOSampleDecoder::ZigBeeSamplesParse(data + 12);
+    //return samples;
 }
 
 int ZigBeeIOSampleIndicator::getSamplesCount()
--- a/Type/IOSamples.cpp	Thu Oct 22 20:02:11 2015 +0000
+++ b/Type/IOSamples.cpp	Thu Oct 22 22:22:12 2015 +0000
@@ -1,26 +1,26 @@
 #include "IOSamples.h"
 
-map<Pin, int> * IOSamples::getAnalogs()
+map<Pin *, int> * IOSamples::getAnalogs()
 {
     return &analog;
 }
 
 int IOSamples::getAnalog(Pin * pin)
 {
-    if (analog.count(*pin))
-        return analog[*pin];
+    if (analog.count(pin))
+        return analog[pin];
     else return -1;
 }
 
-map<Pin, int> * IOSamples::getDigitals()
+map<Pin *, int> * IOSamples::getDigitals()
 {
     return &digital;
 }
 
 int IOSamples::getDigital(Pin * pin)
 {
-    if (digital.count(*pin))
-        return digital[*pin];
+    if (digital.count(pin))
+        return digital[pin];
     else return 2;
 }
 
@@ -32,4 +32,10 @@
 void IOSamples::setSupplyVoltage(int voltage)
 {
     SUPPLY_VOLTAGE =  voltage;
+}
+
+void IOSamples::clear()
+{
+    analog.clear();
+    digital.clear();
 }
\ No newline at end of file
--- a/Type/IOSamples.h	Thu Oct 22 20:02:11 2015 +0000
+++ b/Type/IOSamples.h	Thu Oct 22 22:22:12 2015 +0000
@@ -11,19 +11,19 @@
 private :
     int SUPPLY_VOLTAGE;
     
-    map<Pin, int> analog;
+    map<Pin *, int> analog;
     
-    map<Pin, int> digital;
+    map<Pin *, int> digital;
 
 public:    
-    map<Pin, int> * getAnalogs();
+    map<Pin *, int> * getAnalogs();
     
     /**
     *        -1 means not avaliable
     */
     int getAnalog(Pin * pin);
     
-    map<Pin, int> * getDigitals();
+    map<Pin *, int> * getDigitals();
     
     /**
     *        LOW = 0,
@@ -35,6 +35,8 @@
     int getSupplyVoltage();
     
     void setSupplyVoltage(int voltage);
+    
+    void clear();
 };
 
 #endif
\ No newline at end of file