blob: 0d88a434a38fa160a57d9b448a38cb20a804028d [file] [log] [blame]
Alex Perry5b895622019-04-06 14:27:55 -07001import {FIELD_WIDTH, FT_TO_M} from './constants';
Alex Perryd2df9652019-03-23 22:53:04 -07002import {drawField, drawTarget} from './field';
Alex Perryd13750f2019-04-10 21:15:28 -07003import {drawRobot, Frame} from './robot';
Alex Perry554cec02019-03-23 20:15:12 -07004
Alex Perry554cec02019-03-23 20:15:12 -07005function main(): void {
6 const vis = new Visualiser();
7}
8
9class Visualiser {
10 private x = 3;
11 private y = 0;
12 private theta = 0;
13
Alex Perryd2df9652019-03-23 22:53:04 -070014 private drawLocked = false;
Alex Perryb2433462019-03-26 21:45:26 -070015 private targetLocked = false;
16 private targetX = 0;
17 private targetY = 0;
18 private targetTheta = 0;
Alex Perryd13750f2019-04-10 21:15:28 -070019 private cameraFrames : Frame[];
Alex Perryd2df9652019-03-23 22:53:04 -070020
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;
Alex Perry5b895622019-04-06 14:27:55 -070026 this.initWebSocket(server);
27 window.requestAnimationFrame(() => this.draw(ctx));
28 }
29
30 initWebSocket(server: string): void {
Alex Perry554cec02019-03-23 20:15:12 -070031 const socket = new WebSocket(`ws://${server}/ws`);
32 const reader = new FileReader();
Alex Perryd13750f2019-04-10 21:15:28 -070033 this.cameraFrames = [];
Alex Perry554cec02019-03-23 20:15:12 -070034 reader.addEventListener('loadend', (e) => {
35 const text = e.srcElement.result;
36 const j = JSON.parse(text);
James Kuszmauld6d37d12019-03-30 13:04:54 -070037 this.x = j.robotPose.x;
38 this.y = j.robotPose.y;
39 this.theta = j.robotPose.theta;
Alex Perryd2df9652019-03-23 22:53:04 -070040
Alex Perry5b895622019-04-06 14:27:55 -070041 if (j.lineFollowDebug) {
42 this.targetLocked =
43 j.lineFollowDebug.frozen && j.lineFollowDebug.haveTarget;
James Kuszmauld6d37d12019-03-30 13:04:54 -070044 this.targetX = j.lineFollowDebug.goalTarget.x;
45 this.targetY = j.lineFollowDebug.goalTarget.y;
46 this.targetTheta = j.lineFollowDebug.goalTarget.theta;
Alex Perryd2df9652019-03-23 22:53:04 -070047 }
Alex Perryd13750f2019-04-10 21:15:28 -070048 this.cameraFrames = j.cameraDebug;
Alex Perry554cec02019-03-23 20:15:12 -070049 });
50 socket.addEventListener('message', (event) => {
51 reader.readAsText(event.data);
52 });
Alex Perry5b895622019-04-06 14:27:55 -070053 socket.addEventListener('close', (event) => {
54 setTimeout(() => {
55 this.initWebSocket(server);
56 }, 1000);
57 });
Alex Perry554cec02019-03-23 20:15:12 -070058 }
59
Alex Perry5b895622019-04-06 14:27:55 -070060 reset(ctx: CanvasRenderingContext2D): void {
61 ctx.setTransform(1, 0, 0, 1, 0, 0);
Alex Perry554cec02019-03-23 20:15:12 -070062 const size = Math.min(window.innerHeight, window.innerWidth) * 0.98;
63 ctx.canvas.height = size;
64 ctx.canvas.width = size;
Alex Perry5b895622019-04-06 14:27:55 -070065 ctx.clearRect(0, 0, size, size);
Alex Perry554cec02019-03-23 20:15:12 -070066
Alex Perry5b895622019-04-06 14:27:55 -070067 ctx.translate(size / 2, size);
Alex Perry554cec02019-03-23 20:15:12 -070068 ctx.rotate(-Math.PI / 2);
69 ctx.scale(1, -1);
70 const M_TO_PX = size / FIELD_WIDTH
71 ctx.scale(M_TO_PX, M_TO_PX);
72 ctx.lineWidth = 1 / M_TO_PX;
Alex Perry554cec02019-03-23 20:15:12 -070073 }
74
Alex Perry5b895622019-04-06 14:27:55 -070075 draw(ctx: CanvasRenderingContext2D): void {
Alex Perry554cec02019-03-23 20:15:12 -070076 this.reset(ctx);
77
78 drawField(ctx);
Alex Perryd13750f2019-04-10 21:15:28 -070079 drawRobot(ctx, this.x, this.y, this.theta, this.cameraFrames);
James Kuszmaul94b3c172019-03-24 14:31:48 -070080 ctx.save();
81 ctx.lineWidth = 2.0 * ctx.lineWidth;
82 if (this.targetLocked) {
83 ctx.strokeStyle = 'blue';
84 } else {
Alex Perryd2df9652019-03-23 22:53:04 -070085 ctx.strokeStyle = 'red';
Alex Perryd2df9652019-03-23 22:53:04 -070086 }
James Kuszmaul94b3c172019-03-24 14:31:48 -070087 drawTarget(ctx, this.targetX, this.targetY, this.targetTheta);
88 ctx.restore();
Alex Perry554cec02019-03-23 20:15:12 -070089 window.requestAnimationFrame(() => this.draw(ctx));
90 }
91}
92
93main();