~aleteoryx/muditaos

993235b7b70d5b5965089330a729776f22451e6f — Kuba Kleczkowski 5 years ago 8f07972
[EGD-5740] Change cellular message handlers

Phone modes dependent message handlig is moved to separated
handlers.
M module-apps/application-call/ApplicationCall.cpp => module-apps/application-call/ApplicationCall.cpp +18 -16
@@ 86,7 86,7 @@ namespace app
        manager::Controller::sendAction(this, manager::actions::Call, std::make_unique<app::CallActiveData>());
    }

    void ApplicationCall::CallerIdHandler(const CellularCallMessage *const msg)
    void ApplicationCall::CallerIdHandler(const CellularCallerIdMessage *const msg)
    {
        if (getState() == call::State::IDLE) {
            if (callerIdTimer) {


@@ 98,7 98,7 @@ namespace app
        }
    }

    void ApplicationCall::IncomingCallHandler(const CellularCallMessage *const msg)
    void ApplicationCall::IncomingCallHandler(const CellularIncominCallMessage *const msg)
    {
        if (getState() == call::State::IDLE) {
            constexpr sys::ms callerIdTimeout = 1000;


@@ 114,7 114,7 @@ namespace app
        }
    }

    void ApplicationCall::RingingHandler(const CellularCallMessage *const msg)
    void ApplicationCall::RingingHandler(const CellularRingingMessage *const msg)
    {
        manager::Controller::sendAction(
            this, manager::actions::Call, std::make_unique<app::ExecuteCallData>(msg->number));


@@ 149,21 149,23 @@ namespace app

            return std::make_shared<sys::ResponseMessage>();
        }
        else if (msgl->messageType == MessageType::CellularCall) {
            auto *msg = dynamic_cast<CellularCallMessage *>(msgl);

        else if (msgl->messageType == MessageType::CellularRinging) {
            auto msg = dynamic_cast<CellularRingingMessage *>(msgl);
            assert(msg != nullptr);
            RingingHandler(msg);
        }

            switch (msg->type) {
            case CellularCallMessage::Type::Ringing: {
                RingingHandler(msg);
            } break;
            case CellularCallMessage::Type::IncomingCall: {
                IncomingCallHandler(msg);
            } break;
            case CellularCallMessage::Type::CallerId: {
                CallerIdHandler(msg);
            } break;
            }
        else if (msgl->messageType == MessageType::CellularIncomingCall) {
            auto msg = dynamic_cast<CellularIncominCallMessage *>(msgl);
            assert(msg != nullptr);
            IncomingCallHandler(msg);
        }

        else if (msgl->messageType == MessageType::CellularCallerId) {
            auto msg = dynamic_cast<CellularCallerIdMessage *>(msgl);
            assert(msg != nullptr);
            CallerIdHandler(msg);
        }

        if (resp != nullptr) {

M module-apps/application-call/ApplicationCall.hpp => module-apps/application-call/ApplicationCall.hpp +3 -3
@@ 70,9 70,9 @@ namespace app
      private:
        void CallAbortHandler();
        void CallActiveHandler();
        void IncomingCallHandler(const CellularCallMessage *const msg);
        void CallerIdHandler(const CellularCallMessage *const msg);
        void RingingHandler(const CellularCallMessage *const msg);
        void IncomingCallHandler(const CellularIncominCallMessage *const msg);
        void CallerIdHandler(const CellularCallerIdMessage *const msg);
        void RingingHandler(const CellularRingingMessage *const msg);

        std::unique_ptr<sys::Timer> callerIdTimer;


M module-services/service-antenna/ServiceAntenna.cpp => module-services/service-antenna/ServiceAntenna.cpp +8 -5
@@ 117,11 117,14 @@ sys::MessagePointer ServiceAntenna::DataReceivedHandler(sys::DataMessage *msgl, 
        handled = true;
        break;
    }
    case MessageType::CellularCall: {
        auto msg = dynamic_cast<CellularCallMessage *>(msgl);
        if (msg != nullptr) {
            AntennaServiceAPI::LockRequest(this, antenna::lockState::locked);
        }
    case MessageType::CellularIncomingCall: {
        AntennaServiceAPI::LockRequest(this, antenna::lockState::locked);
    } break;
    case MessageType::CellularRinging: {
        AntennaServiceAPI::LockRequest(this, antenna::lockState::locked);
    } break;
    case MessageType::CellularHangupCall: {
        AntennaServiceAPI::LockRequest(this, antenna::lockState::unlocked);
    } break;
    case MessageType::CellularStateRequest: {
        auto msg = dynamic_cast<cellular::StateChange *>(msgl);

M module-services/service-cellular/CellularRequestHandler.cpp => module-services/service-cellular/CellularRequestHandler.cpp +2 -3
@@ 67,9 67,8 @@ void CellularRequestHandler::handle(cellular::CallRequest &request, at::Result &
    // activate call state timer
    cellular.callStateTimer->reload();
    // Propagate "Ringing" notification into system
    cellular.bus.sendMulticast(
        std::make_shared<CellularCallMessage>(CellularCallMessage::Type::Ringing, request.getNumber()),
        sys::BusChannel::ServiceCellularNotifications);
    cellular.bus.sendMulticast(std::make_shared<CellularRingingMessage>(request.getNumber()),
                               sys::BusChannel::ServiceCellularNotifications);
    request.setHandled(true);
}


M module-services/service-cellular/CellularServiceAPI.cpp => module-services/service-cellular/CellularServiceAPI.cpp +2 -2
@@ 36,14 36,14 @@ bool CellularServiceAPI::DialEmergencyNumber(sys::Service *serv, const utils::Ph

bool CellularServiceAPI::AnswerIncomingCall(sys::Service *serv)
{
    auto msg = std::make_shared<CellularRequestMessage>(MessageType::CellularAnswerIncomingCall);
    auto msg = std::make_shared<CellularAnswerIncomingCallMessage>();

    return serv->bus.sendUnicast(msg, ServiceCellular::serviceName);
}

bool CellularServiceAPI::HangupCall(sys::Service *serv)
{
    auto msg = std::make_shared<CellularRequestMessage>(MessageType::CellularHangupCall);
    auto msg = std::make_shared<CellularHangupCallMessage>();

    return serv->bus.sendUnicast(msg, ServiceCellular::serviceName);
}

M module-services/service-cellular/CellularUrcHandler.cpp => module-services/service-cellular/CellularUrcHandler.cpp +2 -2
@@ 25,13 25,13 @@ void CellularUrcHandler::Handle(Clip &urc)
    if (urc.isValid()) {
        phoneNumber = urc.getNumber();
    }
    response = std::make_unique<CellularCallMessage>(CellularCallMessage::Type::CallerId, phoneNumber);
    response = std::make_unique<CellularCallerIdMessage>(phoneNumber);
    urc.setHandled(true);
}

void CellularUrcHandler::Handle(Ring &urc)
{
    response = std::make_unique<CellularCallMessage>(CellularCallMessage::Type::IncomingCall, "");
    response = std::make_unique<CellularIncominCallMessage>("");
    urc.setHandled(true);
}


M module-services/service-cellular/ServiceCellular.cpp => module-services/service-cellular/ServiceCellular.cpp +199 -159
@@ 233,7 233,7 @@ static bool isSettingsAutomaticTimeSyncEnabled()
void ServiceCellular::CallStateTimerHandler()
{
    LOG_DEBUG("CallStateTimerHandler");
    auto msg = std::make_shared<CellularRequestMessage>(MessageType::CellularListCurrentCalls);
    auto msg = std::make_shared<CellularListCallsMessage>();
    bus.sendUnicast(std::move(msg), ServiceCellular::serviceName);
}



@@ 412,6 412,56 @@ void ServiceCellular::registerMessageHandlers()
        }
        return sys::MessageNone{};
    });

    connect(typeid(CellularNewIncomingSMSMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularNewIncomingSMSMessage *>(request);
        return receiveSMS(msg->getData());
    });

    connect(typeid(CellularAnswerIncomingCallMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularAnswerIncomingCallMessage *>(request);
        return handleCellularAnswerIncomingCallMessage(msg);
    });

    connect(typeid(CellularCallRequestMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularCallRequestMessage *>(request);
        return handleCellularCallRequestMessage(msg);
    });

    connect(typeid(CellularHangupCallMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularHangupCallMessage *>(request);
        return handleCellularHangupCallMessage(msg);
    });

    connect(typeid(db::QueryResponse), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<db::QueryResponse *>(request);
        return handleDBQueryResponseMessage(msg);
    });

    connect(typeid(CellularListCallsMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularListCallsMessage *>(request);
        return handleCellularListCallsMessage(msg);
    });

    connect(typeid(db::NotificationMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<db::NotificationMessage *>(request);
        return handleDBNotificatioMessage(msg);
    });

    connect(typeid(CellularRingingMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularRingingMessage *>(request);
        return handleCellularRingingMessage(msg);
    });

    connect(typeid(CellularIncominCallMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularIncominCallMessage *>(request);
        return handleCellularIncominCallMessage(msg);
    });

    connect(typeid(CellularCallerIdMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<CellularCallerIdMessage *>(request);
        return handleCellularCallerIdMessage(msg);
    });
    handle_CellularGetChannelMessage();
}



@@ 768,30 818,6 @@ sys::MessagePointer ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl,
        change_state(dynamic_cast<cellular::StateChange *>(msgl));
        responseMsg = std::make_shared<CellularResponseMessage>(true);
    } break;
    case MessageType::CellularCall: {
        auto *msg = dynamic_cast<CellularCallMessage *>(msgl);
        assert(msg != nullptr);

        switch (msg->type) {
        case CellularCallMessage::Type::Ringing: {
            auto ret    = ongoingCall.startCall(msg->number, CallType::CT_OUTGOING);
            responseMsg = std::make_shared<CellularResponseMessage>(ret);
            break;
        } break;
        case CellularCallMessage::Type::IncomingCall: {
            auto ret = true;
            if (!ongoingCall.isValid()) {
                ret = ongoingCall.startCall(msg->number, CallType::CT_INCOMING);
            }
            responseMsg = std::make_shared<CellularResponseMessage>(ret);
            break;
        }
        case CellularCallMessage::Type::CallerId: {
            ongoingCall.setNumber(msg->number);
            break;
        }
        }
    } break;
    // Incoming notifications from Notification Virtual Channel
    case MessageType::CellularNotification: {
        CellularNotificationMessage *msg = static_cast<CellularNotificationMessage *>(msgl);


@@ 828,8 854,8 @@ sys::MessagePointer ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl,
            break;
        }
        case CellularNotificationMessage::Type::NewIncomingSMS: {
            LOG_INFO("New incoming sms received");
            receiveSMS(msg->data);
            auto message = std::make_shared<CellularNewIncomingSMSMessage>(msg->data);
            bus.sendUnicast(std::move(message), msg->sender);
            responseMsg = std::make_shared<CellularResponseMessage>(true);
            break;
        }


@@ 872,115 898,10 @@ sys::MessagePointer ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl,
        }
        }
    } break;

    case MessageType::CellularSimProcedure: {
        state.set(this, State::ST::SimSelect);
        break;
    }
    case MessageType::CellularListCurrentCalls: {
        at::cmd::CLCC cmd;
        auto base = cmux->get(TS0710::Channel::Commands)->cmd(cmd);
        if (auto response = cmd.parse(base); response) {
            const auto &data = response.getData();
            auto it          = std::find_if(std::begin(data), std::end(data), [&](const auto &entry) {
                return entry.stateOfCall == ModemCall::CallState::Active && entry.mode == ModemCall::CallMode::Voice;
            });
            if (it != std::end(data)) {
                auto msg = std::make_shared<CellularNotificationMessage>(CellularNotificationMessage::Type::CallActive);
                bus.sendMulticast(std::move(msg), sys::BusChannel::ServiceCellularNotifications);
                callStateTimer->stop();
                responseMsg = std::make_shared<CellularResponseMessage>(true);
                break;
            }
        }
        responseMsg = std::make_shared<CellularResponseMessage>(false);
    } break;

    case MessageType::CellularHangupCall: {
        auto channel = cmux->get(TS0710::Channel::Commands);
        LOG_INFO("CellularHangupCall");
        if (channel) {
            if (channel->cmd(at::AT::ATH)) {
                AntennaServiceAPI::LockRequest(this, antenna::lockState::unlocked);
                callStateTimer->stop();
                if (!ongoingCall.endCall(CellularCall::Forced::True)) {
                    LOG_ERROR("Failed to end ongoing call");
                }
                responseMsg = std::make_shared<CellularResponseMessage>(true, msgl->messageType);
            }
            else {
                LOG_ERROR("Call not aborted");
                responseMsg = std::make_shared<CellularResponseMessage>(false, msgl->messageType);
            }
            break;
        }
        responseMsg = std::make_shared<CellularResponseMessage>(false, msgl->messageType);
    } break;

    case MessageType::CellularAnswerIncomingCall: {
        auto channel = cmux->get(TS0710::Channel::Commands);
        auto ret     = false;
        if (channel) {
            // TODO alek: check if your request isn�t for 5 sec when you wait in command for 90000, it�s exclusivelly
            // set to 5000ms in command requesting...
            auto response = channel->cmd(at::AT::ATA);
            if (response) {
                // Propagate "CallActive" notification into system
                bus.sendMulticast(
                    std::make_shared<CellularNotificationMessage>(CellularNotificationMessage::Type::CallActive),
                    sys::BusChannel::ServiceCellularNotifications);
                ret = true;
            }
        }
        responseMsg = std::make_shared<CellularResponseMessage>(ret);
    } break;

    case MessageType::CellularCallRequest: {

        auto *msg = dynamic_cast<CellularCallRequestMessage *>(msgl);
        assert(msg != nullptr);
        auto channel = cmux->get(TS0710::Channel::Commands);
        if (channel == nullptr) {
            responseMsg = std::make_shared<CellularResponseMessage>(false);
            break;
        }

        cellular::RequestFactory factory(msg->number.getEntered(),
                                         *channel,
                                         msg->requestMode,
                                         Store::GSM::get()->simCardInserted()
                                             ? RequestFactory::SimStatus::SimInsterted
                                             : RequestFactory::SimStatus::SimSlotEmpty);

        auto request = factory.create();

        CellularRequestHandler handler(*this);
        auto result = channel->cmd(request->command(), at::default_doc_timeout);
        request->handle(handler, result);
        responseMsg = std::make_shared<CellularResponseMessage>(request->isHandled());

    } break;
    case MessageType::DBServiceNotification: {
        auto msg = dynamic_cast<db::NotificationMessage *>(msgl);
        if (msg == nullptr) {
            responseMsg = std::make_shared<CellularResponseMessage>(false);
            break;
        }
        if (msg->interface == db::Interface::Name::SMS &&
            (msg->type == db::Query::Type::Create || msg->type == db::Query::Type::Update)) {
            // note: this gets triggered on every type update, e.g. on QUEUED ? FAILED so way too often

            // are there new messges queued for sending ?
            auto limitTo = 15; // how many to send in this Query
            DBServiceAPI::GetQuery(this,
                                   db::Interface::Name::SMS,
                                   std::make_unique<db::query::SMSSearchByType>(SMSType::QUEUED, 0, limitTo));

            return std::make_shared<sys::ResponseMessage>();
        }
        return std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Failure);
        break;
    }
    case MessageType::CellularGetIMSI: {

        std::string temp;


@@ 1162,28 1083,7 @@ sys::MessagePointer ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl,
        return responseMsg;
    }

    // handle database response
    bool responseHandled = false;
    if (resp != nullptr) {
        if (auto msg = dynamic_cast<db::QueryResponse *>(resp)) {
            auto result = msg->getResult();
            if (auto response = dynamic_cast<db::query::SMSSearchByTypeResult *>(result.get())) {
                responseHandled = handle(response);
            }
            else if (result->hasListener()) {
                responseHandled = result->handle();
            }
        }
        if (responseHandled) {
            return std::make_shared<sys::ResponseMessage>();
        }
        else {
            return std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Unresolved);
        }
    }
    else {
        return std::make_shared<sys::ResponseMessage>();
    }
    return std::make_shared<sys::ResponseMessage>();
}

/**


@@ 1548,11 1448,11 @@ bool ServiceCellular::sendSMS(SMSRecord record)
    return result;
}

bool ServiceCellular::receiveSMS(std::string messageNumber)
auto ServiceCellular::receiveSMS(std::string messageNumber) -> std::shared_ptr<CellularResponseMessage>
{
    auto channel = cmux->get(TS0710::Channel::Commands);
    if (channel == nullptr) {
        return false;
        return std::make_shared<CellularResponseMessage>(false);
    }

    channel->cmd(at::AT::SMS_UCSC2);


@@ 1613,7 1513,7 @@ bool ServiceCellular::receiveSMS(std::string messageNumber)
                    }
                    catch (const std::exception &e) {
                        LOG_ERROR("ServiceCellular::receiveSMS error %s", e.what());
                        return false;
                        return std::make_shared<CellularResponseMessage>(false);
                    }
                    if (current == last) {
                        messageParts.push_back(ret.response[i + 1]);


@@ 1637,7 1537,7 @@ bool ServiceCellular::receiveSMS(std::string messageNumber)

                    if (!dbAddSMSRecord(record)) {
                        LOG_ERROR("Failed to add text message to db");
                        return false;
                        return std::make_shared<CellularResponseMessage>(false);
                    }
                }
            }


@@ 1646,7 1546,7 @@ bool ServiceCellular::receiveSMS(std::string messageNumber)
    channel->cmd(at::AT::SMS_GSM);
    // delete message from modem memory
    channel->cmd(at::factory(at::AT::CMGD) + messageNumber);
    return true;
    return std::make_shared<CellularResponseMessage>(true);
}

bool ServiceCellular::getOwnNumber(std::string &destination)


@@ 2372,3 2272,143 @@ void ServiceCellular::apnListChanged(const std::string &value)
        packetData->loadAPNSettings(value);
    }
}

auto ServiceCellular::handleCellularAnswerIncomingCallMessage(CellularMessage *msg)
    -> std::shared_ptr<CellularResponseMessage>
{
    auto channel = cmux->get(TS0710::Channel::Commands);
    auto ret     = false;
    if (channel) {
        // TODO alek: check if your request isn�t for 5 sec when you wait in command for 90000, it�s exclusivelly
        // set to 5000ms in command requesting...
        auto response = channel->cmd(at::AT::ATA);
        if (response) {
            // Propagate "CallActive" notification into system
            bus.sendMulticast(
                std::make_shared<CellularNotificationMessage>(CellularNotificationMessage::Type::CallActive),
                sys::BusChannel::ServiceCellularNotifications);
            ret = true;
        }
    }
    return std::make_shared<CellularResponseMessage>(ret);
}

auto ServiceCellular::handleCellularCallRequestMessage(CellularCallRequestMessage *msg)
    -> std::shared_ptr<CellularResponseMessage>
{
    auto channel = cmux->get(TS0710::Channel::Commands);
    if (channel == nullptr) {
        return std::make_shared<CellularResponseMessage>(false);
    }

    cellular::RequestFactory factory(msg->number.getEntered(),
                                     *channel,
                                     msg->requestMode,
                                     Store::GSM::get()->simCardInserted() ? RequestFactory::SimStatus::SimInsterted
                                                                          : RequestFactory::SimStatus::SimSlotEmpty);

    auto request = factory.create();

    CellularRequestHandler handler(*this);
    auto result = channel->cmd(request->command());
    request->handle(handler, result);
    return std::make_shared<CellularResponseMessage>(request->isHandled());
}

auto ServiceCellular::handleCellularHangupCallMessage(CellularHangupCallMessage *msg)
    -> std::shared_ptr<CellularResponseMessage>
{
    auto channel = cmux->get(TS0710::Channel::Commands);
    LOG_INFO("CellularHangupCall");
    if (channel) {
        if (channel->cmd(at::AT::ATH)) {
            AntennaServiceAPI::LockRequest(this, antenna::lockState::unlocked);
            callStateTimer->stop();
            if (!ongoingCall.endCall(CellularCall::Forced::True)) {
                LOG_ERROR("Failed to end ongoing call");
            }
            return std::make_shared<CellularResponseMessage>(true, msg->messageType);
        }
        else {
            LOG_ERROR("Call not aborted");
            return std::make_shared<CellularResponseMessage>(false, msg->messageType);
        }
    }
    return std::make_shared<CellularResponseMessage>(false, msg->messageType);
}

auto ServiceCellular::handleDBQueryResponseMessage(db::QueryResponse *msg) -> std::shared_ptr<sys::ResponseMessage>
{
    bool responseHandled = false;

    auto result = msg->getResult();
    if (auto response = dynamic_cast<db::query::SMSSearchByTypeResult *>(result.get())) {
        responseHandled = handle(response);
    }
    else if (result->hasListener()) {
        responseHandled = result->handle();
    }

    if (responseHandled) {
        return std::make_shared<sys::ResponseMessage>();
    }
    else {
        return std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Unresolved);
    }
}

auto ServiceCellular::handleCellularListCallsMessage(CellularMessage *msg) -> std::shared_ptr<sys::ResponseMessage>
{
    at::cmd::CLCC cmd;
    auto base = cmux->get(TS0710::Channel::Commands)->cmd(cmd);
    if (auto response = cmd.parse(base); response) {
        const auto &data = response.getData();
        auto it          = std::find_if(std::begin(data), std::end(data), [&](const auto &entry) {
            return entry.stateOfCall == ModemCall::CallState::Active && entry.mode == ModemCall::CallMode::Voice;
        });
        if (it != std::end(data)) {
            auto notification =
                std::make_shared<CellularNotificationMessage>(CellularNotificationMessage::Type::CallActive);
            bus.sendMulticast(std::move(notification), sys::BusChannel::ServiceCellularNotifications);
            callStateTimer->stop();
            return std::make_shared<CellularResponseMessage>(true);
        }
    }
    return std::make_shared<CellularResponseMessage>(false);
}

auto ServiceCellular::handleDBNotificatioMessage(db::NotificationMessage *msg) -> std::shared_ptr<sys::ResponseMessage>
{
    if (msg->interface == db::Interface::Name::SMS &&
        (msg->type == db::Query::Type::Create || msg->type == db::Query::Type::Update)) {
        // note: this gets triggered on every type update, e.g. on QUEUED ? FAILED so way too often

        // are there new messges queued for sending ?
        auto limitTo = 15; // how many to send in this Query
        DBServiceAPI::GetQuery(
            this, db::Interface::Name::SMS, std::make_unique<db::query::SMSSearchByType>(SMSType::QUEUED, 0, limitTo));

        return std::make_shared<sys::ResponseMessage>();
    }
    return std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Failure);
}

auto ServiceCellular::handleCellularRingingMessage(CellularRingingMessage *msg) -> std::shared_ptr<sys::ResponseMessage>
{
    return std::make_shared<CellularResponseMessage>(ongoingCall.startCall(msg->number, CallType::CT_OUTGOING));
}
auto ServiceCellular::handleCellularIncominCallMessage(CellularIncominCallMessage *msg)
    -> std::shared_ptr<sys::ResponseMessage>
{
    auto ret = true;
    if (!ongoingCall.isValid()) {
        ret = ongoingCall.startCall(msg->number, CallType::CT_INCOMING);
    }
    return std::make_shared<CellularResponseMessage>(ret);
}
auto ServiceCellular::handleCellularCallerIdMessage(CellularCallerIdMessage *msg)
    -> std::shared_ptr<sys::ResponseMessage>
{
    ongoingCall.setNumber(msg->number);
    return sys::MessageNone{};
}

M module-services/service-cellular/service-cellular/CellularMessage.hpp => module-services/service-cellular/service-cellular/CellularMessage.hpp +74 -15
@@ 30,28 30,51 @@ class CellularMessage : public sys::DataMessage
    explicit CellularMessage(MessageType messageType) : sys::DataMessage(messageType){};
};

class CellularCallMessage : public CellularMessage
class CellularRingingMessage : public CellularMessage
{
  public:
    enum class Type
    {
        Ringing,      // user provided number to call to and service initialized calling procedure.
        IncomingCall, // device receives connection from other device.
        CallerId,     // device receives caller id
    };
    CellularRingingMessage(const utils::PhoneNumber::View &number)
        : CellularMessage(MessageType::CellularRinging), number(number)
    {}
    CellularRingingMessage(const utils::PhoneNumber &number)
        : CellularMessage(MessageType::CellularRinging), number(number.getView())
    {}
    CellularRingingMessage(const std::string &e164number)
        : CellularMessage(MessageType::CellularRinging), number(utils::PhoneNumber::parse(e164number))
    {}

    CellularCallMessage() = delete;
    CellularCallMessage(Type type, const utils::PhoneNumber::View &number)
        : CellularMessage(MessageType::CellularCall), type(type), number(number)
    utils::PhoneNumber::View number;
};

class CellularIncominCallMessage : public CellularMessage
{
  public:
    CellularIncominCallMessage(const utils::PhoneNumber::View &number)
        : CellularMessage(MessageType::CellularIncomingCall), number(number)
    {}
    CellularCallMessage(Type type, const utils::PhoneNumber &number)
        : CellularMessage(MessageType::CellularCall), type(type), number(number.getView())
    CellularIncominCallMessage(const utils::PhoneNumber &number)
        : CellularMessage(MessageType::CellularIncomingCall), number(number.getView())
    {}
    CellularCallMessage(Type type, const std::string &e164number)
        : CellularMessage(MessageType::CellularCall), type(type), number(utils::PhoneNumber::parse(e164number))
    CellularIncominCallMessage(const std::string &e164number)
        : CellularMessage(MessageType::CellularIncomingCall), number(utils::PhoneNumber::parse(e164number))
    {}

    utils::PhoneNumber::View number;
};

class CellularCallerIdMessage : public CellularMessage
{
  public:
    CellularCallerIdMessage(const utils::PhoneNumber::View &number)
        : CellularMessage(MessageType::CellularCallerId), number(number)
    {}
    CellularCallerIdMessage(const utils::PhoneNumber &number)
        : CellularMessage(MessageType::CellularCallerId), number(number.getView())
    {}
    CellularCallerIdMessage(const std::string &e164number)
        : CellularMessage(MessageType::CellularCallerId), number(utils::PhoneNumber::parse(e164number))
    {}

    Type type;
    utils::PhoneNumber::View number;
};



@@ 789,6 812,42 @@ class CellularNotAnEmergencyNotification : public CellularResponseMessage,
    }
};

class CellularNewIncomingSMSMessage : public CellularMessage
{
  public:
    explicit CellularNewIncomingSMSMessage(const std::string &data)
        : CellularMessage(MessageType::CellularNewIncomingSMS), notificationData(data)
    {}
    auto getData() const -> std::string
    {
        return notificationData;
    }

  private:
    std::string notificationData;
};

class CellularAnswerIncomingCallMessage : public CellularMessage
{
  public:
    CellularAnswerIncomingCallMessage() : CellularMessage(MessageType::CellularAnswerIncomingCall)
    {}
};

class CellularHangupCallMessage : public CellularMessage
{
  public:
    CellularHangupCallMessage() : CellularMessage(MessageType::CellularHangupCall)
    {}
};

class CellularListCallsMessage : public CellularMessage
{
  public:
    CellularListCallsMessage() : CellularMessage(MessageType::CellularListCurrentCalls)
    {}
};

namespace cellular
{


M module-services/service-cellular/service-cellular/ServiceCellular.hpp => module-services/service-cellular/service-cellular/ServiceCellular.hpp +12 -1
@@ 30,6 30,7 @@
#include <service-db/Settings.hpp>
#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <service-db/DBServiceName.hpp>
#include <service-db/DBNotificationMessage.hpp>

#include <cstdint>
#include <memory>


@@ 78,7 79,7 @@ class ServiceCellular : public sys::Service
    static const char *serviceName;

    bool sendSMS(SMSRecord record);
    bool receiveSMS(std::string messageNumber);
    auto receiveSMS(std::string messageNumber) -> std::shared_ptr<CellularResponseMessage>;
    /**
     * @brief Its getting selected SIM card own number.
     * @param destination Reference to destination string.


@@ 315,6 316,16 @@ class ServiceCellular : public sys::Service
    void volteChanged(const std::string &value);
    void apnListChanged(const std::string &value);
    bool volteOn = false;

    auto handleCellularAnswerIncomingCallMessage(CellularMessage *msg) -> std::shared_ptr<CellularResponseMessage>;
    auto handleCellularCallRequestMessage(CellularCallRequestMessage *msg) -> std::shared_ptr<CellularResponseMessage>;
    auto handleCellularHangupCallMessage(CellularHangupCallMessage *msg) -> std::shared_ptr<CellularResponseMessage>;
    auto handleDBQueryResponseMessage(db::QueryResponse *msg) -> std::shared_ptr<sys::ResponseMessage>;
    auto handleCellularListCallsMessage(CellularMessage *msg) -> std::shared_ptr<sys::ResponseMessage>;
    auto handleDBNotificatioMessage(db::NotificationMessage *msg) -> std::shared_ptr<sys::ResponseMessage>;
    auto handleCellularRingingMessage(CellularRingingMessage *msg) -> std::shared_ptr<sys::ResponseMessage>;
    auto handleCellularIncominCallMessage(CellularIncominCallMessage *msg) -> std::shared_ptr<sys::ResponseMessage>;
    auto handleCellularCallerIdMessage(CellularCallerIdMessage *msg) -> std::shared_ptr<sys::ResponseMessage>;
};

namespace sys

M source/MessageType.hpp => source/MessageType.hpp +6 -3
@@ 72,9 72,11 @@ enum class MessageType
    CellularNotification,       ///< Async notification message
    CellularAnswerIncomingCall, ///< Answer incoming call
    CellularHangupCall,         ///< Hang up call
    CellularCall,               ///< Call related events
    CellularCallRequest,        ///< Call request
    CellularPowerStateChange,   ///< Change power state of the module
    CellularRinging,
    CellularIncomingCall,
    CellularCallerId,
    CellularCallRequest,      ///< Call request
    CellularPowerStateChange, ///< Change power state of the module

    CellularListCurrentCalls,
    CellularSimProcedure,        // Broadcast on sim state changed


@@ 107,6 109,7 @@ enum class MessageType
    CellularTimeUpdated,
    CellularSimState,
    CellularMMIData,
    CellularNewIncomingSMS,

    DBNotesAdd,            ///< Add new note's record
    DBNotesRemove,         ///< Remove selected note's record