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@4:a0f1fba6c2fb, 2015-10-30 (annotated)
- Committer:
- yangcq88517
- Date:
- Fri Oct 30 00:38:40 2015 +0000
- Revision:
- 4:a0f1fba6c2fb
- Parent:
- 2:700dc65ca3b1
- Child:
- 5:945b89c71902
bug fix
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 | 2:700dc65ca3b1 | 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 | 0:837e6c48e90d | 55 | if ((analogMask & 0x02) == 0x02) |
yangcq88517 | 4:a0f1fba6c2fb | 56 | (*analog)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 57 | |
yangcq88517 | 0:837e6c48e90d | 58 | if ((analogMask & 0x04) == 0x04) |
yangcq88517 | 4:a0f1fba6c2fb | 59 | (*analog)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 60 | |
yangcq88517 | 0:837e6c48e90d | 61 | if ((analogMask & 0x08) == 0x08) |
yangcq88517 | 4:a0f1fba6c2fb | 62 | (*analog)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 63 | |
yangcq88517 | 0:837e6c48e90d | 64 | if ((analogMask & 0x10) == 0x10) |
yangcq88517 | 4:a0f1fba6c2fb | 65 | (*analog)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 66 | |
yangcq88517 | 0:837e6c48e90d | 67 | if ((analogMask & 0x20) == 0x20) |
yangcq88517 | 4:a0f1fba6c2fb | 68 | (*analog)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 69 | |
yangcq88517 | 0:837e6c48e90d | 70 | if ((analogMask & 0x40) == 0x40) |
yangcq88517 | 4:a0f1fba6c2fb | 71 | (*analog)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 72 | } |
yangcq88517 | 0:837e6c48e90d | 73 | } |
yangcq88517 | 0:837e6c48e90d | 74 | |
yangcq88517 | 2:700dc65ca3b1 | 75 | return samples; |
yangcq88517 | 0:837e6c48e90d | 76 | } |
yangcq88517 | 0:837e6c48e90d | 77 | |
yangcq88517 | 2:700dc65ca3b1 | 78 | IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const char * IOSamplePayload, int offset) |
yangcq88517 | 0:837e6c48e90d | 79 | { |
yangcq88517 | 0:837e6c48e90d | 80 | // 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 | 81 | |
yangcq88517 | 0:837e6c48e90d | 82 | // the [number of samples] always set to 1. |
yangcq88517 | 0:837e6c48e90d | 83 | int numofsamples = IOSamplePayload[offset]; |
yangcq88517 | 0:837e6c48e90d | 84 | |
yangcq88517 | 0:837e6c48e90d | 85 | if (numofsamples <= 0) |
yangcq88517 | 2:700dc65ca3b1 | 86 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 87 | |
yangcq88517 | 2:700dc65ca3b1 | 88 | if (samples != NULL) |
yangcq88517 | 0:837e6c48e90d | 89 | delete[] samples; |
yangcq88517 | 0:837e6c48e90d | 90 | |
yangcq88517 | 0:837e6c48e90d | 91 | int index = offset + 1; |
yangcq88517 | 0:837e6c48e90d | 92 | |
yangcq88517 | 0:837e6c48e90d | 93 | int digitMask = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 94 | int analogMask = IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 95 | |
yangcq88517 | 0:837e6c48e90d | 96 | samples = new IOSamples[numofsamples]; |
yangcq88517 | 0:837e6c48e90d | 97 | |
yangcq88517 | 0:837e6c48e90d | 98 | for (int i = 0; i < numofsamples; i++) { |
yangcq88517 | 2:700dc65ca3b1 | 99 | map<Pin *, int> * analog = (samples + i)->getAnalogs(); |
yangcq88517 | 2:700dc65ca3b1 | 100 | map<Pin *, int> * digital = (samples + i)->getDigitals(); |
yangcq88517 | 0:837e6c48e90d | 101 | |
yangcq88517 | 0:837e6c48e90d | 102 | if (digitMask != 0) { |
yangcq88517 | 0:837e6c48e90d | 103 | if ((digitMask & 0x01) == 0x01) |
yangcq88517 | 4:a0f1fba6c2fb | 104 | (*digital)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 105 | if ((digitMask & 0x02) == 0x02) |
yangcq88517 | 4:a0f1fba6c2fb | 106 | (*digital)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 107 | if ((digitMask & 0x04) == 0x04) |
yangcq88517 | 4:a0f1fba6c2fb | 108 | (*digital)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 109 | if ((digitMask & 0x08) == 0x08) |
yangcq88517 | 4:a0f1fba6c2fb | 110 | (*digital)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 111 | if ((digitMask & 0x10) == 0x10) |
yangcq88517 | 4:a0f1fba6c2fb | 112 | (*digital)[ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 113 | if ((digitMask & 0x20) == 0x20) |
yangcq88517 | 4:a0f1fba6c2fb | 114 | (*digital)[ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 115 | if ((digitMask & 0x40) == 0x40) |
yangcq88517 | 4:a0f1fba6c2fb | 116 | (*digital)[ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 117 | if ((digitMask & 0x80) == 0x80) |
yangcq88517 | 4:a0f1fba6c2fb | 118 | (*digital)[ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 119 | |
yangcq88517 | 0:837e6c48e90d | 120 | if (((digitMask >> 8) & 0x04) == 0x04) |
yangcq88517 | 4:a0f1fba6c2fb | 121 | (*digital)[ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 122 | if (((digitMask >> 8) & 0x08) == 0x08) |
yangcq88517 | 4:a0f1fba6c2fb | 123 | (*digital)[ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 124 | if (((digitMask >> 8) & 0x10) == 0x10) |
yangcq88517 | 4:a0f1fba6c2fb | 125 | (*digital)[ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0; |
yangcq88517 | 0:837e6c48e90d | 126 | |
yangcq88517 | 0:837e6c48e90d | 127 | index += 2;// 2 [digital sample] |
yangcq88517 | 0:837e6c48e90d | 128 | } |
yangcq88517 | 0:837e6c48e90d | 129 | if (analogMask != 0x00) { //analog mask |
yangcq88517 | 0:837e6c48e90d | 130 | if ((analogMask & 0x01) == 0x01) |
yangcq88517 | 4:a0f1fba6c2fb | 131 | (*analog)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 132 | |
yangcq88517 | 0:837e6c48e90d | 133 | if ((analogMask & 0x02) == 0x02) |
yangcq88517 | 4:a0f1fba6c2fb | 134 | (*analog)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 135 | |
yangcq88517 | 0:837e6c48e90d | 136 | if ((analogMask & 0x04) == 0x04) |
yangcq88517 | 4:a0f1fba6c2fb | 137 | (*analog)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 138 | |
yangcq88517 | 0:837e6c48e90d | 139 | if ((analogMask & 0x08) == 0x08) |
yangcq88517 | 4:a0f1fba6c2fb | 140 | (*analog)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++]; |
yangcq88517 | 0:837e6c48e90d | 141 | |
yangcq88517 | 0:837e6c48e90d | 142 | if ((analogMask & 0x80) == 0x80) |
yangcq88517 | 0:837e6c48e90d | 143 | (samples + i)->setSupplyVoltage((IOSamplePayload[index++] << 8) | IOSamplePayload[index++]); |
yangcq88517 | 0:837e6c48e90d | 144 | } |
yangcq88517 | 0:837e6c48e90d | 145 | } |
yangcq88517 | 0:837e6c48e90d | 146 | |
yangcq88517 | 2:700dc65ca3b1 | 147 | return samples; |
yangcq88517 | 0:837e6c48e90d | 148 | } |