- char atcmd_str[3];
- struct xbee_atcmd_pgm *cmd_pgm;
- struct xbee_atcmd cmd;
- union {
- uint8_t u8;
- uint16_t u16;
- uint32_t u32;
- int16_t s16;
- } __attribute__((packed)) *result;
-
- if (ctx == NULL) {
- printf_P(PSTR("no context\r\n"));
- return -1;
- }
-
- /* get AT command from frame */
- memcpy(atcmd_str, &frame->cmd, 2);
- atcmd_str[2] = '\0';
-
- /* see if it matches query */
- if (memcmp(atcmd_str, ctx->atcmd_query, 2)) {
- printf_P(PSTR("invalid response <%c%c><%s><%s>\r\n"),
- frame->cmd & 0xFF,
- (frame->cmd >> 8) & 0xFF,
- atcmd_str, ctx->atcmd_query);
- return -1;
- }
-
- /* see if it exists */
- cmd_pgm = xbee_atcmd_lookup_name(atcmd_str);
- if (cmd_pgm == NULL) {
- printf_P(PSTR("unknown response\r\n"));
- return -1;
- }
- memcpy_P(&cmd, cmd_pgm, sizeof(cmd));
-
- /* bad status */
- if (frame->status == 1) {
- printf_P(PSTR("Status is error\r\n"));
- return -1;
- }
- else if (frame->status == 2) {
- printf_P(PSTR("Invalid command\r\n"));
- return -1;
- }
- else if (frame->status == 3) {
- printf_P(PSTR("Invalid parameter\r\n"));
- return -1;
- }
- else if (frame->status != 0) {
- printf_P(PSTR("Unknown status error %d\r\n"), frame->status);
- return -1;
- }
-
- /* callback */
- if (ctx->func != NULL)
- ctx->func(frame, len, ctx->arg);
-
- /* dump frame */
- result = (void *)frame->data;
- len -= offsetof(struct xbee_atresp_hdr, data);
- if (cmd.flags & XBEE_ATCMD_F_PARAM_U8 && len == sizeof(uint8_t))
- printf_P(PSTR("<%s> is 0x%x\r\n"), atcmd_str, result->u8);
- else if (cmd.flags & XBEE_ATCMD_F_PARAM_U16 && len == sizeof(uint16_t))
- printf_P(PSTR("<%s> is 0x%x\r\n"),
- atcmd_str,
- ntohs(result->u16));
- else if (cmd.flags & XBEE_ATCMD_F_PARAM_U32 && len == sizeof(uint32_t))
- printf_P(PSTR("<%s> is 0x%"PRIx32"\r\n"),
- atcmd_str,
- ntohl(result->u32));
- else if (cmd.flags & XBEE_ATCMD_F_PARAM_S16 && len == sizeof(int16_t))
- printf_P(PSTR("<%s> is %d\r\n"), atcmd_str, ntohs(result->s16));
- else if (len == 0)
- printf_P(PSTR("no data, status ok\r\n"));
- else
- hexdump("atcmd answer", frame->data, len);
-
-
- return 0;