REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
registry.cpp
Go to the documentation of this file.
1// Copyright (c) 2023 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#include "protocol/registry.h"
6
7#include "utils/logging.h"
8
9#include <handlers/carrier.h>
10#include <handlers/daq.h>
11#include <handlers/help.h>
12#include <handlers/loader_flasher.h>
13#include <handlers/loader_plugin.h>
14#include <handlers/login_lock.h>
15#include <handlers/mode_manual.h>
16#include <handlers/net_settings.h>
17#include <handlers/ping.h>
18#include <handlers/run_manager.h>
19#include <handlers/sys.h>
20
21FLASHMEM void msg::handlers::DynamicRegistry::init(carrier::Carrier &c) {
22 using namespace net::auth;
23 using namespace msg::handlers;
24
25 // Stateless protocol basics
26 set("ping", 100, new PingRequestHandler{}, SecurityLevel::RequiresNothing);
27 set("help", 200, new HelpHandler(), SecurityLevel::RequiresNothing);
28
29 // Carrier and RunManager things
30 set("reset_circuit", 300, new ResetRequestHandler(c), SecurityLevel::RequiresLogin);
31 set("set_circuit", 400, new SetConfigMessageHandler(c), SecurityLevel::RequiresLogin);
32 set("get_circuit", 500, new GetConfigMessageHandler(c), SecurityLevel::RequiresLogin);
33 set("get_entities", 600, new GetEntitiesRequestHandler(c), SecurityLevel::RequiresLogin);
34 set("start_run", 700, new StartRunRequestHandler(), SecurityLevel::RequiresLogin);
35 set("stop_run", 780, new StopRunRequestHandler(), SecurityLevel::RequiresLogin);
36
37 // manual hardware access
38 set("one_shot_daq", 800, new OneshotDAQHandler(), SecurityLevel::RequiresNothing);
39 set("manual_mode", 900, new ManualControlHandler(), SecurityLevel::RequiresNothing);
40 set("overload_status", 1000, new GetOverloadStatusHandler(c), SecurityLevel::RequiresLogin);
41
42 set("net_get", 6000, new GetNetworkSettingsHandler(), SecurityLevel::RequiresAdmin);
43 set("net_set", 6100, new SetNetworkSettingsHandler(), SecurityLevel::RequiresAdmin);
44 set("net_reset", 6200, new ResetNetworkSettingsHandler(), SecurityLevel::RequiresAdmin);
45 set("net_status", 6300, new NetworkStatusHandler(), SecurityLevel::RequiresNothing);
46 // ^ this net_status won't contain sensitive information...
47
48 // set("status", 3000, new GetSystemStatus(), SecurityLevel::RequiresNothing);
49 set("login", 3100, new LoginHandler(), SecurityLevel::RequiresNothing);
50 set("lock_acquire", 3200, new LockAcquire(), SecurityLevel::RequiresLogin);
51 set("lock_release", 3300, new LockRelease(), SecurityLevel::RequiresLogin);
52
53 set("sys_ident", 3400, new GetSystemIdent(), SecurityLevel::RequiresNothing);
54 set("sys_reboot", 3500, new RebootHandler(), SecurityLevel::RequiresAdmin);
55 set("sys_log", 3600, new SyslogHandler(), SecurityLevel::RequiresLogin);
56 set("sys_stats", 3700, new SystemStats(), SecurityLevel::RequiresLogin);
57 set("sys_temperatures", 3800, new ReadTemperaturesHandler(c), SecurityLevel::RequiresLogin);
58
59 set("load_plugin", 4100, new LoadPluginHandler(), SecurityLevel::RequiresAdmin);
60 set("unload_plugin", 4200, new UnloadPluginHandler(), SecurityLevel::RequiresAdmin);
61
62 #ifdef ANABRID_WRITE_EEPROM
63 // these calls allow full client access to the MCU EEPROM (vendor stuff) and entitiy EEPROMs
64 set("sys_read_permanent", 4300, new ReadSystemIdent(), SecurityLevel::RequiresAdmin);
65 set("sys_reset_permanent", 4400, new ResetSystemIdent(), SecurityLevel::RequiresAdmin);
66 set("sys_write_permanent", 4500, new WriteSystemIdent(), SecurityLevel::RequiresAdmin);
67 #endif
68
69 set("ota_update_init", 5000, new FlasherInitHandler(), SecurityLevel::RequiresAdmin);
70 set("ota_update_stream", 5100, new FlasherDataHandler(), SecurityLevel::RequiresAdmin);
71 set("ota_update_abort", 5200, new FlasherAbortHandler(), SecurityLevel::RequiresAdmin);
72 set("ota_update_complete", 5300, new FlasherCompleteHandler(), SecurityLevel::RequiresAdmin);
73}
74
75FLASHMEM
76msg::handlers::MessageHandler *msg::handlers::DynamicRegistry::lookup(const std::string &msg_type) {
77 auto found = entries.find(msg_type);
78 if (found != entries.end()) {
79 return found->second.handler;
80 } else {
81 return nullptr;
82 }
83}
84
85FLASHMEM
86net::auth::SecurityLevel msg::handlers::DynamicRegistry::requiredClearance(const std::string &msg_type) {
87 auto found = entries.find(msg_type);
88 if (found != entries.end()) {
89 return found->second.clearance;
90 } else {
91 return net::auth::SecurityLevel::RequiresNothing;
92 }
93}
94
95FLASHMEM
96bool msg::handlers::DynamicRegistry::set(const std::string &msg_type, msg::handlers::MessageHandler *handler,
97 net::auth::SecurityLevel minimumClearance) {
98 return set(msg_type, result_code_counter, handler, minimumClearance);
99}
100
101FLASHMEM
102bool msg::handlers::DynamicRegistry::set(const std::string &msg_type, int result_code_prefix,
103 msg::handlers::MessageHandler *handler,
104 net::auth::SecurityLevel minimumClearance) {
105 auto found = entries.find(msg_type);
106 if (found != entries.end()) {
107 return false;
108 } else {
109 entries[msg_type] = msg::handlers::DynamicRegistry::RegistryEntry{handler, minimumClearance};
110 handler->result_prefix = result_code_prefix;
111 result_code_counter = result_code_prefix + result_code_increment;
112 return true;
113 }
114}
115
116FLASHMEM void msg::handlers::DynamicRegistry::dump() {
117 // TODO refactoring: fix with log
118 Serial.println("Registered message handlers (msg::handlers::DynamicRegistry): ");
119 for (auto const &kv : entries) {
120 Serial.print(kv.first.c_str());
121 if (!kv.second.handler)
122 Serial.print("(NULLPTR!)");
123 Serial.print(" ");
124 }
125 Serial.println("");
126 Serial.println("Registry clearance levels:");
127 for (auto const &kv : entries) {
128 Serial.print(kv.first.c_str());
129 Serial.print(":");
130 Serial.print((int)(kv.second.clearance));
131 Serial.print(" ");
132 }
133 Serial.println();
134}
135
136FLASHMEM void msg::handlers::DynamicRegistry::write_handler_names_to(JsonArray &target) {
137 for (auto const &kv : entries) {
138 if (kv.second.handler)
139 target.add(kv.first);
140 }
141}