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; }
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); }
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; }