Important Update:

- SelectableCore:
  - Split SetBuffers() into SetInBuffer() and SetOutBuffer()
  - Rename SerialConfig() -> SetSerialConfig()
  - Add serial port configuration (eg. baudrate) to ConfigData
  - Read only no of bytes reported by FIONREAD
- DataTree:
  - Bug fix: Create Int/Float/Bool params if requested
This commit is contained in:
Charl Wentzel
2017-11-28 18:35:05 +02:00
parent 4ed36809b8
commit 89123fa4af
3 changed files with 66 additions and 25 deletions

View File

@@ -576,7 +576,7 @@ const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long
TDataMember * Member; TDataMember * Member;
// Validate // 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)) ) { ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
return strtol( Member->Value, NULL, 10 ); return strtol( Member->Value, NULL, 10 );
} }
@@ -597,7 +597,7 @@ const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path,
TDataMember * Member; TDataMember * Member;
// Validate // 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)) ) { ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
return strtod( Member->Value, NULL ); return strtod( Member->Value, NULL );
} }
@@ -618,7 +618,7 @@ const bool CDataTree::GetBool( TDataMember * BaseMember, const char * Path, boo
TDataMember * Member; TDataMember * Member;
// Validate // Validate
if ((Member = GetMember( BaseMember, Path, false ))) { if ((Member = GetMember( BaseMember, Path, Create ))) {
if (Member->Type == jtString) { if (Member->Type == jtString) {
return ((!*Member->Value)? false : true); return ((!*Member->Value)? false : true);
} }

View File

@@ -73,6 +73,11 @@ bool CSelectableCore::LoadConfigData()
char * Address; char * Address;
char * Port; char * Port;
char * Parity;
short ParityVal;
char * FlowCtrl;
short FlowCtrlVal;
// Call Previous load config // Call Previous load config
CFunctionCore::LoadConfigData(); CFunctionCore::LoadConfigData();
@@ -97,6 +102,30 @@ bool CSelectableCore::LoadConfigData()
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value
} }
SetPortHandle( Handle, Address ); // Assign values 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" )) else if (!strcasecmp( Type, "TCPserver" ))
{ {
@@ -133,11 +162,11 @@ bool CSelectableCore::LoadConfigData()
DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) ); DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) );
// Input buffer // Input buffer
SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ), SetInBuffer( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ),
DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ), DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ),
DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ), DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ),
DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ), DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) );
DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) ); SetOutBuffer( Handle, DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ) );
// Next // Next
TempMember = DataTree->GetNextChild( TempMember ); 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 // Validate
if (!Handle) { if (!Handle) {
@@ -409,15 +438,6 @@ bool CSelectableCore::SetBuffers( THandle * Handle, int InBufSize, int OutBufSiz
Handle->InBuffer = (CRollingBuffer*) new CRollingBuffer( InBufSize ); 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 // Set Input Timeout
Handle->InTimeout = InTimeout; 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 ) int CSelectableCore::OpenPort( THandle * Handle )
{ {
// Validate // Validate
@@ -813,9 +853,9 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
} }
// Copy Parent Buffer setup // Copy Parent Buffer setup
SetBuffers( *RemoteClient, ((Handle->InBuffer)? Handle->InBuffer->Size() : 0), SetInBuffer( *RemoteClient, ((Handle->InBuffer)? Handle->InBuffer->Size() : 0),
((Handle->OutBuffer)? Handle->OutBuffer->Size() : 0), Handle->InTimeout, Handle->InMarker, Handle->InMarkerLen );
Handle->InTimeout, Handle->InMarker, Handle->InMarkerLen ); SetOutBuffer( *RemoteClient, ((Handle->OutBuffer)? Handle->OutBuffer->Size() : 0) );
// Set Key parameters // Set Key parameters
(*RemoteClient)->FD = ClientFD; (*RemoteClient)->FD = ClientFD;
@@ -1167,7 +1207,7 @@ bool CSelectableCore::Read( THandle * Handle )
} }
// Read File directly into buffer // 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 // Process Buffer
ProcessBuffer( Handle, false ); ProcessBuffer( Handle, false );
@@ -1587,7 +1627,7 @@ bool CSelectableCore::Process()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Set serial port configuration parameters // 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; struct termios newtio;
int flags = 0; int flags = 0;

View File

@@ -245,8 +245,9 @@ public:
THandle * CreateHandle( const char * HandleName, bool CreateChannel ); THandle * CreateHandle( const char * HandleName, bool CreateChannel );
bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback ); bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback );
bool SetAutoManage( THandle * Handle, bool AutoManage, bool Persistent, int ReopenTime = 0 ); 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 SetInBuffer( THandle * Handle, int InBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ); bool SetOutBuffer( THandle * Handle, int OutBufSize );
bool SetSerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait );
// File Interface // File Interface
bool SetPortHandle( THandle * Handle, const char * FileName ); bool SetPortHandle( THandle * Handle, const char * FileName );