From 1baff4a2c90176d1c0fabb30d9e0411a5ed2a893 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Fri, 28 Feb 2025 18:45:44 +0100 Subject: [PATCH 01/48] Add argv --- Core/Inc/Code_generation/Generator.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index 9f94823e..d1a2b5de 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -2,6 +2,7 @@ from Packet_descriptions import * import os import jinja2 +import sys def Generate_PacketDescription(): @@ -305,11 +306,22 @@ def generate_code(state_machine): #Main function +if len(sys.argv)<2: + print("Please enter a board name") + sys.exit() + boards = Generate_PacketDescription() -board = input("Enter board name: ") -while board not in boards: - print("Board not found, select an available board") - board = input("Enter board name: ") +aux = sys.argv[1] +filtered = "" +for c in aux: + if c.isalpha(): + filtered += c + else: + break +board = filtered +if board not in boards: + print("Board not found") + sys.exit() Generate_DataPackets_hpp(board) Generate_OrderPackets_hpp(board) Generate_Protections_hpp(board) From 4935f212c8f0ac60b9be219ecdb3a8458b137734 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Fri, 28 Feb 2025 18:59:38 +0100 Subject: [PATCH 02/48] Works, i think --- CMakeLists.txt | 17 +++++++++++++++++ Core/Inc/Code_generation/Generator.py | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4191cdae..9380b861 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,3 +165,20 @@ if (PROJECT_IS_TOP_LEVEL) ${CMAKE_CURRENT_SOURCE_DIR}/out/build/latest.elf ) endif() + +execute_process( + COMMAND git rev-parse --show-toplevel + OUTPUT_VARIABLE REPO_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +get_filename_component(REPO_NAME ${REPO_PATH} NAME) + +find_package(Python3 COMPONENTS Interpreter REQUIRED) + +set(GENERATOR_SCRIPT "${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Generator.py") + +add_custom_target(run_generator ALL + COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${REPO_NAME} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index d1a2b5de..a30b75d9 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -320,7 +320,6 @@ def generate_code(state_machine): break board = filtered if board not in boards: - print("Board not found") sys.exit() Generate_DataPackets_hpp(board) Generate_OrderPackets_hpp(board) From 2d7a2433ca398e5854317b5c3d270727f8baf121 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Fri, 28 Feb 2025 22:38:52 +0100 Subject: [PATCH 03/48] Fix repo name problem --- CMakeLists.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9380b861..15a83992 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,19 +166,12 @@ if (PROJECT_IS_TOP_LEVEL) ) endif() -execute_process( - COMMAND git rev-parse --show-toplevel - OUTPUT_VARIABLE REPO_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -get_filename_component(REPO_NAME ${REPO_PATH} NAME) find_package(Python3 COMPONENTS Interpreter REQUIRED) set(GENERATOR_SCRIPT "${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Generator.py") add_custom_target(run_generator ALL - COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${REPO_NAME} + COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${PROJECT_NAME} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) From f50722be5cbe3b613a4e4d29f34cd5a5c271ae4e Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sat, 1 Mar 2025 15:43:22 +0100 Subject: [PATCH 04/48] Created variable board --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15a83992..f7cc5aae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required (VERSION 3.14) project (template-project ASM C CXX) set(EXECUTABLE ${PROJECT_NAME}.elf) +set(Board ${PROJECT_NAME}) set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) option(USE_ETHERNET "Enable ethernet peripheral" OFF) @@ -172,6 +173,6 @@ find_package(Python3 COMPONENTS Interpreter REQUIRED) set(GENERATOR_SCRIPT "${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Generator.py") add_custom_target(run_generator ALL - COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${PROJECT_NAME} + COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${Board} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) From 35fc114b815d5e60d557a5f5ff82c903f55eefa6 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 6 Mar 2025 22:05:56 +0100 Subject: [PATCH 05/48] Some changes --- .gitmodules | 2 +- Core/Inc/Code_generation/DataTemplate.hpp | 28 -- Core/Inc/Code_generation/Generator.py | 308 +--------------- Core/Inc/Code_generation/OrderTemplate.hpp | 30 -- .../Code_generation/Packet_descriptions.py | 335 ------------------ .../Packet_generation}/JSON_ADE | 0 .../Code_generation/ProtectionsTemplate.hpp | 12 - 7 files changed, 4 insertions(+), 711 deletions(-) delete mode 100644 Core/Inc/Code_generation/DataTemplate.hpp delete mode 100644 Core/Inc/Code_generation/OrderTemplate.hpp delete mode 100644 Core/Inc/Code_generation/Packet_descriptions.py rename Core/Inc/{Communications => Code_generation/Packet_generation}/JSON_ADE (100%) delete mode 100644 Core/Inc/Code_generation/ProtectionsTemplate.hpp diff --git a/.gitmodules b/.gitmodules index 9ad52c84..97269b92 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,7 +2,7 @@ path = deps/ST-LIB url = https://github.com/HyperloopUPV-H8/ST-LIB [submodule "Core/Inc/Communications/JSON_ADE"] - path= Core/Inc/Communications/JSON_ADE + path = Core/Inc/Code_generation/Packet_generation/JSON_ADE url = https://github.com/HyperloopUPV-H8/JSON_ADE [submodule "Tests/VirtualMCU"] path = Tests/VirtualMCU diff --git a/Core/Inc/Code_generation/DataTemplate.hpp b/Core/Inc/Code_generation/DataTemplate.hpp deleted file mode 100644 index e0cf2744..00000000 --- a/Core/Inc/Code_generation/DataTemplate.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data packets for {{board}} -class DataPackets{ - {% for enum in enums %}enum class {{enum.name}}:uint8_t{ - {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} - {% endfor %}}; - {%endfor %} - - - private: - constexpr static size_t size={{size}}; - uint32_t id{0}; - public: - std::array packets; - {%for packet in packets%}StackPacket* {{packet.name}}; - {% endfor %} - - DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}}}) -{ - - {% for packet in packets %}{{packet.name}} = new StackPacket({{packet.id}}{% if packet.data%},{{packet.data}}{% endif%}); - packets[id]={{packet.name}}; - id++; - {% endfor %} -} -}; \ No newline at end of file diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index a30b75d9..5f346e8a 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -1,313 +1,11 @@ import json -from Packet_descriptions import * -import os -import jinja2 +from State_machine_generation.State_machine_generator import * +from Packet_generation.Packet_generator import * import sys -def Generate_PacketDescription(): - with open("Core/Inc/Communications/JSON_ADE/boards.json") as f: - boards = json.load(f) - boards_name = [] - for board in boards["boards"]: - with open("Core/Inc/Communications/JSON_ADE/" + (boards["boards"][board])) as f: - b = json.load(f) - board_instance = BoardDescription(board, b) - boards_name.append(board_instance.name) - globals()[board] = board_instance - - return boards_name - - -#--------------DataPackets.hpp generation---------------# - -def Get_data_context(board:BoardDescription): - def GenerateDataEnum(board:BoardDescription): - Enums = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - if packet_instance.type != "order": - for measurement in packet_instance.measurements: - if hasattr(measurement, "enum"): - Enums.append(measurement.enum) - return Enums - - - def GenerateDataPackets(board:BoardDescription): - Packets =[] - totaldata = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - if packet_instance.type != "order": - tempdata = "" - for variable in packet_instance.variables: - tempdata +=(str(variable) +",") - if tempdata.endswith(","): - tempdata = tempdata[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata , "id": packet_instance.id} - Packets.append(aux_packet) - for measurement in packet_instance.measurements: - aux_data = {"type": measurement.type, "name": measurement.id} - totaldata.append(aux_data) - - return Packets,totaldata - - packets,data = GenerateDataPackets(board) - context = { - "board": board.name, - "enums": GenerateDataEnum(board), - "packets" : packets, - "data": data, - "size": board.order_size, - } - return context - -def Generate_DataPackets_hpp(board_input:str): - board_instance = globals()[board_input] - if board_instance.data_size == 0: - if os.path.exists("Core/Inc/Communications/Packets/DataPackets.hpp"): - os.remove("Core/Inc/Communications/Packets/DataPackets.hpp") - return - - env= jinja2.Environment(loader=jinja2.FileSystemLoader("Core/Inc/Code_generation")) - template = env.get_template("DataTemplate.hpp") - context = Get_data_context(board_instance) - - - with open("Core/Inc/Communications/Packets/DataPackets.hpp","w") as Output: - Output.write(template.render(context)) - -#--------------OrderPackets.hpp generation---------------# - -def Get_order_context(board:BoardDescription): - def GenerateOrderEnum(board:BoardDescription): - Enums = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - if packet_instance.type == "order": - for measurement in packet_instance.measurements: - if hasattr(measurement, "enum"): - Enums.append(measurement.enum) - return Enums - - - def GenerateOrderPackets(board:BoardDescription): - Packets =[] - totaldata = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - if packet_instance.type == "order": - tempdata = "" - for variable in packet_instance.variables: - tempdata +=(str(variable) +",") - if tempdata.endswith(","): - tempdata = tempdata[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata , "id": packet_instance.id} - Packets.append(aux_packet) - for measurement in packet_instance.measurements: - aux_data = {"type": measurement.type, "name": measurement.id} - totaldata.append(aux_data) - - return Packets,totaldata - - - packets,data = GenerateOrderPackets(board) - context = { - "board": board.name, - "enums": GenerateOrderEnum(board), - "packets" : packets, - "data": data, - "size": board.order_size, - } - return context - -def Generate_OrderPackets_hpp(board_input:str): - board_instance = globals()[board_input] - if board_instance.order_size == 0: - if os.path.exists("Core/Inc/Communications/Packets/OrderPackets.hpp"): - os.remove("Core/Inc/Communications/Packets/OrderPackets.hpp") - return - - env= jinja2.Environment(loader=jinja2.FileSystemLoader("Core/Inc/Code_generation")) - template = env.get_template("OrderTemplate.hpp") - context = Get_order_context(board_instance) - - - with open("Core/Inc/Communications/Packets/OrderPackets.hpp","w") as Output: - Output.write(template.render(context)) - - -#--------------Protections.hpp generation---------------# - -def Generate_Protections_context(board:BoardDescription): - def Get_Bondaries(measurement:MeasurmentsDescription): - Boundaries = [] - for i in {0,1}: - for j in {0,1}: - if measurement.protections.protections[i].Protectionvalue[j] is None: - continue - temp_boundary= {"type": measurement.type, "Above_or_Below":measurement.protections.protections[i].ProtectionType, "value": measurement.protections.protections[i].Protectionvalue[j],"coma":"," } - Boundaries.append(temp_boundary) - - Boundaries[-1]["coma"] = "" - return Boundaries - - - def Get_protection_packets(board:BoardDescription): - protections = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - for measurement in packet_instance.measurements: - if hasattr(measurement, "protections"): - protections.append(measurement) - if len(protections) == 0: - return False - return protections - - - protection_packets = Get_protection_packets(board) - if protection_packets == False: - return False - protections=[] - data =[] - for measurement in protection_packets: - Boundaries = Get_Bondaries(measurement) - aux_protection = {"packet": measurement.id, "Boundaries": Boundaries} - aux_data = {"type": measurement.type, "name": measurement.id} - if aux_data not in data: - data.append(aux_data) - if aux_protection in protections: - continue - protections.append(aux_protection) - - context ={ - "board": board.name, - "data": data, - "protections": protections - } - return context - -def Generate_Protections_hpp(board_input:str): - board_instance = globals()[board_input] - env= jinja2.Environment(loader=jinja2.FileSystemLoader("Core/Inc/Code_generation")) - template = env.get_template("ProtectionsTemplate.hpp") - context = Generate_Protections_context(board_instance) - if context == False: - if os.path.exists("Core/Inc/Communications/Packets/Protections.hpp"): - os.remove("Core/Inc/Communications/Packets/Protections.hpp") - return - with open("Core/Inc/Communications/Packets/Protections.hpp","w") as Output: - Output.write(template.render(context)) - -#--------------state_machine.hpp generation---------------# -def instance_object_name(name): - return f"{name}_State_Machine" - -def generate_code(state_machine): - content = [] - - content.extend([ - "#pragma once", - '#include "ST-LIB.hpp"', - "using namespace std::chrono_literals;", - "", - "// AUTOGENERATED CODE, DO NOT EDIT MANUALLY", - "", - f"class {state_machine.name}{{", - "", - " public:", - "" - ]) - - for t in state_machine.transitions: - content.append(f" static bool {t.name}();") - for action in state_machine.actions: - for sa in action.state_actions: - content.append(f" static void {sa.name}();") - content.append("") - - main_instance = instance_object_name(state_machine.name) - content.append(f" StateMachine {main_instance};") - for nested_sm in state_machine.nested_state_machines: - nested_instance = instance_object_name(nested_sm.name) - content.append(f" StateMachine {nested_instance};") - content.append("") - - content.append(f" enum {state_machine.name}States {{") - for state in state_machine.states: - if isinstance(state, State): - content.append(f" {state.name.upper()},") - content.append(" };") - content.append("") - - for nested_sm in state_machine.nested_state_machines: - content.append(f" enum {nested_sm.name}{{") - for state in nested_sm.states: - content.append(f" {state.name.upper()},") - content.append(" };") - content.append("") - - content.append(f" {state_machine.name}(){{") - content.append("") - - if state_machine.states: - first_state = state_machine.states[0] - content.append(f" {main_instance} = StateMachine({state_machine.name}States::{first_state.name.upper()});") - content.append("") - - for nested_sm in state_machine.nested_state_machines: - nested_instance = instance_object_name(nested_sm.name) - if nested_sm.states: - first_nested = nested_sm.states[0] - content.extend([ - f" {nested_instance} = StateMachine({nested_sm.name}::{first_nested.name.upper()});", - f" {main_instance}.add_state_machine({nested_instance}, {get_state_reference(nested_sm.nested_to, state_machine.name)});" - ]) - for state in nested_sm.states[1:]: - content.append(f" {nested_instance}.add_state({nested_sm.name}::{state.name.upper()});") - content.append("") - - for state in state_machine.states[1:]: - if isinstance(state, State): - content.append(f" {main_instance}.add_state({state_machine.name}States::{state.name.upper()});") - content.append("") - - for t in state_machine.transitions: - if t.comment: - content.append(f" // {t.comment}") - from_state = get_state_reference(t.from_state, state_machine.name) - to_state = get_state_reference(t.to_state, state_machine.name) - content.append(f" {main_instance}.add_transition({from_state}, {to_state}, {t.name});") - content.append("") - - for action in state_machine.actions: - for sa in action.state_actions: - if sa.description: - content.append(f" // {sa.description}") - state_ref = get_state_reference(action.state, state_machine.name) - if action.type == "enter": - content.append(f" {main_instance}.add_enter_action({sa.name}, {state_ref});") - elif action.type == "exit": - content.append(f" {main_instance}.add_exit_action({sa.name}, {state_ref});") - elif action.type.startswith("cyclic"): - precision = action.type.split("_")[1] - content.append(f" {main_instance}.add_{precision}_precision_cyclic_action({sa.name}, {sa.period}, {state_ref});") - content.append("") - - content.extend([ - " }", - "", - "};" - ]) - - with open("Core/Inc/state_machine.hpp", "w") as f: - f.write("\n".join(content)) - - -#Main function - if len(sys.argv)<2: - print("Please enter a board name") + print("Please enter a board name,exiting...") sys.exit() boards = Generate_PacketDescription() diff --git a/Core/Inc/Code_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/OrderTemplate.hpp deleted file mode 100644 index 080432e4..00000000 --- a/Core/Inc/Code_generation/OrderTemplate.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Order packets for {{board}} -class OrderPackets{ - {% for enum in enums %}enum class {{enum.name}}:uint8_t{ - {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} - {% endfor %}}; - {% endfor %} - - {%for packet in packets%}bool {{packet.name}}_callback(); - {% endfor %} - - private: - constexpr static size_t size={{size}}; - uint32_t id{0}; - public: - std::array packets; - {%for packet in packets%}StackOrder* {{packet.name}}; - {% endfor %} - - OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}}}) -{ - - {% for packet in packets %}{{packet.name}}=new StackOrder({{packet.id}},{{packet.name}}_callback{% if packet.data%},{{packet.data}}{% endif%}); - packets[id]={{packet.name}}; - id++; - {% endfor %} -} -}; \ No newline at end of file diff --git a/Core/Inc/Code_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_descriptions.py deleted file mode 100644 index fd3fa60c..00000000 --- a/Core/Inc/Code_generation/Packet_descriptions.py +++ /dev/null @@ -1,335 +0,0 @@ -import re -import json - -#--------------PacketDescription------------------------# - -class BoardDescription: - def __init__(self,name:str,board:dict): - self.name = name - self.id = board["board_id"] - self.ip = board["board_ip"] - self.data_size =0 - self.order_size =0 - i = 0 - self.packets = {} - for packets in board["packets"]: - packets_name = re.split(r'_|\.', packets)[0] - self.packets[packets_name] = [] - measurement = self._MeasurementFileSearch(packets,board["measurements"]) - with open("Core/Inc/Communications/JSON_ADE/boards/" + name+"/" + board["packets"][i]) as f: - p= json.load(f) - with open("Core/Inc/Communications/JSON_ADE/boards/" + name + "/" + measurement) as f: - m = json.load(f) - i += 1 - for packet in p["packets"]: - j=0 - self.packets[packets_name].append(PacketDescription(packet,m)) - if self.packets[packets_name][j].type != "order": - self.data_size += 1 - else: - self.order_size += 1 - j += 1 - @staticmethod - def _MeasurementFileSearch(packet:str,measurements:dict): - packet_name = packet.split('_')[0] - for measurement in measurements: - measurement_name = measurement.split('_')[0] - if packet_name[0] == measurement_name[0]: - return measurement - else: - return measurements[0] -class PacketDescription: - def __init__(self, packet:dict,measurements:dict): - self.id =packet["id"] - self.name = (packet["name"].replace(" ", "_").replace("(", "").replace(")", "")) - self.type = packet["type"] - self.variables = [] - self.measurements = [] - for variable in packet["variables"]: - self.variables.append(variable["name"]) - self.measurements.append(MeasurmentsDescription(measurements,variable["name"])) - - -class MeasurmentsDescription: - def __init__(self,measurements:dict, variable:str): - self.id = variable - measurement = self._MeasurementSearch(measurements,variable) - if measurement is None: - raise Exception("Measurement not found") - else: - self.name = measurement["name"] - self.type = self._unsigned_int_correction(measurement["type"]) - if self.type == "enum": - values = [] - for value in measurement["enumValues"]: - values.append(str(value)) - self.enum ={"name": measurement["id"], "values": self._Enum_values_correction(values)} - self.type = measurement["id"] - protections = self._protection_search(measurement) - if protections is not None: - self.protections = self.Protections(protections) - - @staticmethod - def _Enum_values_correction(values:list): - for i in range(len(values)): - values[i] = values[i].replace(" ", "_") - return values - - - @staticmethod - def _MeasurementSearch(measurements:dict, variable:str): - for measurment in measurements["measurements"]: - if measurment["id"] == variable: - return measurment - return None - - - @staticmethod - def _unsigned_int_correction(type:str): - aux_type = type[:4] - if aux_type == "uint": - type += "_t" - return type - - @staticmethod - def _protection_search(measurement:dict): - warningRange = measurement.get("warningRange") - safeRange = measurement.get("safeRange") - if warningRange is None and safeRange is None: - return None - - protections = [[None, None], [None, None]] - - if safeRange is not None: - for i in range(len(safeRange)): - protections[0][i] = safeRange[i] - - if warningRange is not None: - for i in range(len(warningRange)): - protections[1][i] = warningRange[i] - - return protections - - class Protections: - class Below: - def __init__(self, protections:list): - self.Protectionvalue = [None, None] - self.ProtectionType = "Below" - if protections[0] is not None and protections[0][0] is not None: - self.Protectionvalue[0] = protections[0][0] - if protections[1] is not None and protections[1][0] is not None: - self.Protectionvalue[1] = protections[1][0] - - class Above: - def __init__(self, protections:list): - self.Protectionvalue = [None, None] - self.ProtectionType = "Above" - if protections[0] is not None and protections[0][1] is not None: - self.Protectionvalue[0] = protections[0][1] - if protections[1] is not None and protections[1][1] is not None: - self.Protectionvalue[1] = protections[1][1] - - def __init__(self, protections:list): - self.protections = [None, None] - self.protections[0] = self.Below(protections) - self.protections[1] = self.Above(protections) - -#--------------StateMachine------------------------# - -class State: - def __init__(self, name:str): - self.name=name - -class Transition: - def __init__(self, name:str,from_state:str,to_state:str,description:str=None): - self.name=name - self.from_state=from_state - self.to_state=to_state - self.comment=description - -class Enter: - def __init__(self, state: str, state_actions: list): - self.state = state - self.state_actions = state_actions - -class CyclicLowPrecision: - def __init__(self, states: list, state_actions: list): - self.states = states - self.state_actions = state_actions - -class CyclicMidPrecision: - def __init__(self, states: list, state_actions: list): - self.states = states - self.state_actions = state_actions - -class CyclicHighPrecision: - def __init__(self, states: list, state_actions: list): - self.states = states - self.state_actions = state_actions - -class Exit: - def __init__(self, state: str, state_actions: list): - self.state = state - self.state_actions = state_actions - -class StateReference: - def __init__(self, state_data): - if isinstance(state_data, str): - self.state_name = state_data - self.nested_machine = None - self.sub_state = None - else: - self.state_name = None - self.nested_machine = state_data["name"] - self.sub_state = state_data["sub-state"] - - def __str__(self): - if self.nested_machine: - return f"{self.nested_machine}.{self.sub_state}" - return self.state_name - -class ActionDefinition: - def __init__(self, action_data): - if isinstance(action_data, str): - self.name = action_data - self.description = None - self.period = None - else: - self.name = action_data.get("name") or action_data.get("action_name") - self.description = action_data.get("description") - self.period = action_data.get("action_period") - -class Action: - def __init__(self): - self.type = None - self.state = None - self.state_actions = [] - - @classmethod - def create_enter_exit(cls, action_type, state_data, actions_data): - action = cls() - action.type = action_type - action.state = StateReference(state_data) - action.state_actions = [ActionDefinition(a) for a in actions_data] - return action - - @classmethod - def create_cyclic(cls, precision, states_data, actions_data): - actions = [] - for state in states_data: - for action_data in actions_data: - action = cls() - action.type = f"cyclic_{precision}" - action.state = StateReference(state) - action.state_actions = [ActionDefinition(action_data)] - actions.append(action) - return actions - - def describe(self): - states_str = ", ".join(str(s) for s in self.states) - actions_str = ", ".join( - f"{a.name}" + (f"({a.period})" if a.period else "") + - (f" - {a.description}" if a.description else "") - for a in self.actions - ) - return f"{self.type} action on {states_str}: {actions_str}" - -class StateMachine: - def __init__(self,name:str): - self.name=name - self.states=[] - self.transitions=[] - self.actions=[] - self.nested_state_machines=[] - - def add_state(self,state:State): - self.states.append(state) - - def add_transition(self,transition:Transition): - self.transitions.append(transition) - - def add_action(self, action:Action): - self.actions.append(action) - - def add_nested_state_machine(self, state_machine:'StateMachine'): - self.nested_state_machines.append(state_machine) - - -def parse_state(data): - if isinstance(data, str): - return State(data) - elif isinstance(data, dict): - nested_sm = StateMachine(data["name"]) - nested_sm.nested_to = data.get("nested_to") - for sub_state in data["sub-states"]: - nested_sm.add_state(State(sub_state)) - return nested_sm - -def parse_transition(data): - name = data["transition_name"] - description = data.get("description") - - from_state = StateReference(data["from_state"]) - to_state = StateReference(data["to_state"]) - - return Transition(name, from_state, to_state, description) - -def parse_actions(data): - actions_list = [] - - actions_data = data.get("actions", {}) - - for enter_data in actions_data.get("enter", []): - action = Action.create_enter_exit( - "enter", - enter_data["state"], - enter_data["state_actions"] - ) - actions_list.append(action) - - cyclic_data = actions_data.get("cyclic", {}) - for precision in ["low_precision", "mid_precision", "high_precision"]: - for cyclic_item in cyclic_data.get(precision, []): - actions = Action.create_cyclic( - precision, - cyclic_item["states"], - cyclic_item["state_actions"] - ) - actions_list.extend(actions) - - for exit_data in actions_data.get("exit", []): - action = Action.create_enter_exit( - "exit", - exit_data["state"], - exit_data["state_actions"] - ) - actions_list.append(action) - - return actions_list - -def parse_state_machine(data): - sm = StateMachine(data["name"]) - - for st_data in data["states"]: - parsed = parse_state(st_data) - if isinstance(parsed, State): - sm.add_state(parsed) - else: - sm.add_nested_state_machine(parsed) - - for tr_data in data["transitions"]: - tr = parse_transition(tr_data) - sm.add_transition(tr) - - parsed_actions = parse_actions(data) - sm.actions = parsed_actions - - return sm - -def get_state_reference(state_ref, state_machine_name): - if isinstance(state_ref, str): - return f"{state_machine_name}States::{state_ref.upper()}" - - if state_ref.nested_machine: - return f"{state_ref.nested_machine}::{state_ref.sub_state.upper()}" - return f"{state_machine_name}States::{state_ref.state_name.upper()}" \ No newline at end of file diff --git a/Core/Inc/Communications/JSON_ADE b/Core/Inc/Code_generation/Packet_generation/JSON_ADE similarity index 100% rename from Core/Inc/Communications/JSON_ADE rename to Core/Inc/Code_generation/Packet_generation/JSON_ADE diff --git a/Core/Inc/Code_generation/ProtectionsTemplate.hpp b/Core/Inc/Code_generation/ProtectionsTemplate.hpp deleted file mode 100644 index 8d2b2cf3..00000000 --- a/Core/Inc/Code_generation/ProtectionsTemplate.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data protections for {{ board }} -class DataProtections{ - public: - DataProtections({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}){ - - {% for protection in protections %}ProtectionManager::_add_protection({{ protection.packet }},{% for Boundary in protection.Boundaries %}Boundary<{{Boundary.type}},{{Boundary.Above_or_Below}}>({{ Boundary.value }}){{ Boundary.coma }}{% endfor %}}).set_name("{{ protection.packet }}"); - {% endfor %} -} -}; \ No newline at end of file From e0ffbc2b746a23636a69add3a4c30768cc65d975 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 26 Mar 2025 20:53:29 +0100 Subject: [PATCH 06/48] Changed generator.py and cmakelist, now cmakelist board needs to be manually writen --- CMakeLists.txt | 2 +- Core/Inc/Code_generation/Generator.py | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d39c3ace..80ea4037 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.14) project (template-project ASM C CXX) set(EXECUTABLE ${PROJECT_NAME}.elf) -set(Board ${PROJECT_NAME}) +set(Board "VCU") # User must change the Board name set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index 02b074fe..ea12751c 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -1,15 +1,25 @@ import json +import sys from Packet_generation.Packet_generation import * from State_machine_generation.State_machine_generation import * - - +if len(sys.argv)<2: + print("Please enter a board name,exiting...") + sys.exit() + JSONpath = "Core/Inc/Code_generation/JSON_ADE" boards = Generate_PacketDescription(JSONpath) -board = input("Enter board name: ") -while board not in boards: - print("Board not found, select an available board") - board = input("Enter board name: ") +aux = sys.argv[1] +filtered = "" +for c in aux: + if c.isalpha(): + filtered += c + else: + break +board = filtered +if board not in boards: + sys.exit() + Generate_DataPackets_hpp(board) Generate_OrderPackets_hpp(board) Generate_Protections_hpp(board) From ec302cd5425bb5bcacd1e3b998c88df3ffffdbae Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 9 Apr 2025 20:13:59 +0200 Subject: [PATCH 07/48] Changes on cmake and some tests for making the github actions work --- CMakeLists.txt | 15 +- .../Communications/Packets/DataPackets.hpp | 124 +++++++++++ .../Communications/Packets/OrderPackets.hpp | 201 ++++++++++++++++++ .../Communications/Packets/Protections.hpp | 25 +++ Core/Inc/state_machine.hpp | 73 +++++++ 5 files changed, 431 insertions(+), 7 deletions(-) create mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp create mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp create mode 100644 Core/Inc/Communications/Packets/Protections.hpp create mode 100644 Core/Inc/state_machine.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 80ea4037..034a0e70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,14 @@ set(EXECUTABLE ${PROJECT_NAME}.elf) set(Board "VCU") # User must change the Board name set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) +find_package(Python3 COMPONENTS Interpreter REQUIRED) + +set(GENERATOR_SCRIPT "${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Generator.py") + +add_custom_target(run_generator ALL + COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${Board} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) add_custom_target( my_custom_target_that_always_runs ALL @@ -179,11 +187,4 @@ if (PROJECT_IS_TOP_LEVEL) endif() -find_package(Python3 COMPONENTS Interpreter REQUIRED) - -set(GENERATOR_SCRIPT "${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Generator.py") -add_custom_target(run_generator ALL - COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${Board} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} -) diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp new file mode 100644 index 00000000..112e3982 --- /dev/null +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -0,0 +1,124 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataPackets{ + enum class valve_state:uint8_t{ + VALVE_OPEN=0, + VALVE_CLOSED=1 + }; + enum class reed1:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed2:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed3:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed4:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class general_state:uint8_t{ + CONNECTING=0, + OPERATIONAL=1, + FAULT=2 + }; + enum class specific_state:uint8_t{ + IDLE=0, + TAKING_OFF=1, + STABLE_LEVITATION=2, + PROPULSION=3, + LANDING=4, + UNLOADING=5, + LOADING=6, + TRACTION=7 + }; + enum class voltage_state:uint8_t{ + NOT_HV=0, + HV=1 + }; + enum class emergency_tape:uint8_t{ + DISABLED=0, + ENABLED=1 + }; + enum class emergency_tape_value:uint8_t{ + NORMAL=0, + EMERGENCY=1 + }; + enum class pcu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class obccu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class lcu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class bmsl_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + + + + private: + constexpr static size_t size=35; + uint32_t id{0}; + public: + std::array packets; + StackPacket* vcu_regulator_packet; + StackPacket* vcu_reed_packet; + StackPacket* vcu_bottle_temperature_packet; + StackPacket* vcu_pressure_packet; + StackPacket* encoder_packet; + StackPacket* state_machines_packet; + StackPacket* emergency_tape_state; + StackPacket* output_vtg; + StackPacket* Tcp_connections; + StackPacket* waterblock_data; + + + DataPackets(valve_state &valve_state,float32 &reference_pressure,float32 &actual_pressure,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,float64 &bottle_temp_1,float64 &bottle_temp_2,float32 &high_pressure,float32 &low_pressure_1,float32 &low_pressure_2,float64 &direction,float64 &position,float64 &speed,float64 &acceleration,uint32_t &longest_update_ms,general_state &general_state,specific_state &specific_state,voltage_state &voltage_state,emergency_tape &emergency_tape,emergency_tape_value &emergency_tape_value,uint16_t &output_voltage,bool &driving_mosfets,pcu_connection &pcu_connection,obccu_connection &obccu_connection,lcu_connection &lcu_connection,bmsl_connection &bmsl_connection,float32 &waterblock_temperature,float32 &waterblock_pressure}}) +{ + + vcu_regulator_packet = new StackPacket(211,valve_state,reference_pressure,actual_pressure); + packets[id]=vcu_regulator_packet; + id++; + vcu_reed_packet = new StackPacket(212,reed1,reed2,reed3,reed4); + packets[id]=vcu_reed_packet; + id++; + vcu_bottle_temperature_packet = new StackPacket(213,bottle_temp_1,bottle_temp_2); + packets[id]=vcu_bottle_temperature_packet; + id++; + vcu_pressure_packet = new StackPacket(214,high_pressure,low_pressure_1,low_pressure_2); + packets[id]=vcu_pressure_packet; + id++; + encoder_packet = new StackPacket(219,direction,position,speed,acceleration); + packets[id]=encoder_packet; + id++; + state_machines_packet = new StackPacket(220,longest_update_ms,general_state,specific_state,voltage_state); + packets[id]=state_machines_packet; + id++; + emergency_tape_state = new StackPacket(221,emergency_tape,emergency_tape_value); + packets[id]=emergency_tape_state; + id++; + output_vtg = new StackPacket(981,output_voltage,driving_mosfets); + packets[id]=output_vtg; + id++; + Tcp_connections = new StackPacket(230,pcu_connection,obccu_connection,lcu_connection,bmsl_connection); + packets[id]=Tcp_connections; + id++; + waterblock_data = new StackPacket(231,waterblock_temperature,waterblock_pressure); + packets[id]=waterblock_data; + id++; + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp new file mode 100644 index 00000000..c6e2a74f --- /dev/null +++ b/Core/Inc/Communications/Packets/OrderPackets.hpp @@ -0,0 +1,201 @@ +#pragma once +#include "ST-LIB.hpp" + +//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class OrderPackets{ + enum class test_speed_control_direction:uint8_t{ + FORWARD=0, + BACKWARD=1 + }; + + + bool propagate_fault_callback(); + bool start_charging_obccu_callback(); + bool stop_charging_obccu_callback(); + bool open_contactors_obccu_callback(); + bool close_contactors_obccu_callback(); + bool brake_callback(); + bool unbrake_callback(); + bool set_regulator_pressure_callback(); + bool disable_emergency_tape_callback(); + bool enable_emergency_tape_callback(); + bool reset_vcu_callback(); + bool test_pwm_callback(); + bool test_current_control_callback(); + bool set_reset_on_callback(); + bool set_reset_off_callback(); + bool start_levitation_control_callback(); + bool start_vertical_levitation_callback(); + bool stop_levitation_callback(); + bool stick_down_callback(); + bool landing_callback(); + bool start_horizontal_levitation_callback(); + bool enter_testing_mode_callback(); + bool exit_testing_mode_callback(); + bool manual_zeroing_callback(); + bool set_stable_levitation_on_callback(); + bool set_stable_levitation_off_callback(); + bool set_rgb_color_callback(); + bool turn_on_party_callback(); + bool turn_off_party_callback(); + bool turn_on_pump_callback(); + bool turn_off_pump_callback(); + bool discharge_dclink_callback(); + bool change_position_references_callback(); + bool start_vf_control_callback(); + bool CRUISING_DEMONSTRATION_callback(); + + + private: + constexpr static size_t size=35; + uint32_t id{0}; + public: + std::array packets; + StackOrder* propagate_fault; + StackOrder* start_charging_obccu; + StackOrder* stop_charging_obccu; + StackOrder* open_contactors_obccu; + StackOrder* close_contactors_obccu; + StackOrder* brake; + StackOrder* unbrake; + StackOrder* set_regulator_pressure; + StackOrder* disable_emergency_tape; + StackOrder* enable_emergency_tape; + StackOrder* reset_vcu; + StackOrder* test_pwm; + StackOrder* test_current_control; + StackOrder* set_reset_on; + StackOrder* set_reset_off; + StackOrder* start_levitation_control; + StackOrder* start_vertical_levitation; + StackOrder* stop_levitation; + StackOrder* stick_down; + StackOrder* landing; + StackOrder* start_horizontal_levitation; + StackOrder* enter_testing_mode; + StackOrder* exit_testing_mode; + StackOrder* manual_zeroing; + StackOrder* set_stable_levitation_on; + StackOrder* set_stable_levitation_off; + StackOrder* set_rgb_color; + StackOrder* turn_on_party; + StackOrder* turn_off_party; + StackOrder* turn_on_pump; + StackOrder* turn_off_pump; + StackOrder* discharge_dclink; + StackOrder* change_position_references; + StackOrder* start_vf_control; + StackOrder* CRUISING_DEMONSTRATION; + + + OrderPackets(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &pwm_duty_cycle,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &target_test_speed_control_kmh,test_speed_control_direction &test_speed_control_direction,float64 &lower_position_limit,float64 &upper_position_limit}}) +{ + + propagate_fault=new StackOrder(0,propagate_fault_callback); + packets[id]=propagate_fault; + id++; + start_charging_obccu=new StackOrder(900,start_charging_obccu_callback); + packets[id]=start_charging_obccu; + id++; + stop_charging_obccu=new StackOrder(901,stop_charging_obccu_callback); + packets[id]=stop_charging_obccu; + id++; + open_contactors_obccu=new StackOrder(902,open_contactors_obccu_callback); + packets[id]=open_contactors_obccu; + id++; + close_contactors_obccu=new StackOrder(903,close_contactors_obccu_callback); + packets[id]=close_contactors_obccu; + id++; + brake=new StackOrder(215,brake_callback); + packets[id]=brake; + id++; + unbrake=new StackOrder(216,unbrake_callback); + packets[id]=unbrake; + id++; + set_regulator_pressure=new StackOrder(210,set_regulator_pressure_callback,new_reference_pressure); + packets[id]=set_regulator_pressure; + id++; + disable_emergency_tape=new StackOrder(217,disable_emergency_tape_callback); + packets[id]=disable_emergency_tape; + id++; + enable_emergency_tape=new StackOrder(218,enable_emergency_tape_callback); + packets[id]=enable_emergency_tape; + id++; + reset_vcu=new StackOrder(223,reset_vcu_callback); + packets[id]=reset_vcu; + id++; + test_pwm=new StackOrder(350,test_pwm_callback,ldu_id,pwm_duty_cycle); + packets[id]=test_pwm; + id++; + test_current_control=new StackOrder(352,test_current_control_callback,ldu_id,lcu_desired_current); + packets[id]=test_current_control; + id++; + set_reset_on=new StackOrder(353,set_reset_on_callback,ldu_buffer_id); + packets[id]=set_reset_on; + id++; + set_reset_off=new StackOrder(354,set_reset_off_callback,ldu_buffer_id); + packets[id]=set_reset_off; + id++; + start_levitation_control=new StackOrder(355,start_levitation_control_callback,lcu_desired_distance); + packets[id]=start_levitation_control; + id++; + start_vertical_levitation=new StackOrder(356,start_vertical_levitation_callback,lcu_desired_distance); + packets[id]=start_vertical_levitation; + id++; + stop_levitation=new StackOrder(357,stop_levitation_callback); + packets[id]=stop_levitation; + id++; + stick_down=new StackOrder(358,stick_down_callback); + packets[id]=stick_down; + id++; + landing=new StackOrder(359,landing_callback); + packets[id]=landing; + id++; + start_horizontal_levitation=new StackOrder(360,start_horizontal_levitation_callback); + packets[id]=start_horizontal_levitation; + id++; + enter_testing_mode=new StackOrder(361,enter_testing_mode_callback); + packets[id]=enter_testing_mode; + id++; + exit_testing_mode=new StackOrder(362,exit_testing_mode_callback); + packets[id]=exit_testing_mode; + id++; + manual_zeroing=new StackOrder(611,manual_zeroing_callback); + packets[id]=manual_zeroing; + id++; + set_stable_levitation_on=new StackOrder(363,set_stable_levitation_on_callback); + packets[id]=set_stable_levitation_on; + id++; + set_stable_levitation_off=new StackOrder(364,set_stable_levitation_off_callback); + packets[id]=set_stable_levitation_off; + id++; + set_rgb_color=new StackOrder(290,set_rgb_color_callback); + packets[id]=set_rgb_color; + id++; + turn_on_party=new StackOrder(291,turn_on_party_callback); + packets[id]=turn_on_party; + id++; + turn_off_party=new StackOrder(292,turn_off_party_callback); + packets[id]=turn_off_party; + id++; + turn_on_pump=new StackOrder(293,turn_on_pump_callback); + packets[id]=turn_on_pump; + id++; + turn_off_pump=new StackOrder(294,turn_off_pump_callback); + packets[id]=turn_off_pump; + id++; + discharge_dclink=new StackOrder(368,discharge_dclink_callback); + packets[id]=discharge_dclink; + id++; + change_position_references=new StackOrder(645,change_position_references_callback,lower_position_limit,upper_position_limit); + packets[id]=change_position_references; + id++; + start_vf_control=new StackOrder(625,start_vf_control_callback); + packets[id]=start_vf_control; + id++; + CRUISING_DEMONSTRATION=new StackOrder(646,CRUISING_DEMONSTRATION_callback,target_test_speed_control_kmh,test_speed_control_direction,lower_position_limit,upper_position_limit); + packets[id]=CRUISING_DEMONSTRATION; + id++; + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/Protections.hpp b/Core/Inc/Communications/Packets/Protections.hpp new file mode 100644 index 00000000..c4bd13ab --- /dev/null +++ b/Core/Inc/Communications/Packets/Protections.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data protections for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataProtections{ + public: + DataProtections(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &reference_pressure,float32 &actual_pressure,float32 &high_pressure,float64 &position,float64 &speed,float64 &acceleration,uint16_t &output_voltage){ + + ProtectionManager::_add_protection(new_reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("new_reference_pressure"); + ProtectionManager::_add_protection(ldu_id,Boundary(1),Boundary(1),Boundary(10),Boundary(10)}).set_name("ldu_id"); + ProtectionManager::_add_protection(lcu_desired_current,Boundary(-50),Boundary(-70),Boundary(50),Boundary(70)}).set_name("lcu_desired_current"); + ProtectionManager::_add_protection(ldu_buffer_id,Boundary(1),Boundary(1),Boundary(5),Boundary(5)}).set_name("ldu_buffer_id"); + ProtectionManager::_add_protection(lcu_desired_distance,Boundary(0.0001),Boundary(0.01),Boundary(0.03),Boundary(0.03)}).set_name("lcu_desired_distance"); + ProtectionManager::_add_protection(lower_position_limit,Boundary(-2),Boundary(0)}).set_name("lower_position_limit"); + ProtectionManager::_add_protection(upper_position_limit,Boundary(1),Boundary(36)}).set_name("upper_position_limit"); + ProtectionManager::_add_protection(reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("reference_pressure"); + ProtectionManager::_add_protection(actual_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("actual_pressure"); + ProtectionManager::_add_protection(high_pressure,Boundary(40),Boundary(0),Boundary(200),Boundary(200)}).set_name("high_pressure"); + ProtectionManager::_add_protection(position,Boundary(0),Boundary(0),Boundary(40),Boundary(50)}).set_name("position"); + ProtectionManager::_add_protection(speed,Boundary(0),Boundary(0),Boundary(8.33),Boundary(13.88)}).set_name("speed"); + ProtectionManager::_add_protection(acceleration,Boundary(0),Boundary(0),Boundary(9.8),Boundary(19.6)}).set_name("acceleration"); + ProtectionManager::_add_protection(output_voltage,Boundary(192),Boundary(0),Boundary(252),Boundary(252)}).set_name("output_voltage"); + +} +}; \ No newline at end of file diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp new file mode 100644 index 00000000..0a448b41 --- /dev/null +++ b/Core/Inc/state_machine.hpp @@ -0,0 +1,73 @@ +#pragma once +#include "ST-LIB.hpp" +using namespace std::chrono_literals; + +// AUTOGENERATED CODE, DO NOT EDIT MANUALLY + +class Example{ + + public: + + static bool from_1_to_2(); + static bool from_1_to_2(); + static bool from_1_to_nested_1(); + static void enter_action_1(); + static void enter_action_2(); + static void enter_action_3(); + static void enter_action_4(); + static void low_precision_action(); + static void low_precision_action(); + static void mid_precision_action_to_nested_state(); + static void mid_precision_action_to_nested_state(); + static void high_precision_action_with_description(); + static void high_precision_action_with_description(); + static void exit_action_1(); + static void exit_action_2(); + + StateMachine Example_State_Machine; + StateMachine Nested_State_Machine; + + enum ExampleStates { + NAME_1, + NAME_2, + }; + + enum Nested{ + NESTED_NAME_1, + NESTED_NAME_2, + }; + + Example(){ + + Example_State_Machine = StateMachine(ExampleStates::NAME_1); + + Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); + Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); + Nested_State_Machine.add_state(Nested::NESTED_NAME_2); + + Example_State_Machine.add_state(ExampleStates::NAME_2); + + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + // Transitioning from 1 to 2 + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); + + Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); + Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); + // Description of enter_action_3 + Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); + Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); + Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); + Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); + + } + +}; \ No newline at end of file From 321ebfdfb8dbe4e05ae490ec7558a502af8d0386 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 9 Apr 2025 20:16:31 +0200 Subject: [PATCH 08/48] Testing to delete the results of the generation for github actions --- .../Communications/Packets/DataPackets.hpp | 124 ----------- .../Communications/Packets/OrderPackets.hpp | 201 ------------------ .../Communications/Packets/Protections.hpp | 25 --- 3 files changed, 350 deletions(-) delete mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/Protections.hpp diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp deleted file mode 100644 index 112e3982..00000000 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataPackets{ - enum class valve_state:uint8_t{ - VALVE_OPEN=0, - VALVE_CLOSED=1 - }; - enum class reed1:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed2:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed3:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed4:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class general_state:uint8_t{ - CONNECTING=0, - OPERATIONAL=1, - FAULT=2 - }; - enum class specific_state:uint8_t{ - IDLE=0, - TAKING_OFF=1, - STABLE_LEVITATION=2, - PROPULSION=3, - LANDING=4, - UNLOADING=5, - LOADING=6, - TRACTION=7 - }; - enum class voltage_state:uint8_t{ - NOT_HV=0, - HV=1 - }; - enum class emergency_tape:uint8_t{ - DISABLED=0, - ENABLED=1 - }; - enum class emergency_tape_value:uint8_t{ - NORMAL=0, - EMERGENCY=1 - }; - enum class pcu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class obccu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class lcu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class bmsl_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - - - - private: - constexpr static size_t size=35; - uint32_t id{0}; - public: - std::array packets; - StackPacket* vcu_regulator_packet; - StackPacket* vcu_reed_packet; - StackPacket* vcu_bottle_temperature_packet; - StackPacket* vcu_pressure_packet; - StackPacket* encoder_packet; - StackPacket* state_machines_packet; - StackPacket* emergency_tape_state; - StackPacket* output_vtg; - StackPacket* Tcp_connections; - StackPacket* waterblock_data; - - - DataPackets(valve_state &valve_state,float32 &reference_pressure,float32 &actual_pressure,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,float64 &bottle_temp_1,float64 &bottle_temp_2,float32 &high_pressure,float32 &low_pressure_1,float32 &low_pressure_2,float64 &direction,float64 &position,float64 &speed,float64 &acceleration,uint32_t &longest_update_ms,general_state &general_state,specific_state &specific_state,voltage_state &voltage_state,emergency_tape &emergency_tape,emergency_tape_value &emergency_tape_value,uint16_t &output_voltage,bool &driving_mosfets,pcu_connection &pcu_connection,obccu_connection &obccu_connection,lcu_connection &lcu_connection,bmsl_connection &bmsl_connection,float32 &waterblock_temperature,float32 &waterblock_pressure}}) -{ - - vcu_regulator_packet = new StackPacket(211,valve_state,reference_pressure,actual_pressure); - packets[id]=vcu_regulator_packet; - id++; - vcu_reed_packet = new StackPacket(212,reed1,reed2,reed3,reed4); - packets[id]=vcu_reed_packet; - id++; - vcu_bottle_temperature_packet = new StackPacket(213,bottle_temp_1,bottle_temp_2); - packets[id]=vcu_bottle_temperature_packet; - id++; - vcu_pressure_packet = new StackPacket(214,high_pressure,low_pressure_1,low_pressure_2); - packets[id]=vcu_pressure_packet; - id++; - encoder_packet = new StackPacket(219,direction,position,speed,acceleration); - packets[id]=encoder_packet; - id++; - state_machines_packet = new StackPacket(220,longest_update_ms,general_state,specific_state,voltage_state); - packets[id]=state_machines_packet; - id++; - emergency_tape_state = new StackPacket(221,emergency_tape,emergency_tape_value); - packets[id]=emergency_tape_state; - id++; - output_vtg = new StackPacket(981,output_voltage,driving_mosfets); - packets[id]=output_vtg; - id++; - Tcp_connections = new StackPacket(230,pcu_connection,obccu_connection,lcu_connection,bmsl_connection); - packets[id]=Tcp_connections; - id++; - waterblock_data = new StackPacket(231,waterblock_temperature,waterblock_pressure); - packets[id]=waterblock_data; - id++; - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp deleted file mode 100644 index c6e2a74f..00000000 --- a/Core/Inc/Communications/Packets/OrderPackets.hpp +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class OrderPackets{ - enum class test_speed_control_direction:uint8_t{ - FORWARD=0, - BACKWARD=1 - }; - - - bool propagate_fault_callback(); - bool start_charging_obccu_callback(); - bool stop_charging_obccu_callback(); - bool open_contactors_obccu_callback(); - bool close_contactors_obccu_callback(); - bool brake_callback(); - bool unbrake_callback(); - bool set_regulator_pressure_callback(); - bool disable_emergency_tape_callback(); - bool enable_emergency_tape_callback(); - bool reset_vcu_callback(); - bool test_pwm_callback(); - bool test_current_control_callback(); - bool set_reset_on_callback(); - bool set_reset_off_callback(); - bool start_levitation_control_callback(); - bool start_vertical_levitation_callback(); - bool stop_levitation_callback(); - bool stick_down_callback(); - bool landing_callback(); - bool start_horizontal_levitation_callback(); - bool enter_testing_mode_callback(); - bool exit_testing_mode_callback(); - bool manual_zeroing_callback(); - bool set_stable_levitation_on_callback(); - bool set_stable_levitation_off_callback(); - bool set_rgb_color_callback(); - bool turn_on_party_callback(); - bool turn_off_party_callback(); - bool turn_on_pump_callback(); - bool turn_off_pump_callback(); - bool discharge_dclink_callback(); - bool change_position_references_callback(); - bool start_vf_control_callback(); - bool CRUISING_DEMONSTRATION_callback(); - - - private: - constexpr static size_t size=35; - uint32_t id{0}; - public: - std::array packets; - StackOrder* propagate_fault; - StackOrder* start_charging_obccu; - StackOrder* stop_charging_obccu; - StackOrder* open_contactors_obccu; - StackOrder* close_contactors_obccu; - StackOrder* brake; - StackOrder* unbrake; - StackOrder* set_regulator_pressure; - StackOrder* disable_emergency_tape; - StackOrder* enable_emergency_tape; - StackOrder* reset_vcu; - StackOrder* test_pwm; - StackOrder* test_current_control; - StackOrder* set_reset_on; - StackOrder* set_reset_off; - StackOrder* start_levitation_control; - StackOrder* start_vertical_levitation; - StackOrder* stop_levitation; - StackOrder* stick_down; - StackOrder* landing; - StackOrder* start_horizontal_levitation; - StackOrder* enter_testing_mode; - StackOrder* exit_testing_mode; - StackOrder* manual_zeroing; - StackOrder* set_stable_levitation_on; - StackOrder* set_stable_levitation_off; - StackOrder* set_rgb_color; - StackOrder* turn_on_party; - StackOrder* turn_off_party; - StackOrder* turn_on_pump; - StackOrder* turn_off_pump; - StackOrder* discharge_dclink; - StackOrder* change_position_references; - StackOrder* start_vf_control; - StackOrder* CRUISING_DEMONSTRATION; - - - OrderPackets(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &pwm_duty_cycle,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &target_test_speed_control_kmh,test_speed_control_direction &test_speed_control_direction,float64 &lower_position_limit,float64 &upper_position_limit}}) -{ - - propagate_fault=new StackOrder(0,propagate_fault_callback); - packets[id]=propagate_fault; - id++; - start_charging_obccu=new StackOrder(900,start_charging_obccu_callback); - packets[id]=start_charging_obccu; - id++; - stop_charging_obccu=new StackOrder(901,stop_charging_obccu_callback); - packets[id]=stop_charging_obccu; - id++; - open_contactors_obccu=new StackOrder(902,open_contactors_obccu_callback); - packets[id]=open_contactors_obccu; - id++; - close_contactors_obccu=new StackOrder(903,close_contactors_obccu_callback); - packets[id]=close_contactors_obccu; - id++; - brake=new StackOrder(215,brake_callback); - packets[id]=brake; - id++; - unbrake=new StackOrder(216,unbrake_callback); - packets[id]=unbrake; - id++; - set_regulator_pressure=new StackOrder(210,set_regulator_pressure_callback,new_reference_pressure); - packets[id]=set_regulator_pressure; - id++; - disable_emergency_tape=new StackOrder(217,disable_emergency_tape_callback); - packets[id]=disable_emergency_tape; - id++; - enable_emergency_tape=new StackOrder(218,enable_emergency_tape_callback); - packets[id]=enable_emergency_tape; - id++; - reset_vcu=new StackOrder(223,reset_vcu_callback); - packets[id]=reset_vcu; - id++; - test_pwm=new StackOrder(350,test_pwm_callback,ldu_id,pwm_duty_cycle); - packets[id]=test_pwm; - id++; - test_current_control=new StackOrder(352,test_current_control_callback,ldu_id,lcu_desired_current); - packets[id]=test_current_control; - id++; - set_reset_on=new StackOrder(353,set_reset_on_callback,ldu_buffer_id); - packets[id]=set_reset_on; - id++; - set_reset_off=new StackOrder(354,set_reset_off_callback,ldu_buffer_id); - packets[id]=set_reset_off; - id++; - start_levitation_control=new StackOrder(355,start_levitation_control_callback,lcu_desired_distance); - packets[id]=start_levitation_control; - id++; - start_vertical_levitation=new StackOrder(356,start_vertical_levitation_callback,lcu_desired_distance); - packets[id]=start_vertical_levitation; - id++; - stop_levitation=new StackOrder(357,stop_levitation_callback); - packets[id]=stop_levitation; - id++; - stick_down=new StackOrder(358,stick_down_callback); - packets[id]=stick_down; - id++; - landing=new StackOrder(359,landing_callback); - packets[id]=landing; - id++; - start_horizontal_levitation=new StackOrder(360,start_horizontal_levitation_callback); - packets[id]=start_horizontal_levitation; - id++; - enter_testing_mode=new StackOrder(361,enter_testing_mode_callback); - packets[id]=enter_testing_mode; - id++; - exit_testing_mode=new StackOrder(362,exit_testing_mode_callback); - packets[id]=exit_testing_mode; - id++; - manual_zeroing=new StackOrder(611,manual_zeroing_callback); - packets[id]=manual_zeroing; - id++; - set_stable_levitation_on=new StackOrder(363,set_stable_levitation_on_callback); - packets[id]=set_stable_levitation_on; - id++; - set_stable_levitation_off=new StackOrder(364,set_stable_levitation_off_callback); - packets[id]=set_stable_levitation_off; - id++; - set_rgb_color=new StackOrder(290,set_rgb_color_callback); - packets[id]=set_rgb_color; - id++; - turn_on_party=new StackOrder(291,turn_on_party_callback); - packets[id]=turn_on_party; - id++; - turn_off_party=new StackOrder(292,turn_off_party_callback); - packets[id]=turn_off_party; - id++; - turn_on_pump=new StackOrder(293,turn_on_pump_callback); - packets[id]=turn_on_pump; - id++; - turn_off_pump=new StackOrder(294,turn_off_pump_callback); - packets[id]=turn_off_pump; - id++; - discharge_dclink=new StackOrder(368,discharge_dclink_callback); - packets[id]=discharge_dclink; - id++; - change_position_references=new StackOrder(645,change_position_references_callback,lower_position_limit,upper_position_limit); - packets[id]=change_position_references; - id++; - start_vf_control=new StackOrder(625,start_vf_control_callback); - packets[id]=start_vf_control; - id++; - CRUISING_DEMONSTRATION=new StackOrder(646,CRUISING_DEMONSTRATION_callback,target_test_speed_control_kmh,test_speed_control_direction,lower_position_limit,upper_position_limit); - packets[id]=CRUISING_DEMONSTRATION; - id++; - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/Protections.hpp b/Core/Inc/Communications/Packets/Protections.hpp deleted file mode 100644 index c4bd13ab..00000000 --- a/Core/Inc/Communications/Packets/Protections.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data protections for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataProtections{ - public: - DataProtections(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &reference_pressure,float32 &actual_pressure,float32 &high_pressure,float64 &position,float64 &speed,float64 &acceleration,uint16_t &output_voltage){ - - ProtectionManager::_add_protection(new_reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("new_reference_pressure"); - ProtectionManager::_add_protection(ldu_id,Boundary(1),Boundary(1),Boundary(10),Boundary(10)}).set_name("ldu_id"); - ProtectionManager::_add_protection(lcu_desired_current,Boundary(-50),Boundary(-70),Boundary(50),Boundary(70)}).set_name("lcu_desired_current"); - ProtectionManager::_add_protection(ldu_buffer_id,Boundary(1),Boundary(1),Boundary(5),Boundary(5)}).set_name("ldu_buffer_id"); - ProtectionManager::_add_protection(lcu_desired_distance,Boundary(0.0001),Boundary(0.01),Boundary(0.03),Boundary(0.03)}).set_name("lcu_desired_distance"); - ProtectionManager::_add_protection(lower_position_limit,Boundary(-2),Boundary(0)}).set_name("lower_position_limit"); - ProtectionManager::_add_protection(upper_position_limit,Boundary(1),Boundary(36)}).set_name("upper_position_limit"); - ProtectionManager::_add_protection(reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("reference_pressure"); - ProtectionManager::_add_protection(actual_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("actual_pressure"); - ProtectionManager::_add_protection(high_pressure,Boundary(40),Boundary(0),Boundary(200),Boundary(200)}).set_name("high_pressure"); - ProtectionManager::_add_protection(position,Boundary(0),Boundary(0),Boundary(40),Boundary(50)}).set_name("position"); - ProtectionManager::_add_protection(speed,Boundary(0),Boundary(0),Boundary(8.33),Boundary(13.88)}).set_name("speed"); - ProtectionManager::_add_protection(acceleration,Boundary(0),Boundary(0),Boundary(9.8),Boundary(19.6)}).set_name("acceleration"); - ProtectionManager::_add_protection(output_voltage,Boundary(192),Boundary(0),Boundary(252),Boundary(252)}).set_name("output_voltage"); - -} -}; \ No newline at end of file From 1e1ca84095c686e22190db38201caaea2b858ef2 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 9 Apr 2025 20:18:42 +0200 Subject: [PATCH 09/48] The test didnt work again --- Core/Inc/state_machine.hpp | 73 -------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 Core/Inc/state_machine.hpp diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp deleted file mode 100644 index 0a448b41..00000000 --- a/Core/Inc/state_machine.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" -using namespace std::chrono_literals; - -// AUTOGENERATED CODE, DO NOT EDIT MANUALLY - -class Example{ - - public: - - static bool from_1_to_2(); - static bool from_1_to_2(); - static bool from_1_to_nested_1(); - static void enter_action_1(); - static void enter_action_2(); - static void enter_action_3(); - static void enter_action_4(); - static void low_precision_action(); - static void low_precision_action(); - static void mid_precision_action_to_nested_state(); - static void mid_precision_action_to_nested_state(); - static void high_precision_action_with_description(); - static void high_precision_action_with_description(); - static void exit_action_1(); - static void exit_action_2(); - - StateMachine Example_State_Machine; - StateMachine Nested_State_Machine; - - enum ExampleStates { - NAME_1, - NAME_2, - }; - - enum Nested{ - NESTED_NAME_1, - NESTED_NAME_2, - }; - - Example(){ - - Example_State_Machine = StateMachine(ExampleStates::NAME_1); - - Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); - Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); - Nested_State_Machine.add_state(Nested::NESTED_NAME_2); - - Example_State_Machine.add_state(ExampleStates::NAME_2); - - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - // Transitioning from 1 to 2 - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); - - Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); - Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); - // Description of enter_action_3 - Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); - Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); - Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); - Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); - - } - -}; \ No newline at end of file From ab5ee07a5290c7ab952bafbe054856c4356c70f3 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 9 Apr 2025 20:30:52 +0200 Subject: [PATCH 10/48] Uploaded the folder so that it works --- Core/Inc/Communications/Packets/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Core/Inc/Communications/Packets/.gitignore diff --git a/Core/Inc/Communications/Packets/.gitignore b/Core/Inc/Communications/Packets/.gitignore new file mode 100644 index 00000000..e69de29b From 0e82c9fd09095692651fd0802d76e661fa69beb0 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sun, 31 Aug 2025 23:35:52 +0200 Subject: [PATCH 11/48] Temporal changes --- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Communications/Packets/DataPackets.hpp | 124 +++++++++++ .../Communications/Packets/OrderPackets.hpp | 201 ++++++++++++++++++ .../Communications/Packets/Protections.hpp | 25 +++ Core/Inc/state_machine.hpp | 73 +++++++ deps/ST-LIB | 2 +- template-project.code-workspace | 3 - 7 files changed, 425 insertions(+), 5 deletions(-) create mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp create mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp create mode 100644 Core/Inc/Communications/Packets/Protections.hpp create mode 100644 Core/Inc/state_machine.hpp diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index c9f7efc3..73fb6443 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit c9f7efc38aa0c225b2a55a8daa74911e25ca3c93 +Subproject commit 73fb6443119d83d58aab8a8fe17be0d1533d4d25 diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp new file mode 100644 index 00000000..112e3982 --- /dev/null +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -0,0 +1,124 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataPackets{ + enum class valve_state:uint8_t{ + VALVE_OPEN=0, + VALVE_CLOSED=1 + }; + enum class reed1:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed2:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed3:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class reed4:uint8_t{ + EXTENDED=0, + RETRACTED=1 + }; + enum class general_state:uint8_t{ + CONNECTING=0, + OPERATIONAL=1, + FAULT=2 + }; + enum class specific_state:uint8_t{ + IDLE=0, + TAKING_OFF=1, + STABLE_LEVITATION=2, + PROPULSION=3, + LANDING=4, + UNLOADING=5, + LOADING=6, + TRACTION=7 + }; + enum class voltage_state:uint8_t{ + NOT_HV=0, + HV=1 + }; + enum class emergency_tape:uint8_t{ + DISABLED=0, + ENABLED=1 + }; + enum class emergency_tape_value:uint8_t{ + NORMAL=0, + EMERGENCY=1 + }; + enum class pcu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class obccu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class lcu_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + enum class bmsl_connection:uint8_t{ + Disconnected=0, + Connected=1 + }; + + + + private: + constexpr static size_t size=35; + uint32_t id{0}; + public: + std::array packets; + StackPacket* vcu_regulator_packet; + StackPacket* vcu_reed_packet; + StackPacket* vcu_bottle_temperature_packet; + StackPacket* vcu_pressure_packet; + StackPacket* encoder_packet; + StackPacket* state_machines_packet; + StackPacket* emergency_tape_state; + StackPacket* output_vtg; + StackPacket* Tcp_connections; + StackPacket* waterblock_data; + + + DataPackets(valve_state &valve_state,float32 &reference_pressure,float32 &actual_pressure,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,float64 &bottle_temp_1,float64 &bottle_temp_2,float32 &high_pressure,float32 &low_pressure_1,float32 &low_pressure_2,float64 &direction,float64 &position,float64 &speed,float64 &acceleration,uint32_t &longest_update_ms,general_state &general_state,specific_state &specific_state,voltage_state &voltage_state,emergency_tape &emergency_tape,emergency_tape_value &emergency_tape_value,uint16_t &output_voltage,bool &driving_mosfets,pcu_connection &pcu_connection,obccu_connection &obccu_connection,lcu_connection &lcu_connection,bmsl_connection &bmsl_connection,float32 &waterblock_temperature,float32 &waterblock_pressure}}) +{ + + vcu_regulator_packet = new StackPacket(211,valve_state,reference_pressure,actual_pressure); + packets[id]=vcu_regulator_packet; + id++; + vcu_reed_packet = new StackPacket(212,reed1,reed2,reed3,reed4); + packets[id]=vcu_reed_packet; + id++; + vcu_bottle_temperature_packet = new StackPacket(213,bottle_temp_1,bottle_temp_2); + packets[id]=vcu_bottle_temperature_packet; + id++; + vcu_pressure_packet = new StackPacket(214,high_pressure,low_pressure_1,low_pressure_2); + packets[id]=vcu_pressure_packet; + id++; + encoder_packet = new StackPacket(219,direction,position,speed,acceleration); + packets[id]=encoder_packet; + id++; + state_machines_packet = new StackPacket(220,longest_update_ms,general_state,specific_state,voltage_state); + packets[id]=state_machines_packet; + id++; + emergency_tape_state = new StackPacket(221,emergency_tape,emergency_tape_value); + packets[id]=emergency_tape_state; + id++; + output_vtg = new StackPacket(981,output_voltage,driving_mosfets); + packets[id]=output_vtg; + id++; + Tcp_connections = new StackPacket(230,pcu_connection,obccu_connection,lcu_connection,bmsl_connection); + packets[id]=Tcp_connections; + id++; + waterblock_data = new StackPacket(231,waterblock_temperature,waterblock_pressure); + packets[id]=waterblock_data; + id++; + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp new file mode 100644 index 00000000..c6e2a74f --- /dev/null +++ b/Core/Inc/Communications/Packets/OrderPackets.hpp @@ -0,0 +1,201 @@ +#pragma once +#include "ST-LIB.hpp" + +//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class OrderPackets{ + enum class test_speed_control_direction:uint8_t{ + FORWARD=0, + BACKWARD=1 + }; + + + bool propagate_fault_callback(); + bool start_charging_obccu_callback(); + bool stop_charging_obccu_callback(); + bool open_contactors_obccu_callback(); + bool close_contactors_obccu_callback(); + bool brake_callback(); + bool unbrake_callback(); + bool set_regulator_pressure_callback(); + bool disable_emergency_tape_callback(); + bool enable_emergency_tape_callback(); + bool reset_vcu_callback(); + bool test_pwm_callback(); + bool test_current_control_callback(); + bool set_reset_on_callback(); + bool set_reset_off_callback(); + bool start_levitation_control_callback(); + bool start_vertical_levitation_callback(); + bool stop_levitation_callback(); + bool stick_down_callback(); + bool landing_callback(); + bool start_horizontal_levitation_callback(); + bool enter_testing_mode_callback(); + bool exit_testing_mode_callback(); + bool manual_zeroing_callback(); + bool set_stable_levitation_on_callback(); + bool set_stable_levitation_off_callback(); + bool set_rgb_color_callback(); + bool turn_on_party_callback(); + bool turn_off_party_callback(); + bool turn_on_pump_callback(); + bool turn_off_pump_callback(); + bool discharge_dclink_callback(); + bool change_position_references_callback(); + bool start_vf_control_callback(); + bool CRUISING_DEMONSTRATION_callback(); + + + private: + constexpr static size_t size=35; + uint32_t id{0}; + public: + std::array packets; + StackOrder* propagate_fault; + StackOrder* start_charging_obccu; + StackOrder* stop_charging_obccu; + StackOrder* open_contactors_obccu; + StackOrder* close_contactors_obccu; + StackOrder* brake; + StackOrder* unbrake; + StackOrder* set_regulator_pressure; + StackOrder* disable_emergency_tape; + StackOrder* enable_emergency_tape; + StackOrder* reset_vcu; + StackOrder* test_pwm; + StackOrder* test_current_control; + StackOrder* set_reset_on; + StackOrder* set_reset_off; + StackOrder* start_levitation_control; + StackOrder* start_vertical_levitation; + StackOrder* stop_levitation; + StackOrder* stick_down; + StackOrder* landing; + StackOrder* start_horizontal_levitation; + StackOrder* enter_testing_mode; + StackOrder* exit_testing_mode; + StackOrder* manual_zeroing; + StackOrder* set_stable_levitation_on; + StackOrder* set_stable_levitation_off; + StackOrder* set_rgb_color; + StackOrder* turn_on_party; + StackOrder* turn_off_party; + StackOrder* turn_on_pump; + StackOrder* turn_off_pump; + StackOrder* discharge_dclink; + StackOrder* change_position_references; + StackOrder* start_vf_control; + StackOrder* CRUISING_DEMONSTRATION; + + + OrderPackets(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &pwm_duty_cycle,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &target_test_speed_control_kmh,test_speed_control_direction &test_speed_control_direction,float64 &lower_position_limit,float64 &upper_position_limit}}) +{ + + propagate_fault=new StackOrder(0,propagate_fault_callback); + packets[id]=propagate_fault; + id++; + start_charging_obccu=new StackOrder(900,start_charging_obccu_callback); + packets[id]=start_charging_obccu; + id++; + stop_charging_obccu=new StackOrder(901,stop_charging_obccu_callback); + packets[id]=stop_charging_obccu; + id++; + open_contactors_obccu=new StackOrder(902,open_contactors_obccu_callback); + packets[id]=open_contactors_obccu; + id++; + close_contactors_obccu=new StackOrder(903,close_contactors_obccu_callback); + packets[id]=close_contactors_obccu; + id++; + brake=new StackOrder(215,brake_callback); + packets[id]=brake; + id++; + unbrake=new StackOrder(216,unbrake_callback); + packets[id]=unbrake; + id++; + set_regulator_pressure=new StackOrder(210,set_regulator_pressure_callback,new_reference_pressure); + packets[id]=set_regulator_pressure; + id++; + disable_emergency_tape=new StackOrder(217,disable_emergency_tape_callback); + packets[id]=disable_emergency_tape; + id++; + enable_emergency_tape=new StackOrder(218,enable_emergency_tape_callback); + packets[id]=enable_emergency_tape; + id++; + reset_vcu=new StackOrder(223,reset_vcu_callback); + packets[id]=reset_vcu; + id++; + test_pwm=new StackOrder(350,test_pwm_callback,ldu_id,pwm_duty_cycle); + packets[id]=test_pwm; + id++; + test_current_control=new StackOrder(352,test_current_control_callback,ldu_id,lcu_desired_current); + packets[id]=test_current_control; + id++; + set_reset_on=new StackOrder(353,set_reset_on_callback,ldu_buffer_id); + packets[id]=set_reset_on; + id++; + set_reset_off=new StackOrder(354,set_reset_off_callback,ldu_buffer_id); + packets[id]=set_reset_off; + id++; + start_levitation_control=new StackOrder(355,start_levitation_control_callback,lcu_desired_distance); + packets[id]=start_levitation_control; + id++; + start_vertical_levitation=new StackOrder(356,start_vertical_levitation_callback,lcu_desired_distance); + packets[id]=start_vertical_levitation; + id++; + stop_levitation=new StackOrder(357,stop_levitation_callback); + packets[id]=stop_levitation; + id++; + stick_down=new StackOrder(358,stick_down_callback); + packets[id]=stick_down; + id++; + landing=new StackOrder(359,landing_callback); + packets[id]=landing; + id++; + start_horizontal_levitation=new StackOrder(360,start_horizontal_levitation_callback); + packets[id]=start_horizontal_levitation; + id++; + enter_testing_mode=new StackOrder(361,enter_testing_mode_callback); + packets[id]=enter_testing_mode; + id++; + exit_testing_mode=new StackOrder(362,exit_testing_mode_callback); + packets[id]=exit_testing_mode; + id++; + manual_zeroing=new StackOrder(611,manual_zeroing_callback); + packets[id]=manual_zeroing; + id++; + set_stable_levitation_on=new StackOrder(363,set_stable_levitation_on_callback); + packets[id]=set_stable_levitation_on; + id++; + set_stable_levitation_off=new StackOrder(364,set_stable_levitation_off_callback); + packets[id]=set_stable_levitation_off; + id++; + set_rgb_color=new StackOrder(290,set_rgb_color_callback); + packets[id]=set_rgb_color; + id++; + turn_on_party=new StackOrder(291,turn_on_party_callback); + packets[id]=turn_on_party; + id++; + turn_off_party=new StackOrder(292,turn_off_party_callback); + packets[id]=turn_off_party; + id++; + turn_on_pump=new StackOrder(293,turn_on_pump_callback); + packets[id]=turn_on_pump; + id++; + turn_off_pump=new StackOrder(294,turn_off_pump_callback); + packets[id]=turn_off_pump; + id++; + discharge_dclink=new StackOrder(368,discharge_dclink_callback); + packets[id]=discharge_dclink; + id++; + change_position_references=new StackOrder(645,change_position_references_callback,lower_position_limit,upper_position_limit); + packets[id]=change_position_references; + id++; + start_vf_control=new StackOrder(625,start_vf_control_callback); + packets[id]=start_vf_control; + id++; + CRUISING_DEMONSTRATION=new StackOrder(646,CRUISING_DEMONSTRATION_callback,target_test_speed_control_kmh,test_speed_control_direction,lower_position_limit,upper_position_limit); + packets[id]=CRUISING_DEMONSTRATION; + id++; + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/Protections.hpp b/Core/Inc/Communications/Packets/Protections.hpp new file mode 100644 index 00000000..c4bd13ab --- /dev/null +++ b/Core/Inc/Communications/Packets/Protections.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data protections for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataProtections{ + public: + DataProtections(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &reference_pressure,float32 &actual_pressure,float32 &high_pressure,float64 &position,float64 &speed,float64 &acceleration,uint16_t &output_voltage){ + + ProtectionManager::_add_protection(new_reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("new_reference_pressure"); + ProtectionManager::_add_protection(ldu_id,Boundary(1),Boundary(1),Boundary(10),Boundary(10)}).set_name("ldu_id"); + ProtectionManager::_add_protection(lcu_desired_current,Boundary(-50),Boundary(-70),Boundary(50),Boundary(70)}).set_name("lcu_desired_current"); + ProtectionManager::_add_protection(ldu_buffer_id,Boundary(1),Boundary(1),Boundary(5),Boundary(5)}).set_name("ldu_buffer_id"); + ProtectionManager::_add_protection(lcu_desired_distance,Boundary(0.0001),Boundary(0.01),Boundary(0.03),Boundary(0.03)}).set_name("lcu_desired_distance"); + ProtectionManager::_add_protection(lower_position_limit,Boundary(-2),Boundary(0)}).set_name("lower_position_limit"); + ProtectionManager::_add_protection(upper_position_limit,Boundary(1),Boundary(36)}).set_name("upper_position_limit"); + ProtectionManager::_add_protection(reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("reference_pressure"); + ProtectionManager::_add_protection(actual_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("actual_pressure"); + ProtectionManager::_add_protection(high_pressure,Boundary(40),Boundary(0),Boundary(200),Boundary(200)}).set_name("high_pressure"); + ProtectionManager::_add_protection(position,Boundary(0),Boundary(0),Boundary(40),Boundary(50)}).set_name("position"); + ProtectionManager::_add_protection(speed,Boundary(0),Boundary(0),Boundary(8.33),Boundary(13.88)}).set_name("speed"); + ProtectionManager::_add_protection(acceleration,Boundary(0),Boundary(0),Boundary(9.8),Boundary(19.6)}).set_name("acceleration"); + ProtectionManager::_add_protection(output_voltage,Boundary(192),Boundary(0),Boundary(252),Boundary(252)}).set_name("output_voltage"); + +} +}; \ No newline at end of file diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp new file mode 100644 index 00000000..0a448b41 --- /dev/null +++ b/Core/Inc/state_machine.hpp @@ -0,0 +1,73 @@ +#pragma once +#include "ST-LIB.hpp" +using namespace std::chrono_literals; + +// AUTOGENERATED CODE, DO NOT EDIT MANUALLY + +class Example{ + + public: + + static bool from_1_to_2(); + static bool from_1_to_2(); + static bool from_1_to_nested_1(); + static void enter_action_1(); + static void enter_action_2(); + static void enter_action_3(); + static void enter_action_4(); + static void low_precision_action(); + static void low_precision_action(); + static void mid_precision_action_to_nested_state(); + static void mid_precision_action_to_nested_state(); + static void high_precision_action_with_description(); + static void high_precision_action_with_description(); + static void exit_action_1(); + static void exit_action_2(); + + StateMachine Example_State_Machine; + StateMachine Nested_State_Machine; + + enum ExampleStates { + NAME_1, + NAME_2, + }; + + enum Nested{ + NESTED_NAME_1, + NESTED_NAME_2, + }; + + Example(){ + + Example_State_Machine = StateMachine(ExampleStates::NAME_1); + + Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); + Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); + Nested_State_Machine.add_state(Nested::NESTED_NAME_2); + + Example_State_Machine.add_state(ExampleStates::NAME_2); + + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + // Transitioning from 1 to 2 + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); + + Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); + Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); + // Description of enter_action_3 + Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); + Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); + Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); + Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); + + } + +}; \ No newline at end of file diff --git a/deps/ST-LIB b/deps/ST-LIB index ce53a8ad..1af648a0 160000 --- a/deps/ST-LIB +++ b/deps/ST-LIB @@ -1 +1 @@ -Subproject commit ce53a8adbbaff2d7ba19f96a555904569c18aeec +Subproject commit 1af648a011e4fb0f87031ef1b6b24f9a62c76955 diff --git a/template-project.code-workspace b/template-project.code-workspace index b8682958..1909c9d2 100644 --- a/template-project.code-workspace +++ b/template-project.code-workspace @@ -2,9 +2,6 @@ "folders": [ { "path": "." - }, - { - "path": "../Projectos/ST-LIB" } ], "settings": { From 2d4eccb51afff3022caf148b0a9dae96ede439ba Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 1 Sep 2025 02:26:47 +0200 Subject: [PATCH 12/48] Changed packet description structure and how it reads adj, works fine --- Core/Inc/Code_generation/Generator.py | 20 +- .../Packet_generation/DataTemplate.hpp | 7 +- .../Packet_generation/OrderTemplate.hpp | 8 +- .../Packet_generation/Packet_descriptions.py | 137 ++++-------- .../Packet_generation/Packet_generation.py | 121 ++++++----- .../Communications/Packets/DataPackets.hpp | 124 ----------- .../Communications/Packets/OrderPackets.hpp | 201 ------------------ .../Communications/Packets/Protections.hpp | 25 --- 8 files changed, 127 insertions(+), 516 deletions(-) delete mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/Protections.hpp diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index ea12751c..6e7fbf53 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -8,22 +8,26 @@ sys.exit() JSONpath = "Core/Inc/Code_generation/JSON_ADE" -boards = Generate_PacketDescription(JSONpath) + aux = sys.argv[1] filtered = "" -for c in aux: - if c.isalpha(): - filtered += c +for char in aux: + if char.isalpha(): + filtered += char else: break board = filtered + + +boards = Generate_PacketDescription(JSONpath, board) + if board not in boards: + print("Board not found, exiting...") sys.exit() - -Generate_DataPackets_hpp(board) -Generate_OrderPackets_hpp(board) -Generate_Protections_hpp(board) if __name__ == "__main__": + Generate_DataPackets_hpp(board) + Generate_OrderPackets_hpp(board) + # Generate_Protections_hpp(board), no protections for now with open("state_machine.json", "r") as file: data = json.load(file) sm = parse_state_machine(data) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 416dba97..389be96b 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -3,11 +3,12 @@ //Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- class DataPackets{ - {% for enum in enums %}enum class {{enum.name}}:uint8_t{ + {% for enum in enums %}enum class {{enum.name}}:uint8_t + { {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} {% endfor %}}; - {%endfor %} + {%endfor %} private: constexpr static size_t size={{size}}; @@ -17,7 +18,7 @@ class DataPackets{ {%for packet in packets%}StackPacket* {{packet.name}}; {% endfor %} - DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}}}) + DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) { {% for packet in packets %}{{packet.name}} = new StackPacket({{packet.id}}{% if packet.data%},{{packet.data}}{% endif%}); diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 4dafe252..69c4de21 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -3,12 +3,14 @@ //Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- class OrderPackets{ - {% for enum in enums %}enum class {{enum.name}}:uint8_t{ + {% for enum in enums %}enum class {{enum.name}}:uint8_t + { {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} {% endfor %}}; + {% endfor %} - {%for packet in packets%}bool {{packet.name}}_callback(); + {%for packet in packets%}void {{packet.name}}_cb(); {% endfor %} private: @@ -22,7 +24,7 @@ class OrderPackets{ OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}}}) { - {% for packet in packets %}{{packet.name}}=new StackOrder({{packet.id}},{{packet.name}}_callback{% if packet.data%},{{packet.data}}{% endif%}); + {% for packet in packets %}{{packet.name}}=new StackOrder({{packet.id}},{{packet.name}}_cb{% if packet.data%},{{packet.data}}{% endif%}); packets[id]={{packet.name}}; id++; {% endfor %} diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 54de2ce0..858ef1bf 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -1,84 +1,83 @@ -import re +import re import json -class BoardDescription: +class BoardDescription: def __init__(self,name:str,board:dict,JSONpath:str): self.name = name self.id = board["board_id"] self.ip = board["board_ip"] self.data_size =0 self.order_size =0 - i = 0 + self.measurements_files = board["measurements"] + self.packet_files = board["packets"] + self.measurement_lists = [] self.packets = {} + for measurement in board["measurements"]: + with open(JSONpath+"/boards/" + name + "/" + measurement) as f: + m = json.load(f) + self.measurement_lists.append(m) for packets in board["packets"]: packets_name = re.split(r'_|\.', packets)[0] self.packets[packets_name] = [] - measurement = self._MeasurementFileSearch(packets,board["measurements"]) - with open(JSONpath+"/boards/" + name+"/" + board["packets"][i]) as f: + with open(JSONpath+"/boards/" + name+"/" + packets) as f: p= json.load(f) - with open(JSONpath+"/boards/" + name + "/" + measurement) as f: - m = json.load(f) - i += 1 - for packet in p["packets"]: - j=0 - self.packets[packets_name].append(PacketDescription(packet,m)) - if self.packets[packets_name][j].type != "order": + i=0 + for packet in p: + self.packets[packets_name].append(PacketDescription(packet,self.measurement_lists)) + if self.packets[packets_name][i].type != "order": self.data_size += 1 else: self.order_size += 1 - j += 1 - @staticmethod - def _MeasurementFileSearch(packet:str,measurements:dict): - packet_name = packet.split('_')[0] - for measurement in measurements: - measurement_name = measurement.split('_')[0] - if packet_name[0] == measurement_name[0]: - return measurement - else: - return measurements[0] + i += 1 class PacketDescription: - def __init__(self, packet:dict,measurements:dict): + def __init__(self, packet:dict,measurements:list): self.id =packet["id"] - self.name = (packet["name"].replace(" ", "_").replace("(", "").replace(")", "")) + self.name = packet["name"].replace(" ", "_").replace("-", "_") self.type = packet["type"] self.variables = [] self.measurements = [] + if "variables" not in packet: + return for variable in packet["variables"]: - self.variables.append(variable["name"]) - self.measurements.append(MeasurmentsDescription(measurements,variable["name"])) - + self.variables.append(variable) + self.measurements.append(MeasurmentsDescription(measurements,variable)) class MeasurmentsDescription: - def __init__(self,measurements:dict, variable:str): + def __init__(self,measurements:list, variable:str): self.id = variable + if not hasattr(self.__class__, 'viewed_measurements'): + self.__class__.viewed_measurements = {} measurement = self._MeasurementSearch(measurements,variable) + if measurement is None: + print(variable) raise Exception("Measurement not found") - else: - self.name = measurement["name"] - self.type = self._unsigned_int_correction(measurement["type"]) - if self.type == "enum": - values = [] - for value in measurement["enumValues"]: - values.append(str(value)) - self.enum ={"name": measurement["id"], "values": self._Enum_values_correction(values)} - self.type = measurement["id"] - protections = self._protection_search(measurement) - if protections is not None: - self.protections = self.Protections(protections) - + + self.name = measurement["name"] + self.type = (self._unsigned_int_correction(measurement["type"]).replace(" ", "_").replace("-", "_")) + if self.type == "enum": + values = [] + for value in measurement["enumValues"]: + values.append(str(value)) + self.enum ={"name": (measurement["id"].replace(" ", "_").replace("-", "_")), "values": self._Enum_values_correction(values)} + self.type = (measurement["id"].replace(" ", "_").replace("-", "_")) + @staticmethod def _Enum_values_correction(values:list): for i in range(len(values)): - values[i] = values[i].replace(" ", "_") + values[i] = values[i].replace(" ", "_").replace("-", "_") return values @staticmethod - def _MeasurementSearch(measurements:dict, variable:str): - for measurment in measurements["measurements"]: - if measurment["id"] == variable: - return measurment + def _MeasurementSearch(measurements:list, variable:str): + if variable in MeasurmentsDescription.viewed_measurements: + return MeasurmentsDescription.viewed_measurements[variable] + for measurement_list in measurements: + for measurment in measurement_list: + if measurment["id"] == variable: + MeasurmentsDescription.viewed_measurements[variable] = measurment + return measurment return None @@ -87,48 +86,4 @@ def _unsigned_int_correction(type:str): aux_type = type[:4] if aux_type == "uint": type += "_t" - return type - - @staticmethod - def _protection_search(measurement:dict): - warningRange = measurement.get("warningRange") - safeRange = measurement.get("safeRange") - if warningRange is None and safeRange is None: - return None - - protections = [[None, None], [None, None]] - - if safeRange is not None: - for i in range(len(safeRange)): - protections[0][i] = safeRange[i] - - if warningRange is not None: - for i in range(len(warningRange)): - protections[1][i] = warningRange[i] - - return protections - - class Protections: - class Below: - def __init__(self, protections:list): - self.Protectionvalue = [None, None] - self.ProtectionType = "Below" - if protections[0] is not None and protections[0][0] is not None: - self.Protectionvalue[0] = protections[0][0] - if protections[1] is not None and protections[1][0] is not None: - self.Protectionvalue[1] = protections[1][0] - - class Above: - def __init__(self, protections:list): - self.Protectionvalue = [None, None] - self.ProtectionType = "Above" - if protections[0] is not None and protections[0][1] is not None: - self.Protectionvalue[0] = protections[0][1] - if protections[1] is not None and protections[1][1] is not None: - self.Protectionvalue[1] = protections[1][1] - - def __init__(self, protections:list): - self.protections = [None, None] - self.protections[0] = self.Below(protections) - self.protections[1] = self.Above(protections) - + 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 7c4decf1..8269d54c 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -5,16 +5,15 @@ templates_path = "Core/Inc/Code_generation/Packet_generation" -def Generate_PacketDescription(JSONpath:str): +def Generate_PacketDescription(JSONpath:str,board:str): with open(JSONpath+"/boards.json") as f: boards = json.load(f) boards_name = [] - for board in boards["boards"]: - - with open(JSONpath+"/" + (boards["boards"][board])) as f: - b = json.load(f) + for b in boards: + boards_name.append(b) + with open(JSONpath+"/" + (boards[board])) as f: + b = json.load(f) board_instance = BoardDescription(board, b,JSONpath) - boards_name.append(board_instance.name) globals()[board] = board_instance return boards_name @@ -45,10 +44,10 @@ def GenerateDataPackets(board:BoardDescription): tempdata +=(str(variable) +",") if tempdata.endswith(","): tempdata = tempdata[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata , "id": packet_instance.id} + aux_packet = {"name": packet_instance.name, "data":tempdata.replace(" ", "_").replace("-", "_") , "id": packet_instance.id} 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.id.replace(" ", "_").replace("-", "_")} totaldata.append(aux_data) return Packets,totaldata @@ -142,63 +141,63 @@ def Generate_OrderPackets_hpp(board_input:str): #--------------Protections.hpp generation---------------# -def Generate_Protections_context(board:BoardDescription): - def Get_Bondaries(measurement:MeasurmentsDescription): - Boundaries = [] - for i in {0,1}: - for j in {0,1}: - if measurement.protections.protections[i].Protectionvalue[j] is None: - continue - temp_boundary= {"type": measurement.type, "Above_or_Below":measurement.protections.protections[i].ProtectionType, "value": measurement.protections.protections[i].Protectionvalue[j],"coma":"," } - Boundaries.append(temp_boundary) +# def Generate_Protections_context(board:BoardDescription): +# def Get_Bondaries(measurement:MeasurmentsDescription): +# Boundaries = [] +# for i in {0,1}: +# for j in {0,1}: +# if measurement.protections.protections[i].Protectionvalue[j] is None: +# continue +# temp_boundary= {"type": measurement.type, "Above_or_Below":measurement.protections.protections[i].ProtectionType, "value": measurement.protections.protections[i].Protectionvalue[j],"coma":"," } +# Boundaries.append(temp_boundary) - Boundaries[-1]["coma"] = "" - return Boundaries +# Boundaries[-1]["coma"] = "" +# return Boundaries - def Get_protection_packets(board:BoardDescription): - protections = [] - for packet in board.packets: - for packet_instance in board.packets[packet]: - for measurement in packet_instance.measurements: - if hasattr(measurement, "protections"): - protections.append(measurement) - if len(protections) == 0: - return False - return protections +# def Get_protection_packets(board:BoardDescription): +# protections = [] +# for packet in board.packets: +# for packet_instance in board.packets[packet]: +# for measurement in packet_instance.measurements: +# if hasattr(measurement, "protections"): +# protections.append(measurement) +# if len(protections) == 0: +# return False +# return protections - protection_packets = Get_protection_packets(board) - if protection_packets == False: - return False - protections=[] - data =[] - for measurement in protection_packets: - Boundaries = Get_Bondaries(measurement) - aux_protection = {"packet": measurement.id, "Boundaries": Boundaries} - aux_data = {"type": measurement.type, "name": measurement.id} - if aux_data not in data: - data.append(aux_data) - if aux_protection in protections: - continue - protections.append(aux_protection) +# protection_packets = Get_protection_packets(board) +# if protection_packets == False: +# return False +# protections=[] +# data =[] +# for measurement in protection_packets: +# Boundaries = Get_Bondaries(measurement) +# aux_protection = {"packet": measurement.id, "Boundaries": Boundaries} +# aux_data = {"type": measurement.type, "name": measurement.id} +# if aux_data not in data: +# data.append(aux_data) +# if aux_protection in protections: +# continue +# protections.append(aux_protection) - context ={ - "board": board.name, - "data": data, - "protections": protections - } - return context +# context ={ +# "board": board.name, +# "data": data, +# "protections": protections +# } +# return context -def Generate_Protections_hpp(board_input:str): - protections_path = "Core/Inc/Communications/Packets/Protections.hpp" - board_instance = globals()[board_input] - env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) - template = env.get_template("ProtectionsTemplate.hpp") - context = Generate_Protections_context(board_instance) - if context == False: - if os.path.exists(protections_path): - os.remove(protections_path) - return - with open(protections_path,"w") as Output: - Output.write(template.render(context)) \ No newline at end of file +# def Generate_Protections_hpp(board_input:str): +# protections_path = "Core/Inc/Communications/Packets/Protections.hpp" +# board_instance = globals()[board_input] +# env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) +# template = env.get_template("ProtectionsTemplate.hpp") +# context = Generate_Protections_context(board_instance) +# if context == False: +# if os.path.exists(protections_path): +# os.remove(protections_path) +# return +# with open(protections_path,"w") as Output: +# Output.write(template.render(context)) \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp deleted file mode 100644 index 112e3982..00000000 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataPackets{ - enum class valve_state:uint8_t{ - VALVE_OPEN=0, - VALVE_CLOSED=1 - }; - enum class reed1:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed2:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed3:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class reed4:uint8_t{ - EXTENDED=0, - RETRACTED=1 - }; - enum class general_state:uint8_t{ - CONNECTING=0, - OPERATIONAL=1, - FAULT=2 - }; - enum class specific_state:uint8_t{ - IDLE=0, - TAKING_OFF=1, - STABLE_LEVITATION=2, - PROPULSION=3, - LANDING=4, - UNLOADING=5, - LOADING=6, - TRACTION=7 - }; - enum class voltage_state:uint8_t{ - NOT_HV=0, - HV=1 - }; - enum class emergency_tape:uint8_t{ - DISABLED=0, - ENABLED=1 - }; - enum class emergency_tape_value:uint8_t{ - NORMAL=0, - EMERGENCY=1 - }; - enum class pcu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class obccu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class lcu_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - enum class bmsl_connection:uint8_t{ - Disconnected=0, - Connected=1 - }; - - - - private: - constexpr static size_t size=35; - uint32_t id{0}; - public: - std::array packets; - StackPacket* vcu_regulator_packet; - StackPacket* vcu_reed_packet; - StackPacket* vcu_bottle_temperature_packet; - StackPacket* vcu_pressure_packet; - StackPacket* encoder_packet; - StackPacket* state_machines_packet; - StackPacket* emergency_tape_state; - StackPacket* output_vtg; - StackPacket* Tcp_connections; - StackPacket* waterblock_data; - - - DataPackets(valve_state &valve_state,float32 &reference_pressure,float32 &actual_pressure,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,float64 &bottle_temp_1,float64 &bottle_temp_2,float32 &high_pressure,float32 &low_pressure_1,float32 &low_pressure_2,float64 &direction,float64 &position,float64 &speed,float64 &acceleration,uint32_t &longest_update_ms,general_state &general_state,specific_state &specific_state,voltage_state &voltage_state,emergency_tape &emergency_tape,emergency_tape_value &emergency_tape_value,uint16_t &output_voltage,bool &driving_mosfets,pcu_connection &pcu_connection,obccu_connection &obccu_connection,lcu_connection &lcu_connection,bmsl_connection &bmsl_connection,float32 &waterblock_temperature,float32 &waterblock_pressure}}) -{ - - vcu_regulator_packet = new StackPacket(211,valve_state,reference_pressure,actual_pressure); - packets[id]=vcu_regulator_packet; - id++; - vcu_reed_packet = new StackPacket(212,reed1,reed2,reed3,reed4); - packets[id]=vcu_reed_packet; - id++; - vcu_bottle_temperature_packet = new StackPacket(213,bottle_temp_1,bottle_temp_2); - packets[id]=vcu_bottle_temperature_packet; - id++; - vcu_pressure_packet = new StackPacket(214,high_pressure,low_pressure_1,low_pressure_2); - packets[id]=vcu_pressure_packet; - id++; - encoder_packet = new StackPacket(219,direction,position,speed,acceleration); - packets[id]=encoder_packet; - id++; - state_machines_packet = new StackPacket(220,longest_update_ms,general_state,specific_state,voltage_state); - packets[id]=state_machines_packet; - id++; - emergency_tape_state = new StackPacket(221,emergency_tape,emergency_tape_value); - packets[id]=emergency_tape_state; - id++; - output_vtg = new StackPacket(981,output_voltage,driving_mosfets); - packets[id]=output_vtg; - id++; - Tcp_connections = new StackPacket(230,pcu_connection,obccu_connection,lcu_connection,bmsl_connection); - packets[id]=Tcp_connections; - id++; - waterblock_data = new StackPacket(231,waterblock_temperature,waterblock_pressure); - packets[id]=waterblock_data; - id++; - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp deleted file mode 100644 index c6e2a74f..00000000 --- a/Core/Inc/Communications/Packets/OrderPackets.hpp +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class OrderPackets{ - enum class test_speed_control_direction:uint8_t{ - FORWARD=0, - BACKWARD=1 - }; - - - bool propagate_fault_callback(); - bool start_charging_obccu_callback(); - bool stop_charging_obccu_callback(); - bool open_contactors_obccu_callback(); - bool close_contactors_obccu_callback(); - bool brake_callback(); - bool unbrake_callback(); - bool set_regulator_pressure_callback(); - bool disable_emergency_tape_callback(); - bool enable_emergency_tape_callback(); - bool reset_vcu_callback(); - bool test_pwm_callback(); - bool test_current_control_callback(); - bool set_reset_on_callback(); - bool set_reset_off_callback(); - bool start_levitation_control_callback(); - bool start_vertical_levitation_callback(); - bool stop_levitation_callback(); - bool stick_down_callback(); - bool landing_callback(); - bool start_horizontal_levitation_callback(); - bool enter_testing_mode_callback(); - bool exit_testing_mode_callback(); - bool manual_zeroing_callback(); - bool set_stable_levitation_on_callback(); - bool set_stable_levitation_off_callback(); - bool set_rgb_color_callback(); - bool turn_on_party_callback(); - bool turn_off_party_callback(); - bool turn_on_pump_callback(); - bool turn_off_pump_callback(); - bool discharge_dclink_callback(); - bool change_position_references_callback(); - bool start_vf_control_callback(); - bool CRUISING_DEMONSTRATION_callback(); - - - private: - constexpr static size_t size=35; - uint32_t id{0}; - public: - std::array packets; - StackOrder* propagate_fault; - StackOrder* start_charging_obccu; - StackOrder* stop_charging_obccu; - StackOrder* open_contactors_obccu; - StackOrder* close_contactors_obccu; - StackOrder* brake; - StackOrder* unbrake; - StackOrder* set_regulator_pressure; - StackOrder* disable_emergency_tape; - StackOrder* enable_emergency_tape; - StackOrder* reset_vcu; - StackOrder* test_pwm; - StackOrder* test_current_control; - StackOrder* set_reset_on; - StackOrder* set_reset_off; - StackOrder* start_levitation_control; - StackOrder* start_vertical_levitation; - StackOrder* stop_levitation; - StackOrder* stick_down; - StackOrder* landing; - StackOrder* start_horizontal_levitation; - StackOrder* enter_testing_mode; - StackOrder* exit_testing_mode; - StackOrder* manual_zeroing; - StackOrder* set_stable_levitation_on; - StackOrder* set_stable_levitation_off; - StackOrder* set_rgb_color; - StackOrder* turn_on_party; - StackOrder* turn_off_party; - StackOrder* turn_on_pump; - StackOrder* turn_off_pump; - StackOrder* discharge_dclink; - StackOrder* change_position_references; - StackOrder* start_vf_control; - StackOrder* CRUISING_DEMONSTRATION; - - - OrderPackets(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &pwm_duty_cycle,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &target_test_speed_control_kmh,test_speed_control_direction &test_speed_control_direction,float64 &lower_position_limit,float64 &upper_position_limit}}) -{ - - propagate_fault=new StackOrder(0,propagate_fault_callback); - packets[id]=propagate_fault; - id++; - start_charging_obccu=new StackOrder(900,start_charging_obccu_callback); - packets[id]=start_charging_obccu; - id++; - stop_charging_obccu=new StackOrder(901,stop_charging_obccu_callback); - packets[id]=stop_charging_obccu; - id++; - open_contactors_obccu=new StackOrder(902,open_contactors_obccu_callback); - packets[id]=open_contactors_obccu; - id++; - close_contactors_obccu=new StackOrder(903,close_contactors_obccu_callback); - packets[id]=close_contactors_obccu; - id++; - brake=new StackOrder(215,brake_callback); - packets[id]=brake; - id++; - unbrake=new StackOrder(216,unbrake_callback); - packets[id]=unbrake; - id++; - set_regulator_pressure=new StackOrder(210,set_regulator_pressure_callback,new_reference_pressure); - packets[id]=set_regulator_pressure; - id++; - disable_emergency_tape=new StackOrder(217,disable_emergency_tape_callback); - packets[id]=disable_emergency_tape; - id++; - enable_emergency_tape=new StackOrder(218,enable_emergency_tape_callback); - packets[id]=enable_emergency_tape; - id++; - reset_vcu=new StackOrder(223,reset_vcu_callback); - packets[id]=reset_vcu; - id++; - test_pwm=new StackOrder(350,test_pwm_callback,ldu_id,pwm_duty_cycle); - packets[id]=test_pwm; - id++; - test_current_control=new StackOrder(352,test_current_control_callback,ldu_id,lcu_desired_current); - packets[id]=test_current_control; - id++; - set_reset_on=new StackOrder(353,set_reset_on_callback,ldu_buffer_id); - packets[id]=set_reset_on; - id++; - set_reset_off=new StackOrder(354,set_reset_off_callback,ldu_buffer_id); - packets[id]=set_reset_off; - id++; - start_levitation_control=new StackOrder(355,start_levitation_control_callback,lcu_desired_distance); - packets[id]=start_levitation_control; - id++; - start_vertical_levitation=new StackOrder(356,start_vertical_levitation_callback,lcu_desired_distance); - packets[id]=start_vertical_levitation; - id++; - stop_levitation=new StackOrder(357,stop_levitation_callback); - packets[id]=stop_levitation; - id++; - stick_down=new StackOrder(358,stick_down_callback); - packets[id]=stick_down; - id++; - landing=new StackOrder(359,landing_callback); - packets[id]=landing; - id++; - start_horizontal_levitation=new StackOrder(360,start_horizontal_levitation_callback); - packets[id]=start_horizontal_levitation; - id++; - enter_testing_mode=new StackOrder(361,enter_testing_mode_callback); - packets[id]=enter_testing_mode; - id++; - exit_testing_mode=new StackOrder(362,exit_testing_mode_callback); - packets[id]=exit_testing_mode; - id++; - manual_zeroing=new StackOrder(611,manual_zeroing_callback); - packets[id]=manual_zeroing; - id++; - set_stable_levitation_on=new StackOrder(363,set_stable_levitation_on_callback); - packets[id]=set_stable_levitation_on; - id++; - set_stable_levitation_off=new StackOrder(364,set_stable_levitation_off_callback); - packets[id]=set_stable_levitation_off; - id++; - set_rgb_color=new StackOrder(290,set_rgb_color_callback); - packets[id]=set_rgb_color; - id++; - turn_on_party=new StackOrder(291,turn_on_party_callback); - packets[id]=turn_on_party; - id++; - turn_off_party=new StackOrder(292,turn_off_party_callback); - packets[id]=turn_off_party; - id++; - turn_on_pump=new StackOrder(293,turn_on_pump_callback); - packets[id]=turn_on_pump; - id++; - turn_off_pump=new StackOrder(294,turn_off_pump_callback); - packets[id]=turn_off_pump; - id++; - discharge_dclink=new StackOrder(368,discharge_dclink_callback); - packets[id]=discharge_dclink; - id++; - change_position_references=new StackOrder(645,change_position_references_callback,lower_position_limit,upper_position_limit); - packets[id]=change_position_references; - id++; - start_vf_control=new StackOrder(625,start_vf_control_callback); - packets[id]=start_vf_control; - id++; - CRUISING_DEMONSTRATION=new StackOrder(646,CRUISING_DEMONSTRATION_callback,target_test_speed_control_kmh,test_speed_control_direction,lower_position_limit,upper_position_limit); - packets[id]=CRUISING_DEMONSTRATION; - id++; - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/Protections.hpp b/Core/Inc/Communications/Packets/Protections.hpp deleted file mode 100644 index c4bd13ab..00000000 --- a/Core/Inc/Communications/Packets/Protections.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data protections for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataProtections{ - public: - DataProtections(float32 &new_reference_pressure,uint16_t &ldu_id,float32 &lcu_desired_current,uint16_t &ldu_buffer_id,float32 &lcu_desired_distance,float64 &lower_position_limit,float64 &upper_position_limit,float32 &reference_pressure,float32 &actual_pressure,float32 &high_pressure,float64 &position,float64 &speed,float64 &acceleration,uint16_t &output_voltage){ - - ProtectionManager::_add_protection(new_reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("new_reference_pressure"); - ProtectionManager::_add_protection(ldu_id,Boundary(1),Boundary(1),Boundary(10),Boundary(10)}).set_name("ldu_id"); - ProtectionManager::_add_protection(lcu_desired_current,Boundary(-50),Boundary(-70),Boundary(50),Boundary(70)}).set_name("lcu_desired_current"); - ProtectionManager::_add_protection(ldu_buffer_id,Boundary(1),Boundary(1),Boundary(5),Boundary(5)}).set_name("ldu_buffer_id"); - ProtectionManager::_add_protection(lcu_desired_distance,Boundary(0.0001),Boundary(0.01),Boundary(0.03),Boundary(0.03)}).set_name("lcu_desired_distance"); - ProtectionManager::_add_protection(lower_position_limit,Boundary(-2),Boundary(0)}).set_name("lower_position_limit"); - ProtectionManager::_add_protection(upper_position_limit,Boundary(1),Boundary(36)}).set_name("upper_position_limit"); - ProtectionManager::_add_protection(reference_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("reference_pressure"); - ProtectionManager::_add_protection(actual_pressure,Boundary(0),Boundary(0),Boundary(10),Boundary(10)}).set_name("actual_pressure"); - ProtectionManager::_add_protection(high_pressure,Boundary(40),Boundary(0),Boundary(200),Boundary(200)}).set_name("high_pressure"); - ProtectionManager::_add_protection(position,Boundary(0),Boundary(0),Boundary(40),Boundary(50)}).set_name("position"); - ProtectionManager::_add_protection(speed,Boundary(0),Boundary(0),Boundary(8.33),Boundary(13.88)}).set_name("speed"); - ProtectionManager::_add_protection(acceleration,Boundary(0),Boundary(0),Boundary(9.8),Boundary(19.6)}).set_name("acceleration"); - ProtectionManager::_add_protection(output_voltage,Boundary(192),Boundary(0),Boundary(252),Boundary(252)}).set_name("output_voltage"); - -} -}; \ No newline at end of file From b2fd7bea6c4511f272c56859d311f98ab636484b Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 1 Sep 2025 02:29:12 +0200 Subject: [PATCH 13/48] Deleted generated code --- Core/Inc/state_machine.hpp | 73 -------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 Core/Inc/state_machine.hpp diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp deleted file mode 100644 index 0a448b41..00000000 --- a/Core/Inc/state_machine.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" -using namespace std::chrono_literals; - -// AUTOGENERATED CODE, DO NOT EDIT MANUALLY - -class Example{ - - public: - - static bool from_1_to_2(); - static bool from_1_to_2(); - static bool from_1_to_nested_1(); - static void enter_action_1(); - static void enter_action_2(); - static void enter_action_3(); - static void enter_action_4(); - static void low_precision_action(); - static void low_precision_action(); - static void mid_precision_action_to_nested_state(); - static void mid_precision_action_to_nested_state(); - static void high_precision_action_with_description(); - static void high_precision_action_with_description(); - static void exit_action_1(); - static void exit_action_2(); - - StateMachine Example_State_Machine; - StateMachine Nested_State_Machine; - - enum ExampleStates { - NAME_1, - NAME_2, - }; - - enum Nested{ - NESTED_NAME_1, - NESTED_NAME_2, - }; - - Example(){ - - Example_State_Machine = StateMachine(ExampleStates::NAME_1); - - Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); - Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); - Nested_State_Machine.add_state(Nested::NESTED_NAME_2); - - Example_State_Machine.add_state(ExampleStates::NAME_2); - - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - // Transitioning from 1 to 2 - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); - - Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); - Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); - // Description of enter_action_3 - Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); - Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); - Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); - Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); - - } - -}; \ No newline at end of file From ff301c6feb1dff8b8c8b07ad4f98ed0432500eaf Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 1 Sep 2025 15:31:20 +0200 Subject: [PATCH 14/48] Silly change that makes it so it doesnt explode when you put a wrong board --- Core/Inc/Code_generation/Generator.py | 3 --- .../Packet_generation/Packet_generation.py | 13 +++++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index 6e7fbf53..f9b8f0f3 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -21,9 +21,6 @@ boards = Generate_PacketDescription(JSONpath, board) -if board not in boards: - print("Board not found, exiting...") - sys.exit() if __name__ == "__main__": Generate_DataPackets_hpp(board) Generate_OrderPackets_hpp(board) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index 8269d54c..fc930dcf 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -2,6 +2,7 @@ import json import os import jinja2 +import sys templates_path = "Core/Inc/Code_generation/Packet_generation" @@ -11,10 +12,14 @@ def Generate_PacketDescription(JSONpath:str,board:str): boards_name = [] for b in boards: boards_name.append(b) - with open(JSONpath+"/" + (boards[board])) as f: - b = json.load(f) - board_instance = BoardDescription(board, b,JSONpath) - globals()[board] = board_instance + if board in boards_name: + with open(JSONpath+"/" + (boards[board])) as f: + b = json.load(f) + board_instance = BoardDescription(board, b,JSONpath) + globals()[board] = board_instance + else: + print("Board not found, exiting...") + sys.exit() return boards_name From 52814b9f55922529bb0df8a6ccf603a18a88e35b Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 10 Sep 2025 13:55:13 +0200 Subject: [PATCH 15/48] Sockets are now created automatically --- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/DataTemplate.hpp | 12 +- .../Packet_generation/Packet_descriptions.py | 28 +++- .../Packet_generation/Packet_generation.py | 4 + .../Communications/Packets/DataPackets.hpp | 148 ++++++++++++++++++ .../Communications/Packets/OrderPackets.hpp | 147 +++++++++++++++++ Core/Inc/state_machine.hpp | 73 +++++++++ Core/Src/Runes/generated_metadata.cpp | 6 +- 8 files changed, 414 insertions(+), 6 deletions(-) create mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp create mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp create mode 100644 Core/Inc/state_machine.hpp diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 73fb6443..dc554bfd 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 73fb6443119d83d58aab8a8fe17be0d1533d4d25 +Subproject commit dc554bfd7cde92426135518ac6747c34058f823e diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 389be96b..ad7e2d34 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -17,13 +17,23 @@ class DataPackets{ std::array packets; {%for packet in packets%}StackPacket* {{packet.name}}; {% endfor %} + + {% for socket in sockets %}{{socket.type}}* {{socket.name}} = nullptr; + {% endfor %} DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) -{ +{ + {% for socket in ServerSockets%}{{socket.name}} = new ServerSocket("{{socket.board_ip}}",{{socket.port}}); + {% endfor %} + {% for socket in DatagramSockets%}{{socket.name}} = new DatagramSocket("{{socket.board_ip}}",{{socket.port}},"{{socket.remote_ip}}",{{socket.port}}); + {% endfor %} + {% for socket in Sockets%}{{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); + {% endfor %} {% for packet in packets %}{{packet.name}} = new StackPacket({{packet.id}}{% if packet.data%},{{packet.data}}{% endif%}); packets[id]={{packet.name}}; id++; + {% 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 858ef1bf..58697089 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -6,9 +6,13 @@ def __init__(self,name:str,board:dict,JSONpath:str): self.name = name self.id = board["board_id"] self.ip = board["board_ip"] + #Sockets + with open(JSONpath+"/boards/"+name+"/sockets.json") as s: + socks = json.load(s) + self.sockets=self.SocketsDescription(socks,self.ip) + #Packets self.data_size =0 self.order_size =0 - self.measurements_files = board["measurements"] self.packet_files = board["packets"] self.measurement_lists = [] self.packets = {} @@ -29,6 +33,28 @@ def __init__(self,name:str,board:dict,JSONpath:str): else: self.order_size += 1 i += 1 + + class SocketsDescription: + def __init__(self,sockets:list,board_ip:str): + self.allSockets=[] + self.ServerSockets = [] + self.Sockets = [] + self.DatagramSockets = [] + self.board_ip = board_ip + for sock in sockets: + 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, "localport": 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): self.id =packet["id"] diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index fc930dcf..bd936fba 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -64,6 +64,10 @@ def GenerateDataPackets(board:BoardDescription): "packets" : packets, "data": data, "size": board.order_size, + "sockets":board.sockets.allSockets, + "ServerSockets":board.sockets.ServerSockets, + "Sockets":board.sockets.Sockets, + "DatagramSockets":board.sockets.DatagramSockets, } return context diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp new file mode 100644 index 00000000..d8b13caa --- /dev/null +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -0,0 +1,148 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataPackets{ + enum class general_state:uint8_t + { + CONNECTING=0, + OPERATIONAL=1, + FAULT=2 + }; + + enum class operational_state:uint8_t + { + IDLE=0, + END_OF_RUN=1, + ENERGIZED=2, + READY=3, + DEMONSTRATION=4, + RECOVERY=5 + }; + + enum class reed1:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed2:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed3:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed4:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class flow1:uint8_t + { + OFF=0, + ON=1 + }; + + enum class flow2:uint8_t + { + OFF=0, + ON=1 + }; + + enum class tape_enable_output:uint8_t + { + DISABLED=0, + ENABLED=1 + }; + + enum class emergency_tape:uint8_t + { + EMERGENCY_SECTION=0, + NORMAL_SECTION=1 + }; + + enum class SDC:uint8_t + { + OFF=0, + ON=1 + }; + + + + private: + constexpr static size_t size=18; + uint32_t id{0}; + public: + std::array packets; + StackPacket* Current_State; + StackPacket* Reeds; + StackPacket* Flow; + StackPacket* Regulator; + StackPacket* Pressure; + StackPacket* tapes; + StackPacket* sdc; + StackPacket* recovery_state; + + + ServerSocket* control_station_tcp = nullptr; + DatagramSocket* control_station_udp = nullptr; + Socket* pcu_tcp = nullptr; + DatagramSocket* pcu_udp = nullptr; + Socket* hvscu_tcp = nullptr; + DatagramSocket* hvscu_udp = nullptr; + + + DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float32 ®ulator_1_pressure,float32 ®ulator_2_pressure,float32 &pressure_high,float32 &pressure_regulator,float32 &pressure_brakes,float32 &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) +{ + control_station_tcp = new ServerSocket("192.168.1.3",50500); + + control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); + pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); + hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); + + pcu_tcp = new Socket("192.168.1.3",,"192.168.1.5",50500); + hvscu_tcp = new Socket("192.168.1.3",,"192.168.1.7",50500); + + + Current_State = new StackPacket(249,general_state,operational_state); + packets[id]=Current_State; + id++; + + Reeds = new StackPacket(251,reed1,reed2,reed3,reed4,all_reeds); + packets[id]=Reeds; + id++; + + Flow = new StackPacket(250,flow1,flow2); + packets[id]=Flow; + id++; + + Regulator = new StackPacket(252,regulator_1_pressure,regulator_2_pressure); + packets[id]=Regulator; + id++; + + Pressure = new StackPacket(253,pressure_high,pressure_regulator,pressure_brakes,pressure_capsule); + packets[id]=Pressure; + id++; + + tapes = new StackPacket(254,tape_enable_output,emergency_tape); + packets[id]=tapes; + id++; + + sdc = new StackPacket(255,SDC); + packets[id]=sdc; + id++; + + recovery_state = new StackPacket(65,state); + packets[id]=recovery_state; + id++; + + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp new file mode 100644 index 00000000..069ecfe0 --- /dev/null +++ b/Core/Inc/Communications/Packets/OrderPackets.hpp @@ -0,0 +1,147 @@ +#pragma once +#include "ST-LIB.hpp" + +//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class OrderPackets{ + enum class pump:uint8_t + { + UNIDADES=0, + PLACAS=1 + }; + + enum class regulator:uint8_t + { + REGULATOR_1=0, + REGULATOR_2=1 + }; + + enum class run_id:uint8_t + { + LIM=0 + }; + + enum class motor_direction:uint8_t + { + FORWARD=0, + BACKWARDS=1 + }; + + enum class motor_direction:uint8_t + { + FORWARD=0, + BACKWARDS=1 + }; + + enum class motor_direction:uint8_t + { + FORWARD=0, + BACKWARDS=1 + }; + + + + void Brake_cb(); + void Unbrake_cb(); + void Potencia_Refri_cb(); + void Set_Regulator_cb(); + void Enable_Tapes_cb(); + void Disbable_Tapes_cb(); + void Close_Contactors_cb(); + void Open_Contactors_cb(); + void Levitation_cb(); + void Stop_Levitation_cb(); + void Emergency_Stop_cb(); + void Propulsion_cb(); + void SVPWM_cb(); + void Stop_Motor_cb(); + void Current_Control_cb(); + void Speed_Control_cb(); + void Motor_Brake_cb(); + void Recovery_cb(); + + + private: + constexpr static size_t size=18; + uint32_t id{0}; + public: + std::array packets; + StackOrder* Brake; + StackOrder* Unbrake; + StackOrder* Potencia_Refri; + StackOrder* Set_Regulator; + StackOrder* Enable_Tapes; + StackOrder* Disbable_Tapes; + StackOrder* Close_Contactors; + StackOrder* Open_Contactors; + StackOrder* Levitation; + StackOrder* Stop_Levitation; + StackOrder* Emergency_Stop; + StackOrder* Propulsion; + StackOrder* SVPWM; + StackOrder* Stop_Motor; + StackOrder* Current_Control; + StackOrder* Speed_Control; + StackOrder* Motor_Brake; + StackOrder* Recovery; + + + OrderPackets(uint32_t &duty,pump &pump,float32 ®ulator_pressure,regulator ®ulator,float32 &levitation_distance,run_id &run_id,float32 &modulation_frequency,float32 &commutation_frequency,float32 &max_voltage,float32 &reference_voltage,motor_direction &motor_direction,float32 &modulation_frequency,float32 &commutation_frequency,float32 &reference_current,float32 &max_voltage,motor_direction &motor_direction,float32 &reference_speed,float32 &commutation_frequency,float32 &max_voltage,motor_direction &motor_direction}}) +{ + + Brake=new StackOrder(43,Brake_cb); + packets[id]=Brake; + id++; + Unbrake=new StackOrder(52,Unbrake_cb); + packets[id]=Unbrake; + id++; + Potencia_Refri=new StackOrder(33,Potencia_Refri_cb,duty,pump); + packets[id]=Potencia_Refri; + id++; + Set_Regulator=new StackOrder(34,Set_Regulator_cb,regulator_pressure,regulator); + packets[id]=Set_Regulator; + id++; + Enable_Tapes=new StackOrder(35,Enable_Tapes_cb); + packets[id]=Enable_Tapes; + id++; + Disbable_Tapes=new StackOrder(36,Disbable_Tapes_cb); + packets[id]=Disbable_Tapes; + id++; + Close_Contactors=new StackOrder(44,Close_Contactors_cb); + packets[id]=Close_Contactors; + id++; + Open_Contactors=new StackOrder(53,Open_Contactors_cb); + packets[id]=Open_Contactors; + id++; + Levitation=new StackOrder(37,Levitation_cb,levitation_distance); + packets[id]=Levitation; + id++; + Stop_Levitation=new StackOrder(46,Stop_Levitation_cb); + packets[id]=Stop_Levitation; + id++; + Emergency_Stop=new StackOrder(55,Emergency_Stop_cb); + packets[id]=Emergency_Stop; + id++; + Propulsion=new StackOrder(56,Propulsion_cb,run_id); + packets[id]=Propulsion; + id++; + SVPWM=new StackOrder(57,SVPWM_cb,modulation_frequency,commutation_frequency,max_voltage,reference_voltage,motor_direction); + packets[id]=SVPWM; + id++; + Stop_Motor=new StackOrder(58,Stop_Motor_cb); + packets[id]=Stop_Motor; + id++; + Current_Control=new StackOrder(59,Current_Control_cb,modulation_frequency,commutation_frequency,reference_current,max_voltage,motor_direction); + packets[id]=Current_Control; + id++; + Speed_Control=new StackOrder(60,Speed_Control_cb,reference_speed,commutation_frequency,max_voltage,motor_direction); + packets[id]=Speed_Control; + id++; + Motor_Brake=new StackOrder(61,Motor_Brake_cb); + packets[id]=Motor_Brake; + id++; + Recovery=new StackOrder(32,Recovery_cb); + packets[id]=Recovery; + id++; + +} +}; \ No newline at end of file diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp new file mode 100644 index 00000000..0a448b41 --- /dev/null +++ b/Core/Inc/state_machine.hpp @@ -0,0 +1,73 @@ +#pragma once +#include "ST-LIB.hpp" +using namespace std::chrono_literals; + +// AUTOGENERATED CODE, DO NOT EDIT MANUALLY + +class Example{ + + public: + + static bool from_1_to_2(); + static bool from_1_to_2(); + static bool from_1_to_nested_1(); + static void enter_action_1(); + static void enter_action_2(); + static void enter_action_3(); + static void enter_action_4(); + static void low_precision_action(); + static void low_precision_action(); + static void mid_precision_action_to_nested_state(); + static void mid_precision_action_to_nested_state(); + static void high_precision_action_with_description(); + static void high_precision_action_with_description(); + static void exit_action_1(); + static void exit_action_2(); + + StateMachine Example_State_Machine; + StateMachine Nested_State_Machine; + + enum ExampleStates { + NAME_1, + NAME_2, + }; + + enum Nested{ + NESTED_NAME_1, + NESTED_NAME_2, + }; + + Example(){ + + Example_State_Machine = StateMachine(ExampleStates::NAME_1); + + Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); + Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); + Nested_State_Machine.add_state(Nested::NESTED_NAME_2); + + Example_State_Machine.add_state(ExampleStates::NAME_2); + + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + // Transitioning from 1 to 2 + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); + + Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); + Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); + // Description of enter_action_3 + Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); + Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); + Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); + Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); + + } + +}; \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 77dbc457..f07c2255 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250605T165128" // DateTime using ISO-8601 format + "20250910T135404" // DateTime using ISO-8601 format " " // alignment - "77b804dd" // STLIB commit + "1af648a0" // STLIB commit "--------" // ADJ commit - "3a365135" // Board commit + "69116f1a" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 623bcc0c2babeb01044f09a5762f816776c1c1ef Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 10 Sep 2025 13:56:59 +0200 Subject: [PATCH 16/48] Missed a _, now working --- .../Code_generation/Packet_generation/Packet_descriptions.py | 2 +- Core/Inc/Communications/Packets/DataPackets.hpp | 4 ++-- Core/Src/Runes/generated_metadata.cpp | 4 ++-- 3 files changed, 5 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 58697089..6b685ad3 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -49,7 +49,7 @@ 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, "localport": 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"]}) diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index d8b13caa..56238153 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -107,8 +107,8 @@ class DataPackets{ pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); - pcu_tcp = new Socket("192.168.1.3",,"192.168.1.5",50500); - hvscu_tcp = new Socket("192.168.1.3",,"192.168.1.7",50500); + pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); + hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); Current_State = new StackPacket(249,general_state,operational_state); diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index f07c2255..3732f096 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250910T135404" // DateTime using ISO-8601 format + "20250910T135645" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "69116f1a" // Board commit + "52814b9f" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 91b8c4075d60fa05168cf960e99b556eccdd3580 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 10 Sep 2025 16:55:44 +0200 Subject: [PATCH 17/48] Autogenerated code now creates sockets and send packets on a set period of time --- .vscode/settings.json | 6 +++- Core/Inc/Code_generation/Generator.py | 1 - Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/DataTemplate.hpp | 7 ++++- .../Packet_generation/Packet_descriptions.py | 15 ++++++++-- .../Packet_generation/Packet_generation.py | 1 + .../Communications/Packets/DataPackets.hpp | 28 ++++++++++++++++++- Core/Src/Runes/generated_metadata.cpp | 4 +-- 8 files changed, 55 insertions(+), 9 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 700633d5..018068ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,6 +18,10 @@ "tuple": "cpp", "utility": "cpp", "variant": "cpp", - "atomic": "cpp" + "atomic": "cpp", + "string": "cpp", + "string_view": "cpp", + "ranges": "cpp", + "span": "cpp" } } diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index f9b8f0f3..b09cb298 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -1,4 +1,3 @@ -import json import sys from Packet_generation.Packet_generation import * from State_machine_generation.State_machine_generation import * diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index dc554bfd..2385f5a0 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit dc554bfd7cde92426135518ac6747c34058f823e +Subproject commit 2385f5a044102a5e1add89f331ab791e6cd3667d diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index ad7e2d34..41ef1228 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -29,11 +29,16 @@ class DataPackets{ {% endfor %} {% for socket in Sockets%}{{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); {% endfor %} - {% for packet in packets %}{{packet.name}} = new StackPacket({{packet.id}}{% if packet.data%},{{packet.data}}{% endif%}); packets[id]={{packet.name}}; id++; {% endfor %} + {%for packet in sending_packets %}Time::register_low_precision_alarm({{packet.period}},[{{packet.socket}}={{packet.socket}},{{packet.name}}={{packet.name}}](){ + {{packet.socket}}->send_packet(*{{packet.name}}); + }); + {%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 6b685ad3..06c19a1b 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -11,9 +11,9 @@ def __init__(self,name:str,board:dict,JSONpath:str): socks = json.load(s) self.sockets=self.SocketsDescription(socks,self.ip) #Packets + self.sending_packets = [] self.data_size =0 self.order_size =0 - self.packet_files = board["packets"] self.measurement_lists = [] self.packets = {} for measurement in board["measurements"]: @@ -28,11 +28,15 @@ def __init__(self,name:str,board:dict,JSONpath:str): i=0 for packet in p: self.packets[packets_name].append(PacketDescription(packet,self.measurement_lists)) + if PacketDescription.check_for_sending(packet) is not None: + self.sending_packets.append(PacketDescription.check_for_sending(packet)) + if self.packets[packets_name][i].type != "order": self.data_size += 1 else: self.order_size += 1 i += 1 + class SocketsDescription: def __init__(self,sockets:list,board_ip:str): @@ -67,7 +71,14 @@ def __init__(self, packet:dict,measurements:list): for variable in packet["variables"]: self.variables.append(variable) self.measurements.append(MeasurmentsDescription(measurements,variable)) - + + @staticmethod + def check_for_sending(packet:dict): + if "period" and "socket" in packet: + name = packet["name"].replace(" ", "_").replace("-", "_") + return {"name": name,"period": packet["period"],"socket": packet["socket"]} + else: + return None class MeasurmentsDescription: def __init__(self,measurements:list, variable:str): self.id = variable diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index bd936fba..12938e76 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -68,6 +68,7 @@ def GenerateDataPackets(board:BoardDescription): "ServerSockets":board.sockets.ServerSockets, "Sockets":board.sockets.Sockets, "DatagramSockets":board.sockets.DatagramSockets, + "sending_packets": board.sending_packets, } return context diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index 56238153..79b47e16 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -110,7 +110,6 @@ class DataPackets{ pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); - Current_State = new StackPacket(249,general_state,operational_state); packets[id]=Current_State; id++; @@ -144,5 +143,32 @@ class DataPackets{ id++; + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Current_State=Current_State](){ + control_station_udp->send_packet(*Current_State); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Reeds=Reeds](){ + control_station_udp->send_packet(*Reeds); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Flow=Flow](){ + control_station_udp->send_packet(*Flow); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Regulator=Regulator](){ + control_station_udp->send_packet(*Regulator); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Pressure=Pressure](){ + control_station_udp->send_packet(*Pressure); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,tapes=tapes](){ + control_station_udp->send_packet(*tapes); + }); + Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,sdc=sdc](){ + control_station_udp->send_packet(*sdc); + }); + Time::register_low_precision_alarm(16.67,[pcu_udp=pcu_udp,recovery_state=recovery_state](){ + pcu_udp->send_packet(*recovery_state); + }); + + + } }; \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 3732f096..40b18b36 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250910T135645" // DateTime using ISO-8601 format + "20250910T165234" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "52814b9f" // Board commit + "623bcc0c" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 789ac6e8e6d2c2592aeeade6f6bd2d978c89be58 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 10 Sep 2025 19:59:13 +0200 Subject: [PATCH 18/48] Working version, testing to be done --- .vscode/settings.json | 7 +- .../Packet_generation/DataTemplate.hpp | 16 +++-- .../Packet_generation/Packet_descriptions.py | 27 ++++++++ .../Communications/Packets/DataPackets.hpp | 68 ++++++++----------- Core/Src/Runes/generated_metadata.cpp | 4 +- 5 files changed, 75 insertions(+), 47 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 018068ec..1e022cc6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,11 @@ "string": "cpp", "string_view": "cpp", "ranges": "cpp", - "span": "cpp" + "span": "cpp", + "bitset": "cpp", + "initializer_list": "cpp", + "stacktrace": "cpp", + "regex": "cpp", + "valarray": "cpp" } } diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 41ef1228..28c95738 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -12,13 +12,13 @@ class DataPackets{ private: constexpr static size_t size={{size}}; - uint32_t id{0}; + inline static uint32_t id{0}; public: - std::array packets; - {%for packet in packets%}StackPacket* {{packet.name}}; + static std::array packets; + {%for packet in packets%}inline static StackPacket* {{packet.name}} =nullptr; {% endfor %} - {% for socket in sockets %}{{socket.type}}* {{socket.name}} = nullptr; + {% for socket in sockets %}inline static {{socket.type}}* {{socket.name}} = nullptr; {% endfor %} DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) @@ -34,8 +34,12 @@ class DataPackets{ id++; {% endfor %} - {%for packet in sending_packets %}Time::register_low_precision_alarm({{packet.period}},[{{packet.socket}}={{packet.socket}},{{packet.name}}={{packet.name}}](){ - {{packet.socket}}->send_packet(*{{packet.name}}); + {%for packet in sending_packets %}Time::register_low_precision_alarm({{packet.period}},+[](){ + {% if packet.name is string %} DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + {%else%} + {%for name in packet.name%}DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + {%endfor%} + {% endif %} }); {%endfor%} diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 06c19a1b..9c67a7a6 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -36,7 +36,34 @@ def __init__(self,name:str,board:dict,JSONpath:str): else: self.order_size += 1 i += 1 + + self.sending_packets = self.fix_sendind_packets(self.sending_packets) + print(self.sending_packets) + @staticmethod + def fix_sendind_packets(sending_packets:list): + fixed_packets = [] + lookup = {} + for item in sending_packets: + if not isinstance(item, dict): + continue + period = item.get("period") + socket = item.get("socket") + name = item.get("name") + key = (period, socket) + lookup.setdefault(key, []).append(name) + + for (period, socket), names in lookup.items(): + entry = {"period": period, "socket": socket} + if len(names) == 1: + entry["name"] = names[0] + else: + entry["name"] = names + fixed_packets.append(entry) + + return fixed_packets + + class SocketsDescription: def __init__(self,sockets:list,board_ip:str): diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index 79b47e16..bf0207bf 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -78,25 +78,25 @@ class DataPackets{ private: constexpr static size_t size=18; - uint32_t id{0}; + inline static uint32_t id{0}; public: - std::array packets; - StackPacket* Current_State; - StackPacket* Reeds; - StackPacket* Flow; - StackPacket* Regulator; - StackPacket* Pressure; - StackPacket* tapes; - StackPacket* sdc; - StackPacket* recovery_state; + static std::array packets; + inline static StackPacket* Current_State =nullptr; + inline static StackPacket* Reeds =nullptr; + inline static StackPacket* Flow =nullptr; + inline static StackPacket* Regulator =nullptr; + inline static StackPacket* Pressure =nullptr; + inline static StackPacket* tapes =nullptr; + inline static StackPacket* sdc =nullptr; + inline static StackPacket* recovery_state =nullptr; - ServerSocket* control_station_tcp = nullptr; - DatagramSocket* control_station_udp = nullptr; - Socket* pcu_tcp = nullptr; - DatagramSocket* pcu_udp = nullptr; - Socket* hvscu_tcp = nullptr; - DatagramSocket* hvscu_udp = nullptr; + inline static ServerSocket* control_station_tcp = nullptr; + inline static DatagramSocket* control_station_udp = nullptr; + inline static Socket* pcu_tcp = nullptr; + inline static DatagramSocket* pcu_udp = nullptr; + inline static Socket* hvscu_tcp = nullptr; + inline static DatagramSocket* hvscu_udp = nullptr; DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float32 ®ulator_1_pressure,float32 ®ulator_2_pressure,float32 &pressure_high,float32 &pressure_regulator,float32 &pressure_brakes,float32 &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) @@ -143,29 +143,21 @@ class DataPackets{ id++; - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Current_State=Current_State](){ - control_station_udp->send_packet(*Current_State); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Reeds=Reeds](){ - control_station_udp->send_packet(*Reeds); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Flow=Flow](){ - control_station_udp->send_packet(*Flow); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Regulator=Regulator](){ - control_station_udp->send_packet(*Regulator); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,Pressure=Pressure](){ - control_station_udp->send_packet(*Pressure); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,tapes=tapes](){ - control_station_udp->send_packet(*tapes); - }); - Time::register_low_precision_alarm(16.67,[control_station_udp=control_station_udp,sdc=sdc](){ - control_station_udp->send_packet(*sdc); + Time::register_low_precision_alarm(16.67,+[](){ + + DataPackets::control_station_udp->send_packet(*DataPackets::Current_State); + DataPackets::control_station_udp->send_packet(*DataPackets::Reeds); + DataPackets::control_station_udp->send_packet(*DataPackets::Flow); + DataPackets::control_station_udp->send_packet(*DataPackets::Regulator); + DataPackets::control_station_udp->send_packet(*DataPackets::Pressure); + DataPackets::control_station_udp->send_packet(*DataPackets::tapes); + DataPackets::control_station_udp->send_packet(*DataPackets::sdc); + + }); - Time::register_low_precision_alarm(16.67,[pcu_udp=pcu_udp,recovery_state=recovery_state](){ - pcu_udp->send_packet(*recovery_state); + Time::register_low_precision_alarm(16.67,+[](){ + DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); + }); diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 40b18b36..87801d7c 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250910T165234" // DateTime using ISO-8601 format + "20250910T195214" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "623bcc0c" // Board commit + "91b8c407" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From f845aa5609529a56930975ec4a82d7ea5a8e68e7 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 10 Sep 2025 21:30:47 +0200 Subject: [PATCH 19/48] Testing in course --- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/Packet_descriptions.py | 13 +- .../Communications/Packets/DataPackets.hpp | 132 +----------------- Core/Src/Runes/generated_metadata.cpp | 4 +- 4 files changed, 16 insertions(+), 135 deletions(-) diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 2385f5a0..9f1bb5ba 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 2385f5a044102a5e1add89f331ab791e6cd3667d +Subproject commit 9f1bb5bae1a7a64e98f89d731885f9c5e6ae283d diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 9c67a7a6..0030ebc6 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -6,11 +6,11 @@ def __init__(self,name:str,board:dict,JSONpath:str): self.name = name self.id = board["board_id"] self.ip = board["board_ip"] - #Sockets + #Sockets: with open(JSONpath+"/boards/"+name+"/sockets.json") as s: socks = json.load(s) self.sockets=self.SocketsDescription(socks,self.ip) - #Packets + #Packets: self.sending_packets = [] self.data_size =0 self.order_size =0 @@ -28,8 +28,9 @@ def __init__(self,name:str,board:dict,JSONpath:str): i=0 for packet in p: self.packets[packets_name].append(PacketDescription(packet,self.measurement_lists)) - if PacketDescription.check_for_sending(packet) is not None: - self.sending_packets.append(PacketDescription.check_for_sending(packet)) + 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 @@ -101,9 +102,9 @@ def __init__(self, packet:dict,measurements:list): @staticmethod def check_for_sending(packet:dict): - if "period" and "socket" in packet: + if "period_ms" and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") - return {"name": name,"period": packet["period"],"socket": packet["socket"]} + return {"name": name,"period": packet["period_ms"],"socket": packet["socket"]} else: return None class MeasurmentsDescription: diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index bf0207bf..1cc27f19 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -3,75 +3,10 @@ //Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- class DataPackets{ - enum class general_state:uint8_t + enum class state:uint8_t { - CONNECTING=0, - OPERATIONAL=1, - FAULT=2 - }; - - enum class operational_state:uint8_t - { - IDLE=0, - END_OF_RUN=1, - ENERGIZED=2, - READY=3, - DEMONSTRATION=4, - RECOVERY=5 - }; - - enum class reed1:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed2:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed3:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed4:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class flow1:uint8_t - { - OFF=0, - ON=1 - }; - - enum class flow2:uint8_t - { - OFF=0, - ON=1 - }; - - enum class tape_enable_output:uint8_t - { - DISABLED=0, - ENABLED=1 - }; - - enum class emergency_tape:uint8_t - { - EMERGENCY_SECTION=0, - NORMAL_SECTION=1 - }; - - enum class SDC:uint8_t - { - OFF=0, - ON=1 + ON=0, + OFF=1 }; @@ -81,82 +16,27 @@ class DataPackets{ inline static uint32_t id{0}; public: static std::array packets; - inline static StackPacket* Current_State =nullptr; inline static StackPacket* Reeds =nullptr; - inline static StackPacket* Flow =nullptr; - inline static StackPacket* Regulator =nullptr; - inline static StackPacket* Pressure =nullptr; - inline static StackPacket* tapes =nullptr; - inline static StackPacket* sdc =nullptr; - inline static StackPacket* recovery_state =nullptr; inline static ServerSocket* control_station_tcp = nullptr; inline static DatagramSocket* control_station_udp = nullptr; - inline static Socket* pcu_tcp = nullptr; - inline static DatagramSocket* pcu_udp = nullptr; - inline static Socket* hvscu_tcp = nullptr; - inline static DatagramSocket* hvscu_udp = nullptr; - DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float32 ®ulator_1_pressure,float32 ®ulator_2_pressure,float32 &pressure_high,float32 &pressure_regulator,float32 &pressure_brakes,float32 &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) + DataPackets(state &state) { control_station_tcp = new ServerSocket("192.168.1.3",50500); control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); - pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); - hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); - pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); - hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); - Current_State = new StackPacket(249,general_state,operational_state); - packets[id]=Current_State; - id++; - - Reeds = new StackPacket(251,reed1,reed2,reed3,reed4,all_reeds); + Reeds = new StackPacket(251,state); packets[id]=Reeds; id++; - Flow = new StackPacket(250,flow1,flow2); - packets[id]=Flow; - id++; - - Regulator = new StackPacket(252,regulator_1_pressure,regulator_2_pressure); - packets[id]=Regulator; - id++; - - Pressure = new StackPacket(253,pressure_high,pressure_regulator,pressure_brakes,pressure_capsule); - packets[id]=Pressure; - id++; - - tapes = new StackPacket(254,tape_enable_output,emergency_tape); - packets[id]=tapes; - id++; - - sdc = new StackPacket(255,SDC); - packets[id]=sdc; - id++; - - recovery_state = new StackPacket(65,state); - packets[id]=recovery_state; - id++; - Time::register_low_precision_alarm(16.67,+[](){ - - DataPackets::control_station_udp->send_packet(*DataPackets::Current_State); - DataPackets::control_station_udp->send_packet(*DataPackets::Reeds); - DataPackets::control_station_udp->send_packet(*DataPackets::Flow); - DataPackets::control_station_udp->send_packet(*DataPackets::Regulator); - DataPackets::control_station_udp->send_packet(*DataPackets::Pressure); - DataPackets::control_station_udp->send_packet(*DataPackets::tapes); - DataPackets::control_station_udp->send_packet(*DataPackets::sdc); - - - }); - Time::register_low_precision_alarm(16.67,+[](){ - DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); + DataPackets::control_station_udp->send_packet(*DataPackets::Reeds); }); diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 87801d7c..9cf38336 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250910T195214" // DateTime using ISO-8601 format + "20250910T213005" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "91b8c407" // Board commit + "789ac6e8" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From ed703ab7877cc6ffce4383c8efe22cbeb4140133 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 11 Sep 2025 16:24:25 +0200 Subject: [PATCH 20/48] New version now creates sockets and sends the packets correctly --- Core/Inc/Code_generation/Generator.py | 2 +- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/DataTemplate.hpp | 13 +++++-------- .../Packet_generation/Packet_descriptions.py | 1 - .../Packet_generation/Packet_generation.py | 6 +++++- Core/Inc/Communications/Packets/DataPackets.hpp | 13 +++++-------- Core/Src/Runes/generated_metadata.cpp | 4 ++-- 7 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index b09cb298..2180d1a3 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -7,7 +7,6 @@ sys.exit() JSONpath = "Core/Inc/Code_generation/JSON_ADE" - aux = sys.argv[1] filtered = "" for char in aux: @@ -36,4 +35,5 @@ + \ No newline at end of file diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 9f1bb5ba..798c351d 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 9f1bb5bae1a7a64e98f89d731885f9c5e6ae283d +Subproject commit 798c351d67e7996b4860a75486f64d7173b9e5a8 diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 28c95738..853cfca4 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -3,6 +3,7 @@ //Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- class DataPackets{ + public: {% for enum in enums %}enum class {{enum.name}}:uint8_t { {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} @@ -11,14 +12,12 @@ class DataPackets{ {%endfor %} private: - constexpr static size_t size={{size}}; inline static uint32_t id{0}; public: - static std::array packets; - {%for packet in packets%}inline static StackPacket* {{packet.name}} =nullptr; + {%for packet in packets%}static inline HeapPacket* {{packet.name}}{}; {% endfor %} - {% for socket in sockets %}inline static {{socket.type}}* {{socket.name}} = nullptr; + {% for socket in sockets %}static inline {{socket.type}}* {{socket.name}} = nullptr; {% endfor %} DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) @@ -29,15 +28,13 @@ class DataPackets{ {% endfor %} {% for socket in Sockets%}{{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); {% endfor %} - {% for packet in packets %}{{packet.name}} = new StackPacket({{packet.id}}{% if packet.data%},{{packet.data}}{% endif%}); - packets[id]={{packet.name}}; - id++; + {% for packet in packets %}{{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.data%},{{packet.data}}{% endif%}); {% endfor %} {%for packet in sending_packets %}Time::register_low_precision_alarm({{packet.period}},+[](){ {% if packet.name is string %} DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); {%else%} - {%for name in packet.name%}DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + {%for name in packet.name%}DataPackets::{{packet.socket}}->send_packet(*{{name}}); {%endfor%} {% endif %} }); diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 0030ebc6..5bf1d583 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -39,7 +39,6 @@ def __init__(self,name:str,board:dict,JSONpath:str): i += 1 self.sending_packets = self.fix_sendind_packets(self.sending_packets) - print(self.sending_packets) @staticmethod def fix_sendind_packets(sending_packets:list): diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index 12938e76..05883ac8 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -45,11 +45,15 @@ def GenerateDataPackets(board:BoardDescription): for packet_instance in board.packets[packet]: if packet_instance.type != "order": tempdata = "" + tempdata_but_pointer = "" for variable in packet_instance.variables: tempdata +=(str(variable) +",") + tempdata_but_pointer +=("&"+str(variable) +",") if tempdata.endswith(","): tempdata = tempdata[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata.replace(" ", "_").replace("-", "_") , "id": packet_instance.id} + if tempdata_but_pointer.endswith(","): + tempdata_but_pointer = tempdata_but_pointer[:-1] + aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer.replace(" ", "_").replace("-", "_") , "id": packet_instance.id} Packets.append(aux_packet) for measurement in packet_instance.measurements: aux_data = {"type": measurement.type, "name": measurement.id.replace(" ", "_").replace("-", "_")} diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index 1cc27f19..bb480814 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -3,6 +3,7 @@ //Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- class DataPackets{ + public: enum class state:uint8_t { ON=0, @@ -12,15 +13,13 @@ class DataPackets{ private: - constexpr static size_t size=18; inline static uint32_t id{0}; public: - static std::array packets; - inline static StackPacket* Reeds =nullptr; + static inline HeapPacket* Reeds{}; - inline static ServerSocket* control_station_tcp = nullptr; - inline static DatagramSocket* control_station_udp = nullptr; + static inline ServerSocket* control_station_tcp = nullptr; + static inline DatagramSocket* control_station_udp = nullptr; DataPackets(state &state) @@ -30,9 +29,7 @@ class DataPackets{ control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); - Reeds = new StackPacket(251,state); - packets[id]=Reeds; - id++; + Reeds = new HeapPacket(static_cast(251),&state); Time::register_low_precision_alarm(16.67,+[](){ diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 9cf38336..64bb5abb 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250910T213005" // DateTime using ISO-8601 format + "20250911T161045" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "789ac6e8" // Board commit + "f845aa56" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 85c1e62c0afb76ee320da58a75b65e1fdf365016 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 11 Sep 2025 16:25:21 +0200 Subject: [PATCH 21/48] Updated deps --- Core/Inc/Code_generation/JSON_ADE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 798c351d..a61ba838 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 798c351d67e7996b4860a75486f64d7173b9e5a8 +Subproject commit a61ba8380686bf7289fd0cdd92d7165cdf3d26c1 From 4c9e8d4994c902d84c6238273ae957c33018b979 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 11 Sep 2025 17:09:33 +0200 Subject: [PATCH 22/48] Fixed Order Packets, now working --- .../Packet_generation/OrderTemplate.hpp | 16 +- .../Packet_generation/Packet_descriptions.py | 2 + .../Packet_generation/Packet_generation.py | 14 +- .../Communications/Packets/DataPackets.hpp | 118 ++++++++++++- .../Communications/Packets/OrderPackets.hpp | 162 ++++++------------ Core/Src/Runes/generated_metadata.cpp | 4 +- 6 files changed, 189 insertions(+), 127 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 69c4de21..dc894260 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -2,6 +2,9 @@ #include "ST-LIB.hpp" //Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- + +{%for packet in packets%}extern void {{packet.name}}_cb(); +{% endfor %} class OrderPackets{ {% for enum in enums %}enum class {{enum.name}}:uint8_t { @@ -10,23 +13,18 @@ class OrderPackets{ {% endfor %} - {%for packet in packets%}void {{packet.name}}_cb(); - {% endfor %} + private: - constexpr static size_t size={{size}}; uint32_t id{0}; public: - std::array packets; - {%for packet in packets%}StackOrder* {{packet.name}}; + {%for packet in packets%}HeapOrder* {{packet.name}}; {% endfor %} - OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}}}) + OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) { - {% for packet in packets %}{{packet.name}}=new StackOrder({{packet.id}},{{packet.name}}_cb{% if packet.data%},{{packet.data}}{% endif%}); - packets[id]={{packet.name}}; - id++; + {% for packet in packets %}{{packet.name}}=new HeapOrder({{packet.id}},&{{packet.name}}_cb{% if packet.data%},{{packet.data}}{% endif%}); {% 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 5bf1d583..7f6dfaf0 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -150,4 +150,6 @@ def _unsigned_int_correction(type:str): aux_type = type[:4] if aux_type == "uint": type += "_t" + elif type == "float32": + type = "float" 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 05883ac8..bf4a911c 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -33,7 +33,7 @@ def GenerateDataEnum(board:BoardDescription): for packet_instance in board.packets[packet]: if packet_instance.type != "order": for measurement in packet_instance.measurements: - if hasattr(measurement, "enum"): + if hasattr(measurement, "enum")and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums @@ -101,7 +101,7 @@ def GenerateOrderEnum(board:BoardDescription): for packet_instance in board.packets[packet]: if packet_instance.type == "order": for measurement in packet_instance.measurements: - if hasattr(measurement, "enum"): + if hasattr(measurement, "enum") and measurement.enum not in Enums: Enums.append(measurement.enum) return Enums @@ -113,15 +113,19 @@ def GenerateOrderPackets(board:BoardDescription): for packet_instance in board.packets[packet]: if packet_instance.type == "order": tempdata = "" + tempdata_but_pointer = "" for variable in packet_instance.variables: tempdata +=(str(variable) +",") + tempdata_but_pointer +=("&"+str(variable) +",") if tempdata.endswith(","): - tempdata = tempdata[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata , "id": packet_instance.id} + tempdata = tempdata[:-1] + tempdata_but_pointer = tempdata_but_pointer[:-1] + aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer , "id": packet_instance.id} Packets.append(aux_packet) for measurement in packet_instance.measurements: aux_data = {"type": measurement.type, "name": measurement.id} - totaldata.append(aux_data) + if aux_data not in totaldata: + totaldata.append(aux_data) return Packets,totaldata diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp index bb480814..76e0b7dd 100644 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -4,10 +4,75 @@ //Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- class DataPackets{ public: - enum class state:uint8_t + enum class general_state:uint8_t { - ON=0, - OFF=1 + CONNECTING=0, + OPERATIONAL=1, + FAULT=2 + }; + + enum class operational_state:uint8_t + { + IDLE=0, + END_OF_RUN=1, + ENERGIZED=2, + READY=3, + DEMONSTRATION=4, + RECOVERY=5 + }; + + enum class reed1:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed2:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed3:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed4:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class flow1:uint8_t + { + OFF=0, + ON=1 + }; + + enum class flow2:uint8_t + { + OFF=0, + ON=1 + }; + + enum class tape_enable_output:uint8_t + { + DISABLED=0, + ENABLED=1 + }; + + enum class emergency_tape:uint8_t + { + EMERGENCY_SECTION=0, + NORMAL_SECTION=1 + }; + + enum class SDC:uint8_t + { + OFF=0, + ON=1 }; @@ -15,25 +80,66 @@ class DataPackets{ private: inline static uint32_t id{0}; public: + static inline HeapPacket* Current_State{}; static inline HeapPacket* Reeds{}; + static inline HeapPacket* Flow{}; + static inline HeapPacket* Regulator{}; + static inline HeapPacket* Pressure{}; + static inline HeapPacket* tapes{}; + static inline HeapPacket* sdc{}; + static inline HeapPacket* recovery_state{}; static inline ServerSocket* control_station_tcp = nullptr; static inline DatagramSocket* control_station_udp = nullptr; + static inline Socket* pcu_tcp = nullptr; + static inline DatagramSocket* pcu_udp = nullptr; + static inline Socket* hvscu_tcp = nullptr; + static inline DatagramSocket* hvscu_udp = nullptr; - DataPackets(state &state) + DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float ®ulator_1_pressure,float ®ulator_2_pressure,float &pressure_high,float &pressure_regulator,float &pressure_brakes,float &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) { control_station_tcp = new ServerSocket("192.168.1.3",50500); control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); + pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); + hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); + pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); + hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); - Reeds = new HeapPacket(static_cast(251),&state); + Current_State = new HeapPacket(static_cast(249),&general_state,&operational_state); + + Reeds = new HeapPacket(static_cast(251),&reed1,&reed2,&reed3,&reed4,&all_reeds); + + Flow = new HeapPacket(static_cast(250),&flow1,&flow2); + + Regulator = new HeapPacket(static_cast(252),®ulator_1_pressure,®ulator_2_pressure); + + Pressure = new HeapPacket(static_cast(253),&pressure_high,&pressure_regulator,&pressure_brakes,&pressure_capsule); + + tapes = new HeapPacket(static_cast(254),&tape_enable_output,&emergency_tape); + + sdc = new HeapPacket(static_cast(255),&SDC); + + recovery_state = new HeapPacket(static_cast(65),&state); Time::register_low_precision_alarm(16.67,+[](){ - DataPackets::control_station_udp->send_packet(*DataPackets::Reeds); + + DataPackets::control_station_udp->send_packet(*Current_State); + DataPackets::control_station_udp->send_packet(*Reeds); + DataPackets::control_station_udp->send_packet(*Flow); + DataPackets::control_station_udp->send_packet(*Regulator); + DataPackets::control_station_udp->send_packet(*Pressure); + DataPackets::control_station_udp->send_packet(*tapes); + DataPackets::control_station_udp->send_packet(*sdc); + + + }); + Time::register_low_precision_alarm(16.67,+[](){ + DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); }); diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp index 069ecfe0..829c9577 100644 --- a/Core/Inc/Communications/Packets/OrderPackets.hpp +++ b/Core/Inc/Communications/Packets/OrderPackets.hpp @@ -2,6 +2,26 @@ #include "ST-LIB.hpp" //Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- + +extern void Brake_cb(); +extern void Unbrake_cb(); +extern void Potencia_Refri_cb(); +extern void Set_Regulator_cb(); +extern void Enable_Tapes_cb(); +extern void Disbable_Tapes_cb(); +extern void Close_Contactors_cb(); +extern void Open_Contactors_cb(); +extern void Levitation_cb(); +extern void Stop_Levitation_cb(); +extern void Emergency_Stop_cb(); +extern void Propulsion_cb(); +extern void SVPWM_cb(); +extern void Stop_Motor_cb(); +extern void Current_Control_cb(); +extern void Speed_Control_cb(); +extern void Motor_Brake_cb(); +extern void Recovery_cb(); + class OrderPackets{ enum class pump:uint8_t { @@ -26,122 +46,54 @@ class OrderPackets{ BACKWARDS=1 }; - enum class motor_direction:uint8_t - { - FORWARD=0, - BACKWARDS=1 - }; - - enum class motor_direction:uint8_t - { - FORWARD=0, - BACKWARDS=1 - }; - - void Brake_cb(); - void Unbrake_cb(); - void Potencia_Refri_cb(); - void Set_Regulator_cb(); - void Enable_Tapes_cb(); - void Disbable_Tapes_cb(); - void Close_Contactors_cb(); - void Open_Contactors_cb(); - void Levitation_cb(); - void Stop_Levitation_cb(); - void Emergency_Stop_cb(); - void Propulsion_cb(); - void SVPWM_cb(); - void Stop_Motor_cb(); - void Current_Control_cb(); - void Speed_Control_cb(); - void Motor_Brake_cb(); - void Recovery_cb(); private: - constexpr static size_t size=18; uint32_t id{0}; public: - std::array packets; - StackOrder* Brake; - StackOrder* Unbrake; - StackOrder* Potencia_Refri; - StackOrder* Set_Regulator; - StackOrder* Enable_Tapes; - StackOrder* Disbable_Tapes; - StackOrder* Close_Contactors; - StackOrder* Open_Contactors; - StackOrder* Levitation; - StackOrder* Stop_Levitation; - StackOrder* Emergency_Stop; - StackOrder* Propulsion; - StackOrder* SVPWM; - StackOrder* Stop_Motor; - StackOrder* Current_Control; - StackOrder* Speed_Control; - StackOrder* Motor_Brake; - StackOrder* Recovery; + HeapOrder* Brake; + HeapOrder* Unbrake; + HeapOrder* Potencia_Refri; + HeapOrder* Set_Regulator; + HeapOrder* Enable_Tapes; + HeapOrder* Disbable_Tapes; + HeapOrder* Close_Contactors; + HeapOrder* Open_Contactors; + HeapOrder* Levitation; + HeapOrder* Stop_Levitation; + HeapOrder* Emergency_Stop; + HeapOrder* Propulsion; + HeapOrder* SVPWM; + HeapOrder* Stop_Motor; + HeapOrder* Current_Control; + HeapOrder* Speed_Control; + HeapOrder* Motor_Brake; + HeapOrder* Recovery; - OrderPackets(uint32_t &duty,pump &pump,float32 ®ulator_pressure,regulator ®ulator,float32 &levitation_distance,run_id &run_id,float32 &modulation_frequency,float32 &commutation_frequency,float32 &max_voltage,float32 &reference_voltage,motor_direction &motor_direction,float32 &modulation_frequency,float32 &commutation_frequency,float32 &reference_current,float32 &max_voltage,motor_direction &motor_direction,float32 &reference_speed,float32 &commutation_frequency,float32 &max_voltage,motor_direction &motor_direction}}) + OrderPackets(uint32_t &duty,pump &pump,float ®ulator_pressure,regulator ®ulator,float &levitation_distance,run_id &run_id,float &modulation_frequency,float &commutation_frequency,float &max_voltage,float &reference_voltage,motor_direction &motor_direction,float &reference_current,float &reference_speed) { - Brake=new StackOrder(43,Brake_cb); - packets[id]=Brake; - id++; - Unbrake=new StackOrder(52,Unbrake_cb); - packets[id]=Unbrake; - id++; - Potencia_Refri=new StackOrder(33,Potencia_Refri_cb,duty,pump); - packets[id]=Potencia_Refri; - id++; - Set_Regulator=new StackOrder(34,Set_Regulator_cb,regulator_pressure,regulator); - packets[id]=Set_Regulator; - id++; - Enable_Tapes=new StackOrder(35,Enable_Tapes_cb); - packets[id]=Enable_Tapes; - id++; - Disbable_Tapes=new StackOrder(36,Disbable_Tapes_cb); - packets[id]=Disbable_Tapes; - id++; - Close_Contactors=new StackOrder(44,Close_Contactors_cb); - packets[id]=Close_Contactors; - id++; - Open_Contactors=new StackOrder(53,Open_Contactors_cb); - packets[id]=Open_Contactors; - id++; - Levitation=new StackOrder(37,Levitation_cb,levitation_distance); - packets[id]=Levitation; - id++; - Stop_Levitation=new StackOrder(46,Stop_Levitation_cb); - packets[id]=Stop_Levitation; - id++; - Emergency_Stop=new StackOrder(55,Emergency_Stop_cb); - packets[id]=Emergency_Stop; - id++; - Propulsion=new StackOrder(56,Propulsion_cb,run_id); - packets[id]=Propulsion; - id++; - SVPWM=new StackOrder(57,SVPWM_cb,modulation_frequency,commutation_frequency,max_voltage,reference_voltage,motor_direction); - packets[id]=SVPWM; - id++; - Stop_Motor=new StackOrder(58,Stop_Motor_cb); - packets[id]=Stop_Motor; - id++; - Current_Control=new StackOrder(59,Current_Control_cb,modulation_frequency,commutation_frequency,reference_current,max_voltage,motor_direction); - packets[id]=Current_Control; - id++; - Speed_Control=new StackOrder(60,Speed_Control_cb,reference_speed,commutation_frequency,max_voltage,motor_direction); - packets[id]=Speed_Control; - id++; - Motor_Brake=new StackOrder(61,Motor_Brake_cb); - packets[id]=Motor_Brake; - id++; - Recovery=new StackOrder(32,Recovery_cb); - packets[id]=Recovery; - id++; + Brake=new HeapOrder(43,&Brake_cb); + Unbrake=new HeapOrder(52,&Unbrake_cb); + Potencia_Refri=new HeapOrder(33,&Potencia_Refri_cb,&duty,&pump); + Set_Regulator=new HeapOrder(34,&Set_Regulator_cb,®ulator_pressure,®ulator); + Enable_Tapes=new HeapOrder(35,&Enable_Tapes_cb); + Disbable_Tapes=new HeapOrder(36,&Disbable_Tapes_cb); + Close_Contactors=new HeapOrder(44,&Close_Contactors_cb); + Open_Contactors=new HeapOrder(53,&Open_Contactors_cb); + Levitation=new HeapOrder(37,&Levitation_cb,&levitation_distance); + Stop_Levitation=new HeapOrder(46,&Stop_Levitation_cb); + Emergency_Stop=new HeapOrder(55,&Emergency_Stop_cb); + Propulsion=new HeapOrder(56,&Propulsion_cb,&run_id); + SVPWM=new HeapOrder(57,&SVPWM_cb,&modulation_frequency,&commutation_frequency,&max_voltage,&reference_voltage,&motor_direction); + Stop_Motor=new HeapOrder(58,&Stop_Motor_cb); + Current_Control=new HeapOrder(59,&Current_Control_cb,&modulation_frequency,&commutation_frequency,&reference_current,&max_voltage,&motor_direction); + Speed_Control=new HeapOrder(60,&Speed_Control_cb,&reference_speed,&commutation_frequency,&max_voltage,&motor_direction); + Motor_Brake=new HeapOrder(61,&Motor_Brake_cb); + Recovery=new HeapOrder(32,&Recovery_cb); } }; \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 64bb5abb..408c64b4 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250911T161045" // DateTime using ISO-8601 format + "20250911T170758" // DateTime using ISO-8601 format " " // alignment "1af648a0" // STLIB commit "--------" // ADJ commit - "f845aa56" // Board commit + "85c1e62c" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 485b4fada019f62a960fd541a50a5643fdd3abd4 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Sat, 13 Sep 2025 16:25:34 +0200 Subject: [PATCH 23/48] Deleted generated code --- .../Communications/Packets/DataPackets.hpp | 149 ------------------ .../Communications/Packets/OrderPackets.hpp | 99 ------------ Core/Inc/state_machine.hpp | 73 --------- Core/Src/Runes/generated_metadata.cpp | 6 +- 4 files changed, 3 insertions(+), 324 deletions(-) delete mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp delete mode 100644 Core/Inc/state_machine.hpp diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp deleted file mode 100644 index 76e0b7dd..00000000 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ /dev/null @@ -1,149 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataPackets{ - public: - enum class general_state:uint8_t - { - CONNECTING=0, - OPERATIONAL=1, - FAULT=2 - }; - - enum class operational_state:uint8_t - { - IDLE=0, - END_OF_RUN=1, - ENERGIZED=2, - READY=3, - DEMONSTRATION=4, - RECOVERY=5 - }; - - enum class reed1:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed2:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed3:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed4:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class flow1:uint8_t - { - OFF=0, - ON=1 - }; - - enum class flow2:uint8_t - { - OFF=0, - ON=1 - }; - - enum class tape_enable_output:uint8_t - { - DISABLED=0, - ENABLED=1 - }; - - enum class emergency_tape:uint8_t - { - EMERGENCY_SECTION=0, - NORMAL_SECTION=1 - }; - - enum class SDC:uint8_t - { - OFF=0, - ON=1 - }; - - - - private: - inline static uint32_t id{0}; - public: - static inline HeapPacket* Current_State{}; - static inline HeapPacket* Reeds{}; - static inline HeapPacket* Flow{}; - static inline HeapPacket* Regulator{}; - static inline HeapPacket* Pressure{}; - static inline HeapPacket* tapes{}; - static inline HeapPacket* sdc{}; - static inline HeapPacket* recovery_state{}; - - - static inline ServerSocket* control_station_tcp = nullptr; - static inline DatagramSocket* control_station_udp = nullptr; - static inline Socket* pcu_tcp = nullptr; - static inline DatagramSocket* pcu_udp = nullptr; - static inline Socket* hvscu_tcp = nullptr; - static inline DatagramSocket* hvscu_udp = nullptr; - - - DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float ®ulator_1_pressure,float ®ulator_2_pressure,float &pressure_high,float &pressure_regulator,float &pressure_brakes,float &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) -{ - control_station_tcp = new ServerSocket("192.168.1.3",50500); - - control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); - pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); - hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); - - pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); - hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); - - Current_State = new HeapPacket(static_cast(249),&general_state,&operational_state); - - Reeds = new HeapPacket(static_cast(251),&reed1,&reed2,&reed3,&reed4,&all_reeds); - - Flow = new HeapPacket(static_cast(250),&flow1,&flow2); - - Regulator = new HeapPacket(static_cast(252),®ulator_1_pressure,®ulator_2_pressure); - - Pressure = new HeapPacket(static_cast(253),&pressure_high,&pressure_regulator,&pressure_brakes,&pressure_capsule); - - tapes = new HeapPacket(static_cast(254),&tape_enable_output,&emergency_tape); - - sdc = new HeapPacket(static_cast(255),&SDC); - - recovery_state = new HeapPacket(static_cast(65),&state); - - - Time::register_low_precision_alarm(16.67,+[](){ - - DataPackets::control_station_udp->send_packet(*Current_State); - DataPackets::control_station_udp->send_packet(*Reeds); - DataPackets::control_station_udp->send_packet(*Flow); - DataPackets::control_station_udp->send_packet(*Regulator); - DataPackets::control_station_udp->send_packet(*Pressure); - DataPackets::control_station_udp->send_packet(*tapes); - DataPackets::control_station_udp->send_packet(*sdc); - - - }); - Time::register_low_precision_alarm(16.67,+[](){ - DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); - - }); - - - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp deleted file mode 100644 index 829c9577..00000000 --- a/Core/Inc/Communications/Packets/OrderPackets.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- - -extern void Brake_cb(); -extern void Unbrake_cb(); -extern void Potencia_Refri_cb(); -extern void Set_Regulator_cb(); -extern void Enable_Tapes_cb(); -extern void Disbable_Tapes_cb(); -extern void Close_Contactors_cb(); -extern void Open_Contactors_cb(); -extern void Levitation_cb(); -extern void Stop_Levitation_cb(); -extern void Emergency_Stop_cb(); -extern void Propulsion_cb(); -extern void SVPWM_cb(); -extern void Stop_Motor_cb(); -extern void Current_Control_cb(); -extern void Speed_Control_cb(); -extern void Motor_Brake_cb(); -extern void Recovery_cb(); - -class OrderPackets{ - enum class pump:uint8_t - { - UNIDADES=0, - PLACAS=1 - }; - - enum class regulator:uint8_t - { - REGULATOR_1=0, - REGULATOR_2=1 - }; - - enum class run_id:uint8_t - { - LIM=0 - }; - - enum class motor_direction:uint8_t - { - FORWARD=0, - BACKWARDS=1 - }; - - - - - - private: - uint32_t id{0}; - public: - HeapOrder* Brake; - HeapOrder* Unbrake; - HeapOrder* Potencia_Refri; - HeapOrder* Set_Regulator; - HeapOrder* Enable_Tapes; - HeapOrder* Disbable_Tapes; - HeapOrder* Close_Contactors; - HeapOrder* Open_Contactors; - HeapOrder* Levitation; - HeapOrder* Stop_Levitation; - HeapOrder* Emergency_Stop; - HeapOrder* Propulsion; - HeapOrder* SVPWM; - HeapOrder* Stop_Motor; - HeapOrder* Current_Control; - HeapOrder* Speed_Control; - HeapOrder* Motor_Brake; - HeapOrder* Recovery; - - - OrderPackets(uint32_t &duty,pump &pump,float ®ulator_pressure,regulator ®ulator,float &levitation_distance,run_id &run_id,float &modulation_frequency,float &commutation_frequency,float &max_voltage,float &reference_voltage,motor_direction &motor_direction,float &reference_current,float &reference_speed) -{ - - Brake=new HeapOrder(43,&Brake_cb); - Unbrake=new HeapOrder(52,&Unbrake_cb); - Potencia_Refri=new HeapOrder(33,&Potencia_Refri_cb,&duty,&pump); - Set_Regulator=new HeapOrder(34,&Set_Regulator_cb,®ulator_pressure,®ulator); - Enable_Tapes=new HeapOrder(35,&Enable_Tapes_cb); - Disbable_Tapes=new HeapOrder(36,&Disbable_Tapes_cb); - Close_Contactors=new HeapOrder(44,&Close_Contactors_cb); - Open_Contactors=new HeapOrder(53,&Open_Contactors_cb); - Levitation=new HeapOrder(37,&Levitation_cb,&levitation_distance); - Stop_Levitation=new HeapOrder(46,&Stop_Levitation_cb); - Emergency_Stop=new HeapOrder(55,&Emergency_Stop_cb); - Propulsion=new HeapOrder(56,&Propulsion_cb,&run_id); - SVPWM=new HeapOrder(57,&SVPWM_cb,&modulation_frequency,&commutation_frequency,&max_voltage,&reference_voltage,&motor_direction); - Stop_Motor=new HeapOrder(58,&Stop_Motor_cb); - Current_Control=new HeapOrder(59,&Current_Control_cb,&modulation_frequency,&commutation_frequency,&reference_current,&max_voltage,&motor_direction); - Speed_Control=new HeapOrder(60,&Speed_Control_cb,&reference_speed,&commutation_frequency,&max_voltage,&motor_direction); - Motor_Brake=new HeapOrder(61,&Motor_Brake_cb); - Recovery=new HeapOrder(32,&Recovery_cb); - -} -}; \ No newline at end of file diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp deleted file mode 100644 index 0a448b41..00000000 --- a/Core/Inc/state_machine.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" -using namespace std::chrono_literals; - -// AUTOGENERATED CODE, DO NOT EDIT MANUALLY - -class Example{ - - public: - - static bool from_1_to_2(); - static bool from_1_to_2(); - static bool from_1_to_nested_1(); - static void enter_action_1(); - static void enter_action_2(); - static void enter_action_3(); - static void enter_action_4(); - static void low_precision_action(); - static void low_precision_action(); - static void mid_precision_action_to_nested_state(); - static void mid_precision_action_to_nested_state(); - static void high_precision_action_with_description(); - static void high_precision_action_with_description(); - static void exit_action_1(); - static void exit_action_2(); - - StateMachine Example_State_Machine; - StateMachine Nested_State_Machine; - - enum ExampleStates { - NAME_1, - NAME_2, - }; - - enum Nested{ - NESTED_NAME_1, - NESTED_NAME_2, - }; - - Example(){ - - Example_State_Machine = StateMachine(ExampleStates::NAME_1); - - Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); - Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); - Nested_State_Machine.add_state(Nested::NESTED_NAME_2); - - Example_State_Machine.add_state(ExampleStates::NAME_2); - - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - // Transitioning from 1 to 2 - Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); - Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); - - Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); - Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); - // Description of enter_action_3 - Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); - Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); - Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); - Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); - // Cyclic action example with description - Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); - Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); - Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); - - } - -}; \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 408c64b4..77dbc457 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250911T170758" // DateTime using ISO-8601 format + "20250605T165128" // DateTime using ISO-8601 format " " // alignment - "1af648a0" // STLIB commit + "77b804dd" // STLIB commit "--------" // ADJ commit - "85c1e62c" // Board commit + "3a365135" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 2bbf1e9eac7f454f778a266b38c2f55fa15fe78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cant=C3=B3=20Catal=C3=A1n?= <144663567+Cantonplas@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:09:34 +0100 Subject: [PATCH 24/48] Update Core/Inc/Code_generation/Packet_generation/Packet_generation.py Co-authored-by: Jose D. <145350079+jdmarmen@users.noreply.github.com> --- Core/Inc/Code_generation/Packet_generation/Packet_generation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index bf4a911c..14023036 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -18,7 +18,7 @@ def Generate_PacketDescription(JSONpath:str,board:str): board_instance = BoardDescription(board, b,JSONpath) globals()[board] = board_instance else: - print("Board not found, exiting...") + print(f "Board {board} not found, exiting...") sys.exit() return boards_name From c6aa833636398221dfc9d554acec046b5611fdb6 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 22 Jan 2026 23:22:57 +0100 Subject: [PATCH 25/48] 6 months later maybe this time we can aprove this pr --- CMakeLists.txt | 18 +- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/DataTemplate.hpp | 2 +- .../Packet_generation/Packet_descriptions.py | 15 +- .../Packet_generation/Packet_generation.py | 2 +- .../Communications/Packets/DataPackets.hpp | 154 ++++++++++++++++++ .../Communications/Packets/OrderPackets.hpp | 99 +++++++++++ Core/Inc/state_machine.hpp | 73 +++++++++ Core/Src/Runes/generated_metadata.cpp | 6 +- 9 files changed, 348 insertions(+), 23 deletions(-) create mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp create mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp create mode 100644 Core/Inc/state_machine.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a203e434..67cc911a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,9 @@ cmake_minimum_required(VERSION 3.14) project(template-project LANGUAGES ASM C CXX) set(EXECUTABLE ${PROJECT_NAME}.elf) -<<<<<<< HEAD set(Board "VCU") # User must change the Board name set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) +set(LD_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H723ZGTX_FLASH.ld) find_package(Python3 COMPONENTS Interpreter REQUIRED) @@ -15,8 +15,12 @@ add_custom_target(run_generator ALL COMMAND ${Python3_EXECUTABLE} ${GENERATOR_SCRIPT} ${Board} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -set(VENV_PYTHON "${CMAKE_SOURCE_DIR}/virtual/bin/python") +if(CMAKE_HOST_WIN32 ) + set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/Scripts/python) +else() + set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) +endif() add_custom_target( my_custom_target_that_always_runs ALL @@ -43,17 +47,7 @@ if (PROJECT_IS_TOP_LEVEL AND (NOT CMAKE_CROSSCOMPILING)) FetchContent_MakeAvailable(googletest) add_library(GTest::GTest INTERFACE IMPORTED) target_link_libraries(GTest::GTest INTERFACE gtest_main) -======= -set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) -set(LD_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H723ZGTX_FLASH.ld) -if(CMAKE_HOST_WIN32 ) - set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/Scripts/python) -else() - set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) ->>>>>>> origin/main endif() -option(USE_ETHERNET "Enable ethernet peripheral" OFF) -option(TARGET_NUCLEO "Targets the STM32H723 Nucleo dev board" OFF) message(STATUS "Template project: CMAKE_CROSSCOMPILING = ${CMAKE_CROSSCOMPILING}") message(STATUS "Template project: USE_ETHERNET = ${USE_ETHERNET}") diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index a61ba838..df2922c1 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit a61ba8380686bf7289fd0cdd92d7165cdf3d26c1 +Subproject commit df2922c1ca12a5150ba892ae93a7a00c2b97dbdb diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 853cfca4..0d7c81e9 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -31,7 +31,7 @@ class DataPackets{ {% for packet in packets %}{{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.data%},{{packet.data}}{% endif%}); {% endfor %} - {%for packet in sending_packets %}Time::register_low_precision_alarm({{packet.period}},+[](){ + {%for packet in sending_packets %}Scheduler::register_task({% if packet.period_type == "ms" %}{{(packet.period*1000)}}{% else %}{{packet.period}}{% endif %},+[](){ {% if packet.name is string %} DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); {%else%} {%for name in packet.name%}DataPackets::{{packet.socket}}->send_packet(*{{name}}); diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 7f6dfaf0..f0f43eb7 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -48,13 +48,14 @@ def fix_sendind_packets(sending_packets:list): if not isinstance(item, dict): continue period = item.get("period") + period_type = item.get("period_type") socket = item.get("socket") name = item.get("name") - key = (period, socket) + key = (period,period_type, socket) lookup.setdefault(key, []).append(name) - for (period, socket), names in lookup.items(): - entry = {"period": period, "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: @@ -101,9 +102,13 @@ def __init__(self, packet:dict,measurements:list): @staticmethod def check_for_sending(packet:dict): - if "period_ms" and "socket" in packet: + if "period" in packet and "period_type" in packet and "socket" in packet: name = packet["name"].replace(" ", "_").replace("-", "_") - return {"name": name,"period": packet["period_ms"],"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: diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index 14023036..b7f008bc 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -18,7 +18,7 @@ def Generate_PacketDescription(JSONpath:str,board:str): board_instance = BoardDescription(board, b,JSONpath) globals()[board] = board_instance else: - print(f "Board {board} not found, exiting...") + print(f"Board {board} not found, exiting...") sys.exit() return boards_name diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp new file mode 100644 index 00000000..68d8c2db --- /dev/null +++ b/Core/Inc/Communications/Packets/DataPackets.hpp @@ -0,0 +1,154 @@ +#pragma once +#include "ST-LIB.hpp" + +//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- +class DataPackets{ + public: + enum class general_state:uint8_t + { + CONNECTING=0, + OPERATIONAL=1, + FAULT=2 + }; + + enum class operational_state:uint8_t + { + IDLE=0, + END_OF_RUN=1, + ENERGIZED=2, + READY=3, + DEMONSTRATION=4, + RECOVERY=5 + }; + + enum class reed1:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed2:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed3:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class reed4:uint8_t + { + UNDEPLOYED=0, + DEPLOYED=1 + }; + + enum class flow1:uint8_t + { + OFF=0, + ON=1 + }; + + enum class flow2:uint8_t + { + OFF=0, + ON=1 + }; + + enum class tape_enable_output:uint8_t + { + DISABLED=0, + ENABLED=1 + }; + + enum class emergency_tape:uint8_t + { + EMERGENCY_SECTION=0, + NORMAL_SECTION=1 + }; + + enum class SDC:uint8_t + { + OFF=0, + ON=1 + }; + + + + private: + inline static uint32_t id{0}; + public: + static inline HeapPacket* Current_State{}; + static inline HeapPacket* Reeds{}; + static inline HeapPacket* Flow{}; + static inline HeapPacket* Regulator{}; + static inline HeapPacket* Pressure{}; + static inline HeapPacket* tapes{}; + static inline HeapPacket* sdc{}; + static inline HeapPacket* recovery_state{}; + + + static inline ServerSocket* control_station_tcp = nullptr; + static inline DatagramSocket* control_station_udp = nullptr; + static inline Socket* pcu_tcp = nullptr; + static inline DatagramSocket* pcu_udp = nullptr; + static inline Socket* hvscu_tcp = nullptr; + static inline DatagramSocket* hvscu_udp = nullptr; + + + DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float ®ulator_1_pressure,float ®ulator_2_pressure,float &pressure_high,float &pressure_regulator,float &pressure_brakes,float &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) +{ + control_station_tcp = new ServerSocket("192.168.1.3",50500); + + control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); + pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); + hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); + + pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); + hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); + + Current_State = new HeapPacket(static_cast(249),&general_state,&operational_state); + + Reeds = new HeapPacket(static_cast(251),&reed1,&reed2,&reed3,&reed4,&all_reeds); + + Flow = new HeapPacket(static_cast(250),&flow1,&flow2); + + Regulator = new HeapPacket(static_cast(252),®ulator_1_pressure,®ulator_2_pressure); + + Pressure = new HeapPacket(static_cast(253),&pressure_high,&pressure_regulator,&pressure_brakes,&pressure_capsule); + + tapes = new HeapPacket(static_cast(254),&tape_enable_output,&emergency_tape); + + sdc = new HeapPacket(static_cast(255),&SDC); + + recovery_state = new HeapPacket(static_cast(65),&state); + + + Scheduler::register_task(16670.0,+[](){ + + DataPackets::control_station_udp->send_packet(*Current_State); + DataPackets::control_station_udp->send_packet(*Flow); + DataPackets::control_station_udp->send_packet(*Pressure); + DataPackets::control_station_udp->send_packet(*tapes); + DataPackets::control_station_udp->send_packet(*sdc); + + + }); + Scheduler::register_task(16.67,+[](){ + + DataPackets::control_station_udp->send_packet(*Reeds); + DataPackets::control_station_udp->send_packet(*Regulator); + + + }); + Scheduler::register_task(16670.0,+[](){ + DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); + + }); + + + +} +}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp new file mode 100644 index 00000000..829c9577 --- /dev/null +++ b/Core/Inc/Communications/Packets/OrderPackets.hpp @@ -0,0 +1,99 @@ +#pragma once +#include "ST-LIB.hpp" + +//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- + +extern void Brake_cb(); +extern void Unbrake_cb(); +extern void Potencia_Refri_cb(); +extern void Set_Regulator_cb(); +extern void Enable_Tapes_cb(); +extern void Disbable_Tapes_cb(); +extern void Close_Contactors_cb(); +extern void Open_Contactors_cb(); +extern void Levitation_cb(); +extern void Stop_Levitation_cb(); +extern void Emergency_Stop_cb(); +extern void Propulsion_cb(); +extern void SVPWM_cb(); +extern void Stop_Motor_cb(); +extern void Current_Control_cb(); +extern void Speed_Control_cb(); +extern void Motor_Brake_cb(); +extern void Recovery_cb(); + +class OrderPackets{ + enum class pump:uint8_t + { + UNIDADES=0, + PLACAS=1 + }; + + enum class regulator:uint8_t + { + REGULATOR_1=0, + REGULATOR_2=1 + }; + + enum class run_id:uint8_t + { + LIM=0 + }; + + enum class motor_direction:uint8_t + { + FORWARD=0, + BACKWARDS=1 + }; + + + + + + private: + uint32_t id{0}; + public: + HeapOrder* Brake; + HeapOrder* Unbrake; + HeapOrder* Potencia_Refri; + HeapOrder* Set_Regulator; + HeapOrder* Enable_Tapes; + HeapOrder* Disbable_Tapes; + HeapOrder* Close_Contactors; + HeapOrder* Open_Contactors; + HeapOrder* Levitation; + HeapOrder* Stop_Levitation; + HeapOrder* Emergency_Stop; + HeapOrder* Propulsion; + HeapOrder* SVPWM; + HeapOrder* Stop_Motor; + HeapOrder* Current_Control; + HeapOrder* Speed_Control; + HeapOrder* Motor_Brake; + HeapOrder* Recovery; + + + OrderPackets(uint32_t &duty,pump &pump,float ®ulator_pressure,regulator ®ulator,float &levitation_distance,run_id &run_id,float &modulation_frequency,float &commutation_frequency,float &max_voltage,float &reference_voltage,motor_direction &motor_direction,float &reference_current,float &reference_speed) +{ + + Brake=new HeapOrder(43,&Brake_cb); + Unbrake=new HeapOrder(52,&Unbrake_cb); + Potencia_Refri=new HeapOrder(33,&Potencia_Refri_cb,&duty,&pump); + Set_Regulator=new HeapOrder(34,&Set_Regulator_cb,®ulator_pressure,®ulator); + Enable_Tapes=new HeapOrder(35,&Enable_Tapes_cb); + Disbable_Tapes=new HeapOrder(36,&Disbable_Tapes_cb); + Close_Contactors=new HeapOrder(44,&Close_Contactors_cb); + Open_Contactors=new HeapOrder(53,&Open_Contactors_cb); + Levitation=new HeapOrder(37,&Levitation_cb,&levitation_distance); + Stop_Levitation=new HeapOrder(46,&Stop_Levitation_cb); + Emergency_Stop=new HeapOrder(55,&Emergency_Stop_cb); + Propulsion=new HeapOrder(56,&Propulsion_cb,&run_id); + SVPWM=new HeapOrder(57,&SVPWM_cb,&modulation_frequency,&commutation_frequency,&max_voltage,&reference_voltage,&motor_direction); + Stop_Motor=new HeapOrder(58,&Stop_Motor_cb); + Current_Control=new HeapOrder(59,&Current_Control_cb,&modulation_frequency,&commutation_frequency,&reference_current,&max_voltage,&motor_direction); + Speed_Control=new HeapOrder(60,&Speed_Control_cb,&reference_speed,&commutation_frequency,&max_voltage,&motor_direction); + Motor_Brake=new HeapOrder(61,&Motor_Brake_cb); + Recovery=new HeapOrder(32,&Recovery_cb); + +} +}; \ No newline at end of file diff --git a/Core/Inc/state_machine.hpp b/Core/Inc/state_machine.hpp new file mode 100644 index 00000000..0a448b41 --- /dev/null +++ b/Core/Inc/state_machine.hpp @@ -0,0 +1,73 @@ +#pragma once +#include "ST-LIB.hpp" +using namespace std::chrono_literals; + +// AUTOGENERATED CODE, DO NOT EDIT MANUALLY + +class Example{ + + public: + + static bool from_1_to_2(); + static bool from_1_to_2(); + static bool from_1_to_nested_1(); + static void enter_action_1(); + static void enter_action_2(); + static void enter_action_3(); + static void enter_action_4(); + static void low_precision_action(); + static void low_precision_action(); + static void mid_precision_action_to_nested_state(); + static void mid_precision_action_to_nested_state(); + static void high_precision_action_with_description(); + static void high_precision_action_with_description(); + static void exit_action_1(); + static void exit_action_2(); + + StateMachine Example_State_Machine; + StateMachine Nested_State_Machine; + + enum ExampleStates { + NAME_1, + NAME_2, + }; + + enum Nested{ + NESTED_NAME_1, + NESTED_NAME_2, + }; + + Example(){ + + Example_State_Machine = StateMachine(ExampleStates::NAME_1); + + Nested_State_Machine = StateMachine(Nested::NESTED_NAME_1); + Example_State_Machine.add_state_machine(Nested_State_Machine, ExampleStates::NAME_1); + Nested_State_Machine.add_state(Nested::NESTED_NAME_2); + + Example_State_Machine.add_state(ExampleStates::NAME_2); + + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + // Transitioning from 1 to 2 + Example_State_Machine.add_transition(ExampleStates::NAME_1, ExampleStates::NAME_2, from_1_to_2); + Example_State_Machine.add_transition(ExampleStates::NAME_1, Nested::NESTED_NAME_1, from_1_to_nested_1); + + Example_State_Machine.add_enter_action(enter_action_1, ExampleStates::NAME_1); + Example_State_Machine.add_enter_action(enter_action_2, ExampleStates::NAME_1); + // Description of enter_action_3 + Example_State_Machine.add_enter_action(enter_action_3, ExampleStates::NAME_2); + Example_State_Machine.add_enter_action(enter_action_4, ExampleStates::NAME_2); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_1); + Example_State_Machine.add_low_precision_cyclic_action(low_precision_action, 30ms, ExampleStates::NAME_2); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, ExampleStates::NAME_1); + Example_State_Machine.add_mid_precision_cyclic_action(mid_precision_action_to_nested_state, 60ms, Nested::NESTED_NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_1); + // Cyclic action example with description + Example_State_Machine.add_high_precision_cyclic_action(high_precision_action_with_description, 90ms, ExampleStates::NAME_2); + Example_State_Machine.add_exit_action(exit_action_1, Nested::NESTED_NAME_2); + Example_State_Machine.add_exit_action(exit_action_2, Nested::NESTED_NAME_2); + + } + +}; \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index 77dbc457..e5e1bcfe 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20250605T165128" // DateTime using ISO-8601 format + "20260122T232119" // DateTime using ISO-8601 format " " // alignment - "77b804dd" // STLIB commit + "dbe4a57f" // STLIB commit "--------" // ADJ commit - "3a365135" // Board commit + "5c58756f" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 788b26c14347adcdb7f5be953ffb333338a990db Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Thu, 22 Jan 2026 23:24:55 +0100 Subject: [PATCH 26/48] Deleted generated code --- .../Communications/Packets/DataPackets.hpp | 154 ------------------ .../Communications/Packets/OrderPackets.hpp | 99 ----------- 2 files changed, 253 deletions(-) delete mode 100644 Core/Inc/Communications/Packets/DataPackets.hpp delete mode 100644 Core/Inc/Communications/Packets/OrderPackets.hpp diff --git a/Core/Inc/Communications/Packets/DataPackets.hpp b/Core/Inc/Communications/Packets/DataPackets.hpp deleted file mode 100644 index 68d8c2db..00000000 --- a/Core/Inc/Communications/Packets/DataPackets.hpp +++ /dev/null @@ -1,154 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- -class DataPackets{ - public: - enum class general_state:uint8_t - { - CONNECTING=0, - OPERATIONAL=1, - FAULT=2 - }; - - enum class operational_state:uint8_t - { - IDLE=0, - END_OF_RUN=1, - ENERGIZED=2, - READY=3, - DEMONSTRATION=4, - RECOVERY=5 - }; - - enum class reed1:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed2:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed3:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class reed4:uint8_t - { - UNDEPLOYED=0, - DEPLOYED=1 - }; - - enum class flow1:uint8_t - { - OFF=0, - ON=1 - }; - - enum class flow2:uint8_t - { - OFF=0, - ON=1 - }; - - enum class tape_enable_output:uint8_t - { - DISABLED=0, - ENABLED=1 - }; - - enum class emergency_tape:uint8_t - { - EMERGENCY_SECTION=0, - NORMAL_SECTION=1 - }; - - enum class SDC:uint8_t - { - OFF=0, - ON=1 - }; - - - - private: - inline static uint32_t id{0}; - public: - static inline HeapPacket* Current_State{}; - static inline HeapPacket* Reeds{}; - static inline HeapPacket* Flow{}; - static inline HeapPacket* Regulator{}; - static inline HeapPacket* Pressure{}; - static inline HeapPacket* tapes{}; - static inline HeapPacket* sdc{}; - static inline HeapPacket* recovery_state{}; - - - static inline ServerSocket* control_station_tcp = nullptr; - static inline DatagramSocket* control_station_udp = nullptr; - static inline Socket* pcu_tcp = nullptr; - static inline DatagramSocket* pcu_udp = nullptr; - static inline Socket* hvscu_tcp = nullptr; - static inline DatagramSocket* hvscu_udp = nullptr; - - - DataPackets(general_state &general_state,operational_state &operational_state,reed1 &reed1,reed2 &reed2,reed3 &reed3,reed4 &reed4,bool &all_reeds,flow1 &flow1,flow2 &flow2,float ®ulator_1_pressure,float ®ulator_2_pressure,float &pressure_high,float &pressure_regulator,float &pressure_brakes,float &pressure_capsule,tape_enable_output &tape_enable_output,emergency_tape &emergency_tape,SDC &SDC,uint8_t &state) -{ - control_station_tcp = new ServerSocket("192.168.1.3",50500); - - control_station_udp = new DatagramSocket("192.168.1.3",50400,"192.168.0.9",50400); - pcu_udp = new DatagramSocket("192.168.1.3",50402,"192.168.1.5",50402); - hvscu_udp = new DatagramSocket("192.168.1.3",50403,"192.168.1.7",50403); - - pcu_tcp = new Socket("192.168.1.3",50501,"192.168.1.5",50500); - hvscu_tcp = new Socket("192.168.1.3",50502,"192.168.1.7",50500); - - Current_State = new HeapPacket(static_cast(249),&general_state,&operational_state); - - Reeds = new HeapPacket(static_cast(251),&reed1,&reed2,&reed3,&reed4,&all_reeds); - - Flow = new HeapPacket(static_cast(250),&flow1,&flow2); - - Regulator = new HeapPacket(static_cast(252),®ulator_1_pressure,®ulator_2_pressure); - - Pressure = new HeapPacket(static_cast(253),&pressure_high,&pressure_regulator,&pressure_brakes,&pressure_capsule); - - tapes = new HeapPacket(static_cast(254),&tape_enable_output,&emergency_tape); - - sdc = new HeapPacket(static_cast(255),&SDC); - - recovery_state = new HeapPacket(static_cast(65),&state); - - - Scheduler::register_task(16670.0,+[](){ - - DataPackets::control_station_udp->send_packet(*Current_State); - DataPackets::control_station_udp->send_packet(*Flow); - DataPackets::control_station_udp->send_packet(*Pressure); - DataPackets::control_station_udp->send_packet(*tapes); - DataPackets::control_station_udp->send_packet(*sdc); - - - }); - Scheduler::register_task(16.67,+[](){ - - DataPackets::control_station_udp->send_packet(*Reeds); - DataPackets::control_station_udp->send_packet(*Regulator); - - - }); - Scheduler::register_task(16670.0,+[](){ - DataPackets::pcu_udp->send_packet(*DataPackets::recovery_state); - - }); - - - -} -}; \ No newline at end of file diff --git a/Core/Inc/Communications/Packets/OrderPackets.hpp b/Core/Inc/Communications/Packets/OrderPackets.hpp deleted file mode 100644 index 829c9577..00000000 --- a/Core/Inc/Communications/Packets/OrderPackets.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Order packets for VCU -AUTOGENERATED CODE, DO NOT MODIFY- - -extern void Brake_cb(); -extern void Unbrake_cb(); -extern void Potencia_Refri_cb(); -extern void Set_Regulator_cb(); -extern void Enable_Tapes_cb(); -extern void Disbable_Tapes_cb(); -extern void Close_Contactors_cb(); -extern void Open_Contactors_cb(); -extern void Levitation_cb(); -extern void Stop_Levitation_cb(); -extern void Emergency_Stop_cb(); -extern void Propulsion_cb(); -extern void SVPWM_cb(); -extern void Stop_Motor_cb(); -extern void Current_Control_cb(); -extern void Speed_Control_cb(); -extern void Motor_Brake_cb(); -extern void Recovery_cb(); - -class OrderPackets{ - enum class pump:uint8_t - { - UNIDADES=0, - PLACAS=1 - }; - - enum class regulator:uint8_t - { - REGULATOR_1=0, - REGULATOR_2=1 - }; - - enum class run_id:uint8_t - { - LIM=0 - }; - - enum class motor_direction:uint8_t - { - FORWARD=0, - BACKWARDS=1 - }; - - - - - - private: - uint32_t id{0}; - public: - HeapOrder* Brake; - HeapOrder* Unbrake; - HeapOrder* Potencia_Refri; - HeapOrder* Set_Regulator; - HeapOrder* Enable_Tapes; - HeapOrder* Disbable_Tapes; - HeapOrder* Close_Contactors; - HeapOrder* Open_Contactors; - HeapOrder* Levitation; - HeapOrder* Stop_Levitation; - HeapOrder* Emergency_Stop; - HeapOrder* Propulsion; - HeapOrder* SVPWM; - HeapOrder* Stop_Motor; - HeapOrder* Current_Control; - HeapOrder* Speed_Control; - HeapOrder* Motor_Brake; - HeapOrder* Recovery; - - - OrderPackets(uint32_t &duty,pump &pump,float ®ulator_pressure,regulator ®ulator,float &levitation_distance,run_id &run_id,float &modulation_frequency,float &commutation_frequency,float &max_voltage,float &reference_voltage,motor_direction &motor_direction,float &reference_current,float &reference_speed) -{ - - Brake=new HeapOrder(43,&Brake_cb); - Unbrake=new HeapOrder(52,&Unbrake_cb); - Potencia_Refri=new HeapOrder(33,&Potencia_Refri_cb,&duty,&pump); - Set_Regulator=new HeapOrder(34,&Set_Regulator_cb,®ulator_pressure,®ulator); - Enable_Tapes=new HeapOrder(35,&Enable_Tapes_cb); - Disbable_Tapes=new HeapOrder(36,&Disbable_Tapes_cb); - Close_Contactors=new HeapOrder(44,&Close_Contactors_cb); - Open_Contactors=new HeapOrder(53,&Open_Contactors_cb); - Levitation=new HeapOrder(37,&Levitation_cb,&levitation_distance); - Stop_Levitation=new HeapOrder(46,&Stop_Levitation_cb); - Emergency_Stop=new HeapOrder(55,&Emergency_Stop_cb); - Propulsion=new HeapOrder(56,&Propulsion_cb,&run_id); - SVPWM=new HeapOrder(57,&SVPWM_cb,&modulation_frequency,&commutation_frequency,&max_voltage,&reference_voltage,&motor_direction); - Stop_Motor=new HeapOrder(58,&Stop_Motor_cb); - Current_Control=new HeapOrder(59,&Current_Control_cb,&modulation_frequency,&commutation_frequency,&reference_current,&max_voltage,&motor_direction); - Speed_Control=new HeapOrder(60,&Speed_Control_cb,&reference_speed,&commutation_frequency,&max_voltage,&motor_direction); - Motor_Brake=new HeapOrder(61,&Motor_Brake_cb); - Recovery=new HeapOrder(32,&Recovery_cb); - -} -}; \ No newline at end of file From 2833d5128ab1b98c043b611585898028dc2ca40c Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Fri, 23 Jan 2026 20:58:02 +0100 Subject: [PATCH 27/48] Deps update and deleted comments --- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/Packet_generation.py | 62 ------------------- deps/ST-LIB | 2 +- 3 files changed, 2 insertions(+), 64 deletions(-) diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index df2922c1..4c68a56c 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit df2922c1ca12a5150ba892ae93a7a00c2b97dbdb +Subproject commit 4c68a56cb378fe95ce573292b35b2bc82d36f558 diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index b7f008bc..a4ad083b 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -157,65 +157,3 @@ def Generate_OrderPackets_hpp(board_input:str): Output.write(template.render(context)) -#--------------Protections.hpp generation---------------# - -# def Generate_Protections_context(board:BoardDescription): -# def Get_Bondaries(measurement:MeasurmentsDescription): -# Boundaries = [] -# for i in {0,1}: -# for j in {0,1}: -# if measurement.protections.protections[i].Protectionvalue[j] is None: -# continue -# temp_boundary= {"type": measurement.type, "Above_or_Below":measurement.protections.protections[i].ProtectionType, "value": measurement.protections.protections[i].Protectionvalue[j],"coma":"," } -# Boundaries.append(temp_boundary) - -# Boundaries[-1]["coma"] = "" -# return Boundaries - - -# def Get_protection_packets(board:BoardDescription): -# protections = [] -# for packet in board.packets: -# for packet_instance in board.packets[packet]: -# for measurement in packet_instance.measurements: -# if hasattr(measurement, "protections"): -# protections.append(measurement) -# if len(protections) == 0: -# return False -# return protections - - -# protection_packets = Get_protection_packets(board) -# if protection_packets == False: -# return False -# protections=[] -# data =[] -# for measurement in protection_packets: -# Boundaries = Get_Bondaries(measurement) -# aux_protection = {"packet": measurement.id, "Boundaries": Boundaries} -# aux_data = {"type": measurement.type, "name": measurement.id} -# if aux_data not in data: -# data.append(aux_data) -# if aux_protection in protections: -# continue -# protections.append(aux_protection) - -# context ={ -# "board": board.name, -# "data": data, -# "protections": protections -# } -# return context - -# def Generate_Protections_hpp(board_input:str): -# protections_path = "Core/Inc/Communications/Packets/Protections.hpp" -# board_instance = globals()[board_input] -# env= jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path)) -# template = env.get_template("ProtectionsTemplate.hpp") -# context = Generate_Protections_context(board_instance) -# if context == False: -# if os.path.exists(protections_path): -# os.remove(protections_path) -# return -# with open(protections_path,"w") as Output: -# Output.write(template.render(context)) \ No newline at end of file diff --git a/deps/ST-LIB b/deps/ST-LIB index dbe4a57f..332e04d7 160000 --- a/deps/ST-LIB +++ b/deps/ST-LIB @@ -1 +1 @@ -Subproject commit dbe4a57f473998907e04282ab51f5c9610c15cd7 +Subproject commit 332e04d7b84d18e36df36a9e7366c03d030b3a02 From 7cb761bacb13784489c1096995d53769de493eb4 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Fri, 23 Jan 2026 21:02:05 +0100 Subject: [PATCH 28/48] Now it works --- CMakeLists.txt | 2 +- Core/Inc/Code_generation/JSON_ADE | 2 +- Core/Src/Runes/generated_metadata.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 028a5591..90fb9790 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(template-project LANGUAGES ASM C CXX) set(EXECUTABLE ${PROJECT_NAME}.elf) set(Board "VCU") # User must change the Board name set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB) -set(LD_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H723ZGTX_FLASH.ld) +set(LD_SCRIPT ${STLIB_DIR}/STM32H723ZGTX_FLASH.ld) find_package(Python3 COMPONENTS Interpreter REQUIRED) diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 4c68a56c..76d1b303 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 4c68a56cb378fe95ce573292b35b2bc82d36f558 +Subproject commit 76d1b30360d881a6af4ef9dbf307f418980c9594 diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index e5e1bcfe..dc82fcfa 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20260122T232119" // DateTime using ISO-8601 format + "20260123T210152" // DateTime using ISO-8601 format " " // alignment - "dbe4a57f" // STLIB commit + "332e04d7" // STLIB commit "--------" // ADJ commit - "5c58756f" // Board commit + "01cca436" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file From 0d8274b147159cf303ae0e6a43e4983093bbd8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez?= <120128034+victor-Lopez25@users.noreply.github.com> Date: Sat, 31 Jan 2026 20:10:17 +0100 Subject: [PATCH 29/48] virtual\scripts\python is wrong, also Wpedantic needs to be removed virtual\scripts\python for windows is wrong, also Wpedantic needs to be removed --- CMakeLists.txt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f63cb1ca..e8a79b32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,11 +16,7 @@ add_custom_target(run_generator ALL WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -if(CMAKE_HOST_WIN32 ) - set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/Scripts/python) -else() - set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) -endif() +set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) add_custom_target( my_custom_target_that_always_runs ALL @@ -103,7 +99,6 @@ target_compile_options(${EXECUTABLE} PRIVATE $<$:-w> $<$:-Wall> - $<$:-Wpedantic> $<$:-Werror> $<$:-fno-use-cxa-atexit> $<$:-fno-rtti> From bb2af329d5c5f4af9c7015f73ed68c6c7fee4e2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez?= <120128034+victor-Lopez25@users.noreply.github.com> Date: Sat, 31 Jan 2026 20:18:21 +0100 Subject: [PATCH 30/48] remove htim* from runes.cpp, I thought I removed this before... --- Core/Src/Runes/Runes.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Core/Src/Runes/Runes.cpp b/Core/Src/Runes/Runes.cpp index 16a735b0..2e879002 100644 --- a/Core/Src/Runes/Runes.cpp +++ b/Core/Src/Runes/Runes.cpp @@ -17,19 +17,6 @@ ADC_HandleTypeDef hadc3; LPTIM_HandleTypeDef hlptim1; LPTIM_HandleTypeDef hlptim2; LPTIM_HandleTypeDef hlptim3; -TIM_HandleTypeDef htim1; -TIM_HandleTypeDef htim2; -TIM_HandleTypeDef htim3; -TIM_HandleTypeDef htim4; -TIM_HandleTypeDef htim5; -TIM_HandleTypeDef htim7; -TIM_HandleTypeDef htim8; -TIM_HandleTypeDef htim12; -TIM_HandleTypeDef htim16; -TIM_HandleTypeDef htim17; -TIM_HandleTypeDef htim15; -TIM_HandleTypeDef htim23; -TIM_HandleTypeDef htim24; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; From f140ad4b62e7921a3cb7be547cafdbd3cd85519e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez?= <120128034+victor-Lopez25@users.noreply.github.com> Date: Sat, 31 Jan 2026 20:45:30 +0100 Subject: [PATCH 31/48] remove virtual/Scripts/python from tasks.json --- .vscode/tasks.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index bf4f5d3f..01343bf7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,9 +12,6 @@ "label": "Pre-flash check", "type": "shell", "command": "${workspaceFolder}/virtual/bin/python", - "windows": { - "command": "${workspaceFolder}/virtual/Scripts/python" - }, "args": [ "${workspaceFolder}/tools/preflash_check.py" ], From 9b294330f592863214f49d9d59cfc62df926cb8f Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 2 Feb 2026 13:11:10 +0100 Subject: [PATCH 32/48] Hotfix code generation --- Core/Inc/Code_generation/JSON_ADE | 2 +- .../Packet_generation/OrderTemplate.hpp | 10 +++++++--- .../Packet_generation/Packet_descriptions.py | 2 ++ Core/Src/Runes/generated_metadata.cpp | 6 +++--- deps/ST-LIB | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Core/Inc/Code_generation/JSON_ADE b/Core/Inc/Code_generation/JSON_ADE index 76d1b303..ee857f81 160000 --- a/Core/Inc/Code_generation/JSON_ADE +++ b/Core/Inc/Code_generation/JSON_ADE @@ -1 +1 @@ -Subproject commit 76d1b30360d881a6af4ef9dbf307f418980c9594 +Subproject commit ee857f81e0aef674a19f8fc5db4a2d3c28a75a51 diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index dc894260..c7488d13 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -3,8 +3,6 @@ //Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- -{%for packet in packets%}extern void {{packet.name}}_cb(); -{% endfor %} class OrderPackets{ {% for enum in enums %}enum class {{enum.name}}:uint8_t { @@ -13,10 +11,16 @@ class OrderPackets{ {% endfor %} - + {%for packet in packets%} inline static bool {{packet.name}}_flag{false}; + {% endfor %} private: uint32_t id{0}; + + {%for packet in packets%}static void {{packet.name}}_cb(){ + {{packet.name}}_flag = true; + } + {% endfor %} public: {%for packet in packets%}HeapOrder* {{packet.name}}; {% endfor %} diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index f0f43eb7..8001e45f 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -157,4 +157,6 @@ def _unsigned_int_correction(type:str): type += "_t" elif type == "float32": type = "float" + elif type == "float64": + type = "double" return type \ No newline at end of file diff --git a/Core/Src/Runes/generated_metadata.cpp b/Core/Src/Runes/generated_metadata.cpp index dc82fcfa..6789b95b 100644 --- a/Core/Src/Runes/generated_metadata.cpp +++ b/Core/Src/Runes/generated_metadata.cpp @@ -5,11 +5,11 @@ extern "C"{ const char DESCRIPTION[255] __attribute__((section(".metadata_pool")))= "****************" // placeholder for beggining - "20260123T210152" // DateTime using ISO-8601 format + "20260202T130943" // DateTime using ISO-8601 format " " // alignment - "332e04d7" // STLIB commit + "20be5ece" // STLIB commit "--------" // ADJ commit - "01cca436" // Board commit + "c7c9b795" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file diff --git a/deps/ST-LIB b/deps/ST-LIB index e2a56178..20be5ece 160000 --- a/deps/ST-LIB +++ b/deps/ST-LIB @@ -1 +1 @@ -Subproject commit e2a56178a9ed2cebb53a4840e00f862e5b9e3935 +Subproject commit 20be5ece4cc936bdb3e982f09a9793729af62e3c From 7e1fcd131e3358bf23f1871f09442d14587145b4 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 2 Feb 2026 13:45:26 +0100 Subject: [PATCH 33/48] Now packets dont duplicate constructor variables --- .../Code_generation/Packet_generation/Packet_generation.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py index a4ad083b..6400bb57 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -57,7 +57,8 @@ def GenerateDataPackets(board:BoardDescription): Packets.append(aux_packet) for measurement in packet_instance.measurements: aux_data = {"type": measurement.type, "name": measurement.id.replace(" ", "_").replace("-", "_")} - totaldata.append(aux_data) + if not any(x["name"] == aux_data["name"] for x in totaldata): + totaldata.append(aux_data) return Packets,totaldata @@ -124,7 +125,7 @@ def GenerateOrderPackets(board:BoardDescription): Packets.append(aux_packet) for measurement in packet_instance.measurements: aux_data = {"type": measurement.type, "name": measurement.id} - if aux_data not in totaldata: + if not any(x["name"] == aux_data["name"] for x in totaldata): totaldata.append(aux_data) return Packets,totaldata From 13c49ca1e51e3c5d2bb6a255e96b52d057ec0e4d Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 2 Feb 2026 15:07:44 +0100 Subject: [PATCH 34/48] Revert "Merge remote-tracking branch 'origin/hotfix!-virtualbinpython-always-+-Wpedantic-removed' into FW-301/Execute_Code_gen_on_cmake" This reverts commit bfa74507b912d343b4dc71451df2c34aaea73148, reversing changes made to 9b294330f592863214f49d9d59cfc62df926cb8f. --- .vscode/tasks.json | 3 +++ CMakeLists.txt | 7 ++++++- Core/Src/Runes/Runes.cpp | 13 +++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 01343bf7..bf4f5d3f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,6 +12,9 @@ "label": "Pre-flash check", "type": "shell", "command": "${workspaceFolder}/virtual/bin/python", + "windows": { + "command": "${workspaceFolder}/virtual/Scripts/python" + }, "args": [ "${workspaceFolder}/tools/preflash_check.py" ], diff --git a/CMakeLists.txt b/CMakeLists.txt index e8a79b32..f63cb1ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,11 @@ add_custom_target(run_generator ALL WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) +if(CMAKE_HOST_WIN32 ) + set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/Scripts/python) +else() + set(VENV_PYTHON ${CMAKE_SOURCE_DIR}/virtual/bin/python) +endif() add_custom_target( my_custom_target_that_always_runs ALL @@ -99,6 +103,7 @@ target_compile_options(${EXECUTABLE} PRIVATE $<$:-w> $<$:-Wall> + $<$:-Wpedantic> $<$:-Werror> $<$:-fno-use-cxa-atexit> $<$:-fno-rtti> diff --git a/Core/Src/Runes/Runes.cpp b/Core/Src/Runes/Runes.cpp index 2e879002..16a735b0 100644 --- a/Core/Src/Runes/Runes.cpp +++ b/Core/Src/Runes/Runes.cpp @@ -17,6 +17,19 @@ ADC_HandleTypeDef hadc3; LPTIM_HandleTypeDef hlptim1; LPTIM_HandleTypeDef hlptim2; LPTIM_HandleTypeDef hlptim3; +TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; +TIM_HandleTypeDef htim5; +TIM_HandleTypeDef htim7; +TIM_HandleTypeDef htim8; +TIM_HandleTypeDef htim12; +TIM_HandleTypeDef htim16; +TIM_HandleTypeDef htim17; +TIM_HandleTypeDef htim15; +TIM_HandleTypeDef htim23; +TIM_HandleTypeDef htim24; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; From 89491df59e470be9d183514ea65de547b648baf5 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Mon, 2 Feb 2026 15:11:09 +0100 Subject: [PATCH 35/48] Remove pedantic from cmake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f63cb1ca..354cbc73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ target_compile_options(${EXECUTABLE} PRIVATE $<$:-w> $<$:-Wall> - $<$:-Wpedantic> + # $<$:-Wpedantic> $<$:-Werror> $<$:-fno-use-cxa-atexit> $<$:-fno-rtti> From 76704257747d59add8794064b6e17f0958816e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cant=C3=B3=20Catal=C3=A1n?= <144663567+Cantonplas@users.noreply.github.com> Date: Mon, 2 Feb 2026 18:28:13 +0100 Subject: [PATCH 36/48] Modify OrderPackets class to include public access Added public access modifier to OrderPackets class and updated formatting. --- Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index c7488d13..6b33d207 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -4,13 +4,14 @@ //Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- class OrderPackets{ + public: {% for enum in enums %}enum class {{enum.name}}:uint8_t { {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} {% endfor %}}; {% endfor %} - + {%for packet in packets%} inline static bool {{packet.name}}_flag{false}; {% endfor %} @@ -31,4 +32,4 @@ class OrderPackets{ {% for packet in packets %}{{packet.name}}=new HeapOrder({{packet.id}},&{{packet.name}}_cb{% if packet.data%},{{packet.data}}{% endif%}); {% endfor %} } -}; \ No newline at end of file +}; From 18c2a9345c7725a482c22f9015f04933bb0d3e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez?= <120128034+victor-Lopez25@users.noreply.github.com> Date: Mon, 2 Feb 2026 21:03:49 +0100 Subject: [PATCH 37/48] Cleanup template and output --- .../Packet_generation/DataTemplate.hpp | 62 ++++++++++--------- .../Packet_generation/OrderTemplate.hpp | 39 +++++------- Core/Inc/stm32h7xx_it.h | 4 -- 3 files changed, 51 insertions(+), 54 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 0d7c81e9..ee05b6de 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -2,14 +2,14 @@ #include "ST-LIB.hpp" //Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- -class DataPackets{ - public: - {% for enum in enums %}enum class {{enum.name}}:uint8_t - { - {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} - {% endfor %}}; - - {%endfor %} +struct DataPackets{ + {% for enum in enums -%} + enum class {{enum.name}} : uint8_t { + {%- for value in enum["values"] %} + {{value}} = {{loop.index0}}, + {%- endfor %} + }; + {% endfor %} private: inline static uint32_t id{0}; @@ -21,25 +21,31 @@ class DataPackets{ {% endfor %} DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) -{ - {% for socket in ServerSockets%}{{socket.name}} = new ServerSocket("{{socket.board_ip}}",{{socket.port}}); - {% endfor %} - {% for socket in DatagramSockets%}{{socket.name}} = new DatagramSocket("{{socket.board_ip}}",{{socket.port}},"{{socket.remote_ip}}",{{socket.port}}); - {% endfor %} - {% for socket in Sockets%}{{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); - {% endfor %} - {% for packet in packets %}{{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.data%},{{packet.data}}{% endif%}); - - {% endfor %} - {%for packet in sending_packets %}Scheduler::register_task({% if packet.period_type == "ms" %}{{(packet.period*1000)}}{% else %}{{packet.period}}{% endif %},+[](){ - {% if packet.name is string %} DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); - {%else%} - {%for name in packet.name%}DataPackets::{{packet.socket}}->send_packet(*{{name}}); - {%endfor%} - {% endif %} - }); - {%endfor%} - + { + {% for socket in ServerSockets -%} + {{socket.name}} = new ServerSocket("{{socket.board_ip}}",{{socket.port}}); + {%- endfor %} + {% for socket in DatagramSockets -%} + {{socket.name}} = new DatagramSocket("{{socket.board_ip}}",{{socket.port}},"{{socket.remote_ip}}",{{socket.port}}); + {% endfor %} + {% for socket in Sockets -%} + {{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); + {% endfor %} + {% for packet in packets -%} + {{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.data%},{{packet.data}} + {%- endif %}); -} + {% endfor -%} + + {%- for packet in sending_packets %} + Scheduler::register_task({% if packet.period_type == "ms" %}{{(packet.period*1000)}}{% else %}{{packet.period}}{% endif %}, +[](){ + {% if packet.name is string -%} + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + {% else %} + {% for name in packet.name -%} + DataPackets::{{packet.socket}}->send_packet(*{{name}}); + {% endfor -%} + {%- endif %} + }); {%- endfor %} + } }; \ No newline at end of file diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 6b33d207..f24842e1 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -3,33 +3,28 @@ //Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- +{% for packet in packets -%} +extern void {{packet.name}}_cb(); +{% endfor %} class OrderPackets{ - public: - {% for enum in enums %}enum class {{enum.name}}:uint8_t - { - {% for value in enum["values"] %}{{value}}={{loop.index0}}{%if not loop.last%},{%endif%} - {% endfor %}}; - + {% for enum in enums -%} + enum class {{enum.name}} : uint8_t { + {%- for value in enum["values"] %} + {{value}} = {{loop.index0}}, + {%- endfor %} + }; {% endfor %} - - {%for packet in packets%} inline static bool {{packet.name}}_flag{false}; - {% endfor %} - private: uint32_t id{0}; - - {%for packet in packets%}static void {{packet.name}}_cb(){ - {{packet.name}}_flag = true; - } - {% endfor %} public: - {%for packet in packets%}HeapOrder* {{packet.name}}; + {% for packet in packets -%} + HeapOrder *{{packet.name}}; {% endfor %} - + OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) -{ - - {% for packet in packets %}{{packet.name}}=new HeapOrder({{packet.id}},&{{packet.name}}_cb{% if packet.data%},{{packet.data}}{% endif%}); - {% endfor %} -} + { + {% for packet in packets -%} + {{packet.name}} = new HeapOrder({{packet.id}}, &{{packet.name}}_cb{% if packet.data %}, {{packet.data}}{% endif %}); + {% endfor %} + } }; diff --git a/Core/Inc/stm32h7xx_it.h b/Core/Inc/stm32h7xx_it.h index 56a5e3be..33fe732e 100644 --- a/Core/Inc/stm32h7xx_it.h +++ b/Core/Inc/stm32h7xx_it.h @@ -68,12 +68,8 @@ void DMA2_Stream0_IRQHandler(void); void DMA2_Stream1_IRQHandler(void); void DMA2_Stream2_IRQHandler(void); void FMAC_IRQHandler(void); -void TIM2_IRQHandler(void); void I2C2_EV_IRQHandler(void); -void TIM8_TRG_COM_TIM14_IRQHandler(void); -void TIM5_IRQHandler(void); void SPI3_IRQHandler(void); -void TIM7_IRQHandler(void); void ETH_IRQHandler(void); void LPTIM1_IRQHandler(void); void LPTIM2_IRQHandler(void); From a366abe5cbca471763941afc6e1d775216ea1db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez?= <120128034+victor-Lopez25@users.noreply.github.com> Date: Tue, 3 Feb 2026 13:30:12 +0100 Subject: [PATCH 38/48] Further cleanup templates and output --- .../Packet_generation/DataTemplate.hpp | 17 +++++++++-------- .../Packet_generation/OrderTemplate.hpp | 15 ++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index ee05b6de..be404bcc 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -11,14 +11,15 @@ struct DataPackets{ }; {% endfor %} - private: - inline static uint32_t id{0}; - public: - {%for packet in packets%}static inline HeapPacket* {{packet.name}}{}; - {% endfor %} - - {% for socket in sockets %}static inline {{socket.type}}* {{socket.name}} = nullptr; - {% endfor %} +private: + inline static uint32_t id{0}; +public: + {%for packet in packets -%} + static inline HeapPacket *{{packet.name}}{}; + {% endfor %} + {% for socket in sockets -%} + static inline {{socket.type}} *{{socket.name}} = nullptr; + {% endfor %} DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) { diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index f24842e1..01acc60b 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -14,12 +14,13 @@ class OrderPackets{ {%- endfor %} }; {% endfor %} - private: - uint32_t id{0}; - public: - {% for packet in packets -%} - HeapOrder *{{packet.name}}; - {% endfor %} + +private: + uint32_t id{0}; +public: + {% for packet in packets -%} + HeapOrder *{{packet.name}}; + {% endfor %} OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) { @@ -27,4 +28,4 @@ class OrderPackets{ {{packet.name}} = new HeapOrder({{packet.id}}, &{{packet.name}}_cb{% if packet.data %}, {{packet.data}}{% endif %}); {% endfor %} } -}; +}; \ No newline at end of file From 2fdb4d8f21972654312728340d4698d2e3119c86 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Tue, 3 Feb 2026 14:16:37 +0100 Subject: [PATCH 39/48] Functions per packet implemented --- .../Packet_generation/DataTemplate.hpp | 23 +++++++++++-------- .../Packet_generation/OrderTemplate.hpp | 17 +++++++------- .../Packet_generation/Packet_generation.py | 20 ++++++++++++++-- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index be404bcc..f759a065 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -15,13 +15,13 @@ struct DataPackets{ inline static uint32_t id{0}; public: {%for packet in packets -%} - static inline HeapPacket *{{packet.name}}{}; + static HeapPacket *{{packet.name}}; {% endfor %} {% for socket in sockets -%} static inline {{socket.type}} *{{socket.name}} = nullptr; {% endfor %} - DataPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) + static void start() { {% for socket in ServerSockets -%} {{socket.name}} = new ServerSocket("{{socket.board_ip}}",{{socket.port}}); @@ -32,21 +32,26 @@ struct DataPackets{ {% for socket in Sockets -%} {{socket.name}} = new Socket("{{socket.board_ip}}",{{socket.local_port}},"{{socket.remote_ip}}",{{socket.remote_port}}); {% endfor %} - {% for packet in packets -%} - {{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.data%},{{packet.data}} - {%- endif %}); - - {% endfor -%} {%- for packet in sending_packets %} Scheduler::register_task({% if packet.period_type == "ms" %}{{(packet.period*1000)}}{% else %}{{packet.period}}{% endif %}, +[](){ {% if packet.name is string -%} - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + if(DataPackets::{{packet.name}}){ + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + } {% else %} {% for name in packet.name -%} - DataPackets::{{packet.socket}}->send_packet(*{{name}}); + if(DataPackets::{{name}}){ + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + } {% endfor -%} {%- endif %} }); {%- 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}} = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); + } + {% endfor -%} }; \ No newline at end of file diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index 01acc60b..cdb033a8 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -7,6 +7,7 @@ extern void {{packet.name}}_cb(); {% endfor %} class OrderPackets{ +public: {% for enum in enums -%} enum class {{enum.name}} : uint8_t { {%- for value in enum["values"] %} @@ -15,17 +16,15 @@ class OrderPackets{ }; {% endfor %} -private: - uint32_t id{0}; -public: + OrderPackets() = default; + {% for packet in packets -%} - HeapOrder *{{packet.name}}; + static HeapOrder *{{packet.name}}; {% endfor %} - OrderPackets({%for value in data %}{{value.type}} &{{value.name}}{%if not loop.last%},{%endif%}{%endfor%}) - { - {% for packet in packets -%} - {{packet.name}} = new HeapOrder({{packet.id}}, &{{packet.name}}_cb{% if packet.data %}, {{packet.data}}{% endif %}); - {% 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}} = new HeapOrder({{packet.id}}, &{{packet.name}}_cb{% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } + {% endfor %} }; \ 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 6400bb57..bc4a8211 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_generation.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_generation.py @@ -53,7 +53,15 @@ def GenerateDataPackets(board:BoardDescription): tempdata = tempdata[:-1] if tempdata_but_pointer.endswith(","): tempdata_but_pointer = tempdata_but_pointer[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer.replace(" ", "_").replace("-", "_") , "id": packet_instance.id} + + packet_variables = [] + for measurement in packet_instance.measurements: + packet_variables.append({ + "name": measurement.id.replace(" ", "_").replace("-", "_"), + "type": measurement.type + }) + + 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("-", "_")} @@ -121,7 +129,15 @@ def GenerateOrderPackets(board:BoardDescription): if tempdata.endswith(","): tempdata = tempdata[:-1] tempdata_but_pointer = tempdata_but_pointer[:-1] - aux_packet = {"name": packet_instance.name, "data":tempdata_but_pointer , "id": packet_instance.id} + + packet_variables = [] + for measurement in packet_instance.measurements: + packet_variables.append({ + "name": measurement.id.replace(" ", "_").replace("-", "_"), + "type": measurement.type + }) + + 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} From 2043c87444f34cba1fb4a315367985d172f280bb Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Tue, 3 Feb 2026 16:03:38 +0100 Subject: [PATCH 40/48] Now flags and cb are generated --- .../Packet_generation/DataTemplate.hpp | 12 +++++---- .../Packet_generation/OrderTemplate.hpp | 27 ++++++++++++++----- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index f759a065..dc685a93 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -4,7 +4,8 @@ //Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- struct DataPackets{ {% 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 %} @@ -15,10 +16,10 @@ struct DataPackets{ inline static uint32_t id{0}; public: {%for packet in packets -%} - static HeapPacket *{{packet.name}}; + inline static HeapPacket *{{packet.name}}{nullptr}; {% endfor %} {% for socket in sockets -%} - static inline {{socket.type}} *{{socket.name}} = nullptr; + inline static {{socket.type}} *{{socket.name}}{nullptr}; {% endfor %} static void start() @@ -34,7 +35,7 @@ struct DataPackets{ {% endfor %} {%- for packet in sending_packets %} - Scheduler::register_task({% if packet.period_type == "ms" %}{{(packet.period*1000)}}{% else %}{{packet.period}}{% endif %}, +[](){ + Scheduler::register_task({% if packet.period_type == "ms" %}{{ (packet.period*1000)|round|int }}{% else %}{{ packet.period|round|int }}{% endif %}, +[](){ {% if packet.name is string -%} if(DataPackets::{{packet.name}}){ DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); @@ -50,7 +51,8 @@ struct DataPackets{ } {% for packet in packets -%} - static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}){ + static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) + { {{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } {% endfor -%} diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index cdb033a8..b947baa2 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -1,30 +1,43 @@ #pragma once #include "ST-LIB.hpp" -//Order packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- +/*Order packets for {{board}} +-AUTOGENERATED CODE, DO NOT MODIFY- */ + -{% for packet in packets -%} -extern void {{packet.name}}_cb(); -{% endfor %} 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}}, {%- endfor %} }; {% endfor %} + {% for packet in packets -%} + inline static bool {{packet.name}}_flag{false}; + {% endfor %} + OrderPackets() = default; {% for packet in packets -%} - static HeapOrder *{{packet.name}}; + inline static HeapOrder *{{packet.name}}{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 %}){ + static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) + { {{packet.name}} = new HeapOrder({{packet.id}}, &{{packet.name}}_cb{% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } {% endfor %} + +private: + {% for packet in packets -%} + static void {{packet.name}}_cb() + { + {{packet.name}}_flag = true; + } + {% endfor %} }; \ No newline at end of file From 7073fdda7d2133ebbe79735fc85e0e3b848d0683 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Tue, 3 Feb 2026 16:23:59 +0100 Subject: [PATCH 41/48] New update method --- .../Packet_generation/DataTemplate.hpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index dc685a93..294d4128 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -14,6 +14,9 @@ struct DataPackets{ private: inline static uint32_t id{0}; + {%- for packet in sending_packets %} + inline static bool send_flag_{{loop.index0}} = false; + {%- endfor %} public: {%for packet in packets -%} inline static HeapPacket *{{packet.name}}{nullptr}; @@ -36,6 +39,15 @@ struct DataPackets{ {%- for packet in sending_packets %} Scheduler::register_task({% if packet.period_type == "ms" %}{{ (packet.period*1000)|round|int }}{% else %}{{ packet.period|round|int }}{% endif %}, +[](){ + DataPackets::send_flag_{{loop.index0}} = true; + }); {%- endfor %} + } + + static void update() + { + {%- for packet in sending_packets %} + if(DataPackets::send_flag_{{loop.index0}}){ + DataPackets::send_flag_{{loop.index0}} = false; {% if packet.name is string -%} if(DataPackets::{{packet.name}}){ DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); @@ -47,7 +59,8 @@ struct DataPackets{ } {% endfor -%} {%- endif %} - }); {%- endfor %} + } + {%- endfor %} } {% for packet in packets -%} From 74d2ba76d9ba0a0d1d476e7b7711e4a13fd73931 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Tue, 3 Feb 2026 16:51:06 +0100 Subject: [PATCH 42/48] Testing stuff --- .../Packet_generation/DataTemplate.hpp | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 294d4128..c0939a91 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -14,9 +14,39 @@ struct DataPackets{ private: inline static uint32_t id{0}; - {%- for packet in sending_packets %} - inline static bool send_flag_{{loop.index0}} = false; - {%- endfor %} + + {% set sending_count = sending_packets|length %} + {% if sending_count <= 32 %} + using FlagsType = uint32_t; + #define CTZ_FUNC __builtin_ctz + {% elif sending_count <= 64 %} + using FlagsType = uint64_t; + #define CTZ_FUNC __builtin_ctzll + {% else %} + #error "Too many sending tasks (>64)" + {% endif %} + + inline static volatile FlagsType send_flags{0}; + + {% for packet in sending_packets %} + static void send_task_{{loop.index0}}() { + {% if packet.name is string -%} + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + {% else %} + {% for name in packet.name -%} + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + {% endfor -%} + {%- endif %} + } + {% endfor %} + + using SendAction = void(*)(); + static inline SendAction send_actions[] = { + {% for packet in sending_packets %} + send_task_{{loop.index0}}, + {% endfor %} + }; + public: {%for packet in packets -%} inline static HeapPacket *{{packet.name}}{nullptr}; @@ -27,6 +57,12 @@ struct DataPackets{ static void start() { + {% for packet in packets -%} + if ({{packet.name}} == nullptr) { + ErrorHandler("Packet {{packet.name}} not initialized"); + } + {% endfor %} + {% for socket in ServerSockets -%} {{socket.name}} = new ServerSocket("{{socket.board_ip}}",{{socket.port}}); {%- endfor %} @@ -39,28 +75,19 @@ struct DataPackets{ {%- for packet in sending_packets %} Scheduler::register_task({% if packet.period_type == "ms" %}{{ (packet.period*1000)|round|int }}{% else %}{{ packet.period|round|int }}{% endif %}, +[](){ - DataPackets::send_flag_{{loop.index0}} = true; + DataPackets::send_flags |= (static_cast(1) << {{loop.index0}}); }); {%- endfor %} } static void update() { - {%- for packet in sending_packets %} - if(DataPackets::send_flag_{{loop.index0}}){ - DataPackets::send_flag_{{loop.index0}} = false; - {% if packet.name is string -%} - if(DataPackets::{{packet.name}}){ - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); - } - {% else %} - {% for name in packet.name -%} - if(DataPackets::{{name}}){ - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + while(DataPackets::send_flags) { + uint8_t index = CTZ_FUNC(DataPackets::send_flags); + DataPackets::send_flags &= ~(static_cast(1) << index); + if (index < {{sending_count}}) { + DataPackets::send_actions[index](); } - {% endfor -%} - {%- endif %} } - {%- endfor %} } {% for packet in packets -%} From 6325de40e0861c7288d32912dd67351fc2e5ecd3 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Tue, 3 Feb 2026 16:58:11 +0100 Subject: [PATCH 43/48] Hope its the final version jesus --- .../Packet_generation/DataTemplate.hpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index c0939a91..6ff78486 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -13,8 +13,14 @@ struct DataPackets{ {% endfor %} private: - inline static uint32_t id{0}; + {% 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}} = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); + } + {% endfor -%} + {% set sending_count = sending_packets|length %} {% if sending_count <= 32 %} using FlagsType = uint32_t; @@ -90,10 +96,5 @@ struct DataPackets{ } } - {% 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}} = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); - } - {% endfor -%} + }; \ No newline at end of file From 9813b0e678ed16361409e11529327a22eaa328fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cant=C3=B3=20Catal=C3=A1n?= <144663567+Cantonplas@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:07:17 +0100 Subject: [PATCH 44/48] Change public and private from datapackets that was incorrect --- .../Code_generation/Packet_generation/DataTemplate.hpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 6ff78486..e51bc06d 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -2,7 +2,8 @@ #include "ST-LIB.hpp" //Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- -struct DataPackets{ +class DataPackets{ +public: {% for enum in enums -%} enum class {{enum.name}} : uint8_t { @@ -11,8 +12,6 @@ struct DataPackets{ {%- endfor %} }; {% endfor %} - -private: {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) @@ -21,6 +20,8 @@ struct DataPackets{ } {% endfor -%} +private: + {% set sending_count = sending_packets|length %} {% if sending_count <= 32 %} using FlagsType = uint32_t; @@ -97,4 +98,4 @@ struct DataPackets{ } -}; \ No newline at end of file +}; From effb9d721f10e6c8272b723e5ce1524f57b4b15d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cant=C3=B3=20Catal=C3=A1n?= <144663567+Cantonplas@users.noreply.github.com> Date: Tue, 3 Feb 2026 23:07:11 +0100 Subject: [PATCH 45/48] Rename .gitignore to .gitkeep --- Core/Inc/Communications/Packets/.gitignore | 0 Core/Inc/Communications/Packets/.gitkeep | 1 + 2 files changed, 1 insertion(+) delete mode 100644 Core/Inc/Communications/Packets/.gitignore create mode 100644 Core/Inc/Communications/Packets/.gitkeep diff --git a/Core/Inc/Communications/Packets/.gitignore b/Core/Inc/Communications/Packets/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/Core/Inc/Communications/Packets/.gitkeep b/Core/Inc/Communications/Packets/.gitkeep new file mode 100644 index 00000000..d3f5a12f --- /dev/null +++ b/Core/Inc/Communications/Packets/.gitkeep @@ -0,0 +1 @@ + From 3f6ea0a0175040fd417eee9c2cb3862671aafa9a Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 4 Feb 2026 20:04:43 +0100 Subject: [PATCH 46/48] Deleted self scheduler --- .../Packet_generation/DataTemplate.hpp | 58 ++++--------------- deps/ST-LIB | 2 +- 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index e51bc06d..861079de 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -19,41 +19,7 @@ class DataPackets{ {{packet.name}} = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } {% endfor -%} - -private: - - {% set sending_count = sending_packets|length %} - {% if sending_count <= 32 %} - using FlagsType = uint32_t; - #define CTZ_FUNC __builtin_ctz - {% elif sending_count <= 64 %} - using FlagsType = uint64_t; - #define CTZ_FUNC __builtin_ctzll - {% else %} - #error "Too many sending tasks (>64)" - {% endif %} - - inline static volatile FlagsType send_flags{0}; - - {% for packet in sending_packets %} - static void send_task_{{loop.index0}}() { - {% if packet.name is string -%} - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); - {% else %} - {% for name in packet.name -%} - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); - {% endfor -%} - {%- endif %} - } - {% endfor %} - - using SendAction = void(*)(); - static inline SendAction send_actions[] = { - {% for packet in sending_packets %} - send_task_{{loop.index0}}, - {% endfor %} - }; - + public: {%for packet in packets -%} inline static HeapPacket *{{packet.name}}{nullptr}; @@ -82,20 +48,20 @@ class DataPackets{ {%- for packet in sending_packets %} Scheduler::register_task({% if packet.period_type == "ms" %}{{ (packet.period*1000)|round|int }}{% else %}{{ packet.period|round|int }}{% endif %}, +[](){ - DataPackets::send_flags |= (static_cast(1) << {{loop.index0}}); + {% if packet.name is string -%} + if(DataPackets::{{packet.name}}){ + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + } + {% else %} + {% for name in packet.name -%} + if(DataPackets::{{name}}){ + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + } + {% endfor -%} + {%- endif %} }); {%- endfor %} } - static void update() - { - while(DataPackets::send_flags) { - uint8_t index = CTZ_FUNC(DataPackets::send_flags); - DataPackets::send_flags &= ~(static_cast(1) << index); - if (index < {{sending_count}}) { - DataPackets::send_actions[index](); - } - } - } }; diff --git a/deps/ST-LIB b/deps/ST-LIB index 20be5ece..80d9efef 160000 --- a/deps/ST-LIB +++ b/deps/ST-LIB @@ -1 +1 @@ -Subproject commit 20be5ece4cc936bdb3e982f09a9793729af62e3c +Subproject commit 80d9efef0634408b10695db836da861a702bcde2 From 776b77deb5394136ca06f254f46d86e5eac9c77a Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 4 Feb 2026 20:11:04 +0100 Subject: [PATCH 47/48] Pene --- .../Code_generation/Packet_generation/DataTemplate.hpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 861079de..4707a8d3 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -49,14 +49,10 @@ class DataPackets{ {%- for packet in sending_packets %} Scheduler::register_task({% if packet.period_type == "ms" %}{{ (packet.period*1000)|round|int }}{% else %}{{ packet.period|round|int }}{% endif %}, +[](){ {% if packet.name is string -%} - if(DataPackets::{{packet.name}}){ - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); - } + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); {% else %} {% for name in packet.name -%} - if(DataPackets::{{name}}){ - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); - } + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); {% endfor -%} {%- endif %} }); {%- endfor %} From e5e22ad864a97f8bd1aebbc1a504cd763ea168f1 Mon Sep 17 00:00:00 2001 From: Cantonplas Date: Wed, 4 Feb 2026 20:14:28 +0100 Subject: [PATCH 48/48] Espacio extra que victor le gusta --- Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 4707a8d3..33e3fbc8 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -18,6 +18,7 @@ class DataPackets{ { {{packet.name}} = 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: