24#include <driver/rmt_tx.h>
25#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>
36#include <magic_enum/magic_enum.hpp>
39#include <ztl/enum.hpp>
40#include <ztl/implicit_wrapper.hpp>
41#include <ztl/limits.hpp>
43#if CONFIG_IDF_TARGET_ESP32S3
44# include <driver/gptimer.h>
45# include <hal/adc_types.h>
46#elif CONFIG_IDF_TARGET_LINUX
47# define ADC_CHANNEL_1 1
48# define ADC_CHANNEL_2 2
49# define ADC_CHANNEL_3 3
50# define ADC_CHANNEL_4 4
51# define ADC_CHANNEL_5 5
52# define ADC_CHANNEL_6 6
53# define ADC_CHANNEL_7 7
54# define ADC_CHANNEL_8 8
55# define ADC_CHANNEL_9 9
56# define ADC_ATTEN_DB_0 0
57# define ADC_ATTEN_DB_2_5 1
58# define ADC_ATTEN_DB_6 2
59# define ADC_ATTEN_DB_11 3
60# define SOC_ADC_PATT_LEN_MAX 24
61# define SOC_ADC_DIGI_MAX_BITWIDTH 12
62# define SOC_ADC_DIGI_DATA_BYTES_PER_CONV 4
63# define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333
64# define GPIO_NUM_1 static_cast<gpio_num_t>(1)
65# define GPIO_NUM_2 static_cast<gpio_num_t>(2)
66# define GPIO_NUM_3 static_cast<gpio_num_t>(3)
67# define GPIO_NUM_4 static_cast<gpio_num_t>(4)
68# define GPIO_NUM_5 static_cast<gpio_num_t>(5)
69# define GPIO_NUM_6 static_cast<gpio_num_t>(6)
70# define GPIO_NUM_7 static_cast<gpio_num_t>(7)
71# define GPIO_NUM_8 static_cast<gpio_num_t>(8)
72# define GPIO_NUM_9 static_cast<gpio_num_t>(9)
73# define GPIO_NUM_10 static_cast<gpio_num_t>(10)
74# define GPIO_NUM_11 static_cast<gpio_num_t>(11)
75# define GPIO_NUM_12 static_cast<gpio_num_t>(12)
76# define GPIO_NUM_13 static_cast<gpio_num_t>(13)
77# define GPIO_NUM_14 static_cast<gpio_num_t>(14)
78# define GPIO_NUM_15 static_cast<gpio_num_t>(15)
79# define GPIO_NUM_16 static_cast<gpio_num_t>(16)
80# define GPIO_NUM_17 static_cast<gpio_num_t>(17)
81# define GPIO_NUM_18 static_cast<gpio_num_t>(18)
82# define GPIO_NUM_19 static_cast<gpio_num_t>(19)
83# define GPIO_NUM_20 static_cast<gpio_num_t>(20)
84# define GPIO_NUM_21 static_cast<gpio_num_t>(21)
85# define GPIO_NUM_22 static_cast<gpio_num_t>(22)
86# define GPIO_NUM_23 static_cast<gpio_num_t>(23)
87# define GPIO_NUM_24 static_cast<gpio_num_t>(24)
88# define GPIO_NUM_25 static_cast<gpio_num_t>(25)
89# define GPIO_NUM_26 static_cast<gpio_num_t>(26)
90# define GPIO_NUM_27 static_cast<gpio_num_t>(27)
91# define GPIO_NUM_28 static_cast<gpio_num_t>(28)
92# define GPIO_NUM_29 static_cast<gpio_num_t>(29)
93# define GPIO_NUM_30 static_cast<gpio_num_t>(30)
94# define GPIO_NUM_31 static_cast<gpio_num_t>(31)
95# define GPIO_NUM_32 static_cast<gpio_num_t>(32)
96# define GPIO_NUM_33 static_cast<gpio_num_t>(33)
97# define GPIO_NUM_34 static_cast<gpio_num_t>(34)
98# define GPIO_NUM_35 static_cast<gpio_num_t>(35)
99# define GPIO_NUM_36 static_cast<gpio_num_t>(36)
100# define GPIO_NUM_37 static_cast<gpio_num_t>(37)
101# define GPIO_NUM_38 static_cast<gpio_num_t>(38)
102# define GPIO_NUM_39 static_cast<gpio_num_t>(39)
103# define GPIO_NUM_40 static_cast<gpio_num_t>(40)
104# define GPIO_NUM_41 static_cast<gpio_num_t>(41)
105# define GPIO_NUM_42 static_cast<gpio_num_t>(42)
106# define GPIO_NUM_43 static_cast<gpio_num_t>(43)
107# define GPIO_NUM_44 static_cast<gpio_num_t>(44)
108# define GPIO_NUM_45 static_cast<gpio_num_t>(45)
109# define GPIO_NUM_46 static_cast<gpio_num_t>(46)
110# define GPIO_NUM_47 static_cast<gpio_num_t>(47)
111# define GPIO_NUM_48 static_cast<gpio_num_t>(48)
113# error "Unsupported SOC"
128static_assert(configTASK_NOTIFICATION_ARRAY_ENTRIES > 1);
150 ZUSI = 7u << CHAR_BIT,
159 OTA = 12u << CHAR_BIT,
161static_assert(std::to_underlying(
State::OTA) < MAGIC_ENUM_RANGE_MAX);
163ZTL_MAKE_ENUM_CLASS_FLAGS(
State)
184inline constexpr auto vref{1000};
207 SOC_ADC_DIGI_DATA_BYTES_PER_CONV};
210static_assert(size(
channels) < SOC_ADC_PATT_LEN_MAX);
214 static constexpr auto name{
"analog::adc"};
216 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 2u};
223 static constexpr auto name{
"analog::temp"};
225 static constexpr UBaseType_t
priority{tskIDLE_PRIORITY};
230 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
231 struct VoltageMeasurementTag>;
234 ztl::implicit_wrapper<VoltageMeasurement::value_type, struct VoltageTag>;
237 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
238 struct CurrentMeasurementTag>;
241 ztl::implicit_wrapper<CurrentMeasurement::value_type, struct CurrentTag>;
246 std::array<VoltageMeasurement, conversion_frame_samples_per_channel>;
247 static constexpr auto size{1uz};
254 std::array<CurrentMeasurement, conversion_frame_samples_per_channel>;
255 static constexpr auto size{1uz};
262 static constexpr auto size{1uz};
277 static constexpr auto name{
"dcc"};
290 static constexpr auto name{
"decup"};
320 static constexpr auto name{
"mdu"};
331inline constexpr uint8_t
ack{0x06u};
334inline constexpr uint8_t
nak{0x15u};
338 static constexpr auto name{
"ota"};
340 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 1u};
350 static constexpr auto name{
"zusi"};
360#if !CONFIG_IDF_TARGET_LINUX
366 static constexpr auto size{320uz};
372 static constexpr auto size{320uz};
405 static constexpr auto size{32uz};
419 static constexpr auto name{
"out::track::dcc"};
421 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 1u};
431 static constexpr auto name{
"out::track::decup"};
433 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 1u};
444 static constexpr auto name{
"out::track::mdu"};
446 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 1u};
462 static constexpr auto name{
"out::zusi"};
464 static constexpr UBaseType_t
priority{ESP_TASK_PRIO_MAX - 1u};
474inline constexpr uint16_t
port{21105u};
481inline bool volatile rts{};
487 static constexpr auto name{
"usb::rx"};
496 static constexpr auto name{
"usb::tx"};
515namespace ulf_dcc_ein {
519 static constexpr auto name{
"usb::ulf_dcc_ein"};
528namespace ulf_decup_ein {
532 static constexpr auto name{
"usb::ulf_decup_ein"};
541namespace ulf_susiv2 {
545 static constexpr auto name{
"usb::ulf_susiv2"};
561inline std::array<uint8_t, 6uz>
mac;
562inline std::string
mac_str(2uz * 6uz + 5uz +
sizeof(
'\n'),
'\0');
571 static constexpr auto name{
"wifi"};
573 static constexpr UBaseType_t
priority{tskIDLE_PRIORITY};
583 static constexpr auto name{
"z21"};
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:166
constexpr auto boot_gpio_num
BOOT pin used to boot into bootloader or resetting WiFi station settings.
Definition config.hpp:131
constexpr auto bug_led_gpio_num
Bug LED pin used to indicate errors or updates.
Definition config.hpp:134
State
System state.
Definition config.hpp:137
@ DECUPZpp
DECUP ZPP update.
@ DCCOperations
DCC operation mode.
@ ShortCircuit
Short circuit.
@ DECUPZsu
DECUP ZSU update.
@ Suspend
About to be idle.
@ DCCService
DCC service mode.
constexpr auto default_notify_index
Default task notification index.
Definition config.hpp:127
Definition adc_task_function.cpp:30
constexpr auto conversion_frame_samples
Number of samples per frame.
Definition config.hpp:199
constexpr auto conversion_frame_time
Time per frame [ms].
Definition config.hpp:202
constexpr auto voltage_upper_r
Voltage divider upper resistor for voltage measurement.
Definition config.hpp:173
constexpr std::array channels
Definition config.hpp:190
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct CurrentMeasurementTag > CurrentMeasurement
Definition config.hpp:236
constexpr auto max_measurement
Definition config.hpp:185
struct analog::VoltagesQueue voltages_queue
constexpr auto voltage_channel
Definition config.hpp:187
constexpr auto current_r
Current sense resistor.
Definition config.hpp:179
ztl::implicit_wrapper< CurrentMeasurement::value_type, struct CurrentTag > Current
Definition config.hpp:240
constexpr auto voltage_lower_r
Voltage divider lower resistor for voltage measurement.
Definition config.hpp:176
constexpr auto attenuation
Definition config.hpp:189
constexpr auto sample_freq_hz
Sample frequency [Hz] (sample takes 125µs, conversion frame 20ms)
Definition config.hpp:196
ztl::implicit_wrapper< VoltageMeasurement::value_type, struct VoltageTag > Voltage
Definition config.hpp:233
constexpr auto conversion_frame_size
Definition config.hpp:206
struct analog::TemperatureQueue temperature_queue
constexpr auto current_channel
Definition config.hpp:188
constexpr auto vref
Definition config.hpp:184
struct analog::AdcTask adc_task
constexpr auto conversion_frame_samples_per_channel
Definition config.hpp:208
constexpr auto ol_on_gpio_num
Definition config.hpp:170
struct analog::TempTask temp_task
constexpr auto current_k
Current sense ratio.
Definition config.hpp:182
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct VoltageMeasurementTag > VoltageMeasurement
Definition config.hpp:229
struct analog::CurrentsQueue currents_queue
Definition config.hpp:268
constexpr auto priority_bits
Definition config.hpp:270
std::shared_ptr< Service > service
Definition config.hpp:273
Definition config.hpp:286
std::shared_ptr< Server > server
Definition config.hpp:310
Definition config.hpp:299
constexpr auto stack_size
Definition config.hpp:305
httpd_handle_t handle
Handle to server instance.
Definition config.hpp:302
Definition config.hpp:316
Definition config.hpp:328
constexpr uint8_t ack
Definition config.hpp:331
constexpr uint8_t nak
Definition config.hpp:334
struct out::track::dcc::Task task
constexpr auto bidi_rx_gpio_num
Definition config.hpp:414
constexpr auto bidi_en_gpio_num
Definition config.hpp:415
struct out::track::decup::Task task
struct out::track::mdu::Task task
constexpr auto ack_gpio_num
Definition config.hpp:392
constexpr auto n_force_low_gpio_num
Definition config.hpp:390
constexpr auto nsleep_gpio_num
Definition config.hpp:393
CurrentLimit
Definition config.hpp:379
struct out::track::RxQueue rx_queue
constexpr auto ilim0_gpio_num
Definition config.hpp:394
constexpr auto trans_queue_depth
Continuous transmission requires at least a depth of 2.
Definition config.hpp:387
constexpr auto enable_gpio_num
Definition config.hpp:397
rmt_channel_handle_t channel
Definition config.hpp:409
constexpr auto nfault_gpio_num
Definition config.hpp:396
rmt_encoder_handle_t encoder
Definition config.hpp:410
constexpr auto p_gpio_num
Definition config.hpp:389
constexpr auto ilim1_gpio_num
Definition config.hpp:395
struct out::zusi::Task task
constexpr auto enable_gpio_num
Definition config.hpp:456
constexpr auto clock_gpio_num
Definition config.hpp:457
constexpr auto data_gpio_num
Definition config.hpp:458
Definition config.hpp:358
struct out::TxMessageBuffer tx_message_buffer
struct out::RxMessageBuffer rx_message_buffer
gptimer_handle_t gptimer
Definition config.hpp:361
Definition config.hpp:472
int sock_fd
Definition config.hpp:475
constexpr uint16_t port
Definition config.hpp:474
struct usb::ulf_dcc_ein::Task task
struct usb::ulf_decup_ein::Task task
struct usb::ulf_susiv2::Task task
Definition config.hpp:479
struct usb::TxStreamBuffer tx_stream_buffer
constexpr auto buffer_size
Definition config.hpp:483
constexpr auto vbus_gpio_num
Definition config.hpp:482
struct usb::RxStreamBuffer rx_stream_buffer
struct usb::RxTask rx_task
bool volatile rts
Definition config.hpp:481
struct usb::TxTask tx_task
Definition config.hpp:555
std::string mac_str(2uz *6uz+5uz+sizeof('\n'), '\0')
std::string ip_str
Definition config.hpp:560
struct wifi::ApRecordsQueue ap_records_queue
std::string mdns_str
Definition config.hpp:559
constexpr auto led_gpio_num
Definition config.hpp:557
std::array< uint8_t, 6uz > mac
Definition config.hpp:561
Definition config.hpp:579
std::shared_ptr< Service > service
Definition config.hpp:591
Definition config.hpp:346
Definition config.hpp:213
static constexpr UBaseType_t priority
Definition config.hpp:216
static constexpr auto name
Definition config.hpp:214
static constexpr auto timeout
Definition config.hpp:217
static constexpr auto stack_size
Definition config.hpp:215
TaskHandle_t handle
Definition config.hpp:218
Definition config.hpp:252
QueueHandle_t handle
Definition config.hpp:256
static constexpr auto size
Definition config.hpp:255
std::array< CurrentMeasurement, conversion_frame_samples_per_channel > value_type
Definition config.hpp:253
Definition config.hpp:222
static constexpr auto name
Definition config.hpp:223
static constexpr UBaseType_t priority
Definition config.hpp:225
static constexpr auto stack_size
Definition config.hpp:224
TaskHandle_t handle
Definition config.hpp:226
Definition config.hpp:260
QueueHandle_t handle
Definition config.hpp:263
static constexpr auto size
Definition config.hpp:262
float value_type
Definition config.hpp:261
Definition config.hpp:244
QueueHandle_t handle
Definition config.hpp:248
std::array< VoltageMeasurement, conversion_frame_samples_per_channel > value_type
Definition config.hpp:245
static constexpr auto size
Definition config.hpp:247
Definition config.hpp:276
static constexpr auto name
Definition config.hpp:277
static constexpr UBaseType_t priority
Definition config.hpp:279
TaskHandle_t handle
Definition config.hpp:281
static constexpr auto stack_size
Definition config.hpp:278
static constexpr auto timeout
Definition config.hpp:280
Definition config.hpp:289
TaskHandle_t handle
Definition config.hpp:294
static constexpr auto stack_size
Definition config.hpp:291
static constexpr UBaseType_t priority
Definition config.hpp:292
static constexpr auto timeout
Definition config.hpp:293
static constexpr auto name
Definition config.hpp:290
Definition config.hpp:319
static constexpr auto name
Definition config.hpp:320
static constexpr UBaseType_t priority
Definition config.hpp:322
TaskHandle_t handle
Definition config.hpp:323
static constexpr auto stack_size
Definition config.hpp:321
Definition config.hpp:337
static constexpr auto stack_size
Definition config.hpp:339
static constexpr auto name
Definition config.hpp:338
TaskHandle_t handle
Definition config.hpp:341
static constexpr UBaseType_t priority
Definition config.hpp:340
Definition config.hpp:365
static constexpr auto size
Definition config.hpp:366
MessageBufferHandle_t handle
Definition config.hpp:367
Definition config.hpp:371
MessageBufferHandle_t front_handle
Definition config.hpp:373
MessageBufferHandle_t back_handle
Definition config.hpp:374
static constexpr auto size
Definition config.hpp:372
Definition config.hpp:401
dcc::bidi::Datagram datagram
Definition config.hpp:403
dcc::Packet packet
Definition config.hpp:402
Definition config.hpp:400
static constexpr auto size
Definition config.hpp:405
QueueHandle_t handle
Definition config.hpp:406
Definition config.hpp:418
TaskHandle_t handle
Definition config.hpp:422
static constexpr UBaseType_t priority
Definition config.hpp:421
static constexpr auto name
Definition config.hpp:419
static constexpr auto stack_size
Definition config.hpp:420
Definition config.hpp:430
static constexpr auto stack_size
Definition config.hpp:432
static constexpr auto timeout
Definition config.hpp:434
static constexpr UBaseType_t priority
Definition config.hpp:433
static constexpr auto name
Definition config.hpp:431
TaskHandle_t handle
Definition config.hpp:435
Definition config.hpp:443
static constexpr auto stack_size
Definition config.hpp:445
static constexpr auto name
Definition config.hpp:444
TaskHandle_t handle
Definition config.hpp:447
static constexpr UBaseType_t priority
Definition config.hpp:446
Definition config.hpp:461
static constexpr auto stack_size
Definition config.hpp:463
static constexpr UBaseType_t priority
Definition config.hpp:464
TaskHandle_t handle
Definition config.hpp:465
static constexpr auto name
Definition config.hpp:462
Definition config.hpp:504
static constexpr auto size
Definition config.hpp:505
StreamBufferHandle_t handle
Definition config.hpp:506
Definition config.hpp:486
static constexpr auto timeout
Definition config.hpp:490
TaskHandle_t handle
Definition config.hpp:491
static constexpr auto name
Definition config.hpp:487
static constexpr auto stack_size
Definition config.hpp:488
static constexpr UBaseType_t priority
Definition config.hpp:489
Definition config.hpp:510
static constexpr auto size
Definition config.hpp:511
StreamBufferHandle_t handle
Definition config.hpp:512
Definition config.hpp:495
TaskHandle_t handle
Definition config.hpp:500
static constexpr auto name
Definition config.hpp:496
static constexpr UBaseType_t priority
Definition config.hpp:498
static constexpr auto timeout
Definition config.hpp:499
static constexpr auto stack_size
Definition config.hpp:497
Definition config.hpp:518
static constexpr auto timeout
Definition config.hpp:522
static constexpr auto name
Definition config.hpp:519
static constexpr UBaseType_t priority
Definition config.hpp:521
TaskHandle_t handle
Definition config.hpp:523
static constexpr auto stack_size
Definition config.hpp:520
Definition config.hpp:531
TaskHandle_t handle
Definition config.hpp:536
static constexpr auto stack_size
Definition config.hpp:533
static constexpr auto name
Definition config.hpp:532
static constexpr auto timeout
Definition config.hpp:535
static constexpr UBaseType_t priority
Definition config.hpp:534
Definition config.hpp:544
static constexpr auto stack_size
Definition config.hpp:546
static constexpr UBaseType_t priority
Definition config.hpp:547
static constexpr auto name
Definition config.hpp:545
TaskHandle_t handle
Definition config.hpp:548
Definition config.hpp:565
QueueHandle_t handle
Definition config.hpp:566
Definition config.hpp:570
static constexpr auto stack_size
Definition config.hpp:572
TaskHandle_t handle
Definition config.hpp:574
static constexpr UBaseType_t priority
Definition config.hpp:573
static constexpr auto name
Definition config.hpp:571
Definition config.hpp:582
static constexpr UBaseType_t priority
Definition config.hpp:585
static constexpr auto timeout
Definition config.hpp:586
TaskHandle_t handle
Definition config.hpp:587
static constexpr auto stack_size
Definition config.hpp:584
static constexpr auto name
Definition config.hpp:583
Definition config.hpp:349
TaskHandle_t handle
Definition config.hpp:353
static constexpr UBaseType_t priority
Definition config.hpp:352
static constexpr auto stack_size
Definition config.hpp:351
static constexpr auto name
Definition config.hpp:350