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