fixes to make the new sensor stuff work
diff --git a/aos/common/sensors/sensor_receiver-tmpl.h b/aos/common/sensors/sensor_receiver-tmpl.h
index 9d37b8c..9cd0b3b 100644
--- a/aos/common/sensors/sensor_receiver-tmpl.h
+++ b/aos/common/sensors/sensor_receiver-tmpl.h
@@ -108,6 +108,7 @@
bool SensorReceiver<Values>::ReceiveData() {
int old_count = data_.count;
DoReceiveData();
+ data_.NetworkToHost();
if (data_.count < 0) {
LOG(FATAL, "data count overflowed. currently %"PRId32"\n", data_.count);
}
diff --git a/aos/common/sensors/sensor_sink.h b/aos/common/sensors/sensor_sink.h
index 81bc491..760f90e 100644
--- a/aos/common/sensors/sensor_sink.h
+++ b/aos/common/sensors/sensor_sink.h
@@ -12,7 +12,7 @@
public:
virtual ~SensorSinkInterface() {}
- void Process(SensorData<Values> *data);
+ virtual void Process(SensorData<Values> *data) = 0;
};
} // namespace sensors
diff --git a/aos/common/sensors/sensors.h b/aos/common/sensors/sensors.h
index 06f5253..6d533b4 100644
--- a/aos/common/sensors/sensors.h
+++ b/aos/common/sensors/sensors.h
@@ -2,6 +2,7 @@
#define AOS_COMMON_SENSORS_SENSORS_H_
#include "aos/common/time.h"
+#include "aos/common/byteorder.h"
#include "aos/common/control_loop/ControlLoop.h"
@@ -40,6 +41,10 @@
Values values;
// Starts at 0 and goes up.
int32_t count;
+
+ void NetworkToHost() {
+ count = ntoh(count);
+ }
} __attribute__((packed));
} // namespace sensors
diff --git a/aos/common/time.h b/aos/common/time.h
index c081e09..418d087 100644
--- a/aos/common/time.h
+++ b/aos/common/time.h
@@ -115,8 +115,9 @@
return ToNSec() / static_cast<int64_t>(kNSecInSec / sysClkRateGet());
}
// Constructs a Time representing ticks.
+ // TODO(brians): test this one too
static Time InTicks(int ticks) {
- return Time::InSeconds(ticks * sysClkRateGet());
+ return Time::InSeconds(static_cast<double>(ticks) / sysClkRateGet());
}
#endif
diff --git a/aos/crio/controls/ControlsManager.cpp b/aos/crio/controls/ControlsManager.cpp
index 906394f..762e8b6 100644
--- a/aos/crio/controls/ControlsManager.cpp
+++ b/aos/crio/controls/ControlsManager.cpp
@@ -13,6 +13,10 @@
namespace aos {
namespace crio {
+ControlsManager::ControlsManager() {
+ printf("aos::ControlsManager constructor done\n");
+}
+
// Everything gets an explicit Start call here before calling all of the init
// functions because it means that all static variables will be initialized
// before anything actually starts running. It also means that everything will
@@ -35,6 +39,9 @@
aos_call_init_functions();
LOG(INFO, "initialized\n");
+ CreateObjects();
+ LOG(INFO, "created objects\n");
+
RegisterControlLoops();
LOG(INFO, "registered control loops\n");
diff --git a/aos/crio/controls/ControlsManager.h b/aos/crio/controls/ControlsManager.h
index aa78587..5971f46 100644
--- a/aos/crio/controls/ControlsManager.h
+++ b/aos/crio/controls/ControlsManager.h
@@ -8,6 +8,8 @@
// to be passed to START_ROBOT_CLASS (a WPILib macro) to start all of the code.
class ControlsManager : public RobotBase {
public:
+ ControlsManager();
+
virtual void StartCompetition();
static ControlsManager &GetInstance() {
@@ -20,6 +22,7 @@
private:
// Hooks that subclasses have to implement to do the correct things at the
// correct times.
+ virtual void CreateObjects() = 0;
virtual void RegisterControlLoops() = 0;
virtual void StartSensorBroadcasters() = 0;
};
diff --git a/aos/crio/motor_server/crio_control_loop_runner-tmpl.h b/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
index 4bb448f..b4b1c40 100644
--- a/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
+++ b/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
@@ -11,7 +11,9 @@
sensors::SensorBroadcaster<Values> *broadcaster,
sensors::SensorUnpackerInterface<Values> *unpacker)
: broadcaster_(broadcaster),
- unpacker_(unpacker) {}
+ unpacker_(unpacker) {
+ broadcaster_->RegisterControlLoopRunner(this);
+}
template<class Values>
void CRIOControlLoopRunner<Values>::AddControlLoop(
@@ -22,7 +24,7 @@
template<class Values>
void CRIOControlLoopRunner<Values>::Process(sensors::SensorData<Values> *data) {
- unpacker_->UnpackFrom(&data.values);
+ unpacker_->UnpackFrom(&data->values);
for (auto it = loops_.begin(); it != loops_.end(); ++it) {
(*it)->Iterate();
}
diff --git a/aos/crio/shared_libs/interrupt_bridge-tmpl.h b/aos/crio/shared_libs/interrupt_bridge-tmpl.h
index ef53dce..4550e7f 100644
--- a/aos/crio/shared_libs/interrupt_bridge-tmpl.h
+++ b/aos/crio/shared_libs/interrupt_bridge-tmpl.h
@@ -80,7 +80,7 @@
typename InterruptBridge<T>::Handler handler,
T *param, int priority)
: InterruptBridge<T>(handler, param, priority),
- period_(-1, -1) {}
+ period_(0, 0) {}
template<typename T>
void PeriodicNotifier<T>::StartPeriodic(time::Time period) {
diff --git a/frc971/crio/main.cc b/frc971/crio/main.cc
index 649946b..85e2d45 100644
--- a/frc971/crio/main.cc
+++ b/frc971/crio/main.cc
@@ -1,3 +1,5 @@
+#include "aos/common/libstdc++/memory"
+
#include "aos/crio/controls/ControlsManager.h"
#include "aos/crio/motor_server/crio_control_loop_runner.h"
#include "aos/common/sensors/sensor_broadcaster.h"
@@ -6,26 +8,34 @@
#include "frc971/input/sensor_packer.h"
#include "frc971/input/sensor_unpacker.h"
+using ::std::unique_ptr;
+
namespace frc971 {
class MyRobot : public ::aos::crio::ControlsManager {
public:
- MyRobot()
- : broadcaster_(&packer_),
- control_loop_runner_(&broadcaster_, &unpacker_) {}
+ MyRobot() {}
+
+ virtual void CreateObjects() {
+ packer_ = unique_ptr< ::frc971::SensorPacker>( new ::frc971::SensorPacker());
+ unpacker_ = unique_ptr< ::frc971::SensorUnpacker>( new ::frc971::SensorUnpacker());
+ broadcaster_ = unique_ptr< ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>>(
+ new ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>(packer_.get()));
+ control_loop_runner_ = unique_ptr< ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>>(new ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>(broadcaster_.get(), unpacker_.get()));
+ }
virtual void RegisterControlLoops() {
- //control_loop_runner_.AddControlLoop(&shooter_);
+ //control_loop_runner_->AddControlLoop(&shooter_);
}
virtual void StartSensorBroadcasters() {
- broadcaster_.Start();
+ broadcaster_->Start();
}
- ::frc971::SensorPacker packer_;
- ::frc971::SensorUnpacker unpacker_;
- ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values> broadcaster_;
- ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>
+ unique_ptr< ::frc971::SensorPacker> packer_;
+ unique_ptr< ::frc971::SensorUnpacker> unpacker_;
+ unique_ptr< ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>> broadcaster_;
+ unique_ptr< ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>>
control_loop_runner_;
};