Add Drivetrain Position and CANPosition to Logging Site
Signed-off-by: Niko Sohmers <nikolai@sohmers.com>
Change-Id: I55def05b6d274ba54d07eec766cf12177135e1d9
diff --git a/frc971/control_loops/BUILD b/frc971/control_loops/BUILD
index 31b245b..c03a964 100644
--- a/frc971/control_loops/BUILD
+++ b/frc971/control_loops/BUILD
@@ -199,6 +199,13 @@
],
)
+flatbuffer_ts_library(
+ name = "can_falcon_ts_fbs",
+ srcs = [
+ "can_falcon.fbs",
+ ],
+)
+
flatbuffer_cc_library(
name = "can_falcon_fbs",
srcs = [
diff --git a/frc971/control_loops/drivetrain/BUILD b/frc971/control_loops/drivetrain/BUILD
index fdbc1dc..e631799 100644
--- a/frc971/control_loops/drivetrain/BUILD
+++ b/frc971/control_loops/drivetrain/BUILD
@@ -71,6 +71,19 @@
deps = ["//frc971/control_loops:control_loops_ts_fbs"],
)
+flatbuffer_ts_library(
+ name = "drivetrain_position_ts_fbs",
+ srcs = ["drivetrain_position.fbs"],
+ target_compatible_with = ["@platforms//os:linux"],
+)
+
+flatbuffer_ts_library(
+ name = "drivetrain_can_position_ts_fbs",
+ srcs = ["drivetrain_can_position.fbs"],
+ target_compatible_with = ["@platforms//os:linux"],
+ deps = ["//frc971/control_loops:can_falcon_ts_fbs"],
+)
+
genrule(
name = "drivetrain_goal_float_fbs_generated",
srcs = ["drivetrain_goal.fbs"],
diff --git a/y2023/www/BUILD b/y2023/www/BUILD
index 404247e..94a1a13 100644
--- a/y2023/www/BUILD
+++ b/y2023/www/BUILD
@@ -33,6 +33,8 @@
"//aos/network:web_proxy_ts_fbs",
"//aos/network/www:proxy",
"//frc971/control_loops:control_loops_ts_fbs",
+ "//frc971/control_loops/drivetrain:drivetrain_can_position_ts_fbs",
+ "//frc971/control_loops/drivetrain:drivetrain_position_ts_fbs",
"//frc971/control_loops/drivetrain:drivetrain_status_ts_fbs",
"//frc971/control_loops/drivetrain/localization:localizer_output_ts_fbs",
"//frc971/vision:target_map_ts_fbs",
diff --git a/y2023/www/field.html b/y2023/www/field.html
index 6bd2fc0..9c4cc5d 100644
--- a/y2023/www/field.html
+++ b/y2023/www/field.html
@@ -110,6 +110,43 @@
</div>
</div>
</div>
+ <table>
+ <tr>
+ <th colspan="2"> Drivetrain Encoder Positions </th>
+ </tr>
+ <tr>
+ <td> Left Encoder Position</td>
+ <td id="left_drivetrain_encoder"> NA </td>
+ </tr>
+ <tr>
+ <td> Right Encoder Position</td>
+ <td id="right_drivetrain_encoder"> NA </td>
+ </tr>
+ <tr>
+ <td> Right Front Falcon CAN Position</td>
+ <td id="falcon_right_front"> NA </td>
+ </tr>
+ <tr>
+ <td> Right Back Falcon CAN Position</td>
+ <td id="falcon_right_back"> NA </td>
+ </tr>
+ <tr>
+ <td> Right Under Falcon CAN Position</td>
+ <td id="falcon_right_under"> NA </td>
+ </tr>
+ <tr>
+ <td> Left Front Falcon CAN Position</td>
+ <td id="falcon_left_front"> NA </td>
+ </tr>
+ <tr>
+ <td> Left Back Falcon CAN Position</td>
+ <td id="falcon_left_back"> NA </td>
+ </tr>
+ <tr>
+ <td> Left Under Falcon CAN Position</td>
+ <td id="falcon_left_under"> NA </td>
+ </tr>
+ </table>
</body>
</html>
diff --git a/y2023/www/field_handler.ts b/y2023/www/field_handler.ts
index 6952a41..b478538 100644
--- a/y2023/www/field_handler.ts
+++ b/y2023/www/field_handler.ts
@@ -3,6 +3,8 @@
import {ServerStatistics, State as ConnectionState} from '../../aos/network/message_bridge_server_generated'
import {Connection} from '../../aos/network/www/proxy'
import {ZeroingError} from '../../frc971/control_loops/control_loops_generated'
+import {Position as DrivetrainPosition} from '../../frc971/control_loops/drivetrain/drivetrain_position_generated'
+import {CANPosition as DrivetrainCANPosition} from '../../frc971/control_loops/drivetrain/drivetrain_can_position_generated'
import {Status as DrivetrainStatus} from '../../frc971/control_loops/drivetrain/drivetrain_status_generated'
import {LocalizerOutput} from '../../frc971/control_loops/drivetrain/localization/localizer_output_generated'
import {TargetMap} from '../../frc971/vision/target_map_generated'
@@ -27,6 +29,8 @@
private canvas = document.createElement('canvas');
private localizerOutput: LocalizerOutput|null = null;
private drivetrainStatus: DrivetrainStatus|null = null;
+ private drivetrainPosition: DrivetrainPosition|null = null;
+ private drivetrainCANPosition: DrivetrainCANPosition|null = null;
private superstructureStatus: SuperstructureStatus|null = null;
// Image information indexed by timestamp (seconds since the epoch), so that
@@ -70,6 +74,24 @@
(document.getElementById('arm_distal') as HTMLElement);
private zeroingFaults: HTMLElement =
(document.getElementById('zeroing_faults') as HTMLElement);
+
+ private leftDrivetrainEncoder: HTMLElement =
+ (document.getElementById('left_drivetrain_encoder') as HTMLElement);
+ private rightDrivetrainEncoder: HTMLElement =
+ (document.getElementById('right_drivetrain_encoder') as HTMLElement);
+ private falconRightFrontPosition: HTMLElement =
+ (document.getElementById('falcon_right_front') as HTMLElement);
+ private falconRightBackPosition: HTMLElement =
+ (document.getElementById('falcon_right_back') as HTMLElement);
+ private falconRightUnderPosition: HTMLElement =
+ (document.getElementById('falcon_right_under') as HTMLElement);
+ private falconLeftFrontPosition: HTMLElement =
+ (document.getElementById('falcon_left_front') as HTMLElement);
+ private falconLeftBackPosition: HTMLElement =
+ (document.getElementById('falcon_left_back') as HTMLElement);
+ private falconLeftUnderPosition: HTMLElement =
+ (document.getElementById('falcon_left_under') as HTMLElement);
+
constructor(private readonly connection: Connection) {
(document.getElementById('field') as HTMLElement).appendChild(this.canvas);
@@ -155,6 +177,14 @@
this.handleDrivetrainStatus(data);
});
this.connection.addHandler(
+ '/drivetrain', 'frc971.control_loops.drivetrain.Position', (data) => {
+ this.handleDrivetrainPosition(data);
+ });
+ this.connection.addHandler(
+ '/drivetrain', 'y2023.control_loops.drivetrain.CANPosition', (data) => {
+ this.handleDrivetrainCANPosition(data);
+ });
+ this.connection.addHandler(
'/localizer', 'frc971.controls.LocalizerOutput', (data) => {
this.handleLocalizerOutput(data);
});
@@ -210,6 +240,16 @@
this.drivetrainStatus = DrivetrainStatus.getRootAsStatus(fbBuffer);
}
+ private handleDrivetrainPosition(data: Uint8Array): void {
+ const fbBuffer = new ByteBuffer(data);
+ this.drivetrainPosition = DrivetrainPosition.getRootAsPosition(fbBuffer);
+ }
+
+ private handleDrivetrainCANPosition(data: Uint8Array): void {
+ const fbBuffer = new ByteBuffer(data);
+ this.drivetrainCANPosition = DrivetrainCANPosition.getRootAsCANPosition(fbBuffer);
+ }
+
private handleSuperstructureStatus(data: Uint8Array): void {
const fbBuffer = new ByteBuffer(data);
this.superstructureStatus = SuperstructureStatus.getRootAsStatus(fbBuffer);
@@ -463,6 +503,34 @@
false);
}
+ if (this.drivetrainPosition) {
+ this.leftDrivetrainEncoder.innerHTML =
+ this.drivetrainPosition.leftEncoder().toString();
+
+ this.rightDrivetrainEncoder.innerHTML =
+ this.drivetrainPosition.rightEncoder().toString();
+ }
+
+ if (this.drivetrainCANPosition) {
+ this.falconRightFrontPosition.innerHTML = //TODO: (niko) Improve this so that falcons are not hard-coded
+ this.drivetrainCANPosition.falcons(0).position().toString();
+
+ this.falconRightBackPosition.innerHTML =
+ this.drivetrainCANPosition.falcons(1).position().toString();
+
+ this.falconRightUnderPosition.innerHTML =
+ this.drivetrainCANPosition.falcons(2).position().toString();
+
+ this.falconLeftFrontPosition.innerHTML =
+ this.drivetrainCANPosition.falcons(3).position().toString();
+
+ this.falconLeftBackPosition.innerHTML =
+ this.drivetrainCANPosition.falcons(4).position().toString();
+
+ this.falconLeftUnderPosition.innerHTML =
+ this.drivetrainCANPosition.falcons(5).position().toString();
+ }
+
if (this.localizerOutput) {
if (!this.localizerOutput.zeroed()) {
this.setZeroing(this.x);