From dc790b44c834900e9be7dd993baeebbf0f305125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 25 Dec 2018 20:29:30 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@677 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src_main/core/pivariant.cpp | 2 +- src_main/core/pivarianttypes.cpp | 47 ++++++++--------- src_main/core/pivarianttypes.h | 3 +- src_main/io_devices/pibinarylog.cpp | 70 ++++++++++++++++++-------- src_main/io_devices/pibinarylog.h | 2 + src_main/io_devices/pican.cpp | 15 ++++++ src_main/io_devices/pican.h | 2 + src_main/io_devices/piethernet.cpp | 34 +++++++++++++ src_main/io_devices/piethernet.h | 2 + src_main/io_devices/pipeer.cpp | 29 ++++++++--- src_main/io_devices/pipeer.h | 2 + src_main/io_devices/piserial.cpp | 2 +- src_main/io_devices/pisharedmemory.cpp | 15 ++++++ src_main/io_devices/pisharedmemory.h | 2 + src_main/io_devices/pispi.cpp | 21 ++++++++ src_main/io_devices/pispi.h | 2 + 16 files changed, 193 insertions(+), 57 deletions(-) diff --git a/src_main/core/pivariant.cpp b/src_main/core/pivariant.cpp index 15d4f4cf..1b1af2f9 100755 --- a/src_main/core/pivariant.cpp +++ b/src_main/core/pivariant.cpp @@ -464,7 +464,7 @@ PIString PIVariant::toString() const { case PIVariant::pivDate: {PIDate r; ba >> r; return r.toString();} case PIVariant::pivDateTime: {PIDateTime r; ba >> r; return r.toString();} case PIVariant::pivString: {PIString r; ba >> r; return r;} - case PIVariant::pivStringList: {PIStringList r; ba >> r; if (r.isEmpty()) return PIString(); return r.front();} + case PIVariant::pivStringList: {PIStringList r; ba >> r; if (r.isEmpty()) return PIString(); return r.join(";");} case PIVariant::pivEnum: {PIVariantTypes::Enum r; ba >> r; return r.selectedName();} case PIVariant::pivFile: {PIVariantTypes::File r; ba >> r; return r.file;} case PIVariant::pivDir: {PIVariantTypes::Dir r; ba >> r; return r.dir;} diff --git a/src_main/core/pivarianttypes.cpp b/src_main/core/pivarianttypes.cpp index 823004f6..3991cb7a 100644 --- a/src_main/core/pivarianttypes.cpp +++ b/src_main/core/pivarianttypes.cpp @@ -104,6 +104,28 @@ PIPropertyStorage PIVariantTypes::IODevice::get() const { } +PIString PIVariantTypes::IODevice::toString() const { + PIString s; + s << "IODevice(" << prefix << ", "; + int rwc = 0; + if (mode & 1) {s << "r"; ++rwc;} + if (mode & 2) {s << "w"; ++rwc;} + if (rwc == 1) s << "o"; + if (options != 0) { + if (((PIIODevice::DeviceOptions)options)[PIIODevice::BlockingRead]) + s << " br"; + if (((PIIODevice::DeviceOptions)options)[PIIODevice::BlockingWrite]) + s << " bw"; + } + PIPropertyStorage ps = get(); + piForeachC (PIPropertyStorage::Property & p, ps) { + s << ", " << p.name << "=\"" << p.value.toString() << "\""; + } + s << ")"; + return s; +} + + PIVariantTypes::Enum & PIVariantTypes::Enum::operator <<(const PIVariantTypes::Enumerator & v) { @@ -123,28 +145,3 @@ PIVariantTypes::Enum & PIVariantTypes::Enum::operator <<(const PIStringList & v) (*this) << s.trimmed(); return *this; } - - - - -PICout operator <<(PICout s, const PIVariantTypes::IODevice & v) { - s.setControl(0, true); - s << "IODevice(" << v.prefix << ", "; - int rwc = 0; - if (v.mode & 1) {s << "r"; ++rwc;} - if (v.mode & 2) {s << "w"; ++rwc;} - if (rwc == 1) s << "o"; - if (v.options != 0) { - if (((PIIODevice::DeviceOptions)v.options)[PIIODevice::BlockingRead]) - s << " br"; - if (((PIIODevice::DeviceOptions)v.options)[PIIODevice::BlockingWrite]) - s << " bw"; - } - PIPropertyStorage ps = v.get(); - piForeachC (PIPropertyStorage::Property & p, ps) { - s << ", " << p.name << "=\"" << p.value.toString() << "\""; - } - s << ")"; - s.restoreControl(); - return s; -} diff --git a/src_main/core/pivarianttypes.h b/src_main/core/pivarianttypes.h index 50294a0d..b0a1b321 100644 --- a/src_main/core/pivarianttypes.h +++ b/src_main/core/pivarianttypes.h @@ -81,6 +81,7 @@ namespace PIVariantTypes { IODevice(); void set(const PIPropertyStorage & ps); PIPropertyStorage get() const; + PIString toString() const; PIString prefix; int mode; // PIIODevice::DeviceMode int options; // PIIODevice::DeviceOptions @@ -111,7 +112,7 @@ inline PICout operator <<(PICout s, const PIVariantTypes::Color & v) {s.saveCont inline PIByteArray & operator <<(PIByteArray & s, const PIVariantTypes::IODevice & v) {s << v.prefix << v.mode << v.options << v.props; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIVariantTypes::IODevice & v) {s >> v.prefix >> v.mode >> v.options >> v.props; return s;} - PICout operator <<(PICout s, const PIVariantTypes::IODevice & v); +inline PICout operator <<(PICout s, const PIVariantTypes::IODevice & v) {s << v.toString(); return s;} #endif // PIVARIANTYPES_H diff --git a/src_main/io_devices/pibinarylog.cpp b/src_main/io_devices/pibinarylog.cpp index a8a97619..e1eafa3d 100644 --- a/src_main/io_devices/pibinarylog.cpp +++ b/src_main/io_devices/pibinarylog.cpp @@ -19,6 +19,7 @@ #include "pibinarylog.h" #include "pidir.h" +#include "pipropertystorage.h" /*! \class PIBinaryLog * \brief Class for read and write binary data to logfile, and playback this data in realtime, or custom speed @@ -557,27 +558,6 @@ bool PIBinaryLog::cutBinLog(const PIBinaryLog::BinLogInfo & src, const PIString } -PIString PIBinaryLog::constructFullPathDevice() const { - PIString ret; - ret << logDir() << ":" << filePrefix() << ":" << defaultID() << ":"; - switch (play_mode) { - case PlayRealTime: - ret << "RT"; - break; - case PlayVariableSpeed: - ret << PIString::fromNumber(playSpeed()) << "X"; - break; - case PlayStaticDelay: - ret << PIString::fromNumber(playDelay().toMilliseconds()) << "M"; - break; - default: - ret << "RT"; - break; - } - return ret; -} - - bool PIBinaryLog::createIndex() { llong cp = file.pos(); file.seekToBegin(); @@ -635,6 +615,27 @@ bool PIBinaryLog::seek(llong filepos) { } +PIString PIBinaryLog::constructFullPathDevice() const { + PIString ret; + ret << logDir() << ":" << filePrefix() << ":" << defaultID() << ":"; + switch (play_mode) { + case PlayRealTime: + ret << "RT"; + break; + case PlayVariableSpeed: + ret << PIString::fromNumber(playSpeed()) << "X"; + break; + case PlayStaticDelay: + ret << PIString::fromNumber(playDelay().toMilliseconds()) << "M"; + break; + default: + ret << "RT"; + break; + } + return ret; +} + + void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) { PIStringList pl = full_path.split(":"); for (int i = 0; i < pl.size_s(); ++i) { @@ -650,7 +651,32 @@ void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) { break; } } -// piCoutObj << "configured"; + // piCoutObj << "configured"; +} + + +PIPropertyStorage PIBinaryLog::constructVariantDevice() const { + PIPropertyStorage ret; + PIVariantTypes::Enum e; + ret.addProperty("log dir", PIVariantTypes::Dir(logDir())); + ret.addProperty("file prefix", filePrefix()); + ret.addProperty("default ID", defaultID()); + e << "real-time" << "variable speed" << "static delay"; + e.selectValue((int)playMode()); + ret.addProperty("play mode", e); + ret.addProperty("play speed", playSpeed()); + ret.addProperty("play delay", playDelay().toMilliseconds()); + return ret; +} + + +void PIBinaryLog::configureFromVariantDevice(const PIPropertyStorage & d) { + setLogDir(d.propertyValueByName("log dir").toString()); + setFilePrefix(d.propertyValueByName("file prefix").toString()); + setDefaultID(d.propertyValueByName("default ID").toInt()); + setPlaySpeed(d.propertyValueByName("play speed").toDouble()); + setPlayDelay(PISystemTime::fromMilliseconds(d.propertyValueByName("play delay").toDouble())); + setPlayMode((PlayMode)d.propertyValueByName("play mode").toEnum().selectedValue()); } diff --git a/src_main/io_devices/pibinarylog.h b/src_main/io_devices/pibinarylog.h index 63db9811..dca8326f 100644 --- a/src_main/io_devices/pibinarylog.h +++ b/src_main/io_devices/pibinarylog.h @@ -276,6 +276,8 @@ protected: PIString fullPathPrefix() const {return PIStringAscii("binlog");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString & full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); int readDevice(void *read_to, int max_size); int writeDevice(const void * data, int size) {return writeBinLog(default_id, data, size);} bool openDevice(); diff --git a/src_main/io_devices/pican.cpp b/src_main/io_devices/pican.cpp index d9065096..84eb5d12 100644 --- a/src_main/io_devices/pican.cpp +++ b/src_main/io_devices/pican.cpp @@ -1,4 +1,5 @@ #include "pican.h" +#include "pipropertystorage.h" #include "piincludes_p.h" #if !defined(WINDOWS) && !defined(MAC_OS) # define PIP_CAN @@ -136,3 +137,17 @@ void PICAN::configureFromFullPathDevice(const PIString & full_path) { } } } + + +PIPropertyStorage PICAN::constructVariantDevice() const { + PIPropertyStorage ret; + ret.addProperty("path", path()); + ret.addProperty("CAN ID", PIString::fromNumber(CANID(),16)); + return ret; +} + + +void PICAN::configureFromVariantDevice(const PIPropertyStorage & d) { + setPath(d.propertyValueByName("path").toString()); + setCANID(d.propertyValueByName("CAN ID").toString().toInt(16)); +} diff --git a/src_main/io_devices/pican.h b/src_main/io_devices/pican.h index 954ab459..a2569f0c 100644 --- a/src_main/io_devices/pican.h +++ b/src_main/io_devices/pican.h @@ -22,6 +22,8 @@ protected: PIString fullPathPrefix() const {return PIStringAscii("can");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString & full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;} private: diff --git a/src_main/io_devices/piethernet.cpp b/src_main/io_devices/piethernet.cpp index 11abe4bf..ba75e87c 100755 --- a/src_main/io_devices/piethernet.cpp +++ b/src_main/io_devices/piethernet.cpp @@ -20,6 +20,7 @@ #include "piethernet.h" #include "piconfig.h" #include "pisysteminfo.h" +#include "pipropertystorage.h" #ifdef QNX # include # include @@ -906,6 +907,39 @@ void PIEthernet::configureFromFullPathDevice(const PIString & full_path) { } +PIPropertyStorage PIEthernet::constructVariantDevice() const { + PIPropertyStorage ret; + PIVariantTypes::Enum e; + + e << "UDP" << "TCP"; + if (type() == PIEthernet::UDP) + e.selectValue(0); + else + e.selectValue(1); + ret.addProperty("protocol", e); + + ret.addProperty("read IP", readIP()); + ret.addProperty("read port", readPort()); + ret.addProperty("send IP", sendIP()); + ret.addProperty("send port", sendPort()); + ret.addProperty("multicast", multicastGroups()); + return ret; +} + + +void PIEthernet::configureFromVariantDevice(const PIPropertyStorage & d) { + setType(d.propertyValueByName("protocol").toEnum().selectedValue() == 0 ? UDP : TCP_Client); + setReadIP(d.propertyValueByName("read IP").toString()); + setReadPort(d.propertyValueByName("read port").toInt()); + setSendIP(d.propertyValueByName("send IP").toString()); + setSendPort(d.propertyValueByName("send port").toInt()); + PIStringList mcgl = d.propertyValueByName("multicast").toStringList(); + piForeachC (PIString & g, mcgl) { + joinMulticastGroup(g); + } +} + + PIEthernet::InterfaceList PIEthernet::interfaces() { PIEthernet::InterfaceList il; Interface ci; diff --git a/src_main/io_devices/piethernet.h b/src_main/io_devices/piethernet.h index 444f0609..2db57f0e 100755 --- a/src_main/io_devices/piethernet.h +++ b/src_main/io_devices/piethernet.h @@ -464,6 +464,8 @@ protected: PIString fullPathPrefix() const {return PIStringAscii("eth");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString & full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); bool configureDevice(const void * e_main, const void * e_parent = 0); int readDevice(void * read_to, int max_size); int writeDevice(const void * data, int max_size); diff --git a/src_main/io_devices/pipeer.cpp b/src_main/io_devices/pipeer.cpp index ac69de0b..b307d231 100755 --- a/src_main/io_devices/pipeer.cpp +++ b/src_main/io_devices/pipeer.cpp @@ -20,6 +20,7 @@ #include "pipeer.h" #include "piconfig.h" #include "pidatatransfer.h" +#include "pipropertystorage.h" #define _PIPEER_MSG_SIZE 4000 #define _PIPEER_MSG_TTL 100 @@ -961,13 +962,6 @@ void PIPeer::changeName(const PIString &new_name) { } -PIString PIPeer::constructFullPathDevice() const { - PIString ret; - ret << self_info.name << ":" << trustPeerName(); - return ret; -} - - int PIPeer::readDevice(void *read_to, int max_size) { read_buffer_mutex.lock(); bool empty = read_buffer.isEmpty(); @@ -1010,6 +1004,13 @@ void PIPeer::newTcpClient(PIEthernet *client) { } +PIString PIPeer::constructFullPathDevice() const { + PIString ret; + ret << self_info.name << ":" << trustPeerName(); + return ret; +} + + void PIPeer::configureFromFullPathDevice(const PIString & full_path) { PIStringList pl = full_path.split(":"); for (int i = 0; i < pl.size_s(); ++i) { @@ -1022,6 +1023,20 @@ void PIPeer::configureFromFullPathDevice(const PIString & full_path) { } +PIPropertyStorage PIPeer::constructVariantDevice() const { + PIPropertyStorage ret; + ret.addProperty("name", self_info.name); + ret.addProperty("trust peer", trustPeerName()); + return ret; +} + + +void PIPeer::configureFromVariantDevice(const PIPropertyStorage & d) { + changeName(d.propertyValueByName("name").toString()); + setTrustPeerName(d.propertyValueByName("trust peer").toString()); +} + + void PIPeer::initNetwork() { // piCoutObj << "initNetwork ..."; eth_send.init(); diff --git a/src_main/io_devices/pipeer.h b/src_main/io_devices/pipeer.h index 070bd4b4..b0e0390a 100755 --- a/src_main/io_devices/pipeer.h +++ b/src_main/io_devices/pipeer.h @@ -169,6 +169,8 @@ private: PIString fullPathPrefix() const {return PIStringAscii("peer");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString &full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); int readDevice(void * read_to, int max_size); int writeDevice(const void * data, int size); DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;} diff --git a/src_main/io_devices/piserial.cpp b/src_main/io_devices/piserial.cpp index 23f99ebe..56902e5a 100755 --- a/src_main/io_devices/piserial.cpp +++ b/src_main/io_devices/piserial.cpp @@ -706,7 +706,7 @@ void PISerial::configureFromFullPathDevice(const PIString & full_path) { case 1: setProperty("outSpeed", p.toInt()); setProperty("inSpeed", p.toInt()); break; case 2: setProperty("dataBitsCount", p.toInt()); break; case 3: - p = p.toLowerCase(); + p = p.left(1).toLowerCase(); if (p != "n") setParameter(ParityControl); if (p == "o") setParameter(ParityOdd); break; diff --git a/src_main/io_devices/pisharedmemory.cpp b/src_main/io_devices/pisharedmemory.cpp index 1ec0b2dc..e6b63a93 100644 --- a/src_main/io_devices/pisharedmemory.cpp +++ b/src_main/io_devices/pisharedmemory.cpp @@ -18,6 +18,7 @@ */ #include "piincludes_p.h" #include "pisharedmemory.h" +#include "pipropertystorage.h" #if defined(LINUX) || defined(MAC_OS) # define SHM_POSIX #endif @@ -182,6 +183,20 @@ void PISharedMemory::configureFromFullPathDevice(const PIString & full_path) { } +PIPropertyStorage PISharedMemory::constructVariantDevice() const { + PIPropertyStorage ret; + ret.addProperty("path", path()); + ret.addProperty("size", dsize); + return ret; +} + + +void PISharedMemory::configureFromVariantDevice(const PIPropertyStorage & d) { + setPath(d.propertyValueByName("path").toString()); + setSize(d.propertyValueByName("size").toInt()); +} + + void PISharedMemory::initPrivate() { #ifdef WINDOWS PRIVATE->map = 0; diff --git a/src_main/io_devices/pisharedmemory.h b/src_main/io_devices/pisharedmemory.h index 2cc26958..69ac8c82 100644 --- a/src_main/io_devices/pisharedmemory.h +++ b/src_main/io_devices/pisharedmemory.h @@ -76,6 +76,8 @@ protected: PIString fullPathPrefix() const {return PIStringAscii("shm");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString & full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); int readDevice(void * read_to, int max_size) {return read(read_to, max_size, 0);} int writeDevice(const void * data, int max_size) {return write(data, max_size, 0);} DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;} diff --git a/src_main/io_devices/pispi.cpp b/src_main/io_devices/pispi.cpp index d1e611f3..6ded585f 100644 --- a/src_main/io_devices/pispi.cpp +++ b/src_main/io_devices/pispi.cpp @@ -1,4 +1,5 @@ #include "pispi.h" +#include "pipropertystorage.h" #include "piincludes_p.h" #if !defined(WINDOWS) && !defined(MAC_OS) # define PIP_SPI @@ -145,3 +146,23 @@ void PISPI::configureFromFullPathDevice(const PIString & full_path) { } } } + + +PIPropertyStorage PISPI::constructVariantDevice() const { + PIPropertyStorage ret; + ret.addProperty("path", path()); + ret.addProperty("speed", int(speed())); + ret.addProperty("bits", int(bits())); + ret.addProperty("clock inverse", isParameterSet(ClockInverse)); + ret.addProperty("clock phase shift", isParameterSet(ClockPhaseShift)); + return ret; +} + + +void PISPI::configureFromVariantDevice(const PIPropertyStorage & d) { + setPath(d.propertyValueByName("path").toString()); + setSpeed(d.propertyValueByName("speed").toInt()); + setBits(d.propertyValueByName("bits").toInt()); + setParameter(ClockInverse, d.propertyValueByName("clock inverse").toBool()); + setParameter(ClockPhaseShift, d.propertyValueByName("clock phase shift").toBool()); +} diff --git a/src_main/io_devices/pispi.h b/src_main/io_devices/pispi.h index fe74881f..442312ca 100644 --- a/src_main/io_devices/pispi.h +++ b/src_main/io_devices/pispi.h @@ -45,6 +45,8 @@ protected: PIString fullPathPrefix() const {return PIStringAscii("spi");} PIString constructFullPathDevice() const; void configureFromFullPathDevice(const PIString & full_path); + PIPropertyStorage constructVariantDevice() const; + void configureFromVariantDevice(const PIPropertyStorage & d); DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential;} private: