C

Qt Quick Ultralite multitask Example

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

#include "led_thread.h"
#include "qul_thread.h"

#include <FreeRTOS.h>
#include <task.h>
#include <queue.h>

#include <board_utils/led.h>

void Led_Thread(void *argument)
{
    (void) argument;
    uint32_t speed = 1;
    uint32_t newSpeed = 0;
    int ledCycleCount = 0;
    bool ledOn = false;
    HardwareEvent ledEvent;

    while (true) {
        const TickType_t ticks = speed > 0 ? (350 / (portTICK_PERIOD_MS * speed)) : portMAX_DELAY;
        if (xTaskNotifyWait(0, ULONG_MAX, &newSpeed, ticks) == pdTRUE) {
            speed = newSpeed;
        }
        BoardUtils::toggleLED();

        if (ledOn) {
            ledCycleCount++;
            ledCycleCount = ledCycleCount < 0 ? 0 : ledCycleCount;
        }

        ledOn = !ledOn;

        ledEvent.id = HardwareEventId::LedCycleCount;
        ledEvent.data = ledCycleCount;
        postEventsToUI(ledEvent);
        taskYIELD();
    }
}