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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
Reference in New Issue
Block a user