// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "SignalStrength.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class CellularMessage : public sys::DataMessage { public: enum class Type { Uninitialized, StateRequest, ///< cellular change state request, only for use by cellular Notification, ///< Async notification message AnswerIncomingCall, ///< Answer incoming call HangupCall, ///< Hang up call DismissCall, ///< Dismiss incoming call request Ringing, IncomingCall, CallerId, CallRequest, ///< Call request PowerStateChange, ///< Change power state of the module ListCurrentCalls, SimResponse, // Send to PIN window (show, error state, hide) SetFlightMode, PacketData, ///< for all PacketData messages GetOwnNumber, GetIMSI, GetNetworkInfo, StartOperatorsScan, OperatorsScanResult, NetworkInfoResult, SelectAntenna, SetScanMode, GetScanMode, GetScanModeResult, GetFirmwareVersion, ///< Asks for current firmware version GetFirmwareVersionResult, ///< Returns current firmware version GetChannel, ///< Asks for channel, requres chnnel name GetChannelResponse, ///< Returns channel (and it's name) GetCSQ, GetCREG, GetNWINFO, GetAntenna, TransmitDtmfTones, USSDRequest, TimeUpdated, SimState, MMIData, NewIncomingSMS, IncomingSMSNotification, RadioOnOff, SendSMS, CellularSetConnectionFrequency }; explicit CellularMessage(Type type) : sys::DataMessage(), type(type) {} const Type type; }; namespace cellular { class RingingMessage : public CellularMessage, public app::manager::actions::ConvertibleToAction { public: RingingMessage(const utils::PhoneNumber::View &number) : CellularMessage(Type::Ringing), number(number) {} RingingMessage(const utils::PhoneNumber &number) : CellularMessage(Type::Ringing), number(number.getView()) {} RingingMessage(const std::string &e164number) : CellularMessage(Type::Ringing), number(utils::PhoneNumber::parse(e164number)) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::HandleOutgoingCall, std::make_unique(number)); } utils::PhoneNumber::View number; }; class NotificationMessage : public CellularMessage { public: enum class Content { CallAborted, // user tried to call other device but receiving side dropped call or call unsuccessful CallActive, // call is in progress both if call was initialized by user and when user received incoming // call. NewIncomingSMS, // device received new sms from network. (what about sms delivery reports?). SignalStrengthUpdate, // update of the strength of the network's signal. NetworkStatusUpdate, // update of the status of the network PowerUpProcedureComplete, // modem without cmux on initialization complete (cold start || reset modem -> and // cold start) PowerDownDeregistering, // modem informed it has started to disconnect from network PowerDownDeregistered, // modem informed it has disconnected from network SMSDone, // SMS initialization finished NewIncomingUrc, // phone received new URC from network and we need to wake up modem and host Ring, // phone received Ring notification CallerID // phone received Caller Id notification }; // TODO check and fix all NotificationMessage constructors NotificationMessage() = delete; NotificationMessage(Content content, const std::string &data = "") : CellularMessage(Type::Notification), content(content), data(data) {} virtual ~NotificationMessage() = default; Content content; std::string data; }; class RequestCurrentOperatorNameMessage : public CellularMessage { public: explicit RequestCurrentOperatorNameMessage() : CellularMessage(Type::Notification) {} }; class SetOperatorAutoSelectMessage : public sys::DataMessage {}; class CurrentOperatorNameNotification : public CellularMessage { std::string currentOperatorName; public: explicit CurrentOperatorNameNotification(const std::string ¤tOperatorName) : CellularMessage(Type::Notification), currentOperatorName(currentOperatorName) {} std::string getCurrentOperatorName() const { return currentOperatorName; } }; class SetOperatorMessage : public sys::DataMessage { at::response::cops::CopsMode mode; at::response::cops::NameFormat format; const std::string name; public: explicit SetOperatorMessage(at::response::cops::CopsMode mode, at::response::cops::NameFormat format, std::string name) : mode(mode), format(format), name(std::move(name)) {} at::response::cops::CopsMode getMode() const noexcept { return mode; } at::response::cops::NameFormat getFormat() const noexcept { return format; } std::string getName() const { return name; } }; class PowerStateChange : public CellularMessage { public: explicit PowerStateChange(cellular::service::State::PowerState new_state) : CellularMessage(Type::PowerStateChange), newState(new_state) {} cellular::service::State::PowerState getNewState() const noexcept { return newState; } private: cellular::service::State::PowerState newState; }; class StartOperatorsScanMessage : public CellularMessage { bool fullInfo = false; public: explicit StartOperatorsScanMessage(bool fullInfoList = false) : CellularMessage(Type::StartOperatorsScan), fullInfo(fullInfoList) {} bool getFullInfo() const noexcept { return fullInfo; } }; class TimeNotificationMessage : public CellularMessage { private: std::optional time; std::optional timeZoneGmtOff; std::optional timeZoneString; public: TimeNotificationMessage() = delete; explicit TimeNotificationMessage(struct tm time, long int timeZoneGmtOff, std::string timeZoneString) : CellularMessage(Type::TimeUpdated), time(time), timeZoneGmtOff(timeZoneGmtOff), timeZoneString(timeZoneString) {} explicit TimeNotificationMessage(long int timeZoneGmtOff, std::string timeZoneString) : CellularMessage(Type::TimeUpdated), timeZoneGmtOff(timeZoneGmtOff), timeZoneString(timeZoneString) {} explicit TimeNotificationMessage(struct tm time) : CellularMessage(Type::TimeUpdated), time(time) {} std::optional getTime(void) { return time; } std::optional getTimeZoneOffset(void) { return timeZoneGmtOff; } std::optional getTimeZoneString(void) { return timeZoneString; } }; class USSDMessage : public CellularMessage { public: enum class RequestType { pullSessionRequest, pushSessionRequest, abortSession }; USSDMessage() = delete; USSDMessage(RequestType requestType, const std::string &data = "") : CellularMessage(Type::USSDRequest), type(requestType), data(data) {} RequestType type; std::string data; }; class RequestMessage : public CellularMessage { public: RequestMessage(Type type, std::string data = "") : CellularMessage(type), data(data) {} std::string data; }; class DtmfRequestMessage : public CellularMessage { DTMFCode code; public: DtmfRequestMessage(DTMFCode code) : CellularMessage(Type::TransmitDtmfTones), code(code) {} DTMFCode getDTMFCode() const { return code; } }; class AntennaRequestMessage : public CellularMessage { public: AntennaRequestMessage() : CellularMessage(Type::SelectAntenna) {} bsp::cellular::antenna antenna; }; class CallRequestMessage : public CellularMessage { public: CallRequestMessage(const utils::PhoneNumber::View &number, cellular::api::CallMode callMode = cellular::api::CallMode::Regular) : CellularMessage(Type::CallRequest), number(number), callMode(callMode) {} utils::PhoneNumber::View number; cellular::api::CallMode callMode = cellular::api::CallMode::Regular; }; class SmsNoSimRequestMessage : public CellularMessage, public app::manager::actions::ConvertibleToAction { public: SmsNoSimRequestMessage() : CellularMessage{Type::Uninitialized} {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::SmsRejectNoSim, std::make_unique()); } }; class GetChannelMessage : public CellularMessage { public: explicit GetChannelMessage(CellularMux::Channel dataChannel = CellularMux::Channel::None) : CellularMessage{Type::GetChannel}, dataChannel(dataChannel) {} CellularMux::Channel dataChannel; }; class GetChannelResponseMessage : public CellularMessage { public: explicit GetChannelResponseMessage(DLCChannel *dataChannelPtr = nullptr) : CellularMessage{Type::GetChannelResponse}, dataChannelPtr(dataChannelPtr) {} DLCChannel *dataChannelPtr; }; class ResponseMessage : public sys::ResponseMessage { public: ResponseMessage(bool retCode, std::string retdata = std::string(), CellularMessage::Type responseTo = CellularMessage::Type::Uninitialized) : sys::ResponseMessage(sys::ReturnCodes::Success), retCode(retCode), data(retdata), cellResponse(responseTo){}; ResponseMessage(bool retCode, CellularMessage::Type responseTo) : sys::ResponseMessage(sys::ReturnCodes::Success), retCode(retCode), cellResponse(responseTo){}; virtual ~ResponseMessage(){}; bool retCode; std::string data; CellularMessage::Type cellResponse; }; class GetOwnNumberResponseMessage : public ResponseMessage { public: GetOwnNumberResponseMessage(bool retCode, std::string number = std::string()) : ResponseMessage(retCode, std::move(number)) {} }; class AntennaResponseMessage : public ResponseMessage { public: AntennaResponseMessage(bool retCode, bsp::cellular::antenna retAntenna, CellularMessage::Type responseTo) : ResponseMessage(retCode, responseTo), antenna(retAntenna) {} bsp::cellular::antenna antenna; }; class MMIResult : public CellularMessage { protected: app::manager::actions::MMIResultParams params; explicit MMIResult(app::manager::actions::MMIResultParams::MMIResult result, std::shared_ptr customResult = nullptr) : CellularMessage(Type::MMIData), params(result, std::move(customResult)) {} }; class MMIResultMessage : public MMIResult, public app::manager::actions::ConvertibleToAction { public: explicit MMIResultMessage(app::manager::actions::MMIResultParams::MMIResult result, std::shared_ptr customResult = nullptr) : MMIResult(result, std::move(customResult)) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::ShowMMIResult, std::make_unique(params)); } }; class MMIDataMessage : public CellularMessage { protected: app::manager::actions::MMIParams params; public: explicit MMIDataMessage(std::string mmiData) : CellularMessage(Type::MMIData), params(mmiData) {} }; class MMIResponseMessage : public MMIDataMessage, public app::manager::actions::ConvertibleToAction { public: explicit MMIResponseMessage(std::string mmiData) : MMIDataMessage(std::move(mmiData)) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::ShowMMIResponse, std::make_unique(params)); } }; class MMIPushMessage : public MMIDataMessage, public app::manager::actions::ConvertibleToAction { public: explicit MMIPushMessage(std::string mmiData) : MMIDataMessage(std::move(mmiData)) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::ShowMMIPush, std::make_unique(params)); } }; class SetOperatorAutoSelectResponse : public ResponseMessage { public: explicit SetOperatorAutoSelectResponse(bool ret) : ResponseMessage(ret) {} }; class SetOperatorResponse : public ResponseMessage { public: explicit SetOperatorResponse(bool ret) : ResponseMessage(ret) {} }; class CheckIfStartAllowedMessage : public sys::DataMessage {}; class NoSimNotification : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: NoSimNotification(std::string data) : ResponseMessage(false, data) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::NoSimNotification, std::make_unique(data)); } }; class NotAnEmergencyNotification : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: NotAnEmergencyNotification(std::string data) : ResponseMessage(false, data) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::NotAnEmergencyNotification, std::make_unique(data)); } }; class NoNetworkConenctionNotification : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: NoNetworkConenctionNotification() : ResponseMessage(false) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::NoNetworkConnectionNotification, std::make_unique()); } }; class CallRequestGeneralError : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: using Error = app::manager::actions::CallRequestGeneralErrorParams::Error; using ErrorType = app::manager::actions::CallRequestGeneralErrorParams::Error::Type; CallRequestGeneralError(ErrorType errorType) : ResponseMessage(false), error{errorType} {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::CallRequestGeneralErrorNotification, std::make_unique(error)); } private: Error error; }; class NewIncomingSMSMessage : public CellularMessage { public: explicit NewIncomingSMSMessage(const std::string &data) : CellularMessage(Type::NewIncomingSMS), notificationData(data) {} auto getData() const -> std::string { return notificationData; } private: std::string notificationData; }; class IncomingSMSNotificationMessage : public CellularMessage { public: IncomingSMSNotificationMessage() : CellularMessage(Type::IncomingSMSNotification) {} }; class AnswerIncomingCallMessage : public CellularMessage { public: AnswerIncomingCallMessage() : CellularMessage(Type::AnswerIncomingCall) {} }; class HangupCallMessage : public CellularMessage { public: HangupCallMessage() : CellularMessage(Type::HangupCall) {} }; class DismissCallMessage : public CellularMessage { public: DismissCallMessage() : CellularMessage(Type::DismissCall) {} }; class ListCallsMessage : public CellularMessage { public: ListCallsMessage() : CellularMessage(Type::ListCurrentCalls) {} }; class GetIMSIMessage : public CellularMessage { public: GetIMSIMessage() : CellularMessage(Type::GetIMSI) {} }; class GetOwnNumberMessage : public CellularMessage { public: GetOwnNumberMessage() : CellularMessage(Type::GetOwnNumber) {} }; class GetNetworkInfoMessage : public CellularMessage { public: GetNetworkInfoMessage() : CellularMessage(Type::GetNetworkInfo) {} }; class SetScanModeMessage : public CellularMessage { public: SetScanModeMessage(const std::string &mode) : CellularMessage(Type::SetScanMode), data(mode) {} std::string data; }; class GetScanModeMessage : public CellularMessage { public: GetScanModeMessage() : CellularMessage(Type::GetScanMode) {} }; class GetFirmwareVersionMessage : public CellularMessage { public: GetFirmwareVersionMessage() : CellularMessage(Type::GetFirmwareVersion) {} }; class GetCsqMessage : public CellularMessage { public: GetCsqMessage() : CellularMessage(Type::GetCSQ) {} }; class GetCregMessage : public CellularMessage { public: GetCregMessage() : CellularMessage(Type::GetCREG) {} }; class GetNwinfoMessage : public CellularMessage { public: GetNwinfoMessage() : CellularMessage(Type::GetNWINFO) {} }; class GetAntennaMessage : public CellularMessage { public: GetAntennaMessage() : CellularMessage(Type::GetAntenna) {} }; class SetFlightModeMessage : public CellularMessage { public: explicit SetFlightModeMessage(bool flightModeOn) : CellularMessage(Type::SetFlightMode), flightModeOn(flightModeOn) {} bool flightModeOn; }; class SetConnectionFrequencyMessage : public CellularMessage { public: explicit SetConnectionFrequencyMessage(const uint8_t &connectionFrequency) : CellularMessage(Type::CellularSetConnectionFrequency), connectionFrequency(connectionFrequency) {} auto getConnectionFrequency() const noexcept -> uint8_t { return connectionFrequency; } private: uint8_t connectionFrequency; }; class PowerUpProcedureCompleteNotification : public NotificationMessage { public: explicit PowerUpProcedureCompleteNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::PowerUpProcedureComplete, data) {} }; class PowerDownDeregisteringNotification : public NotificationMessage { public: explicit PowerDownDeregisteringNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::PowerDownDeregistering, data) {} }; class PowerDownDeregisteredNotification : public NotificationMessage { public: explicit PowerDownDeregisteredNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::PowerDownDeregistered, data) {} }; class NewIncomingSMSNotification : public NotificationMessage { public: explicit NewIncomingSMSNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::NewIncomingSMS, data) {} }; class SmsDoneNotification : public NotificationMessage { public: explicit SmsDoneNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::SMSDone, data) {} }; class SignalStrengthUpdateNotification : public NotificationMessage { public: explicit SignalStrengthUpdateNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::SignalStrengthUpdate, data) {} }; class NetworkStatusUpdateNotification : public NotificationMessage { public: explicit NetworkStatusUpdateNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::NetworkStatusUpdate, data) {} }; class UrcIncomingNotification : public NotificationMessage { public: explicit UrcIncomingNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::NewIncomingUrc, data) {} }; class SetRadioOnOffMessage : public CellularMessage { public: explicit SetRadioOnOffMessage(bool radioOnOff) : CellularMessage(Type::RadioOnOff), radioOnOff(radioOnOff) {} auto getRadioOnOf() -> bool { return radioOnOff; } private: bool radioOnOff; }; class SMSRejectedByOfflineNotification : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: SMSRejectedByOfflineNotification() : ResponseMessage(false) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::SMSRejectedByOfflineNotification, std::make_unique()); } }; class CallRejectedByOfflineNotification : public ResponseMessage, public app::manager::actions::ConvertibleToAction { public: CallRejectedByOfflineNotification() : ResponseMessage(false) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::CallRejectedByOfflineNotification, std::make_unique()); } }; class RingNotification : public NotificationMessage { public: RingNotification() : NotificationMessage(NotificationMessage::Content::Ring) {} }; class CallerIdNotification : public NotificationMessage { public: explicit CallerIdNotification(const utils::PhoneNumber::View &number) : NotificationMessage(NotificationMessage::Content::Ring), number(number) {} explicit CallerIdNotification(const utils::PhoneNumber &number) : NotificationMessage(NotificationMessage::Content::Ring), number(number.getView()) {} explicit CallerIdNotification(const std::string &e164number) : NotificationMessage(NotificationMessage::Content::Ring), number(utils::PhoneNumber::parse(e164number)) {} auto getNubmer() const -> utils::PhoneNumber::View { return number; } private: utils::PhoneNumber::View number; }; class StateChange : public CellularMessage { public: const service::State::ST request; StateChange(const service::State::ST request = service::State::ST::Failed) : CellularMessage(Type::StateRequest), request(request) {} }; class RawCommandRespAsync : public CellularMessage { public: RawCommandRespAsync(Type type) : CellularMessage(type){}; virtual ~RawCommandRespAsync() = default; std::vector data; }; class GetSimContactsRequest : public sys::DataMessage { public: GetSimContactsRequest() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; struct SimContact { std::string name; std::string number; SimContact(const std::string &name, const std::string &number) : name(name), number(number) {} }; class GetSimContactsResponse : public sys::ResponseMessage { public: explicit GetSimContactsResponse(std::shared_ptr> contacts) : sys::ResponseMessage(sys::ReturnCodes::Success), contacts(contacts) {} GetSimContactsResponse() : sys::ResponseMessage(sys::ReturnCodes::Failure) {} auto getContacts() -> std::shared_ptr> { return contacts; } private: std::shared_ptr> contacts; }; class GetImeiRequest : public sys::DataMessage { public: GetImeiRequest() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; class GetImeiResponse : public sys::ResponseMessage { public: explicit GetImeiResponse(std::shared_ptr imei) : sys::ResponseMessage(sys::ReturnCodes::Success), imei(imei) {} GetImeiResponse() : sys::ResponseMessage(sys::ReturnCodes::Failure) {} auto getImei() -> std::shared_ptr { return imei; } private: std::shared_ptr imei; }; class SimInsertedNotication : public sys::DataMessage { public: explicit SimInsertedNotication(at::SimInsertedStatus status) : sys::DataMessage(MessageType::MessageTypeUninitialized), insertedStatus(status) {} auto getInsertedStatus() -> at::SimInsertedStatus { return insertedStatus; } private: at::SimInsertedStatus insertedStatus; }; class RetryPhoneModeChangeRequest : public sys::DataMessage { public: RetryPhoneModeChangeRequest() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; class URCCounterMessage : public sys::DataMessage { public: explicit URCCounterMessage(const uint32_t urcCounter) : sys::DataMessage(MessageType::MessageTypeUninitialized), urcCounter(urcCounter){}; auto getCounter() { return urcCounter; } private: uint32_t urcCounter; }; class RetrySwitchCSQMode : public sys::DataMessage { public: enum class Mode { PermanentReporting, HybridReporting, HybridPolling }; explicit RetrySwitchCSQMode(Mode newMode) : sys::DataMessage(MessageType::MessageTypeUninitialized), mode(newMode){}; auto getNewMode() { return mode; }; private: Mode mode; }; class RetryGetCSQ : public sys::DataMessage { public: RetryGetCSQ() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; class CallAudioEventRequest : public sys::DataMessage { public: enum class EventType { Mute, Unmute, LoudspeakerOn, LoudspeakerOff }; explicit CallAudioEventRequest(EventType event) : sys::DataMessage(MessageType::MessageTypeUninitialized), eventType(event){}; EventType eventType; }; class IncomingCallMessage : public CellularMessage { public: IncomingCallMessage() : CellularMessage(Type::IncomingCall) {} }; class CallStartedNotification : public sys::DataMessage { public: CallStartedNotification(utils::PhoneNumber phoneNumber, bool isIncoming) : sys::DataMessage(MessageType::MessageTypeUninitialized), phoneNumber(phoneNumber), isIncoming(isIncoming){}; utils::PhoneNumber getNumber() { return phoneNumber; }; bool isCallIncoming() { return isIncoming; }; private: utils::PhoneNumber phoneNumber; bool isIncoming; }; class CallEndedNotification : public sys::DataMessage { public: explicit CallEndedNotification() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; class CallAbortedNotification : public NotificationMessage { public: explicit CallAbortedNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::CallAborted, data) {} }; class CallActiveNotification : public NotificationMessage, public app::manager::actions::ConvertibleToAction { public: explicit CallActiveNotification(const std::string &data = "") : NotificationMessage(NotificationMessage::Content::CallActive, data) {} [[nodiscard]] auto toAction() const -> std::unique_ptr { return std::make_unique( sender, app::manager::actions::ActivateCall, std::make_unique()); } }; class CallDurationNotification : public sys::DataMessage { public: explicit CallDurationNotification(const time_t duration) : sys::DataMessage(MessageType::MessageTypeUninitialized), callDuration(duration){}; time_t callDuration; }; class CallerIdMessage : public CellularMessage { public: CallerIdMessage(const utils::PhoneNumber::View &number) : CellularMessage(Type::CallerId), number(number) {} CallerIdMessage(const utils::PhoneNumber &number) : CellularMessage(Type::CallerId), number(number.getView()) {} CallerIdMessage(const std::string &e164number) : CellularMessage(Type::CallerId), number(utils::PhoneNumber::parse(e164number)) {} utils::PhoneNumber::View number; }; class CallOutgoingAccepted : public sys::DataMessage { public: explicit CallOutgoingAccepted() : sys::DataMessage(MessageType::MessageTypeUninitialized){}; }; class IsCallActive : public sys::DataMessage {}; struct IsCallActiveResponse : public sys::ResponseMessage { explicit IsCallActiveResponse(bool active) : active{active} {} const bool active = false; }; class GetVolteStateRequest : public sys::DataMessage {}; struct GetVolteStateResponse : public sys::ResponseMessage { VolteState volteState; explicit GetVolteStateResponse(VolteState volteState) : volteState(volteState) {} }; struct VolteStateNotification : public sys::DataMessage { VolteState volteState; explicit VolteStateNotification(VolteState volteState) : sys::DataMessage(MessageType::MessageTypeUninitialized), volteState(volteState) {} }; struct SwitchVolteOnOffRequest : public sys::DataMessage { bool enable = false; explicit SwitchVolteOnOffRequest(bool enable) : DataMessage(MessageType::MessageTypeUninitialized), enable(enable) {} }; } // namespace cellular