2121#include "driver/can.h"
2222#include "driver/gpio.h"
2323
24+ #include "../lib/isotp/isotp.h"
25+ #include "../lib/isotp/isotp_defines.h"
26+
27+ static const char * TAG = "can" ;
28+
2429bool update_bms_received = false;
2530bool update_mppt_received = false;
2631
2732#if CONFIG_THINGSET_CAN
2833
34+ #define ISOTP_BUFSIZE 512
35+
36+ /* Alloc IsoTpLink statically in RAM */
37+ static IsoTpLink isotp_link ;
38+
39+ /* Alloc send and receive buffer statically in RAM */
40+ static uint8_t isotp_recv_buf [ISOTP_BUFSIZE ];
41+ static uint8_t isotp_send_buf [ISOTP_BUFSIZE ];
42+
43+ uint32_t can_addr_client = 0xF1 ; // this device
44+ uint32_t can_addr_server = 0x14 ; // select MPPT or BMS
45+
2946// buffer for JSON string generated from received data objects via CAN
3047static char json_buf [500 ];
3148
@@ -160,7 +177,6 @@ static int generate_json_string(char *buf, size_t len, DataObject *objs, size_t
160177 return pos ;
161178}
162179
163-
164180char * get_mppt_json_data ()
165181{
166182 generate_json_string (json_buf , sizeof (json_buf ),
@@ -184,69 +200,103 @@ void can_setup()
184200 gpio_set_level (CONFIG_GPIO_CAN_STB , 0 );
185201#endif
186202
187- if (can_driver_install (& g_config , & t_config , & f_config ) == ESP_OK ) {
188- printf ("CAN driver installed\n" );
189- }
190- else {
191- printf ("Failed to install CAN driver\n" );
203+ if (can_driver_install (& g_config , & t_config , & f_config ) != ESP_OK ) {
204+ ESP_LOGE (TAG , "Failed to install CAN driver" );
192205 return ;
193206 }
194207
195- if (can_start () == ESP_OK ) {
196- printf ("CAN driver started\n" );
197- }
198- else {
199- printf ("Failed to start CAN driver\n" );
208+ if (can_start () != ESP_OK ) {
209+ ESP_LOGE (TAG , "Failed to start CAN driver" );
200210 return ;
201211 }
212+
213+ /* Initialize link with the CAN ID we send with */
214+ isotp_init_link (& isotp_link , can_addr_server << 8 | can_addr_client | 0x1ada << 16 ,
215+ isotp_send_buf , sizeof (isotp_send_buf ), isotp_recv_buf , sizeof (isotp_recv_buf ));
202216}
203217
204218void can_receive_task (void * arg )
205219{
206220 can_message_t message ;
207- //unsigned int msg_priority; // currently not used
208- unsigned int node_id ;
209- unsigned int data_object_id ;
221+ unsigned int device_addr ;
222+ unsigned int data_node_id ;
223+
224+ uint8_t payload [500 ];
210225
211226 while (1 ) {
212227 if (can_receive (& message , pdMS_TO_TICKS (10000 )) == ESP_OK ) {
213228
214- // ThingSet publication message format: https://thingset.github.io/spec/can
215- //msg_priority = message.identifier >> 26;
216- node_id = message .identifier & 0x000000FF ;
217- data_object_id = (message .identifier >> 8 ) & 0x000000FF ;
218-
219- if (node_id == 0 ) {
220- for (int i = 0 ; i < sizeof (data_obj_bms )/sizeof (DataObject ); i ++ ) {
221- if (data_obj_bms [i ].id == data_object_id ) {
222- memcpy (data_obj_bms [i ].raw_data , message .data , message .data_length_code );
223- data_obj_bms [i ].len = message .data_length_code ;
224- }
229+ /* checking for CAN ID used to receive ISO-TP frames */
230+ if (message .identifier == (can_addr_client << 8 | can_addr_server | 0x1ada << 16 )) {
231+ ESP_LOGI (TAG , "ISO TP msg part received" );
232+ isotp_on_can_message (& isotp_link , message .data , message .data_length_code );
233+
234+ /* process multiple frame transmissions and timeouts */
235+ isotp_poll (& isotp_link );
236+
237+ /* extract received data */
238+ uint16_t out_size ;
239+ int ret = isotp_receive (& isotp_link , payload , sizeof (payload ) - 1 , & out_size );
240+ if (ret == ISOTP_RET_OK ) {
241+ payload [out_size ] = '\0' ;
242+ ESP_LOGI (TAG , "Received %d bytes via ISO-TP: %s" , out_size , payload );
243+ /* now handle received message */
225244 }
226- update_bms_received = true;
227245 }
228- else if (node_id == 10 ) {
229- for (int i = 0 ; i < sizeof (data_obj_mppt )/sizeof (DataObject ); i ++ ) {
230- if (data_obj_mppt [i ].id == data_object_id ) {
231- memcpy (data_obj_mppt [i ].raw_data , message .data , message .data_length_code );
232- data_obj_mppt [i ].len = message .data_length_code ;
246+ else {
247+ // ThingSet publication message format: https://thingset.github.io/spec/can
248+ device_addr = message .identifier & 0x000000FF ;
249+ data_node_id = (message .identifier >> 8 ) & 0x0000FFFF ;
250+
251+ if (device_addr == 0 ) {
252+ for (int i = 0 ; i < sizeof (data_obj_bms )/sizeof (DataObject ); i ++ ) {
253+ if (data_obj_bms [i ].id == data_node_id ) {
254+ memcpy (data_obj_bms [i ].raw_data , message .data , message .data_length_code );
255+ data_obj_bms [i ].len = message .data_length_code ;
256+ }
233257 }
258+ update_bms_received = true;
259+ }
260+ else if (device_addr == 10 ) {
261+ for (int i = 0 ; i < sizeof (data_obj_mppt )/sizeof (DataObject ); i ++ ) {
262+ if (data_obj_mppt [i ].id == data_node_id ) {
263+ memcpy (data_obj_mppt [i ].raw_data , message .data , message .data_length_code );
264+ data_obj_mppt [i ].len = message .data_length_code ;
265+ }
266+ }
267+ update_mppt_received = true;
234268 }
235- update_mppt_received = true;
236- }
237269
238- printf ("CAN msg node %u, data object 0x%.2x = 0x" ,
239- node_id , data_object_id );
240- if (!( message .flags & CAN_MSG_FLAG_RTR ) ) {
241- for ( int i = 0 ; i < message . data_length_code ; i ++ ) {
242- printf ( "%.2x" , message . data [ i ]);
270+ printf ("CAN device addr %u, data node 0x%.2x = 0x" , device_addr , data_node_id );
271+ if (!( message . flags & CAN_MSG_FLAG_RTR )) {
272+ for ( int i = 0 ; i < message .data_length_code ; i ++ ) {
273+ printf ( "%.2x" , message . data [ i ]);
274+ }
243275 }
276+ printf ("\n" );
244277 }
245- printf ("\n" );
246278 }
247279 }
248280}
249281
282+ void isotp_task (void * arg )
283+ {
284+ //uint8_t ts_request[] = { 0x01, 0x18, 0x70, 0xA0 };
285+ uint8_t ts_request [] = "?output" ;
286+
287+ while (1 ) {
288+
289+ int ret = isotp_send (& isotp_link , ts_request , strlen ((char * )ts_request ));
290+ if (ISOTP_RET_OK == ret ) {
291+ printf ("ISOTP Send OK\n" );
292+ } else {
293+ printf ("ISOTP Send ERROR\n" );
294+ }
295+
296+ vTaskDelay (3000 / portTICK_PERIOD_MS );
297+ }
298+ }
299+
250300#else /* not CONFIG_THINGSET_CAN */
251301
252302char * get_mppt_json_data ()
0 commit comments