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.
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 }
Generated on Tue Jul 12 2022 18:56:10 by 1.7.2