diff --git a/CMakeLists.txt b/CMakeLists.txt index 62b40b2c..6be1e71f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -498,7 +498,7 @@ if (NOT CROSSTOOLS) # Test program if(PIP_UTILS) add_executable(pip_test "main.cpp") - target_link_libraries(pip_test pip) + target_link_libraries(pip_test pip pip_cloud) if (LUA_FOUND) target_link_libraries(pip_test pip_lua ${LUA_LIBRARIES}) endif() diff --git a/libs/cloud/piccloudclient.cpp b/libs/cloud/picloudclient.cpp similarity index 93% rename from libs/cloud/piccloudclient.cpp rename to libs/cloud/picloudclient.cpp index b17a2362..e3a950a0 100644 --- a/libs/cloud/piccloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -17,7 +17,7 @@ along with this program. If not, see . */ -#include "piccloudclient.h" +#include "picloudclient.h" PICloudClient::PICloudClient() { diff --git a/libs/cloud/piccloudserver.cpp b/libs/cloud/picloudserver.cpp similarity index 54% rename from libs/cloud/piccloudserver.cpp rename to libs/cloud/picloudserver.cpp index 45f98ed3..a6210e9b 100644 --- a/libs/cloud/piccloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -17,9 +17,34 @@ along with this program. If not, see . */ -#include "piccloudserver.h" +#include "picloudserver.h" +#include "piethernet.h" -PICloudServer::PICloudServer() { +PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) : PIIODevice(path, mode) { + eth = new PIEthernet(PIEthernet::TCP_Client); +} + + +PICloudServer::~PICloudServer() { + +} + + +bool PICloudServer::openDevice() { + piCout << "PICloudServer open device" << path(); + bool op = eth->connect(path(), false); + if (op) { + CONNECTL(eth, disconnected, [this](bool){eth->connect(path());}); + eth->startThreadedRead(); + return true; + } + return false; +} + + +bool PICloudServer::closeDevice() { + eth->stopThreadedRead(); + return eth->close(); } diff --git a/libs/cloud/piccloudtcp.cpp b/libs/cloud/picloudtcp.cpp similarity index 94% rename from libs/cloud/piccloudtcp.cpp rename to libs/cloud/picloudtcp.cpp index a977288e..80786a1d 100644 --- a/libs/cloud/piccloudtcp.cpp +++ b/libs/cloud/picloudtcp.cpp @@ -17,7 +17,7 @@ along with this program. If not, see . */ -#include "piccloudtcp.h" +#include "picloudtcp.h" #include "picrypt.h" const char hash_def_key[] = "_picrypt_"; diff --git a/libs/main/cloud/piccloudclient.h b/libs/main/cloud/picloudclient.h similarity index 91% rename from libs/main/cloud/piccloudclient.h rename to libs/main/cloud/picloudclient.h index b54cd73c..6de937a4 100644 --- a/libs/main/cloud/piccloudclient.h +++ b/libs/main/cloud/picloudclient.h @@ -1,4 +1,4 @@ -/*! \file piccloudclient.h +/*! \file picloudclient.h * \brief PICloud Client */ /* @@ -20,8 +20,8 @@ along with this program. If not, see . */ -#ifndef PICCLOUDCLIENT_H -#define PICCLOUDCLIENT_H +#ifndef PICLOUDCLIENT_H +#define PICLOUDCLIENT_H #include "pip_cloud_export.h" #include "piiodevice.h" @@ -45,4 +45,4 @@ private: PIEthernet * eth; }; -#endif // PICCLOUDCLIENT_H +#endif // PICLOUDCLIENT_H diff --git a/libs/main/cloud/piccloudmodule.h b/libs/main/cloud/picloudmodule.h similarity index 91% rename from libs/main/cloud/piccloudmodule.h rename to libs/main/cloud/picloudmodule.h index 2c37522e..f357f7bc 100644 --- a/libs/main/cloud/piccloudmodule.h +++ b/libs/main/cloud/picloudmodule.h @@ -20,8 +20,8 @@ #ifndef PICLOUDMODULE_H #define PICLOUDMODULE_H -#include "piccloudtcp.h" -#include "piccloudclient.h" -#include "piccloudserver.h" +#include "picloudtcp.h" +#include "picloudclient.h" +#include "picloudserver.h" #endif // PICLOUDMODULE_H diff --git a/libs/main/cloud/piccloudserver.h b/libs/main/cloud/picloudserver.h similarity index 68% rename from libs/main/cloud/piccloudserver.h rename to libs/main/cloud/picloudserver.h index cf0e4e23..b91bf398 100644 --- a/libs/main/cloud/piccloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -1,4 +1,4 @@ -/*! \file piccloudserver.h +/*! \file picloudserver.h * \brief PICloud Server */ /* @@ -20,21 +20,29 @@ along with this program. If not, see . */ -#ifndef PICCLOUDSERVER_H -#define PICCLOUDSERVER_H +#ifndef PICLOUDSERVER_H +#define PICLOUDSERVER_H #include "pip_cloud_export.h" #include "piiodevice.h" +class PIEthernet; -class PIP_CLOUD_EXPORT PICloudServer { + +class PIP_CLOUD_EXPORT PICloudServer : public PIIODevice +{ + PIIODEVICE(PICloudServer) public: //! - explicit PICloudServer(); + explicit PICloudServer(const PIString & path = PIString(), PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + virtual ~PICloudServer(); +protected: + bool openDevice(); + bool closeDevice(); private: - + PIEthernet * eth; }; -#endif // PICCLOUDSERVER_H +#endif // PICLOUDSERVER_H diff --git a/libs/main/cloud/piccloudtcp.h b/libs/main/cloud/picloudtcp.h similarity index 91% rename from libs/main/cloud/piccloudtcp.h rename to libs/main/cloud/picloudtcp.h index ea0e4f5c..5b7f1309 100644 --- a/libs/main/cloud/piccloudtcp.h +++ b/libs/main/cloud/picloudtcp.h @@ -1,4 +1,4 @@ -/*! \file piccloudtcp.h +/*! \file picloudtcp.h * \brief PICloud TCP transport */ /* @@ -20,12 +20,13 @@ along with this program. If not, see . */ -#ifndef PICCLOUDTCP_H -#define PICCLOUDTCP_H +#ifndef PICLOUDTCP_H +#define PICLOUDTCP_H #include "pip_cloud_export.h" #include "pistring.h" + class PIP_CLOUD_EXPORT PICloudTCP { public: //! @@ -36,4 +37,4 @@ private: }; -#endif // PICCLOUDTCP_H +#endif // PICLOUDTCP_H diff --git a/libs/main/pip.h b/libs/main/pip.h index a0a5e97f..91a95569 100644 --- a/libs/main/pip.h +++ b/libs/main/pip.h @@ -30,5 +30,6 @@ #include "pisystemmodule.h" #include "pigeomodule.h" #include "picryptmodule.h" +#include "picloudmodule.h" #endif // PIP_H diff --git a/main.cpp b/main.cpp index 511302a7..d1442618 100644 --- a/main.cpp +++ b/main.cpp @@ -1,259 +1,14 @@ #include "pip.h" -PIMap results; - - -template -struct __VariantTypeInfo__ { - typedef T PureType; - typedef const T ConstPureType; - typedef T * PointerType; - typedef const T * ConstPointerType; - typedef T & ReferenceType; - typedef const T & ConstReferenceType; -}; - -#define __TYPEINFO_SINGLE(PT, T) \ - template<> struct __PIVariantTypeInfo__ { \ - typedef PT PureType; \ - typedef const PT ConstPureType; \ - typedef PT * PointerType; \ - typedef const PT * ConstPointerType; \ - typedef PT & ReferenceType; \ - typedef const PT & ConstReferenceType; \ - }; - -#define REGISTER_VARIANT_TYPEINFO(T) \ - __TYPEINFO_SINGLE(T, T &) \ - __TYPEINFO_SINGLE(T, const T) \ - __TYPEINFO_SINGLE(T, const T &) - - - - -class __VariantFunctionsBase__ { -public: - virtual __VariantFunctionsBase__ * instance() {return 0;} - virtual PIString typeName() const {return PIString();} - virtual uint hash() const {return 0;} - virtual void newT(void *& ptr, const void * value) {;} - virtual void newNullT(void *& ptr) {;} - virtual void equalT(void *& ptr, const void * value) {;} - virtual void deleteT(void *& ptr) {;} - virtual PIByteArray toData(const void * ptr) const {return PIByteArray();} - virtual void fromData(void *& ptr, PIByteArray ba) {;} - //template static PIByteArray castHelper(PIByteArray ba) {return PIByteArray();} - //template static C castVariant(const T & v) {return C();} - static PIMap & registered() {static PIMap ret; return ret;} -}; - - -template -class __VariantFunctions__: public __VariantFunctionsBase__ { -public: - __VariantFunctionsBase__ * instance() override {static __VariantFunctions__ ret; return &ret;} - PIString typeName() const override {return PIString();} - uint hash() const override {static uint ret = typeName().hash(); return ret;} - void newT(void *& ptr, const void * value) override {ptr = (void*)(new T(*(const T*)value)); printf(" * new\n");} - void newNullT(void *& ptr) override {ptr = (void*)(new T()); printf(" * new null\n");} - void equalT(void *& ptr, const void * value) override {*(T*)ptr = *(const T*)value; printf(" * =\n");} - void deleteT(void *& ptr) override {delete (T*)(ptr); printf(" * del\n");} - PIByteArray toData(const void * ptr) const override {PIByteArray ret; ret << (*(const T* &)ptr); return ret;} - void fromData(void *& ptr, PIByteArray ba) override {ba >> *(T*)ptr;} - - template static PIByteArray castHelper(PIByteArray ba) {return PIByteArray();} - template static C castVariant(const T & v) {return C();} -}; - -class Variant { -public: - Variant() {ptr = 0; f = 0;} - Variant(const Variant & v) { - ptr = 0; - f = v.f; - if (f && v.ptr) - f->newT(ptr, v.ptr); - } - ~Variant() {destroy();} - - Variant & operator=(const Variant & v) { - destroy(); - f = v.f; - if (f && v.ptr) - f->newT(ptr, v.ptr); - return *this; - } - - template - void setValue(const T & v) { - if (f) { - if (isMyType()) { - f->equalT(ptr, (const void *)&v); - return; - } - } - destroy(); - f = __VariantFunctions__().instance(); - f->newT(ptr, (const void *)&v); - } - - template - T value() const { - if (!f) return T(); - if (!isMyType()) - return T(); - return *(T*)(ptr); - } - - PIByteArray save() const { - if (!ptr || !f) return PIByteArray(); - PIByteArray ret; - ret << f->hash(); - ret.append(f->toData(ptr)); - return ret; - } - - bool load(PIByteArray ba) { - if (ba.size_s() < 4) return false; - uint h(0); ba >> h; - destroy(); - f = __VariantFunctionsBase__::registered().value(h, 0); - if (!f) return false; - f->newNullT(ptr); - f->fromData(ptr, ba); - return true; - } - -//private: - template - bool isMyType() const {return f->hash() == __VariantFunctions__().instance()->hash();} - - void destroy() { - if (ptr && f) - f->deleteT(ptr); - ptr = 0; - f = 0; - } - - void * ptr; - __VariantFunctionsBase__ * f; - -}; - -int Acnt = 0; - -class A { -public: - A() {i = "constructor"; /*piCout << "A()";*/ ++Acnt;} - A(const A & a): i(a.i) {/*piCout << "copy A()";*/ ++Acnt;} - ~A() {/*piCout << "~A()";*/ --Acnt;} - A & operator =(const A & a) {i = a.i; /*piCout << "= A()";*/ return *this;} - PIString i; -}; -PIByteArray & operator <<(PIByteArray & ba, const A & v) {ba << v.i; return ba;} -PIByteArray & operator >>(PIByteArray & ba, A & v) {ba >> v.i; return ba;} - - -template <> -PIString __VariantFunctions__::typeName() const {static PIString ret("int"); return ret;} -class _VariantRegistrator_int__ { -public: - _VariantRegistrator_int__() { - __VariantFunctionsBase__ * f = __VariantFunctions__().instance(); - __VariantFunctionsBase__::registered()[f->hash()] = f; - } -}; -_VariantRegistrator_int__ __reg_int__; - -template <> -PIString __VariantFunctions__::typeName() const {static PIString ret("A"); return ret;} -class _VariantRegistrator_A__ { -public: - _VariantRegistrator_A__() { - __VariantFunctionsBase__ * f = __VariantFunctions__().instance(); - __VariantFunctionsBase__::registered()[f->hash()] = f; - } -}; -_VariantRegistrator_A__ __reg_A__; - - int main() { - { - - Variant v, v2; - - /*{ - A a, ra; - - a.i = "main"; - v.setValue(a); - - ra = v.value(); - piCout << " 1 A.i =" << ra.i; - - a.i = "main second"; - v.setValue(a); - - ra = v.value(); - piCout << " 2 A.i =" << ra.i; - - piCout << "Acnt" << Acnt; + PICloudServer s("127.0.0.1:10101"); + for (int i=0; i<3; ++i) { + s.open(); + piCout() << "opened"; + piSleep(1); + s.close(); + piCout() << "closed"; + piSleep(1); } - piCout << "Acnt" << Acnt; - - v2 = v; - PIString ra = v2.value(); - piCout << " 3 A.i =" << ra;*/ - - A a, ra; - - a.i = "main"; - v.setValue(a); - PIByteArray ba = v.save(); - - piCout << v2.load(ba); - piCout << v2.value().i; - - } - piCout << "Acnt" << Acnt; - //__VariantFunctionsBase__ * f = __VariantFunctions__().instance(); - //piCout << f->typeName(); - //f = __VariantFunctions__().instance(); - //piCout << f->typeName(); + return 0; } - -/* -template -void test_var(const char * Tname) { - piCout << Tname << "..."; - ullong cnt = 0; - PIVariant _v; - PITimeMeasurer tm1s; - while (tm1s.elapsed_m() < 500.) { - ++cnt; - for (int j = 0; j < 1000; ++j) { - PIVariant v; - v = T(); - v.setValue(T(j)); - _v = v; - } - } - PIVariant v; - results[Tname] = cnt; -} - -#define TEST_VAR(T) test_var(#T) - -int main() { - TEST_VAR(int); - TEST_VAR(float); - TEST_VAR(ullong); - TEST_VAR(PIString); - int sz = 0; - auto i = results.makeIterator(); - while (i.next()) sz = piMaxi(sz, i.key().length()); - i.reset(); - while (i.next()) - piCout << i.key().expandedLeftTo(sz, ' ') << ":" << i.value(); -} -*/