knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Test.h
1#pragma once
2
3#include <QThread>
4
5#include "Messages.h"
6#include "AbstractCommunicationInterfaces.h"
7
8namespace knowDataTransfert::Test
9{
10 class SendingCommunicationInterface;
11 class ReceivingCommunicationInterface;
12
13 class CommunicationCenter : public QThread
14 {
15 public:
17 {
18 start();
19 }
21 {
22 m_running = false;
23 m_cv.wakeOne();
24 wait();
25 }
26 void add(const QString& _communicationNamespace, ReceivingCommunicationInterface* _receiver)
27 {
28 m_receivers[_communicationNamespace].append(_receiver);
29 }
30 void add(const QString& _communicationNamespace, SendingCommunicationInterface* _sender)
31 {
32 m_senders[_communicationNamespace] = _sender;
33 }
34 void add(const Data& _data, void* _sender, const QString& _communicationNamespace)
35 {
36 QMutexLocker l(&m_mutex);
37 m_dmis.append({_communicationNamespace, _data, _sender});
38 m_cv.wakeOne();
39 }
40 void add(const DataControl& _data, void* _sender, const QString& _communicationNamespace)
41 {
42 QMutexLocker l(&m_mutex);
43 m_dcmis.append({_communicationNamespace, _data, _sender});
44 m_cv.wakeOne();
45 }
46 protected:
47 void run() override;
48
49 private:
50 template<typename _MsgT_>
51 struct MessageInfo
52 {
53 QString communicationNamespace;
54 _MsgT_ msg;
55 void* sender;
56 };
57
58 using DataMessageInfo = MessageInfo<Data>;
59 using DataControlMessageInfo = MessageInfo<DataControl>;
60
61 int m_fault_generator = 0;
66 QMutex m_mutex;
67 QWaitCondition m_cv;
68 bool m_running = true;
69 };
70
72 {
73 public:
74 SendingCommunicationInterface(const QString& _communicationNamespace, CommunicationCenter* _center) : AbstractSendingCommunicationInterface(_communicationNamespace), m_center(_center)
75 {
76 m_center->add(_communicationNamespace, this);
77 }
78 void initialise() override {}
79 void send(const Data& _data) override;
80 void send(const DataControl& _dataControl) override;
81 using AbstractSendingCommunicationInterface::handle;
82 private:
83 int m_fault_generator = 1;
84 CommunicationCenter* m_center;
85 };
86
88 {
89 public:
90 ReceivingCommunicationInterface(const QString& _communicationNamespace, CommunicationCenter* _center) : 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
145 void SendingCommunicationInterface::send(const Data& _data)
146 {
147 m_center->add(_data, this, communicationNamespace());
148 }
149
150 void SendingCommunicationInterface::send(const DataControl& _dataControl)
151 {
152 m_center->add(_dataControl, this, communicationNamespace());
153 }
154
155 void ReceivingCommunicationInterface::send(const DataControl& _dataControl)
156 {
157 m_center->add(_dataControl, this, communicationNamespace());
158 }
159
160
162 {
163 public:
164 CommunicationInterfaceFactory(CommunicationCenter* _center) : m_center(_center)
165 {
166 }
167 AbstractSendingCommunicationInterface* createSendingInterface(const QString& _communicationNamespace) override
168 {
169 return new SendingCommunicationInterface(_communicationNamespace, m_center);
170 }
171 AbstractReceivingCommunicationInterface* createReceivingInterface(const QString& _communicationNamespace) override
172 {
173 return new ReceivingCommunicationInterface(_communicationNamespace, m_center);
174 }
175 private:
176 CommunicationCenter* m_center;
177 };
178}
Definition Forward.h:8
Definition Forward.h:12
Definition AbstractCommunicationInterfaces.h:47
Definition AbstractCommunicationInterfaces.h:35
Definition AbstractCommunicationInterfaces.h:27
Definition Messages.h:14
Definition Messages.h:9