extern "C" long CanalOpen( const char *pDevice, unsigned long flags ) { long h = CANAL_ERROR_SUB_DRIVER; unsigned long filter=0, mask=0; bool bFilter=false, bMask=false; wxString str; wxString strDevice( pDevice, wxConvUTF8); wxStringTokenizer tkz(strDevice, _(";") ); // Get possible filter if ( str = tkz.GetNextToken() ) { if ( 0 != str.Length() ) { if ( str.ToULong( &filter ) ) { bFilter = true; } } } // Get possible mask if ( str = tkz.GetNextToken() ) { if ( 0 != str.Length() ) { if ( str.ToULong( &mask ) ) { bMask = true; } } } VscpTcpIf *pvscpif = new VscpTcpIf(); if ( NULL != pvscpif ) { if ( pvscpif->doCmdOpen( strDevice, flags ) ){ if ( !( h = theApp.addDriverObject( pvscpif ) ) ) { delete pvscpif; } else { if ( bFilter ) { pvscpif->doCmdFilter( filter ); } if ( bMask ) { pvscpif->doCmdMask( mask ); } } } else { delete pvscpif; } } return h; }
void *TXWorkerThread::Entry() { eventOutQueue::compatibility_iterator node; vscpEvent *pEvent; // Must be a valid control object pointer if ( NULL == m_pCtrlObject ) return NULL; wxCommandEvent eventConnectionLost( wxVSCP_CTRL_LOST_EVENT, m_pCtrlObject->m_windowID ); /// TCP/IP Control VscpTcpIf tcpifControl; // Connect to the server with the control interface if ( !tcpifControl.doCmdOpen( m_pCtrlObject->m_ifVSCP.m_strHost, m_pCtrlObject->m_ifVSCP.m_port, m_pCtrlObject->m_ifVSCP.m_strUser, m_pCtrlObject->m_ifVSCP.m_strPassword ) ) { //::wxGetApp().logMsg ( _("VSCP TX thread - Unable to connect to server."), DAEMON_LOGMSG_CRITICAL ); m_pCtrlObject->m_errorControl = VSCP_SESSION_ERROR_UNABLE_TO_CONNECT; wxPostEvent( m_pCtrlObject->m_pWnd, eventConnectionLost ); return NULL; } // Get channel ID tcpifControl.doCmdGetChannelID( &m_pCtrlObject->m_txChannelID ); while ( !TestDestroy() && !m_pCtrlObject->m_bQuit ) { if ( wxSEMA_TIMEOUT == m_pCtrlObject->m_semOutQue.WaitTimeout( 500 ) ) continue; m_pCtrlObject->m_mutexOutQueue.Lock(); node = m_pCtrlObject->m_outQueue.GetFirst(); pEvent = node->GetData(); tcpifControl.doCmdSend( pEvent ); m_pCtrlObject->m_outQueue.DeleteNode( node ); deleteVSCPevent( pEvent ); m_pCtrlObject->m_mutexOutQueue.Unlock(); } // while // Close the interface tcpifControl.doCmdClose(); wxPostEvent( m_pCtrlObject->m_pWnd, eventConnectionLost ); return NULL; }
void *RXWorkerThread::Entry() { int rv; VscpTcpIf tcpifReceive; wxCommandEvent eventReceive( wxVSCP_IN_EVENT, m_pCtrlObject->m_windowID ); wxCommandEvent eventConnectionLost( wxVSCP_RCV_LOST_EVENT, m_pCtrlObject->m_windowID ); // Must be a valid control object pointer if ( NULL == m_pCtrlObject ) return NULL; // Connect to the server with the control interface if ( !tcpifReceive.doCmdOpen( m_pCtrlObject->m_ifVSCP.m_strHost, m_pCtrlObject->m_ifVSCP.m_port, m_pCtrlObject->m_ifVSCP.m_strUser, m_pCtrlObject->m_ifVSCP.m_strPassword ) ) { //::wxGetApp().logMsg ( _("VSCP Receive thread - Unable to connect to server."), DAEMON_LOGMSG_CRITICAL ); m_pCtrlObject->m_errorReceive = VSCP_SESSION_ERROR_UNABLE_TO_CONNECT; wxPostEvent( m_pCtrlObject->m_pWnd, eventConnectionLost ); return NULL; } // Find the channel id tcpifReceive.doCmdGetChannelID( &m_pCtrlObject->m_rxChannelID ); // Start Receive Loop tcpifReceive.doCmdEnterReceiveLoop(); vscpEvent event; while ( !TestDestroy() && !m_pCtrlObject->m_bQuit ) { if ( CANAL_ERROR_SUCCESS == ( rv = tcpifReceive.doCmdBlockReceive( &event, 1000 ) ) ) { if ( NULL != m_pCtrlObject->m_pWnd ) { vscpEvent *pEvent = new vscpEvent; if ( NULL != pEvent ) { copyVSCPEvent( pEvent, &event ); eventReceive.SetClientData( pEvent ); wxPostEvent( m_pCtrlObject->m_pWnd, eventReceive ); } } // Session window exist } else { if ( CANAL_ERROR_COMMUNICATION == rv ) m_pCtrlObject->m_bQuit = true; } } // while // Close the interface tcpifReceive.doCmdClose(); wxPostEvent( m_pCtrlObject->m_pWnd, eventConnectionLost ); return NULL; }