11#if DETWS_ENABLE_BUS_CAPTURE
13size_t can_to_socketcan(
const CanFrame *f, uint8_t *out,
size_t cap)
15 if (!f || !out || cap < DET_SOCKETCAN_FRAME_LEN)
20 id |= DET_CAN_EFF_FLAG;
22 id |= DET_CAN_RTR_FLAG;
24 out[0] = (uint8_t)(
id >> 24);
25 out[1] = (uint8_t)(
id >> 16);
26 out[2] = (uint8_t)(
id >> 8);
35 out[8 + i] = (i < dlc && !f->rtr) ? f->
data[i] : 0;
36 return DET_SOCKETCAN_FRAME_LEN;
42#include "driver/twai.h"
50 bus_capture_sink_fn sink =
nullptr;
55bool timing_for(uint32_t bitrate, twai_timing_config_t *t)
60 twai_timing_config_t c = TWAI_TIMING_CONFIG_1MBITS();
65 twai_timing_config_t c = TWAI_TIMING_CONFIG_500KBITS();
70 twai_timing_config_t c = TWAI_TIMING_CONFIG_250KBITS();
75 twai_timing_config_t c = TWAI_TIMING_CONFIG_125KBITS();
85bool bus_capture_begin(
int tx_pin,
int rx_pin, uint32_t bitrate, bus_capture_sink_fn sink)
89 twai_timing_config_t timing;
90 if (!timing_for(bitrate, &timing))
92 twai_general_config_t gen =
93 TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)tx_pin, (gpio_num_t)rx_pin, TWAI_MODE_LISTEN_ONLY);
94 twai_filter_config_t filt = TWAI_FILTER_CONFIG_ACCEPT_ALL();
95 if (twai_driver_install(&gen, &timing, &filt) != ESP_OK)
97 if (twai_start() != ESP_OK)
99 twai_driver_uninstall();
103 s_bus.running =
true;
107void bus_capture_poll(
void)
109 if (!s_bus.running || !s_bus.sink)
112 while (twai_receive(&m, 0) == ESP_OK)
120 f.
data[i] = (i < f.
dlc) ? m.data[i] : 0;
125void bus_capture_end(
void)
130 twai_driver_uninstall();
131 s_bus.running =
false;
132 s_bus.sink =
nullptr;
137bool bus_capture_begin(
int,
int, uint32_t, bus_capture_sink_fn)
141void bus_capture_poll(
void)
145void bus_capture_end(
void)
Wired field-bus listen-only capture (DETWS_ENABLE_BUS_CAPTURE) - passive CAN sniffing.
#define DET_CAN_STD_ID_MASK
11-bit standard identifier.
#define DET_CAN_MAX_DLC
classic CAN carries at most 8 data octets.
#define DET_CAN_EXT_ID_MASK
29-bit extended identifier.
uint8_t data[DET_CAN_MAX_DLC]