24#include <driver/rmt_tx.h>
25#include <driver/spi_master.h>
26#include <esp_http_server.h>
27#include <freertos/message_buffer.h>
28#include <freertos/queue.h>
29#include <freertos/stream_buffer.h>
30#include <hal/gpio_types.h>
31#include <static_math/static_math.h>
35#include <magic_enum/magic_enum.hpp>
39#include <ztl/enum.hpp>
40#include <ztl/implicit_wrapper.hpp>
41#include <ztl/limits.hpp>
42#include <ztl/string.hpp>
45#if CONFIG_IDF_TARGET_ESP32S3
46# include <driver/gptimer.h>
47# include <driver/ledc.h>
49# include <hal/adc_types.h>
50#elif CONFIG_IDF_TARGET_LINUX
52# define PRO_CPU_NUM APP_CPU_NUM
53# define WIFI_TASK_CORE_ID APP_CPU_NUM
54# define ADC_CHANNEL_1 1
55# define ADC_CHANNEL_2 2
56# define ADC_CHANNEL_3 3
57# define ADC_CHANNEL_4 4
58# define ADC_CHANNEL_5 5
59# define ADC_CHANNEL_6 6
60# define ADC_CHANNEL_7 7
61# define ADC_CHANNEL_8 8
62# define ADC_CHANNEL_9 9
63# define ADC_ATTEN_DB_0 0
64# define ADC_ATTEN_DB_2_5 1
65# define ADC_ATTEN_DB_6 2
66# define ADC_ATTEN_DB_11 3
67# define LEDC_CHANNEL_0 0
68# define LEDC_CHANNEL_1 1
69# define LEDC_CHANNEL_2 2
70# define LEDC_CHANNEL_3 3
71# define LEDC_CHANNEL_4 4
72# define LEDC_CHANNEL_5 5
73# define LEDC_CHANNEL_6 6
74# define LEDC_CHANNEL_7 7
75# define SOC_ADC_PATT_LEN_MAX 24
76# define SOC_ADC_DIGI_MAX_BITWIDTH 12
77# define SOC_ADC_DIGI_DATA_BYTES_PER_CONV 4
78# define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333
79# define GPIO_NUM_1 static_cast<gpio_num_t>(1)
80# define GPIO_NUM_2 static_cast<gpio_num_t>(2)
81# define GPIO_NUM_3 static_cast<gpio_num_t>(3)
82# define GPIO_NUM_4 static_cast<gpio_num_t>(4)
83# define GPIO_NUM_5 static_cast<gpio_num_t>(5)
84# define GPIO_NUM_6 static_cast<gpio_num_t>(6)
85# define GPIO_NUM_7 static_cast<gpio_num_t>(7)
86# define GPIO_NUM_8 static_cast<gpio_num_t>(8)
87# define GPIO_NUM_9 static_cast<gpio_num_t>(9)
88# define GPIO_NUM_10 static_cast<gpio_num_t>(10)
89# define GPIO_NUM_11 static_cast<gpio_num_t>(11)
90# define GPIO_NUM_12 static_cast<gpio_num_t>(12)
91# define GPIO_NUM_13 static_cast<gpio_num_t>(13)
92# define GPIO_NUM_14 static_cast<gpio_num_t>(14)
93# define GPIO_NUM_15 static_cast<gpio_num_t>(15)
94# define GPIO_NUM_16 static_cast<gpio_num_t>(16)
95# define GPIO_NUM_17 static_cast<gpio_num_t>(17)
96# define GPIO_NUM_18 static_cast<gpio_num_t>(18)
97# define GPIO_NUM_19 static_cast<gpio_num_t>(19)
98# define GPIO_NUM_20 static_cast<gpio_num_t>(20)
99# define GPIO_NUM_21 static_cast<gpio_num_t>(21)
100# define GPIO_NUM_22 static_cast<gpio_num_t>(22)
101# define GPIO_NUM_23 static_cast<gpio_num_t>(23)
102# define GPIO_NUM_24 static_cast<gpio_num_t>(24)
103# define GPIO_NUM_25 static_cast<gpio_num_t>(25)
104# define GPIO_NUM_26 static_cast<gpio_num_t>(26)
105# define GPIO_NUM_27 static_cast<gpio_num_t>(27)
106# define GPIO_NUM_28 static_cast<gpio_num_t>(28)
107# define GPIO_NUM_29 static_cast<gpio_num_t>(29)
108# define GPIO_NUM_30 static_cast<gpio_num_t>(30)
109# define GPIO_NUM_31 static_cast<gpio_num_t>(31)
110# define GPIO_NUM_32 static_cast<gpio_num_t>(32)
111# define GPIO_NUM_33 static_cast<gpio_num_t>(33)
112# define GPIO_NUM_34 static_cast<gpio_num_t>(34)
113# define GPIO_NUM_35 static_cast<gpio_num_t>(35)
114# define GPIO_NUM_36 static_cast<gpio_num_t>(36)
115# define GPIO_NUM_37 static_cast<gpio_num_t>(37)
116# define GPIO_NUM_38 static_cast<gpio_num_t>(38)
117# define GPIO_NUM_39 static_cast<gpio_num_t>(39)
118# define GPIO_NUM_40 static_cast<gpio_num_t>(40)
119# define GPIO_NUM_41 static_cast<gpio_num_t>(41)
120# define GPIO_NUM_42 static_cast<gpio_num_t>(42)
121# define GPIO_NUM_43 static_cast<gpio_num_t>(43)
122# define GPIO_NUM_44 static_cast<gpio_num_t>(44)
123# define GPIO_NUM_45 static_cast<gpio_num_t>(45)
124# define GPIO_NUM_46 static_cast<gpio_num_t>(46)
125# define GPIO_NUM_47 static_cast<gpio_num_t>(47)
126# define GPIO_NUM_48 static_cast<gpio_num_t>(48)
128# error "Unsupported SOC"
143static_assert(configTASK_NOTIFICATION_ARRAY_ENTRIES > 1);
173static_assert(std::to_underlying(
State::OTA) < MAGIC_ENUM_RANGE_MAX);
175ZTL_MAKE_ENUM_CLASS_FLAGS(
State)
198inline constexpr auto vref{1000};
221 SOC_ADC_DIGI_DATA_BYTES_PER_CONV};
225static_assert(size(
channels) < SOC_ADC_PATT_LEN_MAX);
231 ESP_TASK_PRIO_MAX - 2u,
244 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
245 struct VoltageMeasurementTag>;
248 ztl::implicit_wrapper<VoltageMeasurement::value_type, struct VoltageTag>;
251 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
252 struct CurrentMeasurementTag>;
255 ztl::implicit_wrapper<CurrentMeasurement::value_type, struct CurrentTag>;
260 std::array<VoltageMeasurement, conversion_frame_samples_per_channel>;
261 static constexpr auto size{1uz};
268 std::array<CurrentMeasurement, conversion_frame_samples_per_channel>;
269 static constexpr auto size{1uz};
276 static constexpr auto size{1uz};
301inline std::array<StackType_t, 4096uz>
stack{};
303#if !CONFIG_IDF_TARGET_LINUX
309 static constexpr auto size{320uz};
310 static inline MessageBufferHandle_t
handle{};
315 static constexpr auto size{320uz};
322inline std::array<spi_device_handle_t, 4uz>
spis{};
332 "drv::out::susi::zimo::zusi",
333 ESP_TASK_PRIO_MAX - 1u,
369 static constexpr auto size{32uz};
383 "drv::out::track::dcc",
384 ESP_TASK_PRIO_MAX - 1u,
396 "drv::out::track::zimo::decup",
397 ESP_TASK_PRIO_MAX - 1u,
407 "drv::out::track::zimo::mdu",
408 ESP_TASK_PRIO_MAX - 1u,
422#if CONFIG_IDF_TARGET_ESP32S3
423inline std::vector<wifi_ap_record_t> ap_records;
426inline std::array<uint8_t, 6uz>
mac;
427inline std::string
mac_str(2uz * 6uz + 5uz +
sizeof(
'\n'),
'\0');
468inline constexpr uint16_t
port{21105u};
475inline bool volatile rts{};
533inline constexpr uint8_t
ack{0x06u};
536inline constexpr uint8_t
nak{0x15u};
542 ESP_TASK_PRIO_MAX - 1u,
573 drv::out::track::zimo::decup::task.timeout);
591inline std::array<StackType_t, 3072uz>
stack{};
597 "mw::zimo::ulf::dcc_ein",
598 intf::usb::rx_task.priority - 1u,
608 "mw::zimo::ulf::decup_ein",
609 intf::usb::rx_task.priority - 1u,
611 drv::out::track::zimo::decup::task.timeout);
619 "mw::zimo::ulf::susiv2",
620 intf::usb::rx_task.priority - 1u,
627static_assert(dcc_ein::task.priority < intf::usb::rx_task.priority);
628static_assert(decup_ein::task.priority < intf::usb::rx_task.priority);
629static_assert(susiv2::task.priority < intf::usb::rx_task.priority);
Definition service.hpp:31
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:178
constexpr auto boot_gpio_num
BOOT pin used to boot into bootloader or resetting WiFi station settings.
Definition config.hpp:146
State
System state.
Definition config.hpp:149
@ MDUZpp
MDU ZPP update.
Definition config.hpp:160
@ DECUPZpp
DECUP ZPP update.
Definition config.hpp:158
@ DCCOperations
DCC operation mode.
Definition config.hpp:156
@ ShortCircuit
Short circuit.
Definition config.hpp:153
@ OTA
OTA update.
Definition config.hpp:171
@ ULF_DCC_EIN
ULF_DCC_EIN USB mode.
Definition config.hpp:165
@ DECUPZsu
DECUP ZSU update.
Definition config.hpp:159
@ Suspending
About to be idle.
Definition config.hpp:152
@ MDUZsu
MDU ZSU update.
Definition config.hpp:161
@ ULF_SUSIV2
ULF_SUSIV2 USB mode.
Definition config.hpp:168
@ Suspended
Idle.
Definition config.hpp:151
@ ULF_MDU_EIN
ULF_MDU_EIN USB mode.
Definition config.hpp:167
@ ZUSI
ZUSI mode.
Definition config.hpp:162
@ ULF_DECUP_EIN
ULF_DECUP_EIN USB mode.
Definition config.hpp:166
@ DCCService
DCC service mode.
Definition config.hpp:157
constexpr auto default_notify_index
Default task notification index.
Definition config.hpp:142
Definition config.hpp:182
constexpr auto conversion_frame_size
Definition config.hpp:220
constexpr auto max_measurement
Definition config.hpp:199
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct VoltageMeasurementTag > VoltageMeasurement
Definition config.hpp:243
struct drv::analog::TemperatureQueue temperature_queue
constexpr auto conversion_frame_samples_per_channel
Definition config.hpp:223
struct drv::analog::VoltagesQueue voltages_queue
constexpr auto ol_on_gpio_num
Definition config.hpp:184
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct CurrentMeasurementTag > CurrentMeasurement
Definition config.hpp:250
constexpr auto current_r
Current sense resistor.
Definition config.hpp:193
constexpr std::array channels
Definition config.hpp:204
constexpr auto attenuation
Definition config.hpp:203
constexpr auto conversion_frame_time
Time per frame [ms].
Definition config.hpp:216
constexpr auto voltage_lower_r
Voltage divider lower resistor for voltage measurement.
Definition config.hpp:190
constexpr auto current_channel
Definition config.hpp:202
constexpr auto current_k
Current sense ratio.
Definition config.hpp:196
struct drv::analog::CurrentsQueue currents_queue
constexpr auto conversion_frame_samples
Number of samples per frame.
Definition config.hpp:213
constexpr auto voltage_channel
Definition config.hpp:201
ztl::implicit_wrapper< CurrentMeasurement::value_type, struct CurrentTag > Current
Definition config.hpp:254
constexpr auto sample_freq_hz
Sample frequency [Hz] (sample takes 12.5us, conversion frame 20ms)
Definition config.hpp:210
constexpr auto voltage_upper_r
Voltage divider upper resistor for voltage measurement.
Definition config.hpp:187
ztl::implicit_wrapper< VoltageMeasurement::value_type, struct VoltageTag > Voltage
Definition config.hpp:247
constexpr auto vref
Definition config.hpp:198
Definition config.hpp:282
constexpr auto bug_gpio_num
Bug LED pin used to indicate errors or updates.
Definition config.hpp:285
constexpr auto wifi_gpio_num
WiFi LED used to indicate WiFi connection status.
Definition config.hpp:291
constexpr auto wifi_channel
WiFi LED channel.
Definition config.hpp:294
constexpr auto bug_channel
Bug LED channel.
Definition config.hpp:288
Definition config.hpp:328
Definition config.hpp:320
constexpr auto enable_gpio_num
Definition config.hpp:324
std::array< spi_device_handle_t, 4uz > spis
Definition config.hpp:322
constexpr auto data_gpio_num
Definition config.hpp:326
constexpr auto clock_gpio_num
Definition config.hpp:325
Definition config.hpp:376
constexpr auto bidi_en_gpio_num
Definition config.hpp:379
constexpr auto bidi_rx_gpio_num
Definition config.hpp:378
Definition config.hpp:392
Definition config.hpp:403
Definition config.hpp:390
Definition config.hpp:341
constexpr auto nsleep_gpio_num
Definition config.hpp:357
constexpr auto ilim1_gpio_num
Definition config.hpp:359
constexpr auto trans_queue_depth
Continuous transmission requires at least a depth of 2.
Definition config.hpp:351
constexpr auto ilim0_gpio_num
Definition config.hpp:358
constexpr auto enable_gpio_num
Definition config.hpp:361
constexpr auto ack_gpio_num
Definition config.hpp:356
rmt_encoder_handle_t encoder
Definition config.hpp:374
constexpr auto n_force_low_gpio_num
Definition config.hpp:354
constexpr auto nfault_gpio_num
Definition config.hpp:360
CurrentLimit
Definition config.hpp:343
@ _4100mA
Definition config.hpp:347
@ _1300mA
Definition config.hpp:345
@ _500mA
Definition config.hpp:344
@ _2700mA
Definition config.hpp:346
rmt_channel_handle_t channel
Definition config.hpp:373
constexpr auto p_gpio_num
Definition config.hpp:353
struct drv::out::track::RxQueue rx_queue
Definition config.hpp:298
struct drv::out::TxMessageBuffer tx_message_buffer
std::array< StackType_t, 4096uz > stack
Definition config.hpp:301
struct drv::out::RxMessageBuffer rx_message_buffer
gptimer_handle_t gptimer
Definition config.hpp:304
Definition config.hpp:420
std::array< uint8_t, 6uz > mac
Definition config.hpp:426
std::string ip_str
Definition config.hpp:425
std::string mac_str(2uz *6uz+5uz+sizeof('\n'), '\0')
Definition config.hpp:180
Definition config.hpp:451
std::shared_ptr< Server > server
Definition config.hpp:454
Definition config.hpp:443
httpd_handle_t handle
Handle to server instance.
Definition config.hpp:446
constexpr auto stack_size
Definition config.hpp:449
Definition config.hpp:460
std::string str
Definition config.hpp:462
Definition config.hpp:466
constexpr uint16_t port
Definition config.hpp:468
int sock_fd
Definition config.hpp:469
Definition config.hpp:473
constexpr auto buffer_size
Definition config.hpp:477
struct intf::usb::RxStreamBuffer rx_stream_buffer
constexpr auto vbus_gpio_num
Definition config.hpp:476
bool volatile rts
Definition config.hpp:475
struct intf::usb::TxStreamBuffer tx_stream_buffer
Definition config.hpp:441
Definition config.hpp:513
constexpr auto priority_bits
Definition config.hpp:515
std::shared_ptr< Service > service
Definition config.hpp:518
Definition config.hpp:530
constexpr uint8_t nak
Definition config.hpp:536
constexpr uint8_t ack
Definition config.hpp:533
Definition config.hpp:548
std::shared_ptr< Service > service
Definition config.hpp:559
Definition config.hpp:565
Definition config.hpp:577
Definition config.hpp:593
Definition config.hpp:604
Definition config.hpp:615
Definition config.hpp:589
std::array< StackType_t, 3072uz > stack
Definition config.hpp:591
Definition config.hpp:633
Definition config.hpp:563
Definition config.hpp:511
Definition config.hpp:266
static QueueHandle_t handle
Definition config.hpp:270
std::array< CurrentMeasurement, conversion_frame_samples_per_channel > value_type
Definition config.hpp:267
static constexpr auto size
Definition config.hpp:269
Definition config.hpp:274
float value_type
Definition config.hpp:275
static constexpr auto size
Definition config.hpp:276
static QueueHandle_t handle
Definition config.hpp:277
Definition config.hpp:258
static constexpr auto size
Definition config.hpp:261
static QueueHandle_t handle
Definition config.hpp:262
std::array< VoltageMeasurement, conversion_frame_samples_per_channel > value_type
Definition config.hpp:259
Definition config.hpp:308
static constexpr auto size
Definition config.hpp:309
static MessageBufferHandle_t handle
Definition config.hpp:310
Definition config.hpp:314
static MessageBufferHandle_t back_handle
Definition config.hpp:317
static constexpr auto size
Definition config.hpp:315
static MessageBufferHandle_t front_handle
Definition config.hpp:316
Definition config.hpp:365
dcc::Packet packet
Definition config.hpp:366
dcc::bidi::Datagram datagram
Definition config.hpp:367
Definition config.hpp:364
static QueueHandle_t handle
Definition config.hpp:370
static constexpr auto size
Definition config.hpp:369
Definition config.hpp:496
StreamBufferHandle_t handle
Definition config.hpp:498
static constexpr auto size
Definition config.hpp:497
Definition config.hpp:502
StreamBufferHandle_t handle
Definition config.hpp:504
static constexpr auto size
Definition config.hpp:503
#define SHARED_TASK(OBJECT, NAME, PRIORITY, CORE_ID, TIMEOUT)
Create shared task.
Definition task.hpp:82
#define TASK(OBJECT, NAME, STACK_SIZE, PRIORITY, CORE_ID, TIMEOUT)
Create task.
Definition task.hpp:69