Commit c0b9c0fd authored by Pavel Vainerman's avatar Pavel Vainerman

(VTypes): перенёс новые типы F2r,U2r,I2r из uniset

parent d9634c7d
...@@ -713,6 +713,11 @@ bool MBExchange::initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty ...@@ -713,6 +713,11 @@ bool MBExchange::initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty
VTypes::F2 f(data,VTypes::F2::wsize()); VTypes::F2 f(data,VTypes::F2::wsize());
IOBase::processingFasAI( p, (float)f, shm, true ); IOBase::processingFasAI( p, (float)f, shm, true );
} }
else if( p->vType == VTypes::vtF2r )
{
VTypes::F2r f(data,VTypes::F2r::wsize());
IOBase::processingFasAI( p, (float)f, shm, true );
}
else if( p->vType == VTypes::vtF4 ) else if( p->vType == VTypes::vtF4 )
{ {
VTypes::F4 f(data,VTypes::F4::wsize()); VTypes::F4 f(data,VTypes::F4::wsize());
...@@ -723,11 +728,21 @@ bool MBExchange::initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty ...@@ -723,11 +728,21 @@ bool MBExchange::initSMValue( ModbusRTU::ModbusData* data, int count, RSProperty
VTypes::I2 i2(data,VTypes::I2::wsize()); VTypes::I2 i2(data,VTypes::I2::wsize());
IOBase::processingAsAI( p, (int)i2, shm, true ); IOBase::processingAsAI( p, (int)i2, shm, true );
} }
else if( p->vType == VTypes::vtI2r )
{
VTypes::I2r i2(data,VTypes::I2::wsize());
IOBase::processingAsAI( p, (int)i2, shm, true );
}
else if( p->vType == VTypes::vtU2 ) else if( p->vType == VTypes::vtU2 )
{ {
VTypes::U2 u2(data,VTypes::U2::wsize()); VTypes::U2 u2(data,VTypes::U2::wsize());
IOBase::processingAsAI( p, (unsigned int)u2, shm, true ); IOBase::processingAsAI( p, (unsigned int)u2, shm, true );
} }
else if( p->vType == VTypes::vtU2r )
{
VTypes::U2r u2(data,VTypes::U2::wsize());
IOBase::processingAsAI( p, (unsigned int)u2, shm, true );
}
return true; return true;
} }
...@@ -1226,7 +1241,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1226,7 +1241,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
return; return;
} }
else if( p->vType == VTypes::vtF2 ) else if( p->vType == VTypes::vtF2 || p->vType == VTypes::vtF2r )
{ {
auto i = p->reg->rit; auto i = p->reg->rit;
if( save ) if( save )
...@@ -1234,9 +1249,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1234,9 +1249,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
if( r->mb_initOK ) if( r->mb_initOK )
{ {
float f = IOBase::processingFasAO( p, shm, force_out ); float f = IOBase::processingFasAO( p, shm, force_out );
VTypes::F2 f2(f); if( p->vType == VTypes::vtF2 )
for( unsigned int k=0; k<VTypes::F2::wsize(); k++, i++ ) {
i->second->mbval = f2.raw.v[k]; VTypes::F2 f2(f);
for( int k=0; k<VTypes::F2::wsize(); k++, i++ )
i->second->mbval = f2.raw.v[k];
}
else if( p->vType == VTypes::vtF2r )
{
VTypes::F2r f2(f);
for( int k=0; k<VTypes::F2r::wsize(); k++, i++ )
i->second->mbval = f2.raw.v[k];
}
r->sm_initOK = true; r->sm_initOK = true;
} }
...@@ -1247,10 +1271,21 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1247,10 +1271,21 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
for( unsigned int k=0; k<VTypes::F2::wsize(); k++, i++ ) for( unsigned int k=0; k<VTypes::F2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
VTypes::F2 f(data,VTypes::F2::wsize()); float f=0;
if( p->vType == VTypes::vtF2 )
{
VTypes::F2 f1(data,VTypes::F2::wsize());
f = (float)f1;
}
else if( p->vType == VTypes::vtF2r )
{
VTypes::F2r f1(data,VTypes::F2r::wsize());
f = (float)f1;
}
delete[] data; delete[] data;
IOBase::processingFasAI( p, (float)f, shm, force ); IOBase::processingFasAI( p, f, shm, force );
} }
} }
else if( p->vType == VTypes::vtF4 ) else if( p->vType == VTypes::vtF4 )
...@@ -1278,7 +1313,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1278,7 +1313,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
IOBase::processingFasAI( p, (float)f, shm, force ); IOBase::processingFasAI( p, (float)f, shm, force );
} }
} }
else if( p->vType == VTypes::vtI2 ) else if( p->vType == VTypes::vtI2 || p->vType == VTypes::vtI2r )
{ {
auto i = p->reg->rit; auto i = p->reg->rit;
if( save ) if( save )
...@@ -1286,10 +1321,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1286,10 +1321,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
if( r->mb_initOK ) if( r->mb_initOK )
{ {
long v = IOBase::processingAsAO( p, shm, force_out ); long v = IOBase::processingAsAO( p, shm, force_out );
VTypes::I2 i2(v); if( p->vType == VTypes::vtI2 )
for( unsigned int k=0; k<VTypes::I2::wsize(); k++, i++ ) {
i->second->mbval = i2.raw.v[k]; VTypes::I2 i2(v);
for( int k=0; k<VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k];
}
else if( p->vType == VTypes::vtI2r )
{
VTypes::I2r i2(v);
for( int k=0; k<VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k];
}
r->sm_initOK = true; r->sm_initOK = true;
} }
} }
...@@ -1299,13 +1342,23 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1299,13 +1342,23 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
for( unsigned int k=0; k<VTypes::I2::wsize(); k++, i++ ) for( unsigned int k=0; k<VTypes::I2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
VTypes::I2 i2(data,VTypes::I2::wsize()); int v = 0;
delete[] data; if( p->vType == VTypes::vtI2 )
{
VTypes::I2 i2(data,VTypes::I2::wsize());
v = (int)i2;
}
else if( p->vType == VTypes::vtI2r )
{
VTypes::I2r i2(data,VTypes::I2::wsize());
v = (int)i2;
}
IOBase::processingAsAI( p, (int)i2, shm, force ); delete[] data;
IOBase::processingAsAI( p, v, shm, force );
} }
} }
else if( p->vType == VTypes::vtU2 ) else if( p->vType == VTypes::vtU2 || p->vType == VTypes::vtU2r )
{ {
auto i = p->reg->rit; auto i = p->reg->rit;
if( save ) if( save )
...@@ -1313,9 +1366,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1313,9 +1366,18 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
if( r->mb_initOK ) if( r->mb_initOK )
{ {
long v = IOBase::processingAsAO( p, shm, force_out ); long v = IOBase::processingAsAO( p, shm, force_out );
VTypes::U2 u2(v); if( p->vType == VTypes::vtU2 )
for( unsigned int k=0; k<VTypes::U2::wsize(); k++, i++ ) {
i->second->mbval = u2.raw.v[k]; VTypes::U2 u2(v);
for( int k=0; k<VTypes::U2::wsize(); k++, i++ )
i->second->mbval = u2.raw.v[k];
}
else if( p->vType == VTypes::vtU2r )
{
VTypes::U2r u2(v);
for( int k=0; k<VTypes::U2::wsize(); k++, i++ )
i->second->mbval = u2.raw.v[k];
}
r->sm_initOK = true; r->sm_initOK = true;
} }
...@@ -1326,10 +1388,20 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1326,10 +1388,20 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
for( unsigned int k=0; k<VTypes::U2::wsize(); k++, i++ ) for( unsigned int k=0; k<VTypes::U2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
VTypes::U2 u2(data,VTypes::U2::wsize()); unsigned int v = 0;
delete[] data; if( p->vType == VTypes::vtU2 )
{
VTypes::U2 u2(data,VTypes::U2::wsize());
v = (unsigned int)u2;
}
else if( p->vType == VTypes::vtU2r )
{
VTypes::U2r u2(data,VTypes::U2::wsize());
v = (unsigned int)u2;
}
IOBase::processingAsAI( p, (unsigned int)u2, shm, force ); delete[] data;
IOBase::processingAsAI( p, v, shm, force );
} }
} }
......
...@@ -1258,7 +1258,7 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb ...@@ -1258,7 +1258,7 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
{ {
val = IOBase::processingAsAO(p,shm,force); val = IOBase::processingAsAO(p,shm,force);
} }
if( p->vtype == VTypes::vtF2 ) else if( p->vtype == VTypes::vtF2 )
{ {
float f = IOBase::processingFasAO(p,shm,force); float f = IOBase::processingFasAO(p,shm,force);
VTypes::F2 f2(f); VTypes::F2 f2(f);
...@@ -1268,6 +1268,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb ...@@ -1268,6 +1268,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
// if( p->wnum >=0 && p->wnum < f4.wsize() // if( p->wnum >=0 && p->wnum < f4.wsize()
val = f2.raw.v[p->wnum]; val = f2.raw.v[p->wnum];
} }
else if( p->vtype == VTypes::vtF2r )
{
float f = IOBase::processingFasAO(p,shm,force);
VTypes::F2r f2(f);
// оптимизируем и проверку не делаем
// считая, что при "загрузке" всё было правильно
// инициализировано
// if( p->wnum >=0 && p->wnum < f4.wsize()
val = f2.raw.v[p->wnum];
}
else if( p->vtype == VTypes::vtF4 ) else if( p->vtype == VTypes::vtF4 )
{ {
float f = IOBase::processingFasAO(p,shm,force); float f = IOBase::processingFasAO(p,shm,force);
...@@ -1288,6 +1298,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb ...@@ -1288,6 +1298,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
// if( p->wnum >=0 && p->wnum < i2.wsize() // if( p->wnum >=0 && p->wnum < i2.wsize()
val = i2.raw.v[p->wnum]; val = i2.raw.v[p->wnum];
} }
else if( p->vtype == VTypes::vtI2r )
{
long v = IOBase::processingAsAO(p,shm,force);
VTypes::I2r i2(v);
// оптимизируем и проверку не делаем
// считая, что при "загрузке" всё было правильно
// инициализировано
// if( p->wnum >=0 && p->wnum < i2.wsize()
val = i2.raw.v[p->wnum];
}
else if( p->vtype == VTypes::vtU2 ) else if( p->vtype == VTypes::vtU2 )
{ {
unsigned long v = IOBase::processingAsAO(p,shm,force); unsigned long v = IOBase::processingAsAO(p,shm,force);
...@@ -1298,6 +1318,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb ...@@ -1298,6 +1318,16 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
// if( p->wnum >=0 && p->wnum < u2.wsize() // if( p->wnum >=0 && p->wnum < u2.wsize()
val = u2.raw.v[p->wnum]; val = u2.raw.v[p->wnum];
} }
else if( p->vtype == VTypes::vtU2r )
{
unsigned long v = IOBase::processingAsAO(p,shm,force);
VTypes::U2r u2(v);
// оптимизируем и проверку не делаем
// считая, что при "загрузке" всё было правильно
// инициализировано
// if( p->wnum >=0 && p->wnum < u2.wsize()
val = u2.raw.v[p->wnum];
}
else else
val = IOBase::processingAsAO(p,shm,force); val = IOBase::processingAsAO(p,shm,force);
} }
......
...@@ -16,12 +16,15 @@ namespace VTypes ...@@ -16,12 +16,15 @@ namespace VTypes
{ {
vtUnknown, vtUnknown,
vtF2, /*!< двойное слово float(4 байта). В виде строки задаётся как \b "F2". */ vtF2, /*!< двойное слово float(4 байта). В виде строки задаётся как \b "F2". */
vtF2r, /*!< двойное слово float(4 байта). С перевёрнутой (reverse) последовательностью слов. \b "F2r". */
vtF4, /*!< 8-х байтовое слово (double). В виде строки задаётся как \b "F4". */ vtF4, /*!< 8-х байтовое слово (double). В виде строки задаётся как \b "F4". */
vtByte, /*!< байт. В виде строки задаётся как \b "byte". */ vtByte, /*!< байт. В виде строки задаётся как \b "byte". */
vtUnsigned, /*!< беззнаковое целое (2 байта). В виде строки задаётся как \b "unsigned". */ vtUnsigned, /*!< беззнаковое целое (2 байта). В виде строки задаётся как \b "unsigned". */
vtSigned, /*!< знаковое целое (2 байта). В виде строки задаётся как \b "signed". */ vtSigned, /*!< знаковое целое (2 байта). В виде строки задаётся как \b "signed". */
vtI2, /*!< целое (4 байта). В виде строки задаётся как \b "I2".*/ vtI2, /*!< целое (4 байта). В виде строки задаётся как \b "I2".*/
vtU2 /*!< беззнаковое целое (4 байта). В виде строки задаётся как \b "U2".*/ vtI2r, /*!< целое (4 байта). С перевёрнутой (reverse) последовательностью слов. В виде строки задаётся как \b "I2r".*/
vtU2, /*!< беззнаковое целое (4 байта). В виде строки задаётся как \b "U2".*/
vtU2r /*!< беззнаковое целое (4 байта). С перевёрнутой (reverse) последовательностью слов. В виде строки задаётся как \b "U2r".*/
}; };
std::ostream& operator<<( std::ostream& os, const VType& vt ); std::ostream& operator<<( std::ostream& os, const VType& vt );
...@@ -67,6 +70,24 @@ namespace VTypes ...@@ -67,6 +70,24 @@ namespace VTypes
F2mem raw; F2mem raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
class F2r:
public F2
{
public:
// ------------------------------------------
// конструкторы на разные случаи...
F2r(){}
F2r( float f ):F2(f){}
F2r( const ModbusRTU::ModbusData* data, int size ):F2(data,size)
{
std::swap(raw.v[0],raw.v[1]);
}
~F2r(){}
};
// --------------------------------------------------------------------------
class F4 class F4
{ {
public: public:
...@@ -239,6 +260,21 @@ namespace VTypes ...@@ -239,6 +260,21 @@ namespace VTypes
I2mem raw; I2mem raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
class I2r:
public I2
{
public:
I2r(){}
I2r( int v ):I2(v){}
I2r( const ModbusRTU::ModbusData* data, int size ):I2(data,size)
{
std::swap(raw.v[0],raw.v[1]);
}
~I2r(){}
};
// --------------------------------------------------------------------------
class U2 class U2
{ {
public: public:
...@@ -274,6 +310,21 @@ namespace VTypes ...@@ -274,6 +310,21 @@ namespace VTypes
U2mem raw; U2mem raw;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
class U2r:
public U2
{
public:
U2r(){}
U2r( int v ):U2(v){}
U2r( const ModbusRTU::ModbusData* data, int size ):U2(data,size)
{
std::swap(raw.v[0],raw.v[1]);
}
~U2r(){}
};
// --------------------------------------------------------------------------
} // end of namespace VTypes } // end of namespace VTypes
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -18,6 +18,8 @@ VType str2type( const std::string& s ) ...@@ -18,6 +18,8 @@ VType str2type( const std::string& s )
return vtByte; return vtByte;
if( s == "F2" || s == "f2" ) if( s == "F2" || s == "f2" )
return vtF2; return vtF2;
if( s == "F2r" || s == "f2r" )
return vtF2r;
if( s == "F4" || s == "f4" ) if( s == "F4" || s == "f4" )
return vtF4; return vtF4;
if( s == "Unsigned" || s == "unsigned" ) if( s == "Unsigned" || s == "unsigned" )
...@@ -26,8 +28,12 @@ VType str2type( const std::string& s ) ...@@ -26,8 +28,12 @@ VType str2type( const std::string& s )
return vtSigned; return vtSigned;
if( s == "I2" || s == "i2" ) if( s == "I2" || s == "i2" )
return vtI2; return vtI2;
if( s == "I2r" || s == "i2r" )
return vtI2r;
if( s == "U2" || s == "u2" ) if( s == "U2" || s == "u2" )
return vtU2; return vtU2;
if( s == "U2r" || s == "u2r" )
return vtU2r;
return vtUnknown; return vtUnknown;
} }
...@@ -38,6 +44,8 @@ string type2str( VType t ) ...@@ -38,6 +44,8 @@ string type2str( VType t )
return "Byte"; return "Byte";
if( t == vtF2 ) if( t == vtF2 )
return "F2"; return "F2";
if( t == vtF2r )
return "F2r";
if( t == vtF4 ) if( t == vtF4 )
return "F4"; return "F4";
if( t == vtUnsigned ) if( t == vtUnsigned )
...@@ -46,8 +54,12 @@ string type2str( VType t ) ...@@ -46,8 +54,12 @@ string type2str( VType t )
return "Signed"; return "Signed";
if( t == vtI2 ) if( t == vtI2 )
return "I2"; return "I2";
if( t == vtI2r )
return "I2r";
if( t == vtU2 ) if( t == vtU2 )
return "U2"; return "U2";
if( t == vtU2r )
return "U2r";
return "vtUnknown"; return "vtUnknown";
} }
...@@ -56,7 +68,7 @@ int wsize( VType t ) ...@@ -56,7 +68,7 @@ int wsize( VType t )
{ {
if( t == vtByte ) if( t == vtByte )
return Byte::wsize(); return Byte::wsize();
if( t == vtF2 ) if( t == vtF2 || t == vtF2r )
return F2::wsize(); return F2::wsize();
if( t == vtF4 ) if( t == vtF4 )
return F4::wsize(); return F4::wsize();
...@@ -64,9 +76,9 @@ int wsize( VType t ) ...@@ -64,9 +76,9 @@ int wsize( VType t )
return Unsigned::wsize(); return Unsigned::wsize();
if( t == vtSigned ) if( t == vtSigned )
return Signed::wsize(); return Signed::wsize();
if( t == vtI2 ) if( t == vtI2 || t == vtI2r )
return I2::wsize(); return I2::wsize();
if( t == vtU2 ) if( t == vtU2 || t == vtU2r )
return U2::wsize(); return U2::wsize();
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment