diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 597ad88..514e3e3 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -576,7 +576,7 @@ const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long TDataMember * Member; // Validate - if ((Member = GetMember( BaseMember, Path, false )) && + if ((Member = GetMember( BaseMember, Path, Create )) && ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) { return strtol( Member->Value, NULL, 10 ); } @@ -597,7 +597,7 @@ const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path, TDataMember * Member; // Validate - if ((Member = GetMember( BaseMember, Path, false )) && + if ((Member = GetMember( BaseMember, Path, Create )) && ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) { return strtod( Member->Value, NULL ); } @@ -618,7 +618,7 @@ const bool CDataTree::GetBool( TDataMember * BaseMember, const char * Path, boo TDataMember * Member; // Validate - if ((Member = GetMember( BaseMember, Path, false ))) { + if ((Member = GetMember( BaseMember, Path, Create ))) { if (Member->Type == jtString) { return ((!*Member->Value)? false : true); } diff --git a/SelectableCore.cpp b/SelectableCore.cpp index b853979..8aa4f2a 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -73,6 +73,11 @@ bool CSelectableCore::LoadConfigData() char * Address; char * Port; + char * Parity; + short ParityVal; + char * FlowCtrl; + short FlowCtrlVal; + // Call Previous load config CFunctionCore::LoadConfigData(); @@ -97,6 +102,30 @@ bool CSelectableCore::LoadConfigData() Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value } SetPortHandle( Handle, Address ); // Assign values + + Parity = (char*)DataTree->GetStr( TempMember, "Port/Parity", "none", true ); + if (!strcasecmp( Parity, "none" )) + ParityVal = NO_PARITY; + else if (!strcasecmp( Parity, "odd" )) + ParityVal = ODD_PARITY; + else if (!strcasecmp( Parity, "even" )) + ParityVal = EVEN_PARITY; + else if (!strcasecmp( Parity, "mark" )) + ParityVal = MARK_PARITY; + + FlowCtrl = (char*)DataTree->GetStr( TempMember, "Port/FlowCtrl", "none", true ); + if (!strcasecmp( FlowCtrl, "none" )) + FlowCtrlVal = NO_FLOWCTRL; + else if (!strcasecmp( FlowCtrl, "hardware" )) + FlowCtrlVal = HW_FLOWCTRL; + else if (!strcasecmp( FlowCtrl, "software" )) + FlowCtrlVal = SW_FLOWCTRL; + + SetSerialConfig( Handle, DataTree->GetInt( TempMember, "Port/BaudRate", 19200, true ), + DataTree->GetInt( TempMember, "Port/DataBits", 8, true ), + DataTree->GetInt( TempMember, "Port/StopBits", 1, true ), + ParityVal, FlowCtrlVal, + DataTree->GetInt( TempMember, "Port/DataWait", 0, true)); } else if (!strcasecmp( Type, "TCPserver" )) { @@ -133,11 +162,11 @@ bool CSelectableCore::LoadConfigData() DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) ); // Input buffer - SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ), - DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ), - DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ), - DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ), - DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) ); + SetInBuffer( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ), + DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ), + DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ), + DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) ); + SetOutBuffer( Handle, DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ) ); // Next TempMember = DataTree->GetNextChild( TempMember ); @@ -393,7 +422,7 @@ bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, bool Per } //--------------------------------------------------------------------------- -bool CSelectableCore::SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen ) +bool CSelectableCore::SetInBuffer( THandle * Handle, int InBufSize, int InTimeout, const char * InMarker, int InMarkerLen ) { // Validate if (!Handle) { @@ -409,15 +438,6 @@ bool CSelectableCore::SetBuffers( THandle * Handle, int InBufSize, int OutBufSiz Handle->InBuffer = (CRollingBuffer*) new CRollingBuffer( InBufSize ); } - // Output Buffer - if (Handle->OutBuffer) { - delete Handle->OutBuffer; - Handle->OutBuffer = NULL; - } - if (OutBufSize) { - Handle->OutBuffer = (CRollingBuffer*) new CRollingBuffer( OutBufSize ); - } - // Set Input Timeout Handle->InTimeout = InTimeout; @@ -433,6 +453,26 @@ bool CSelectableCore::SetBuffers( THandle * Handle, int InBufSize, int OutBufSiz } //--------------------------------------------------------------------------- +bool CSelectableCore::SetOutBuffer( THandle * Handle, int OutBufSize ) +{ + // Validate + if (!Handle) { + return false; + } + + // Output Buffer + if (Handle->OutBuffer) { + delete Handle->OutBuffer; + Handle->OutBuffer = NULL; + } + if (OutBufSize) { + Handle->OutBuffer = (CRollingBuffer*) new CRollingBuffer( OutBufSize ); + } + + return true; +} +//--------------------------------------------------------------------------- + int CSelectableCore::OpenPort( THandle * Handle ) { // Validate @@ -813,9 +853,9 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) } // Copy Parent Buffer setup - SetBuffers( *RemoteClient, ((Handle->InBuffer)? Handle->InBuffer->Size() : 0), - ((Handle->OutBuffer)? Handle->OutBuffer->Size() : 0), - Handle->InTimeout, Handle->InMarker, Handle->InMarkerLen ); + SetInBuffer( *RemoteClient, ((Handle->InBuffer)? Handle->InBuffer->Size() : 0), + Handle->InTimeout, Handle->InMarker, Handle->InMarkerLen ); + SetOutBuffer( *RemoteClient, ((Handle->OutBuffer)? Handle->OutBuffer->Size() : 0) ); // Set Key parameters (*RemoteClient)->FD = ClientFD; @@ -1167,7 +1207,7 @@ bool CSelectableCore::Read( THandle * Handle ) } // Read File directly into buffer - if (Handle->InBuffer && (BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD ))) + if (Handle->InBuffer && (BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD, BytesWaiting ))) { // Process Buffer ProcessBuffer( Handle, false ); @@ -1587,7 +1627,7 @@ bool CSelectableCore::Process() //--------------------------------------------------------------------------- // Set serial port configuration parameters -bool CSelectableCore::SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ) +bool CSelectableCore::SetSerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ) { struct termios newtio; int flags = 0; diff --git a/SelectableCore.h b/SelectableCore.h index 8faab32..fab8e1a 100644 --- a/SelectableCore.h +++ b/SelectableCore.h @@ -245,8 +245,9 @@ public: THandle * CreateHandle( const char * HandleName, bool CreateChannel ); bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback ); bool SetAutoManage( THandle * Handle, bool AutoManage, bool Persistent, int ReopenTime = 0 ); - bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen ); - bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ); + bool SetInBuffer( THandle * Handle, int InBufSize, int InTimeout, const char * InMarker, int InMarkerLen ); + bool SetOutBuffer( THandle * Handle, int OutBufSize ); + bool SetSerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ); // File Interface bool SetPortHandle( THandle * Handle, const char * FileName );