// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #pragma once // static lifetime read only cache for (hw) states to not poll // right now it serves data from: // - battery // - gsm SIM tray // it's not meant to serve as polling interface - rather to serve data #include #include #include namespace cpp_freertos { class MutexStandard; } // namespace cpp_freertos namespace Store { struct Battery { private: static bool updated; public: enum class LevelState : std::uint8_t { Normal, Shutdown, CriticalCharging, CriticalNotCharging } levelState = LevelState::Normal; enum class State : std::uint8_t { Discharging, Charging, ChargingDone, PluggedNotCharging, } state = State::Discharging; enum class Temperature : std::uint8_t { Normal, TooLow, TooHigh, Unknown } temperature = Temperature::Normal; unsigned level = 0; /// @brief Returns const reference to Battery instance, used to read battery state /// @return const Battery& static const Battery &get(); /// @brief Returns reference to Battery instance, used to change battery state /// @return Battery& static Battery &modify(); static void setUpdated(); static bool takeUpdated(); }; struct Usb { public: enum class Status : bool { NotConfigured, Configured } status = Status::NotConfigured; /// @brief Returns const reference to Usb instance, used to read Usb status /// @return const Usb& static const Usb &get(); /// @brief Returns reference to Usb instance, used to change Usb status /// @return Usb& static Usb &modify(); }; enum class RssiBar : size_t { zero = 0, one = 1, two = 2, three = 3, four = 4, noOfSupportedBars }; struct SignalStrength { int rssi = 0; int rssidBm = 0; RssiBar rssiBar = RssiBar::zero; }; enum class Tethering { Off, On }; struct Network { enum class Status { NotRegistered, RegisteredHomeNetwork, Searching, RegistrationDenied, Unknown, RegisteredRoaming } status = Status::NotRegistered; enum class AccessTechnology { Gsm = 0, Utran = 2, GsmWEgprs, UtranWHsdpa, UtranWHsupa, UtranWHsdpaAndWHsupa, EUtran, Cdma = 100, Wcdma, Unknown = 255 } accessTechnology = AccessTechnology::Unknown; inline bool operator==(const Network &rhs) { return this->status == rhs.status && this->accessTechnology == rhs.accessTechnology; } inline bool operator!=(const Network &rhs) { return !(*this == rhs); } }; struct GSM { private: GSM() = default; SignalStrength signalStrength; Network network; std::string networkOperatorName; Tethering tethering; static cpp_freertos::MutexStandard mutex; public: GSM(const GSM &) = delete; GSM &operator=(const GSM &) = delete; enum class Tray { OUT, IN } tray = Tray::IN; /// tray - tray actual status which is visible right now on screen /// selected - tray selection settings settable sim tray enum class SIM { SIM1 = static_cast(hal::cellular::SimSlot::SIM1), SIM2 = static_cast(hal::cellular::SimSlot::SIM2), SIM_NEED_PIN, SIM_NEED_PUK, SIM_LOCKED, SIM_FAIL, SIM_UNKNOWN, NONE, } sim = SIM::SIM_UNKNOWN; enum class SelectedSIM { SIM1 = static_cast(SIM::SIM1), SIM2 = static_cast(SIM::SIM2), NONE, } selected = SelectedSIM::SIM1; bool simCardInserted(); /// state of modem enum class Modem { OFF, /// modem is off - it's not working ON_INITIALIZING, /// modem is set to on, just started - initialization not done yet ON_NEED_SIMFLOW, /// modem is on, initialized, no SIM initialization yet ON_INITIALIZED, /// modem is on, and it's fully initialized } modem = Modem::OFF; void setSignalStrength(const SignalStrength &newSignalStrength); SignalStrength getSignalStrength() const; void setNetwork(const Network &network); Network getNetwork() const; void setNetworkOperatorName(const std::string &newNetworkOperatorName); std::string getNetworkOperatorName() const; void setTethering(const Tethering &newTethering); Tethering getTethering() const; static GSM *get(); }; }; // namespace Store