blob: bcde100b904106adf7ca3a782fd25e20d8ae0ec4 [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 {
Austin Schuh2d7fc662021-01-23 15:37:51 -080051 PCHECK(setuid(0) == 0) << ": Failed to change user to root";
Austin Schuh094d09b2020-11-20 23:26:52 -080052 // Just allow overcommit memory like usual. Various processes map memory
53 // they will never use, and the roboRIO doesn't have enough RAM to handle
54 // it. This is in here instead of starter.sh because starter.sh doesn't run
55 // with permissions on a roboRIO.
Austin Schuh2d7fc662021-01-23 15:37:51 -080056 PCHECK(system("echo 0 > /proc/sys/vm/overcommit_memory") == 0);
Austin Schuh719d6802021-11-05 23:46:20 -070057 PCHECK(system("busybox ps -ef | grep '\\[ktimersoftd/0\\]' | awk '{print "
58 "$1}' | xargs chrt -f -p 70") == 0);
59 PCHECK(system("busybox ps -ef | grep '\\[ktimersoftd/1\\]' | awk '{print "
60 "$1}' | xargs chrt -f -p 70") == 0);
61 PCHECK(system("busybox ps -ef | grep '\\[irq/54-eth0\\]' | awk '{print "
62 "$1}' | xargs chrt -f -p 17") == 0);
Austin Schuh094d09b2020-11-20 23:26:52 -080063
64 // Configure throttling so we reserve 5% of the CPU for non-rt work.
65 // This makes things significantly more stable when work explodes.
66 // This is in here instead of starter.sh for the same reasons, starter is
67 // suid and runs as admin, so this actually works.
Austin Schuh2d7fc662021-01-23 15:37:51 -080068 PCHECK(system("/sbin/sysctl -w kernel.sched_rt_period_us=1000000") == 0);
69 PCHECK(system("/sbin/sysctl -w kernel.sched_rt_runtime_us=950000") == 0);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070070
71 robot_.Run();
72 }
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080073
74 private:
75 T robot_;
76};
77
Brian Silverman4be7ffe2016-01-02 14:16:06 -080078} // namespace wpilib
79} // namespace frc971
Campbell Crowleyc0cfb132015-12-30 20:58:02 -080080
Brian Silverman4be7ffe2016-01-02 14:16:06 -080081#endif // FRC971_WPILIB_NEWROBOTBASE_H_