blob: 1b3bbf009c1f695327838c831379943b4ee5b17a [file] [log] [blame]
Alex Perry554cec02019-03-23 20:15:12 -07001import {FT_TO_M, FIELD_WIDTH} from './constants';
Alex Perryd2df9652019-03-23 22:53:04 -07002import {drawField, drawTarget} from './field';
Alex Perry554cec02019-03-23 20:15:12 -07003import {drawRobot} from './robot';
4
5const FIELD_WIDTH = 27 * FT_TO_M;
6
7function main(): void {
8 const vis = new Visualiser();
9}
10
11class Visualiser {
12 private x = 3;
13 private y = 0;
14 private theta = 0;
15
Alex Perryd2df9652019-03-23 22:53:04 -070016 private drawLocked = false;
17 private lockedX = 0;
18 private lockedY = 0;
19 private lockedTheta = 0;
20
Alex Perry554cec02019-03-23 20:15:12 -070021 constructor() {
22 const canvas = <HTMLCanvasElement>document.getElementById('field');
23 const ctx = canvas.getContext('2d');
24
25 const server = location.host;
26 const socket = new WebSocket(`ws://${server}/ws`);
27 const reader = new FileReader();
28 reader.addEventListener('loadend', (e) => {
29 const text = e.srcElement.result;
30 const j = JSON.parse(text);
31 this.x = j.robot.x;
32 this.y = j.robot.y;
33 this.theta = j.robot.theta;
Alex Perryd2df9652019-03-23 22:53:04 -070034
35 if(j.target) {
36 this.drawLocked = true;
37 this.lockedX = j.target.x;
38 this.lockedY = j.target.y;
39 this.lockedTheta = j.target.theta;
40 }
Alex Perry554cec02019-03-23 20:15:12 -070041 });
42 socket.addEventListener('message', (event) => {
43 reader.readAsText(event.data);
44 });
45 window.requestAnimationFrame(() => this.draw(ctx));
46 }
47
48 reset(ctx : CanvasRenderingContext2D) : void {
49 ctx.setTransform(1,0,0,1,0,0);
50 const size = Math.min(window.innerHeight, window.innerWidth) * 0.98;
51 ctx.canvas.height = size;
52 ctx.canvas.width = size;
53 ctx.clearRect(0,0,size,size);
54
55 ctx.translate(size/2, size);
56 ctx.rotate(-Math.PI / 2);
57 ctx.scale(1, -1);
58 const M_TO_PX = size / FIELD_WIDTH
59 ctx.scale(M_TO_PX, M_TO_PX);
60 ctx.lineWidth = 1 / M_TO_PX;
Alex Perry554cec02019-03-23 20:15:12 -070061 }
62
63 draw(ctx : CanvasRenderingContext2D) : void {
64 this.reset(ctx);
65
66 drawField(ctx);
67 drawRobot(ctx, this.x, this.y, this.theta);
Alex Perryd2df9652019-03-23 22:53:04 -070068 if (this.drawLocked) {
69 ctx.save();
70 ctx.strokeStyle = 'red';
71 drawTarget(ctx, this.lockedX, this.lockedY, this.lockedTheta);
72 ctx.restore();
73 }
Alex Perry554cec02019-03-23 20:15:12 -070074 window.requestAnimationFrame(() => this.draw(ctx));
75 }
76}
77
78main();