XBee API operation library for mbed

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?

UserRevisionLine numberNew 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 }