24#include <esp_heap_caps.h>
46 string_view p{__PRETTY_FUNCTION__};
47 return string_view(data(p) + 34, size(p) - 34 - 1);
48#elif defined(__GNUC__)
49 string_view p{__PRETTY_FUNCTION__};
50# if __cplusplus < 201402
51 return string_view(data(p) + 36, size(p) - 36 - 1);
53 return string_view(data(p) + 49, p.find(
';', 49) - 49);
55#elif defined(_MSC_VER)
56 string_view p{__FUNCSIG__};
57 return string_view(data(p) + 84, size(p) - 84 - 7);
61std::optional<dcc::Address::value_type>
uri2address(std::string_view uri);
66template<std::output_iterator<
char> OutputIt>
68 auto first{begin(uri)};
69 auto const last{cend(uri)};
70 while (first < last) {
72 if (c ==
'+') c =
' ';
74 std::from_chars(first, first + 2, c, 16);
97template<
typename F,
typename... Ts>
99 using R =
decltype(f(std::forward<Ts>(ts)...));
102 if (core_id == xPortGetCoreID())
103 return std::invoke(std::forward<F>(f), std::forward<Ts>(ts)...);
105 else if constexpr (
constexpr auto default_stacksize{4096uz};
108 std::tuple<F, std::tuple<Ts...>> t{
109 std::forward<F>(f), std::tuple<Ts...>{std::forward<Ts>(ts)...}};
113 if (!xTaskCreatePinnedToCore(
115 auto& _t{*
static_cast<decltype(t)*
>(pv)};
116 std::apply(std::get<0uz>(_t), std::get<1uz>(_t));
122 ESP_TASK_PRIO_MAX - 1u,
126 while (eTaskGetState(handle) < eDeleted) vTaskDelay(1u);
131 std::tuple<R, F, std::tuple<Ts...>> t{
132 {}, std::forward<F>(f), std::tuple<Ts...>{std::forward<Ts>(ts)...}};
136 if (!xTaskCreatePinnedToCore(
138 auto& _t{*
static_cast<decltype(t)*
>(pv)};
140 std::apply(std::get<1uz>(_t), std::get<2uz>(_t));
146 ESP_TASK_PRIO_MAX - 1u,
150 while (eTaskGetState(handle) < eDeleted) vTaskDelay(1u);
152 return std::get<0uz>(t);
157template<
typename... Ts>
167 auto msg{std::bit_cast<intf::http::Message*>(arg)};
170 httpd_ws_frame_t frame{
175 if (
auto const err{httpd_ws_send_frame_async(
177 LOGD(
"httpd_ws_send_frame_async failed %s", esp_err_to_name(err));
#define LOGD(...)
Definition log.h:46
httpd_handle_t handle
Handle to server instance.
Definition config.hpp:445
Definition message.hpp:29
httpd_ws_type_t type
Definition message.hpp:31
int sock_fd
Definition message.hpp:30
std::vector< uint8_t > payload
Definition message.hpp:32
std::optional< dcc::Address > uri2loco_address(std::string_view uri)
Definition utility.cpp:62
void esp_delayed_restart()
Definition utility.cpp:38
bool validate_json(std::string_view json)
Definition utility.cpp:44
auto httpd_sess_trigger_close(Ts &&... ts)
Definition utility.hpp:158
constexpr auto make_unique_caps(size_t size, uint32_t caps)
Definition utility.hpp:88
auto httpd_queue_work(intf::http::Message *msg)
Definition utility.hpp:163
uint32_t http_receive_timeout2ms()
Definition utility.cpp:72
OutputIt decode_uri(std::string_view uri, OutputIt out)
https://rosettacode.org/wiki/URL_decoding#C
Definition utility.hpp:67
std::unique_ptr< T, decltype(heap_caps_free) * > unique_caps_ptr
Definition utility.hpp:84
consteval std::string_view type_name()
Definition utility.hpp:43
std::optional< dcc::Address::value_type > uri2address(std::string_view uri)
Definition utility.cpp:51
auto invoke_on_core(BaseType_t core_id, F &&f, Ts &&... ts)
Definition utility.hpp:98