Updated without Vector

This commit is contained in:
Martino Ferrari
2026-05-20 11:30:05 +02:00
parent d967098ead
commit f6eb0a7056
24 changed files with 1457 additions and 1666 deletions
Binary file not shown.
+6
View File
@@ -297,6 +297,12 @@ func (m *MarteClient) handleTextLine(line string) {
fmt.Sscanf(p[8:], "%d", &newLog)
}
}
// Always forward as a response so the browser can display it.
broadcast(m.hub, map[string]any{
"type": "response",
"tag": "SERVICE_INFO",
"data": line[len("OK SERVICE_INFO "):],
})
if newUDP > 0 || newLog > 0 {
broadcast(m.hub, map[string]any{
"type": "service_config",
+36 -10
View File
@@ -116,12 +116,13 @@ function onResponse(msg) {
try {
const data = msg.data ? JSON.parse(msg.data) : null;
switch (msg.tag) {
case 'DISCOVER': if (data) processDiscovery(data.Signals || []); break;
case 'TREE': if (data) processTree(data); break;
case 'INFO': showInfo(msg.tag, msg.data); break;
case 'CONFIG': showInfo('CONFIG', msg.data); break;
case 'STEP_STATUS': processStepStatus(data); break;
case 'VALUE': processValue(data); break;
case 'DISCOVER': if (data) processDiscovery(data.Signals || []); break;
case 'TREE': if (data) processTree(data); break;
case 'INFO': showInfo(msg.tag, msg.data); break;
case 'CONFIG': showInfo('CONFIG', msg.data); break;
case 'SERVICE_INFO': showInfo('Service Info', msg.data); break;
case 'STEP_STATUS': processStepStatus(data); break;
case 'VALUE': processValue(data); break;
}
} catch(e) {
// non-JSON responses (TRACE, FORCE, etc.) — silently ignore
@@ -144,7 +145,12 @@ function onLog(msg) {
}
function onServiceConfig(msg) {
appendLog('sys','INFO',`ServiceConfig: UDP=${msg.udp_port} LOG=${msg.log_port}`);
const auto = document.getElementById('auto-ports')?.checked ?? true;
if (auto) {
if (msg.udp_port) document.getElementById('udp-port').value = msg.udp_port;
if (msg.log_port) document.getElementById('log-port').value = msg.log_port;
}
appendLog('sys','INFO',`ServiceConfig: UDP=${msg.udp_port} LOG=${msg.log_port}${auto ? '' : ' (ignored — manual ports)'}`);
}
function onUdpStats(msg) {
@@ -684,13 +690,33 @@ function showInfo(title, data) {
// Connect / Disconnect
// ════════════════════════════════════════════════════════════════════
function requireConnected() {
if (!marteConnected) {
appendLog('sys', 'WARNING', 'Not connected to MARTe2');
return false;
}
return true;
}
function discoverCmd() { if (requireConnected()) { sendCmd('DISCOVER'); closeAllMenus(); } }
function treeCmd() { if (requireConnected()) { sendCmd('TREE'); closeAllMenus(); } }
function serviceInfoCmd() { if (requireConnected()) { sendCmd('SERVICE_INFO'); closeAllMenus(); } }
function toggleAutoPorts(auto) {
const row = document.getElementById('port-manual-row');
if (row) row.style.display = auto ? 'none' : 'flex';
}
function toggleConnect() {
if (marteConnected) {
sendWS({type:'disconnect'});
} else {
const host = document.getElementById('host').value.trim() || '127.0.0.1';
const port = parseInt(document.getElementById('port').value) || 8080;
sendWS({type:'connect', data:{host, port, udp_port:port+1, log_port:port+2}});
const host = document.getElementById('host').value.trim() || '127.0.0.1';
const port = parseInt(document.getElementById('port').value) || 8080;
const auto = document.getElementById('auto-ports').checked;
const udpPort = auto ? port + 1 : (parseInt(document.getElementById('udp-port').value) || port + 1);
const logPort = auto ? port + 2 : (parseInt(document.getElementById('log-port').value) || port + 2);
sendWS({type:'connect', data:{host, port, udp_port:udpPort, log_port:logPort}});
}
closeAllMenus();
}
+17 -5
View File
@@ -176,15 +176,27 @@ select{background:#313244;border:1px solid #45475a;color:#cdd6f4;padding:2px 4px
</button>
<div class="dropdown" id="conn-dropdown">
<div class="menu-row">
<input type="text" id="host" value="127.0.0.1" placeholder="host">
<input type="number" id="port" value="8080" placeholder="port">
<input type="text" id="host" value="127.0.0.1" placeholder="host" style="flex:2">
<input type="number" id="port" value="8080" placeholder="ctrl" style="width:60px">
<button id="btn-connect" onclick="toggleConnect()">Connect</button>
</div>
<div class="menu-row" id="port-manual-row" style="display:none">
<label style="color:#a6adc8;font-size:11px;flex-shrink:0">UDP:</label>
<input type="number" id="udp-port" value="8081" placeholder="udp" style="width:72px">
<label style="color:#a6adc8;font-size:11px;flex-shrink:0">Log:</label>
<input type="number" id="log-port" value="8082" placeholder="log" style="width:72px">
</div>
<div class="menu-row">
<label class="form-check" style="margin:0;font-size:11px">
<input type="checkbox" id="auto-ports" checked onchange="toggleAutoPorts(this.checked)">
<span style="color:#a6adc8">Auto ports (SERVICE_INFO)</span>
</label>
</div>
<hr class="menu-sep">
<div class="menu-btn-row">
<button onclick="sendCmd('DISCOVER');closeAllMenus()">Discover</button>
<button onclick="sendCmd('TREE');closeAllMenus()">Tree</button>
<button onclick="sendCmd('SERVICE_INFO');closeAllMenus()">Info</button>
<button onclick="discoverCmd()">Discover</button>
<button onclick="treeCmd()">Tree</button>
<button onclick="serviceInfoCmd()">Info</button>
</div>
</div>
</div>
+30 -23
View File
@@ -91,6 +91,7 @@ struct ConnectionConfig {
tcp_port: String,
udp_port: String,
log_port: String,
auto_ports: bool, // when true, SERVICE_INFO may override udp_port / log_port
version: u64,
}
@@ -314,6 +315,7 @@ impl MarteDebugApp {
tcp_port: "8080".to_string(),
udp_port: "8081".to_string(),
log_port: "8082".to_string(),
auto_ports: true,
version: 0,
};
let shared_config = Arc::new(Mutex::new(config.clone()));
@@ -1102,7 +1104,7 @@ fn udp_worker(
thread::sleep(std::time::Duration::from_secs(1));
continue;
};
let mut buf = [0u8; 4096];
let mut buf = [0u8; 65535];
let mut total_packets = 0u64;
loop {
if shared_config.lock().unwrap().version != current_version {
@@ -1360,23 +1362,25 @@ impl eframe::App for MarteDebugApp {
let _ = self.tx_cmd.send("DISCOVER".to_string());
}
InternalEvent::ServiceConfig { udp_port, log_port } => {
let mut changed = false;
if !udp_port.is_empty() && self.config.udp_port != udp_port {
self.config.udp_port = udp_port;
changed = true;
}
if !log_port.is_empty() && self.config.log_port != log_port {
self.config.log_port = log_port;
changed = true;
}
if changed {
self.config.version += 1;
*self.shared_config.lock().unwrap() = self.config.clone();
self.logs.push_back(LogEntry {
time: Local::now().format("%H:%M:%S").to_string(),
level: "GUI_INFO".to_string(),
message: format!("Config updated from server: UDP={}, LOG={}", self.config.udp_port, self.config.log_port),
});
if self.config.auto_ports {
let mut changed = false;
if !udp_port.is_empty() && self.config.udp_port != udp_port {
self.config.udp_port = udp_port;
changed = true;
}
if !log_port.is_empty() && self.config.log_port != log_port {
self.config.log_port = log_port;
changed = true;
}
if changed {
self.config.version += 1;
*self.shared_config.lock().unwrap() = self.config.clone();
self.logs.push_back(LogEntry {
time: Local::now().format("%H:%M:%S").to_string(),
level: "GUI_INFO".to_string(),
message: format!("Ports auto-configured: UDP={}, LOG={}", self.config.udp_port, self.config.log_port),
});
}
}
}
InternalEvent::Disconnected => {
@@ -1942,14 +1946,17 @@ impl eframe::App for MarteDebugApp {
ui.label("IP:");
ui.text_edit_singleline(&mut self.config.ip);
ui.end_row();
ui.label("Control:");
ui.label("Control TCP:");
ui.text_edit_singleline(&mut self.config.tcp_port);
ui.end_row();
ui.label("Telemetry (Auto):");
ui.label(&self.config.udp_port);
ui.label("Telemetry UDP:");
ui.add_enabled(!self.config.auto_ports, egui::TextEdit::singleline(&mut self.config.udp_port));
ui.end_row();
ui.label("Logs (Auto):");
ui.label(&self.config.log_port);
ui.label("Log TCP:");
ui.add_enabled(!self.config.auto_ports, egui::TextEdit::singleline(&mut self.config.log_port));
ui.end_row();
ui.label("Auto ports:");
ui.checkbox(&mut self.config.auto_ports, "from SERVICE_INFO");
ui.end_row();
});
if ui.button("🔄 Apply").clicked() {