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