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.

Dependencies:   BufferedArray

Dependents:   MBEDminiproject

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?

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