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>
40#include <ztl/enum.hpp>
41#include <ztl/implicit_wrapper.hpp>
42#include <ztl/limits.hpp>
43#include <ztl/moving_average.hpp>
44#include <ztl/string.hpp>
47#if CONFIG_IDF_TARGET_ESP32S3
48# include <driver/gptimer.h>
49# include <driver/ledc.h>
51# include <hal/adc_types.h>
52#elif CONFIG_IDF_TARGET_LINUX
54# define PRO_CPU_NUM APP_CPU_NUM
55# define WIFI_TASK_CORE_ID APP_CPU_NUM
56# define ADC_CHANNEL_0 0
57# define ADC_CHANNEL_1 1
58# define ADC_CHANNEL_2 2
59# define ADC_CHANNEL_3 3
60# define ADC_CHANNEL_4 4
61# define ADC_CHANNEL_5 5
62# define ADC_CHANNEL_6 6
63# define ADC_CHANNEL_7 7
64# define ADC_CHANNEL_8 8
65# define ADC_CHANNEL_9 9
66# define ADC_ATTEN_DB_0 0
67# define ADC_ATTEN_DB_2_5 1
68# define ADC_ATTEN_DB_6 2
69# define ADC_ATTEN_DB_11 3
70# define LEDC_CHANNEL_0 0
71# define LEDC_CHANNEL_1 1
72# define LEDC_CHANNEL_2 2
73# define LEDC_CHANNEL_3 3
74# define LEDC_CHANNEL_4 4
75# define LEDC_CHANNEL_5 5
76# define LEDC_CHANNEL_6 6
77# define LEDC_CHANNEL_7 7
78# define SOC_ADC_PATT_LEN_MAX 24
79# define SOC_ADC_DIGI_MAX_BITWIDTH 12
80# define SOC_ADC_DIGI_DATA_BYTES_PER_CONV 4
81# define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333
82# define GPIO_NUM_1 static_cast<gpio_num_t>(1)
83# define GPIO_NUM_2 static_cast<gpio_num_t>(2)
84# define GPIO_NUM_3 static_cast<gpio_num_t>(3)
85# define GPIO_NUM_4 static_cast<gpio_num_t>(4)
86# define GPIO_NUM_5 static_cast<gpio_num_t>(5)
87# define GPIO_NUM_6 static_cast<gpio_num_t>(6)
88# define GPIO_NUM_7 static_cast<gpio_num_t>(7)
89# define GPIO_NUM_8 static_cast<gpio_num_t>(8)
90# define GPIO_NUM_9 static_cast<gpio_num_t>(9)
91# define GPIO_NUM_10 static_cast<gpio_num_t>(10)
92# define GPIO_NUM_11 static_cast<gpio_num_t>(11)
93# define GPIO_NUM_12 static_cast<gpio_num_t>(12)
94# define GPIO_NUM_13 static_cast<gpio_num_t>(13)
95# define GPIO_NUM_14 static_cast<gpio_num_t>(14)
96# define GPIO_NUM_15 static_cast<gpio_num_t>(15)
97# define GPIO_NUM_16 static_cast<gpio_num_t>(16)
98# define GPIO_NUM_17 static_cast<gpio_num_t>(17)
99# define GPIO_NUM_18 static_cast<gpio_num_t>(18)
100# define GPIO_NUM_19 static_cast<gpio_num_t>(19)
101# define GPIO_NUM_20 static_cast<gpio_num_t>(20)
102# define GPIO_NUM_21 static_cast<gpio_num_t>(21)
103# define GPIO_NUM_22 static_cast<gpio_num_t>(22)
104# define GPIO_NUM_23 static_cast<gpio_num_t>(23)
105# define GPIO_NUM_24 static_cast<gpio_num_t>(24)
106# define GPIO_NUM_25 static_cast<gpio_num_t>(25)
107# define GPIO_NUM_26 static_cast<gpio_num_t>(26)
108# define GPIO_NUM_27 static_cast<gpio_num_t>(27)
109# define GPIO_NUM_28 static_cast<gpio_num_t>(28)
110# define GPIO_NUM_29 static_cast<gpio_num_t>(29)
111# define GPIO_NUM_30 static_cast<gpio_num_t>(30)
112# define GPIO_NUM_31 static_cast<gpio_num_t>(31)
113# define GPIO_NUM_32 static_cast<gpio_num_t>(32)
114# define GPIO_NUM_33 static_cast<gpio_num_t>(33)
115# define GPIO_NUM_34 static_cast<gpio_num_t>(34)
116# define GPIO_NUM_35 static_cast<gpio_num_t>(35)
117# define GPIO_NUM_36 static_cast<gpio_num_t>(36)
118# define GPIO_NUM_37 static_cast<gpio_num_t>(37)
119# define GPIO_NUM_38 static_cast<gpio_num_t>(38)
120# define GPIO_NUM_39 static_cast<gpio_num_t>(39)
121# define GPIO_NUM_40 static_cast<gpio_num_t>(40)
122# define GPIO_NUM_41 static_cast<gpio_num_t>(41)
123# define GPIO_NUM_42 static_cast<gpio_num_t>(42)
124# define GPIO_NUM_43 static_cast<gpio_num_t>(43)
125# define GPIO_NUM_44 static_cast<gpio_num_t>(44)
126# define GPIO_NUM_45 static_cast<gpio_num_t>(45)
127# define GPIO_NUM_46 static_cast<gpio_num_t>(46)
128# define GPIO_NUM_47 static_cast<gpio_num_t>(47)
129# define GPIO_NUM_48 static_cast<gpio_num_t>(48)
131# error "Unsupported SOC"
146static_assert(configTASK_NOTIFICATION_ARRAY_ENTRIES > 1);
175static_assert(std::to_underlying(
State::OTA) < MAGIC_ENUM_RANGE_MAX);
177ZTL_MAKE_ENUM_CLASS_FLAGS(
State)
203inline constexpr auto vref{1000};
224static_assert(size(
channels) < SOC_ADC_PATT_LEN_MAX);
233 SOC_ADC_DIGI_DATA_BYTES_PER_CONV};
240 ESP_TASK_PRIO_MAX - 2u,
253 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
254 struct VccVoltageMeasurementTag>;
255static_assert(std::same_as<VccVoltageMeasurement::value_type, int16_t>);
257using VccVoltage = ztl::implicit_wrapper<VccVoltageMeasurement::value_type,
258 struct VccVoltageTag>;
259static_assert(std::same_as<VccVoltage::value_type, int16_t>);
262 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
263 struct SupplyVoltageMeasurementTag>;
264static_assert(std::same_as<SupplyVoltageMeasurement::value_type, int16_t>);
267 ztl::implicit_wrapper<SupplyVoltageMeasurement::value_type,
268 struct SupplyVoltageTag>;
269static_assert(std::same_as<SupplyVoltage::value_type, int16_t>);
272 ztl::implicit_wrapper<ztl::smallest_signed_t<0, max_measurement>,
273 struct CurrentMeasurementTag>;
274static_assert(std::same_as<CurrentMeasurement::value_type, int16_t>);
277 ztl::implicit_wrapper<CurrentMeasurement::value_type, struct CurrentTag>;
278static_assert(std::same_as<Current::value_type, int16_t>);
285 static constexpr auto size{2000uz};
292 static constexpr auto size{2000uz};
299 static constexpr auto size{2000uz};
306 static constexpr auto size{1uz};
313 static constexpr auto size{1uz};
333inline std::array<char, 16uz>
ip{};
335inline std::array<uint8_t, 6uz>
mac{};
336inline std::string
mac_str(2uz * 6uz + 5uz +
sizeof(
'\n'),
'\0');
359inline std::array<StackType_t, 4096uz>
stack{};
361#if !CONFIG_IDF_TARGET_LINUX
367 static constexpr auto size{320uz};
368 static inline MessageBufferHandle_t
handle{};
373 static constexpr auto size{320uz};
380inline std::array<spi_device_handle_t, 4uz>
spis{};
390 "drv::out::susi::zimo::zusi",
391 ESP_TASK_PRIO_MAX - 1u,
427 static constexpr auto size{32uz};
441 "drv::out::track::dcc",
442 ESP_TASK_PRIO_MAX - 1u,
454 "drv::out::track::zimo::decup",
455 ESP_TASK_PRIO_MAX - 1u,
465 "drv::out::track::zimo::mdu",
466 ESP_TASK_PRIO_MAX - 1u,
483#if CONFIG_IDF_TARGET_ESP32S3
484inline std::vector<wifi_ap_record_t> ap_records;
518inline constexpr uint16_t
port{21105u};
610inline constexpr uint8_t
ack{0x06u};
613inline constexpr uint8_t
nak{0x15u};
619 ESP_TASK_PRIO_MAX - 1u,
650 drv::out::track::zimo::decup::task.timeout);
668inline std::array<StackType_t, 3072uz>
stack{};
674 "mw::zimo::ulf::dcc_ein",
675 intf::usb::rx_task.priority - 1u,
685 "mw::zimo::ulf::susiv2",
686 intf::usb::rx_task.priority - 1u,
693static_assert(dcc_ein::task.priority < intf::usb::rx_task.priority);
694static_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:180
constexpr auto boot_gpio_num
BOOT pin used to boot into bootloader or resetting WiFi station settings.
Definition config.hpp:149
State
System state.
Definition config.hpp:152
@ MDUZpp
MDU ZPP update.
Definition config.hpp:163
@ DECUPZpp
DECUP ZPP update.
Definition config.hpp:161
@ DCCOperations
DCC operation mode.
Definition config.hpp:159
@ ShortCircuit
Short circuit.
Definition config.hpp:156
@ OTA
OTA update.
Definition config.hpp:173
@ ULF_DCC_EIN
ULF_DCC_EIN USB mode.
Definition config.hpp:168
@ DECUPZsu
DECUP ZSU update.
Definition config.hpp:162
@ Suspending
About to be idle.
Definition config.hpp:155
@ MDUZsu
MDU ZSU update.
Definition config.hpp:164
@ ULF_SUSIV2
ULF_SUSIV2 USB mode.
Definition config.hpp:170
@ Suspended
Idle.
Definition config.hpp:154
@ ULF_MDU_EIN
ULF_MDU_EIN USB mode.
Definition config.hpp:169
@ ZUSI
ZUSI mode.
Definition config.hpp:165
@ DCCService
DCC service mode.
Definition config.hpp:160
constexpr auto default_notify_index
Default task notification index.
Definition config.hpp:145
std::string_view revision
Hardware revision.
Definition config.hpp:183
Definition config.hpp:187
constexpr std::array channels
Definition config.hpp:210
struct drv::anlg::TemperatureQueue temperature_queue
struct drv::anlg::SupplyVoltagesQueue supply_voltages_queue
constexpr auto conversion_frame_time
Time per frame [us].
Definition config.hpp:227
constexpr auto current_r
Current sense resistor.
Definition config.hpp:198
ztl::moving_average< int32_t, smath::pow(2, 12)> FilteredCurrent
Definition config.hpp:280
struct drv::anlg::VccVoltagesQueue vcc_voltages_queue
constexpr auto conversion_frame_samples
Number of samples per frame (84 * 12us = 1008us).
Definition config.hpp:218
constexpr auto conversion_frame_size
Bytes per conversion frame.
Definition config.hpp:232
constexpr auto ol_on_gpio_num
Definition config.hpp:189
constexpr auto conversion_frame_samples_per_channel
Number of samples per frame and channel.
Definition config.hpp:221
constexpr auto max_measurement
Definition config.hpp:204
constexpr auto voltage_lower_r
Voltage divider lower resistor for voltage measurement.
Definition config.hpp:195
ztl::implicit_wrapper< CurrentMeasurement::value_type, struct CurrentTag > Current
Definition config.hpp:276
constexpr auto current_channel
Definition config.hpp:208
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct VccVoltageMeasurementTag > VccVoltageMeasurement
Definition config.hpp:252
constexpr auto voltage_upper_r
Voltage divider upper resistor for voltage measurement.
Definition config.hpp:192
struct drv::anlg::FilteredCurrentQueue filtered_current_queue
constexpr auto sample_freq_hz
Sample frequency [Hz] (sample takes 12us).
Definition config.hpp:214
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct CurrentMeasurementTag > CurrentMeasurement
Definition config.hpp:271
constexpr auto supply_voltage_channel
Definition config.hpp:207
constexpr auto vref
Definition config.hpp:203
ztl::implicit_wrapper< VccVoltageMeasurement::value_type, struct VccVoltageTag > VccVoltage
Definition config.hpp:257
constexpr auto vcc_voltage_channel
Definition config.hpp:206
struct drv::anlg::CurrentsQueue currents_queue
constexpr auto current_k
Current sense ratio.
Definition config.hpp:201
constexpr auto attenuation
Definition config.hpp:209
ztl::implicit_wrapper< ztl::smallest_signed_t< 0, max_measurement >, struct SupplyVoltageMeasurementTag > SupplyVoltageMeasurement
Definition config.hpp:261
ztl::implicit_wrapper< SupplyVoltageMeasurement::value_type, struct SupplyVoltageTag > SupplyVoltage
Definition config.hpp:266
Definition config.hpp:319
constexpr auto sclk_gpio_num
W5500 SPI clock.
Definition config.hpp:325
std::string ip_str
Definition config.hpp:334
std::array< char, 16uz > ip
Definition config.hpp:333
std::array< uint8_t, 6uz > mac
Definition config.hpp:335
constexpr auto miso_gpio_num
W5500 SPI MISO.
Definition config.hpp:328
constexpr auto mosi_gpio_num
W5500 SPI MOSI.
Definition config.hpp:331
std::string mac_str(2uz *6uz+5uz+sizeof('\n'), '\0')
constexpr auto cs_gpio_num
W5500 SPI chip select.
Definition config.hpp:322
Definition config.hpp:340
constexpr auto bug_gpio_num
Bug LED pin used to indicate errors or updates.
Definition config.hpp:343
constexpr auto wifi_gpio_num
WiFi LED used to indicate WiFi connection status.
Definition config.hpp:349
constexpr auto wifi_channel
WiFi LED channel.
Definition config.hpp:352
constexpr auto bug_channel
Bug LED channel.
Definition config.hpp:346
Definition config.hpp:386
Definition config.hpp:378
constexpr auto enable_gpio_num
Definition config.hpp:382
std::array< spi_device_handle_t, 4uz > spis
Definition config.hpp:380
constexpr auto data_gpio_num
Definition config.hpp:384
constexpr auto clock_gpio_num
Definition config.hpp:383
Definition config.hpp:434
constexpr auto bidi_en_gpio_num
Definition config.hpp:437
constexpr auto bidi_rx_gpio_num
Definition config.hpp:436
Definition config.hpp:450
Definition config.hpp:461
Definition config.hpp:448
Definition config.hpp:399
constexpr auto nsleep_gpio_num
Definition config.hpp:415
constexpr auto ilim1_gpio_num
Definition config.hpp:417
constexpr auto trans_queue_depth
Continuous transmission requires at least a depth of 2.
Definition config.hpp:409
constexpr auto ilim0_gpio_num
Definition config.hpp:416
constexpr auto enable_gpio_num
Definition config.hpp:419
constexpr auto ack_gpio_num
Definition config.hpp:414
rmt_encoder_handle_t encoder
Definition config.hpp:432
constexpr auto n_force_low_gpio_num
Definition config.hpp:412
constexpr auto nfault_gpio_num
Definition config.hpp:418
CurrentLimit
Definition config.hpp:401
@ _4100mA
Definition config.hpp:405
@ _1300mA
Definition config.hpp:403
@ _500mA
Definition config.hpp:402
@ _2700mA
Definition config.hpp:404
rmt_channel_handle_t channel
Definition config.hpp:431
constexpr auto p_gpio_num
Definition config.hpp:411
struct drv::out::track::RxQueue rx_queue
Definition config.hpp:356
struct drv::out::TxMessageBuffer tx_message_buffer
std::array< StackType_t, 4096uz > stack
Definition config.hpp:359
struct drv::out::RxMessageBuffer rx_message_buffer
gptimer_handle_t gptimer
Definition config.hpp:362
Definition config.hpp:478
Definition config.hpp:185
Definition config.hpp:501
std::shared_ptr< Server > server
Definition config.hpp:504
Definition config.hpp:493
httpd_handle_t handle
Handle to server instance.
Definition config.hpp:496
constexpr auto stack_size
Definition config.hpp:499
Definition config.hpp:510
std::string str
Definition config.hpp:512
Definition config.hpp:516
constexpr uint16_t port
Definition config.hpp:518
int sock_fd
Definition config.hpp:519
Definition config.hpp:523
constexpr auto buffer_size
Definition config.hpp:526
struct intf::usb::RxStreamBuffer rx_stream_buffer
constexpr auto vbus_gpio_num
Definition config.hpp:525
struct intf::usb::TxStreamBuffer tx_stream_buffer
Definition config.hpp:491
Definition config.hpp:562
Definition config.hpp:560
Definition config.hpp:578
constexpr auto priority_bits
Definition config.hpp:580
std::shared_ptr< Service > service
Definition config.hpp:583
Definition config.hpp:595
Definition config.hpp:607
constexpr uint8_t nak
Definition config.hpp:613
constexpr uint8_t ack
Definition config.hpp:610
Definition config.hpp:625
std::shared_ptr< Service > service
Definition config.hpp:636
Definition config.hpp:642
Definition config.hpp:654
Definition config.hpp:670
Definition config.hpp:681
Definition config.hpp:666
std::array< StackType_t, 3072uz > stack
Definition config.hpp:668
Definition config.hpp:698
Definition config.hpp:640
Definition config.hpp:576
Definition config.hpp:297
static constexpr auto size
Definition config.hpp:299
CurrentMeasurement value_type
Definition config.hpp:298
static QueueHandle_t handle
Definition config.hpp:300
Definition config.hpp:304
static constexpr auto size
Definition config.hpp:306
static QueueHandle_t handle
Definition config.hpp:307
CurrentMeasurement value_type
Definition config.hpp:305
Definition config.hpp:290
static constexpr auto size
Definition config.hpp:292
static QueueHandle_t handle
Definition config.hpp:293
SupplyVoltageMeasurement value_type
Definition config.hpp:291
Definition config.hpp:311
float value_type
Definition config.hpp:312
static constexpr auto size
Definition config.hpp:313
static QueueHandle_t handle
Definition config.hpp:314
Definition config.hpp:283
static QueueHandle_t handle
Definition config.hpp:286
static constexpr auto size
Definition config.hpp:285
VccVoltageMeasurement value_type
Definition config.hpp:284
Definition config.hpp:366
static constexpr auto size
Definition config.hpp:367
static MessageBufferHandle_t handle
Definition config.hpp:368
Definition config.hpp:372
static MessageBufferHandle_t back_handle
Definition config.hpp:375
static constexpr auto size
Definition config.hpp:373
static MessageBufferHandle_t front_handle
Definition config.hpp:374
Definition config.hpp:423
dcc::Packet packet
Definition config.hpp:424
dcc::bidi::Datagram datagram
Definition config.hpp:425
Definition config.hpp:422
static QueueHandle_t handle
Definition config.hpp:428
static constexpr auto size
Definition config.hpp:427
Definition config.hpp:545
StreamBufferHandle_t handle
Definition config.hpp:547
static constexpr auto size
Definition config.hpp:546
Definition config.hpp:551
StreamBufferHandle_t handle
Definition config.hpp:553
static constexpr auto size
Definition config.hpp:552
#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