Important Update:

- Add GetValue/SetValue commands for Device command interface
- Bug fix: use case compare on searches
This commit is contained in:
Charl Wentzel
2017-03-02 12:31:50 +02:00
parent d4ee138da8
commit 2d9faa7fa6
2 changed files with 117 additions and 65 deletions

View File

@@ -520,67 +520,6 @@ bool CDeviceCore::UpdateStringValue( TDeviceParam * Param, const char * Value, c
switch (Param->DataType) switch (Param->DataType)
{ {
// case dtUnsigned16 :
// u_int16_t TestVal;
// if (Init || (*((u_int16_t*)Param->Value) != Value))
// {
// // Set new value & mark change
// *((u_int16_t*)Param->Value) = Value;
//
// // Mark change & log event
// Changed = true;
// Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int16_t*)Param->Value) );
// }
// break;
//
// case dtUnsigned32 :
// if (Init || (*((u_int32_t*)Param->Value) != Value))
// {
// // Set new value & mark change
// *((u_int32_t*)Param->Value) = Value;
//
// // Mark change & log event
// Changed = true;
// Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int32_t*)Param->Value) );
// }
// break;
//
// case dtSigned16 :
// if (Init || (*((int16_t*)Param->Value) != Value))
// {
// // Set new value & mark change
// *((int16_t*)Param->Value) = Value;
//
// // Mark change & log event
// Changed = true;
// Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int16_t*)Param->Value) );
// }
// break;
//
// case dtSigned32 :
// if (Init || (*((int32_t*)Param->Value) != Value))
// {
// // Set new value & mark change
// *((int32_t*)Param->Value) = Value;
//
// // Mark change & log event
// Changed = true;
// Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int32_t*)Param->Value) );
// }
// break;
//
// case dtFloat32 : // Special case, where float value is stored in Integer memory (e.g. modbus register)
// if (Init || (*((u_int32_t*)Param->Value) != Value))
// {
// // Set new value & mark change
// *((u_int32_t*)Param->Value) = Value;
//
// // Mark change & log event
// Changed = true;
// Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
// }
// break;
case dtString : case dtString :
// Update register // Update register
if (Init || !CompareParamString( (char*)Param->Value, Param->Len, Value, Len)) if (Init || !CompareParamString( (char*)Param->Value, Param->Len, Value, Len))
@@ -750,6 +689,115 @@ bool CDeviceCore::SetStringValue( TDeviceParam * Param, const char * Value, cons
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool CDeviceCore::SetValue( TDeviceParam * Param, const char * Value, const int Len, bool Force )
{
u_int32_t UnsignedVal;
int32_t SignedVal;
float FloatVal;
char * TempStr;
bool UseTempStr = false;
// Validate
if (!Param || !Value || !Len)
return false;
// Check if string
if (Param->DataType == dtString)
{
// Simply set string
SetStringValue( Param, Value, Len, Force );
}
else
{
// Ensure string is zero terminated
if (Value[Len] != 0) {
TempStr = (char *)malloc( Len+1 );
memcpy( TempStr, Value, Len );
TempStr[Len] = 0;
UseTempStr = true;
}
// Convert to correct type
switch (Param->DataType)
{
case dtUnsigned16 :
case dtUnsigned32 :
UnsignedVal = (u_int32_t)strtoul( ((UseTempStr)? TempStr : Value), NULL, 10 );
SetUnsignedValue( Param, UnsignedVal, Force );
break;
case dtSigned16 :
case dtSigned32 :
SignedVal = (u_int32_t)strtol( ((UseTempStr)? TempStr : Value), NULL, 10 );
SetUnsignedValue( Param, SignedVal, Force );
break;
case dtFloat32 :
FloatVal = (u_int32_t) strtof( ((UseTempStr)? TempStr : Value), NULL );
SetUnsignedValue( Param, FloatVal, Force );
break;
default :
return false;
}
// Clear memory
if (UseTempStr) {
free( TempStr );
}
}
return true;
}
//---------------------------------------------------------------------------
bool CDeviceCore::GetValue( TDeviceParam * Param, char * Value, int &Len )
{
// Validate
if (!Param || !Value)
return false;
// Check if return value longer than actual value
switch (Param->DataType)
{
case dtUnsigned16 :
sprintf( Value, "%u", (*((u_int16_t*)Param->Value)) );
break;
case dtUnsigned32 :
sprintf( Value, "%u", (*((u_int32_t*)Param->Value)) );
break;
case dtSigned16 :
sprintf( Value, "%d", (*((int16_t*)Param->Value)) );
break;
case dtSigned32 :
sprintf( Value, "%d", (*((int32_t*)Param->Value)) );
break;
case dtFloat32 :
sprintf( Value, "%f", (*((float*)Param->Value)) );
break;
case dtString :
if (Len < Param->Len)
{
// Only copy requested no of chars
memcpy( Value, Param->Value, Len );
Value[ Len ] = 0;
}
else
{
memcpy( Value, Param->Value, Param->Len );
Value[ Param->Len ] = 0;
}
break;
}
return true;
}
//---------------------------------------------------------------------------
bool CDeviceCore::CompareParamString( const char * ParamValue, const int ParamLen, const char * Value, const int Len ) bool CDeviceCore::CompareParamString( const char * ParamValue, const int ParamLen, const char * Value, const int Len )
{ {
bool Match = true; bool Match = true;

View File

@@ -95,13 +95,13 @@ protected:
// Find Devices // Find Devices
inline TDevice * GetDevice( const char * Name ) { inline TDevice * GetDevice( const char * Name ) {
TDevice * Device = FirstDevice; TDevice * Device = FirstDevice;
while (Device && strcmp( Device->Name, Name )) while (Device && strcasecmp( Device->Name, Name ))
Device = Device->Next; Device = Device->Next;
return Device; return Device;
} }
inline TDevice ** GetDevicePtr( const char * Name ) { inline TDevice ** GetDevicePtr( const char * Name ) {
TDevice ** Device = &FirstDevice; TDevice ** Device = &FirstDevice;
while (*Device && strcmp( (*Device)->Name, Name )) while (*Device && strcasecmp( (*Device)->Name, Name ))
Device = &((*Device)->Next); Device = &((*Device)->Next);
return Device; return Device;
} }
@@ -119,14 +119,14 @@ protected:
inline TDeviceParam * GetDeviceParam( TDevice * Device, const char * Name ) { inline TDeviceParam * GetDeviceParam( TDevice * Device, const char * Name ) {
if (!Device) return NULL; if (!Device) return NULL;
TDeviceParam * Param = Device->FirstParam; TDeviceParam * Param = Device->FirstParam;
while (Param && strcmp( Param->Name, Name )) while (Param && strcasecmp( Param->Name, Name ))
Param = Param->Next; Param = Param->Next;
return Param; return Param;
} }
inline TDeviceParam ** GetDeviceParamPtr( TDevice * Device, const char * Name ) { inline TDeviceParam ** GetDeviceParamPtr( TDevice * Device, const char * Name ) {
if (!Device) return NULL; if (!Device) return NULL;
TDeviceParam ** Param = &Device->FirstParam; TDeviceParam ** Param = &Device->FirstParam;
while (*Param && strcmp( (*Param)->Name, Name )) while (*Param && strcasecmp( (*Param)->Name, Name ))
Param = &((*Param)->Next); Param = &((*Param)->Next);
return Param; return Param;
} }
@@ -196,6 +196,10 @@ public:
bool SetSignedValue( TDeviceParam * Param, const int32_t Value, bool Force ); bool SetSignedValue( TDeviceParam * Param, const int32_t Value, bool Force );
bool SetFloatValue( TDeviceParam * Param, const float Value, bool Force ); bool SetFloatValue( TDeviceParam * Param, const float Value, bool Force );
bool SetStringValue( TDeviceParam * Param, const char * Value, const int Len, bool Force ); bool SetStringValue( TDeviceParam * Param, const char * Value, const int Len, bool Force );
// Text Interfaces
bool SetValue( TDeviceParam * Param, const char * Value, const int Len, bool Force );
bool GetValue( TDeviceParam * Param, char * Value, int &Len );
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------