From 3c72b6d089bf848f4e3e957c2eae0d42afe9bf5d Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 19 Feb 2026 16:06:01 +0100 Subject: [PATCH 1/7] Added the deleted content from code generation --- .../Packet_generation/DataTemplate.hpp | 18 +-- .../Packet_generation/OrderTemplate.hpp | 8 +- .../Packet_generation/Packet_descriptions.py | 42 ++++--- .../Packet_generation/Packet_generation.py | 56 +++++---- .../Examples/LinearSensorCharacterization.cpp | 115 +++++++++++++----- Core/Src/Runes/generated_metadata.cpp | 28 ++--- Tests/VirtualMCU | 1 + 7 files changed, 161 insertions(+), 107 deletions(-) create mode 160000 Tests/VirtualMCU diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 02030066..23cc3d9f 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -1,27 +1,27 @@ #pragma once #include "ST-LIB.hpp" -/*Data packets for {{board}} +/*Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY-*/ class DataPackets{ public: {% for enum in enums -%} - enum class {{enum.name}} : uint8_t + enum class {{enum.name}} : uint8_t { {%- for value in enum["values"] %} {{value}} = {{loop.index0}}, {%- endfor %} }; {% endfor %} - + {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) { {{packet.name}}_packet = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } - + {% endfor -%} - + public: {%for packet in packets -%} inline static HeapPacket *{{packet.name}}_packet{nullptr}; @@ -29,9 +29,9 @@ class DataPackets{ {% for socket in DatagramSockets -%} inline static {{socket.type}} *{{socket.name}}{nullptr}; {% endfor %} - + static void start() - { + { {% for packet in packets -%} if ({{packet.name}}_packet == nullptr) { ErrorHandler("Packet {{packet.name}} not initialized"); @@ -41,7 +41,7 @@ class DataPackets{ {% for socket in DatagramSockets -%} {{socket.name}} = new DatagramSocket("{{socket.board_ip}}",{{socket.port}},"{{socket.remote_ip}}",{{socket.port}}); {% endfor %} - + {%- for group in sending_packets %} Scheduler::register_task({% if group.period_type == "ms" %}{{ (group.period*1000)|round|int }}{% else %}{{ group.period|round|int }}{% endif %}, +[](){ {% for packet in group.packets -%} @@ -52,5 +52,5 @@ class DataPackets{ } - + }; diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 2ac2ced3..46bdd414 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -1,14 +1,14 @@ #pragma once #include "ST-LIB.hpp" -/*Order packets for {{board}} +/*Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- */ class OrderPackets{ public: {% for enum in enums -%} - enum class {{enum.name}} : uint8_t + enum class {{enum.name}} : uint8_t { {%- for value in enum["values"] %} {{value}} = {{loop.index0}}, @@ -25,7 +25,7 @@ class OrderPackets{ {% for packet in packets -%} inline static HeapOrder *{{packet.name}}_order{nullptr}; {% endfor %} - + {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) { @@ -63,4 +63,4 @@ class OrderPackets{ {{packet.name}}_flag = true; } {% endfor %} -}; +}; \ No newline at end of file diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 6399b6a8..241eb145 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -1,4 +1,4 @@ -import re +import re import json class BoardDescription: @@ -13,7 +13,7 @@ def __init__(self,name:str,board:dict,JSONpath:str): self.sockets=self.SocketsDescription(socks,self.ip) except Exception as e: raise Exception(f"Error in file {JSONpath}/boards/{name}/sockets.json: {e}") - #Packets: + #Packets: self.sending_packets = [] self.data_size =0 self.order_size =0 @@ -40,15 +40,15 @@ def __init__(self,name:str,board:dict,JSONpath:str): aux_sending= PacketDescription.check_for_sending(packet) if aux_sending is not None: self.sending_packets.append(aux_sending) - + if self.packets[packets_name][i].type != "order": self.data_size += 1 else: self.order_size += 1 i += 1 - + self.sending_packets = self.fix_sendind_packets(self.sending_packets) - + @staticmethod def fix_sendind_packets(sending_packets:list): fixed_packets = [] @@ -72,9 +72,9 @@ def fix_sendind_packets(sending_packets:list): fixed_packets.append(entry) return fixed_packets - - - + + + class SocketsDescription: def __init__(self,sockets:list,board_ip:str): self.allSockets=[] @@ -86,16 +86,16 @@ def __init__(self,sockets:list,board_ip:str): name = sock["name"].replace(" ", "_").replace("-", "_") sock_type = sock["type"] self.allSockets.append({"name": name,"type":sock_type}) - + if sock_type == "ServerSocket": self.ServerSockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "port": sock["port"]}) elif sock_type == "Socket": self.Sockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "local_port": sock["local_port"], "remote_ip": sock["remote_ip"], "remote_port": sock["remote_port"]}) elif sock_type == "DatagramSocket": self.DatagramSockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "port": sock["port"],"remote_ip":sock["remote_ip"]}) + - - + class PacketDescription: def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): self.id =packet["id"] @@ -108,13 +108,13 @@ def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): for variable in packet["variables"]: self.variables.append(variable) self.measurements.append(MeasurmentsDescription(measurements,variable, filename)) - + @staticmethod def check_for_sending(packet:dict): if "period" in packet and "period_type" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") return {"name": name,"period": packet["period"],"period_type":packet["period_type"],"socket": packet["socket"]} - + elif "period_ms" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") return {"name": name,"period": packet["period_ms"],"period_type":"ms","socket": packet["socket"]} @@ -126,11 +126,11 @@ def __init__(self,measurements:list, variable:str, filename:str="Unknown"): if not hasattr(self.__class__, 'viewed_measurements'): self.__class__.viewed_measurements = {} measurement = self._MeasurementSearch(measurements,variable) - + if measurement is None: print(f"Measurement not found for variable: {variable} in file: {filename}\n") raise Exception(f"Measurement not found for variable: {variable} in file: {filename}") - + self.name = measurement["name"] self.type = (self._unsigned_int_correction(measurement["type"]).replace(" ", "_").replace("-", "_")) if self.type == "enum": @@ -145,8 +145,8 @@ def _Enum_values_correction(values:list): for i in range(len(values)): values[i] = values[i].replace(" ", "_").replace("-", "_") return values - - + + @staticmethod def _MeasurementSearch(measurements:list, variable:str): if variable in MeasurmentsDescription.viewed_measurements: @@ -157,8 +157,8 @@ def _MeasurementSearch(measurements:list, variable:str): MeasurmentsDescription.viewed_measurements[variable] = measurment return measurment return None - - + + @staticmethod def _unsigned_int_correction(type:str): aux_type = type[:4] @@ -166,4 +166,6 @@ def _unsigned_int_correction(type:str): type += "_t" elif type == "float32": type = "float" - return type + elif type == "float64": + type = "double" + return type \ No newline at end of file diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index d852d367..f554949b 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -6,7 +6,7 @@ templates_path = "Core/Inc/Code_generation/Packet_generation" -def Generate_PacketDescription(JSONpath:str,board:str): +def Generate_PacketDescription(JSONpath:str,board:str): with open(JSONpath+"/boards.json") as f: boards = json.load(f) boards_name = [] @@ -20,9 +20,9 @@ def Generate_PacketDescription(JSONpath:str,board:str): else: print(f"Board {board} not found, exiting...") sys.exit() - + return boards_name - + #--------------DataPackets.hpp generation---------------# @@ -36,8 +36,8 @@ def GenerateDataEnum(board:BoardDescription): if hasattr(measurement, "enum")and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums - - + + def GenerateDataPackets(board:BoardDescription): Packets =[] totaldata = [] @@ -50,10 +50,10 @@ def GenerateDataPackets(board:BoardDescription): tempdata +=(str(variable) +",") tempdata_but_pointer +=("&"+str(variable) +",") if tempdata.endswith(","): - tempdata = tempdata[:-1] + tempdata = tempdata[:-1] if tempdata_but_pointer.endswith(","): tempdata_but_pointer = tempdata_but_pointer[:-1] - + packet_variables = [] for measurement in packet_instance.measurements: packet_variables.append({ @@ -67,11 +67,11 @@ def GenerateDataPackets(board:BoardDescription): aux_data = {"type": measurement.type, "name": measurement.id.replace(" ", "_").replace("-", "_")} if not any(x["name"] == aux_data["name"] for x in totaldata): totaldata.append(aux_data) - + return Packets,totaldata - + packets,data = GenerateDataPackets(board) - + def GenerateGroupedSendingPackets(board: BoardDescription): datagram_sockets = [s["name"] for s in board.sockets.DatagramSockets] grouped_lookup = {} @@ -84,17 +84,17 @@ def GenerateGroupedSendingPackets(board: BoardDescription): period = packet["period"] period_type = packet["period_type"] names = packet["name"] - + key = (period, period_type) if key not in grouped_lookup: grouped_lookup[key] = [] - + if isinstance(names, list): for name in names: grouped_lookup[key].append({"socket": socket_name, "name": name}) else: grouped_lookup[key].append({"socket": socket_name, "name": names}) - + grouped_list = [] for (period, period_type), items in grouped_lookup.items(): grouped_list.append({ @@ -123,16 +123,16 @@ def Generate_DataPackets_hpp(board_input:str): if board_instance.data_size == 0: if os.path.exists(data_packets_path): os.remove(data_packets_path) - return - + return + env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("DataTemplate.hpp") context = Get_data_context(board_instance) - + with open(data_packets_path,"w") as Output: Output.write(template.render(context)) - + #--------------OrderPackets.hpp generation---------------# def Get_order_context(board:BoardDescription): @@ -145,8 +145,8 @@ def GenerateOrderEnum(board:BoardDescription): if hasattr(measurement, "enum") and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums - - + + def GenerateOrderPackets(board:BoardDescription): Packets =[] totaldata = [] @@ -159,8 +159,8 @@ def GenerateOrderPackets(board:BoardDescription): tempdata +=(str(variable) +",") tempdata_but_pointer +=("&"+str(variable) +",") if tempdata.endswith(","): - tempdata = tempdata[:-1] - tempdata_but_pointer = tempdata_but_pointer[:-1] + tempdata = tempdata[:-1] + tempdata_but_pointer = tempdata_but_pointer[:-1] packet_variables = [] for measurement in packet_instance.measurements: @@ -175,10 +175,10 @@ def GenerateOrderPackets(board:BoardDescription): aux_data = {"type": measurement.type, "name": measurement.id} if not any(x["name"] == aux_data["name"] for x in totaldata): totaldata.append(aux_data) - + return Packets,totaldata - - + + packets,data = GenerateOrderPackets(board) context = { "board": board.name, @@ -197,12 +197,14 @@ def Generate_OrderPackets_hpp(board_input:str): if board_instance.order_size == 0: if os.path.exists(order_packets_path): os.remove(order_packets_path) - return - + return + env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("OrderTemplate.hpp") context = Get_order_context(board_instance) - + with open(order_packets_path,"w") as Output: Output.write(template.render(context)) + + diff --git a/Core/Src/Examples/LinearSensorCharacterization.cpp b/Core/Src/Examples/LinearSensorCharacterization.cpp index df810a81..df73bd81 100644 --- a/Core/Src/Examples/LinearSensorCharacterization.cpp +++ b/Core/Src/Examples/LinearSensorCharacterization.cpp @@ -1,57 +1,106 @@ #ifdef EXAMPLE_LINEAR_SENSOR_CHARACTERIZATION +#include "Communications/Packets/DataPackets.hpp" +#include "Communications/Packets/OrderPackets.hpp" #include "ST-LIB.hpp" #include "main.h" using namespace ST_LIB; -constexpr auto led = ST_LIB::DigitalOutputDomain::DigitalOutput(ST_LIB::PB0); +double slope{1.0}; +double offset{0.0}; + +double value{0.0}; +double sensor_value{0.0}; + +double real_value{0.0}; + +constinit float raw_value{0.0f}; +constexpr auto sensor = ADCDomain::ADC(ST_LIB::PA0, raw_value, ADCDomain::Resolution::BITS_16, + ADCDomain::SampleTime::CYCLES_8_5); -#ifdef STLIB_ETH #if defined(USE_PHY_LAN8742) -constexpr auto eth = EthernetDomain::Ethernet( - EthernetDomain::PINSET_H10, - "00:80:e1:00:01:07", - "192.168.1.7", - "255.255.0.0" -); +constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H10, "00:80:e1:00:01:07", + "192.168.1.7", "255.255.0.0"); #elif defined(USE_PHY_LAN8700) -constexpr auto eth = EthernetDomain::Ethernet( - EthernetDomain::PINSET_H10, - "00:80:e1:00:01:07", - "192.168.1.7", - "255.255.0.0" -); +constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H10, "00:80:e1:00:01:07", + "192.168.1.7", "255.255.0.0"); #elif defined(USE_PHY_KSZ8041) -constexpr auto eth = EthernetDomain::Ethernet( - EthernetDomain::PINSET_H11, - "00:80:e1:00:01:07", - "192.168.1.7", - "255.255.0.0" -); +constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H11, "00:80:e1:00:01:07", + "192.168.1.7", "255.255.0.0"); #else #error "No PHY selected for Ethernet pinset selection" #endif -using ExampleEthernetBoard = ST_LIB::Board; -#else -using ExampleEthernetBoard = ST_LIB::Board; -#endif +using ExampleEthernetBoard = ST_LIB::Board; + +extern "C" void Error_Handler(void) { + ErrorHandler("HAL error handler triggered"); + while (1) { + } +} + +void characterize(float raw, double read) { + // Incremental OLS accumulators for y = slope * x + offset. + static uint64_t sample_count{0}; + static double sum_x{0.0}; + static double sum_y{0.0}; + static double sum_xx{0.0}; + static double sum_xy{0.0}; + + const double x = static_cast(raw); + const double y = read; + + ++sample_count; + sum_x += x; + sum_y += y; + sum_xx += x * x; + sum_xy += x * y; + + if (sample_count < 2) { + offset = y - (slope * x); + return; + } + + const double n = static_cast(sample_count); + const double denominator = (n * sum_xx) - (sum_x * sum_x); + if (denominator == 0.0) { + return; + } + + slope = ((n * sum_xy) - (sum_x * sum_y)) / denominator; + offset = (sum_y - (slope * sum_x)) / n; +} int main(void) { Hard_fault_check(); - ExampleEthernetBoard::init(); -#ifdef STLIB_ETH + + Scheduler::start(); + // Comms + OrderPackets::characterize_init(real_value); + DataPackets::characterization_init(slope, offset); + DataPackets::Value_init(sensor_value, value); + DataPackets::start(); + + OrderPackets::start(); + + // Instances auto& eth_instance = ExampleEthernetBoard::instance_of(); -#endif - auto& led_instance = ExampleEthernetBoard::instance_of(); + auto& sensor_instance = ExampleEthernetBoard::instance_of(); - led_instance.turn_on(); while (1) { -#ifdef STLIB_ETH eth_instance.update(); -#endif + Scheduler::update(); + + sensor_instance.read(); + sensor_value = static_cast(raw_value); + value = slope * sensor_value + offset; + + if (OrderPackets::characterize_flag) { + OrderPackets::characterize_flag = false; + characterize(raw_value, real_value); + DataPackets::packets_socket->send_packet(*DataPackets::characterization_packet); + } } } - -#endif // EXAMPLE_LINEAR_SENSOR_CHARACTERIZATION +#endif \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 6350bc43..50751003 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -1,15 +1,15 @@ /* - * AUTOGENERATED FILE - * DO NOT MODIFY MANUALLY!!! - */ -extern "C" { -const char DESCRIPTION[255] __attribute__((section(".metadata_pool"))) = - "****************" // placeholder for beggining - "20260206T223828" // DateTime using ISO-8601 format - " " // alignment - "dcf817b3" // STLIB commit - "--------" // ADJ commit - "4b3d0ec4" // Board commit - // the '=' is used for unparsing - ; -} +* AUTOGENERATED FILE +* DO NOT MODIFY MANUALLY!!! +*/ +extern "C"{ + const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= + "****************" // placeholder for beggining + "20260218T203535" // DateTime using ISO-8601 format + " " // alignment + "019403b6" // STLIB commit + "--------" // ADJ commit + "9c87b508" // Board commit + // the '=' is used for unparsing + ; +} \ No newline at end of file diff --git a/Tests/VirtualMCU b/Tests/VirtualMCU new file mode 160000 index 00000000..fac66f1b --- /dev/null +++ b/Tests/VirtualMCU @@ -0,0 +1 @@ +Subproject commit fac66f1bfa86e65c0a7845f31b36dec31b61ccbf From d146bfb747b206fe8b0c5f31686b74548f6b54c3 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:11:56 +0100 Subject: [PATCH 2/7] Now cmake doesnt store cache for the board variable and virtual mcu is deleted --- .gitmodules | 2 +- CMakeLists.txt | 2 +- Core/Inc/Code_generation/JSON_ADE | 2 +- Tests/VirtualMCU | 1 - state_machine.json | 122 ------------------------------ 5 files changed, 3 insertions(+), 126 deletions(-) delete mode 160000 Tests/VirtualMCU delete mode 100644 state_machine.json diff --git a/.gitmodules b/.gitmodules index 0b66075b..bcaf5f3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/HyperloopUPV-H8/ST-LIB [submodule "Core/Inc/Communications/JSON_ADE"] path = Core/Inc/Code_generation/JSON_ADE - url = https://github.com/HyperloopUPV-H8/JSON_ADE + url = https://github.com/HyperloopUPV-H8/adj diff --git a/CMakeLists.txt b/CMakeLists.txt index c1d122ca..04a60269 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include(CTest) enable_testing() set(EXECUTABLE ${PROJECT_NAME}.elf) -set(BOARD_NAME "TEST" CACHE STRING "Board key from Core/Inc/Code_generation/JSON_ADE/boards.json") +set(BOARD_NAME "VCU" CACHE STRING "Board key from Core/Inc/Code_generation/JSON_ADE/boards.json" FORCE) if(BOARD_NAME STREQUAL "") message(FATAL_ERROR "BOARD_NAME cannot be empty") endif() diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index a25030fe..ee857f81 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit a25030fe85f30b7133e4e449847968bdcd856833 +Subproject commit ee857f81e0aef674a19f8fc5db4a2d3c28a75a51 diff --git a/Tests/VirtualMCU b/Tests/VirtualMCU deleted file mode 160000 index fac66f1b..00000000 --- a/Tests/VirtualMCU +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fac66f1bfa86e65c0a7845f31b36dec31b61ccbf diff --git a/state_machine.json b/state_machine.json deleted file mode 100644 index 3aabd215..00000000 --- a/state_machine.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "name" : "Example", - - "states" : [ - "name_1", - { - "name" : "Nested", - "nested_to" : "name_1", - "sub-states":[ - "nested_name_1", - "nested_name_2" - ] - }, - "name_2" - ], - - "transitions" : [ - { - "from_state" : "name_1", - "to_state" : "name_2", - "transition_name": "from_1_to_2" - }, - { - "from_state" : "name_1", - "to_state" : "name_2", - "transition_name": "from_1_to_2", - "description" : "Transitioning from 1 to 2" - }, - { - "from_state" : "name_1", - "to_state" : { - "name" : "Nested", - "sub-state" : "nested_name_1" - }, - "transition_name": "from_1_to_nested_1" - } - ], - - "actions" : { - "enter" : [ - { - "state" : "name_1", - "state_actions" : [ - "enter_action_1", - "enter_action_2" - ] - }, - { - "state" : "name_2", - "state_actions" : [ - { - "name" : "enter_action_3", - "description" : "Description of enter_action_3" - }, - "enter_action_4" - ] - } - ], - - "cyclic" : { - "low_precision" : [ - { - "states" : [ - "name_1", - "name_2" - ], - "state_actions" : [ - { - "action_name" : "low_precision_action", - "action_period" : "30ms" - } - ] - } - ], - "mid_precision" : [ - { - "states" : [ - "name_1", - { - "name" : "Nested", - "sub-state" : "nested_name_1" - } - ], - "state_actions" : [ - { - "action_name" : "mid_precision_action_to_nested_state", - "action_period" : "60ms" - } - ] - } - ], - "high_precision" : [ - { - "states" : [ - "name_1", - "name_2" - ], - "state_actions" : [ - { - "action_name" : "high_precision_action_with_description", - "action_period" : "90ms", - "description" : "Cyclic action example with description" - } - ] - } - ] - }, - - "exit" : [ - { - "state" : { - "name" : "Nested", - "sub-state" : "nested_name_2" - }, - "state_actions" : [ - "exit_action_1", - "exit_action_2" - ] - } - ] - } -} From f98fd6d27cca3ec1c7ad365fa7fc8721e6fb667d Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:20:14 +0100 Subject: [PATCH 3/7] Formating stuff --- .../Packet_generation/DataTemplate.hpp | 18 ++-- .../Packet_generation/OrderTemplate.hpp | 8 +- .../Packet_generation/Packet_descriptions.py | 62 +++++++------- .../Packet_generation/Packet_generation.py | 82 +++++++++---------- .../Examples/LinearSensorCharacterization.cpp | 34 ++++++-- Core/Src/Runes/generated_metadata.cpp | 28 +++---- 6 files changed, 123 insertions(+), 109 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 23cc3d9f..02030066 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -1,27 +1,27 @@ #pragma once #include "ST-LIB.hpp" -/*Data packets for {{board}} +/*Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY-*/ class DataPackets{ public: {% for enum in enums -%} - enum class {{enum.name}} : uint8_t + enum class {{enum.name}} : uint8_t { {%- for value in enum["values"] %} {{value}} = {{loop.index0}}, {%- endfor %} }; {% endfor %} - + {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) { {{packet.name}}_packet = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } - + {% endfor -%} - + public: {%for packet in packets -%} inline static HeapPacket *{{packet.name}}_packet{nullptr}; @@ -29,9 +29,9 @@ class DataPackets{ {% for socket in DatagramSockets -%} inline static {{socket.type}} *{{socket.name}}{nullptr}; {% endfor %} - + static void start() - { + { {% for packet in packets -%} if ({{packet.name}}_packet == nullptr) { ErrorHandler("Packet {{packet.name}} not initialized"); @@ -41,7 +41,7 @@ class DataPackets{ {% for socket in DatagramSockets -%} {{socket.name}} = new DatagramSocket("{{socket.board_ip}}",{{socket.port}},"{{socket.remote_ip}}",{{socket.port}}); {% endfor %} - + {%- for group in sending_packets %} Scheduler::register_task({% if group.period_type == "ms" %}{{ (group.period*1000)|round|int }}{% else %}{{ group.period|round|int }}{% endif %}, +[](){ {% for packet in group.packets -%} @@ -52,5 +52,5 @@ class DataPackets{ } - + }; diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 46bdd414..2ac2ced3 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -1,14 +1,14 @@ #pragma once #include "ST-LIB.hpp" -/*Order packets for {{board}} +/*Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- */ class OrderPackets{ public: {% for enum in enums -%} - enum class {{enum.name}} : uint8_t + enum class {{enum.name}} : uint8_t { {%- for value in enum["values"] %} {{value}} = {{loop.index0}}, @@ -25,7 +25,7 @@ class OrderPackets{ {% for packet in packets -%} inline static HeapOrder *{{packet.name}}_order{nullptr}; {% endfor %} - + {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) { @@ -63,4 +63,4 @@ class OrderPackets{ {{packet.name}}_flag = true; } {% endfor %} -}; \ No newline at end of file +}; diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 241eb145..c4986763 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -1,4 +1,4 @@ -import re +import re import json class BoardDescription: @@ -13,10 +13,10 @@ def __init__(self,name:str,board:dict,JSONpath:str): self.sockets=self.SocketsDescription(socks,self.ip) except Exception as e: raise Exception(f"Error in file {JSONpath}/boards/{name}/sockets.json: {e}") - #Packets: + #Packets: self.sending_packets = [] - self.data_size =0 - self.order_size =0 + self.data_size = 0 + self.order_size = 0 self.measurement_lists = [] self.packets = {} for measurement in board["measurements"]: @@ -40,15 +40,15 @@ def __init__(self,name:str,board:dict,JSONpath:str): aux_sending= PacketDescription.check_for_sending(packet) if aux_sending is not None: self.sending_packets.append(aux_sending) - + if self.packets[packets_name][i].type != "order": self.data_size += 1 else: self.order_size += 1 i += 1 - + self.sending_packets = self.fix_sendind_packets(self.sending_packets) - + @staticmethod def fix_sendind_packets(sending_packets:list): fixed_packets = [] @@ -60,11 +60,11 @@ def fix_sendind_packets(sending_packets:list): period_type = item.get("period_type") socket = item.get("socket") name = item.get("name") - key = (period,period_type, socket) + key = (period, period_type, socket) lookup.setdefault(key, []).append(name) - for (period,period_type, socket), names in lookup.items(): - entry = {"period": period,"period_type":period_type, "socket": socket} + for (period, period_type, socket), names in lookup.items(): + entry = {"period": period, "period_type": period_type, "socket": socket} if len(names) == 1: entry["name"] = names[0] else: @@ -72,12 +72,12 @@ def fix_sendind_packets(sending_packets:list): fixed_packets.append(entry) return fixed_packets - - - + + + class SocketsDescription: - def __init__(self,sockets:list,board_ip:str): - self.allSockets=[] + def __init__(self, sockets: list, board_ip: str): + self.allSockets = [] self.ServerSockets = [] self.Sockets = [] self.DatagramSockets = [] @@ -85,17 +85,17 @@ def __init__(self,sockets:list,board_ip:str): for sock in sockets: name = sock["name"].replace(" ", "_").replace("-", "_") sock_type = sock["type"] - self.allSockets.append({"name": name,"type":sock_type}) - + self.allSockets.append({"name": name, "type": sock_type}) + if sock_type == "ServerSocket": - self.ServerSockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "port": sock["port"]}) + self.ServerSockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "port": sock["port"]}) elif sock_type == "Socket": - self.Sockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "local_port": sock["local_port"], "remote_ip": sock["remote_ip"], "remote_port": sock["remote_port"]}) + self.Sockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "local_port": sock["local_port"], "remote_ip": sock["remote_ip"], "remote_port": sock["remote_port"]}) elif sock_type == "DatagramSocket": - self.DatagramSockets.append({"name": name,"type":sock_type,"board_ip":self.board_ip, "port": sock["port"],"remote_ip":sock["remote_ip"]}) - + self.DatagramSockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "port": sock["port"], "remote_ip": sock["remote_ip"]}) + + - class PacketDescription: def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): self.id =packet["id"] @@ -108,13 +108,13 @@ def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): for variable in packet["variables"]: self.variables.append(variable) self.measurements.append(MeasurmentsDescription(measurements,variable, filename)) - + @staticmethod def check_for_sending(packet:dict): if "period" in packet and "period_type" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") return {"name": name,"period": packet["period"],"period_type":packet["period_type"],"socket": packet["socket"]} - + elif "period_ms" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") return {"name": name,"period": packet["period_ms"],"period_type":"ms","socket": packet["socket"]} @@ -126,11 +126,11 @@ def __init__(self,measurements:list, variable:str, filename:str="Unknown"): if not hasattr(self.__class__, 'viewed_measurements'): self.__class__.viewed_measurements = {} measurement = self._MeasurementSearch(measurements,variable) - + if measurement is None: print(f"Measurement not found for variable: {variable} in file: {filename}\n") raise Exception(f"Measurement not found for variable: {variable} in file: {filename}") - + self.name = measurement["name"] self.type = (self._unsigned_int_correction(measurement["type"]).replace(" ", "_").replace("-", "_")) if self.type == "enum": @@ -145,8 +145,8 @@ def _Enum_values_correction(values:list): for i in range(len(values)): values[i] = values[i].replace(" ", "_").replace("-", "_") return values - - + + @staticmethod def _MeasurementSearch(measurements:list, variable:str): if variable in MeasurmentsDescription.viewed_measurements: @@ -157,8 +157,8 @@ def _MeasurementSearch(measurements:list, variable:str): MeasurmentsDescription.viewed_measurements[variable] = measurment return measurment return None - - + + @staticmethod def _unsigned_int_correction(type:str): aux_type = type[:4] @@ -168,4 +168,4 @@ def _unsigned_int_correction(type:str): type = "float" elif type == "float64": type = "double" - return type \ No newline at end of file + return type diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index f554949b..c5e73203 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -6,7 +6,7 @@ templates_path = "Core/Inc/Code_generation/Packet_generation" -def Generate_PacketDescription(JSONpath:str,board:str): +def Generate_PacketDescription(JSONpath:str,board:str): with open(JSONpath+"/boards.json") as f: boards = json.load(f) boards_name = [] @@ -20,9 +20,9 @@ def Generate_PacketDescription(JSONpath:str,board:str): else: print(f"Board {board} not found, exiting...") sys.exit() - + return boards_name - + #--------------DataPackets.hpp generation---------------# @@ -36,10 +36,10 @@ def GenerateDataEnum(board:BoardDescription): if hasattr(measurement, "enum")and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums - - - def GenerateDataPackets(board:BoardDescription): - Packets =[] + + + def GenerateDataPackets(board: BoardDescription): + Packets = [] totaldata = [] for packet in board.packets: for packet_instance in board.packets[packet]: @@ -47,13 +47,13 @@ def GenerateDataPackets(board:BoardDescription): tempdata = "" tempdata_but_pointer = "" for variable in packet_instance.variables: - tempdata +=(str(variable) +",") - tempdata_but_pointer +=("&"+str(variable) +",") + tempdata += (str(variable) + ",") + tempdata_but_pointer += ("&" + str(variable) + ",") if tempdata.endswith(","): - tempdata = tempdata[:-1] + tempdata = tempdata[:-1] if tempdata_but_pointer.endswith(","): tempdata_but_pointer = tempdata_but_pointer[:-1] - + packet_variables = [] for measurement in packet_instance.measurements: packet_variables.append({ @@ -61,17 +61,17 @@ def GenerateDataPackets(board:BoardDescription): "type": measurement.type }) - aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer.replace(" ", "_").replace("-", "_") , "id": packet_instance.id, "variables": packet_variables} + aux_packet = {"name": packet_instance.name, "data": tempdata_but_pointer.replace(" ", "_").replace("-", "_"), "id": packet_instance.id, "variables": packet_variables} Packets.append(aux_packet) for measurement in packet_instance.measurements: aux_data = {"type": measurement.type, "name": measurement.id.replace(" ", "_").replace("-", "_")} if not any(x["name"] == aux_data["name"] for x in totaldata): totaldata.append(aux_data) - + return Packets,totaldata - + packets,data = GenerateDataPackets(board) - + def GenerateGroupedSendingPackets(board: BoardDescription): datagram_sockets = [s["name"] for s in board.sockets.DatagramSockets] grouped_lookup = {} @@ -84,17 +84,17 @@ def GenerateGroupedSendingPackets(board: BoardDescription): period = packet["period"] period_type = packet["period_type"] names = packet["name"] - + key = (period, period_type) if key not in grouped_lookup: grouped_lookup[key] = [] - + if isinstance(names, list): for name in names: grouped_lookup[key].append({"socket": socket_name, "name": name}) else: grouped_lookup[key].append({"socket": socket_name, "name": names}) - + grouped_list = [] for (period, period_type), items in grouped_lookup.items(): grouped_list.append({ @@ -123,20 +123,20 @@ def Generate_DataPackets_hpp(board_input:str): if board_instance.data_size == 0: if os.path.exists(data_packets_path): os.remove(data_packets_path) - return - + return + env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("DataTemplate.hpp") context = Get_data_context(board_instance) - + with open(data_packets_path,"w") as Output: Output.write(template.render(context)) - + #--------------OrderPackets.hpp generation---------------# -def Get_order_context(board:BoardDescription): - def GenerateOrderEnum(board:BoardDescription): +def Get_order_context(board: BoardDescription): + def GenerateOrderEnum(board: BoardDescription): Enums = [] for packet in board.packets: for packet_instance in board.packets[packet]: @@ -145,10 +145,9 @@ def GenerateOrderEnum(board:BoardDescription): if hasattr(measurement, "enum") and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums - - - def GenerateOrderPackets(board:BoardDescription): - Packets =[] + + def GenerateOrderPackets(board: BoardDescription): + Packets = [] totaldata = [] for packet in board.packets: for packet_instance in board.packets[packet]: @@ -156,11 +155,11 @@ def GenerateOrderPackets(board:BoardDescription): tempdata = "" tempdata_but_pointer = "" for variable in packet_instance.variables: - tempdata +=(str(variable) +",") - tempdata_but_pointer +=("&"+str(variable) +",") + tempdata += (str(variable) + ",") + tempdata_but_pointer += ("&" + str(variable) + ",") if tempdata.endswith(","): - tempdata = tempdata[:-1] - tempdata_but_pointer = tempdata_but_pointer[:-1] + tempdata = tempdata[:-1] + tempdata_but_pointer = tempdata_but_pointer[:-1] packet_variables = [] for measurement in packet_instance.measurements: @@ -169,17 +168,16 @@ def GenerateOrderPackets(board:BoardDescription): "type": measurement.type }) - aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer , "id": packet_instance.id, "variables": packet_variables} + aux_packet = {"name": packet_instance.name, "data": tempdata_but_pointer, "id": packet_instance.id, "variables": packet_variables} Packets.append(aux_packet) for measurement in packet_instance.measurements: - aux_data = {"type": measurement.type, "name": measurement.id} + aux_data = {"type": measurement.type, "name": measurement.name} if not any(x["name"] == aux_data["name"] for x in totaldata): totaldata.append(aux_data) - - return Packets,totaldata - - - packets,data = GenerateOrderPackets(board) + + return Packets, totaldata + + packets, data = GenerateOrderPackets(board) context = { "board": board.name, "enums": GenerateOrderEnum(board), @@ -197,13 +195,13 @@ def Generate_OrderPackets_hpp(board_input:str): if board_instance.order_size == 0: if os.path.exists(order_packets_path): os.remove(order_packets_path) - return - + return + env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("OrderTemplate.hpp") context = Get_order_context(board_instance) - + with open(order_packets_path,"w") as Output: Output.write(template.render(context)) diff --git a/Core/Src/Examples/LinearSensorCharacterization.cpp b/Core/Src/Examples/LinearSensorCharacterization.cpp index df73bd81..eb312383 100644 --- a/Core/Src/Examples/LinearSensorCharacterization.cpp +++ b/Core/Src/Examples/LinearSensorCharacterization.cpp @@ -16,18 +16,34 @@ double sensor_value{0.0}; double real_value{0.0}; constinit float raw_value{0.0f}; -constexpr auto sensor = ADCDomain::ADC(ST_LIB::PA0, raw_value, ADCDomain::Resolution::BITS_16, - ADCDomain::SampleTime::CYCLES_8_5); +constexpr auto sensor = ADCDomain::ADC( + ST_LIB::PA0, + raw_value, + ADCDomain::Resolution::BITS_16, + ADCDomain::SampleTime::CYCLES_8_5 +); #if defined(USE_PHY_LAN8742) -constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H10, "00:80:e1:00:01:07", - "192.168.1.7", "255.255.0.0"); +constexpr auto eth = EthernetDomain::Ethernet( + EthernetDomain::PINSET_H10, + "00:80:e1:00:01:07", + "192.168.1.7", + "255.255.0.0" +); #elif defined(USE_PHY_LAN8700) -constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H10, "00:80:e1:00:01:07", - "192.168.1.7", "255.255.0.0"); +constexpr auto eth = EthernetDomain::Ethernet( + EthernetDomain::PINSET_H10, + "00:80:e1:00:01:07", + "192.168.1.7", + "255.255.0.0" +); #elif defined(USE_PHY_KSZ8041) -constexpr auto eth = EthernetDomain::Ethernet(EthernetDomain::PINSET_H11, "00:80:e1:00:01:07", - "192.168.1.7", "255.255.0.0"); +constexpr auto eth = EthernetDomain::Ethernet( + EthernetDomain::PINSET_H11, + "00:80:e1:00:01:07", + "192.168.1.7", + "255.255.0.0" +); #else #error "No PHY selected for Ethernet pinset selection" #endif @@ -103,4 +119,4 @@ int main(void) { } } } -#endif \ No newline at end of file +#endif diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 50751003..ca034a4a 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -1,15 +1,15 @@ /* -* AUTOGENERATED FILE -* DO NOT MODIFY MANUALLY!!! -*/ -extern "C"{ - const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= - "****************" // placeholder for beggining - "20260218T203535" // DateTime using ISO-8601 format - " " // alignment - "019403b6" // STLIB commit - "--------" // ADJ commit - "9c87b508" // Board commit - // the '=' is used for unparsing - ; -} \ No newline at end of file + * AUTOGENERATED FILE + * DO NOT MODIFY MANUALLY!!! + */ +extern "C" { +const char DESCRIPTION[255] __attribute__((section(".metadata_pool"))) = + "****************" // placeholder for beggining + "20260218T203535" // DateTime using ISO-8601 format + " " // alignment + "019403b6" // STLIB commit + "--------" // ADJ commit + "9c87b508" // Board commit + // the '=' is used for unparsing + ; +} From f447c3a267b122e9ce090a94d80dea9ceee758d9 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:23:29 +0100 Subject: [PATCH 4/7] Packet generation formating fix? --- .../Code_generation/Packet_generation/Packet_generation.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index c5e73203..b4e1b7cf 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -200,9 +200,8 @@ def Generate_OrderPackets_hpp(board_input:str): env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("OrderTemplate.hpp") context = Get_order_context(board_instance) + with open(order_packets_path, "w") as Output: + Output.write(template.render(context)) - with open(order_packets_path,"w") as Output: - Output.write(template.render(context)) - From c4de18b3f52da171018ed113e52cdd7962dff38a Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:26:50 +0100 Subject: [PATCH 5/7] Que divertido el formating check, me encanta la better developer experience --- .../Code_generation/Packet_generation/Packet_generation.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index b4e1b7cf..0bca5338 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -200,8 +200,6 @@ def Generate_OrderPackets_hpp(board_input:str): env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) template = env.get_template("OrderTemplate.hpp") context = Get_order_context(board_instance) - with open(order_packets_path, "w") as Output: - Output.write(template.render(context)) - - + with open(order_packets_path, "w") as Output: + Output.write(template.render(context)) From d3cefb237354a294196075bc00b3c09abdb523ec Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:31:38 +0100 Subject: [PATCH 6/7] No more period_ms use allowed --- .../Packet_generation/Packet_descriptions.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index c4986763..61ca0c87 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -110,14 +110,11 @@ def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): self.measurements.append(MeasurmentsDescription(measurements,variable, filename)) @staticmethod - def check_for_sending(packet:dict): + def check_for_sending(packet: dict): if "period" in packet and "period_type" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") - return {"name": name,"period": packet["period"],"period_type":packet["period_type"],"socket": packet["socket"]} + return {"name": name, "period": packet["period"], "period_type": packet["period_type"], "socket": packet["socket"]} - elif "period_ms" in packet and "socket" in packet: - name = packet["name"].replace(" ", "_").replace("-", "_") - return {"name": name,"period": packet["period_ms"],"period_type":"ms","socket": packet["socket"]} else: return None class MeasurmentsDescription: From 9e15d3cbb4ee954f3d290c689fce39f88f6f536c Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 22 Feb 2026 20:53:31 +0100 Subject: [PATCH 7/7] Now "backend" can be used as a valid ip for socket declaration. Now using "backend" as an ip uses the backend ip in general_info.json --- .../Packet_generation/Packet_descriptions.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 61ca0c87..2b429415 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -6,11 +6,22 @@ def __init__(self,name:str,board:dict,JSONpath:str): self.name = name self.id = board["board_id"] self.ip = board["board_ip"] + + # Load backend IP from general_info.json + backend_ip = "0.0.0.0" + try: + with open(JSONpath + "/general_info.json") as f: + general_info = json.load(f) + if "addresses" in general_info and "backend" in general_info["addresses"]: + backend_ip = general_info["addresses"]["backend"] + except Exception as e: + print(f"Warning: Could not load backend IP from general_info.json: {e}") + #Sockets: try: with open(JSONpath+"/boards/"+name+"/sockets.json") as s: socks = json.load(s) - self.sockets=self.SocketsDescription(socks,self.ip) + self.sockets = self.SocketsDescription(socks, self.ip, backend_ip) except Exception as e: raise Exception(f"Error in file {JSONpath}/boards/{name}/sockets.json: {e}") #Packets: @@ -76,12 +87,13 @@ def fix_sendind_packets(sending_packets:list): class SocketsDescription: - def __init__(self, sockets: list, board_ip: str): + def __init__(self, sockets: list, board_ip: str, backend_ip: str): self.allSockets = [] self.ServerSockets = [] self.Sockets = [] self.DatagramSockets = [] self.board_ip = board_ip + self.backend_ip = backend_ip for sock in sockets: name = sock["name"].replace(" ", "_").replace("-", "_") sock_type = sock["type"] @@ -90,9 +102,15 @@ def __init__(self, sockets: list, board_ip: str): if sock_type == "ServerSocket": self.ServerSockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "port": sock["port"]}) elif sock_type == "Socket": - self.Sockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "local_port": sock["local_port"], "remote_ip": sock["remote_ip"], "remote_port": sock["remote_port"]}) + remote_ip = sock["remote_ip"] + if remote_ip == "backend": + remote_ip = self.backend_ip + self.Sockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "local_port": sock["local_port"], "remote_ip": remote_ip, "remote_port": sock["remote_port"]}) elif sock_type == "DatagramSocket": - self.DatagramSockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "port": sock["port"], "remote_ip": sock["remote_ip"]}) + remote_ip = sock["remote_ip"] + if remote_ip == "backend": + remote_ip = self.backend_ip + self.DatagramSockets.append({"name": name, "type": sock_type, "board_ip": self.board_ip, "port": sock["port"], "remote_ip": remote_ip})