blob: 6b9e5c5d068c4c1040803068b40879327d17e07f [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) {
Austin Schuhff70b982023-02-24 21:06:44 -080023 threads.emplace_back([this, i]() {
24 LOG(INFO) << "Starting " << loops_[i]->name() << " with priority "
25 << loops_[i]->runtime_realtime_priority();
26 loops_[i]->Run();
27 });
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070028 }
Austin Schuhff70b982023-02-24 21:06:44 -080029 LOG(INFO) << "Starting " << loops_[0]->name() << " with priority "
30 << loops_[0]->runtime_realtime_priority();
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070031 // Save some memory and run the last one in the main thread.
32 loops_[0]->Run();
33
34 for (::std::thread &thread : threads) {
35 thread.join();
36 }
37
Austin Schuhae87e312020-08-01 16:15:01 -070038 LOG(ERROR) << "Exiting WPILibRobot";
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070039 }
40
41 protected:
42 // Adds a loop to the list of loops to run.
43 void AddLoop(::aos::ShmEventLoop *loop) { loops_.push_back(loop); }
44
45 private:
46 // List of the event loops to run in RunLoops.
47 ::std::vector<::aos::ShmEventLoop *> loops_;
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080048};
49
50#define AOS_ROBOT_CLASS(_ClassName_) \
51 START_ROBOT_CLASS(::frc971::wpilib::WPILibAdapterRobot<_ClassName_>)
52
53template <typename T>
Parker Schuhd3b7a8872018-02-19 16:42:27 -080054class WPILibAdapterRobot : public frc::RobotBase {
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080055 public:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070056 void StartCompetition() override {
Austin Schuh2d7fc662021-01-23 15:37:51 -080057 PCHECK(setuid(0) == 0) << ": Failed to change user to root";
Austin Schuh094d09b2020-11-20 23:26:52 -080058 // Just allow overcommit memory like usual. Various processes map memory
59 // they will never use, and the roboRIO doesn't have enough RAM to handle
60 // it. This is in here instead of starter.sh because starter.sh doesn't run
61 // with permissions on a roboRIO.
Austin Schuh2d7fc662021-01-23 15:37:51 -080062 PCHECK(system("echo 0 > /proc/sys/vm/overcommit_memory") == 0);
Austin Schuh719d6802021-11-05 23:46:20 -070063 PCHECK(system("busybox ps -ef | grep '\\[ktimersoftd/0\\]' | awk '{print "
64 "$1}' | xargs chrt -f -p 70") == 0);
65 PCHECK(system("busybox ps -ef | grep '\\[ktimersoftd/1\\]' | awk '{print "
66 "$1}' | xargs chrt -f -p 70") == 0);
67 PCHECK(system("busybox ps -ef | grep '\\[irq/54-eth0\\]' | awk '{print "
68 "$1}' | xargs chrt -f -p 17") == 0);
Austin Schuh094d09b2020-11-20 23:26:52 -080069
70 // Configure throttling so we reserve 5% of the CPU for non-rt work.
71 // This makes things significantly more stable when work explodes.
72 // This is in here instead of starter.sh for the same reasons, starter is
73 // suid and runs as admin, so this actually works.
Austin Schuh2d7fc662021-01-23 15:37:51 -080074 PCHECK(system("/sbin/sysctl -w kernel.sched_rt_period_us=1000000") == 0);
75 PCHECK(system("/sbin/sysctl -w kernel.sched_rt_runtime_us=950000") == 0);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070076
77 robot_.Run();
78 }
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080079
80 private:
81 T robot_;
82};
83
Brian Silverman4be7ffe2016-01-02 14:16:06 -080084} // namespace wpilib
85} // namespace frc971
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080086
Brian Silverman4be7ffe2016-01-02 14:16:06 -080087#endif // FRC971_WPILIB_NEWROBOTBASE_H_