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

Committer:
yangcq88517
Date:
Sat Nov 14 16:42:36 2015 +0000
Revision:
6:5f31ddc17239
Parent:
5:945b89c71902
change to unsigned char array

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:837e6c48e90d 1 #include "IOSampleDecoder.h"
yangcq88517 0:837e6c48e90d 2
yangcq88517 2:700dc65ca3b1 3 IOSamples * IOSampleDecoder::samples = NULL;
yangcq88517 2:700dc65ca3b1 4
yangcq88517 6:5f31ddc17239 5 IOSamples * IOSampleDecoder::XBeeSamplesParse(const unsigned char * IOSamplePayload, int offset)
yangcq88517 0:837e6c48e90d 6 {
yangcq88517 0:837e6c48e90d 7 // at least 3 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] and [analog channel mask].
yangcq88517 0:837e6c48e90d 8 int numofsamples = IOSamplePayload[offset];
yangcq88517 0:837e6c48e90d 9
yangcq88517 0:837e6c48e90d 10 if (numofsamples <= 0)
yangcq88517 2:700dc65ca3b1 11 return NULL;
yangcq88517 0:837e6c48e90d 12
yangcq88517 2:700dc65ca3b1 13 if (samples != NULL)
yangcq88517 0:837e6c48e90d 14 delete[] samples;
yangcq88517 0:837e6c48e90d 15
yangcq88517 0:837e6c48e90d 16 // first byte is the number of sample
yangcq88517 0:837e6c48e90d 17 int index = offset + 1;
yangcq88517 0:837e6c48e90d 18
yangcq88517 0:837e6c48e90d 19 samples = new IOSamples[numofsamples];
yangcq88517 5:945b89c71902 20
yangcq88517 0:837e6c48e90d 21 int digitMask = ((IOSamplePayload[index] & 0x01) << 8) | IOSamplePayload[index + 1];
yangcq88517 0:837e6c48e90d 22 int analogMask = IOSamplePayload[index] & 0xFE;
yangcq88517 0:837e6c48e90d 23
yangcq88517 0:837e6c48e90d 24 // sample start at +2 [mask]
yangcq88517 0:837e6c48e90d 25 index += 2;
yangcq88517 0:837e6c48e90d 26
yangcq88517 0:837e6c48e90d 27 for (int i = 0; i < numofsamples; i++) {
yangcq88517 6:5f31ddc17239 28 map<Pin *, unsigned int> * analog = (samples + i)->getAnalogs();
yangcq88517 6:5f31ddc17239 29 map<Pin *, unsigned char> * digital = (samples + i)->getDigitals();
yangcq88517 0:837e6c48e90d 30 if (digitMask != 0) {
yangcq88517 0:837e6c48e90d 31 if ((digitMask & 0x01) == 0x01)
yangcq88517 4:a0f1fba6c2fb 32 (*digital)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
yangcq88517 0:837e6c48e90d 33 if ((digitMask & 0x02) == 0x02)
yangcq88517 4:a0f1fba6c2fb 34 (*digital)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
yangcq88517 0:837e6c48e90d 35 if ((digitMask & 0x04) == 0x04)
yangcq88517 4:a0f1fba6c2fb 36 (*digital)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
yangcq88517 0:837e6c48e90d 37 if ((digitMask & 0x08) == 0x08)
yangcq88517 4:a0f1fba6c2fb 38 (*digital)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
yangcq88517 0:837e6c48e90d 39 if ((digitMask & 0x10) == 0x10)
yangcq88517 4:a0f1fba6c2fb 40 (*digital)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
yangcq88517 0:837e6c48e90d 41 if ((digitMask & 0x20) == 0x20)
yangcq88517 4:a0f1fba6c2fb 42 (*digital)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
yangcq88517 0:837e6c48e90d 43 if ((digitMask & 0x40) == 0x40)
yangcq88517 4:a0f1fba6c2fb 44 (*digital)[XBeePins::P16_RTS_AD6_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
yangcq88517 0:837e6c48e90d 45 if ((digitMask & 0x80) == 0x80)
yangcq88517 4:a0f1fba6c2fb 46 (*digital)[XBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
yangcq88517 0:837e6c48e90d 47 if (((digitMask >> 8) & 0x01) == 0x01)
yangcq88517 4:a0f1fba6c2fb 48 (*digital)[XBeePins::P9_DTR_SLEEP_DIO8] = (IOSamplePayload[index] & 0x01) == 0x01 ? 1 : 0;
yangcq88517 0:837e6c48e90d 49
yangcq88517 0:837e6c48e90d 50 //skip the 2 [digital sample]
yangcq88517 0:837e6c48e90d 51 index += 2;
yangcq88517 0:837e6c48e90d 52 }
yangcq88517 0:837e6c48e90d 53
yangcq88517 0:837e6c48e90d 54 if (analogMask != 0) {
yangcq88517 5:945b89c71902 55 if ((analogMask & 0x02) == 0x02) {
yangcq88517 5:945b89c71902 56 (*analog)[XBeePins::P20_AD0_DIO0] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 57 index+=2;
yangcq88517 5:945b89c71902 58 }
yangcq88517 5:945b89c71902 59 if ((analogMask & 0x04) == 0x04) {
yangcq88517 5:945b89c71902 60 (*analog)[XBeePins::P19_AD1_DIO1] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 61 index+=2;
yangcq88517 5:945b89c71902 62 }
yangcq88517 0:837e6c48e90d 63
yangcq88517 5:945b89c71902 64 if ((analogMask & 0x08) == 0x08) {
yangcq88517 5:945b89c71902 65 (*analog)[XBeePins::P18_AD2_DIO2] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 66 index+=2;
yangcq88517 5:945b89c71902 67 }
yangcq88517 0:837e6c48e90d 68
yangcq88517 5:945b89c71902 69 if ((analogMask & 0x10) == 0x10) {
yangcq88517 5:945b89c71902 70 (*analog)[XBeePins::P17_AD3_DIO3] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 71 index+=2;
yangcq88517 5:945b89c71902 72 }
yangcq88517 0:837e6c48e90d 73
yangcq88517 5:945b89c71902 74 if ((analogMask & 0x20) == 0x20) {
yangcq88517 5:945b89c71902 75 (*analog)[XBeePins::P11_AD4_DIO4] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 76 index+=2;
yangcq88517 5:945b89c71902 77 }
yangcq88517 0:837e6c48e90d 78
yangcq88517 5:945b89c71902 79 if ((analogMask & 0x40) == 0x40) {
yangcq88517 5:945b89c71902 80 (*analog)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 81 index+=2;
yangcq88517 5:945b89c71902 82 }
yangcq88517 0:837e6c48e90d 83 }
yangcq88517 0:837e6c48e90d 84 }
yangcq88517 0:837e6c48e90d 85
yangcq88517 2:700dc65ca3b1 86 return samples;
yangcq88517 0:837e6c48e90d 87 }
yangcq88517 0:837e6c48e90d 88
yangcq88517 6:5f31ddc17239 89 IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const unsigned char * IOSamplePayload, int offset)
yangcq88517 0:837e6c48e90d 90 {
yangcq88517 0:837e6c48e90d 91 // at least 4 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] + 1 bytes of [analog channel mask].
yangcq88517 0:837e6c48e90d 92
yangcq88517 0:837e6c48e90d 93 // the [number of samples] always set to 1.
yangcq88517 0:837e6c48e90d 94 int numofsamples = IOSamplePayload[offset];
yangcq88517 0:837e6c48e90d 95
yangcq88517 0:837e6c48e90d 96 if (numofsamples <= 0)
yangcq88517 2:700dc65ca3b1 97 return NULL;
yangcq88517 0:837e6c48e90d 98
yangcq88517 2:700dc65ca3b1 99 if (samples != NULL)
yangcq88517 0:837e6c48e90d 100 delete[] samples;
yangcq88517 0:837e6c48e90d 101
yangcq88517 0:837e6c48e90d 102 int index = offset + 1;
yangcq88517 0:837e6c48e90d 103
yangcq88517 0:837e6c48e90d 104 int digitMask = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
yangcq88517 0:837e6c48e90d 105 int analogMask = IOSamplePayload[index++];
yangcq88517 0:837e6c48e90d 106
yangcq88517 0:837e6c48e90d 107 samples = new IOSamples[numofsamples];
yangcq88517 0:837e6c48e90d 108
yangcq88517 0:837e6c48e90d 109 for (int i = 0; i < numofsamples; i++) {
yangcq88517 6:5f31ddc17239 110 map<Pin *, unsigned int> * analog = (samples + i)->getAnalogs();
yangcq88517 6:5f31ddc17239 111 map<Pin *, unsigned char> * digital = (samples + i)->getDigitals();
yangcq88517 0:837e6c48e90d 112
yangcq88517 0:837e6c48e90d 113 if (digitMask != 0) {
yangcq88517 0:837e6c48e90d 114 if ((digitMask & 0x01) == 0x01)
yangcq88517 4:a0f1fba6c2fb 115 (*digital)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
yangcq88517 0:837e6c48e90d 116 if ((digitMask & 0x02) == 0x02)
yangcq88517 4:a0f1fba6c2fb 117 (*digital)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
yangcq88517 0:837e6c48e90d 118 if ((digitMask & 0x04) == 0x04)
yangcq88517 4:a0f1fba6c2fb 119 (*digital)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
yangcq88517 0:837e6c48e90d 120 if ((digitMask & 0x08) == 0x08)
yangcq88517 4:a0f1fba6c2fb 121 (*digital)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
yangcq88517 0:837e6c48e90d 122 if ((digitMask & 0x10) == 0x10)
yangcq88517 4:a0f1fba6c2fb 123 (*digital)[ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
yangcq88517 0:837e6c48e90d 124 if ((digitMask & 0x20) == 0x20)
yangcq88517 4:a0f1fba6c2fb 125 (*digital)[ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
yangcq88517 0:837e6c48e90d 126 if ((digitMask & 0x40) == 0x40)
yangcq88517 4:a0f1fba6c2fb 127 (*digital)[ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
yangcq88517 0:837e6c48e90d 128 if ((digitMask & 0x80) == 0x80)
yangcq88517 4:a0f1fba6c2fb 129 (*digital)[ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
yangcq88517 0:837e6c48e90d 130
yangcq88517 0:837e6c48e90d 131 if (((digitMask >> 8) & 0x04) == 0x04)
yangcq88517 4:a0f1fba6c2fb 132 (*digital)[ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0;
yangcq88517 0:837e6c48e90d 133 if (((digitMask >> 8) & 0x08) == 0x08)
yangcq88517 4:a0f1fba6c2fb 134 (*digital)[ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0;
yangcq88517 0:837e6c48e90d 135 if (((digitMask >> 8) & 0x10) == 0x10)
yangcq88517 4:a0f1fba6c2fb 136 (*digital)[ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0;
yangcq88517 0:837e6c48e90d 137
yangcq88517 0:837e6c48e90d 138 index += 2;// 2 [digital sample]
yangcq88517 0:837e6c48e90d 139 }
yangcq88517 0:837e6c48e90d 140 if (analogMask != 0x00) { //analog mask
yangcq88517 5:945b89c71902 141 if ((analogMask & 0x01) == 0x01){
yangcq88517 5:945b89c71902 142 (*analog)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 143 index+=2;
yangcq88517 5:945b89c71902 144 }
yangcq88517 0:837e6c48e90d 145
yangcq88517 5:945b89c71902 146 if ((analogMask & 0x02) == 0x02){
yangcq88517 5:945b89c71902 147 (*analog)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 148 index+=2;
yangcq88517 5:945b89c71902 149 }
yangcq88517 0:837e6c48e90d 150
yangcq88517 5:945b89c71902 151 if ((analogMask & 0x04) == 0x04){
yangcq88517 5:945b89c71902 152 (*analog)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 153 index+=2;
yangcq88517 5:945b89c71902 154 }
yangcq88517 0:837e6c48e90d 155
yangcq88517 5:945b89c71902 156 if ((analogMask & 0x08) == 0x08){
yangcq88517 5:945b89c71902 157 (*analog)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
yangcq88517 5:945b89c71902 158 index+=2;
yangcq88517 5:945b89c71902 159 }
yangcq88517 0:837e6c48e90d 160
yangcq88517 5:945b89c71902 161 if ((analogMask & 0x80) == 0x80){
yangcq88517 5:945b89c71902 162 (samples + i)->setSupplyVoltage((IOSamplePayload[index] << 8) | IOSamplePayload[index+1]);
yangcq88517 5:945b89c71902 163 index+=2;
yangcq88517 5:945b89c71902 164 }
yangcq88517 0:837e6c48e90d 165 }
yangcq88517 0:837e6c48e90d 166 }
yangcq88517 0:837e6c48e90d 167
yangcq88517 2:700dc65ca3b1 168 return samples;
yangcq88517 0:837e6c48e90d 169 }