~aleteoryx/muditaos

bd1d1967b297316a49b8f170260ff5d3c4f56959 — Marek Niepieklo 4 years ago 0f03e40
[EGD-7465] Fix double de-initialization of USB

Added flag for Worker-Desktop initialization state
M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +7 -6
@@ 85,12 85,12 @@ sys::ReturnCodes ServiceDesktop::InitHandler()

    desktopWorker = std::make_unique<WorkerDesktop>(this, *usbSecurityModel.get(), serialNumber);

    const bool ret =
    initialized =
        desktopWorker->init({{sdesktop::RECEIVE_QUEUE_BUFFER_NAME, sizeof(std::string *), sdesktop::cdc_queue_len},
                             {sdesktop::SEND_QUEUE_BUFFER_NAME, sizeof(std::string *), sdesktop::cdc_queue_object_size},
                             {sdesktop::IRQ_QUEUE_BUFFER_NAME, 1, sdesktop::irq_queue_object_size}});

    if (ret == false) {
    if (initialized == false) {
        LOG_ERROR("!!! service-desktop InitHandler failed to initialize worker, service-desktop won't work");
        return sys::ReturnCodes::Failure;
    }


@@ 207,16 207,17 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
sys::ReturnCodes ServiceDesktop::DeinitHandler()
{
    LOG_ERROR(".. deinit ..");
    settings->deinit();
    desktopWorker->deinit();
    if (initialized) {
        settings->deinit();
        desktopWorker->deinit();
    }
    return sys::ReturnCodes::Success;
}

void ServiceDesktop::ProcessCloseReason(sys::CloseReason closeReason)
{
    LOG_ERROR(".. close with reason ..");
    settings->deinit();
    desktopWorker->deinit();
    DeinitHandler();
    sendCloseReadyMessage(this);
}


M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +13 -1
@@ 31,6 31,10 @@ WorkerDesktop::WorkerDesktop(sys::Service *ownerServicePtr,

bool WorkerDesktop::init(std::list<sys::WorkerQueueInfo> queues)
{
    if (initialized) {
        return true;
    }

    Worker::init(queues);

    irqQueue     = Worker::getQueueHandleByName(sdesktop::IRQ_QUEUE_BUFFER_NAME);


@@ 46,11 50,17 @@ bool WorkerDesktop::init(std::list<sys::WorkerQueueInfo> queues)

    bsp::usbInitParams initParams = {receiveQueue, irqQueue, serialNumber.c_str()};

    return (bsp::usbInit(initParams) < 0) ? false : true;
    initialized = (bsp::usbInit(initParams) < 0) ? false : true;

    return initialized;
}

bool WorkerDesktop::deinit(void)
{
    if (!initialized) {
        return false;
    }

    unsigned int maxcount = 10;
    while (parser.getCurrentState() != parserFSM::State::NoMsg && --maxcount > 0) {
        vTaskDelay(300);


@@ 65,6 75,8 @@ bool WorkerDesktop::deinit(void)
    Worker::deinit();

    LOG_DEBUG("deinit end");
    initialized = false;

    return true;
}


M module-services/service-desktop/service-desktop/ServiceDesktop.hpp => module-services/service-desktop/service-desktop/ServiceDesktop.hpp +1 -0
@@ 117,6 117,7 @@ class ServiceDesktop : public sys::Service
    std::unique_ptr<sdesktop::bluetooth::BluetoothMessagesHandler> btMsgHandler;

    static constexpr unsigned int DefaultLogFlushTimeoutInMs = 1000U;
    bool initialized                                         = false;
};

namespace sys

M module-services/service-desktop/service-desktop/WorkerDesktop.hpp => module-services/service-desktop/service-desktop/WorkerDesktop.hpp +1 -1
@@ 44,7 44,7 @@ class WorkerDesktop : public sys::Worker
    void suspendUsb();

    bool stateChangeWait();

    bool initialized = false;
    xQueueHandle receiveQueue;
    xQueueHandle irqQueue;
    const sdesktop::USBSecurityModel &securityModel;