PLCnext API Documentation  22.9.0.33
PlcDomainProxy.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
8 #include "Arp/System/Core/event.hxx"
9 #include "Arp/System/Core/AppDomainSingleton.hxx"
10 #include "Arp/System/Commons/Logging.h"
11 #include "Arp/System/Acf/IComponent.hpp"
12 #include "Arp/System/Rsc/Services/IRscServiceFactory.hpp"
13 #include "Arp/Plc/Commons/Domain/PlcStartKind.hpp"
14 
15 // forwards
16 namespace Arp { namespace Plc { namespace Domain
17 {
18 class PlcDomainComponent;
19 class PlcDomainProxyComponent;
20 }}}
21 
22 namespace Arp { namespace Plc { namespace Commons { namespace Services { namespace Internal
23 {
24 class IPlcDomainService;
25 }}}}} // end of namespace Arp::Plc::Commons::Services::Internal
26 
27 namespace Arp { namespace System { namespace Watchdog { namespace Services { namespace Internal
28 {
29 class IWatchdogInfoService;
30 }}}}} // end of namespace Arp::Plc::Commons::Services::Internal
31 
32 namespace Arp { namespace Hardware { namespace DeviceHmi { namespace Services { namespace Internal
33 {
34 class ISwitchesService;
35 }}}}} // end of namespace Arp::Hardware::DeviceHmi::Services::Internal
36 
37 namespace Arp { namespace Plc { namespace Commons { namespace Domain
38 {
39 
40 using namespace Arp::System::Acf;
41 using namespace Arp::System::Rsc::Services;
42 using namespace Arp::Plc::Domain;
43 using namespace Arp::Plc::Commons::Services::Internal;
44 using namespace Arp::System::Watchdog::Services::Internal;
45 using namespace Arp::Hardware::DeviceHmi::Services::Internal;
46 
47 class PlcDomainProxy : public AppDomainSingleton<PlcDomainProxy>, private Loggable<PlcDomainProxy>
48 {
49  friend class Arp::Plc::Domain::PlcDomainComponent;
50  friend class Arp::Plc::Domain::PlcDomainProxyComponent;
51 
52 private: // using/typedefs
53  using IPlcDomainServicePtr = std::shared_ptr<IPlcDomainService>;
54  using IWatchdogInfoServicePtr = std::shared_ptr<IWatchdogInfoService>;
55  using ISwitchesServicePtr = std::shared_ptr<ISwitchesService>;
56 
57 public: // construction/destruction
59  PlcDomainProxy(void) = default;
61  ~PlcDomainProxy(void) = default;
62 
63 public: // events
64  event<void> PlcLoading;
65  event<void> PlcLoaded;
66  event<PlcStartKind> PlcStarting;
67  event<void> PlcStarted;
68  event<void> PlcStopping;
69  event<void> PlcStopped;
70  event<bool> PlcUnloading; // bool parameter = 'onError'
71  event<bool> PlcUnloaded; // bool parameter = 'onError'
72  event<void> PlcChanging;
73  event<bool> PlcChanged; // bool parameter = 'success'
74 
75 public: // properties setter/getter
76  ARP_DEPRECATED("Not required anymore. Moved to PLC manager")
77  bool IsPlcSuspendedBySwitch(void);
78  ARP_DEPRECATED("Obsolete")
79  bool IsPlcSuspendedBySystemWatchdog(bool& warmStartNotPossible, bool& autoRestart); // obsolete
80  ARP_DEPRECATED("Not required anymore. Moved to PLC manager")
81  bool IsPlcSuspendedBySystemWatchdog(PlcStartKind& startKind);
82 
83 public: // operations
84  void RegisterComponent(IComponent& component, bool isSystemComponent = false);
85  void RegisterProxyComponent(IComponent& component);
86  void UnregisterComponent(IComponent& component);
87 
88 private: // methods
89  void PublishComponentService(IComponent& component, const char* serviceName, IRscServiceFactory* pServiceFactory);
90 
91 private: // methods
92  void SubscribeServices(bool isPlcProcess = false);
93 
94 private: // deleted methods
95  PlcDomainProxy(const PlcDomainProxy& arg) = default;
96  PlcDomainProxy& operator=(const PlcDomainProxy& arg) = default;
97 
98 private: // fields
99  IPlcDomainServicePtr plcDomainSerivcePtr;
100  IWatchdogInfoServicePtr watchdogInfoServicePtr;
101  ISwitchesServicePtr switchesServicePtr;
102 
103 private: // static fields
104  boolean hasStartStopSwitch = false; /* here for binary compatibility */
105 
106 };
107 
109 // inline methods of class PlcDomainProxy
110 
111 }}}} // end of namespace Arp::Plc::Commons::Domain
This class implements the singleton pattern for singletons with process wide scope.
Definition: AppDomainSingleton.hxx:25
Definition: PlcDomainProxy.hpp:48
PlcDomainProxy(void)=default
Constructs an PlcDomainProxy instance.
~PlcDomainProxy(void)=default
Destructs this instance and frees all resources.
This is the most important basic interface of the Arp platform. Any component shall implement this in...
Definition: IComponent.hpp:81
Use this class to register and invoke several delegates (function pointer in OOP design).
Definition: event.hxx:193
Namespace for the PLC domain
Definition: PlcDomainProxy.hpp:17
This is the namespace of the Application Component Framework.
Definition: ComponentBase.hpp:13
@ System
System components used by the System, Device, Plc or Io domains.
Namespace for classes and interfaces for the Remote Service Call implementation
Definition: IRscReadEnumerator.hxx:10
Root namespace for the PLCnext API