1+ #include "CRSF.h"
2+ #include "targets.h"
3+
4+ extern CRSF crsf ;
5+
6+ uint8_t UARTinPacketPtr ;
7+ uint8_t UARTinPacketLen ;
8+ uint32_t UARTinLastDataTime ;
9+ uint32_t UARTinLastPacketTime ;
10+ bool UARTframeActive = false;
11+
12+ uint8_t UARTinBuffer [256 ];
13+
14+ void RX_UARTinProcessPacket ()
15+ {
16+ if (UARTinBuffer [2 ] == CRSF_FRAMETYPE_COMMAND )
17+ {
18+ #ifdef PLATFORM_STM32
19+ Serial .println ("Got CMD Packet" );
20+ if (UARTinBuffer [3 ] == 0x62 && UARTinBuffer [4 ] == 0x6c )
21+ {
22+ delay (100 );
23+ Serial .println ("Jumping to Bootloader..." );
24+ delay (100 );
25+ HAL_NVIC_SystemReset ();
26+ }
27+ #endif
28+ }
29+
30+ if (UARTinBuffer [2 ] == CRSF_FRAMETYPE_BATTERY_SENSOR )
31+ {
32+ crsf .TLMbattSensor .voltage = (UARTinBuffer [3 ] << 8 ) + UARTinBuffer [4 ];
33+ crsf .TLMbattSensor .current = (UARTinBuffer [5 ] << 8 ) + UARTinBuffer [6 ];
34+ crsf .TLMbattSensor .capacity = (UARTinBuffer [7 ] << 16 ) + (UARTinBuffer [8 ] << 8 ) + UARTinBuffer [9 ];
35+ crsf .TLMbattSensor .remaining = UARTinBuffer [9 ];
36+ }
37+
38+ if (UARTinBuffer [2 ] == CRSF_FRAMETYPE_GPS )
39+ {
40+ crsf .TLMGPSsensor .latitude = (UARTinBuffer [3 ] << 24 ) + (UARTinBuffer [4 ] << 16 )+ (UARTinBuffer [5 ] << 8 ) + (UARTinBuffer [6 ] << 0 );
41+ crsf .TLMGPSsensor .longitude = (UARTinBuffer [7 ] << 24 ) + (UARTinBuffer [8 ] << 16 )+ (UARTinBuffer [9 ] << 8 ) + (UARTinBuffer [10 ] << 0 );
42+ crsf .TLMGPSsensor .speed = (UARTinBuffer [11 ] << 8 ) + (UARTinBuffer [12 ] << 0 );
43+ crsf .TLMGPSsensor .headng = (UARTinBuffer [13 ] << 8 ) + (UARTinBuffer [14 ] << 0 );
44+ crsf .TLMGPSsensor .alt = (UARTinBuffer [15 ] << 8 ) + (UARTinBuffer [16 ] << 0 );
45+ crsf .TLMGPSsensor .sats = (UARTinBuffer [17 ]);
46+ }
47+
48+ }
49+
50+ void RX_UARTinHandle ()
51+ {
52+ while (Serial .available ())
53+ {
54+ UARTinLastDataTime = millis ();
55+ char inChar = Serial .read ();
56+
57+ if (UARTframeActive == false)
58+ {
59+ // stage 1 wait for sync byte //
60+ if (inChar == CRSF_ADDRESS_CRSF_TRANSMITTER || inChar == CRSF_SYNC_BYTE ) // we got sync, reset write pointer
61+ {
62+ UARTinPacketPtr = 0 ;
63+ UARTinPacketLen = 0 ;
64+ UARTframeActive = true;
65+ UARTinBuffer [UARTinPacketPtr ] = inChar ;
66+ UARTinPacketPtr ++ ;
67+ }
68+ }
69+ else // frame is active so we do the processing
70+ {
71+ // first if things have gone wrong //
72+ if (UARTinPacketPtr > CRSF_MAX_PACKET_LEN - 1 ) // we reached the maximum allowable packet length, so start again because shit fucked up hey.
73+ {
74+ UARTinPacketPtr = 0 ;
75+ UARTframeActive = false;
76+ return ;
77+ }
78+
79+ // special case where we save the expected pkt len to buffer //
80+ if (UARTinPacketPtr == 1 )
81+ {
82+ if (inChar <= CRSF_MAX_PACKET_LEN )
83+ {
84+ UARTinPacketLen = inChar ;
85+ }
86+ else
87+ {
88+ UARTinPacketPtr = 0 ;
89+ UARTinPacketLen = 0 ;
90+ UARTframeActive = false;
91+ return ;
92+ }
93+ }
94+
95+ UARTinBuffer [UARTinPacketPtr ] = inChar ;
96+ UARTinPacketPtr ++ ;
97+
98+ if (UARTinPacketPtr == UARTinPacketLen + 2 ) // plus 2 because the packlen is referenced from the start of the 'type' flag, IE there are an extra 2 bytes.
99+ {
100+ char CalculatedCRC = CalcCRC ((uint8_t * )UARTinBuffer + 2 , UARTinPacketPtr - 3 );
101+
102+ if (CalculatedCRC == inChar )
103+ {
104+ UARTinLastPacketTime = millis ();
105+ RX_UARTinProcessPacket ();
106+ UARTinPacketPtr = 0 ;
107+ UARTframeActive = false;
108+ }
109+ else
110+ {
111+ UARTframeActive = false;
112+ UARTinPacketPtr = 0 ;
113+ Serial .println ("UART in CRC failure" );
114+ while (Serial .available ())
115+ {
116+ Serial .read (); // empty the read buffer
117+ }
118+ }
119+ }
120+ }
121+ }
122+ }
0 commit comments