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