aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Green <andy.green@linaro.org>2012-10-15 06:38:57 +0800
committerAndy Green <andy.green@linaro.org>2012-10-15 07:37:49 +0800
commit2416ea0a0b69bef1d3de77453d15be1233eb423f (patch)
tree6ac77ea655ee6253a0341221675cb410dff47eca
parentd47d0471297aae19f56f5dab9e6be03cff2035c0 (diff)
add rail table to aepscope
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r--aepd/aepd.h2
-rw-r--r--aepd/share/aepscope.html218
-rw-r--r--aepd/websocket-protocol.c8
3 files changed, 184 insertions, 44 deletions
diff --git a/aepd/aepd.h b/aepd/aepd.h
index cb3ed3d..d59009c 100644
--- a/aepd/aepd.h
+++ b/aepd/aepd.h
@@ -44,7 +44,7 @@ enum demo_protocols {
DEMO_PROTOCOL_COUNT
};
-#define MAX_FIFO_EXTENT_SECONDS 10
+#define MAX_FIFO_EXTENT_SECONDS 100
#define DOUBLES_PER_CH_SAMPLE 3
#define MAX_FIFO_EXTENT (MAX_PROBES * CHANNELS_PER_PROBE * sizeof(double) * \
diff --git a/aepd/share/aepscope.html b/aepd/share/aepscope.html
index dc68053..634c933 100644
--- a/aepd/share/aepscope.html
+++ b/aepd/share/aepscope.html
@@ -44,21 +44,8 @@
<div id=wsdi_status>Not initialized</div>
</td>
<td>
- Resolution<br>
- <select id=rate onchange="update_options();">
- <option value=1>100us</option>
- <option value=2>200us</option>
- <option value=5>500us</option>
- <option value=10>1ms</option>
- <option value=20>2ms</option>
- <option value=50>5ms</option>
- <option value=100>10ms</option>
- <option value=200>20ms</option>
- <option value=500>50ms</option>
- <option value=1000>100ms</option>
- <option value=5000>500ms</option>
- <option value=10000>1s</option>
- </select>
+ <table><tr><td>Time zoom</td><td><div id=tb></div></td></tr><tr><td colspan="2">
+ <input type="range" id="rate" min="0" max="14" onchange="update_options();"></td></tr></table>
</td>
<td>
<div id=val>-</div>
@@ -67,8 +54,8 @@
</table>
</td>
</tr>
- <tr>
- <td>
+ <tr style="vertical-align:top">
+ <td style="vertical-align:top">
<table style="background-color:#000000">
<tr>
<td id=pane0>
@@ -76,8 +63,8 @@
</tr>
</table>
</td>
- <td>
- <div id="cha"></div>
+ <td style="vertical-align:top">
+ <div style="vertical-align:top" id="cha"></div>
</td>
</tr>
</table>
@@ -110,12 +97,84 @@ var ylen = 400;
var bounce = 0;
var last_head = -1;
+var ch_name_to_index = new Array();
var ch_name = new Array();
var ch_supply = new Array();
var ch_colour = new Array();
var ch_class = new Array();
+var ch_flags = new Array();
+var ch_order = new Array();
var ov;
+var worst_depth;
+var order;
+var do_title = 0;
+
+var rates = [ 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 4, 3, 2, 1 ];
+var srates = [ "1s", "500ms", "200ms", "100ms", "50ms", "20ms", "10ms", "5ms", "2ms", "1ms", "500us", "400us", "300us", "200us", "100us" ];
+
+const CHFLAG_TOPLEVEL = 1;
+const CHFLAG_VIRTUAL = 2;
+
+function channel_index_from_name(name)
+{
+ var n;
+
+ for (n = 0; n < ov; n++)
+ if (ch_name[n] == name)
+ return n;
+
+ return undefined;
+}
+
+function get_toplevel_supply(name)
+{
+ var n, m;
+ n = channel_index_from_name(name);
+ if (n == undefined)
+ return undefined;
+
+ if (n >= chans)
+ ch_flags[n] |= CHFLAG_VIRTUAL;
+
+ m = channel_index_from_name(ch_supply[n]);
+ if (m == undefined) {
+ ch_flags[n] |= CHFLAG_TOPLEVEL;
+ return name;
+ }
+
+ return get_toplevel_supply(ch_supply[n]);
+}
+
+function do_all_children(name, depth, total_depth)
+{
+ var n;
+
+ if (depth > worst_depth)
+ worst_depth = depth;
+
+ n = channel_index_from_name(name);
+
+ if (n >= chans)
+ fcol = "#808080";
+ else
+ fcol = "#000000";
+
+ if (total_depth) {
+ tab += '<tr><td style="background-color: '+ch_colour[n]+'">&nbsp;&nbsp;&nbsp;&nbsp;</td>';
+ tab += '<td colspan="'+ depth +'">&nbsp;</td>';
+ tab += '<td colspan="'+(total_depth - depth)+'"><font style="color:' + fcol + '">'+ name;
+ if (ch_flags[n] & CHFLAG_TOPLEVEL)
+ tab += ' top ';
+ tab += ' '+ch_flags[n]+' ';
+ tab += "</font></td><td>-</td><td>-</td><td>-</td></tr>";
+ ch_order[order++] = n;
+ }
+ for (n = 0; n < ov; n++) {
+ if (ch_supply[n] == name)
+ do_all_children(ch_name[n], depth + 1, total_depth);
+ }
+}
function get_appropriate_ws_url()
{
@@ -161,14 +220,15 @@ function conn_retry()
socket.onmessage = function got_packet(msg) {
- if (msg.data[0] == '=')
+ if (msg.data[0] == '=') {
channel_data = 1;
- else
+ do_title = 1;
+ ov = 0;
+ } else
channel_data = 0;
z = msg.data.split(';');
- ov = 0;
block = 0;
while (block < (z.length - 1)) {
@@ -176,19 +236,23 @@ function conn_retry()
if (channel_data) {
if (!block)
- ch_name[ov] = y[0].substr(1);
+ f = y[0].substr(1);
else
- ch_name[ov] = y[0];
+ f = y[0];
+ ch_name[ov] = f;
ch_supply[ov] = y[1];
ch_colour[ov] = y[2];
- ch_class[ov++] = y[3];
+ ch_class[ov] = y[3];
+ ch_order[ov] = -1;
+ ch_flags[ov] = 0;
+ ov++;
block++;
continue;
}
chan = 0;
- while (chan < (y.length - 1)) {
+ while (chan < y.length) {
x = y[chan].split(' ');
if (x.length != 3) {
@@ -229,11 +293,66 @@ function conn_retry()
block++;
}
- if (channel_data) {
- tab = "<table>";
+ if (!channel_data && do_title) {
+ var n, b, found, done_list;
+
+ done_list = new Array;
+ worst_depth = 0;
+ order = 0;
+ b = "?";
+
for (n = 0; n < ov; n++) {
- tab += '<tr><td style="background-color: '+ch_colour[n]+'">&nbsp;&nbsp;</td><td>' + ch_name[n] +"</td></tr>";
+
+ b = get_toplevel_supply(ch_name[n]);
+
+ found = 0;
+ for (y = 0; y < done_list.length; y++)
+ if (done_list[y] == b) {
+ found = 1;
+ y = done_list.length;
+ }
+
+ if (found)
+ continue;
+ done_list.push(b);
+
+ do_all_children(b, 1, 0);
}
+
+ document.getElementById("val").textContent = chans + ' ' + ov;
+
+ do_title = 0;
+
+ tab = '<table><tr style="background-color: #000000"><td></td>';
+
+ for (n = 0; n < worst_depth; n++)
+ tab += "<td>&nbsp;</td>";
+
+ tab+= '<td align=center style="vertical-align:middle"><font style="color: #ffffff">Rail</font></td>';
+ tab+= '<td align=center style="vertical-align:middle"><font style="color: #ffffff">V</font></td>';
+ tab+= '<td align=center style="vertical-align:middle"><font style="color: #ffffff">A</font></td>';
+ tab+= '<td align=center style="vertical-align:middle"><font style="color: #ffffff">W</font></td>';
+ tab += '</tr>';
+
+ done_list = new Array;
+ for (n = 0; n < ov; n++) {
+
+ b = get_toplevel_supply(ch_name[n]);
+
+ found = 0;
+ for (y = 0; y < done_list.length; y++)
+ if (done_list[y] == b) {
+ found = 1;
+ y = done_list.length;
+ }
+
+ if (found)
+ continue;
+ done_list.push(b);
+
+ do_all_children(b, 1, worst_depth + 1);
+ }
+
tab += "</table>";
document.getElementById("cha").innerHTML = tab;
@@ -280,9 +399,9 @@ function units(n) {
function show(cv)
{
- var n, p, y, chan, q;
+ var n, p, y, chan, q, z, peak;
- if (!connection)
+ if (!connection || !ring_size)
return;
if (last_head == ring_head)
@@ -306,27 +425,40 @@ function show(cv)
y = ylen - 2;
chan = 0;
- while (chan < chans) {
+ peak = ylen;
+ while (chan < ch_order.length) {
+
+ z = ch_order[chan];
+ if (z < chans && z != undefined) {
- ctx.lineWidth = 1;
- ctx.strokeStyle = ch_colour[chan];
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = ch_colour[z];
- ctx.beginPath();
+ ctx.beginPath();
- p = (ringW[chan][q] * ylen) / watts_fullscale;
+ p = (ringW[z][q] * (ylen - 4)) / watts_fullscale;
- ctx.moveTo(n + 0.5, y);
- ctx.lineTo(n + 0.5, y - p);
+ if ((ch_flags[z] & (CHFLAG_TOPLEVEL | CHFLAG_VIRTUAL)) == CHFLAG_TOPLEVEL) {
+ ctx.moveTo(n + 0.5, ylen - 2);
+ ctx.lineTo(n + 0.5, ylen - 2 - p);
+ peak = ylen - 2 - p;
+ } else {
- y -= p;
+ ctx.moveTo(n + 0.5, y);
+ ctx.lineTo(n + 0.5, y - p);
- ctx.stroke();
+ y -= p;
+ }
+ ctx.stroke();
+ }
chan++;
}
ctx.lineWidth = 1;
ctx.strokeStyle = '#ffffff';
ctx.beginPath();
+ if (peak < y)
+ y = peak;
ctx.moveTo(n, y);
ctx.lineTo(n, 1);
ctx.stroke();
@@ -339,8 +471,9 @@ function show(cv)
function update_options()
{
rate = document.getElementById("rate").value;
- localStorage["ivmon.rate"] = rate;
- socket.send("r"+(rate)+"\n");
+ localStorage["ivmon.rate"] = document.getElementById("rate").value;
+ document.getElementById("tb").textContent = srates[rate];
+ socket.send("r"+rates[rate]+" "+xlen+"\n");
}
/*
@@ -482,6 +615,7 @@ if (localStorage["ivmon.rate"]) {
rate = document.getElementById("rate").value =
parseInt(localStorage["ivmon.rate"]);
document.getElementById("rate").value = rate;
+ //update_options();
}
grayOut(true,{'zindex':'499'});
diff --git a/aepd/websocket-protocol.c b/aepd/websocket-protocol.c
index 591b6cf..7420cd5 100644
--- a/aepd/websocket-protocol.c
+++ b/aepd/websocket-protocol.c
@@ -98,6 +98,7 @@ callback_linaro_aepd(struct libwebsocket_context *context,
char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
int budget = 10;
unsigned long extent;
+ long l;
switch (reason) {
@@ -203,8 +204,13 @@ send:
switch (*(char *)in) {
case 'r':
- if (sscanf(((char *)in) + 1, "%lf\n", &d[0]) == 1)
+ if (sscanf(((char *)in) + 1, "%lf %lf\n", &d[0], &d[1]) == 2)
pss->stride = (int)d[0];
+ l = aepd_shared->fifo_pos - ((int)d[1] * pss->stride * aepd_shared->chans * sizeof(double) * 3);
+ while (l < 0)
+ l += aepd_shared->modulo_integer_chan_size;
+ pss->ringbuffer_tail = l;
+ libwebsocket_callback_on_writable(context, wsi);
break;
}
break;