Updated without Vector
This commit is contained in:
Binary file not shown.
@@ -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",
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user