kDB: Knowledge DataBase
Loading...
Searching...
No Matches
Test.h
1#pragma once
2
3#include <QThread>
4
5#include "AbstractCommunicationInterfaces.h"
6#include "Messages.h"
7
8namespace knowDataTransfert::Test
9{
10 class SendingCommunicationInterface;
11 class ReceivingCommunicationInterface;
12
13 class CommunicationCenter : public QThread
14 {
15 public:
16 CommunicationCenter() { start(); }
18 {
19 m_running = false;
20 m_cv.wakeOne();
21 wait();
22 }
23 void add(const QString& _communicationNamespace, ReceivingCommunicationInterface* _receiver)
24 {
25 m_receivers[_communicationNamespace].append(_receiver);
26 }
27 void add(const QString& _communicationNamespace, SendingCommunicationInterface* _sender)
28 {
29 m_senders[_communicationNamespace] = _sender;
30 }
31 void add(const Data& _data, void* _sender, const QString& _communicationNamespace)
32 {
33 QMutexLocker l(&m_mutex);
34 m_dmis.append({_communicationNamespace, _data, _sender});
35 m_cv.wakeOne();
36 }
37 void add(const DataControl& _data, void* _sender, const QString& _communicationNamespace)
38 {
39 QMutexLocker l(&m_mutex);
40 m_dcmis.append({_communicationNamespace, _data, _sender});
41 m_cv.wakeOne();
42 }
43 protected:
44 void run() override;
45 private:
46 template<typename _MsgT_>
47 struct MessageInfo
48 {
49 QString communicationNamespace;
50 _MsgT_ msg;
51 void* sender;
52 };
53
54 using DataMessageInfo = MessageInfo<Data>;
55 using DataControlMessageInfo = MessageInfo<DataControl>;
56
57 int m_fault_generator = 0;
62 QMutex m_mutex;
63 QWaitCondition m_cv;
64 bool m_running = true;
65 };
66
68 {
69 public:
70 SendingCommunicationInterface(const QString& _communicationNamespace,
71 CommunicationCenter* _center)
72 : AbstractSendingCommunicationInterface(_communicationNamespace), m_center(_center)
73 {
74 m_center->add(_communicationNamespace, this);
75 }
76 void initialise() override {}
77 void send(const Data& _data) override;
78 void send(const DataControl& _dataControl) override;
79 using AbstractSendingCommunicationInterface::handle;
80 private:
81 int m_fault_generator = 1;
82 CommunicationCenter* m_center;
83 };
84
86 {
87 public:
88 ReceivingCommunicationInterface(const QString& _communicationNamespace,
89 CommunicationCenter* _center)
90 : AbstractReceivingCommunicationInterface(_communicationNamespace), m_center(_center)
91 {
92 m_center->add(_communicationNamespace, this);
93 }
94 void initialise() override {}
95 void send(const DataControl& _dataControl) override;
96 using AbstractReceivingCommunicationInterface::handle;
97 private:
98 CommunicationCenter* m_center;
99 };
100
101 void CommunicationCenter::run()
102 {
103 while(m_running)
104 {
107 {
108 QMutexLocker l(&m_mutex);
109 std::swap(dmis, m_dmis);
110 std::swap(dcmis, m_dcmis);
111 }
112 for(const DataMessageInfo& dmi : dmis)
113 {
114 for(ReceivingCommunicationInterface* i : m_receivers[dmi.communicationNamespace])
115 {
116 if(m_fault_generator % 3 != 0)
117 {
118 i->handle(dmi.msg);
119 }
120 ++m_fault_generator;
121 }
122 }
123
124 for(const DataControlMessageInfo& dcmi : dcmis)
125 {
126 for(ReceivingCommunicationInterface* i : m_receivers[dcmi.communicationNamespace])
127 {
128 if(i != dcmi.sender)
129 {
130 i->handle(dcmi.msg);
131 }
132 }
133 if(m_senders[dcmi.communicationNamespace] != dcmi.sender)
134 {
135 m_senders[dcmi.communicationNamespace]->handle(dcmi.msg);
136 }
137 }
138
139 QMutexLocker l(&m_mutex);
140 m_cv.wait(&m_mutex);
141 }
142 }
143
144 void SendingCommunicationInterface::send(const Data& _data)
145 {
146 m_center->add(_data, this, communicationNamespace());
147 }
148
149 void SendingCommunicationInterface::send(const DataControl& _dataControl)
150 {
151 m_center->add(_dataControl, this, communicationNamespace());
152 }
153
154 void ReceivingCommunicationInterface::send(const DataControl& _dataControl)
155 {
156 m_center->add(_dataControl, this, communicationNamespace());
157 }
158
160 {
161 public:
162 CommunicationInterfaceFactory(CommunicationCenter* _center) : m_center(_center) {}
164 createSendingInterface(const QString& _communicationNamespace) override
165 {
166 return new SendingCommunicationInterface(_communicationNamespace, m_center);
167 }
169 createReceivingInterface(const QString& _communicationNamespace) override
170 {
171 return new ReceivingCommunicationInterface(_communicationNamespace, m_center);
172 }
173 private:
174 CommunicationCenter* m_center;
175 };
176} // namespace knowDataTransfert::Test
Definition Forward.h:10
Definition Revision.h:9
Definition AbstractCommunicationInterfaces.h:47
Definition AbstractCommunicationInterfaces.h:35
Definition AbstractCommunicationInterfaces.h:27
Definition Messages.h:14
Definition Messages.h:9