signalgraph.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. "use strict"
  2. define(function () {
  3. return function (canvas, min, max) {
  4. var i = 0
  5. var graphWidth
  6. var last = 0
  7. var signals = []
  8. var ctx = canvas.getContext("2d")
  9. resize()
  10. window.addEventListener("resize", resize, false)
  11. window.requestAnimationFrame(step)
  12. function step(timestamp) {
  13. var delta = timestamp - last
  14. if (delta > 40) {
  15. draw()
  16. last = timestamp
  17. }
  18. window.requestAnimationFrame(step)
  19. }
  20. function drawGrid() {
  21. var gridctx = ctx
  22. var nLines = Math.floor(canvas.height / 40)
  23. gridctx.save()
  24. gridctx.lineWidth = 0.5
  25. gridctx.strokeStyle = "rgba(0, 0, 0, 0.25)"
  26. gridctx.fillStyle = "rgba(0, 0, 0, 0.5)"
  27. gridctx.textAlign = "end"
  28. gridctx.textBaseline = "bottom"
  29. gridctx.beginPath()
  30. for (var i = 0; i < nLines; i++) {
  31. var y = canvas.height - i * 40
  32. gridctx.moveTo(0, y - 0.5)
  33. gridctx.lineTo(canvas.width, y - 0.5)
  34. var dBm = Math.round(scaleInverse(y, min, max, canvas.height)) + " dBm"
  35. gridctx.save()
  36. gridctx.strokeStyle = "rgba(255, 255, 255, 0.9)"
  37. gridctx.lineWidth = 4
  38. gridctx.miterLimit = 2
  39. gridctx.strokeText(dBm, canvas.width - 5, y - 2.5)
  40. gridctx.fillText(dBm, canvas.width - 5, y - 2.5)
  41. gridctx.restore()
  42. }
  43. gridctx.stroke()
  44. gridctx.strokeStyle = "rgba(0, 0, 0, 0.83)"
  45. gridctx.lineWidth = 1.5
  46. gridctx.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1)
  47. gridctx.restore()
  48. }
  49. function draw() {
  50. var anyHighlight = signals.some( function (d) { return d.getHighlight() })
  51. signals.forEach( function (d) {
  52. d.draw(i, function (v) {
  53. return scale(v, min, max, canvas.height)
  54. })
  55. })
  56. ctx.clearRect(0, 0, canvas.width, canvas.height)
  57. ctx.save()
  58. signals.forEach( function (d) {
  59. if (anyHighlight)
  60. ctx.globalAlpha = 0.1
  61. if (d.getHighlight())
  62. ctx.globalAlpha = 1
  63. ctx.drawImage(d.canvas, 0, 0)
  64. })
  65. ctx.restore()
  66. ctx.save()
  67. ctx.beginPath()
  68. ctx.strokeStyle = "rgba(255, 180, 0, 0.15)"
  69. ctx.lineWidth = 5
  70. ctx.moveTo(i + 2.5, 0)
  71. ctx.lineTo(i + 2.5, canvas.height)
  72. ctx.stroke()
  73. drawGrid()
  74. i = (i + 1) % graphWidth
  75. }
  76. function scaleInverse(n, min, max, height) {
  77. return (min * n + max * height - max * n) / height
  78. }
  79. function scale(n, min, max, height) {
  80. return (1 - (n - min) / (max - min)) * height
  81. }
  82. function resize() {
  83. var newWidth = canvas.parentNode.clientWidth
  84. if (newWidth === 0 || newWidth === canvas.width)
  85. return
  86. var lastImage = ctx.getImageData(0, 0, newWidth, canvas.height)
  87. canvas.width = newWidth
  88. graphWidth = canvas.width
  89. ctx.putImageData(lastImage, 0, 0)
  90. signals.forEach( function (d) {
  91. d.resize(canvas.width, canvas.height)
  92. })
  93. }
  94. this.add = function (d) {
  95. signals.push(d)
  96. d.resize(canvas.width, canvas.height)
  97. return function () {
  98. signals = signals.filter( function (e) { return e !== d } )
  99. }
  100. }
  101. return this
  102. }
  103. })