MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / rt_link_frame_check

Function rt_link_frame_check

components/utilities/rt-link/src/rtlink.c:641–865  ·  view source on GitHub ↗

RT_LINK_READ_CHECK_EVENT handle */

Source from the content-addressed store, hash-verified

639
640/* RT_LINK_READ_CHECK_EVENT handle */
641static 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 }

Callers 1

rt_link_threadFunction · 0.85

Calls 11

rt_link_hw_recv_lenFunction · 0.85
rt_link_frame_initFunction · 0.85
rt_link_hw_copyFunction · 0.85
rt_timer_controlFunction · 0.85
rt_timer_startFunction · 0.85
rt_timer_stopFunction · 0.85
rt_link_check_seqFunction · 0.85
rt_slist_firstFunction · 0.85
rt_link_parse_frameFunction · 0.85

Tested by

no test coverage detected