#pragma once #include #include #include #include "app.h" #include "compass.h" #include "dialog_model.h" #include "line_editor.h" #include "list_model.h" #include "places.h" #include "services/gnss_service.h" #include "services/storage_service.h" #include "settings.h" namespace roro { // GNSS (see docs/milestones/M2.md, Q59): the Position view, the Sky view with every satellite in // view placed by direction and elevation, and the Compass (issue #16, docs/milestones/H1.md): a // rose that turns with the device, and the way to a Place the user marked. Tab goes round them. class GnssApp : public App { public: GnssApp(GnssService& gnss, const Settings& settings, StorageService& storage) : gnss_(gnss), settings_(settings), storage_(storage) {} void onEnter() override; bool onKey(const KeyEvent& e) override; bool textEntryActive() const override { return mode_ == Mode::Name; } void update(uint32_t nowMs) override; void draw(Canvas& c) override; void help(std::vector& out) const override; const char* helpTitle() const override; bool badge() const override { return gnss_.tracking(); } private: enum class View { Position, Sky, Compass }; // Over the Compass: the list of Places, and the name of a new one. enum class Mode { View, Places, Name }; void drawPosition(Canvas& c); void drawSky(Canvas& c); void drawCompass(Canvas& c); void drawPlaces(Canvas& c); bool compassKey(const KeyEvent& e); bool placesKey(const KeyEvent& e); void readImu(); void loadPlaces(); void savePlaces(); void mark(); void aimAtSun(); void say(const std::string& text); GnssService& gnss_; const Settings& settings_; StorageService& storage_; View view_ = View::Position; Mode mode_ = Mode::View; uint32_t lastDrawMs_ = 0; std::string refusal_; // why something couldn't be done, or that it was: shown for a few seconds uint32_t refusalMs_ = 0; gnss::HeadingFilter heading_; uint32_t imuUs_ = 0, imuMs_ = 0; int courseSecond_ = -1; // the Fix whose course was last given to the filter float shownHeading_ = -1, shownTiltX_ = 0, shownTiltY_ = 0; std::vector places_; bool placesLoaded_ = false; int target_ = -1; // in places_; -1: none ListModel list_{6}; LineEditor name_{gnss::kPlaceNameBytes}; std::unique_ptr dialog_; }; } // namespace roro