@@ -48,6 +48,14 @@ vscpClientTcp::vscpClientTcp()
48
48
m_guidif.clear ();
49
49
m_bPolling = false ;
50
50
m_obid = 0 ;
51
+
52
+ vscp_clearVSCPFilter (&m_filterIn); // Accept all events
53
+ vscp_clearVSCPFilter (&m_filterOut); // Send all events
54
+
55
+ sem_init (&m_semReceiveQueue, 0 , 0 );
56
+
57
+ pthread_mutex_init (&m_mutexTcpIpObject, NULL );
58
+ pthread_mutex_init (&m_mutexReceiveQueue, NULL );
51
59
}
52
60
53
61
// /////////////////////////////////////////////////////////////////////////////
@@ -59,6 +67,11 @@ vscpClientTcp::~vscpClientTcp()
59
67
// Just to be sure
60
68
disconnect ();
61
69
70
+ sem_destroy (&m_semReceiveQueue);
71
+
72
+ pthread_mutex_destroy (&m_mutexTcpIpObject);
73
+ pthread_mutex_destroy (&m_mutexReceiveQueue);
74
+
62
75
// Clear the input queue (if needed)
63
76
// while (m_inputQue.size()) {
64
77
// vscpEvent *pev = m_inputQue.front();
@@ -96,17 +109,17 @@ vscpClientTcp::getConfigAsJson(void)
96
109
j[" keyfile" ] = m_keyfile;
97
110
j[" pwkeyfile" ] = m_pwKeyfile;
98
111
99
- // Filter
112
+ // Filter In
100
113
101
- j[" priority-filter" ] = m_filter .filter_priority ;
102
- j[" priority-mask" ] = m_filter .mask_priority ;
103
- j[" class-filter" ] = m_filter .filter_class ;
104
- j[" class-mask" ] = m_filter .mask_class ;
105
- j[" type-filter" ] = m_filter .filter_type ;
106
- j[" type-mask" ] = m_filter .mask_type ;
107
- vscp_writeGuidArrayToString (str, m_filter .filter_GUID );
114
+ j[" priority-filter" ] = m_filterIn .filter_priority ;
115
+ j[" priority-mask" ] = m_filterIn .mask_priority ;
116
+ j[" class-filter" ] = m_filterIn .filter_class ;
117
+ j[" class-mask" ] = m_filterIn .mask_class ;
118
+ j[" type-filter" ] = m_filterIn .filter_type ;
119
+ j[" type-mask" ] = m_filterIn .mask_type ;
120
+ vscp_writeGuidArrayToString (str, m_filterIn .filter_GUID );
108
121
j[" guid-filter" ] = str;
109
- vscp_writeGuidArrayToString (str, m_filter .mask_GUID );
122
+ vscp_writeGuidArrayToString (str, m_filterIn .mask_GUID );
110
123
j[" guid-mask" ] = str;
111
124
112
125
return j.dump ();
@@ -190,37 +203,37 @@ vscpClientTcp::initFromJson(const std::string &config)
190
203
// Filter
191
204
192
205
if (j.contains (" priority-filter" )) {
193
- m_filter .filter_priority = j[" priority-filter" ].get <uint8_t >();
206
+ m_filterIn .filter_priority = j[" priority-filter" ].get <uint8_t >();
194
207
}
195
208
196
209
if (j.contains (" priority-mask" )) {
197
- m_filter .mask_priority = j[" priority-mask" ].get <uint8_t >();
210
+ m_filterIn .mask_priority = j[" priority-mask" ].get <uint8_t >();
198
211
}
199
212
200
213
if (j.contains (" class-filter" )) {
201
- m_filter .filter_class = j[" class-filter" ].get <uint16_t >();
214
+ m_filterIn .filter_class = j[" class-filter" ].get <uint16_t >();
202
215
}
203
216
204
217
if (j.contains (" class-mask" )) {
205
- m_filter .mask_class = j[" class-mask" ].get <uint16_t >();
218
+ m_filterIn .mask_class = j[" class-mask" ].get <uint16_t >();
206
219
}
207
220
208
221
if (j.contains (" type-filter" )) {
209
- m_filter .filter_type = j[" type-filter" ].get <uint16_t >();
222
+ m_filterIn .filter_type = j[" type-filter" ].get <uint16_t >();
210
223
}
211
224
212
225
if (j.contains (" type-mask" )) {
213
- m_filter .mask_type = j[" type-mask" ].get <uint16_t >();
226
+ m_filterIn .mask_type = j[" type-mask" ].get <uint16_t >();
214
227
}
215
228
216
229
if (j.contains (" guid-filter" )) {
217
230
std::string str = j[" guid-filter" ].get <std::string>();
218
- vscp_getGuidFromStringToArray (m_filter .filter_GUID , str);
231
+ vscp_getGuidFromStringToArray (m_filterIn .filter_GUID , str);
219
232
}
220
233
221
234
if (j.contains (" guid-mask" )) {
222
235
std::string str = j[" guid-mask" ].get <std::string>();
223
- vscp_getGuidFromStringToArray (m_filter .mask_GUID , str);
236
+ vscp_getGuidFromStringToArray (m_filterIn .mask_GUID , str);
224
237
}
225
238
}
226
239
catch (...) {
@@ -477,9 +490,9 @@ vscpClientTcp::setfilter(vscpEventFilter &filter)
477
490
return m_tcp.doCmdFilter (&filter);
478
491
}
479
492
else {
480
- m_mutexReceive. lock ( );
493
+ pthread_mutex_lock (&m_mutexTcpIpObject );
481
494
return m_tcpReceive.doCmdFilter (&filter);
482
- m_mutexReceive. unlock ( );
495
+ pthread_mutex_unlock (&m_mutexTcpIpObject );
483
496
}
484
497
}
485
498
@@ -617,18 +630,38 @@ workerThread(vscpClientTcp *pObj)
617
630
618
631
while (pObj->m_bRun ) {
619
632
620
- pObj->m_mutexReceive . lock ( );
633
+ pthread_mutex_lock (& pObj->m_mutexTcpIpObject );
621
634
622
- // m_pif->rcvloopRead(500);
623
635
if (VSCP_ERROR_SUCCESS == m_pifReceive->doCmdBlockingReceive (&ev)) {
624
- pObj->sendToCallbacks (&ev);
636
+
637
+ if (vscp_doLevel2Filter (&ev, &pObj->m_filterIn )) {
638
+
639
+ if (pObj->isCallbackEvActive ()) {
640
+ pObj->m_callbackev (ev, pObj->getCallbackObj ());
641
+ }
642
+
643
+ if (pObj->isCallbackExActive ()) {
644
+ vscpEventEx ex;
645
+ if (vscp_convertEventToEventEx (&ex, &ev)) {
646
+ pObj->m_callbackex (ex, pObj->getCallbackObj ());
647
+ }
648
+ }
649
+
650
+ // Add to input queue only if no callback set
651
+ if (!pObj->isCallbackEvActive () || !pObj->isCallbackExActive ()) {
652
+ pthread_mutex_lock (&pObj->m_mutexReceiveQueue );
653
+ pObj->m_receiveList .push_back (&ev);
654
+ sem_post (&pObj->m_semReceiveQueue );
655
+ pthread_mutex_unlock (&pObj->m_mutexReceiveQueue );
656
+ }
657
+ }
625
658
vscp_deleteEvent (&ev);
626
659
}
627
660
628
661
if (!m_pifReceive->isConnected ()) {
629
662
pObj->m_bRun = false ;
630
663
}
631
664
632
- pObj->m_mutexReceive . unlock ( );
665
+ pthread_mutex_unlock (& pObj->m_mutexTcpIpObject );
633
666
}
634
667
}
0 commit comments