diff options
author | Andy Green <andy.green@linaro.org> | 2012-10-19 16:59:15 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-10-20 11:40:08 +0800 |
commit | 7628b1a757b6d4dc42bad975dba7bfb39f5f9132 (patch) | |
tree | 81889c47ae14206b307c37d844b0a656d0091ebe | |
parent | ca00baf3fd20658543bfefbb275fef082215f269 (diff) |
introduce trigger level selection
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r-- | aepd/Makefile.am | 11 | ||||
-rw-r--r-- | aepd/aepd.h | 1 | ||||
-rw-r--r-- | aepd/share/aepscope.html | 251 | ||||
-rw-r--r-- | aepd/share/trigger.png | bin | 0 -> 1354 bytes | |||
-rw-r--r-- | aepd/websocket-protocol.c | 17 |
5 files changed, 227 insertions, 53 deletions
diff --git a/aepd/Makefile.am b/aepd/Makefile.am index 1af41c2..2e86f94 100644 --- a/aepd/Makefile.am +++ b/aepd/Makefile.am @@ -20,7 +20,14 @@ clean-local: install-data-local: aepd.pem aepd.key.pem mkdir -p $(DESTDIR)$(datadir)/aepd - cp share/aepscope.html share/favicon.ico aepd.pem aepd.key.pem \ - share/linaro-logo-32.png share/caliper.png \ + cp share/aepscope.html \ + share/favicon.ico \ + aepd.pem \ + aepd.key.pem \ + share/linaro-logo-32.png \ + share/caliper.png \ + share/trigger.png \ + share/indicator-bg.png \ + share/indicator-triggered.png \ $(DESTDIR)$(datadir)/aepd diff --git a/aepd/aepd.h b/aepd/aepd.h index c43e8da..df6763b 100644 --- a/aepd/aepd.h +++ b/aepd/aepd.h @@ -56,6 +56,7 @@ struct aepd_shared { double fifo_head_time; unsigned long modulo_integer_chan_size; int stop_flag; + double trigger_level; }; extern struct aepd_shared *aepd_shared; diff --git a/aepd/share/aepscope.html b/aepd/share/aepscope.html index 4972452..aa63d9c 100644 --- a/aepd/share/aepscope.html +++ b/aepd/share/aepscope.html @@ -22,6 +22,8 @@ * 02110-1301, USA. * */ + +td.heading { font-size:9pt; font: Arial; font-weight:bold; vertical-align:middle; text-align:center; background:#e0e0e0; color:#a0a0a0; padding:3px; -webkit-border-radius:16px; -moz-border-radius:16px; border-radius:16px; } --> <html lang="en"> <head> @@ -35,20 +37,15 @@ div.caliper_invalid { font-size:8pt; font: Arial; font-weight:normal; opacity: 0.2; } div.caliper_valid { font-size:8pt; font: Arial; font-weight:normal; background-color:#f0f0f0; color:#000000 } - div.control { font-size:9pt; font: Arial; font-weight:bold; color:#404040; } - div.info { font-size:8pt; font: Arial; font-weight:normal; color:#000000; } + div.control { font-size:9pt; font: Arial; font-weight:bold; color:#808080; } + div.info { font-size:8pt; font: Arial; font-weight:normal; text-align:right; color:#000000; } div.groupwhite { height:60px; vertical-align:middle; text-align:center; padding:4px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } div.group { height:60px; vertical-align:middle; text-align:center; background:#f0f0f0; padding:4px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } div.group2 { vertical-align:middle; text-align:center; background:#f0f0f0; padding:4px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } - td.heading { font-size:9pt; font: Arial; font-weight:bold; vertical-align:middle; text-align:center; background:#e0e0e0; color:#a0a0a0; padding:3px; -webkit-border-radius:16px; -moz-border-radius:16px; border-radius:16px; } - div.group::after { - content: "."; - visibility: hidden; -} -div.group img { - vertical-align: middle; -} + td.heading { font-size:9pt; font: Arial; font-weight:bold; vertical-align:middle; text-align:center; color:#a0a0a0; } + div.group::after { content: "."; visibility: hidden; } + div.group img { vertical-align: middle; } div.btn { height:12px; width: 12px; vertical-align:middle; text-align:center; padding:2px; -webkit-border-radius:8px; -moz-border-radius:8px; border-radius:8px; } </style> @@ -67,37 +64,95 @@ div.group img { <td height="100%"> <div class="groupwhite"><a href="http://git.linaro.org/gitweb?p=tools/arm-probe.git;a=summary"><img src="linaro-logo-32.png"></a></div> </td> - <td><div class="group"> - <table height="100%"><tr><td><div class="control">Time zoom</div></td><td><div id=tb class="info"></div></td></tr><tr><td colspan="2"> - <input type="range" id="rate" min="0" max="14" onchange="update_options();"></td></tr></table> - </div></td> - <td><div class="group"> - <table height="100%"><tr><td><div class="control">Power zoom</div></td><td><div id=pz class="info"></div></td></tr><tr><td colspan="2"> - <input type="range" id="scale" step="0.1" min="0.1" max="10" onchange="update_options();"></td></tr></table> - </div></td> - <td height="100%"><div class="group" height="100%"> - <div class="control"><input type="checkbox" id="run" checked="checked" onchange="update_options();">Run</input></div> - <div id="val" class="info"> </div> - </div></td> - <td height="100%" style="width:100px;"><div class="group"> - <div class="control"><input type="checkbox" id="measure" checked="checked" onchange="update_measure();">Measure</input></div> - <div id="val2" class="caliper_invalid"></div> - </div></td> + <td> + <div class="group"> + <table height="100%"> + <tr> + <td> + <div class="control">Time zoom</div> + </td> + <td> + <div id=tb class="info"></div> + </td> + </tr> + <tr> + <td colspan="2"> + <input type="range" id="rate" min="0" max="14" onchange="update_options();"> + </td> + </tr> + </table> + </div> + </td> + <td> + <div class="group"> + <table height="100%"> + <tr> + <td> + <div class="control">Power zoom</div> + </td> + <td> + <div id=pz class="info"></div> + </td> + </tr> + <tr> + <td colspan="2"> + <input type="range" id="scale" step="0.1" min="0.1" max="10" onchange="update_options();"> + </td> + </tr> + </table> + </div> + </td> + <td height="100%" style="width:140px;"> + <div class="group"> + <table height="100%" width="100%"> + <tr style="vertical-align:top"> + <td> + <table height="100%" width="100%"> + <tr style="vertical-align:top"> + <td> + <div class="control" style="text-align:left" width="50%">Search</div> + </td> + <td> + <div id="trigval" class="info"></div> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td> + <table height="100%"> + <tr style="vertical-align:top"> + <td id="trigsrccolour"></td> + <td id="trigsrcname"></td> + </tr> + </table> + </td> + </tr> + </table> + </div> + </td> + <td height="100%"> + <div class="group" height="100%"> + <div class="control"><input type="checkbox" id="run" checked="checked" onchange="update_options();">Run</input></div> + <div id="val" class="info"> </div> + </div> + </td> + <td height="100%" style="width:100px;"> + <div class="group"> + <div class="control"><input type="checkbox" id="measure" checked="checked" onchange="update_measure();">Measure</input></div> + <div id="val2" class="caliper_invalid"></div> + </div> + </td> </tr> </table> </td> </tr> <tr style="vertical-align:top"> <td style="vertical-align:top"> - <table> - <tr> - <td> - <div id="pane0" class="group2"> - <canvas id="canvas0"> - </div> - </td> - </tr> - </table> + <div id="pane0" class="group2"> + <canvas id="canvas0"> + </div> </td> <td style="vertical-align:top"> <div class="group2"> @@ -111,7 +166,7 @@ div.group img { var caliper_headroom = 16; var x_axis_height = 16 + /* scroll */ 16; -var y_axis_width = 32; +var y_axis_width = 32 + /* trigger */ 20; var xlen = 600; var ylen = 400; @@ -151,7 +206,7 @@ var ch_order = new Array(); var height = new Array(xlen); -var ov; +var ov = 0; var worst_depth; var order; var do_title = 0; @@ -165,12 +220,17 @@ var loading = 0; var caliper; var cal_pos = new Array(2); var measure = 0; -var drag_index = -1; +var caliper_drag_index = -1; var caliperV = new Array(); var caliperA = new Array(); var caliperW = new Array(); var caliper_valid = 0; +var trigger_png; +var trigger_level = 0.05; +var trigger_drag = 0; +var trigger_channel = 0; + var rates = [ 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 4, 3, 2, 1 ]; var intervals = [ 50, 20, 10, 5, 2, 1, 1, 0.5, 0.25, 0.1, 0.05, 0.05, 0.025, 0.025, 0.01 ]; var sigs = [ 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 2, 3, 3, 2 ]; @@ -180,6 +240,11 @@ cal_pos[1] = 200; var chan_view = -1; +function btest() +{ + +} + function event_wheel(e) { var f; @@ -214,10 +279,30 @@ function event_drag_start(e) y = e.layerY - offsetY; } - drag_index = -1; + /* + * dragging a caliper? + */ + caliper_drag_index = -1; for (n = 0; n < 2; n++) { - if (x > cal_pos[n] - 8 && x < cal_pos[n] + 16) - drag_index = n; + if (x > cal_pos[n] - 8 && x < cal_pos[n] + 16) { + caliper_drag_index = n; + e.stopPropagation (); + return; + } + } + + /* + * dragging the trigger level? + */ + trigger_drag = 0; + n = ylen -(ylen * (trigger_level / watts_fullscale)) + caliper_headroom; + if (n < caliper_headroom) + n = caliper_headroom; + + if (x > xlen && y > (n - 8) && y < (n + 8)) { + trigger_drag = 1; + e.stopPropagation (); + return; } e.stopPropagation (); @@ -225,7 +310,7 @@ function event_drag_start(e) function event_drag(e) { - var x, y; + var x, y, n; if (e.offsetX) { x = e.offsetX; y = e.offsetY; @@ -239,21 +324,30 @@ function event_drag(e) x -= 8; - if (drag_index >= 0) { - if (cal_pos[drag_index] != x) { - cal_pos[drag_index] = x; + if (caliper_drag_index >= 0) { + if (cal_pos[caliper_drag_index] != x) { + cal_pos[caliper_drag_index] = x; dirty = 1; caliper_changed(); } } + if (trigger_drag && y <= ylen) { + n = ylen -(ylen * (trigger_level / watts_fullscale)) + caliper_headroom; + + trigger_level = ((ylen - (y - caliper_headroom)) / ylen) * watts_fullscale; + dirty = 1; + trigger_level_changed(); + } + e.stopPropagation (); return false; } function event_drag_end(e) { - drag_index = -1; + caliper_drag_index = -1; + trigger_drag = 0; } function update_measure() @@ -292,6 +386,20 @@ function caliper_changed() ((xlen - cal_pos[1]) * rates[rate] * 0.0001)+"\n"); } +function trigger_level_changed() +{ + document.getElementById("trigval").textContent = units(trigger_level)+"W"; + if (ov != 0) { + document.getElementById("trigsrccolour").innerHTML = '<div class="btn" style="background: '+ch_colour[trigger_channel]+';"></div>'; + document.getElementById("trigsrcname").innerHTML = '<div class="info">'+ch_name[trigger_channel]+'</div>'; + } + localStorage["aepd.trigger_level"] = trigger_level; + localStorage["aepd.trigger_channel"] = trigger_channel; + + if (socket) + if (socket.readyState == 1) + socket.send("T" + trigger_level + "\n"); +} function read_local_stg(stg_name, element_name, default_value) { @@ -315,6 +423,9 @@ if (localStorage["aepd.measure"]) cal_pos[0] = parseFloat(read_local_stg("aepd.caliper0", "", 100)); cal_pos[1] = parseFloat(read_local_stg("aepd.caliper1", "", 200)); chan_view = parseFloat(read_local_stg("aepd.chan_view", "", -1)); +trigger_level = parseFloat(read_local_stg("aepd.trigger_level", "", 0.05)); +trigger_channel = parseFloat(read_local_stg("aepd.trigger_channel", "", 0)); +trigger_level_changed(); update_measure(); @@ -489,7 +600,7 @@ function channel_list_changed() do_title = 0; - tab = '<table><tr style="background-color: #000000"><td class="heading" colspan="'+(worst_depth + 2)+'">Rail</td>'; + tab = '<table><tr><td class="heading" colspan="'+(worst_depth + 2)+'">Rail</td>'; tab+= '<td class="heading" width="45">Voltage</td>'; tab+= '<td class="heading" width="80">Current</td>'; tab+= '<td class="heading" width="80">Power</td>'; @@ -517,6 +628,8 @@ function channel_list_changed() tab += "</table>"; document.getElementById("cha").innerHTML = tab; + /* saved trigger channel may not have existed before */ + trigger_level_changed(); } function conn_retry() @@ -540,6 +653,9 @@ function conn_retry() caliper = new Image(); caliper.src = "caliper.png"; + trigger_png = new Image(); + trigger_png.src = "trigger.png"; + last_head = -1; ring_head = -1; grayOut(false); @@ -582,6 +698,15 @@ function conn_retry() } /* + * Triggered + */ + + if (msg.data[0] == 'T') { + /* triggered */ + return; + } + + /* * caliper measurement info */ @@ -811,7 +936,8 @@ function units3(n) { function show(cv) { - var n, p, y, chan, q, z, peak, ro, rx, extent, x2, xx, q1; + var n, p, y, chan, q, z, peak, ro, rx, extent, x2, xx, q1, + effective_channels; if (!connection || !ring_size) return; @@ -823,6 +949,11 @@ function show(cv) last_running = running; + if (trigger_drag != 0) + effective_channels = trigger_channel; + else + effective_channels = chan_view; + ctx = canvas[0].getContext("2d"); ctx.save(); // ctx.globalCompositeOperation = "copy"; @@ -874,7 +1005,7 @@ function show(cv) } - if (chan_view >= 0 && z != chan_view) { + if (effective_channels >= 0 && z != effective_channels) { chan++; continue; } @@ -1005,7 +1136,7 @@ function show(cv) ctx.stroke(); } - ctx.fillText(f, xlen + 8, caliper_headroom +y + 2); + ctx.fillText(f, xlen + 16, caliper_headroom +y + 2); r -= interval; } @@ -1026,6 +1157,26 @@ function show(cv) ctx.stroke(); } } + + /* + * trigger + */ + + ctx.lineWidth = 1; + ctx.strokeStyle = 'rgba(160, 160, 160, 0.5)'; + + y = ylen * trigger_level / watts_fullscale; + if (y >= ylen) { + y = ylen - 1; + ctx.globalAlpha = 0.3; + } + + ctx.drawImage(trigger_png, xlen + 8, caliper_headroom + (ylen - y) - 2 - 8); + ctx.beginPath(); + ctx.moveTo(0, caliper_headroom + (ylen - y) - 2); + ctx.lineTo(xlen + 32, caliper_headroom + (ylen - y) - 2); + ctx.stroke(); + ctx.restore(); } diff --git a/aepd/share/trigger.png b/aepd/share/trigger.png Binary files differnew file mode 100644 index 0000000..e8f600b --- /dev/null +++ b/aepd/share/trigger.png diff --git a/aepd/websocket-protocol.c b/aepd/websocket-protocol.c index 1da8e53..da965db 100644 --- a/aepd/websocket-protocol.c +++ b/aepd/websocket-protocol.c @@ -31,10 +31,13 @@ struct serveable { const char *mimetype; }; -static struct serveable whitelist[] = { +static const struct serveable whitelist[] = { { "/favicon.ico", "image/x-icon" }, { "/linaro-logo-32.png", "image/png" }, { "/caliper.png", "image/png" }, + { "/trigger.png", "image/png" }, + { "/indicator-bg.png", "image/png" }, + { "/indicator-triggered.png", "image/png" }, /* last one is the default served if no match */ { "/aepscope.html", "text/html" }, @@ -87,6 +90,7 @@ struct per_session_data__linaro_aepd { long caliper_offset[2]; double caliper_time[2]; unsigned long ms10_last_caliper; + unsigned long ms10_last_triglevel; int seen_rate; }; @@ -205,6 +209,10 @@ bad_caliper: goto send; } + if (ms10 != pss->ms10_last_triglevel && aepd_shared->chans) { + pss->ms10_last_caliper = ms10; + } + /* * do we need to isse a sync timestamp? */ @@ -369,6 +377,13 @@ send: case LWS_CALLBACK_RECEIVE: switch (*(char *)in) { + case 't': /* set trigger level */ + if (sscanf(((char *)in) + 1, "%lf\n", &d[0]) == 1) { + aepd_shared->trigger_level = d[0]; + /* set it */ + } + break; + case 'c': /* calipers changed */ if (sscanf(((char *)in) + 1, "%lf %lf\n", &d[0], &d[1]) == 2) { |