XBee API operation library for mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers IOSampleDecoder.cpp Source File

IOSampleDecoder.cpp

00001 #include "IOSampleDecoder.h"
00002 
00003 IOSamples * IOSampleDecoder::samples = NULL;
00004 
00005 int IOSampleDecoder::num = 0;
00006 
00007 IOSamples * IOSampleDecoder::XBeeSamplesParse(const unsigned  char * IOSamplePayload, int offset)
00008 {
00009     // at least 3 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] and [analog channel mask].
00010     int numofsamples = IOSamplePayload[offset];
00011 
00012     if (numofsamples <= 0)
00013         return NULL;
00014 
00015     if (samples != NULL) {
00016         if (numofsamples > num) {
00017             delete[] samples;
00018             samples = new IOSamples[numofsamples];
00019         }
00020     } else samples = new IOSamples[numofsamples];
00021     num = numofsamples;
00022 
00023     // first byte is the number of sample
00024     int index = offset + 1;
00025 
00026     int digitMask = ((IOSamplePayload[index] & 0x01) << 8) | IOSamplePayload[index + 1];
00027     int analogMask = IOSamplePayload[index] & 0xFE;
00028 
00029     // sample start at +2 [mask]
00030     index += 2;
00031 
00032     for (int i = 0; i < numofsamples; i++) {
00033         map<Pin *, unsigned int> *  analog = (samples + i)->getAnalogs();
00034         map<Pin *, unsigned char> *  digital = (samples + i)->getDigitals();
00035         if (digitMask != 0) {
00036             if ((digitMask & 0x01) == 0x01)
00037                 (*digital)[XBeePins::P20_AD0_DIO0] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
00038             if ((digitMask & 0x02) == 0x02)
00039                 (*digital)[XBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
00040             if ((digitMask & 0x04) == 0x04)
00041                 (*digital)[XBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
00042             if ((digitMask & 0x08) == 0x08)
00043                 (*digital)[XBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
00044             if ((digitMask & 0x10) == 0x10)
00045                 (*digital)[XBeePins::P11_AD4_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
00046             if ((digitMask & 0x20) == 0x20)
00047                 (*digital)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
00048             if ((digitMask & 0x40) == 0x40)
00049                 (*digital)[XBeePins::P16_RTS_AD6_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
00050             if ((digitMask & 0x80) == 0x80)
00051                 (*digital)[XBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
00052             if (((digitMask >> 8) & 0x01) == 0x01)
00053                 (*digital)[XBeePins::P9_DTR_SLEEP_DIO8] = (IOSamplePayload[index] & 0x01) == 0x01 ? 1 : 0;
00054 
00055             //skip the 2 [digital sample]
00056             index += 2;
00057         }
00058 
00059         if (analogMask != 0) {
00060             if ((analogMask & 0x02) == 0x02) {
00061                 (*analog)[XBeePins::P20_AD0_DIO0] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00062                 index+=2;
00063             }
00064             if ((analogMask & 0x04) == 0x04) {
00065                 (*analog)[XBeePins::P19_AD1_DIO1] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00066                 index+=2;
00067             }
00068 
00069             if ((analogMask & 0x08) == 0x08) {
00070                 (*analog)[XBeePins::P18_AD2_DIO2] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00071                 index+=2;
00072             }
00073 
00074             if ((analogMask & 0x10) == 0x10) {
00075                 (*analog)[XBeePins::P17_AD3_DIO3] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00076                 index+=2;
00077             }
00078 
00079             if ((analogMask & 0x20) == 0x20) {
00080                 (*analog)[XBeePins::P11_AD4_DIO4] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00081                 index+=2;
00082             }
00083 
00084             if ((analogMask & 0x40) == 0x40) {
00085                 (*analog)[XBeePins::P15_ASSOCIATE_AD5_DIO5] = IOSamplePayload[index] << 8 | IOSamplePayload[index+1];
00086                 index+=2;
00087             }
00088         }
00089     }
00090 
00091     return samples;
00092 }
00093 
00094 IOSamples * IOSampleDecoder::ZigBeeSamplesParse(const unsigned  char * IOSamplePayload, int offset)
00095 {
00096     // at least 4 bytes, 1 byte of [number of samples] + 2 bytes of [digital channel mask] + 1 bytes of [analog channel mask].
00097 
00098     // the [number of samples] always set to 1.
00099     int numofsamples = IOSamplePayload[offset];
00100 
00101     if (numofsamples <= 0)
00102         return NULL;
00103 
00104     if (samples != NULL) {
00105         if (numofsamples > num) {
00106             delete[] samples;
00107             samples = new IOSamples[numofsamples];
00108         }
00109     } else samples = new IOSamples[numofsamples];
00110     num = numofsamples;
00111     
00112     int index = offset + 1;
00113 
00114     int digitMask = (IOSamplePayload[index++] << 8) | IOSamplePayload[index++];
00115     int analogMask = IOSamplePayload[index++];
00116 
00117     for (int i = 0; i < numofsamples; i++) {
00118         map<Pin *, unsigned int> *  analog = (samples + i)->getAnalogs();
00119         map<Pin *, unsigned char> *  digital = (samples + i)->getDigitals();
00120 
00121         if (digitMask != 0) {
00122             if ((digitMask & 0x01) == 0x01)
00123                 (*digital)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index + 1] & 0x01) == 0x01 ? 1 : 0;
00124             if ((digitMask & 0x02) == 0x02)
00125                 (*digital)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index + 1] & 0x02) == 0x02 ? 1 : 0;
00126             if ((digitMask & 0x04) == 0x04)
00127                 (*digital)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index + 1] & 0x04) == 0x04 ? 1 : 0;
00128             if ((digitMask & 0x08) == 0x08)
00129                 (*digital)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index + 1] & 0x08) == 0x08 ? 1 : 0;
00130             if ((digitMask & 0x10) == 0x10)
00131                 (*digital)[ZigBeePins::P11_DIO4] = (IOSamplePayload[index + 1] & 0x10) == 0x10 ? 1 : 0;
00132             if ((digitMask & 0x20) == 0x20)
00133                 (*digital)[ZigBeePins::P15_ASSOCIATE_DIO5] = (IOSamplePayload[index + 1] & 0x20) == 0x20 ? 1 : 0;
00134             if ((digitMask & 0x40) == 0x40)
00135                 (*digital)[ZigBeePins::P16_RTS_DIO6] = (IOSamplePayload[index + 1] & 0x40) == 0x40 ? 1 : 0;
00136             if ((digitMask & 0x80) == 0x80)
00137                 (*digital)[ZigBeePins::P12_CTS_DIO7] = (IOSamplePayload[index + 1] & 0x80) == 0x80 ? 1 : 0;
00138 
00139             if (((digitMask >> 8) & 0x04) == 0x04)
00140                 (*digital)[ZigBeePins::P6_RSSI_PWM_DIO10] = (IOSamplePayload[index] & 0x04) == 0x04 ? 1 : 0;
00141             if (((digitMask >> 8) & 0x08) == 0x08)
00142                 (*digital)[ZigBeePins::P7_PWM_DIO11] = (IOSamplePayload[index] & 0x08) == 0x08 ? 1 : 0;
00143             if (((digitMask >> 8) & 0x10) == 0x10)
00144                 (*digital)[ZigBeePins::P4_DIO12] = (IOSamplePayload[index] & 0x10) == 0x10 ? 1 : 0;
00145 
00146             index += 2;// 2 [digital sample]
00147         }
00148         if (analogMask != 0x00) { //analog mask
00149             if ((analogMask & 0x01) == 0x01){
00150                 (*analog)[ZigBeePins::P20_AD0_DIO0_COMMISSIONONG_BUTTON] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00151                 index+=2;
00152             }
00153 
00154             if ((analogMask & 0x02) == 0x02){
00155                 (*analog)[ZigBeePins::P19_AD1_DIO1] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00156                 index+=2;
00157             }
00158 
00159             if ((analogMask & 0x04) == 0x04){
00160                 (*analog)[ZigBeePins::P18_AD2_DIO2] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00161                 index+=2;
00162             }
00163 
00164             if ((analogMask & 0x08) == 0x08){
00165                 (*analog)[ZigBeePins::P17_AD3_DIO3] = (IOSamplePayload[index] << 8) | IOSamplePayload[index+1];
00166                 index+=2;
00167             }
00168 
00169             if ((analogMask & 0x80) == 0x80){
00170                 (samples + i)->setSupplyVoltage((IOSamplePayload[index] << 8) | IOSamplePayload[index+1]);
00171                 index+=2;
00172             }
00173         }
00174     }
00175 
00176     return samples;
00177 }