Example #1
0
xbee_err xbee_sZB_identify_rx_func(struct xbee *xbee, void *arg, unsigned char identifier, struct xbee_tbuf *buf, struct xbee_frameInfo *frameInfo, struct xbee_conAddress *address, struct xbee_pkt **pkt) {
	struct xbee_pkt *iPkt;
	xbee_err ret;
	struct xbee_conAddress *addr;

	if (!xbee || !frameInfo || !buf || !address || !pkt) return XBEE_EMISSINGPARAM;
	
	if (buf->len < 30) return XBEE_ELENGTH;
	
	if ((ret = xbee_pktAlloc(&iPkt, NULL, buf->len - 12)) != XBEE_ENONE) return ret;
	
	iPkt->options = buf->data[11];
	
	iPkt->dataLen = buf->len - 12;
	if (iPkt->dataLen > 0) {
		memcpy(iPkt->data, &(buf->data[12]), iPkt->dataLen);
		
		if (iPkt->dataLen > 2) {
			xbee_pktDataAdd(iPkt, "Address (16-bit)", 0, &(iPkt->data[0]), NULL);
		}
		
		if (iPkt->dataLen > 10) {
			xbee_pktDataAdd(iPkt, "Address (64-bit)", 0, &(iPkt->data[2]), NULL);
			
			if ((addr = malloc(sizeof(*addr))) != NULL) {
				memset(addr, 0, sizeof(*addr));
				addr->addr16_enabled = 1;
				memcpy(addr->addr16, &(iPkt->data[0]), 2);
				addr->addr64_enabled = 1;
				memcpy(addr->addr64, &(iPkt->data[2]), 8);
				
				if (xbee_pktDataAdd(iPkt, "Address", 0, addr, free) != XBEE_ENONE) {
					free(addr);
				}
			}
		}
		
		if (iPkt->dataLen > 11) {
			/* just point into the packet data */
			xbee_pktDataAdd(iPkt, "NI", 0, &(iPkt->data[10]), NULL);
		}
	}
	iPkt->data[iPkt->dataLen] = '\0';
	
	*pkt = iPkt;
	
	return XBEE_ENONE;
}
Example #2
0
File: pkt.c Project: C24IO/libxbee3
xbee_err xbee_pktAnalogAdd(struct xbee_pkt *pkt, int channel, long value) {
	if (!pkt) return XBEE_EMISSINGPARAM;
#ifndef XBEE_DISABLE_STRICT_OBJECTS
	if (xbee_pktValidate(pkt) != XBEE_ENONE) return XBEE_EINVAL;
#endif /* XBEE_DISABLE_STRICT_OBJECTS */
	
	value += 1;
	return xbee_pktDataAdd(pkt, "analog", channel, (void*)value, NULL);
}
Example #3
0
xbee_err xbee_sZB_identify_rx_func(struct xbee *xbee, void *arg, unsigned char identifier, struct xbee_tbuf *buf, struct xbee_frameInfo *frameInfo, struct xbee_conAddress *address, struct xbee_pkt **pkt) {
	struct xbee_pkt *iPkt;
	xbee_err ret;
	struct xbee_conAddress *addr;

	if (!xbee || !frameInfo || !buf || !address || !pkt) return XBEE_EMISSINGPARAM;
	
	if (buf->len < 30) return XBEE_ELENGTH;
	
	if ((ret = xbee_pktAlloc(&iPkt, NULL, buf->len - 12)) != XBEE_ENONE) return ret;
	
	iPkt->options = buf->data[11];
	
	iPkt->dataLen = buf->len - 12;
	if (iPkt->dataLen > 0) {
		const int NIstart = 10;
		int NIend;

		memcpy(iPkt->data, &(buf->data[12]), iPkt->dataLen);
		
		if (iPkt->dataLen < 2) goto done;
		xbee_pktDataAdd(iPkt, "Address (16-bit)", 0, &(iPkt->data[0]), NULL);
		
		if (iPkt->dataLen < 10) goto done;
		xbee_pktDataAdd(iPkt, "Address (64-bit)", 0, &(iPkt->data[2]), NULL);

		if ((addr = malloc(sizeof(*addr))) != NULL) {
			memset(addr, 0, sizeof(*addr));
			addr->addr16_enabled = 1;
			memcpy(addr->addr16, &(iPkt->data[0]), 2);
			addr->addr64_enabled = 1;
			memcpy(addr->addr64, &(iPkt->data[2]), 8);
			
			if (xbee_pktDataAdd(iPkt, "Address", 0, addr, free) != XBEE_ENONE) {
				free(addr);
			}
		}
		
		if (iPkt->dataLen < 11) goto done;
		/* just point into the packet data */
		xbee_pktDataAdd(iPkt, "NI", 0, &(iPkt->data[NIstart]), NULL);
		for (NIend = NIstart; iPkt->data[NIend] != '\0' && NIend < iPkt->dataLen; NIend++);
		NIend++; /* step over the nul */

		if (iPkt->dataLen < NIend + 2) goto done;
		xbee_pktDataAdd(iPkt, "Parent Address", 0, &(iPkt->data[NIend]), NULL);

		if (iPkt->dataLen < NIend + 3) goto done;
		xbee_pktDataAdd(iPkt, "Device Type", 0, &(iPkt->data[NIend + 2]), NULL);

		if (iPkt->dataLen < NIend + 4) goto done;
		xbee_pktDataAdd(iPkt, "Source Event", 0, &(iPkt->data[NIend + 3]), NULL);

		if (iPkt->dataLen < NIend + 6) goto done;
		xbee_pktDataAdd(iPkt, "Profile ID", 0, &(iPkt->data[NIend + 4]), NULL);

		if (iPkt->dataLen < NIend + 8) goto done;
		xbee_pktDataAdd(iPkt, "Manufacturer ID", 0, &(iPkt->data[NIend + 6]), NULL);
	}

done:
	iPkt->data[iPkt->dataLen] = '\0';
	
	*pkt = iPkt;
	
	return XBEE_ENONE;
}