Пример #1
0
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;
}
Пример #2
0
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;
}