blob: 3404bb8f6205141d7a5e04362abca3505d3ca097 [file] [log] [blame]
Campbell Crowleyc0cfb132015-12-30 20:58:02 -08001#ifndef FRC971_WPILIB_NEWROBOTBASE_H_
2#define FRC971_WPILIB_NEWROBOTBASE_H_
3
Alex Perrycb7da4b2019-08-28 19:35:56 -07004#include "aos/events/shm_event_loop.h"
Austin Schuhbd1fe9c2019-06-29 16:35:48 -07005#include "aos/init.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07006#include "aos/logging/logging.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -08007#include "frc971/wpilib/ahal/RobotBase.h"
Campbell Crowleyc0cfb132015-12-30 20:58:02 -08008
9namespace frc971 {
10namespace wpilib {
11
12class WPILibRobotBase {
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070013 public:
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080014 virtual void Run() = 0;
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070015
16 // Runs all the loops.
17 void RunLoops() {
18 // TODO(austin): SIGINT handler calling Exit on all the loops.
19 // TODO(austin): RegisterSignalHandler in ShmEventLoop for others.
20
21 ::std::vector<::std::thread> threads;
22 for (size_t i = 1; i < loops_.size(); ++i) {
23 threads.emplace_back([this, i]() { loops_[i]->Run(); });
24 }
25 // Save some memory and run the last one in the main thread.
26 loops_[0]->Run();
27
28 for (::std::thread &thread : threads) {
29 thread.join();
30 }
31
Austin Schuhae87e312020-08-01 16:15:01 -070032 LOG(ERROR) << "Exiting WPILibRobot";
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070033 }
34
35 protected:
36 // Adds a loop to the list of loops to run.
37 void AddLoop(::aos::ShmEventLoop *loop) { loops_.push_back(loop); }
38
39 private:
40 // List of the event loops to run in RunLoops.
41 ::std::vector<::aos::ShmEventLoop *> loops_;
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080042};
43
44#define AOS_ROBOT_CLASS(_ClassName_) \
45 START_ROBOT_CLASS(::frc971::wpilib::WPILibAdapterRobot<_ClassName_>)
46
47template <typename T>
Parker Schuhd3b7a8872018-02-19 16:42:27 -080048class WPILibAdapterRobot : public frc::RobotBase {
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080049 public:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070050 void StartCompetition() override {
James Kuszmaulad8a8082020-02-14 21:21:58 -080051 ::aos::InitNRT();
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070052
53 robot_.Run();
54 }
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080055
56 private:
57 T robot_;
58};
59
Brian Silverman4be7ffe2016-01-02 14:16:06 -080060} // namespace wpilib
61} // namespace frc971
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080062
Brian Silverman4be7ffe2016-01-02 14:16:06 -080063#endif // FRC971_WPILIB_NEWROBOTBASE_H_