xbee_err xbee_s2_io_parseInputs(struct xbee *xbee, struct xbee_pkt *pkt, unsigned char *data, int len) { int sampleCount; int sample, channel; int ioMask; if (len < 4) return XBEE_ELENGTH; sampleCount = data[0]; data++; len--; /* mask is ordered: MSB - Supply Voltage * n/a * * n/a * * n/a * AD3 AD2 AD1 - AD0 - * n/a * * n/a * * n/a * CD/DIO12 PWM/DIO11 RSSI/DIO10 * n/a * - * n/a * - CTS/DIO7 RTS/DIO6 Assoc/DIO5 DIO4 AD3/DIO3 AD2/DIO2 AD1/DIO1 LSB - AD0/DIO0 */ ioMask = ((data[2] << 16) & 0xFF0000) | ((data[0] << 8) & 0xFF00) | (data[1] & 0xFF); data += 3; len -= 3; /* poke out the n/a fields, just incase */ ioMask &= 0x8F1CFF; for (sample = 0; sample < sampleCount; sample++) { int mask; if (ioMask & 0x001CFF) { int digitalValue; if (len < 2) return XBEE_ELENGTH; digitalValue = ((data[0] << 8) & 0xFF00) | (data[1] & 0xFF); /* poke out the n/a fields */ digitalValue &= 0x1CFF; mask = 0x000001; for (channel = 0; channel <= 12; channel++, mask <<= 1) { if (ioMask & mask) { if (xbee_pktDigitalAdd(pkt, channel, digitalValue & mask)) { xbee_log(1,"Failed to add digital sample information to packet (channel D%d)", channel); } } } data += 2; len -= 2; } mask = 0x010000; for (channel = 0; channel <= 4; channel++, mask <<= 1) { if (channel == 4) mask = 0x800000; if (ioMask & mask) { if (len < 2) return XBEE_ELENGTH; if (xbee_pktAnalogAdd(pkt, channel, ((data[0] << 8) & 0x3F00) | (data[1] & 0xFF))) { xbee_log(1,"Failed to add analog sample information to packet (channel A%d)", channel); } data += 2; len -= 2; } } } return XBEE_ENONE; }
xbee_err xbee_s6b_io_parseInputs(struct xbee *xbee, struct xbee_pkt *pkt, unsigned char *data, int len) { int sampleCount; int sample, channel; int ioMask; if (len < 4) return XBEE_ELENGTH; sampleCount = data[0]; data++; len--; /* mask is ordered: MSB - * n/a * * n/a * * n/a * * n/a * AD3 AD2 AD1 - AD0 - * n/a * DIN/DIO14 DOUT/DIO13 SPI_MISO/DIO12 PWM1/DIO11 PWM0/DIO10 ON_SLEEP/DIO9 - DTR/DIO8 - CTS/DIO7 RTS/DIO6 Assoc/DIO5 SPI_MOSI/DIO4 AD3/DIO3 AD2/DIO2 AD1/DIO1 LSB - AD0/DIO0 */ ioMask = ((data[0] << 8) & 0xFF00) | (data[1] & 0xFF); data += 2; len-= 2; /* poke out the n/a fields, just incase */ ioMask &= 0x0F7FFF; for (sample = 0; sample < sampleCount; sample++) { int mask; if (ioMask & 0x007FFF) { int digitalValue; if (len < 2) return XBEE_ELENGTH; digitalValue = ((data[0] << 8) & 0x0100) | (data[1] & 0xFF); mask = 0x000001; for (channel = 0; channel <= 14; channel++, mask <<= 1) { if (ioMask & mask) { if (xbee_pktDigitalAdd(pkt, channel, digitalValue & mask)) { xbee_log(1,"Failed to add digital sample information to packet (channel D%d)", channel); } } } data += 2; len -= 2; } mask = 0x010000; for (channel = 0; channel <= 3; channel++, mask <<= 1) { if (ioMask & mask) { if (len < 2) return XBEE_ELENGTH; if (xbee_pktAnalogAdd(pkt, channel, ((data[0] << 8) & 0x3F00) | (data[1] & 0xFF))) { xbee_log(1,"Failed to add analog sample information to packet (channel A%d)", channel); } data += 2; len -= 2; } } } return XBEE_ENONE; }