/* * Supervises access to the control surfaces. */ #pragma once #include #include #include class Supervisor { public: enum class State : uint8_t { None, Initial, Remote, RemoteArmed, Pilot, Shutdown, }; Supervisor(); void init(); void set_remote(const uint16_t* channels, int count); void set_pilot(bool in_control, const uint16_t* channels, int count); State state() const { return state_; } void tick(); private: static const int LostThrottle = 8296; static const int ThrottleChannel = 2; static const int ModeChannel = 2; void update(const uint16_t* channels, int count); void shutdown(); void changed(); void check(); void change(State next); State state_; bool remote_ok_; bool pilot_ok_; bool pilot_allowed_; bool pilot_wants_; Switch mode_; Timer remote_seen_; Timer pilot_seen_; static const Switch::Fixed mode_fixed_; };