Program Listing for File HsmEventDispatcherFreeRTOS.hpp

Return to documentation for file (include/hsmcpp/HsmEventDispatcherFreeRTOS.hpp)

// Copyright (C) 2022 Igor Krechetov
// Distributed under MIT license. See file LICENSE for details

#ifndef HSMCPP_HSMEVENTDISPATCHERFREERTOS_HPP
#define HSMCPP_HSMEVENTDISPATCHERFREERTOS_HPP

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

#include <vector>

#include "HsmEventDispatcherBase.hpp"

namespace hsmcpp {

class HsmEventDispatcherFreeRTOS : public HsmEventDispatcherBase {
public:
    // cppcheck-suppress misra-c2012-17.8 ; false positive. setting default parameter value is not parameter modification
    static std::shared_ptr<HsmEventDispatcherFreeRTOS> create(
        const configSTACK_DEPTH_TYPE stackDepth = configMINIMAL_STACK_SIZE,
        const UBaseType_t priority = tskIDLE_PRIORITY,
        const size_t eventsCacheSize = DISPATCHER_DEFAULT_EVENTS_CACHESIZE);

    void emitEvent(const HandlerID_t handlerID) override;

    bool start() override;

    void stop();

    void join();

protected:
    HsmEventDispatcherFreeRTOS(const configSTACK_DEPTH_TYPE stackDepth,
                               const UBaseType_t priority,
                               const size_t eventsCacheSize);

    virtual ~HsmEventDispatcherFreeRTOS();

    bool deleteSafe() override;

    void startTimerImpl(const TimerID_t timerID, const unsigned int intervalMs, const bool isSingleShot) override;
    void stopTimerImpl(const TimerID_t timerID) override;

    void notifyDispatcherAboutEvent() override;
    static void doDispatching(void* pvParameters);

    static void onTimerEvent(TimerHandle_t timerHandle);

private:
    TaskHandle_t mMainTask = nullptr;
    TaskHandle_t mDispatcherTask = nullptr;

    configSTACK_DEPTH_TYPE mStackDepth = configMINIMAL_STACK_SIZE;
    UBaseType_t mPriority = tskIDLE_PRIORITY;
    std::map<TimerID_t, TimerHandle_t> mNativeTimerHandlers; // protected by InterruptsFreeSection class
};

}  // namespace hsmcpp

#endif  // HSMCPP_HSMEVENTDISPATCHERFREERTOS_HPP