diff --git a/web_app/compass/index.html b/web_app/compass/index.html
index 82410c3..f6350c2 100644
--- a/web_app/compass/index.html
+++ b/web_app/compass/index.html
@@ -160,14 +160,17 @@
ctx.stroke();
}
+ // rotate everything relative to angleOffset, in radians
+ const angleOffset = -Math.round(currentPoint.angle / 5) * 5 * Math.PI / 180;
+
// Compass lines
for (let angle = 0; angle < 360; angle += 45) {
const rad = (angle * Math.PI) / 180;
ctx.beginPath();
ctx.moveTo(centerX, centerY);
- ctx.lineTo(centerX + radius * Math.cos(rad), centerY + radius * Math.sin(rad));
- ctx.strokeStyle = "#e0ffe0";
- ctx.lineWidth = 1;
+ ctx.lineTo(centerX + radius * Math.sin(rad + angleOffset), centerY - radius * Math.cos(rad + angleOffset));
+ ctx.strokeStyle = angle % 90 == 0 ? "white" : "green";
+ ctx.lineWidth = angle == 0 ? 3 : 1;
ctx.stroke();
}
@@ -180,9 +183,9 @@
if (length > radius) {
length = radius;
}
- console.log("Length: " + length);
- const x = centerX + length * Math.cos(rad);
- const y = centerY + length * Math.sin(rad);
+ //console.log("Length: " + length);
+ const x = centerX + length * Math.sin(rad + angleOffset);
+ const y = centerY - length * Math.cos(rad + angleOffset);
ctx.beginPath();
ctx.moveTo(centerX, centerY);
@@ -198,8 +201,8 @@
headingDisplayMAX.textContent = `${maxPoint.angle.toFixed(1)}°`;
rssiDisplayMAX.textContent = `${maxPoint.rssi.toFixed(1)} dBm`;
- const maxX = centerX + maxLength * Math.cos(maxRad);
- const maxY = centerY + maxLength * Math.sin(maxRad);
+ const maxX = centerX + maxLength * Math.sin(maxRad + angleOffset);
+ const maxY = centerY - maxLength * Math.cos(maxRad + angleOffset);
ctx.beginPath();
ctx.moveTo(centerX, centerY);
@@ -212,11 +215,11 @@
const arrowHeadLength = 10;
const arrowAngle = Math.PI / 6; // 30 degrees for the arrowhead
- const arrowX1 = maxX - arrowHeadLength * Math.cos(maxRad - arrowAngle);
- const arrowY1 = maxY - arrowHeadLength * Math.sin(maxRad - arrowAngle);
+ const arrowX1 = maxX - arrowHeadLength * Math.sin(maxRad - arrowAngle + angleOffset);
+ const arrowY1 = maxY + arrowHeadLength * Math.cos(maxRad - arrowAngle + angleOffset);
- const arrowX2 = maxX - arrowHeadLength * Math.cos(maxRad + arrowAngle);
- const arrowY2 = maxY - arrowHeadLength * Math.sin(maxRad + arrowAngle);
+ const arrowX2 = maxX - arrowHeadLength * Math.sin(maxRad + arrowAngle + angleOffset);
+ const arrowY2 = maxY + arrowHeadLength * Math.cos(maxRad + arrowAngle + angleOffset);
ctx.beginPath();
ctx.moveTo(maxX, maxY);
@@ -231,8 +234,8 @@
const currentRad = (currentPoint.angle * Math.PI) / 180;
const currentLength = ((120 + currentPoint.rssi) / (radius / 2)) * radius * 1.2;
- const currentX = centerX + currentLength * Math.cos(currentRad);
- const currentY = centerY + currentLength * Math.sin(currentRad);
+ const currentX = centerX + currentLength * Math.sin(currentRad + angleOffset);
+ const currentY = centerY - currentLength * Math.cos(currentRad + angleOffset);
ctx.beginPath();
ctx.moveTo(centerX, centerY);
@@ -240,6 +243,27 @@
ctx.strokeStyle = "yellow";
ctx.lineWidth = 3;
ctx.stroke();
+
+ const headingString = `${currentPoint.angle.toFixed(1)}°`;
+ const rssiString = `${currentPoint.rssi.toFixed(1)} dBm`;
+ ctx.fillStyle = "white";
+ ctx.font = "20px Arial";
+
+ const m = ctx.measureText(headingString);
+ ctx.fillText(headingString, centerX - m.width / 2, 30);
+ const m1 = ctx.measureText(rssiString);
+ ctx.fillText(rssiString, centerX - m1.width / 2, 60);
+
+ const maxHeadingString = `${maxPoint.angle.toFixed(1)}°`;
+ const maxRssiString = `${maxPoint.rssi.toFixed(1)} dBm`;
+ ctx.fillStyle = "blue";
+ ctx.font = "20px Arial";
+
+ const maxOffset = Math.max(m.width, m1.width) * ((currentPoint.angle - maxPoint.angle + 360) % 360 > 180 ? -1 : 1);
+ const m2 = ctx.measureText(maxHeadingString);
+ ctx.fillText(maxHeadingString, centerX - m2.width / 2 - maxOffset, 60);
+ const m3 = ctx.measureText(maxRssiString);
+ ctx.fillText(maxRssiString, centerX - m3.width / 2 - maxOffset, 90);
}
// Handle canvas hover for pointer change
@@ -332,7 +356,7 @@
return -90;
}
- return -Math.sin((Math.PI / 2) * fox / 35) * 80 - Math.random() * 3 - 10;
+ return Math.cos((Math.PI / 2) * fox / 35) * 40 - Math.random() * 3 - 90;
}
// Parse Bluetooth data
@@ -424,7 +448,7 @@
(function simulate(fox, prevAngle, prevRssi) {
if (!isSimulating) return;
- const angle = (prevAngle - 12 + Math.random() * 30) % 360; // bias slightly to scan on
+ const angle = (prevAngle - 3 + Math.random() * 7.5) % 360; // bias slightly to scan on
const rssi = simulateRssi(Math.abs(angle - fox));
const data = "RSSI_HEADING: '{H:" + angle + ",RSSI:" + rssi + "}'"