26 #include "xcp_config.h" 28 #if XCP_TRANSPORT_LAYER == XCP_ON_SXI 36 #include "xcp_tl_timeout.h" 40 #define XCP_SXI_MAKEWORD(buf, offs) \ 41 ((*((buf) + (offs))) | ((*((buf) + (offs) + 1) << 8))) 43 #define TIMEOUT_VALUE (100) 45 typedef enum tagXcpTl_ReceiverStateType {
49 } XcpTl_ReceiverStateType;
52 uint8_t Buffer[XCP_COMM_BUFLEN];
53 XcpTl_ReceiverStateType State;
62 static void XcpTl_ResetSM(
void);
64 static void XcpTl_SignalTimeout(
void);
66 void XcpTl_Init(
void) {
69 XcpTl_TimeoutInit(TIMEOUT_VALUE, XcpTl_ResetSM);
72 void XcpTl_DeInit(
void) {}
74 void XcpTl_MainFunction(
void) {
77 if (Serial.available()) {
78 digitalWrite(LED_BUILTIN, HIGH);
79 octet = Serial.read();
80 XcpTl_FeedReceiver(octet);
82 digitalWrite(LED_BUILTIN, LOW);
95 static void XcpTl_ResetSM(
void) {
96 XcpTl_Receiver.State = XCP_RCV_IDLE;
97 XcpTl_Receiver.Index = 0u;
98 XcpTl_Receiver.Dlc = 0u;
99 XcpTl_Receiver.Ctr = 0u;
100 XcpTl_Receiver.Remaining = 0u;
103 void XcpTl_RxHandler(
void) {}
105 void XcpTl_FeedReceiver(uint8_t octet) {
106 XCP_TL_ENTER_CRITICAL();
108 XcpTl_Receiver.Buffer[XcpTl_Receiver.Index] = octet;
110 if (XcpTl_Receiver.State == XCP_RCV_IDLE) {
111 XcpTl_Receiver.State = XCP_RCV_UNTIL_LENGTH;
112 XcpTl_TimeoutStart();
113 }
else if (XcpTl_Receiver.State == XCP_RCV_UNTIL_LENGTH) {
114 if (XcpTl_Receiver.Index == 0x01) {
115 XcpTl_Receiver.Dlc = XCP_SXI_MAKEWORD(XcpTl_Receiver.Buffer, 0x00);
116 XcpTl_Receiver.State = XCP_RCV_REMAINING;
117 XcpTl_Receiver.Remaining = XcpTl_Receiver.Dlc + 2;
118 XcpTl_TimeoutReset();
120 }
else if (XcpTl_Receiver.State == XCP_RCV_REMAINING) {
121 if (XcpTl_Receiver.Index == 0x03) {
122 XcpTl_Receiver.Ctr = XCP_SXI_MAKEWORD(XcpTl_Receiver.Buffer, 0x02);
124 XcpTl_TimeoutReset();
125 XcpTl_Receiver.Remaining--;
126 if (XcpTl_Receiver.Remaining == 0u) {
129 Xcp_CtoIn.len = XcpTl_Receiver.Dlc;
130 Xcp_CtoIn.data = XcpTl_Receiver.Buffer + 4;
131 Xcp_DispatchCommand(&Xcp_CtoIn);
134 if (XcpTl_Receiver.State != XCP_RCV_IDLE) {
135 XcpTl_Receiver.Index++;
137 XCP_TL_LEAVE_CRITICAL();
140 void XcpTl_Send(uint8_t
const *buf, uint16_t len) {
141 XCP_TL_ENTER_CRITICAL();
143 Serial.write(buf, len);
146 XCP_TL_LEAVE_CRITICAL();
149 void XcpTl_SaveConnection(
void) {}
151 void XcpTl_ReleaseConnection(
void) {}
153 void XcpTl_PrintConnectionInformation(
void) {
154 printf(
"\nXCPonSxi\n" 161 static void XcpTl_SignalTimeout(
void) {
162 XCP_TL_ENTER_CRITICAL();
164 XCP_TL_LEAVE_CRITICAL();
168 void serialEventRun(
void)
170 if (Serial.available()) {
177 digitalWrite(LED_BUILTIN, HIGH);
179 digitalWrite(LED_BUILTIN, LOW);