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();
-}
-*/