Firmware  0.0.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 "http/endpoints.hpp"
22#include "locos.hpp"
23
24namespace dcc {
25
27class Service : public z21::server::intf::Dcc {
28public:
29 explicit Service(BaseType_t xCoreID);
30 ~Service();
31
32 //
33 void z21(std::shared_ptr<z21::server::intf::System> z21_system_service,
34 std::shared_ptr<z21::server::intf::Dcc> z21_dcc_service);
35
36 //
40
41private:
42 // This gets called by FreeRTOS
43 void taskFunction(void*);
44
45 void operationsLoop();
46 void operationsDcc();
47 void operationsBiDi();
48
49 void serviceLoop();
50 std::optional<uint8_t> serviceRead(uint16_t cv_addr);
51 std::optional<uint8_t> serviceWrite(uint16_t cv_addr, uint8_t byte);
52 std::optional<bool> serviceReceiveBit();
53 std::optional<uint8_t> serviceReceiveByte(bool bit_verify_to_1);
54
55 void sendToFront(Packet const& packet, size_t n = 1uz);
56 void sendToBack(Packet const& packet, size_t n = 1uz);
57
58 // Driving interface
59 z21::LocoInfo locoInfo(uint16_t loco_addr) final;
60 void locoDrive(uint16_t loco_addr,
61 z21::LocoInfo::SpeedSteps speed_steps,
62 uint8_t rvvvvvvv) final;
63 void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final;
64 z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final;
65 void locoMode(uint16_t, z21::LocoInfo::Mode mode) final;
66 void broadcastLocoInfo(uint16_t loco_addr) 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 void cvNackShortCircuit() final;
77 void cvNack() final;
78 void cvAck(uint16_t cv_addr, uint8_t byte) final;
79
80 void resume();
81 void suspend();
82
83 uint8_t programPacketCount() const;
84
86 std::mutex _internal_mutex;
87 std::shared_ptr<z21::server::intf::System> _z21_system_service;
88 std::shared_ptr<z21::server::intf::Dcc> _z21_dcc_service;
90
92 struct CvRequest {
93 TickType_t then{};
94 uint16_t addr{};
95 uint16_t cv_addr{};
96 std::optional<uint8_t> byte{};
97 };
98 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
100 ztl::inplace_deque<CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT>
102};
103
104} // namespace dcc
Definition service.hpp:27
void taskFunction(void *)
Definition service.cpp:157
http::Response locosDeleteRequest(http::Request const &req)
Definition service.cpp:98
void cvPomWrite(uint16_t loco_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:608
void cvNack() final
Definition service.cpp:637
bool cvWrite(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:581
std::shared_ptr< z21::server::intf::Dcc > _z21_dcc_service
Definition service.hpp:88
void sendToBack(Packet const &packet, size_t n=1uz)
Definition service.cpp:487
void cvAck(uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:643
Locos _locos
Definition service.hpp:85
http::Response locosGetRequest(http::Request const &req)
Definition service.cpp:67
void operationsLoop()
Definition service.cpp:174
void operationsDcc()
Currently fills message buffer between 25 and 50%.
Definition service.cpp:190
z21::LocoInfo locoInfo(uint16_t loco_addr) final
Definition service.cpp:494
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_request_deque
Definition service.hpp:99
std::mutex _internal_mutex
Definition service.hpp:86
z21::LocoInfo::Mode locoMode(uint16_t loco_addr) final
Definition service.cpp:551
~Service()
Definition service.cpp:54
ztl::inplace_deque< CvRequest, Z21_SERVER_MAX_LOCO_ADDRESSES_PER_CLIENT > _cv_pom_request_deque
Definition service.hpp:101
std::optional< uint8_t > serviceReceiveByte(bool bit_verify_to_1)
Definition service.cpp:465
void suspend()
Definition service.cpp:659
void broadcastLocoInfo(uint16_t loco_addr) final
Definition service.cpp:569
void sendToFront(Packet const &packet, size_t n=1uz)
Definition service.cpp:475
uint8_t programPacketCount() const
Definition service.cpp:667
void cvPomRead(uint16_t loco_addr, uint16_t cv_addr) final
Definition service.cpp:588
void resume()
Definition service.cpp:649
std::optional< bool > serviceReceiveBit()
Definition service.cpp:453
void locoFunction(uint16_t loco_addr, uint32_t mask, uint32_t state) final
Definition service.cpp:530
void cvNackShortCircuit() final
Definition service.cpp:631
uint8_t _priority_count
Definition service.hpp:89
std::optional< uint8_t > serviceRead(uint16_t cv_addr)
Definition service.cpp:398
void operationsBiDi()
Definition service.cpp:264
void locoDrive(uint16_t loco_addr, z21::LocoInfo::SpeedSteps speed_steps, uint8_t rvvvvvvv) final
Definition service.cpp:507
std::shared_ptr< z21::server::intf::System > _z21_system_service
Definition service.hpp:87
http::Response locosPutRequest(http::Request const &req)
Definition service.cpp:120
void cvPomAccessoryRead(uint16_t accy_addr, uint16_t cv_addr) final
Definition service.cpp:619
void cvPomAccessoryWrite(uint16_t accy_addr, uint16_t cv_addr, uint8_t byte) final
Definition service.cpp:624
std::optional< uint8_t > serviceWrite(uint16_t cv_addr, uint8_t byte)
Definition service.cpp:442
void serviceLoop()
Definition service.cpp:361
bool cvRead(uint16_t cv_addr) final
Definition service.cpp:574
Service(BaseType_t xCoreID)
Definition service.cpp:32
std::atomic< State > state
Restricts access to low-level tasks.
Definition config.hpp:166
HTTP and WebSocket endpoints.
Definition config.hpp:268
std::map< Address::value_type, Loco > Locos
Definition locos.hpp:23
std::expected< std::string, std::string > Response
Definition response.hpp:29
Definition config.hpp:579
static constexpr uint8_t min_priority
Definition loco.hpp:39
Definition service.hpp:92
TickType_t then
Definition service.hpp:93
uint16_t addr
Definition service.hpp:94
uint16_t cv_addr
Definition service.hpp:95
Definition request.hpp:28