Firmware  0.9.0
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 // Driving interface
53 void locoEStop(uint16_t loco_addr) final;
54 void locoPurge(uint16_t loco_addr) final;
55 z21::LocoInfo locoInfo(uint16_t loco_addr) final;
56 [[nodiscard]] z21::LocoEntry locoEntry(uint16_t loco_addr) final;
57 void locoEntry(uint16_t loco_addr, z21::LocoEntry loco_entry) final;
58 void locoDrive(uint16_t loco_addr,
59 z21::LocoInfo::SpeedSteps speed_steps,
60 uint8_t rvvvvvvv) final;
61 void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final;
62 z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final;
63 void locoMode(uint16_t, z21::LocoInfo::Mode mode) final;
64 void broadcastLocoInfo(uint16_t loco_addr) final;
65 void broadcastLocoEntry(uint16_t loco_addr) final;
66
67 // Switching interface
68 [[nodiscard]] z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final;
69 [[nodiscard]] z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final;
70 void turnout(uint16_t accy_addr, bool p, bool a, bool q) final;
71 void accessory(uint16_t accy_addr, uint8_t dddddddd) final;
72 [[nodiscard]] z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final;
73 void turnoutMode(uint16_t accy_addr, z21::TurnoutInfo::Mode mode) final;
74 void broadcastTurnoutInfo(uint16_t accy_addr) final;
75 void broadcastExtAccessoryInfo(uint16_t accy_addr) final;
76
77 // Programming interface
78 [[nodiscard]] bool cvRead(uint16_t cv_addr) final;
79 [[nodiscard]] bool cvWrite(uint16_t cv_addr, uint8_t byte) final;
80 void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final;
81 void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final;
82 void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr, bool) final;
83 void cvPomAccessoryWrite(uint16_t accy_addr,
84 uint16_t cv_addr,
85 uint8_t byte,
86 bool) final;
87 void cvNackShortCircuit() final;
88 void cvNack() final;
89 void cvAck(uint16_t cv_addr, uint8_t byte) final;
90
91 // RailCom interface
92 [[nodiscard]] z21::RailComData railComData(uint16_t loco_addr) final;
93 void broadcastRailComData(uint16_t loco_addr) final;
94
95 // This gets called by FreeRTOS
96 [[noreturn]] void taskFunction(void*);
97
98 //
99 void operationsLoop();
100 void operationsLocos();
101 void operationsTurnouts();
102 void operationsBiDi();
103 void serviceLoop();
104 std::optional<uint8_t> serviceRead(uint16_t cv_addr);
105 std::optional<uint8_t> serviceWrite(uint16_t cv_addr, uint8_t byte);
106 std::optional<bool> serviceReceiveBit();
107 std::optional<uint8_t> serviceReceiveByte();
108
109 //
110 void resume();
111 void suspend();
112
113 //
114 Loco& getOrInsertLoco(uint16_t loco_addr);
115 Turnout& getOrInsertTurnout(uint16_t accy_addr);
116
117 //
118 void sendLocos(std::span<Locos::iterator, 2uz> its) const;
119 Packet makeDrivePacket(Address::value_type addr, Loco const& loco) const;
120 Address basicOrExtendedLocoAddress(Address::value_type addr) const;
121 bool maybeInvertR(bool p) const;
122
123 //
124 void sendToFront(Packet const& packet, size_t n = 1uz) const;
125 void sendToBack(Packet const& packet, size_t n = 1uz) const;
126
129
130 std::mutex _internal_mutex;
131 std::shared_ptr<z21::server::intf::System> _z21_system_service;
132 std::shared_ptr<z21::server::intf::Dcc> _z21_dcc_service;
133
134 // NVS cache
135 struct {
136 uint8_t programming_type{};
137 uint8_t program_packet_count{};
138 bool bit_verify_to_1{};
139 uint8_t loco_flags{};
140 uint8_t accy_flags{};
141 uint8_t accy_switch_time{};
142 uint8_t accy_packet_count{};
143 } _nvs{};
144
146 struct CvRequest {
147 TickType_t timeout_tick{};
148 uint16_t addr{};
149 uint16_t cv_addr{};
150 std::optional<uint8_t> byte{};
151 };
152 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
154 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
156};
157
158} // namespace mw::dcc
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_pom_request_deque
Definition service.hpp:155
void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final
Definition service.cpp:474
std::optional< bool > serviceReceiveBit()
Definition service.cpp:957
intf::http::Response locosGetRequest(intf::http::Request const &req)
Definition service.cpp:102
Locos _locos
Definition service.hpp:127
Address basicOrExtendedLocoAddress(Address::value_type addr) const
Definition service.cpp:1102
void resume()
Definition service.cpp:979
Turnout & getOrInsertTurnout(uint16_t accy_addr)
Definition service.cpp:1014
std::shared_ptr< z21::server::intf::System > _z21_system_service
Definition service.hpp:131
void cvNack() final
Definition service.cpp:692
void cvNackShortCircuit() final
Definition service.cpp:689
void cvAck(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:695
intf::http::Response turnoutsGetRequest(intf::http::Request const &req)
Definition service.cpp:238
intf::http::Response turnoutsDeleteRequest(intf::http::Request const &req)
Definition service.cpp:273
std::shared_ptr< z21::server::intf::Dcc > _z21_dcc_service
Definition service.hpp:132
void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:639
void operationsLocos()
Definition service.cpp:742
std::optional< uint8_t > serviceRead(uint16_t cv_addr)
Definition service.cpp:905
void operationsBiDi()
Definition service.cpp:783
Loco & getOrInsertLoco(uint16_t loco_addr)
Definition service.cpp:1003
z21::TurnoutInfo turnoutInfo(uint16_t accy_addr) final
Definition service.cpp:529
void suspend()
Definition service.cpp:995
z21::LocoInfo locoInfo(uint16_t loco_addr) final
Definition service.cpp:415
void locoPurge(uint16_t loco_addr) final
Definition service.cpp:400
void broadcastExtAccessoryInfo(uint16_t accy_addr) final
Definition service.cpp:602
z21::AccessoryInfo accessoryInfo(uint16_t accy_addr) final
Definition service.cpp:538
void broadcastLocoInfo(uint16_t loco_addr) final
Definition service.cpp:519
struct mw::dcc::Service::@375351017336315001104246161026011227303125012136 _nvs
Packet makeDrivePacket(Address::value_type addr, Loco const &loco) const
Definition service.cpp:1077
z21::TurnoutInfo::Mode turnoutMode(uint16_t accy_addr) final
Definition service.cpp:587
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_request_deque
Definition service.hpp:153
void sendToBack(Packet const &packet, size_t n=1uz) const
Definition service.cpp:1129
bool cvRead(uint16_t cv_addr) final
Definition service.cpp:607
void turnout(uint16_t accy_addr, bool p, bool a, bool q) final
Definition service.cpp:547
void sendLocos(std::span< Locos::iterator, 2uz > its) const
Definition service.cpp:1033
std::optional< uint8_t > serviceWrite(uint16_t cv_addr, uint8_t byte)
Definition service.cpp:946
void accessory(uint16_t accy_addr, uint8_t dddddddd) final
Definition service.cpp:582
Service()
Definition service.cpp:36
void sendToFront(Packet const &packet, size_t n=1uz) const
Definition service.cpp:1120
void locoEStop(uint16_t loco_addr) final
Definition service.cpp:374
z21::RailComData railComData(uint16_t loco_addr) final
Definition service.cpp:700
void operationsLoop()
Definition service.cpp:731
void broadcastRailComData(uint16_t loco_addr) final
Definition service.cpp:708
intf::http::Response turnoutsPutRequest(intf::http::Request const &req)
Definition service.cpp:298
void broadcastLocoEntry(uint16_t loco_addr) final
Definition service.cpp:524
std::mutex _internal_mutex
Definition service.hpp:130
intf::http::Response locosDeleteRequest(intf::http::Request const &req)
Definition service.cpp:138
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
void locoDrive(uint16_t loco_addr, z21::LocoInfo::SpeedSteps speed_steps, uint8_t rvvvvvvv) final
Definition service.cpp:451
intf::http::Response locosPutRequest(intf::http::Request const &req)
Definition service.cpp:162
intf::http::Response postRequest(intf::http::Request const &req)
Definition service.cpp:69
bool maybeInvertR(bool p) const
Definition service.cpp:1113
void operationsTurnouts()
Definition service.cpp:768
void serviceLoop()
Definition service.cpp:862
Turnouts _turnouts
Definition service.hpp:128
std::optional< uint8_t > serviceReceiveByte()
Definition service.cpp:969
z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final
Definition service.cpp:509
void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final
Definition service.cpp:621
void taskFunction(void *)
Definition service.cpp:713
z21::LocoEntry locoEntry(uint16_t loco_addr) final
Definition service.cpp:427
void cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte, bool) final
Definition service.cpp:674
bool cvWrite(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:614
void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr, bool) final
Definition service.cpp:650
intf::http::Response getRequest(intf::http::Request const &req)
Definition service.cpp:58
void broadcastTurnoutInfo(uint16_t accy_addr) final
Definition service.cpp:597
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:182
HTTP and WebSocket endpoints.
std::expected< std::string, std::string > Response
Definition response.hpp:29
Definition config.hpp:576
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
Actual object with volatile and non-volatile stuff.
Definition loco.hpp:40
Definition service.hpp:146
uint16_t addr
Definition service.hpp:148
uint16_t cv_addr
Definition service.hpp:149
TickType_t timeout_tick
Definition service.hpp:147
Actual object with volatile and non-volatile stuff.
Definition turnout.hpp:75