Program Listing for File dispatchservice.h#

Return to documentation for file (data_dispatch_service\dispatchservice.h)

/********************************************************************************
 * Copyright (c) 2025-2026 ZF Friedrichshafen AG
 *
 * This program and the accompanying materials are made available under the
 * terms of the Apache License Version 2.0 which is available at
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Contributors:
 *   Erik Verhoeven - initial API and implementation
 ********************************************************************************/

#ifndef DISPATCH_SERVICE_H
#define DISPATCH_SERVICE_H

#include <interfaces/dispatch.h>
#include <support/component_impl.h>
#include <memory>
#include <map>
#include <list>
#include <set>

// Data dispatch service for CAN:
//
// - CAN Link object for Lotus Eletre registers all the CAN signals as follows:
// - Rx Signals are being registered to receive data from the vehicle and supply data to the vehicle devices.
//      - Signals are all grouped per message and per node/ECU
//      - One event is sent to update the data in the vehicle devices
//      - Data is updated first and then the event is broadcasted (toggle buffer)
// - Tx Signals are being registered to receive data from the vehicle devices and supply data to the vehicle
//      - Signals are grouped per message and per node/ECU
//      - (Default values are available for each signal; either one time reset or reset after each send) -> service task?
//      - Sending per event or per timer

#include "transaction.h"
#include "signal.h"
#include "trigger.h"

class CDispatchService : public sdv::CSdvObject, public sdv::core::ISignalTransmission, public sdv::core::ISignalAccess,
    public sdv::core::IDispatchTransaction
{
public:
    CDispatchService();

    // Interface map
    BEGIN_SDV_INTERFACE_MAP()
        SDV_INTERFACE_ENTRY(sdv::core::ISignalTransmission)
        SDV_INTERFACE_ENTRY(sdv::core::ISignalAccess)
        SDV_INTERFACE_ENTRY(sdv::core::IDispatchTransaction)
    END_SDV_INTERFACE_MAP()

    // Object declarations
    DECLARE_OBJECT_CLASS_TYPE(sdv::EObjectType::system_object)
    DECLARE_OBJECT_CLASS_NAME("DataDispatchService")
    DECLARE_OBJECT_SINGLETON()
    DECLARE_OBJECT_DEPENDENCIES("TaskTimerService")


    IInterfaceAccess* CreateTxTrigger(uint32_t uiCycleTime, uint32_t uiDelayTime, uint32_t uiBehaviorFlags,
        sdv::IInterfaceAccess* pTriggerCallback);

    virtual sdv::IInterfaceAccess* RegisterTxSignal(/*in*/ const sdv::u8string& ssSignalName, /*in*/ sdv::any_t anyDefVal) override;

    virtual sdv::IInterfaceAccess* RegisterRxSignal(/*in*/ const sdv::u8string& ssSignalName) override;

    virtual sdv::IInterfaceAccess* RequestSignalPublisher(/*in*/ const sdv::u8string& ssSignalName) override;

    virtual sdv::IInterfaceAccess* AddSignalSubscription(/*in*/ const sdv::u8string& ssSignalName, /*in*/ sdv::IInterfaceAccess* pSubscriber) override;

    virtual sdv::sequence<sdv::core::SSignalRegistration> GetRegisteredSignals() const override;

    virtual sdv::IInterfaceAccess* CreateTransaction() override;

    uint64_t GetNextTransactionID();

    void CreateDirectTransactionID();

    uint64_t GetDirectTransactionID() const;

    virtual bool OnInitialize() override;

    virtual void OnShutdown() override;

    void UnregisterSignal(const sdv::u8string& ssSignalName, sdv::core::ESignalDirection eDirection);

    CSignal* FindSignal(const sdv::u8string& rssSignalName, sdv::core::ESignalDirection eDirection);

    void FinishTransaction(const CTransaction* pTransaction);

    CScheduler& GetScheduler();

    void RemoveTxTrigger(CTrigger* pTrigger);

private:
    mutable std::mutex                              m_mtxSignals;
    std::map<sdv::u8string, CSignal>                m_mapRxSignals;
    std::map<sdv::u8string, CSignal>                m_mapTxSignals;
    std::atomic_uint64_t                            m_uiTransactionCnt = 1ull;
    std::mutex                                      m_mtxTransactions;
    std::list<CTransaction>                         m_lstTransactions;
    uint64_t                                        m_uiDirectTransactionID;
    CScheduler                                      m_scheduler;
    mutable std::mutex                              m_mtxTriggers;
    std::map<CTrigger*, std::unique_ptr<CTrigger>>  m_mapTriggers;
};

DEFINE_SDV_OBJECT(CDispatchService)

#endif // !defined DISPATCH_SERVICE_H