Convert aos over to flatbuffers
Everything builds, and all the tests pass. I suspect that some entries
are missing from the config files, but those will be found pretty
quickly on startup.
There is no logging or live introspection of queue messages.
Change-Id: I496ee01ed68f202c7851bed7e8786cee30df29f5
diff --git a/frc971/wpilib/ADIS16448.cc b/frc971/wpilib/ADIS16448.cc
index 4fc2c7b..f364d56 100644
--- a/frc971/wpilib/ADIS16448.cc
+++ b/frc971/wpilib/ADIS16448.cc
@@ -8,10 +8,9 @@
#include <chrono>
#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/robot_state/robot_state_generated.h"
#include "aos/time/time.h"
-#include "frc971/wpilib/imu.q.h"
+#include "frc971/wpilib/imu_generated.h"
#include "frc971/zeroing/averager.h"
namespace frc971 {
@@ -121,10 +120,9 @@
ADIS16448::ADIS16448(::aos::EventLoop *event_loop, frc::SPI::Port port,
frc::DigitalInput *dio1)
: event_loop_(event_loop),
- joystick_state_fetcher_(event_loop_->MakeFetcher<::aos::JoystickState>(
- ".aos.joystick_state")),
+ robot_state_fetcher_(event_loop_->MakeFetcher<::aos::RobotState>("/aos")),
imu_values_sender_(
- event_loop_->MakeSender<::frc971::IMUValues>(".frc971.imu_values")),
+ event_loop_->MakeSender<::frc971::IMUValues>("/drivetrain")),
spi_(new frc::SPI(port)),
dio1_(dio1) {
// 1MHz is the maximum supported for burst reads, but we
@@ -247,31 +245,35 @@
}
}
- auto message = imu_values_sender_.MakeMessage();
- message->fpga_timestamp = ::aos::time::DurationInSeconds(
- dio1_->ReadRisingTimestamp().time_since_epoch());
- message->monotonic_timestamp_ns =
- chrono::duration_cast<chrono::nanoseconds>(read_time.time_since_epoch())
- .count();
+ auto builder = imu_values_sender_.MakeBuilder();
- message->gyro_x =
+ IMUValues::Builder imu_builder = builder.MakeBuilder<IMUValues>();
+
+ imu_builder.add_fpga_timestamp(::aos::time::DurationInSeconds(
+ dio1_->ReadRisingTimestamp().time_since_epoch()));
+ imu_builder.add_monotonic_timestamp_ns(
+ chrono::duration_cast<chrono::nanoseconds>(read_time.time_since_epoch())
+ .count());
+
+ float gyro_x =
ConvertValue(&to_receive[4], kGyroLsbDegreeSecond * M_PI / 180.0);
- message->gyro_y =
+ float gyro_y =
ConvertValue(&to_receive[6], kGyroLsbDegreeSecond * M_PI / 180.0);
- message->gyro_z =
+ float gyro_z =
ConvertValue(&to_receive[8], kGyroLsbDegreeSecond * M_PI / 180.0);
// The first few seconds of samples are averaged and subtracted from
// subsequent samples for zeroing purposes.
if (!gyros_are_zeroed_) {
- average_gyro_x.AddData(message->gyro_x);
- average_gyro_y.AddData(message->gyro_y);
- average_gyro_z.AddData(message->gyro_z);
+ average_gyro_x.AddData(gyro_x);
+ average_gyro_y.AddData(gyro_y);
+ average_gyro_z.AddData(gyro_z);
if (average_gyro_x.full() && average_gyro_y.full() &&
average_gyro_z.full()) {
- joystick_state_fetcher_.Fetch();
- if (joystick_state_fetcher_.get() && joystick_state_fetcher_->enabled) {
+ robot_state_fetcher_.Fetch();
+ if (robot_state_fetcher_.get() &&
+ robot_state_fetcher_->outputs_enabled()) {
gyro_x_zeroed_offset_ = -average_gyro_x.GetAverage();
gyro_y_zeroed_offset_ = -average_gyro_y.GetAverage();
gyro_z_zeroed_offset_ = -average_gyro_z.GetAverage();
@@ -282,33 +284,36 @@
}
}
}
+ gyro_x += gyro_x_zeroed_offset_;
+ gyro_y += gyro_y_zeroed_offset_;
+ gyro_z += gyro_z_zeroed_offset_;
- message->gyro_x += gyro_x_zeroed_offset_;
- message->gyro_y += gyro_y_zeroed_offset_;
- message->gyro_z += gyro_z_zeroed_offset_;
+ imu_builder.add_gyro_x(gyro_x);
+ imu_builder.add_gyro_y(gyro_y);
+ imu_builder.add_gyro_z(gyro_z);
- message->accelerometer_x =
- ConvertValue(&to_receive[10], kAccelerometerLsbG);
- message->accelerometer_y =
- ConvertValue(&to_receive[12], kAccelerometerLsbG);
- message->accelerometer_z =
- ConvertValue(&to_receive[14], kAccelerometerLsbG);
+ imu_builder.add_accelerometer_x(
+ ConvertValue(&to_receive[10], kAccelerometerLsbG));
+ imu_builder.add_accelerometer_y(
+ ConvertValue(&to_receive[12], kAccelerometerLsbG));
+ imu_builder.add_accelerometer_z(
+ ConvertValue(&to_receive[14], kAccelerometerLsbG));
- message->magnetometer_x =
- ConvertValue(&to_receive[16], kMagnetometerLsbGauss);
- message->magnetometer_y =
- ConvertValue(&to_receive[18], kMagnetometerLsbGauss);
- message->magnetometer_z =
- ConvertValue(&to_receive[20], kMagnetometerLsbGauss);
+ imu_builder.add_magnetometer_x(
+ ConvertValue(&to_receive[16], kMagnetometerLsbGauss));
+ imu_builder.add_magnetometer_y(
+ ConvertValue(&to_receive[18], kMagnetometerLsbGauss));
+ imu_builder.add_magnetometer_z(
+ ConvertValue(&to_receive[20], kMagnetometerLsbGauss));
- message->barometer =
- ConvertValue(&to_receive[22], kBarometerLsbPascal, false);
+ imu_builder.add_barometer(
+ ConvertValue(&to_receive[22], kBarometerLsbPascal, false));
- message->temperature =
- ConvertValue(&to_receive[24], kTemperatureLsbDegree) + kTemperatureZero;
+ imu_builder.add_temperature(
+ ConvertValue(&to_receive[24], kTemperatureLsbDegree) +
+ kTemperatureZero);
- AOS_LOG_STRUCT(DEBUG, "sending", *message);
- if (!message.Send()) {
+ if (!builder.Send(imu_builder.Finish())) {
AOS_LOG(WARNING, "sending queue message failed\n");
}
diff --git a/frc971/wpilib/ADIS16448.h b/frc971/wpilib/ADIS16448.h
index 6aeac9d..ce950df 100644
--- a/frc971/wpilib/ADIS16448.h
+++ b/frc971/wpilib/ADIS16448.h
@@ -11,10 +11,10 @@
#include "frc971/wpilib/ahal/SPI.h"
#undef ERROR
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
#include "aos/logging/logging.h"
-#include "aos/robot_state/robot_state.q.h"
-#include "frc971/wpilib/imu.q.h"
+#include "aos/robot_state/robot_state_generated.h"
+#include "frc971/wpilib/imu_generated.h"
#include "frc971/wpilib/spi_rx_clearer.h"
namespace frc971 {
@@ -90,7 +90,7 @@
bool Initialize();
::aos::EventLoop *event_loop_;
- ::aos::Fetcher<::aos::JoystickState> joystick_state_fetcher_;
+ ::aos::Fetcher<::aos::RobotState> robot_state_fetcher_;
::aos::Sender<::frc971::IMUValues> imu_values_sender_;
// TODO(Brian): This object has no business owning these ones.
diff --git a/frc971/wpilib/BUILD b/frc971/wpilib/BUILD
index 870e655..b7fe837 100644
--- a/frc971/wpilib/BUILD
+++ b/frc971/wpilib/BUILD
@@ -1,11 +1,11 @@
package(default_visibility = ["//visibility:public"])
-load("//aos/build:queues.bzl", "queue_library")
+load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library")
-queue_library(
- name = "logging_queue",
+flatbuffer_cc_library(
+ name = "logging_fbs",
srcs = [
- "logging.q",
+ "logging.fbs",
],
)
@@ -107,10 +107,9 @@
deps = [
":gyro_interface",
"//aos:init",
- "//aos/events:event-loop",
+ "//aos/events:event_loop",
"//aos/logging",
- "//aos/logging:queue_logging",
- "//aos/robot_state",
+ "//aos/robot_state:robot_state_fbs",
"//aos/time",
"//aos/util:phased_loop",
"//frc971/queues:gyro",
@@ -118,10 +117,10 @@
],
)
-queue_library(
- name = "loop_output_handler_test_queue",
+flatbuffer_cc_library(
+ name = "loop_output_handler_test_fbs",
srcs = [
- "loop_output_handler_test.q",
+ "loop_output_handler_test.fbs",
],
)
@@ -135,8 +134,8 @@
],
deps = [
"//aos:init",
- "//aos/events:event-loop",
- "//aos/robot_state",
+ "//aos/events:event_loop",
+ "//aos/robot_state:robot_state_fbs",
"//aos/scoped:scoped_fd",
"//aos/time",
"//aos/util:log_interval",
@@ -150,9 +149,8 @@
],
deps = [
":loop_output_handler",
- ":loop_output_handler_test_queue",
+ ":loop_output_handler_test_fbs",
"//aos/events:simulated_event_loop",
- "//aos/logging:queue_logging",
"//aos/testing:googletest",
"//aos/testing:test_logging",
],
@@ -169,10 +167,10 @@
restricted_to = ["//tools:roborio"],
deps = [
"//aos:init",
- "//aos/events:shm-event-loop",
- "//aos/logging:queue_logging",
+ "//aos/events:shm_event_loop",
+ "//aos/input:driver_station_data",
"//aos/network:team_number",
- "//aos/robot_state",
+ "//aos/robot_state:joystick_state_fbs",
"//third_party:wpilib",
],
)
@@ -187,16 +185,16 @@
],
restricted_to = ["//tools:roborio"],
deps = [
- "//aos/logging:queue_logging",
- "//aos/robot_state",
+ "//aos/events:event_loop",
+ "//aos/robot_state:robot_state_fbs",
"//third_party:wpilib",
],
)
-queue_library(
+flatbuffer_cc_library(
name = "pdp_values",
srcs = [
- "pdp_values.q",
+ "pdp_values.fbs",
],
)
@@ -212,8 +210,7 @@
deps = [
":pdp_values",
"//aos:init",
- "//aos/events:event-loop",
- "//aos/logging:queue_logging",
+ "//aos/events:event_loop",
"//aos/util:phased_loop",
"//third_party:wpilib",
],
@@ -230,11 +227,12 @@
],
)
-queue_library(
- name = "imu_queue",
+flatbuffer_cc_library(
+ name = "imu_fbs",
srcs = [
- "imu.q",
+ "imu.fbs",
],
+ gen_reflections = 1,
)
cc_library(
@@ -247,13 +245,12 @@
],
restricted_to = ["//tools:roborio"],
deps = [
- ":imu_queue",
+ ":imu_fbs",
":spi_rx_clearer",
"//aos:init",
- "//aos/events:event-loop",
+ "//aos/events:event_loop",
"//aos/logging",
- "//aos/logging:queue_logging",
- "//aos/robot_state",
+ "//aos/robot_state:robot_state_fbs",
"//aos/time",
"//frc971/zeroing:averager",
"//third_party:wpilib",
@@ -302,11 +299,11 @@
":encoder_and_potentiometer",
":wpilib_interface",
"//aos:init",
- "//aos/events:event-loop",
+ "//aos/events:event_loop",
"//aos/stl_mutex",
"//aos/time",
"//aos/util:phased_loop",
- "//frc971/control_loops:queues",
+ "//frc971/control_loops:control_loops_fbs",
"//third_party:wpilib",
],
)
@@ -324,8 +321,7 @@
":loop_output_handler",
"//aos:math",
"//aos/logging",
- "//aos/logging:queue_logging",
- "//frc971/control_loops/drivetrain:drivetrain_queue",
+ "//frc971/control_loops/drivetrain:drivetrain_output_fbs",
"//third_party:wpilib",
],
)
diff --git a/frc971/wpilib/drivetrain_writer.cc b/frc971/wpilib/drivetrain_writer.cc
index 5c6feb8..0afbe20 100644
--- a/frc971/wpilib/drivetrain_writer.cc
+++ b/frc971/wpilib/drivetrain_writer.cc
@@ -2,8 +2,7 @@
#include "aos/commonmath.h"
#include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
#include "frc971/wpilib/ahal/PWM.h"
#include "frc971/wpilib/loop_output_handler.h"
@@ -11,19 +10,19 @@
namespace wpilib {
void DrivetrainWriter::Write(
- const ::frc971::control_loops::DrivetrainQueue::Output &output) {
- AOS_LOG_STRUCT(DEBUG, "will output", output);
- left_controller0_->SetSpeed(SafeSpeed(reversed_left0_, output.left_voltage));
+ const ::frc971::control_loops::drivetrain::Output &output) {
+ left_controller0_->SetSpeed(
+ SafeSpeed(reversed_left0_, output.left_voltage()));
right_controller0_->SetSpeed(
- SafeSpeed(reversed_right0_, output.right_voltage));
+ SafeSpeed(reversed_right0_, output.right_voltage()));
if (left_controller1_) {
left_controller1_->SetSpeed(
- SafeSpeed(reversed_left1_, output.left_voltage));
+ SafeSpeed(reversed_left1_, output.left_voltage()));
}
if (right_controller1_) {
right_controller1_->SetSpeed(
- SafeSpeed(reversed_right1_, output.right_voltage));
+ SafeSpeed(reversed_right1_, output.right_voltage()));
}
}
diff --git a/frc971/wpilib/drivetrain_writer.h b/frc971/wpilib/drivetrain_writer.h
index 9397230..9cf9a67 100644
--- a/frc971/wpilib/drivetrain_writer.h
+++ b/frc971/wpilib/drivetrain_writer.h
@@ -3,7 +3,7 @@
#include "aos/commonmath.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
#include "frc971/wpilib/ahal/PWM.h"
#include "frc971/wpilib/loop_output_handler.h"
@@ -11,12 +11,12 @@
namespace wpilib {
class DrivetrainWriter : public ::frc971::wpilib::LoopOutputHandler<
- ::frc971::control_loops::DrivetrainQueue::Output> {
+ ::frc971::control_loops::drivetrain::Output> {
public:
DrivetrainWriter(::aos::EventLoop *event_loop)
: ::frc971::wpilib::LoopOutputHandler<
- ::frc971::control_loops::DrivetrainQueue::Output>(
- event_loop, ".frc971.control_loops.drivetrain_queue.output") {}
+ ::frc971::control_loops::drivetrain::Output>(event_loop,
+ "/drivetrain") {}
void set_left_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
left_controller0_ = ::std::move(t);
@@ -40,12 +40,11 @@
private:
void Write(
- const ::frc971::control_loops::DrivetrainQueue::Output &output) override;
+ const ::frc971::control_loops::drivetrain::Output &output) override;
void Stop() override;
double SafeSpeed(bool reversed, double voltage) {
- return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -12.0, 12.0) /
- 12.0);
+ return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -12.0, 12.0) / 12.0);
}
::std::unique_ptr<::frc::PWM> left_controller0_, right_controller0_,
diff --git a/frc971/wpilib/encoder_and_potentiometer.cc b/frc971/wpilib/encoder_and_potentiometer.cc
index ac1a4a0..8173d20 100644
--- a/frc971/wpilib/encoder_and_potentiometer.cc
+++ b/frc971/wpilib/encoder_and_potentiometer.cc
@@ -1,7 +1,7 @@
#include "frc971/wpilib/encoder_and_potentiometer.h"
-#include "aos/init.h"
#include "aos/logging/logging.h"
+#include "aos/realtime.h"
namespace frc971 {
namespace wpilib {
diff --git a/frc971/wpilib/gyro_sender.cc b/frc971/wpilib/gyro_sender.cc
index 3a9f220..f5297c0 100644
--- a/frc971/wpilib/gyro_sender.cc
+++ b/frc971/wpilib/gyro_sender.cc
@@ -7,14 +7,13 @@
#include <chrono>
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
#include "aos/init.h"
#include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/robot_state/robot_state_generated.h"
#include "aos/time/time.h"
-#include "frc971/queues/gyro.q.h"
+#include "frc971/queues/gyro_generated.h"
#include "frc971/zeroing/averager.h"
namespace frc971 {
@@ -25,13 +24,12 @@
GyroSender::GyroSender(::aos::EventLoop *event_loop)
: event_loop_(event_loop),
- joystick_state_fetcher_(event_loop_->MakeFetcher<::aos::JoystickState>(
- ".aos.joystick_state")),
- uid_sender_(event_loop_->MakeSender<::frc971::sensors::Uid>(
- ".frc971.sensors.gyro_part_id")),
+ joystick_state_fetcher_(
+ event_loop_->MakeFetcher<aos::RobotState>("/aos")),
+ uid_sender_(event_loop_->MakeSender<frc971::sensors::Uid>("/drivetrain")),
gyro_reading_sender_(
- event_loop_->MakeSender<::frc971::sensors::GyroReading>(
- ".frc971.sensors.gyro_reading")) {
+ event_loop_->MakeSender<frc971::sensors::GyroReading>(
+ "/drivetrain")) {
AOS_PCHECK(
system("ps -ef | grep '\\[spi0\\]' | awk '{print $1}' | xargs chrt -f -p "
"33") == 0);
@@ -55,12 +53,9 @@
state_ = State::RUNNING;
AOS_LOG(INFO, "gyro initialized successfully\n");
- {
- auto message = uid_sender_.MakeMessage();
- message->uid = gyro_.ReadPartID();
- AOS_LOG_STRUCT(INFO, "gyro ID", *message);
- message.Send();
- }
+ auto builder = uid_sender_.MakeBuilder();
+ builder.Send(
+ frc971::sensors::CreateUid(*builder.fbb(), gyro_.ReadPartID()));
}
last_initialize_time_ = monotonic_now;
}
@@ -115,30 +110,31 @@
const double angle_rate = gyro_.ExtractAngle(result);
const double new_angle = angle_rate / static_cast<double>(kReadingRate);
- auto message = gyro_reading_sender_.MakeMessage();
+ auto builder = gyro_reading_sender_.MakeBuilder();
if (zeroed_) {
angle_ += (new_angle + zero_offset_) * iterations;
- message->angle = angle_;
- message->velocity = angle_rate + zero_offset_ * kReadingRate;
- AOS_LOG_STRUCT(DEBUG, "sending", *message);
- message.Send();
+ sensors::GyroReading::Builder gyro_builder =
+ builder.MakeBuilder<sensors::GyroReading>();
+ gyro_builder.add_angle(angle_);
+ gyro_builder.add_velocity(angle_rate + zero_offset_ * kReadingRate);
+ builder.Send(gyro_builder.Finish());
} else {
// TODO(brian): Don't break without 6 seconds of standing still before
// enabling. Ideas:
// Don't allow driving until we have at least some data?
// Some kind of indicator light?
{
- message->angle = new_angle;
- message->velocity = angle_rate;
- AOS_LOG_STRUCT(DEBUG, "collected while zeroing", *message);
- message->angle = 0.0;
- message->velocity = 0.0;
- message.Send();
+ sensors::GyroReading::Builder gyro_builder =
+ builder.MakeBuilder<sensors::GyroReading>();
+ gyro_builder.add_angle(0.0);
+ gyro_builder.add_velocity(0.0);
+ builder.Send(gyro_builder.Finish());
}
zeroing_data_.AddData(new_angle);
joystick_state_fetcher_.Fetch();
- if (joystick_state_fetcher_.get() && joystick_state_fetcher_->enabled &&
+ if (joystick_state_fetcher_.get() &&
+ joystick_state_fetcher_->outputs_enabled() &&
zeroing_data_.full()) {
zero_offset_ = -zeroing_data_.GetAverage();
AOS_LOG(INFO, "total zero offset %f\n", zero_offset_);
diff --git a/frc971/wpilib/gyro_sender.h b/frc971/wpilib/gyro_sender.h
index 3a43391..ec39264 100644
--- a/frc971/wpilib/gyro_sender.h
+++ b/frc971/wpilib/gyro_sender.h
@@ -5,9 +5,9 @@
#include <atomic>
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
-#include "frc971/queues/gyro.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
+#include "frc971/queues/gyro_generated.h"
#include "frc971/wpilib/gyro_interface.h"
#include "frc971/zeroing/averager.h"
@@ -30,7 +30,7 @@
void Loop(const int iterations);
::aos::EventLoop *event_loop_;
- ::aos::Fetcher<::aos::JoystickState> joystick_state_fetcher_;
+ ::aos::Fetcher<::aos::RobotState> joystick_state_fetcher_;
::aos::Sender<::frc971::sensors::Uid> uid_sender_;
::aos::Sender<::frc971::sensors::GyroReading> gyro_reading_sender_;
diff --git a/frc971/wpilib/imu.q b/frc971/wpilib/imu.fbs
similarity index 69%
rename from frc971/wpilib/imu.q
rename to frc971/wpilib/imu.fbs
index 4d9dec7..f48f31f 100644
--- a/frc971/wpilib/imu.q
+++ b/frc971/wpilib/imu.fbs
@@ -1,40 +1,42 @@
-package frc971;
+namespace frc971;
// Values returned from an IMU.
// Published on ".frc971.imu_values"
-message IMUValues {
+table IMUValues {
// Gyro readings in radians/second.
// Positive is clockwise looking at the connector.
- float gyro_x;
+ gyro_x:float;
// Positive is clockwise looking at the right side (from the connector).
- float gyro_y;
+ gyro_y:float;
// Positive is counterclockwise looking at the top.
- float gyro_z;
+ gyro_z:float;
// Accelerometer readings in Gs.
// Positive is up.
- float accelerometer_x;
+ accelerometer_x:float;
// Positive is away from the right side (from the connector).
- float accelerometer_y;
+ accelerometer_y:float;
// Positive is away from the connector.
- float accelerometer_z;
+ accelerometer_z:float;
// Magnetometer readings in gauss.
// Positive is up.
- float magnetometer_x;
+ magnetometer_x:float;
// Positive is away from the right side (from the connector).
- float magnetometer_y;
+ magnetometer_y:float;
// Positive is away from the connector.
- float magnetometer_z;
+ magnetometer_z:float;
// Barometer readings in pascals.
- float barometer;
+ barometer:float;
// Temperature readings in degrees Celsius.
- float temperature;
+ temperature:float;
// FPGA timestamp when the values were captured.
- double fpga_timestamp;
+ fpga_timestamp:double;
// CLOCK_MONOTONIC time in nanoseconds when the values were captured.
- int64_t monotonic_timestamp_ns;
-};
+ monotonic_timestamp_ns:long;
+}
+
+root_type IMUValues;
diff --git a/frc971/wpilib/interrupt_edge_counting.cc b/frc971/wpilib/interrupt_edge_counting.cc
index 546e64b..9b63b84 100644
--- a/frc971/wpilib/interrupt_edge_counting.cc
+++ b/frc971/wpilib/interrupt_edge_counting.cc
@@ -2,8 +2,8 @@
#include <chrono>
+#include "aos/realtime.h"
#include "aos/time/time.h"
-#include "aos/init.h"
namespace frc971 {
namespace wpilib {
diff --git a/frc971/wpilib/joystick_sender.cc b/frc971/wpilib/joystick_sender.cc
index 31ecc6c..2fec111 100644
--- a/frc971/wpilib/joystick_sender.cc
+++ b/frc971/wpilib/joystick_sender.cc
@@ -1,9 +1,10 @@
#include "frc971/wpilib/joystick_sender.h"
-#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
+#include "aos/input/driver_station_data.h"
+#include "aos/logging/logging.h"
#include "aos/network/team_number.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/realtime.h"
+#include "aos/robot_state/joystick_state_generated.h"
#include "frc971/wpilib/ahal/DriverStation.h"
#include "hal/HAL.h"
@@ -11,12 +12,13 @@
namespace frc971 {
namespace wpilib {
+using aos::Joystick;
+
JoystickSender::JoystickSender(::aos::EventLoop *event_loop)
: event_loop_(event_loop),
joystick_state_sender_(
- event_loop_->MakeSender<::aos::JoystickState>(".aos.joystick_state")),
+ event_loop_->MakeSender<::aos::JoystickState>("/aos")),
team_id_(::aos::network::GetTeamNumber()) {
-
event_loop_->SetRuntimeRealtimePriority(29);
event_loop_->OnRun([this]() {
@@ -27,36 +29,65 @@
// variable / mutex needs to get exposed all the way out or something).
while (event_loop_->is_running()) {
ds->RunIteration([&]() {
- auto new_state = joystick_state_sender_.MakeMessage();
+ auto builder = joystick_state_sender_.MakeBuilder();
HAL_MatchInfo match_info;
auto status = HAL_GetMatchInfo(&match_info);
- if (status == 0) {
- new_state->switch_left = match_info.gameSpecificMessage[0] == 'L' ||
- match_info.gameSpecificMessage[0] == 'l';
- new_state->scale_left = match_info.gameSpecificMessage[1] == 'L' ||
- match_info.gameSpecificMessage[1] == 'l';
- }
- new_state->test_mode = ds->IsTestMode();
- new_state->fms_attached = ds->IsFmsAttached();
- new_state->enabled = ds->IsEnabled();
- new_state->autonomous = ds->IsAutonomous();
- new_state->team_id = team_id_;
- new_state->fake = false;
+ std::array<flatbuffers::Offset<Joystick>,
+ aos::input::driver_station::JoystickFeature::kJoysticks>
+ joysticks;
- for (uint8_t i = 0;
- i < sizeof(new_state->joysticks) / sizeof(::aos::Joystick); ++i) {
- new_state->joysticks[i].buttons = ds->GetStickButtons(i);
- for (int j = 0; j < 6; ++j) {
- new_state->joysticks[i].axis[j] = ds->GetStickAxis(i, j);
+ for (size_t i = 0;
+ i < aos::input::driver_station::JoystickFeature::kJoysticks; ++i) {
+ std::array<double, aos::input::driver_station::JoystickAxis::kAxes>
+ axis;
+ for (int j = 0; j < aos::input::driver_station::JoystickAxis::kAxes;
+ ++j) {
+ axis[j] = ds->GetStickAxis(i, j);
}
+
+ flatbuffers::Offset<flatbuffers::Vector<double>> axis_offset =
+ builder.fbb()->CreateVector(axis.begin(), axis.size());
+
+ Joystick::Builder joystick_builder = builder.MakeBuilder<Joystick>();
+
+ joystick_builder.add_buttons(ds->GetStickButtons(i));
+
if (ds->GetStickPOVCount(i) > 0) {
- new_state->joysticks[i].pov = ds->GetStickPOV(i, 0);
+ joystick_builder.add_pov(ds->GetStickPOV(i, 0));
}
- AOS_LOG_STRUCT(DEBUG, "joystick_state", *new_state);
+
+ joystick_builder.add_axis(axis_offset);
+
+ joysticks[i] = joystick_builder.Finish();
}
- if (!new_state.Send()) {
+
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Joystick>>>
+ joysticks_offset = builder.fbb()->CreateVector(joysticks.begin(),
+ joysticks.size());
+
+ aos::JoystickState::Builder joystick_state_builder =
+ builder.MakeBuilder<aos::JoystickState>();
+
+ joystick_state_builder.add_joysticks(joysticks_offset);
+
+ if (status == 0) {
+ joystick_state_builder.add_switch_left(
+ match_info.gameSpecificMessage[0] == 'L' ||
+ match_info.gameSpecificMessage[0] == 'l');
+ joystick_state_builder.add_scale_left(
+ match_info.gameSpecificMessage[1] == 'L' ||
+ match_info.gameSpecificMessage[1] == 'l');
+ }
+
+ joystick_state_builder.add_test_mode(ds->IsTestMode());
+ joystick_state_builder.add_fms_attached(ds->IsFmsAttached());
+ joystick_state_builder.add_enabled(ds->IsEnabled());
+ joystick_state_builder.add_autonomous(ds->IsAutonomous());
+ joystick_state_builder.add_team_id(team_id_);
+
+ if (!builder.Send(joystick_state_builder.Finish())) {
AOS_LOG(WARNING, "sending joystick_state failed\n");
}
});
diff --git a/frc971/wpilib/joystick_sender.h b/frc971/wpilib/joystick_sender.h
index 34c6bf4..e2609e8 100644
--- a/frc971/wpilib/joystick_sender.h
+++ b/frc971/wpilib/joystick_sender.h
@@ -3,8 +3,8 @@
#include <atomic>
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/joystick_state_generated.h"
namespace frc971 {
namespace wpilib {
diff --git a/frc971/wpilib/logging.fbs b/frc971/wpilib/logging.fbs
new file mode 100644
index 0000000..473526f
--- /dev/null
+++ b/frc971/wpilib/logging.fbs
@@ -0,0 +1,7 @@
+namespace frc971.wpilib;
+
+// Information about the current state of the pneumatics system to log.
+table PneumaticsToLog {
+ compressor_on:bool;
+ read_solenoids:ubyte;
+}
diff --git a/frc971/wpilib/logging.q b/frc971/wpilib/logging.q
deleted file mode 100644
index a2b3799..0000000
--- a/frc971/wpilib/logging.q
+++ /dev/null
@@ -1,7 +0,0 @@
-package frc971.wpilib;
-
-// Information about the current state of the pneumatics system to log.
-struct PneumaticsToLog {
- bool compressor_on;
- uint8_t read_solenoids;
-};
diff --git a/frc971/wpilib/loop_output_handler.h b/frc971/wpilib/loop_output_handler.h
index 81baa68..a697339 100644
--- a/frc971/wpilib/loop_output_handler.h
+++ b/frc971/wpilib/loop_output_handler.h
@@ -4,8 +4,7 @@
#include <atomic>
#include <chrono>
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
#include "aos/scoped/scoped_fd.h"
#include "aos/time/time.h"
#include "aos/util/log_interval.h"
diff --git a/frc971/wpilib/loop_output_handler_test.cc b/frc971/wpilib/loop_output_handler_test.cc
index 12c3f96..d7ef8cd 100644
--- a/frc971/wpilib/loop_output_handler_test.cc
+++ b/frc971/wpilib/loop_output_handler_test.cc
@@ -4,12 +4,11 @@
#include "gtest/gtest.h"
-#include "aos/events/simulated-event-loop.h"
+#include "aos/events/simulated_event_loop.h"
#include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
#include "aos/testing/test_logging.h"
#include "aos/time/time.h"
-#include "frc971/wpilib/loop_output_handler_test.q.h"
+#include "frc971/wpilib/loop_output_handler_test_generated.h"
namespace frc971 {
namespace wpilib {
@@ -23,11 +22,26 @@
public:
LoopOutputHandlerTest()
: ::testing::Test(),
+ configuration_(aos::configuration::MergeConfiguration(
+ aos::FlatbufferDetachedBuffer<aos::Configuration>(
+ aos::JsonToFlatbuffer(
+ "{\n"
+ " \"channels\": [ \n"
+ " {\n"
+ " \"name\": \"/test\",\n"
+ " \"type\": "
+ "\"frc971.wpilib.LoopOutputHandlerTestOutput\"\n"
+ " }\n"
+ " ]\n"
+ "}\n",
+ aos::Configuration::MiniReflectTypeTable())))),
+ event_loop_factory_(&configuration_.message()),
loop_output_hander_event_loop_(event_loop_factory_.MakeEventLoop()),
test_event_loop_(event_loop_factory_.MakeEventLoop()) {
::aos::testing::EnableTestLogging();
}
+ aos::FlatbufferDetachedBuffer<aos::Configuration> configuration_;
::aos::SimulatedEventLoopFactory event_loop_factory_;
::std::unique_ptr<::aos::EventLoop> loop_output_hander_event_loop_;
::std::unique_ptr<::aos::EventLoop> test_event_loop_;
@@ -49,14 +63,14 @@
protected:
void Write(const LoopOutputHandlerTestOutput &output) override {
- AOS_LOG_STRUCT(DEBUG, "output", output);
+ LOG(INFO) << "output " << aos::FlatbufferToJson(&output);
++count_;
last_time_ = event_loop()->monotonic_now();
}
void Stop() override {
stop_time_ = event_loop()->monotonic_now();
- AOS_LOG(DEBUG, "Stopping\n");
+ LOG(INFO) << "Stopping";
}
private:
@@ -71,10 +85,10 @@
// Test that the watchdog calls Stop at the right time.
TEST_F(LoopOutputHandlerTest, WatchdogTest) {
TestLoopOutputHandler loop_output(loop_output_hander_event_loop_.get(),
- ".test");
+ "/test");
::aos::Sender<LoopOutputHandlerTestOutput> output_sender =
- test_event_loop_->MakeSender<LoopOutputHandlerTestOutput>(".test");
+ test_event_loop_->MakeSender<LoopOutputHandlerTestOutput>("/test");
const monotonic_clock::time_point start_time =
test_event_loop_->monotonic_now();
@@ -86,13 +100,15 @@
EXPECT_EQ(count, loop_output.count());
if (test_event_loop_->monotonic_now() <
start_time + chrono::seconds(1)) {
- auto output = output_sender.MakeMessage();
- output->voltage = 5.0;
- EXPECT_TRUE(output.Send());
+ auto builder = output_sender.MakeBuilder();
+ LoopOutputHandlerTestOutput::Builder output_builder =
+ builder.MakeBuilder<LoopOutputHandlerTestOutput>();
+ output_builder.add_voltage(5.0);
+ EXPECT_TRUE(builder.Send(output_builder.Finish()));
++count;
}
- AOS_LOG(INFO, "Ping\n");
+ LOG(INFO) << "Ping";
});
// Kick off the ping timer handler.
diff --git a/frc971/wpilib/loop_output_handler_test.fbs b/frc971/wpilib/loop_output_handler_test.fbs
new file mode 100644
index 0000000..6cb2cf1
--- /dev/null
+++ b/frc971/wpilib/loop_output_handler_test.fbs
@@ -0,0 +1,6 @@
+namespace frc971.wpilib;
+
+// Test output message.
+table LoopOutputHandlerTestOutput {
+ voltage:double;
+}
diff --git a/frc971/wpilib/loop_output_handler_test.q b/frc971/wpilib/loop_output_handler_test.q
deleted file mode 100644
index 81336ef..0000000
--- a/frc971/wpilib/loop_output_handler_test.q
+++ /dev/null
@@ -1,6 +0,0 @@
-package frc971.wpilib;
-
-// Test output message.
-message LoopOutputHandlerTestOutput {
- double voltage;
-};
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index aa85184..cd17d89 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -2,11 +2,10 @@
#include <chrono>
-#include "aos/events/event-loop.h"
-#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
+#include "aos/events/event_loop.h"
+#include "aos/logging/logging.h"
#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
-#include "frc971/wpilib/pdp_values.q.h"
+#include "frc971/wpilib/pdp_values_generated.h"
namespace frc971 {
namespace wpilib {
@@ -15,8 +14,7 @@
PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
: event_loop_(event_loop),
- pdp_values_sender_(
- event_loop_->MakeSender<::frc971::PDPValues>(".frc971.pdp_values")),
+ pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")),
pdp_(new frc::PowerDistributionPanel()) {
event_loop_->set_name("PDPFetcher");
@@ -31,15 +29,22 @@
if (iterations != 1) {
AOS_LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
}
- auto message = pdp_values_sender_.MakeMessage();
- message->voltage = pdp_->GetVoltage();
- message->temperature = pdp_->GetTemperature();
- message->power = pdp_->GetTotalPower();
- for (int i = 0; i < 16; ++i) {
- message->currents[i] = pdp_->GetCurrent(i);
+ std::array<double, 16> currents;
+ for (size_t i = 0; i < currents.size(); ++i) {
+ currents[i] = pdp_->GetCurrent(i);
}
- AOS_LOG_STRUCT(DEBUG, "got", *message);
- if (!message.Send()) {
+
+ auto builder = pdp_values_sender_.MakeBuilder();
+ flatbuffers::Offset<flatbuffers::Vector<double>> currents_offset =
+ builder.fbb()->CreateVector(currents.begin(), currents.size());
+
+ PDPValues::Builder pdp_builder = builder.MakeBuilder<PDPValues>();
+ pdp_builder.add_voltage(pdp_->GetVoltage());
+ pdp_builder.add_temperature(pdp_->GetTemperature());
+ pdp_builder.add_power(pdp_->GetTotalPower());
+ pdp_builder.add_currents(currents_offset);
+
+ if (!builder.Send(pdp_builder.Finish())) {
AOS_LOG(WARNING, "sending pdp values failed\n");
}
}
diff --git a/frc971/wpilib/pdp_fetcher.h b/frc971/wpilib/pdp_fetcher.h
index fd05d67..d034473 100644
--- a/frc971/wpilib/pdp_fetcher.h
+++ b/frc971/wpilib/pdp_fetcher.h
@@ -4,8 +4,8 @@
#include <atomic>
#include <memory>
-#include "aos/events/event-loop.h"
-#include "frc971/wpilib/pdp_values.q.h"
+#include "aos/events/event_loop.h"
+#include "frc971/wpilib/pdp_values_generated.h"
namespace frc {
class PowerDistributionPanel;
diff --git a/frc971/wpilib/pdp_values.fbs b/frc971/wpilib/pdp_values.fbs
new file mode 100644
index 0000000..4db2ade
--- /dev/null
+++ b/frc971/wpilib/pdp_values.fbs
@@ -0,0 +1,13 @@
+namespace frc971;
+
+// Values retrieved from the PDP.
+// Published on ".frc971.pdp_values"
+table PDPValues {
+ voltage:double;
+ temperature:double;
+ power:double;
+ // Array of 16 currents.
+ currents:[double];
+}
+
+root_type PDPValues;
diff --git a/frc971/wpilib/pdp_values.q b/frc971/wpilib/pdp_values.q
deleted file mode 100644
index 4c326ab..0000000
--- a/frc971/wpilib/pdp_values.q
+++ /dev/null
@@ -1,10 +0,0 @@
-package frc971;
-
-// Values retrieved from the PDP.
-// Published on ".frc971.pdp_values"
-message PDPValues {
- double voltage;
- double temperature;
- double power;
- double[16] currents;
-};
diff --git a/frc971/wpilib/sensor_reader.cc b/frc971/wpilib/sensor_reader.cc
index 63d3992..8610105 100644
--- a/frc971/wpilib/sensor_reader.cc
+++ b/frc971/wpilib/sensor_reader.cc
@@ -4,7 +4,6 @@
#include <unistd.h>
#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
#include "aos/util/compiler_memory_barrier.h"
#include "aos/util/phased_loop.h"
#include "frc971/wpilib/ahal/DigitalInput.h"
@@ -124,10 +123,8 @@
event_loop_->monotonic_now();
{
- auto new_state = robot_state_sender_.MakeMessage();
- ::frc971::wpilib::PopulateRobotState(new_state.get(), my_pid_);
- AOS_LOG_STRUCT(DEBUG, "robot_state", *new_state);
- new_state.Send();
+ auto builder = robot_state_sender_.MakeBuilder();
+ builder.Send(::frc971::wpilib::PopulateRobotState(&builder, my_pid_));
}
RunIteration();
if (dma_synchronizer_) {
diff --git a/frc971/wpilib/sensor_reader.h b/frc971/wpilib/sensor_reader.h
index 7a63444..ae1d580 100644
--- a/frc971/wpilib/sensor_reader.h
+++ b/frc971/wpilib/sensor_reader.h
@@ -4,11 +4,11 @@
#include <atomic>
#include <chrono>
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
#include "aos/stl_mutex/stl_mutex.h"
#include "aos/time/time.h"
-#include "frc971/control_loops/control_loops.q.h"
+#include "frc971/control_loops/control_loops_generated.h"
#include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
#include "frc971/wpilib/ahal/DigitalInput.h"
#include "frc971/wpilib/ahal/DriverStation.h"
@@ -63,7 +63,7 @@
// Copies a DMAEncoder to a IndexPosition with the correct unit and direction
// changes.
void CopyPosition(const ::frc971::wpilib::DMAEncoder &encoder,
- ::frc971::IndexPosition *position,
+ ::frc971::IndexPositionT *position,
double encoder_counts_per_revolution, double encoder_ratio,
bool reverse) {
const double multiplier = reverse ? -1.0 : 1.0;
@@ -82,7 +82,7 @@
// the correct unit and direction changes.
void CopyPosition(
const ::frc971::wpilib::AbsoluteEncoderAndPotentiometer &encoder,
- ::frc971::PotAndAbsolutePosition *position,
+ ::frc971::PotAndAbsolutePositionT *position,
double encoder_counts_per_revolution, double encoder_ratio,
::std::function<double(double)> potentiometer_translate, bool reverse,
double pot_offset) {
@@ -104,7 +104,7 @@
// Copies a DMAEdgeCounter to a HallEffectAndPosition with the correct unit
// and direction changes.
void CopyPosition(const ::frc971::wpilib::DMAEdgeCounter &counter,
- ::frc971::HallEffectAndPosition *position,
+ ::frc971::HallEffectAndPositionT *position,
double encoder_counts_per_revolution, double encoder_ratio,
bool reverse) {
const double multiplier = reverse ? -1.0 : 1.0;
@@ -129,7 +129,7 @@
// and direction changes.
void CopyPosition(
const ::frc971::wpilib::AbsoluteEncoder &encoder,
- ::frc971::AbsolutePosition *position,
+ ::frc971::AbsolutePositionT *position,
double encoder_counts_per_revolution, double encoder_ratio,
bool reverse) {
const double multiplier = reverse ? -1.0 : 1.0;
@@ -146,7 +146,7 @@
void CopyPosition(
const ::frc971::wpilib::DMAEncoderAndPotentiometer &encoder,
- ::frc971::PotAndIndexPosition *position,
+ ::frc971::PotAndIndexPositionT *position,
::std::function<double(int32_t)> encoder_translate,
::std::function<double(double)> potentiometer_translate, bool reverse,
double pot_offset) {
diff --git a/frc971/wpilib/wpilib_interface.cc b/frc971/wpilib/wpilib_interface.cc
index 4216e3b..8772af1 100644
--- a/frc971/wpilib/wpilib_interface.cc
+++ b/frc971/wpilib/wpilib_interface.cc
@@ -1,30 +1,38 @@
#include "frc971/wpilib/wpilib_interface.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/logging/logging.h"
+#include "aos/robot_state/robot_state_generated.h"
#include "hal/HAL.h"
namespace frc971 {
namespace wpilib {
-void PopulateRobotState(::aos::RobotState *robot_state, int32_t my_pid) {
+flatbuffers::Offset<aos::RobotState> PopulateRobotState(
+ aos::Sender<::aos::RobotState>::Builder *builder, int32_t my_pid) {
int32_t status = 0;
- robot_state->reader_pid = my_pid;
- robot_state->outputs_enabled = HAL_GetSystemActive(&status);
- robot_state->browned_out = HAL_GetBrownedOut(&status);
+ aos::RobotState::Builder robot_state_builder =
+ builder->MakeBuilder<aos::RobotState>();
- robot_state->is_3v3_active = HAL_GetUserActive3V3(&status);
- robot_state->is_5v_active = HAL_GetUserActive5V(&status);
- robot_state->voltage_3v3 = HAL_GetUserVoltage3V3(&status);
- robot_state->voltage_5v = HAL_GetUserVoltage5V(&status);
+ robot_state_builder.add_reader_pid(my_pid);
+ robot_state_builder.add_outputs_enabled(HAL_GetSystemActive(&status));
+ robot_state_builder.add_browned_out(HAL_GetBrownedOut(&status));
- robot_state->voltage_roborio_in = HAL_GetVinVoltage(&status);
- robot_state->voltage_battery = HAL_GetVinVoltage(&status);
+ robot_state_builder.add_is_3v3_active(HAL_GetUserActive3V3(&status));
+ robot_state_builder.add_is_5v_active(HAL_GetUserActive5V(&status));
+ robot_state_builder.add_voltage_3v3(HAL_GetUserVoltage3V3(&status));
+ robot_state_builder.add_voltage_5v(HAL_GetUserVoltage5V(&status));
+
+ robot_state_builder.add_voltage_roborio_in(HAL_GetVinVoltage(&status));
+ robot_state_builder.add_voltage_battery(HAL_GetVinVoltage(&status));
if (status != 0) {
AOS_LOG(FATAL, "Failed to get robot state: %d\n", status);
}
+
+ return robot_state_builder.Finish();
}
} // namespace wpilib
diff --git a/frc971/wpilib/wpilib_interface.h b/frc971/wpilib/wpilib_interface.h
index 5db852a..104ab84 100644
--- a/frc971/wpilib/wpilib_interface.h
+++ b/frc971/wpilib/wpilib_interface.h
@@ -3,13 +3,15 @@
#include <stdint.h>
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
namespace frc971 {
namespace wpilib {
// Sends out a message on ::aos::robot_state.
-void PopulateRobotState(::aos::RobotState *robot_state, int32_t my_pid);
+flatbuffers::Offset<aos::RobotState> PopulateRobotState(
+ aos::Sender<::aos::RobotState>::Builder *builder, int32_t my_pid);
} // namespace wpilib
} // namespace frc971
diff --git a/frc971/wpilib/wpilib_robot_base.h b/frc971/wpilib/wpilib_robot_base.h
index 86672c4..978c48e 100644
--- a/frc971/wpilib/wpilib_robot_base.h
+++ b/frc971/wpilib/wpilib_robot_base.h
@@ -1,8 +1,9 @@
#ifndef FRC971_WPILIB_NEWROBOTBASE_H_
#define FRC971_WPILIB_NEWROBOTBASE_H_
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
#include "aos/init.h"
+#include "aos/logging/logging.h"
#include "frc971/wpilib/ahal/RobotBase.h"
namespace frc971 {