From f24b7172b7f60c26c15b038c8f18350926f7a2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Tue, 9 Aug 2016 15:33:56 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@112 a8b55f48-bf90-11e4-a774-851b48703e85 --- cd_utils/CMakeLists.txt | 6 +- cd_utils/cdtest.h | 10 ++ cd_utils/cdutils_core.cpp | 141 +++++++++--------- cd_utils/cdutils_core.h | 18 +-- cd_utils/cdutils_k.cpp | 14 +- cd_utils/cdutils_k.h | 16 +- cd_utils/cdutils_k_parser.h | 18 --- cd_utils/cdutils_k_types.h | 84 ----------- ...dutils_k_parser.cpp => cdutils_parser.cpp} | 51 ++++--- cd_utils/cdutils_parser.h | 19 +++ cd_utils/cdutils_protocol.h | 24 +++ ...{cdutils_k_types.cpp => cdutils_types.cpp} | 46 +++--- cd_utils/cdutils_types.h | 99 ++++++++++++ cd_utils/cdutilstest.cpp | 77 ++++++++-- cd_utils/pult/cd_pult.cpp | 19 +-- cd_utils/pult/cd_pult.h | 4 +- cd_utils/pult/main.cpp | 1 - 17 files changed, 383 insertions(+), 264 deletions(-) create mode 100644 cd_utils/cdtest.h delete mode 100644 cd_utils/cdutils_k_parser.h delete mode 100644 cd_utils/cdutils_k_types.h rename cd_utils/{cdutils_k_parser.cpp => cdutils_parser.cpp} (75%) create mode 100644 cd_utils/cdutils_parser.h create mode 100644 cd_utils/cdutils_protocol.h rename cd_utils/{cdutils_k_types.cpp => cdutils_types.cpp} (70%) create mode 100644 cd_utils/cdutils_types.h diff --git a/cd_utils/CMakeLists.txt b/cd_utils/CMakeLists.txt index e3833f9..ce6dcd6 100644 --- a/cd_utils/CMakeLists.txt +++ b/cd_utils/CMakeLists.txt @@ -15,8 +15,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall") if (DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") endif () -set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k_parser.cpp" "cdutils_k.cpp") -set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k_parser.h" "cdutils_k.h") +file(GLOB HDRS_UTILS "*.h") +file(GLOB CPPS_UTILS "*.cpp") +#set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k_parser.cpp" "cdutils_k.cpp") +#set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k_parser.h" "cdutils_k.h") if (DEFINED ENV{QNX_HOST}) add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS}) else () diff --git a/cd_utils/cdtest.h b/cd_utils/cdtest.h new file mode 100644 index 0000000..6a3e4b0 --- /dev/null +++ b/cd_utils/cdtest.h @@ -0,0 +1,10 @@ +#ifndef CDTEST_H +#define CDTEST_H + + +enum KDescription { + First, //f + Second, //b +}; + +#endif // CDTEST_H diff --git a/cd_utils/cdutils_core.cpp b/cd_utils/cdutils_core.cpp index 48ebb80..b25f6b8 100644 --- a/cd_utils/cdutils_core.cpp +++ b/cd_utils/cdutils_core.cpp @@ -1,72 +1,68 @@ #include "cdutils_core.h" #include "cdutils_k_parser.h" #include "piconfig.h" +#include "cdutils_protocol.h" +#include "piiodevice.h" +#include "piiostring.h" +#include "pifile.h" using namespace CDUtils; -const char Core::app_config[] = -"include = cd_ip.conf\n\ -port_rec = 2\n\ -port_send = 1\n\ -[connection]\n\ -device.c = eth://UDP:127.0.0.1:3610${port_rec}:127.0.0.1:3610${port_send} #s\n\ -device.c.disconnectTimeout = 3.00000000 #f\n\ -device.k = eth://UDP:127.0.0.1:2610${port_rec}:127.0.0.1:2610${port_send} #s\n\ -device.k.disconnectTimeout = 3.00000000 #f\n\ -device.x = eth://UDP:127.0.0.1:1610${port_rec}:127.0.0.1:1610${port_send} #s\n\ -device.x.disconnectTimeout = 3.00000000 #f\n\ -device.c_eth = eth://UDP:${ip_app}:3610${port_rec}:${ip_pult}:3610${port_send} #s\n\ -device.c_eth.disconnectTimeout = 3.00000000 #f\n\ -device.k_eth = eth://UDP:${ip_app}:2610${port_rec}:${ip_pult}:2610${port_send} #s\n\ -device.k_eth.disconnectTimeout = 3.00000000 #f\n\ -device.x_eth = eth://UDP:${ip_app}:1610${port_rec}:${ip_pult}:1610${port_send} #s\n\ -device.x_eth.disconnectTimeout = 3.00000000 #f\n\ -channel.0.from = c_eth #s\n\ -channel.0.to = c #s\n\ -channel.1.from = k_eth #s\n\ -channel.1.to = k #s\n\ -channel.2.from = x_eth #s\n\ -channel.2.to = x #s\n\ -[]\n\ -connectionmodel = AAAWNHja7ZbfShtBFMa/Xf9UrYLSXnqhErxrdSNYKBRXEMQbEVGhBBRJgob4J6SxSZBC38ELb32UBR/AV/ARfAP9MjmzyQ7TGGkaGzeznMycmTNnZn/zLRkAH5HGOc74ZNkqIac8YBhwLlk7tEHUi1trP7KwHqCN+AhLLeYHpqC7HEeFqbLygJal3XHfPjxE2/kX69UxYK32en62vnqwIXvJwOr7m1JLvPZZ3tGmBR0ErSNYXY20gbuPvxl/eSaKuxxY/RC/xPfxdwb/3u8o7u+w+iF+ie/j7wj+IBXFH+zD6mvcOr7L+PXW3xz+nIH7KLD6If4c+urvIP6qgb96Y/VD/NW/xa/W5rj7SeImg2Jg5nRlji7M4dwJk1U9jzaOAz4lVFHgHUuOsjEHo9IXnrceXJe+cbXQGQ5xak3wgTYG9ZPnSlmudWykuo7sJ8OYn7zppa3pDnS6PUn1FQt8dnkYW2wncMmpBYblUcEv9iSxDA+LrM3RAi5wwhzNUZ6xtW+Rtzzl9TPTGtOAkSAlCeZpc5yc48cQvdPusK+G7pzbKVlST6gT90ciX9Rgk8TnZdIYyigyWUntEGrHRbYPkWkIq0k0CfSCaCqvIRqvLdF48RONX7jvBdGkX0M0S22JZik2opk1RaP/Ev8gmttOimalTdG816fsElE0xdULxJLSabatYvEoii/4zGOvm2fIpdV4jISi7zH/uVDy3RVK8hmhJGMolAR6QSiV7grFe0YoMbivPAGq7YwD\n\ -"; +const char CDCore::app_config[] = + "include = cd_ip.conf\n\ + port_rec = 2\n\ + port_send = 1\n\ + [connection]\n\ + device.cd = eth://UDP:127.0.0.1:2616${port_rec}:127.0.0.1:2616${port_send} #s\n\ + device.cd.disconnectTimeout = 3.00000000 #f\n\ + device.cd_eth = eth://UDP:${ip_app}:2616${port_rec}:${ip_pult}:2616${port_send} #s\n\ + device.cd_eth.disconnectTimeout = 3.00000000 #f\n\ + device.cd_mcast = eth://UDP:0.0.0.0:2616${port_rec}:234.1.1.1:2616${port_send}:mcast:234.1.1.1 #s\n\ + device.cd_mcast.disconnectTimeout = 3.00000000 #f\n\ + channel.0.from = cd_eth #s\n\ + channel.0.to = cd #s\n\ + channel.1.from = cd_mcast #s\n\ + channel.1.to = cd #s\n\ + []\n\ + connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\ + "; -const char Core::pult_config[] = -"include = cd_ip.conf\n\ -port_rec = 1\n\ -port_send = 2\n\ -[connection]\n\ -device.c = eth://UDP:127.0.0.1:3610${port_rec}:127.0.0.1:3610${port_send} #s\n\ -device.c.disconnectTimeout = 3.00000000 #f\n\ -device.k = eth://UDP:127.0.0.1:2610${port_rec}:127.0.0.1:2610${port_send} #s\n\ -device.k.disconnectTimeout = 3.00000000 #f\n\ -device.x = eth://UDP:127.0.0.1:1610${port_rec}:127.0.0.1:1610${port_send} #s\n\ -device.x.disconnectTimeout = 3.00000000 #f\n\ -device.c_eth = eth://UDP:${ip_pult}:3610${port_rec}:${ip_app}:3610${port_send} #s\n\ -device.c_eth.disconnectTimeout = 3.00000000 #f\n\ -device.k_eth = eth://UDP:${ip_pult}:2610${port_rec}:${ip_app}:2610${port_send} #s\n\ -device.k_eth.disconnectTimeout = 3.00000000 #f\n\ -device.x_eth = eth://UDP:${ip_pult}:1610${port_rec}:${ip_app}:1610${port_send} #s\n\ -device.x_eth.disconnectTimeout = 3.00000000 #f\n\ -[]\n\ -connectionmodel = AAAWNHja7ZbfShtBFMa/Xf9UrYLSXnqhErxrdSNYKBRXEMQbEVGhBBRJgob4J6SxSZBC38ELb32UBR/AV/ARfAP9MjmzyQ7TGGkaGzeznMycmTNnZn/zLRkAH5HGOc74ZNkqIac8YBhwLlk7tEHUi1trP7KwHqCN+AhLLeYHpqC7HEeFqbLygJal3XHfPjxE2/kX69UxYK32en62vnqwIXvJwOr7m1JLvPZZ3tGmBR0ErSNYXY20gbuPvxl/eSaKuxxY/RC/xPfxdwb/3u8o7u+w+iF+ie/j7wj+IBXFH+zD6mvcOr7L+PXW3xz+nIH7KLD6If4c+urvIP6qgb96Y/VD/NW/xa/W5rj7SeImg2Jg5nRlji7M4dwJk1U9jzaOAz4lVFHgHUuOsjEHo9IXnrceXJe+cbXQGQ5xak3wgTYG9ZPnSlmudWykuo7sJ8OYn7zppa3pDnS6PUn1FQt8dnkYW2wncMmpBYblUcEv9iSxDA+LrM3RAi5wwhzNUZ6xtW+Rtzzl9TPTGtOAkSAlCeZpc5yc48cQvdPusK+G7pzbKVlST6gT90ciX9Rgk8TnZdIYyigyWUntEGrHRbYPkWkIq0k0CfSCaCqvIRqvLdF48RONX7jvBdGkX0M0S22JZik2opk1RaP/Ev8gmttOimalTdG816fsElE0xdULxJLSabatYvEoii/4zGOvm2fIpdV4jISi7zH/uVDy3RVK8hmhJGMolAR6QSiV7grFe0YoMbivPAGq7YwD\n\ -"; +const char CDCore::pult_config[] = + "include = cd_ip.conf\n\ + port_rec = 1\n\ + port_send = 2\n\ + [connection]\n\ + device.cd = eth://UDP:127.0.0.1:2616${port_rec}:127.0.0.1:2616${port_send} #s\n\ + device.cd.disconnectTimeout = 3.00000000 #f\n\ + device.cd_eth = eth://UDP:${ip_app}:2616${port_rec}:${ip_pult}:2616${port_send} #s\n\ + device.cd_eth.disconnectTimeout = 3.00000000 #f\n\ + device.cd_mcast = eth://UDP:0.0.0.0:2616${port_rec}:234.1.1.1:2616${port_send}:mcast:234.1.1.1 #s\n\ + device.cd_mcast.disconnectTimeout = 3.00000000 #f\n\ + channel.0.from = cd_eth #s\n\ + channel.0.to = cd #s\n\ + channel.1.from = cd_mcast #s\n\ + channel.1.to = cd #s\n\ + []\n\ + connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\ + "; int __Core_Initializer__::count_(0); -Core * __Core_Initializer__::__instance__(0); +CDCore * __Core_Initializer__::__instance__(0); __Core_Initializer__::__Core_Initializer__() { count_++; + //piCout << "try create Core" << count_; if (count_ > 1) return; //piCout << "create Core"; - __instance__ = new Core(); + __instance__ = new CDCore(); } __Core_Initializer__::~__Core_Initializer__() { count_--; + //piCout << "try delete Core" << count_; if (count_ > 0) return; //piCout << "delete Core"; if (__instance__ != 0) { @@ -78,11 +74,13 @@ __Core_Initializer__::~__Core_Initializer__() { -Core::Core(const char * conf) { +CDCore::CDCore(const char * conf) { CONNECTU(&connection, dataReceivedEvent, this, dataReceived); PIString s(conf); connection.configureFromString(&s); + datatr.setPacketSize(960); connection.start(); + /*k_[1] = KType(1, "123", "120+3", "comment"); k_[2] = KType(2, "1", "2", "comm"); k_[4] = KType(4, "-0.6", "-6/10", "mment"); @@ -95,39 +93,39 @@ Core::Core(const char * conf) { } -void Core::k_rec(const PIByteArray & data) { +void CDCore::k_rec(const PIByteArray & data) { } -void Core::x_rec(const PIByteArray & data) { +void CDCore::x_rec(const PIByteArray & data) { } -void Core::c_rec(const PIByteArray & data) { +void CDCore::c_rec(const PIByteArray & data) { } -void Core::k_write(PIIODevice * d) { +void CDCore::k_write(PIIODevice * d) { k_.write(d, PIString()); } -void Core::k_read(PIIODevice * d) { +void CDCore::k_read(PIIODevice * d) { PIConfig conf(d, PIIODevice::ReadOnly); k_.read(&(conf.rootEntry())); } -void Core::k_parse(PIIODevice * d) { - k_ = KParser::parse(d); +void CDCore::k_parse(PIIODevice * d) { + k_ = CDParser::parse(d, CDType::cdK); } -void Core::k_update(PIIODevice * d) { - KSection uk = k_; +void CDCore::k_update(PIIODevice * d) { + CDSection uk = k_; k_parse(d); bool kn = false; if (!uk.isEmpty()) @@ -136,26 +134,33 @@ void Core::k_update(PIIODevice * d) { K_KeepNamesRequest(&kn); } uk.update(k_, kn); - piCout << k_.count() << uk.count(); + //piCout << k_.count() << uk.count(); k_ = uk; } -void CDUtils::Core::dataReceived(const PIString & from, const PIByteArray & data) { - piCout << from << data; - if (data.size_s() < 4) return; - if (from == "k") k_rec(data); - if (from == "x") x_rec(data); - if (from == "c") c_rec(data); +void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) { + piCout << from << data.size(); + if (from == "cd") { + datatr.received(data); + } } - -void Core::K_Send() { +void CDCore::K_Send() { piCoutObj << "K_Send"; + PIString s; + PIIOString ios(&s); + k_write(&ios); + ios.close(); + //PIByteArray ba = PIByteArray::fromString(s); + PIFile pf("k.txt", PIIODevice::ReadWrite); + pf.write(s.toUTF8()); + //k_write(&pf); + piCout << pf.readLine(); } -void Core::K_Request() { +void CDCore::K_Request() { piCoutObj << "K_Request"; } diff --git a/cd_utils/cdutils_core.h b/cd_utils/cdutils_core.h index 625b693..5086188 100644 --- a/cd_utils/cdutils_core.h +++ b/cd_utils/cdutils_core.h @@ -1,14 +1,14 @@ #ifndef CDUTILS_CORE_H #define CDUTILS_CORE_H -#include "cdutils_k_types.h" +#include "cdutils_types.h" #include "piconnection.h" #include "pidatatransfer.h" namespace CDUtils { -class Core; +class CDCore; class __Core_Initializer__ { @@ -16,16 +16,16 @@ public: __Core_Initializer__(); ~__Core_Initializer__(); static int count_; - static Core * __instance__; + static CDCore * __instance__; }; -class Core: public PIObject +class CDCore: public PIObject { - PIOBJECT(CDUtils::Core) + PIOBJECT(CDUtils::CDCore) friend class __Core_Initializer__; public: - static Core * instance() {return __Core_Initializer__::__instance__;} + static CDCore * instance() {return __Core_Initializer__::__instance__;} EVENT(K_Sended) EVENT(K_Received) @@ -33,7 +33,7 @@ public: EVENT_HANDLER(void, K_Send); EVENT_HANDLER(void, K_Request); - KSection k_; + CDSection k_; void k_write(PIIODevice * d); void k_read(PIIODevice * d); @@ -41,7 +41,7 @@ public: void k_update(PIIODevice * d); private: - Core(const char * conf = + CDCore(const char * conf = #ifdef CDPULT pult_config #else @@ -55,7 +55,7 @@ private: static const char app_config[], pult_config[]; PIConnection connection; - + PIDataTransfer datatr; }; diff --git a/cd_utils/cdutils_k.cpp b/cd_utils/cdutils_k.cpp index ef53c9c..5ee9aab 100644 --- a/cd_utils/cdutils_k.cpp +++ b/cd_utils/cdutils_k.cpp @@ -7,8 +7,8 @@ using namespace CDUtils; KInterface::KInterface() { - core = Core::instance(); - piCoutObj << core; + core = CDCore::instance(); + //piCoutObj << core; k_file = PIStringAscii("k.dat"); k_file_size = 0; CONNECTU(core, K_Sended, this, sended); @@ -22,27 +22,27 @@ bool KInterface::test(int v) { } -KType & KInterface::operator [](int v) { +CDType & KInterface::operator [](int v) { return core->k_[v]; } -const KType KInterface::operator [](int v) const { +const CDType KInterface::operator [](int v) const { return core->k_[v]; } -KSection & KInterface::section(int v) { +CDSection & KInterface::section(int v) { return core->k_.section(v); } -const KSection KInterface::section(int v) const { +const CDSection KInterface::section(int v) const { return core->k_.section(v); } -const KSection & KInterface::root() const { +const CDSection & KInterface::root() const { return core->k_; } diff --git a/cd_utils/cdutils_k.h b/cd_utils/cdutils_k.h index 0c25e91..3094345 100644 --- a/cd_utils/cdutils_k.h +++ b/cd_utils/cdutils_k.h @@ -1,13 +1,13 @@ #ifndef CDUTILS_K_H #define CDUTILS_K_H -#include "cdutils_k_types.h" +#include "cdutils_types.h" #include "piobject.h" namespace CDUtils { -class Core; +class CDCore; class KInterface: public PIObject @@ -17,11 +17,11 @@ public: KInterface(); bool test(int v); - KType & operator [](int v); - const KType operator [](int v) const; - KSection & section(int v); - const KSection section(int v) const; - const KSection & root() const; + CDType & operator [](int v); + const CDType operator [](int v) const; + CDSection & section(int v); + const CDSection section(int v) const; + const CDSection & root() const; int count(bool recursive = true) const; const PIString file() const {return k_file;} @@ -42,7 +42,7 @@ public: void writeFile(); private: - Core * core; + CDCore * core; PIString k_file; int k_file_size; diff --git a/cd_utils/cdutils_k_parser.h b/cd_utils/cdutils_k_parser.h deleted file mode 100644 index d359d15..0000000 --- a/cd_utils/cdutils_k_parser.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef CDUTILS_K_PARSER_H -#define CDUTILS_K_PARSER_H - -class PIIODevice; - -namespace CDUtils { - -class KSection; - -namespace KParser { - -KSection parse(PIIODevice * d); - -} - -} - -#endif // CDUTILS_K_PARSER_H diff --git a/cd_utils/cdutils_k_types.h b/cd_utils/cdutils_k_types.h deleted file mode 100644 index 9b661a5..0000000 --- a/cd_utils/cdutils_k_types.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef CDUTILS_K_TYPES_H -#define CDUTILS_K_TYPES_H - -#include "pistring.h" -#include "pimap.h" - -class PIIODevice; -class CD_Pult; - -namespace CDUtils { - -class KSection; - -class KType { - friend class KSection; - friend class ::CD_Pult; -public: - KType(); - KType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c); - int index() const {return index_;} - PIString name() const {return name_;} - PIString type() const {return type_;} - PIString value() const {return value_s;} - PIString formula() const {return formula_;} - PIString comment() const {return comment_;} - double toDouble() const {return value_d;} - int toInt() const {return value_i;} - bool toBool() const {return value_b;} - - operator double() const {return value_d;} - - -private: - int index_; - PIString name_, type_; - PIString value_s, formula_, comment_; - double value_d; - int value_i; - bool value_b; - -}; - - -class KSection { - friend class Core; - friend class KInterface; - friend class ::CD_Pult; -public: - KSection() {} - - bool test(int v) {return k.value(v).toBool();} - KType & operator [](int v) {return k[v];} - const KType operator [](int v) const {return k[v];} - KSection & section(int v) {return s[v];} - const KSection section(int v) const {return s[v];} - - bool isEmpty() const {return k.isEmpty() && s.isEmpty();} - int count(bool recursive = true) const; - PIVector indexes() const {return k.keys();} - PIStringList index_names() const; - - PIString name; - PIString alias; - -private: - KSection(PIMap k_, PIMap s_) { - k = k_; - s = s_; - } - void write(PIIODevice * d, const PIString & prefix = PIString()); - void read(const void * ep); - void update(KSection & v, bool keep_names); - bool isSameStructure(KSection & v); - - mutable PIMap k; - PIMap s; - -}; - -} - -inline PICout operator <<(PICout s, const CDUtils::KType & v) {s.space(); s.setControl(0, true); s << "K[" << v.name() << " (" << v.index() << ")] = " << v.value(); s.restoreControl(); return s;} - -#endif // CDUTILS_K_TYPES_H diff --git a/cd_utils/cdutils_k_parser.cpp b/cd_utils/cdutils_parser.cpp similarity index 75% rename from cd_utils/cdutils_k_parser.cpp rename to cd_utils/cdutils_parser.cpp index df2088f..0f7da64 100644 --- a/cd_utils/cdutils_k_parser.cpp +++ b/cd_utils/cdutils_parser.cpp @@ -1,5 +1,5 @@ -#include "cdutils_k_parser.h" -#include "cdutils_k_types.h" +#include "cdutils_parser.h" +#include "cdutils_types.h" #include "piiostring.h" #include "pifile.h" @@ -21,7 +21,7 @@ enum Phase { void removeComment(PIString & line, PIString * type, PIString * comment) { int ci = line.find("//"); if (ci >= 0) { - if (comment) *comment = line.right(line.size_s() - ci - 2).trim(); + if (comment) *comment = line.right(line.size_s() - ci - 2); line.cutRight(line.size_s() - ci).trim(); if (type && comment && !line.isEmpty()) { *type = comment->takeLeft(1); @@ -58,7 +58,7 @@ void parseInsert(PIString line, PIString & alias, PIStringList & out) { } -PIVector enumValues(const PIString & e, const PIMap & sections, PIStringList & enames) { +PIVector enumValues(const PIString & e, const PIMap & sections, PIStringList & enames) { PIVector ret; enames.clear(); if (sections.contains(e)) { @@ -76,13 +76,14 @@ PIVector enumValues(const PIString & e, const PIMap & s } -KSection KParser::parse(PIIODevice * d) { - if (!d) return KSection(); - if (!d->canRead()) return KSection(); - KSection cs; - KType ck; - PIMap sections; - PIMap enum_values, cevalues; +CDSection CDParser::parse(PIIODevice * d, int cdsection_type) { + CDType::cdT et = (CDType::cdT)cdsection_type; + if (!d) return CDSection(); + if (!d->canRead()) return CDSection(); + CDSection cs; + CDType ck; + PIMap sections; + PIMap enum_values; PIString content, line, alias, type, comment; PIStringList iarr; if (PIStringAscii(d->className()) == PIStringAscii("PIFile")) { @@ -110,11 +111,11 @@ KSection KParser::parse(PIIODevice * d) { cind += 4; continue; } - cs = KSection(); + cs = CDSection(); cs.name = line; //piCout << "enum" << cs.name; int cev = 0; - cevalues.clear(); +// cevalues.clear(); while (!ios.isEnd()) { line = ios.readLine().trim(); comment.clear(); @@ -124,17 +125,18 @@ KSection KParser::parse(PIIODevice * d) { if (comment.find("=") >= 0) { parseInsert(comment, alias, iarr); if (!iarr.isEmpty()) { +// piCout << "#" << enum_values; if (!enum_values.contains(alias)) { piCout << "Parse error: can`t find section alias \"" << alias << "\"!"; - return KSection(); + return CDSection(); } if (!sections.contains(iarr.front())) { piCout << "Parse error: can`t find section \"" << iarr.front() << "\"!"; - return KSection(); + return CDSection(); } //piCout << "insert" << alias << iarr; int aval = enum_values.value(alias); - KSection is = sections.value(iarr.take_front()), ts; + CDSection is = sections.value(iarr.take_front()), ts; int ibpos = is.name.size_s(); piForeachRC (PIString & a, iarr) { PIStringList enames; @@ -147,7 +149,7 @@ KSection KParser::parse(PIIODevice * d) { ts.name = is.name; ts.name.insert(ibpos, PIString("[") << a << "]"); is = ts; - ts = KSection(); + ts = CDSection(); } is.alias = alias; cs.section(aval) = is; @@ -156,16 +158,23 @@ KSection KParser::parse(PIIODevice * d) { } else { parseEnumLine(line, &cev, &type, &comment); //piCout << line << "=" << cev << "//" << type << comment; - ck = KType(cev, line, type, "", "", comment); + ck = CDType(cev, line, type, "", "", comment, et); cs[cev] = ck; - cevalues[line] = cev; + //cevalues[line] = cev; + enum_values[line] = cev; ++cev; } } //piCout << cs.name << cs.k; sections[cs.name] = cs; - enum_values << cevalues; +// piCout << "#" << cevalues; +// enum_values << cevalues; cind += 4; } - return sections.value("KDescription"); + switch (et) { + case CDType::cdK : return sections.value("KDescription"); + case CDType::cdX : return sections.value("XDescription"); + case CDType::cdC : return sections.value("CDescription"); + } + return CDSection(); } diff --git a/cd_utils/cdutils_parser.h b/cd_utils/cdutils_parser.h new file mode 100644 index 0000000..6c39c6f --- /dev/null +++ b/cd_utils/cdutils_parser.h @@ -0,0 +1,19 @@ +#ifndef CDUTILS_PARSER_H +#define CDUTILS_PARSER_H + + +class PIIODevice; + +namespace CDUtils { + +class CDSection; + +namespace CDParser { + +CDSection parse(PIIODevice * d, int cdsection_type); + +} + +} + +#endif // CDUTILS_PARSER_H diff --git a/cd_utils/cdutils_protocol.h b/cd_utils/cdutils_protocol.h new file mode 100644 index 0000000..e9dc01e --- /dev/null +++ b/cd_utils/cdutils_protocol.h @@ -0,0 +1,24 @@ +#ifndef CDUTILS_PROTOCOL_H +#define CDUTILS_PROTOCOL_H + +#include "pibytearray.h" + +namespace CDUtils { + +enum CDPacketType {CD_Ping, CD_Pong, CD_KQuery, CD_KSend, CD_Command, CD_XData, CD_XQuery}; + +# pragma pack(push,1) + struct PacketHeader { + int session_id; + int type; // CDPacketType + }; + + struct PacketKSend : PacketHeader { + PIByteArray kdata; // file k.dat + }; + +# pragma pack(pop) + +} + +#endif // CDUTILS_PROTOCOL_H diff --git a/cd_utils/cdutils_k_types.cpp b/cd_utils/cdutils_types.cpp similarity index 70% rename from cd_utils/cdutils_k_types.cpp rename to cd_utils/cdutils_types.cpp index 5156bc4..e7e2c29 100644 --- a/cd_utils/cdutils_k_types.cpp +++ b/cd_utils/cdutils_types.cpp @@ -1,18 +1,19 @@ -#include "cdutils_k_types.h" +#include "cdutils_types.h" #include "piconfig.h" using namespace CDUtils; -KType::KType() { +CDType::CDType() { index_ = -1; value_d = 0.; value_i = 0; value_b = false; + cd_type_ = cdNull; } -KType::KType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c) { +CDType::CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t) { index_ = i; name_ = n; type_ = t; @@ -22,13 +23,14 @@ KType::KType(int i, const PIString & n, const PIString & t, const PIString & v, value_d = v.toDouble(); value_i = v.toInt(); value_b = v.toBool(); + cd_type_ = cd_t; } -int KSection::count(bool recursive) const { +int CDSection::count(bool recursive) const { int ret = k.size_s(); if (recursive) { - PIMap::const_iterator i; + PIMap::const_iterator i; for (i = s.begin(); i != s.end(); ++i) ret += i->second.count(recursive); } @@ -36,16 +38,16 @@ int KSection::count(bool recursive) const { } -PIStringList KSection::index_names() const { +PIStringList CDSection::index_names() const { PIStringList ret; - PIMap::iterator i; + PIMap::iterator i; for (i = k.begin(); i != k.end(); ++i) ret << i.value().name(); return ret; } -void KSection::write(PIIODevice * d, const PIString & prefix) { +void CDSection::write(PIIODevice * d, const PIString & prefix) { if (!d) return; if (k.isEmpty() && s.isEmpty()) return; PIString l; @@ -54,19 +56,19 @@ void KSection::write(PIIODevice * d, const PIString & prefix) { else l = "[" + prefix + ".k]"; l += "\n"; d->write(l.toUTF8()); - PIMap::iterator i; + PIMap::iterator i; for (i = k.begin(); i != k.end(); ++i) { - KType & ck(i.value()); + CDType & ck(i.value()); l.clear(); l << ck.index() << ".f = " << ck.formula() << " #s " << ck.comment() << "\n"; - l << ck.index() << ".v = " << ck.value() << " #s " << ck.type() << " " << ck.name() << "\n"; + l << ck.index() << ".v = " << ck.value() << " #" << ck.type() << " " << ck.name() << "\n"; d->write(l.toUTF8()); } } if (!s.isEmpty()) { if (prefix.isEmpty()) l = "s"; else l = prefix + ".s"; - PIMap::iterator j; + PIMap::iterator j; for (j = s.begin(); j != s.end(); ++j) { j.value().write(d, l + "." + PIString::fromNumber(j.key())); } @@ -78,7 +80,7 @@ void KSection::write(PIIODevice * d, const PIString & prefix) { } -void KSection::read(const void * ep) { +void CDSection::read(const void * ep) { k.clear(); s.clear(); PIConfig::Entry & e(*(PIConfig::Entry*)ep); @@ -88,23 +90,23 @@ void KSection::read(const void * ep) { int kid = ke->name().toInt(); PIString n = ke->getValue("v").comment(); PIString t = n.takeLeft(1); - k[kid] = KType(kid, n.trim(), t, ke->getValue("v").value(), ke->getValue("f").value(), ke->getValue("f").comment()); + k[kid] = CDType(kid, n.trim(), t, ke->getValue("v").value(), ke->getValue("f").value(), ke->getValue("f").comment(), CDType::cdK); } PIConfig::Entry & sl = e.getValue("s"); for (int i = 0; i < sl.childCount(); ++i) { const PIConfig::Entry * se(sl.child(i)); int sid = se->name().toInt(); - KSection cs; + CDSection cs; cs.read(se); s[sid] = cs; } } -void KSection::update(KSection & v, bool keep_names) { +void CDSection::update(CDSection & v, bool keep_names) { PIMap vk_ids; PISet used; - PIMap::iterator i; + PIMap::iterator i; for (i = v.k.begin(); i != v.k.end(); ++i) vk_ids[i.value().name()] = i.value().formula(); for (i = k.begin(); i != k.end(); ++i) { @@ -124,7 +126,7 @@ void KSection::update(KSection & v, bool keep_names) { k[i.key()] = i.value(); } used.clear(); - PIMap::iterator j; + PIMap::iterator j; for (j = s.begin(); j != s.end(); ++j) { if (v.s.contains(j.key())) j.value().update(v.s[j.key()], keep_names); @@ -137,9 +139,9 @@ void KSection::update(KSection & v, bool keep_names) { } -bool KSection::isSameStructure(KSection & v) { +bool CDSection::isSameStructure(CDSection & v) { PIMap k_ids; - PIMap::iterator i; + PIMap::iterator i; for (i = k.begin(); i != k.end(); ++i) k_ids[i.value().name()] = i.key(); for (i = v.k.begin(); i != v.k.end(); ++i) { @@ -148,7 +150,7 @@ bool KSection::isSameStructure(KSection & v) { if (k[k_ids[i.value().name()]].index() != i.key()) return false; } - PIMap::iterator j; + PIMap::iterator j; for (j = v.s.begin(); j != v.s.end(); ++j) { if (!s.contains(j.key())) continue; if (!s[j.key()].isSameStructure(j.value())) @@ -156,3 +158,5 @@ bool KSection::isSameStructure(KSection & v) { } return true; } + + diff --git a/cd_utils/cdutils_types.h b/cd_utils/cdutils_types.h new file mode 100644 index 0000000..f6cd2bc --- /dev/null +++ b/cd_utils/cdutils_types.h @@ -0,0 +1,99 @@ +#ifndef CDUTILS_TYPES_H +#define CDUTILS_TYPES_H + +#include "pistring.h" +#include "pimap.h" + +class PIIODevice; +class CD_Pult; + +namespace CDUtils { + +class CDSection; + +class CDType { + friend class CDSection; + friend class ::CD_Pult; +public: + enum cdT {cdNull, cdK, cdX, cdC}; + CDType(); + CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t); + int index() const {return index_;} + PIString name() const {return name_;} + PIString type() const {return type_;} + PIString value() const {return value_s;} + PIString formula() const {return formula_;} + PIString comment() const {return comment_;} + double toDouble() const {return value_d;} + int toInt() const {return value_i;} + bool toBool() const {return value_b;} + cdT cd_type() const {return cd_type_;} + + operator double() const {return value_d;} + + +protected: + cdT cd_type_; + int index_; + PIString name_, type_; + PIString value_s, formula_, comment_; + double value_d; + int value_i; + bool value_b; + +}; + + +class CDSection { + friend class CDCore; + friend class ::CD_Pult; +public: + + CDSection() {} + + bool test(int v) {return k.value(v).toBool();} + CDType & operator [](int v) {return k[v];} + const CDType operator [](int v) const {return k[v];} + CDSection & section(int v) {return s[v];} + const CDSection section(int v) const {return s[v];} + + bool isEmpty() const {return k.isEmpty() && s.isEmpty();} + int count(bool recursive = true) const; + PIVector indexes() const {return k.keys();} + PIStringList index_names() const; + + PIString name; + PIString alias; + +protected: + CDSection(PIMap k_, PIMap s_) { + k = k_; + s = s_; + } + void write(PIIODevice * d, const PIString & prefix = PIString()); + void read(const void * ep); + void update(CDSection & v, bool keep_names); + bool isSameStructure(CDSection & v); + + mutable PIMap k; + PIMap s; + +}; + +} + +inline PICout operator <<(PICout s, const CDUtils::CDType & v) { + s.space(); + s.setControl(0, true); + switch (v.cd_type()) { + case CDUtils::CDType::cdK : s << "K["; break; + case CDUtils::CDType::cdX : s << "X["; break; + case CDUtils::CDType::cdC : s << "C["; break; + default : s << "Null["; break; + } + s << v.name() << "(" << v.index() << ")] = " << v.value(); + s.restoreControl(); + return s;\ +} + +#endif // CDUTILS_TYPES_H diff --git a/cd_utils/cdutilstest.cpp b/cd_utils/cdutilstest.cpp index 1c2e8e9..8416c02 100644 --- a/cd_utils/cdutilstest.cpp +++ b/cd_utils/cdutilstest.cpp @@ -3,13 +3,48 @@ #include "piethernet.h" #include "piiostring.h" #include "pifile.h" +#include "cdtest.h" +using namespace CDUtils; + +class Core : public PIObject +{ + PIOBJECT(Core) + public: + Core() { +// piCout << "testCore"; + + } + + void load() { + rf.open("k.dat", PIIODevice::ReadWrite); + K.read(&rf); + } + + void test() { + piCoutObj << "count" << K.count(); + piCoutObj << "First" << (int)First << K[First]; + piCoutObj << "Second" << (int)Second << K[Second]; + piCoutObj << "test Second" << K.test(Second); + } + + EVENT_HANDLER(void, ksend) {piCoutObj << "sended k";} + EVENT_HANDLER(void, krecv) {piCoutObj << "received k";} + +private: + PIFile rf; +}; + + +#include "piscreen.h" +#include "piscreentiles.h" +PIScreen screen(false); int main(int argc, char *argv[]) { - PIEthernet eth; - eth.send("127.0.0.1:16102", PIByteArray("data\n", 5)); - eth.send("127.0.0.1:26102", PIByteArray("data\n", 5)); - eth.send("127.0.0.1:36102", PIByteArray("data\n", 5)); - PIString s;/* = "[k]\n\ +// PIEthernet eth; +// eth.send("127.0.0.1:16102", PIByteArray("data\n", 5)); +// eth.send("127.0.0.1:26102", PIByteArray("data\n", 5)); +// eth.send("127.0.0.1:36102", PIByteArray("data\n", 5)); + /*PIString s; = "[k]\n\ 1.f = 120+3 #s comment\n\ 1.v = 123\n\ 2.f = 2 #s comm\n\ @@ -37,20 +72,34 @@ int main(int argc, char *argv[]) { PIIOString iosw(&s); CDUtils::K.write(&iosw); piCout << s;*/ +// piCout << K.count(); +// PIFile rf("1.txt", PIIODevice::ReadWrite); +// K.read(&rf); - PIFile rf("1.txt", PIIODevice::ReadWrite); - CDUtils::K.read(&rf); +// PIFile f; +// f.open("SH_base.h", PIIODevice::ReadOnly); +// CDUtils::K.update(&f); - PIFile f; - f.open("SH_base.h", PIIODevice::ReadOnly); - CDUtils::K.update(&f); - - PIFile wf("2.txt", PIIODevice::ReadWrite); - CDUtils::K.write(&wf); +// PIFile wf("2.txt", PIIODevice::ReadWrite); +// CDUtils::K.write(&wf); //PIIOString iosw(&s); - piCout << s; + //piCout << s; //piMSleep(1000); //CDUtils::Core::instance()->test(); + //return 0; +// piCout << "init"; + //screen.rootTile()->addTile(new TilePICout()); + screen.enableExitCapture('q'); + //screen.start(); + piCout << "start"; + + Core core; + core.load(); + core.test(); + K.send(); + + + //screen.waitForFinish(); return 0; } diff --git a/cd_utils/pult/cd_pult.cpp b/cd_utils/pult/cd_pult.cpp index 9db65e3..1b8fc13 100644 --- a/cd_utils/pult/cd_pult.cpp +++ b/cd_utils/pult/cd_pult.cpp @@ -200,29 +200,29 @@ QString CD_Pult::typeName(const QString & n) const { case 'F': return trUtf8("file"); break; case 'D': return trUtf8("dir"); break; } - return ""; + return trUtf8("double"); } -void CD_Pult::makeTreeSection(KSection & ks, QTreeWidgetItem * pi) { - PIMap::iterator ki; +void CD_Pult::makeTreeSection(CDSection & ks, QTreeWidgetItem * pi) { + PIMap::iterator ki; for (ki = ks.k.begin(); ki != ks.k.end(); ++ki) { QTreeWidgetItem * ti = new QTreeWidgetItem(pi); - const KType & ck(ki.value()); + const CDType & ck(ki.value()); ti->setText(0, QString::number(ck.index())); ti->setText(1, PI2QString(ck.name())); ti->setText(2, typeName(PI2QString(ck.type()))); ti->setText(3, PI2QString(ck.formula())); ti->setText(5, PI2QString(ck.comment())); } - PIMap::iterator si; + PIMap::iterator si; for (si = ks.s.begin(); si != ks.s.end(); ++si) { QTreeWidgetItem * ti = new QTreeWidgetItem(pi); - const KSection & cs(si.value()); + const CDSection & cs(si.value()); ti->setText(0, QString("[%1]").arg(si.key())); ti->setText(1, PI2QString(cs.alias)); ti->setText(2, PI2QString(cs.name)); - makeTreeSection(const_cast(cs), ti); + makeTreeSection(const_cast(cs), ti); } } @@ -298,7 +298,7 @@ void CD_Pult::on_buttonSetKDesc_clicked() { kdesc_file = Q2PIString(QDir::current().relativeFilePath(ret)); PIFile f(kdesc_file, PIIODevice::ReadOnly); piCout << "open description:" << Q2PIString(ret); - K.update(&f); + //K.update(&f); updateKDesc(true); } @@ -393,6 +393,7 @@ void CD_Pult::updateDiag() { void CD_Pult::updateKDesc(bool ask_move) { addToList(trUtf8("Update K description file \"%1\"").arg(PI2QString(kdesc_file)), Qt::darkMagenta); PIFile f(kdesc_file, PIIODevice::ReadOnly); + //piCout << "call K.update():"; K.update(&f); updateTree(ask_move); } @@ -418,7 +419,7 @@ void CD_Pult::updateTree(bool move) { ui->treeK->clear(); ui->treeK->setUpdatesEnabled(false); eval.clearCustomVariables(); - makeTreeSection(const_cast(K.root()), ui->treeK->invisibleRootItem()); + makeTreeSection(const_cast(K.root()), ui->treeK->invisibleRootItem()); /*for (int i = 0; i < K.size_s(); ++i) { QTreeWidgetItem * ti = new QTreeWidgetItem(); KDesc kd = kdesc[i]; diff --git a/cd_utils/pult/cd_pult.h b/cd_utils/pult/cd_pult.h index e8644b9..53303a6 100644 --- a/cd_utils/pult/cd_pult.h +++ b/cd_utils/pult/cd_pult.h @@ -28,7 +28,7 @@ using namespace CDUtils; namespace Ui { class CD_Pult; -}; +} class CD_Pult: public QMainWindow, public PIObject { @@ -50,7 +50,7 @@ private: void progress(int val, int max); void clearSelected(); QString typeName(const QString & n) const; - void makeTreeSection(KSection & ks, QTreeWidgetItem * pi); + void makeTreeSection(CDSection & ks, QTreeWidgetItem * pi); EVENT_HANDLER1(void, received, bool, ok); EVENT_HANDLER(void, pip_sendFailed) {emit q_k_sendFailed();} diff --git a/cd_utils/pult/main.cpp b/cd_utils/pult/main.cpp index a8c31f4..38f08ba 100644 --- a/cd_utils/pult/main.cpp +++ b/cd_utils/pult/main.cpp @@ -1,7 +1,6 @@ #include #include "cd_pult.h" -class A {public: A() {} ~A() {} private: void a() {}}; int main(int argc, char *argv[]) { PIFile::setDefaultCharset("UTF-8");