+ char atcmd_str[3];
+ const struct xbee_atcmd *cmd_pgm;
+ struct xbee_atcmd cmd;
+
+ /* get AT command from frame */
+ memcpy(atcmd_str, &frame->cmd, 2);
+ atcmd_str[2] = '\0';
+
+
+ /* see if it exists */
+ cmd_pgm = xbee_atcmd_lookup_name(atcmd_str);
+ if (cmd_pgm == NULL) {
+ snprintf(buf, buflen, "<%s> (unknown cmd)", atcmd_str);
+ return;
+ }
+ memcpy_P(&cmd, cmd_pgm, sizeof(cmd));
+ len -= sizeof(*frame);
+
+ /* dump frame */
+ result = (void *)frame->data;
+
+ if (cmd.flags & XBEE_ATCMD_F_PARAM_U8 && len == sizeof(uint8_t))
+ snprintf(buf, buflen, "<%s> is 0x%x (%d)", atcmd_str,
+ result->u8, result->u8);
+ else if (cmd.flags & XBEE_ATCMD_F_PARAM_U16 && len == sizeof(uint16_t))
+ snprintf(buf, buflen, "<%s> is 0x%x (%d)", atcmd_str,
+ ntohs(result->u16), ntohs(result->u16));
+ else if (cmd.flags & XBEE_ATCMD_F_PARAM_U32 && len == sizeof(uint32_t))
+ snprintf(buf, buflen, "<%s> is 0x%"PRIx32" (%"PRIu32")",
+ atcmd_str, ntohl(result->u32), ntohl(result->u32));
+ else if (cmd.flags & XBEE_ATCMD_F_PARAM_S16 && len == sizeof(int16_t))
+ snprintf(buf, buflen, "<%s> is %d",
+ atcmd_str, ntohs(result->s16));
+ else if (len == 0)
+ snprintf(buf, buflen, "<%s> no data", atcmd_str);
+ else
+ snprintf(buf, buflen, "invalid atresp");
+}
+
+static int parse_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame,
+ unsigned len)
+{
+ char atcmd_str[3];
+ char buf[32];