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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers IOSampleDecoder.cpp Source File

IOSampleDecoder.cpp

00001 #include "IOSampleDecoder.h"
00002 
00003 IOSamples * IOSampleDecoder::samples = NULL;
00004 
00005 IOSamples * IOSampleDecoder::XBeeSamplesParse(const unsigned  char * IOSamplePayload, int offset)
00006 {
00007     // at least 3 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] and [analog channel mask].
00008     int numofsamples = IOSamplePayload[offset];
00009 
00010     if (numofsamples <= 0)
00011         return NULL;
00012 
00013     if (samples != NULL)
00014         delete[] samples;
00015 
00016     // first byte is the number of sample
00017     int index = offset + 1;
00018 
00019     samples = new IOSamples[numofsamples];
00020 
00021     int digitMask = ((IOSamplePayload[index] & 0x01) << 8) | IOSamplePayload[index + 1];
00022     int analogMask = IOSamplePayload[index] & 0xFE;
00023 
00024     // sample start at +2 [mask]
00025     index += 2;
00026 
00027     for (int i = 0; i < numofsamples; i++) {
00028         map<Pin *, unsigned int> *  analog = (samples + i)->getAnalogs();
00029         map<Pin *, unsigned char> *  digital = (samples + i)->getDigitals();
00030         if (digitMask != 0) {
00031             if ((digitMask & 0x01) == 0x01)
00032                 (*digital)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
00033             if ((digitMask & 0x02) == 0x02)
00034                 (*digital)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
00035             if ((digitMask & 0x04) == 0x04)
00036                 (*digital)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
00037             if ((digitMask & 0x08) == 0x08)
00038                 (*digital)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
00039             if ((digitMask & 0x10) == 0x10)
00040                 (*digital)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
00041             if ((digitMask & 0x20) == 0x20)
00042                 (*digital)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
00043             if ((digitMask & 0x40) == 0x40)
00044                 (*digital)[XBeePins::P16_RTS_AD6_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
00045             if ((digitMask & 0x80) == 0x80)
00046                 (*digital)[XBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
00047             if (((digitMask >> 8) & 0x01) == 0x01)
00048                 (*digital)[XBeePins::P9_DTR_SLEEP_DIO8] = (IOSamplePayload[index] & 0x01) == 0x01 ? 1 : 0;
00049 
00050             //skip the 2 [digital sample]
00051             index += 2;
00052         }
00053 
00054         if (analogMask != 0) {
00055             if ((analogMask & 0x02) == 0x02) {
00056                 (*analog)[XBeePins::P20_AD0_DIO0] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00057                 index+=2;
00058             }
00059             if ((analogMask & 0x04) == 0x04) {
00060                 (*analog)[XBeePins::P19_AD1_DIO1] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00061                 index+=2;
00062             }
00063 
00064             if ((analogMask & 0x08) == 0x08) {
00065                 (*analog)[XBeePins::P18_AD2_DIO2] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00066                 index+=2;
00067             }
00068 
00069             if ((analogMask & 0x10) == 0x10) {
00070                 (*analog)[XBeePins::P17_AD3_DIO3] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00071                 index+=2;
00072             }
00073 
00074             if ((analogMask & 0x20) == 0x20) {
00075                 (*analog)[XBeePins::P11_AD4_DIO4] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00076                 index+=2;
00077             }
00078 
00079             if ((analogMask & 0x40) == 0x40) {
00080                 (*analog)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00081                 index+=2;
00082             }
00083         }
00084     }
00085 
00086     return samples;
00087 }
00088 
00089 IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const unsigned  char * IOSamplePayload, int offset)
00090 {
00091     // at least 4 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] + 1 bytes of [analog channel mask].
00092 
00093     // the [number of samples] always set to 1.
00094     int numofsamples = IOSamplePayload[offset];
00095 
00096     if (numofsamples <= 0)
00097         return NULL;
00098 
00099     if (samples != NULL)
00100         delete[] samples;
00101 
00102     int index = offset + 1;
00103 
00104     int digitMask = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
00105     int analogMask = IOSamplePayload[index++];
00106 
00107     samples = new IOSamples[numofsamples];
00108 
00109     for (int i = 0; i < numofsamples; i++) {
00110         map<Pin *, unsigned int> *  analog = (samples + i)->getAnalogs();
00111         map<Pin *, unsigned char> *  digital = (samples + i)->getDigitals();
00112 
00113         if (digitMask != 0) {
00114             if ((digitMask & 0x01) == 0x01)
00115                 (*digital)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
00116             if ((digitMask & 0x02) == 0x02)
00117                 (*digital)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
00118             if ((digitMask & 0x04) == 0x04)
00119                 (*digital)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
00120             if ((digitMask & 0x08) == 0x08)
00121                 (*digital)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
00122             if ((digitMask & 0x10) == 0x10)
00123                 (*digital)[ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
00124             if ((digitMask & 0x20) == 0x20)
00125                 (*digital)[ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
00126             if ((digitMask & 0x40) == 0x40)
00127                 (*digital)[ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
00128             if ((digitMask & 0x80) == 0x80)
00129                 (*digital)[ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
00130 
00131             if (((digitMask >> 8) & 0x04) == 0x04)
00132                 (*digital)[ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0;
00133             if (((digitMask >> 8) & 0x08) == 0x08)
00134                 (*digital)[ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0;
00135             if (((digitMask >> 8) & 0x10) == 0x10)
00136                 (*digital)[ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0;
00137 
00138             index += 2;// 2 [digital sample]
00139         }
00140         if (analogMask != 0x00) { //analog mask
00141             if ((analogMask & 0x01) == 0x01){
00142                 (*analog)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00143                 index+=2;
00144             }
00145 
00146             if ((analogMask & 0x02) == 0x02){
00147                 (*analog)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00148                 index+=2;
00149             }
00150 
00151             if ((analogMask & 0x04) == 0x04){
00152                 (*analog)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00153                 index+=2;
00154             }
00155 
00156             if ((analogMask & 0x08) == 0x08){
00157                 (*analog)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00158                 index+=2;
00159             }
00160 
00161             if ((analogMask & 0x80) == 0x80){
00162                 (samples + i)->setSupplyVoltage((IOSamplePayload[index] << 8) | IOSamplePayload[index+1]);
00163                 index+=2;
00164             }
00165         }
00166     }
00167 
00168     return samples;
00169 }