RT_LINK_READ_CHECK_EVENT handle */
| 639 | |
| 640 | /* RT_LINK_READ_CHECK_EVENT handle */ |
| 641 | static void rt_link_frame_check(void) |
| 642 | { |
| 643 | static struct rt_link_frame receive_frame = {0}; |
| 644 | static rt_link_frame_parse_t analysis_status = FIND_FRAME_HEAD; |
| 645 | static rt_uint8_t *data = RT_NULL; |
| 646 | static rt_uint16_t buff_len = RT_LINK_HEAD_LENGTH; |
| 647 | |
| 648 | struct rt_link_frame *send_frame = RT_NULL; |
| 649 | rt_tick_t timeout = 0; |
| 650 | rt_uint32_t temporary_crc = 0; |
| 651 | |
| 652 | rt_uint8_t offset = 0; |
| 653 | rt_size_t recv_len = rt_link_hw_recv_len(rt_link_scb->rx_buffer); |
| 654 | while (recv_len > 0) |
| 655 | { |
| 656 | switch (analysis_status) |
| 657 | { |
| 658 | case FIND_FRAME_HEAD: |
| 659 | { |
| 660 | /* if we can't find frame head, throw that data */ |
| 661 | if ((*rt_link_scb->rx_buffer->read_point & RT_LINK_FRAME_HEAD_MASK) == RT_LINK_FRAME_HEAD) |
| 662 | { |
| 663 | analysis_status = PARSE_FRAME_HEAD; |
| 664 | break; |
| 665 | } |
| 666 | rt_link_hw_buffer_point_shift(&rt_link_scb->rx_buffer->read_point, 1); |
| 667 | break; |
| 668 | } |
| 669 | |
| 670 | case PARSE_FRAME_HEAD: |
| 671 | { |
| 672 | if (recv_len < buff_len) |
| 673 | { |
| 674 | LOG_D("HEAD: actual: %d, need: %d.", recv_len, buff_len); |
| 675 | return ; |
| 676 | } |
| 677 | /* Data is an offset address */ |
| 678 | data = rt_link_scb->rx_buffer->read_point; |
| 679 | rt_link_frame_init(&receive_frame, RT_NULL); |
| 680 | rt_link_hw_copy((rt_uint8_t *)&receive_frame.head, data, sizeof(struct rt_link_frame_head)); |
| 681 | rt_link_hw_buffer_point_shift(&data, sizeof(struct rt_link_frame_head)); |
| 682 | |
| 683 | LOG_D("HEAD: seq(%d) serv(%d) ack(%d) crc(%d) ext(%d) len(%d) attr(%d)(0x%x)" |
| 684 | , receive_frame.head.sequence |
| 685 | , receive_frame.head.service |
| 686 | , receive_frame.head.ack |
| 687 | , receive_frame.head.crc |
| 688 | , receive_frame.head.extend |
| 689 | , receive_frame.head.length |
| 690 | , receive_frame.extend.attribute |
| 691 | , receive_frame.extend.parameter); |
| 692 | |
| 693 | receive_frame.data_len = receive_frame.head.length; |
| 694 | if (receive_frame.head.service >= RT_LINK_SERVICE_MAX) |
| 695 | { |
| 696 | rt_link_hw_buffer_point_shift(&rt_link_scb->rx_buffer->read_point, 1); |
| 697 | goto __find_head; |
| 698 | } |
no test coverage detected