diff options
author | Andy Green <andy.green@linaro.org> | 2012-10-15 06:38:57 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-10-15 07:37:49 +0800 |
commit | 2416ea0a0b69bef1d3de77453d15be1233eb423f (patch) | |
tree | 6ac77ea655ee6253a0341221675cb410dff47eca | |
parent | d47d0471297aae19f56f5dab9e6be03cff2035c0 (diff) |
add rail table to aepscope
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r-- | aepd/aepd.h | 2 | ||||
-rw-r--r-- | aepd/share/aepscope.html | 218 | ||||
-rw-r--r-- | aepd/websocket-protocol.c | 8 |
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]+'"> </td>'; + tab += '<td colspan="'+ depth +'"> </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]+'"> </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> </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; |