Firmware  0.4.1
Loading...
Searching...
No Matches
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 <optional>
20#include <z21/z21.hpp>
21#include "accessories.hpp"
23#include "locos.hpp"
24#include "turnouts.hpp"
25
26namespace mw::dcc {
27
29class Service : public z21::server::intf::Dcc {
30public:
31 Service();
32
33 //
34 void z21(std::shared_ptr<z21::server::intf::System> z21_system_service,
35 std::shared_ptr<z21::server::intf::Dcc> z21_dcc_service);
36
37 //
40
41 //
45
46 //
50
51private:
52 // This gets called by FreeRTOS
53 [[noreturn]] void taskFunction(void*);
54
55 void operationsLoop();
56 void operationsDcc();
57 void operationsBiDi();
58
59 void serviceLoop();
60 std::optional<uint8_t> serviceRead(uint16_t cv_addr);
61 std::optional<uint8_t> serviceWrite(uint16_t cv_addr, uint8_t byte);
62 std::optional<bool> serviceReceiveBit();
63 std::optional<uint8_t> serviceReceiveByte();
64
65 void sendToFront(Packet const& packet, size_t n = 1uz);
66 void sendToBack(Packet const& packet, size_t n = 1uz);
67
68 // Driving interface
69 z21::LocoInfo locoInfo(uint16_t loco_addr) final;
70 void locoDrive(uint16_t loco_addr,
71 z21::LocoInfo::SpeedSteps speed_steps,
72 uint8_t rvvvvvvv) final;
73 void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final;
74 z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final;
75 void locoMode(uint16_t, z21::LocoInfo::Mode mode) final;
76 void broadcastLocoInfo(uint16_t loco_addr) final;
77
78 // Switching interface
79 [[nodiscard]] z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final;
80 [[nodiscard]] z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final;
81 void turnout(uint16_t accy_addr, bool p, bool a, bool q) final;
82 void accessory(uint16_t accy_addr, uint8_t dddddddd) final;
83 [[nodiscard]] z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final;
84 void turnoutMode(uint16_t accy_addr, z21::TurnoutInfo::Mode mode) final;
85 void broadcastTurnoutInfo(uint16_t accy_addr) final;
86 void broadcastExtAccessoryInfo(uint16_t accy_addr) final;
87
88 // Programming interface
89 [[nodiscard]] bool cvRead(uint16_t cv_addr) final;
90 [[nodiscard]] bool cvWrite(uint16_t cv_addr, uint8_t byte) final;
91 void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final;
92 void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final;
93 void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr) final;
94 void
95 cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte) final;
96 void cvNackShortCircuit() final;
97 void cvNack() final;
98 void cvAck(uint16_t cv_addr, uint8_t byte) final;
99
100 // RailCom interface
101 [[nodiscard]] z21::RailComData railComData(uint16_t loco_addr) final;
102 void broadcastRailComData(uint16_t loco_addr) final;
103
104 void resume();
105 void suspend();
106
107 Address basicOrExtendedLocoAddress(Address::value_type addr) const;
108
111
112 std::mutex _internal_mutex;
113 std::shared_ptr<z21::server::intf::System> _z21_system_service;
114 std::shared_ptr<z21::server::intf::Dcc> _z21_dcc_service;
116
117 // Settings
118 uint8_t _loco_flags{};
119 uint8_t _accy_flags{};
123
125 struct CvRequest {
126 TickType_t then{};
127 uint16_t addr{};
128 uint16_t cv_addr{};
129 std::optional<uint8_t> byte{};
130 };
131 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
133 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
135};
136
137} // namespace mw::dcc
bool _bit_verify_to_1
Definition service.hpp:122
uint8_t _accy_flags
Definition service.hpp:119
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_pom_request_deque
Definition service.hpp:134
void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final
Definition service.cpp:714
std::optional< bool > serviceReceiveBit()
Definition service.cpp:611
intf::http::Response locosGetRequest(intf::http::Request const &req)
Definition service.cpp:102
Locos _locos
Definition service.hpp:109
Address basicOrExtendedLocoAddress(Address::value_type addr) const
Definition service.cpp:965
void resume()
Definition service.cpp:935
std::shared_ptr< z21::server::intf::System > _z21_system_service
Definition service.hpp:113
void cvNack() final
Definition service.cpp:915
void cvNackShortCircuit() final
Definition service.cpp:912
void cvAck(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:918
intf::http::Response turnoutsGetRequest(intf::http::Request const &req)
Definition service.cpp:213
intf::http::Response turnoutsDeleteRequest(intf::http::Request const &req)
Definition service.cpp:244
std::shared_ptr< z21::server::intf::Dcc > _z21_dcc_service
Definition service.hpp:114
void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:889
std::optional< uint8_t > serviceRead(uint16_t cv_addr)
Definition service.cpp:560
uint8_t _program_packet_count
Definition service.hpp:121
void cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:905
void operationsBiDi()
Definition service.cpp:448
z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final
Definition service.cpp:767
uint8_t _priority_count
Definition service.hpp:115
void suspend()
Definition service.cpp:957
z21::LocoInfo locoInfo(uint16_t loco_addr) final
Definition service.cpp:654
void broadcastExtAccessoryInfo(uint16_t accy_addr) final
Definition service.cpp:850
z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final
Definition service.cpp:782
void broadcastLocoInfo(uint16_t loco_addr) final
Definition service.cpp:762
z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final
Definition service.cpp:835
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_request_deque
Definition service.hpp:132
bool cvRead(uint16_t cv_addr) final
Definition service.cpp:855
void turnout(uint16_t accy_addr, bool p, bool a, bool q) final
Definition service.cpp:789
void operationsDcc()
Currently fills message buffer between 25 and 50%.
Definition service.cpp:357
std::optional< uint8_t > serviceWrite(uint16_t cv_addr, uint8_t byte)
Definition service.cpp:600
void accessory(uint16_t accy_addr, uint8_t dddddddd) final
Definition service.cpp:830
Service()
Definition service.cpp:36
void sendToFront(Packet const &packet, size_t n=1uz)
Definition service.cpp:633
z21::RailComData railComData(uint16_t loco_addr) final
Definition service.cpp:923
void operationsLoop()
Definition service.cpp:341
void broadcastRailComData(uint16_t loco_addr) final
Definition service.cpp:930
intf::http::Response turnoutsPutRequest(intf::http::Request const &req)
Definition service.cpp:267
std::mutex _internal_mutex
Definition service.hpp:112
intf::http::Response locosDeleteRequest(intf::http::Request const &req)
Definition service.cpp:134
void z21(std::shared_ptr< z21::server::intf::System > z21_system_service, std::shared_ptr< z21::server::intf::Dcc > z21_dcc_service)
Definition service.cpp:51
uint8_t _programming_type
Definition service.hpp:120
void locoDrive(uint16_t loco_addr, z21::LocoInfo::SpeedSteps speed_steps, uint8_t rvvvvvvv) final
Definition service.cpp:670
uint8_t _loco_flags
Definition service.hpp:118
intf::http::Response locosPutRequest(intf::http::Request const &req)
Definition service.cpp:156
intf::http::Response postRequest(intf::http::Request const &req)
Definition service.cpp:69
void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr) final
Definition service.cpp:900
void sendToBack(Packet const &packet, size_t n=1uz)
Definition service.cpp:647
void serviceLoop()
Definition service.cpp:521
Turnouts _turnouts
Definition service.hpp:110
std::optional< uint8_t > serviceReceiveByte()
Definition service.cpp:623
z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final
Definition service.cpp:752
void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final
Definition service.cpp:869
void taskFunction(void *)
Definition service.cpp:323
bool cvWrite(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:862
intf::http::Response getRequest(intf::http::Request const &req)
Definition service.cpp:58
void broadcastTurnoutInfo(uint16_t accy_addr) final
Definition service.cpp:845
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:178
HTTP and WebSocket endpoints.
std::expected< std::string, std::string > Response
Definition response.hpp:29
Definition config.hpp:512
std::map< Address::value_type, Loco > Locos
Definition locos.hpp:23
std::map< Address::value_type, Turnout > Turnouts
Definition turnouts.hpp:23
Definition request.hpp:28
static constexpr uint8_t min_priority
Definition loco.hpp:52
Definition service.hpp:125
TickType_t then
Definition service.hpp:126
uint16_t addr
Definition service.hpp:127
uint16_t cv_addr
Definition service.hpp:128