ChimeraTK-DeviceAccess 03.25.00
Loading...
Searching...
No Matches
MuxedInterruptDistributor.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3#pragma once
4
5#include "../VersionNumber.h"
6
7#include <boost/enable_shared_from_this.hpp>
8#include <boost/shared_ptr.hpp>
9
10#include <functional>
11#include <map>
12#include <memory>
13#include <vector>
14
15namespace ChimeraTK {
16 class DeviceBackend;
17} // namespace ChimeraTK
18
19namespace ChimeraTK::async {
20 class MuxedInterruptDistributor;
21 class AsyncAccessorManager;
22 template<typename BackendSpecificDataType>
23 class SubDomain;
24 class Domain;
25
26 /********************************************************************************************************************/
27
29 public:
31 boost::shared_ptr<MuxedInterruptDistributor> createMuxedInterruptDistributor(
32 boost::shared_ptr<SubDomain<std::nullptr_t>> parent);
33
34 protected:
37 std::map<std::string,
38 std::function<std::unique_ptr<MuxedInterruptDistributor>(
39 std::string, boost::shared_ptr<SubDomain<std::nullptr_t>>)>>
41 static std::unique_ptr<MuxedInterruptDistributorFactory> _instance;
42
43 static std::pair<std::string, std::string> getInterruptControllerNameAndDescriptionFromCatalogue(
44 std::vector<size_t> const& subdomainID, DeviceBackend& backend);
45
46 private:
48 };
49
50 /********************************************************************************************************************/
51
56 class MuxedInterruptDistributor : public boost::enable_shared_from_this<MuxedInterruptDistributor> {
57 public:
61 explicit MuxedInterruptDistributor(boost::shared_ptr<SubDomain<std::nullptr_t>> parent);
62 virtual ~MuxedInterruptDistributor() = default;
63
69 template<typename DistributorType>
70 [[nodiscard]] boost::shared_ptr<AsyncAccessorManager> getAccessorManager(
71 std::vector<size_t> const& qualififedSubDomainId);
72
73 virtual void activate(VersionNumber version);
74 void sendException(const std::exception_ptr& e);
75
79 virtual void handle(VersionNumber version) = 0;
80
81 protected:
82 std::map<size_t, boost::weak_ptr<SubDomain<std::nullptr_t>>> _subDomains;
83
84 boost::shared_ptr<DeviceBackend> _backend;
85
88 std::vector<size_t> _id;
89
90 boost::shared_ptr<SubDomain<std::nullptr_t>> _parent;
91 boost::shared_ptr<Domain> _asyncDomain;
92
98 virtual void activateSubDomain(SubDomain<std::nullptr_t>& subDomain, VersionNumber const& version);
99 };
100
101 /********************************************************************************************************************/
102
103} // namespace ChimeraTK::async
The base class for backends providing IO functionality for the Device class.
Class for generating and holding version numbers without exposing a numeric representation.
static MuxedInterruptDistributorFactory & getInstance()
std::map< std::string, std::function< std::unique_ptr< MuxedInterruptDistributor >(std::string, boost::shared_ptr< SubDomain< std::nullptr_t > >)> > _creatorFunctions
Each controller type is registered via name and creator function.
boost::shared_ptr< MuxedInterruptDistributor > createMuxedInterruptDistributor(boost::shared_ptr< SubDomain< std::nullptr_t > > parent)
static std::pair< std::string, std::string > getInterruptControllerNameAndDescriptionFromCatalogue(std::vector< size_t > const &subdomainID, DeviceBackend &backend)
static std::unique_ptr< MuxedInterruptDistributorFactory > _instance
Interface base class for interrupt controller handlers.
virtual void handle(VersionNumber version)=0
The interrupt handling functions implements the handshake with the interrupt controller.
std::vector< size_t > _id
The ID of this controller handler.
boost::shared_ptr< SubDomain< std::nullptr_t > > _parent
virtual void activateSubDomain(SubDomain< std::nullptr_t > &subDomain, VersionNumber const &version)
Function to activate a (new) single SubDomain if the MuxedInterruptDistributor is already active.
boost::shared_ptr< AsyncAccessorManager > getAccessorManager(std::vector< size_t > const &qualififedSubDomainId)
Get an AsyncAccessorManager of type DistributorType from the matching SubDomain.
std::map< size_t, boost::weak_ptr< SubDomain< std::nullptr_t > > > _subDomains
Send backend-specific asynchronous data to different distributors:
Definition SubDomain.h:33