From 1742ee770463f765b7ad1d9a0e3f9a3160e23c57 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 15 Apr 2025 14:01:07 +0200 Subject: [PATCH] Init Commit with Port Select and Simple Read --- .editorconfig | 4 ++ .gitattributes | 2 + .gitignore | 3 ++ icon.svg | 1 + icon.svg.import | 37 ++++++++++++++++++ project.godot | 25 ++++++++++++ serial_websocket_handler.gd | 60 +++++++++++++++++++++++++++++ serial_websocket_handler.gd.uid | 1 + uart_port_select.gd | 67 +++++++++++++++++++++++++++++++++ uart_port_select.gd.uid | 1 + uart_port_select.tscn | 49 ++++++++++++++++++++++++ 11 files changed, 250 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 serial_websocket_handler.gd create mode 100644 serial_websocket_handler.gd.uid create mode 100644 uart_port_select.gd create mode 100644 uart_port_select.gd.uid create mode 100644 uart_port_select.tscn diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..4159223 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnmeqfk4ycwvk" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..cae906e --- /dev/null +++ b/project.godot @@ -0,0 +1,25 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="AloxGUI" +run/main_scene="uid://bhon0xwhhv2ah" +config/features=PackedStringArray("4.4", "GL Compatibility") +config/icon="res://icon.svg" + +[autoload] + +SerialWebsocketHandler="*res://serial_websocket_handler.gd" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/serial_websocket_handler.gd b/serial_websocket_handler.gd new file mode 100644 index 0000000..da35057 --- /dev/null +++ b/serial_websocket_handler.gd @@ -0,0 +1,60 @@ +extends Node + +@export var websocket_url = "ws://localhost:8080/ws" +var socket = WebSocketPeer.new() +var messageBuffer = [] + +func _ready() -> void: + set_process(false) + pass + +func _process(_delta: float) -> void: + socket.poll() + if socket.get_ready_state() != socket.STATE_OPEN: + print("Socket closed?") + set_process(false) + return + + while socket.get_available_packet_count(): + messageBuffer.append(socket.get_packet().get_string_from_utf8()) + +func message_pending() -> bool: + return !messageBuffer.is_empty() + +func get_message() -> String: + if messageBuffer.is_empty(): + return "" + var mess = messageBuffer.pop_front() + return String(mess) + +func connectSocket() -> void: + socket.poll() + if socket.get_ready_state() == socket.STATE_OPEN: + print("socket already connected") + return + + var err = socket.connect_to_url(websocket_url) + if err != OK: + print("Unable to Connect") + set_process(false) + else: + while (socket.get_ready_state() != socket.STATE_OPEN): + socket.poll() + set_process(true) + +func writeSocket(text: String) -> void: + if socket.get_ready_state() != socket.STATE_OPEN: + print("Socket closed?") + set_process(false) + return + + var err = socket.send_text(text) + if err != OK: + print("Error sending message: ", err) + set_process(false) + +func disconnectSocket() -> void: + socket.close() + +func _exit_tree() -> void: + disconnectSocket() diff --git a/serial_websocket_handler.gd.uid b/serial_websocket_handler.gd.uid new file mode 100644 index 0000000..7bc65f8 --- /dev/null +++ b/serial_websocket_handler.gd.uid @@ -0,0 +1 @@ +uid://s67y2k8yg7xv diff --git a/uart_port_select.gd b/uart_port_select.gd new file mode 100644 index 0000000..c27b49d --- /dev/null +++ b/uart_port_select.gd @@ -0,0 +1,67 @@ +extends Control + +func _ready() -> void: + SerialWebsocketHandler.connectSocket() + set_process(false) + pass + +func _process(delta: float) -> void: + while not SerialWebsocketHandler.message_pending(): + await get_tree().process_frame + + var mess = SerialWebsocketHandler.get_message() + print(mess) + +func _on_button_pressed() -> void: + var commandMes = BuildMessage("listports", PackedStringArray()) + SerialWebsocketHandler.writeSocket(commandMes) + # Warte asynchron auf eine Nachricht + while not SerialWebsocketHandler.message_pending(): + await get_tree().process_frame + + var mess = SerialWebsocketHandler.get_message() + var parts = mess.split(";") + + print(mess) + + if parts.size() < 3: + print("Ungültige Nachricht erhalten:", mess) + return + + var count = int(parts[2]) + + if parts.size() < 3 + count: + print("Unvollständige Nachricht erhalten:", mess) + return + + $PortList.clear() + for n in range(count): + $PortList.add_item(parts[3 + n]) + +func _on_connect_button_pressed() -> void: + var portID = $PortList.get_selected_id() + if portID == -1: + return + var message = BuildMessage("connect", PackedStringArray([$PortList.get_item_text(portID)])) + SerialWebsocketHandler.writeSocket(message) + while not SerialWebsocketHandler.message_pending(): + await get_tree().process_frame + print(SerialWebsocketHandler.get_message()) + +func BuildMessage(command: String, parameters: PackedStringArray) -> String: + # Erstelle den Basis-String mit den ersten drei Werten + var base = ";".join([str(1), command, str(parameters.size())]) + # Füge die Parameter hinzu, falls vorhanden + if parameters.size() > 0: + base += ";" + ";".join(parameters) + # Füge ein abschließendes Semikolon hinzu + base += ";" + return base + +func _on_async_read_button_pressed() -> void: + var message = BuildMessage("startasyncread", PackedStringArray()) + SerialWebsocketHandler.writeSocket(message) + while not SerialWebsocketHandler.message_pending(): + await get_tree().process_frame + print(SerialWebsocketHandler.get_message()) + set_process(true) diff --git a/uart_port_select.gd.uid b/uart_port_select.gd.uid new file mode 100644 index 0000000..1409a48 --- /dev/null +++ b/uart_port_select.gd.uid @@ -0,0 +1 @@ +uid://78d3t3vslfvo diff --git a/uart_port_select.tscn b/uart_port_select.tscn new file mode 100644 index 0000000..fb4e664 --- /dev/null +++ b/uart_port_select.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=2 format=3 uid="uid://bhon0xwhhv2ah"] + +[ext_resource type="Script" uid="uid://78d3t3vslfvo" path="res://uart_port_select.gd" id="1_ep1rc"] + +[node name="UartPortSelect" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ep1rc") + +[node name="RefreshButton" type="Button" parent="."] +layout_mode = 0 +offset_right = 8.0 +offset_bottom = 8.0 +text = "Refresh Ports" + +[node name="PortList" type="OptionButton" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 0.135 +anchor_bottom = 0.031 +offset_left = 116.0 +offset_top = 1.0 +offset_right = 91.48 +offset_bottom = 10.912 + +[node name="ConnectButton" type="Button" parent="."] +layout_mode = 0 +offset_left = 251.0 +offset_top = 1.0 +offset_right = 323.0 +offset_bottom = 32.0 +text = "Connect" + +[node name="AsyncReadButton" type="Button" parent="."] +layout_mode = 0 +offset_left = 3.0 +offset_top = 57.0 +offset_right = 115.0 +offset_bottom = 88.0 +text = "Start Reading +" + +[connection signal="pressed" from="RefreshButton" to="." method="_on_button_pressed"] +[connection signal="pressed" from="ConnectButton" to="." method="_on_connect_button_pressed"] +[connection signal="pressed" from="AsyncReadButton" to="." method="_on_async_read_button_pressed"]