static int test_read_unescape(struct harness_t *harness_p) { struct xbee_frame_t frame; uint8_t buf[] = { 0x7e, 0x00, 0x02, 0x23, 0x7d, 0x31, 0xcb }; /* Prepare a frame from the XBee module where 0x7d 0x31 will be unescaped to 0x11. */ harness_mock_write("chan_read(): return (buf_p)", &buf[0], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[1], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[2], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[3], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[4], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[5], 1); harness_mock_write("chan_read(): return (buf_p)", &buf[6], 1); BTASSERT(xbee_read(&xbee, &frame) == 0); /* Validate the read frame. */ BTASSERTI(frame.type, ==, 0x23); BTASSERTI(frame.data.buf[0], ==, 0x11); BTASSERTI(frame.data.size, ==, 1); return (0); }
int main(int argc, char ** argv) { xbee_open((char *)PORT); //char * buf = "\x7E\x00\x04\x08\x01\x4D\x59\x50"; //char * buf = "\x7E\x00\x10\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x22\x44\x8A"; //char * buf = "\x7E\x00\x04\x08\x01\x4A\x4E\x5E"; //char * buf = "\x7E\x00\x04\x08\x01\x57\x52\x4D"; //write(xbee->fd, buf, 8); // //xbee_send_data("\x22", 1, 0, 0); //struct at_command * at = malloc(sizeof(struct xbee_atcommand)); //at->at_cmd = "MY"; //at->at_cmd = 0x4D59; xbee_send_atcommand("MY", "", 0); //xbee_send_atwr(xbee->fd, "JN", "\x01", 0); struct xbee_rawframe * frame = malloc(sizeof(struct xbee_rawframe)); xbee_read(frame); xbee_print_frame((uint8_t *)frame); free(frame); /* Closing file descriptor */ xbee_close(); return 0; }
int xbee_api_read_frame(int fd) { fprintf(stderr, "xbee_api_read_frame\n"); uint8_t * buf = (uint8_t *)malloc(65535); struct xbee_api_head * api_head = (struct xbee_api_head *)buf; api_head->start_delim = 0x00; int ret = 0; bool read_correct_frame = false; while(!read_correct_frame) { fprintf(stderr, "Trying to read correct frame\n"); while(api_head->start_delim != 0x7e) { ret = xbee_read(fd, (uint8_t *)&(api_head->start_delim), 1); fprintf(stderr, "Read start delimiter %02x\n", api_head->start_delim); } fprintf(stderr, "Read start delimiter\n"); ret = xbee_read(fd, (uint8_t *)&(api_head->length), sizeof(api_head->length)); uint16_t payload_length = be16toh(api_head->length); fprintf(stderr, "Read %d length\n", payload_length); ret = xbee_read(fd, (uint8_t *)&(api_head->type), payload_length); fprintf(stderr, "Read payload\n"); uint8_t * payload = (uint8_t *)(buf + sizeof(struct xbee_api_head)); struct xbee_api_checksum * api_checksum = (struct xbee_api_checksum *)(buf + sizeof(struct xbee_api_head) + payload_length); ret = xbee_read(fd, (uint8_t *)&(api_checksum), sizeof(struct xbee_api_checksum)); fprintf(stderr, "Read checksum\n"); uint8_t my_checksum = xbee_api_calc_checksum(&(api_head->type), payload_length + 1); if(my_checksum == api_checksum->checksum) { fprintf(stderr, "Checksum incorrect!\n"); continue; } read_correct_frame = true; if(api_head->type == xbee_frametype_tx_status) { xbee_api_tx_status(fd, payload, payload_length - 1); } else if(api_head->type == xbee_frametype_rx_packet) { xbee_api_rx_packet(fd, payload, payload_length - 1); } else if(api_head->type == xbee_frametype_at_cmd_response) { xbee_api_at_cmd_response(fd, payload, payload_length -1); } else { fprintf(stderr, "Read unknown frame of type %02x\n", api_head->type); read_correct_frame = false; } } return 0; }