Firmware  0.0.4
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
service.hpp
Go to the documentation of this file.
1// Copyright (C) 2025 Vincent Hamp
2//
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU General Public License as published by
5// the Free Software Foundation, either version 3 of the License, or
6// (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11// GNU General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with this program. If not, see <https://www.gnu.org/licenses/>.
15
16#pragma once
17
18#include <mutex>
19#include <set>
20#include <z21/z21.hpp>
21#include "http/message.hpp"
22
23namespace z21 {
24
26 z21::server::Base<z21::server::intf::System, z21::server::intf::Dcc>;
27
28class Service : public ServerBase {
29public:
30 explicit Service(BaseType_t xCoreID);
31 ~Service();
32
33 void dcc(std::shared_ptr<z21::server::intf::Dcc> dcc_service);
34
35 esp_err_t socket(http::Message& msg);
36
37private:
38 // This gets called by FreeRTOS
39 void taskFunction(void*);
40
41 //
42 void transmit(z21::Socket const& sock,
43 std::span<uint8_t const> datasets) final;
44
45 //
46 [[nodiscard]] bool trackPower(bool on) final;
47 [[nodiscard]] bool stop() final;
48 [[nodiscard]] int32_t serialNumber() const final;
49 void logoff(z21::Socket const& sock) final;
50
51 // Driving interface
52 z21::LocoInfo locoInfo(uint16_t loco_addr) final;
53 void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final;
54 void locoDrive(uint16_t loco_addr,
55 z21::LocoInfo::SpeedSteps speed_steps,
56 uint8_t rvvvvvvv) final;
57 z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final;
58 void locoMode(uint16_t loco_addr, z21::LocoInfo::Mode mode) final;
59
60 // Switching interface
61 [[nodiscard]] z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final;
62 [[nodiscard]] z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final;
63 void turnout(uint16_t accy_addr, bool p, bool a, bool q) final;
64 void accessory(uint16_t accy_addr, uint8_t dddddddd) final;
65 [[nodiscard]] z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final;
66 void turnoutMode(uint16_t accy_addr, z21::TurnoutInfo::Mode mode) final;
67
68 // Programming interface
69 [[nodiscard]] bool cvRead(uint16_t cv_addr) final;
70 [[nodiscard]] bool cvWrite(uint16_t cv_addr, uint8_t byte) final;
71 void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final;
72 void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final;
73 void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr) final;
74 void
75 cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte) final;
76
77 //
78 bool trackPower(bool on, State dcc_state);
79
81 std::shared_ptr<z21::server::intf::Dcc> _dcc_service;
82
84 std::set<int> _ws_sock_fds;
85
86 std::mutex _internal_mutex;
87};
88
89} // namespace z21
Definition service.hpp:28
void cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:259
void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr) final
Definition service.cpp:254
z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final
Definition service.cpp:206
bool stop() final
Definition service.cpp:155
void locoDrive(uint16_t loco_addr, z21::LocoInfo::SpeedSteps speed_steps, uint8_t rvvvvvvv) final
Definition service.cpp:178
bool cvRead(uint16_t cv_addr) final
Definition service.cpp:233
esp_err_t socket(http::Message &msg)
Definition service.cpp:52
void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final
Definition service.cpp:244
z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final
Definition service.cpp:222
void accessory(uint16_t accy_addr, uint8_t dddddddd) final
Definition service.cpp:217
void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:249
std::shared_ptr< z21::server::intf::Dcc > _dcc_service
Definition service.hpp:81
bool cvWrite(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:238
int32_t serialNumber() const final
Definition service.cpp:161
z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final
Definition service.cpp:200
void transmit(z21::Socket const &sock, std::span< uint8_t const > datasets) final
Definition service.cpp:123
void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final
Definition service.cpp:185
void taskFunction(void *)
Definition service.cpp:85
std::mutex _internal_mutex
Definition service.hpp:86
std::set< int > _ws_sock_fds
Definition service.hpp:84
bool trackPower(bool on) final
Definition service.cpp:150
void logoff(z21::Socket const &sock) final
Definition service.cpp:166
z21::LocoInfo locoInfo(uint16_t loco_addr) final
Definition service.cpp:173
Service(BaseType_t xCoreID)
Definition service.cpp:28
~Service()
Definition service.cpp:40
z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final
Definition service.cpp:190
void turnout(uint16_t accy_addr, bool p, bool a, bool q) final
Definition service.cpp:212
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:168
State
System state.
Definition config.hpp:139
HTTP websocket message.
Definition config.hpp:270
Definition config.hpp:579
z21::server::Base< z21::server::intf::System, z21::server::intf::Dcc > ServerBase
Definition service.hpp:25
Definition message.hpp:29