// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #include "CommandHandler.hpp" #include #include #include #include #include "Device.hpp" #include #include #include "GAP/GAP.hpp" extern "C" { #include } namespace bluetooth { namespace { [[nodiscard]] auto toString(bluetooth::Result::Code code) -> std::string { return utils::enumToString(code); } } // namespace CommandHandler::CommandHandler(sys::Service *service, std::shared_ptr settings, std::shared_ptr profileManager, std::shared_ptr driver) : service{service}, settings{std::move(settings)}, profileManager{std::move(profileManager)}, driver{std::move( driver)} { this->driver->registerPowerOnCallback([profilePtr = this->profileManager]() { profilePtr->init(); }); } Result::Code CommandHandler::scan() { if (const auto ret = driver->scan(); ret.result != bluetooth::Result::Code::Success) { LOG_ERROR("Can't start scan!: %s %d", toString(ret.result).c_str(), ret.libraryResult); return ret.result; } LOG_INFO("Scan started!"); // open new scan window return Result::Code::Success; } Result::Code CommandHandler::stopScan() { LOG_INFO("Stopping scan!"); driver->stopScan(); return Result::Code::Success; } Result::Code CommandHandler::setVisibility(bool visibility) { driver->setVisibility(visibility); settings->setValue(bluetooth::Settings::Visibility, static_cast(visibility)); return Result::Code::Success; } Result::Code CommandHandler::connect(const DataVariant &data) { auto device = std::get(data); LOG_INFO("Connecting device"); profileManager->connect(device); return Result::Code::Success; } Result::Code CommandHandler::disconnect() { LOG_INFO("Disconnecting device"); profileManager->disconnect(); return Result::Code::Success; } Result::Code CommandHandler::pair(const DataVariant &data) { auto device = std::get(data); LOG_INFO("Pairing..."); auto errorCode = Result::Code::Success; driver->pair(device); LOG_INFO("Pairing result: %s", magic_enum::enum_name(errorCode).data()); return errorCode; } Result::Code CommandHandler::unpair(const DataVariant &data) { auto device = std::get(data); LOG_INFO("Unpairing..."); const auto errorCode = Result::Code::Success; driver->unpair(device); LOG_INFO("Unpairing result: %s", magic_enum::enum_name(errorCode).data()); return errorCode; } Result::Code CommandHandler::availableDevices() { auto msg = std::make_shared(bluetooth::GAP::getDevicesList()); static_cast(service)->bus.sendUnicast(std::move(msg), service::name::service_desktop); return Result::Code::Success; } } // namespace bluetooth