diff --git a/CMakeLists.txt b/CMakeLists.txt index ee8dd6df..decf996c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,7 +66,6 @@ file(GLOB_RECURSE GENERATOR_JSONS set(GENERATED_DATA_PACKETS ${CMAKE_SOURCE_DIR}/Core/Inc/Communications/Packets/DataPackets.hpp) set(GENERATED_ORDER_PACKETS ${CMAKE_SOURCE_DIR}/Core/Inc/Communications/Packets/OrderPackets.hpp) -set(GENERATED_STATE_MACHINE ${CMAKE_SOURCE_DIR}/Core/Inc/state_machine.hpp) add_custom_command( OUTPUT ${GENERATED_DATA_PACKETS} @@ -79,18 +78,14 @@ add_custom_command( ${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Packet_generation/Packet_generation.py ${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp ${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp - ${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/State_machine_generation/State_machine_generation.py - ${CMAKE_SOURCE_DIR}/Core/Inc/Code_generation/State_machine_generation/State_machine_description.py - ${CMAKE_SOURCE_DIR}/state_machine.json ${GENERATOR_JSONS} - COMMENT "Generating packets and state machine" + COMMENT "Generating packets for ${Board}" ) add_custom_target(run_generator ALL DEPENDS ${GENERATED_DATA_PACKETS} ${GENERATED_ORDER_PACKETS} - ${GENERATED_STATE_MACHINE} ) file(GLOB_RECURSE METADATA_SOURCES diff --git a/Core/Inc/Code_generation/Generator.py b/Core/Inc/Code_generation/Generator.py index 2180d1a3..b308426c 100644 --- a/Core/Inc/Code_generation/Generator.py +++ b/Core/Inc/Code_generation/Generator.py @@ -1,6 +1,5 @@ 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...") @@ -22,12 +21,6 @@ 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) - generate_code(sm) - diff --git a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp index 33e3fbc8..8c072130 100644 --- a/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/DataTemplate.hpp @@ -1,7 +1,8 @@ #pragma once #include "ST-LIB.hpp" -//Data packets for {{board}} -AUTOGENERATED CODE, DO NOT MODIFY- +/*Data packets for {{board}} +-AUTOGENERATED CODE, DO NOT MODIFY-*/ class DataPackets{ public: {% for enum in enums -%} @@ -16,14 +17,14 @@ class 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 %}); + {{packet.name}}_packet = new HeapPacket(static_cast({{packet.id}}){% if packet.variables %}, {% for variable in packet.variables %}&{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}); } {% endfor -%} public: {%for packet in packets -%} - inline static HeapPacket *{{packet.name}}{nullptr}; + inline static HeapPacket *{{packet.name}}_packet{nullptr}; {% endfor %} {% for socket in sockets -%} inline static {{socket.type}} *{{socket.name}}{nullptr}; @@ -32,7 +33,7 @@ class DataPackets{ static void start() { {% for packet in packets -%} - if ({{packet.name}} == nullptr) { + if ({{packet.name}}_packet == nullptr) { ErrorHandler("Packet {{packet.name}} not initialized"); } {% endfor %} @@ -50,10 +51,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 -%} - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}); + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{packet.name}}_packet); {% else %} {% for name in packet.name -%} - DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}); + DataPackets::{{packet.socket}}->send_packet(*DataPackets::{{name}}_packet); {% endfor -%} {%- endif %} }); {%- endfor %} diff --git a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp index b947baa2..3ee83683 100644 --- a/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp +++ b/Core/Inc/Code_generation/Packet_generation/OrderTemplate.hpp @@ -23,13 +23,13 @@ class OrderPackets{ OrderPackets() = default; {% for packet in packets -%} - inline static HeapOrder *{{packet.name}}{nullptr}; + inline static HeapOrder *{{packet.name}}_order{nullptr}; {% endfor %} {% for packet in packets -%} static void {{packet.name}}_init({% for variable in packet.variables %}{{variable.type}} &{{variable.name}}{% if not loop.last %}, {% endif %}{% endfor %}) { - {{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 %}); + {{packet.name}}_order = 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 %} diff --git a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py index 8001e45f..5e9b2cb0 100644 --- a/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py +++ b/Core/Inc/Code_generation/Packet_generation/Packet_descriptions.py @@ -7,9 +7,12 @@ def __init__(self,name:str,board:dict,JSONpath:str): 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) + try: + with open(JSONpath+"/boards/"+name+"/sockets.json") as s: + socks = json.load(s) + self.sockets=self.SocketsDescription(socks,self.ip) + except Exception as e: + raise Exception(f"Error in file {JSONpath}/boards/{name}/sockets.json: {e}") #Packets: self.sending_packets = [] self.data_size =0 @@ -17,17 +20,23 @@ def __init__(self,name:str,board:dict,JSONpath:str): 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) + try: + with open(JSONpath+"/boards/" + name + "/" + measurement) as f: + m = json.load(f) + self.measurement_lists.append(m) + except Exception as e: + raise Exception(f"Error in file {JSONpath}/boards/{name}/{measurement}: {e}") for packets in board["packets"]: packets_name = re.split(r'_|\.', packets)[0] self.packets[packets_name] = [] - with open(JSONpath+"/boards/" + name+"/" + packets) as f: - p= json.load(f) + try: + with open(JSONpath+"/boards/" + name+"/" + packets) as f: + p= json.load(f) + except Exception as e: + raise Exception(f"Error in file {JSONpath}/boards/{name}/{packets}: {e}") i=0 for packet in p: - self.packets[packets_name].append(PacketDescription(packet,self.measurement_lists)) + self.packets[packets_name].append(PacketDescription(packet,self.measurement_lists, packets)) aux_sending= PacketDescription.check_for_sending(packet) if aux_sending is not None: self.sending_packets.append(aux_sending) @@ -88,7 +97,7 @@ def __init__(self,sockets:list,board_ip:str): class PacketDescription: - def __init__(self, packet:dict,measurements:list): + def __init__(self, packet:dict,measurements:list, filename:str="Unknown"): self.id =packet["id"] self.name = packet["name"].replace(" ", "_").replace("-", "_") self.type = packet["type"] @@ -98,7 +107,7 @@ def __init__(self, packet:dict,measurements:list): return for variable in packet["variables"]: self.variables.append(variable) - self.measurements.append(MeasurmentsDescription(measurements,variable)) + self.measurements.append(MeasurmentsDescription(measurements,variable, filename)) @staticmethod def check_for_sending(packet:dict): @@ -112,15 +121,15 @@ def check_for_sending(packet:dict): else: return None class MeasurmentsDescription: - def __init__(self,measurements:list, variable:str): + def __init__(self,measurements:list, variable:str, filename:str="Unknown"): 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") + print(f"Measurement not found for variable: {variable} in file: {filename}\n") + raise Exception(f"Measurement not found for variable: {variable} in file: {filename}") self.name = measurement["name"] self.type = (self._unsigned_int_correction(measurement["type"]).replace(" ", "_").replace("-", "_")) @@ -157,6 +166,4 @@ 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/Inc/Code_generation/Packet_generation/ProtectionsTemplate.hpp b/Core/Inc/Code_generation/Packet_generation/ProtectionsTemplate.hpp deleted file mode 100644 index a9b34507..00000000 --- a/Core/Inc/Code_generation/Packet_generation/ProtectionsTemplate.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "ST-LIB.hpp" - -//Data protections for {{ board }} -AUTOGENERATED CODE, DO NOT MODIFY- -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 diff --git a/Core/Inc/Code_generation/State_machine_generation/State_machine_description.py b/Core/Inc/Code_generation/State_machine_generation/State_machine_description.py deleted file mode 100644 index 2d837ae6..00000000 --- a/Core/Inc/Code_generation/State_machine_generation/State_machine_description.py +++ /dev/null @@ -1,197 +0,0 @@ -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/Code_generation/State_machine_generation/State_machine_generation.py b/Core/Inc/Code_generation/State_machine_generation/State_machine_generation.py deleted file mode 100644 index 41a53eda..00000000 --- a/Core/Inc/Code_generation/State_machine_generation/State_machine_generation.py +++ /dev/null @@ -1,104 +0,0 @@ -from State_machine_generation.State_machine_description import * -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)) - 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 6789b95b..bfc6db01 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 - "20260202T130943" // DateTime using ISO-8601 format + "20260206T223828" // DateTime using ISO-8601 format " " // alignment - "20be5ece" // STLIB commit + "dcf817b3" // STLIB commit "--------" // ADJ commit - "c7c9b795" // Board commit + "4b3d0ec4" // Board commit // the '=' is used for unparsing ; } \ No newline at end of file diff --git a/deps/ST-LIB b/deps/ST-LIB index 77224aa7..dcf817b3 160000 --- a/deps/ST-LIB +++ b/deps/ST-LIB @@ -1 +1 @@ -Subproject commit 77224aa709b0b77e54f5a2cf2ce55bc6f0deb9af +Subproject commit dcf817b37a8fb5ebf89f42d1a361f2b05f2776dc