mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-19 14:40:57 -04:00
126 lines
3.3 KiB
C++
126 lines
3.3 KiB
C++
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#pragma once
|
|
|
|
#include "Error.hpp"
|
|
#include "interface/profiles/ProfileManager.hpp"
|
|
#include "interface/BluetoothDriver.hpp"
|
|
|
|
#include <cstdint>
|
|
#include <PhoneNumber.hpp>
|
|
|
|
namespace sys
|
|
{
|
|
class Service;
|
|
class Message;
|
|
}
|
|
|
|
namespace bluetooth
|
|
{
|
|
class SettingsHolder;
|
|
class Command
|
|
{
|
|
public:
|
|
enum Type
|
|
{
|
|
StartScan,
|
|
StopScan,
|
|
getDevicesAvailable,
|
|
VisibilityOn,
|
|
VisibilityOff,
|
|
ConnectAudio,
|
|
DisconnectAudio,
|
|
PowerOn,
|
|
PowerOff,
|
|
Pair,
|
|
Unpair,
|
|
StartRinging,
|
|
StopRinging,
|
|
StartRouting,
|
|
StartStream,
|
|
StopStream,
|
|
SwitchProfile,
|
|
CallAnswered,
|
|
IncomingCallNumber,
|
|
None,
|
|
};
|
|
Command(Command::Type type, std::optional<Devicei> dev) : type(type)
|
|
{
|
|
if (dev.has_value()) {
|
|
device = dev.value();
|
|
}
|
|
}
|
|
Command(Command::Type type, std::optional<utils::PhoneNumber::View> num) : type(type)
|
|
{
|
|
if (num.has_value()) {
|
|
numberStringPtr = new std::string();
|
|
*numberStringPtr = num->getEntered();
|
|
}
|
|
}
|
|
explicit Command(Command::Type type) : type(type)
|
|
{}
|
|
auto getType() const noexcept -> Command::Type
|
|
{
|
|
return type;
|
|
}
|
|
|
|
auto getDevice() const noexcept -> Devicei
|
|
{
|
|
return device;
|
|
}
|
|
|
|
auto getNumberString() noexcept -> std::string
|
|
{
|
|
if (numberStringPtr != nullptr) {
|
|
return *numberStringPtr;
|
|
}
|
|
return std::string();
|
|
}
|
|
|
|
void destroy()
|
|
{
|
|
delete numberStringPtr;
|
|
}
|
|
|
|
private:
|
|
Devicei device{};
|
|
std::string *numberStringPtr = nullptr;
|
|
Type type;
|
|
};
|
|
|
|
class AbstractCommandHandler
|
|
{
|
|
public:
|
|
virtual ~AbstractCommandHandler() noexcept = default;
|
|
|
|
virtual auto handle(Command command) -> Error::Code = 0;
|
|
};
|
|
|
|
class CommandHandler : public AbstractCommandHandler
|
|
{
|
|
public:
|
|
explicit CommandHandler(sys::Service *service,
|
|
std::shared_ptr<bluetooth::SettingsHolder> settings,
|
|
std::shared_ptr<bluetooth::ProfileManager> profileManager,
|
|
std::shared_ptr<bluetooth::AbstractDriver> driver);
|
|
|
|
auto handle(Command command) -> Error::Code override;
|
|
|
|
private:
|
|
Error::Code scan();
|
|
Error::Code stopScan();
|
|
Error::Code setVisibility(bool visibility);
|
|
Error::Code establishAudioConnection(const Devicei &device);
|
|
Error::Code disconnectAudioConnection();
|
|
Error::Code pair(const Devicei &device);
|
|
Error::Code unpair(const Devicei &device);
|
|
Error::Code availableDevices();
|
|
Error::Code switchAudioProfile();
|
|
sys::Service *service;
|
|
std::shared_ptr<bluetooth::SettingsHolder> settings;
|
|
std::shared_ptr<bluetooth::ProfileManager> profileManager;
|
|
std::shared_ptr<AbstractDriver> driver;
|
|
};
|
|
} // namespace bluetooth
|