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.
Helper/IOSampleDecoder.cpp@5:945b89c71902, 2015-11-05 (annotated)
- Committer:
- yangcq88517
- Date:
- Thu Nov 05 23:03:42 2015 +0000
- Revision:
- 5:945b89c71902
- Parent:
- 4:a0f1fba6c2fb
- Child:
- 6:5f31ddc17239
bug fix for io sample
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:700dc65ca3b1 | 5 | IOSamples * IOSampleDecoder::XBeeSamplesParse(const 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 | 2:700dc65ca3b1 | 28 | map<Pin *, int> * analog = (samples + i)->getAnalogs(); |
yangcq88517 | 2:700dc65ca3b1 | 29 | map<Pin *, int> * 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 | 2:700dc65ca3b1 | 89 | IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const 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 | 2:700dc65ca3b1 | 110 | map<Pin *, int> * analog = (samples + i)->getAnalogs(); |
yangcq88517 | 2:700dc65ca3b1 | 111 | map<Pin *, int> * 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 | } |