minor improvement: filtering service logs
This commit is contained in:
Binary file not shown.
@@ -1189,6 +1189,7 @@ function flushLogs() {
|
|||||||
function renderLogs() {
|
function renderLogs() {
|
||||||
logDirty = false;
|
logDirty = false;
|
||||||
const body = document.getElementById('log-body');
|
const body = document.getElementById('log-body');
|
||||||
|
const showService = document.getElementById('lf-service').checked;
|
||||||
const showDebug = document.getElementById('lf-debug').checked;
|
const showDebug = document.getElementById('lf-debug').checked;
|
||||||
const showInfo = document.getElementById('lf-info').checked;
|
const showInfo = document.getElementById('lf-info').checked;
|
||||||
const showWarn = document.getElementById('lf-warn').checked;
|
const showWarn = document.getElementById('lf-warn').checked;
|
||||||
@@ -1197,6 +1198,7 @@ function renderLogs() {
|
|||||||
|
|
||||||
const visible = logs.filter(l => {
|
const visible = logs.filter(l => {
|
||||||
const lv = l.level;
|
const lv = l.level;
|
||||||
|
if ((lv==='CMD' || lv==='RESP') && !showService) return false;
|
||||||
if (lv==='DEBUG' && !showDebug) return false;
|
if (lv==='DEBUG' && !showDebug) return false;
|
||||||
if ((lv==='INFO'||lv==='Information') && !showInfo) return false;
|
if ((lv==='INFO'||lv==='Information') && !showInfo) return false;
|
||||||
if ((lv==='WARNING'||lv==='Warning') && !showWarn) return false;
|
if ((lv==='WARNING'||lv==='Warning') && !showWarn) return false;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>MARTe2 Debug Client</title>
|
<title>MARTe2 Debug Client</title>
|
||||||
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
||||||
<link rel="stylesheet" href="uplot.min.css">
|
<link rel="stylesheet" href="uplot.min.css">
|
||||||
<style>
|
<style>
|
||||||
*{box-sizing:border-box;margin:0;padding:0}
|
*{box-sizing:border-box;margin:0;padding:0}
|
||||||
html,body{height:100%;overflow:hidden;font-family:'Segoe UI',system-ui,sans-serif;font-size:12px;background:#1e1e2e;color:#cdd6f4}
|
html,body{height:100%;overflow:hidden;font-family:'Segoe UI',system-ui,sans-serif;font-size:12px;background:#1e1e2e;color:#cdd6f4}
|
||||||
|
|
||||||
/* ── layout ── */
|
/* ── layout ── */
|
||||||
@@ -163,250 +163,244 @@ details>.children{padding-left:14px}
|
|||||||
.msg-item{padding:3px 6px;border-bottom:1px solid #181825;font-size:11px}
|
.msg-item{padding:3px 6px;border-bottom:1px solid #181825;font-size:11px}
|
||||||
.msg-status{width:14px;text-align:center;flex-shrink:0}
|
.msg-status{width:14px;text-align:center;flex-shrink:0}
|
||||||
select{background:#313244;border:1px solid #45475a;color:#cdd6f4;padding:2px 4px;border-radius:4px}
|
select{background:#313244;border:1px solid #45475a;color:#cdd6f4;padding:2px 4px;border-radius:4px}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
|
<!-- ═══ TOOLBAR ═══ -->
|
||||||
<!-- ═══ TOOLBAR ═══ -->
|
<div id="toolbar">
|
||||||
<div id="toolbar">
|
<!-- Connection menu -->
|
||||||
|
<div class="menu-wrap tb-group">
|
||||||
<!-- Connection menu -->
|
<button id="conn-menu-btn" onclick="toggleMenu('conn-dropdown')">
|
||||||
<div class="menu-wrap tb-group">
|
<span id="conn-status"></span>
|
||||||
<button id="conn-menu-btn" onclick="toggleMenu('conn-dropdown')">
|
Connection ▾
|
||||||
<span id="conn-status"></span> Connection ▾
|
</button>
|
||||||
</button>
|
<div class="dropdown" id="conn-dropdown">
|
||||||
<div class="dropdown" id="conn-dropdown">
|
<div class="menu-row">
|
||||||
<div class="menu-row">
|
<input type="text" id="host" value="127.0.0.1" placeholder="host" style="flex:2">
|
||||||
<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">
|
||||||
<input type="number" id="port" value="8080" placeholder="ctrl" style="width:60px">
|
<button id="btn-connect" onclick="toggleConnect()">Connect</button>
|
||||||
<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="discoverCmd()">Discover</button>
|
||||||
|
<button onclick="treeCmd()">Tree</button>
|
||||||
|
<button onclick="serviceInfoCmd()">Info</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tb-group">
|
||||||
|
<button id="btn-pause" onclick="togglePause()">⏸ Pause</button>
|
||||||
|
<button onclick="openStepDialog()">⚙ Step</button>
|
||||||
|
</div>
|
||||||
|
<div class="tb-group">
|
||||||
|
<button onclick="addPlot()">+ Plot</button>
|
||||||
|
</div>
|
||||||
|
<div class="tb-group">
|
||||||
|
<button onclick="openForceDialog()">⚡ Force</button>
|
||||||
|
<button onclick="openBreakDialog()">🔴 Break</button>
|
||||||
|
<button onclick="openMsgDialog()">✉ Msg</button>
|
||||||
|
</div>
|
||||||
|
<div class="tb-group" style="border:none;margin-left:auto">
|
||||||
|
<span id="udp-stats" style="color:#585b70;font-size:11px">0 pkts</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu-row" id="port-manual-row" style="display:none">
|
<!-- ═══ STEP STATUS BAR ═══ -->
|
||||||
<label style="color:#a6adc8;font-size:11px;flex-shrink:0">UDP:</label>
|
<div id="step-bar">
|
||||||
<input type="number" id="udp-port" value="8081" placeholder="udp" style="width:72px">
|
<span>⏹ PAUSED at
|
||||||
<label style="color:#a6adc8;font-size:11px;flex-shrink:0">Log:</label>
|
<b id="paused-gam">—</b></span>
|
||||||
<input type="number" id="log-port" value="8082" placeholder="log" style="width:72px">
|
<span id="step-remaining"></span>
|
||||||
|
<select id="step-thread" style="width:120px"></select>
|
||||||
|
<button onclick="step(1)">Step 1</button>
|
||||||
|
<button onclick="step(5)">Step 5</button>
|
||||||
|
<button onclick="step(20)">Step 20</button>
|
||||||
|
<button class="ok" onclick="togglePause()">▶ Resume</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu-row">
|
<!-- ═══ MAIN ═══ -->
|
||||||
<label class="form-check" style="margin:0;font-size:11px">
|
<div id="main">
|
||||||
<input type="checkbox" id="auto-ports" checked onchange="toggleAutoPorts(this.checked)">
|
<!-- LEFT: object tree -->
|
||||||
<span style="color:#a6adc8">Auto ports (SERVICE_INFO)</span>
|
<div id="left-panel">
|
||||||
</label>
|
<div class="panel-header">
|
||||||
|
<span>Object Tree</span>
|
||||||
|
<button style="font-size:10px;padding:1px 6px" onclick="sendCmd('TREE')">↻</button>
|
||||||
|
</div>
|
||||||
|
<div class="panel-search"><input id="tree-search" oninput="filterTree(this.value)" placeholder="Search…"></div>
|
||||||
|
<div class="panel-body" id="tree-body">
|
||||||
|
<div class="empty-hint">Connect to MARTe2 then click Tree</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Left resize/collapse strip -->
|
||||||
|
<div id="left-strip" class="panel-strip" title="Drag to resize · Click to collapse"></div>
|
||||||
|
<!-- CENTER: plots -->
|
||||||
|
<div id="center-panel">
|
||||||
|
<div class="empty-hint" id="no-plots-hint">Add a plot panel to begin — drag signals from the tree or traced list</div>
|
||||||
|
</div>
|
||||||
|
<!-- Right resize/collapse strip -->
|
||||||
|
<div id="right-strip" class="panel-strip" title="Drag to resize · Click to collapse"></div>
|
||||||
|
<!-- RIGHT: tabs -->
|
||||||
|
<div id="right-panel">
|
||||||
|
<div class="tabs">
|
||||||
|
<div class="tab active" onclick="switchTab('traced')">Traced</div>
|
||||||
|
<div class="tab" onclick="switchTab('forced')">Forced</div>
|
||||||
|
<div class="tab" onclick="switchTab('breaks')">Breaks</div>
|
||||||
|
<div class="tab" onclick="switchTab('msgs')">Msgs</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content active" id="tab-traced">
|
||||||
|
<div class="empty-hint" id="no-traced-hint">No signals traced</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content" id="tab-forced">
|
||||||
|
<div class="empty-hint" id="no-forced-hint">No signals forced</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content" id="tab-breaks">
|
||||||
|
<div class="empty-hint" id="no-breaks-hint">No breakpoints set</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-content" id="tab-msgs">
|
||||||
|
<div class="empty-hint" id="no-msgs-hint">No messages sent</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="menu-sep">
|
<!-- ═══ LOGS ═══ -->
|
||||||
<div class="menu-btn-row">
|
<div id="log-panel">
|
||||||
<button onclick="discoverCmd()">Discover</button>
|
<div id="log-toolbar">
|
||||||
<button onclick="treeCmd()">Tree</button>
|
<button class="panel-toggle" title="Collapse logs" onclick="togglePanel('log-panel','▼','▲',this)" id="log-toggle-btn">▼</button>
|
||||||
<button onclick="serviceInfoCmd()">Info</button>
|
<span style="font-weight:600;color:#89b4fa">Logs</span>
|
||||||
|
<label><input type="checkbox" id="lf-service" checked onchange="renderLogs()">
|
||||||
|
Service</label>
|
||||||
|
<label><input type="checkbox" id="lf-debug" checked onchange="renderLogs()">
|
||||||
|
Debug</label>
|
||||||
|
<label><input type="checkbox" id="lf-info" checked onchange="renderLogs()">
|
||||||
|
Info</label>
|
||||||
|
<label><input type="checkbox" id="lf-warn" checked onchange="renderLogs()">
|
||||||
|
Warn</label>
|
||||||
|
<label><input type="checkbox" id="lf-error" checked onchange="renderLogs()">
|
||||||
|
Error</label>
|
||||||
|
<input type="text" id="log-filter" placeholder="Filter…" oninput="renderLogs()" style="width:150px">
|
||||||
|
<button onclick="logs=[];renderLogs()" style="margin-left:auto">Clear</button>
|
||||||
|
<label><input type="checkbox" id="log-autoscroll" checked>
|
||||||
|
Auto-scroll</label>
|
||||||
|
</div>
|
||||||
|
<div id="log-body"></div>
|
||||||
|
</div>
|
||||||
|
</div><!-- #app -->
|
||||||
|
<!-- ═══ DIALOGS ═══ -->
|
||||||
|
<!-- Force dialog -->
|
||||||
|
<div class="dialog-overlay" id="dlg-force" style="display:none" onclick="if(event.target===this)closeDlg('dlg-force')">
|
||||||
|
<div class="dialog">
|
||||||
|
<h3>⚡ Force Signal</h3>
|
||||||
|
<label>Signal</label>
|
||||||
|
<input id="force-sig" list="force-sig-list" placeholder="Signal path…">
|
||||||
|
<datalist id="force-sig-list"></datalist>
|
||||||
|
<label>Value</label>
|
||||||
|
<input id="force-val" placeholder="e.g. 42">
|
||||||
|
<div class="btns">
|
||||||
|
<button onclick="closeDlg('dlg-force')">Cancel</button>
|
||||||
|
<button class="active" onclick="doForce()">Force</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<!-- Unforce confirm -->
|
||||||
|
<div class="dialog-overlay" id="dlg-unforce" style="display:none" onclick="if(event.target===this)closeDlg('dlg-unforce')">
|
||||||
<div class="tb-group">
|
<div class="dialog">
|
||||||
<button id="btn-pause" onclick="togglePause()">⏸ Pause</button>
|
<h3>Remove Force</h3>
|
||||||
<button onclick="openStepDialog()">⚙ Step</button>
|
<p id="unforce-msg" style="margin-bottom:12px;color:#cdd6f4"></p>
|
||||||
</div>
|
<div class="btns">
|
||||||
<div class="tb-group">
|
<button onclick="closeDlg('dlg-unforce')">Cancel</button>
|
||||||
<button onclick="addPlot()">+ Plot</button>
|
<button class="danger" onclick="doUnforce()">Unforce</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="tb-group">
|
</div>
|
||||||
<button onclick="openForceDialog()">⚡ Force</button>
|
|
||||||
<button onclick="openBreakDialog()">🔴 Break</button>
|
|
||||||
<button onclick="openMsgDialog()">✉ Msg</button>
|
|
||||||
</div>
|
|
||||||
<div class="tb-group" style="border:none;margin-left:auto">
|
|
||||||
<span id="udp-stats" style="color:#585b70;font-size:11px">0 pkts</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ═══ STEP STATUS BAR ═══ -->
|
|
||||||
<div id="step-bar">
|
|
||||||
<span>⏹ PAUSED at <b id="paused-gam">—</b></span>
|
|
||||||
<span id="step-remaining"></span>
|
|
||||||
<select id="step-thread" style="width:120px"></select>
|
|
||||||
<button onclick="step(1)">Step 1</button>
|
|
||||||
<button onclick="step(5)">Step 5</button>
|
|
||||||
<button onclick="step(20)">Step 20</button>
|
|
||||||
<button class="ok" onclick="togglePause()">▶ Resume</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ═══ MAIN ═══ -->
|
|
||||||
<div id="main">
|
|
||||||
|
|
||||||
<!-- LEFT: object tree -->
|
|
||||||
<div id="left-panel">
|
|
||||||
<div class="panel-header">
|
|
||||||
<span>Object Tree</span>
|
|
||||||
<button style="font-size:10px;padding:1px 6px" onclick="sendCmd('TREE')">↻</button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-search"><input id="tree-search" oninput="filterTree(this.value)" placeholder="Search…"></div>
|
<!-- Break dialog -->
|
||||||
<div class="panel-body" id="tree-body">
|
<div class="dialog-overlay" id="dlg-break" style="display:none" onclick="if(event.target===this)closeDlg('dlg-break')">
|
||||||
<div class="empty-hint">Connect to MARTe2 then click Tree</div>
|
<div class="dialog">
|
||||||
|
<h3>🔴 Set Breakpoint</h3>
|
||||||
|
<label>Signal</label>
|
||||||
|
<input id="break-sig" list="break-sig-list" placeholder="Signal path…">
|
||||||
|
<datalist id="break-sig-list"></datalist>
|
||||||
|
<div class="form-row">
|
||||||
|
<div>
|
||||||
|
<label>Operator</label>
|
||||||
|
<select id="break-op">
|
||||||
|
<option>></option><option>>=</option>
|
||||||
|
<option><</option><option><=</option>
|
||||||
|
<option>==</option><option>!=</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label>Threshold</label>
|
||||||
|
<input id="break-thresh" placeholder="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btns">
|
||||||
|
<button onclick="closeDlg('dlg-break')">Cancel</button>
|
||||||
|
<button class="active" onclick="doBreak()">Set Break</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<!-- Message dialog -->
|
||||||
|
<div class="dialog-overlay" id="dlg-msg" style="display:none" onclick="if(event.target===this)closeDlg('dlg-msg')">
|
||||||
<!-- Left resize/collapse strip -->
|
<div class="dialog">
|
||||||
<div id="left-strip" class="panel-strip" title="Drag to resize · Click to collapse"></div>
|
<h3>✉ Send Message</h3>
|
||||||
|
<label>Destination</label>
|
||||||
<!-- CENTER: plots -->
|
<input id="msg-dest" list="msg-dest-list" placeholder="e.g. App.Functions.GAM1">
|
||||||
<div id="center-panel">
|
<datalist id="msg-dest-list"></datalist>
|
||||||
<div class="empty-hint" id="no-plots-hint">Add a plot panel to begin — drag signals from the tree or traced list</div>
|
<label>Function</label>
|
||||||
</div>
|
<input id="msg-func" placeholder="FunctionName">
|
||||||
|
<label>Payload (key=value lines)</label>
|
||||||
<!-- Right resize/collapse strip -->
|
<textarea id="msg-payload" placeholder="Key = Value Key2 = Value2"></textarea>
|
||||||
<div id="right-strip" class="panel-strip" title="Drag to resize · Click to collapse"></div>
|
<div class="form-check">
|
||||||
|
<input type="checkbox" id="msg-wait">
|
||||||
<!-- RIGHT: tabs -->
|
<label for="msg-wait">Wait for reply</label>
|
||||||
<div id="right-panel">
|
</div>
|
||||||
<div class="tabs">
|
<div class="btns">
|
||||||
<div class="tab active" onclick="switchTab('traced')">Traced</div>
|
<button onclick="closeDlg('dlg-msg')">Cancel</button>
|
||||||
<div class="tab" onclick="switchTab('forced')">Forced</div>
|
<button class="active" onclick="doSendMsg()">Send</button>
|
||||||
<div class="tab" onclick="switchTab('breaks')">Breaks</div>
|
</div>
|
||||||
<div class="tab" onclick="switchTab('msgs')">Msgs</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-content active" id="tab-traced">
|
<!-- Info dialog -->
|
||||||
<div class="empty-hint" id="no-traced-hint">No signals traced</div>
|
<div class="dialog-overlay" id="dlg-info" style="display:none" onclick="if(event.target===this)closeDlg('dlg-info')">
|
||||||
|
<div class="dialog" style="max-width:600px;width:90vw">
|
||||||
|
<h3 id="info-title">Info</h3>
|
||||||
|
<pre id="info-body" style="background:#11111b;padding:8px;border-radius:4px;overflow:auto;max-height:400px;font-size:11px;color:#cdd6f4;white-space:pre-wrap"></pre>
|
||||||
|
<div class="btns" style="margin-top:12px">
|
||||||
|
<button onclick="closeDlg('dlg-info')">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-content" id="tab-forced">
|
<!-- Step dialog -->
|
||||||
<div class="empty-hint" id="no-forced-hint">No signals forced</div>
|
<div class="dialog-overlay" id="dlg-step" style="display:none" onclick="if(event.target===this)closeDlg('dlg-step')">
|
||||||
|
<div class="dialog">
|
||||||
|
<h3>⚙ Step Execution</h3>
|
||||||
|
<div class="form-row">
|
||||||
|
<div>
|
||||||
|
<label>Count</label>
|
||||||
|
<input type="number" id="step-count" value="1" min="1">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label>Thread (optional)</label>
|
||||||
|
<input id="step-thread-inp" list="step-thread-list" placeholder="all">
|
||||||
|
<datalist id="step-thread-list"></datalist>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btns">
|
||||||
|
<button onclick="closeDlg('dlg-step')">Cancel</button>
|
||||||
|
<button class="active" onclick="doStep()">Step</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-content" id="tab-breaks">
|
<script src="uplot.min.js"></script>
|
||||||
<div class="empty-hint" id="no-breaks-hint">No breakpoints set</div>
|
<script src="app.js"></script>
|
||||||
</div>
|
</body>
|
||||||
<div class="tab-content" id="tab-msgs">
|
</html>
|
||||||
<div class="empty-hint" id="no-msgs-hint">No messages sent</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ═══ LOGS ═══ -->
|
|
||||||
<div id="log-panel">
|
|
||||||
<div id="log-toolbar">
|
|
||||||
<button class="panel-toggle" title="Collapse logs" onclick="togglePanel('log-panel','▼','▲',this)" id="log-toggle-btn">▼</button>
|
|
||||||
<span style="font-weight:600;color:#89b4fa">Logs</span>
|
|
||||||
<label><input type="checkbox" id="lf-debug" checked onchange="renderLogs()"> Debug</label>
|
|
||||||
<label><input type="checkbox" id="lf-info" checked onchange="renderLogs()"> Info</label>
|
|
||||||
<label><input type="checkbox" id="lf-warn" checked onchange="renderLogs()"> Warn</label>
|
|
||||||
<label><input type="checkbox" id="lf-error" checked onchange="renderLogs()"> Error</label>
|
|
||||||
<input type="text" id="log-filter" placeholder="Filter…" oninput="renderLogs()" style="width:150px">
|
|
||||||
<button onclick="logs=[];renderLogs()" style="margin-left:auto">Clear</button>
|
|
||||||
<label><input type="checkbox" id="log-autoscroll" checked> Auto-scroll</label>
|
|
||||||
</div>
|
|
||||||
<div id="log-body"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div><!-- #app -->
|
|
||||||
|
|
||||||
<!-- ═══ DIALOGS ═══ -->
|
|
||||||
|
|
||||||
<!-- Force dialog -->
|
|
||||||
<div class="dialog-overlay" id="dlg-force" style="display:none" onclick="if(event.target===this)closeDlg('dlg-force')">
|
|
||||||
<div class="dialog">
|
|
||||||
<h3>⚡ Force Signal</h3>
|
|
||||||
<label>Signal</label>
|
|
||||||
<input id="force-sig" list="force-sig-list" placeholder="Signal path…">
|
|
||||||
<datalist id="force-sig-list"></datalist>
|
|
||||||
<label>Value</label>
|
|
||||||
<input id="force-val" placeholder="e.g. 42">
|
|
||||||
<div class="btns">
|
|
||||||
<button onclick="closeDlg('dlg-force')">Cancel</button>
|
|
||||||
<button class="active" onclick="doForce()">Force</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<!-- Unforce confirm -->
|
|
||||||
<div class="dialog-overlay" id="dlg-unforce" style="display:none" onclick="if(event.target===this)closeDlg('dlg-unforce')">
|
|
||||||
<div class="dialog">
|
|
||||||
<h3>Remove Force</h3>
|
|
||||||
<p id="unforce-msg" style="margin-bottom:12px;color:#cdd6f4"></p>
|
|
||||||
<div class="btns">
|
|
||||||
<button onclick="closeDlg('dlg-unforce')">Cancel</button>
|
|
||||||
<button class="danger" onclick="doUnforce()">Unforce</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<!-- Break dialog -->
|
|
||||||
<div class="dialog-overlay" id="dlg-break" style="display:none" onclick="if(event.target===this)closeDlg('dlg-break')">
|
|
||||||
<div class="dialog">
|
|
||||||
<h3>🔴 Set Breakpoint</h3>
|
|
||||||
<label>Signal</label>
|
|
||||||
<input id="break-sig" list="break-sig-list" placeholder="Signal path…">
|
|
||||||
<datalist id="break-sig-list"></datalist>
|
|
||||||
<div class="form-row">
|
|
||||||
<div>
|
|
||||||
<label>Operator</label>
|
|
||||||
<select id="break-op">
|
|
||||||
<option>></option><option>>=</option>
|
|
||||||
<option><</option><option><=</option>
|
|
||||||
<option>==</option><option>!=</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Threshold</label>
|
|
||||||
<input id="break-thresh" placeholder="0">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="btns">
|
|
||||||
<button onclick="closeDlg('dlg-break')">Cancel</button>
|
|
||||||
<button class="active" onclick="doBreak()">Set Break</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<!-- Message dialog -->
|
|
||||||
<div class="dialog-overlay" id="dlg-msg" style="display:none" onclick="if(event.target===this)closeDlg('dlg-msg')">
|
|
||||||
<div class="dialog">
|
|
||||||
<h3>✉ Send Message</h3>
|
|
||||||
<label>Destination</label>
|
|
||||||
<input id="msg-dest" list="msg-dest-list" placeholder="e.g. App.Functions.GAM1">
|
|
||||||
<datalist id="msg-dest-list"></datalist>
|
|
||||||
<label>Function</label>
|
|
||||||
<input id="msg-func" placeholder="FunctionName">
|
|
||||||
<label>Payload (key=value lines)</label>
|
|
||||||
<textarea id="msg-payload" placeholder="Key = Value Key2 = Value2"></textarea>
|
|
||||||
<div class="form-check">
|
|
||||||
<input type="checkbox" id="msg-wait">
|
|
||||||
<label for="msg-wait">Wait for reply</label>
|
|
||||||
</div>
|
|
||||||
<div class="btns">
|
|
||||||
<button onclick="closeDlg('dlg-msg')">Cancel</button>
|
|
||||||
<button class="active" onclick="doSendMsg()">Send</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<!-- Info dialog -->
|
|
||||||
<div class="dialog-overlay" id="dlg-info" style="display:none" onclick="if(event.target===this)closeDlg('dlg-info')">
|
|
||||||
<div class="dialog" style="max-width:600px;width:90vw">
|
|
||||||
<h3 id="info-title">Info</h3>
|
|
||||||
<pre id="info-body" style="background:#11111b;padding:8px;border-radius:4px;overflow:auto;max-height:400px;font-size:11px;color:#cdd6f4;white-space:pre-wrap"></pre>
|
|
||||||
<div class="btns" style="margin-top:12px">
|
|
||||||
<button onclick="closeDlg('dlg-info')">Close</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<!-- Step dialog -->
|
|
||||||
<div class="dialog-overlay" id="dlg-step" style="display:none" onclick="if(event.target===this)closeDlg('dlg-step')">
|
|
||||||
<div class="dialog">
|
|
||||||
<h3>⚙ Step Execution</h3>
|
|
||||||
<div class="form-row">
|
|
||||||
<div>
|
|
||||||
<label>Count</label>
|
|
||||||
<input type="number" id="step-count" value="1" min="1">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Thread (optional)</label>
|
|
||||||
<input id="step-thread-inp" list="step-thread-list" placeholder="all">
|
|
||||||
<datalist id="step-thread-list"></datalist>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="btns">
|
|
||||||
<button onclick="closeDlg('dlg-step')">Cancel</button>
|
|
||||||
<button class="active" onclick="doStep()">Step</button>
|
|
||||||
</div>
|
|
||||||
</div></div>
|
|
||||||
|
|
||||||
<script src="uplot.min.js"></script>
|
|
||||||
<script src="app.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user