diff --git a/V203/usb/scope/bin/index.html b/V203/usb/scope/bin/index.html index 30f980c..849fd95 100644 --- a/V203/usb/scope/bin/index.html +++ b/V203/usb/scope/bin/index.html @@ -88,6 +88,20 @@ +

Poznámky k realizaci.

+

V zásadě to lze udělat jako webovou aplikaci čistě v javascriptu. Musí se tomu pomoct WebSocket serverem, + který zprostředkuje komunikaci se sériovým portem. Chrome sice asi má nějakou podporu sériového portu + přímo v browseru, ale bůhví jak to funguje. Přes webové sokety lze data na obě strany honit jako JSON, + je to celkem rychlé a snese to i dlouhé pakety. Přesto nestíhá zobrazovat v řádu ms, možná by stálo za to + udělat to zobrazování ve smyčce událostí např. pomocí window.requestAnimationFrame(). Je ale možné, + že problém je už v převodu těch dat z JSON do objektu. +

Zobrazování probíhá tak, že pomocné objekty jako markery, text atd. se vykreslí do pomocného canvasu + (obrázku), ten se pak vykreslí na obrazovku a přes něj se plácnou jen čáry kanálů. Snad je to tak rychlejší. + Není doděláno zoomování časové základny, bylo by to složité a nepovažuji to za důležité. Stejně tak + není korektní změna velikosti okna, ale stačí dát refresh. +

+

+
diff --git a/V203/usb/scope/bin/index.js b/V203/usb/scope/bin/index.js index 871a673..ec86fea 100644 --- a/V203/usb/scope/bin/index.js +++ b/V203/usb/scope/bin/index.js @@ -12,10 +12,22 @@ const ConnectBut = document.getElementById ('Connect'); const Connected = document.getElementById ('Connected'); const Canvas = document.getElementById ('canvas'); var gBGCanvas = null; +var gMark = { + type : 'time', + volt : { a : 0.5, b : 1.0 }, + time : { a : 100, b : 200 }, +}; const REF_Y = 3.3; const MAX_Y = 4096.0; const MAX_X = 1024.0; +const gTimeStep = [ +2.0e-6, 5.0e-6, 10.0e-6, +2.0e-5, 5.0e-5, 10.0e-5, +2.0e-4, 5.0e-4, 10.0e-4, +2.0e-3, 5.0e-3, 10.0e-3, +2.0e-2, 5.0e-2, 10.0e-2, +2.0e-1, 5.0e-1, 1.0, ]; var gMZ = { m11 : 1.0, m12 : 0.0, m21 : 0.0, m22 : 1.0, ox : 0.0, oy : 0.0 }; var gTC = { x : 100.0, y : 2048.0 }; @@ -58,9 +70,9 @@ function initWebSocket() { RefreshSettings (obj); return; } - DrawTrig (); - DrawPolyLine (0, obj.a, '#00FF00'); - DrawPolyLine (1, obj.b, '#FF0000'); + PrepareChannel (0, obj.a); + PrepareChannel (1, obj.b); + DrawAll (); }; websocket.onerror = function (evt) { console.log ('ERROR: ' + evt.data); @@ -77,8 +89,8 @@ function RefreshSettings (obj) { document.getElementById('trigger_edge').value = obj.rising; document.getElementById('time_base' ).value = obj.tim; gTC.x = obj.offset; gTC.y = obj.value; - DrawBG (); - DrawTrig (); + PrepareBG(); + DrawAll (); }; function ReloadMatrix (sz) { const xz = sz.x / MAX_X; @@ -101,7 +113,7 @@ function SendEvent (evt) { const reply = JSON.stringify(evt); websocket.send (reply); }; -function DrawBG () { +function PrepareBG () { var ctx = gBGCanvas.getContext('2d'); ctx.fillStyle = "black"; ctx.fillRect(0, 0, gBGCanvas.width, gBGCanvas.height); @@ -120,13 +132,80 @@ function DrawBG () { ctx.moveTo(b.x, b.y); ctx.lineTo(e.x, e.y); ctx.stroke(); + ctx.save(); // dopsat grid, markers + ctx.lineWidth = 1.0; + ctx.strokeStyle = '#808080'; + ctx.setLineDash([4, 10]); + const stepx = 100, stepm = MAX_Y / REF_Y, stepy = 0.5 * stepm; + for (let x=stepx; x { @@ -191,9 +284,15 @@ MoveElem.onchange = (event) => { }; MarkerTime.onclick = (event) => { console.log ('time_mark'); + gMark.type = 'time'; + PrepareBG (); + DrawAll (); }; MarkerVolt.onclick = (event) => { console.log ('volt_mark'); + gMark.type = 'volt'; + PrepareBG (); + DrawAll (); }; window.onload = (event) => { const dim = { x : Canvas.clientWidth, y : Canvas.clientHeight };