aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Green <andy.green@linaro.org>2012-10-19 16:59:15 +0800
committerAndy Green <andy.green@linaro.org>2012-10-20 11:40:08 +0800
commit7628b1a757b6d4dc42bad975dba7bfb39f5f9132 (patch)
tree81889c47ae14206b307c37d844b0a656d0091ebe
parentca00baf3fd20658543bfefbb275fef082215f269 (diff)
introduce trigger level selection
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r--aepd/Makefile.am11
-rw-r--r--aepd/aepd.h1
-rw-r--r--aepd/share/aepscope.html251
-rw-r--r--aepd/share/trigger.pngbin0 -> 1354 bytes
-rw-r--r--aepd/websocket-protocol.c17
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">&nbsp;</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">&nbsp;</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
new file mode 100644
index 0000000..e8f600b
--- /dev/null
+++ b/aepd/share/trigger.png
Binary files differ
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) {