From c44d22f6eb3c755169f8a5b56f9c81643dfd630d Mon Sep 17 00:00:00 2001 From: Thomas Kunze Date: Sat, 22 Dec 2018 14:53:31 +0100 Subject: [PATCH] first real working version of knxPython --- examples/knx-demo/knx-demo.ino | 2 +- knxPython/CMakeLists.txt | 2 +- knxPython/CMakeLists.txt.old | 10 +- knxPython/knxPython.vcxproj | 2 +- knxPython/knxmodule.cpp | 113 ++++-------------- knxPython/main.py | 12 +- src/knx/bau_systemB.cpp | 5 +- src/knx/device_object.h | 2 +- src/knx/group_object.cpp | 17 ++- src/knx/group_object.h | 14 ++- src/linux_platform.cpp | 11 +- src/main.cpp | 10 +- visualstudio/knx-demo.vgdbproj | 204 +++++++++++++++------------------ visualstudio/knx.sln | 36 +++--- 14 files changed, 191 insertions(+), 249 deletions(-) diff --git a/examples/knx-demo/knx-demo.ino b/examples/knx-demo/knx-demo.ino index b437867..8786799 100644 --- a/examples/knx-demo/knx-demo.ino +++ b/examples/knx-demo/knx-demo.ino @@ -70,7 +70,7 @@ void setup() knx.readMemory(); // register callback for reset GO - goReset.updateHandler = resetCallback; + goReset.callback(resetCallback); // print values of parameters if device is already configured if (knx.configured()) diff --git a/knxPython/CMakeLists.txt b/knxPython/CMakeLists.txt index 9849bd7..f3ea501 100644 --- a/knxPython/CMakeLists.txt +++ b/knxPython/CMakeLists.txt @@ -8,4 +8,4 @@ add_subdirectory(pybind11) pybind11_add_module(knx ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/platform.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp) -include_directories(../src) \ No newline at end of file +include_directories(../src pybind11/include) diff --git a/knxPython/CMakeLists.txt.old b/knxPython/CMakeLists.txt.old index 1e0f970..9849bd7 100644 --- a/knxPython/CMakeLists.txt.old +++ b/knxPython/CMakeLists.txt.old @@ -4,8 +4,8 @@ cmake_minimum_required(VERSION 2.7) project(knx) -set(LIBRARIES_FROM_REFERENCES "") -add_library(knx SHARED ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp) -target_link_libraries(knx python3.5m "${LIBRARIES_FROM_REFERENCES}") -include_directories(/usr/include/python3.5m ../src) -SET_TARGET_PROPERTIES(knx PROPERTIES PREFIX "") +add_subdirectory(pybind11) + +pybind11_add_module(knx ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/platform.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp) + +include_directories(../src) \ No newline at end of file diff --git a/knxPython/knxPython.vcxproj b/knxPython/knxPython.vcxproj index e01fb5a..a1237ae 100644 --- a/knxPython/knxPython.vcxproj +++ b/knxPython/knxPython.vcxproj @@ -44,7 +44,7 @@ - $(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\python3.5dm;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\python3.5;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\c++\6;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\x86_64-linux-gnu\c++\6;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\c++\6\backward;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\lib\gcc\x86_64-linux-gnu\6\include;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\local\include;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\lib\gcc\x86_64-linux-gnu\6\include-fixed;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\x86_64-linux-gnu;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include;..\..\src;..\pybind11\include;$(NMakeIncludeSearchPath) + $(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\python3.5dm;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\python3.5;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\c++\6;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\x86_64-linux-gnu\c++\6;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\c++\6\backward;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\lib\gcc\x86_64-linux-gnu\6\include;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\local\include;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\lib\gcc\x86_64-linux-gnu\6\include-fixed;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include\x86_64-linux-gnu;$(LOCALAPPDATA)\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs\usr\include;..\..\src;..\pybind11\include;pybind11\include;..\src;$(NMakeIncludeSearchPath) $(ProjectDir)\gcc_Debug.h;$(VISUALGDB_DIR)\gcc_compat.h;$(NMakeForcedIncludes) "$(VISUALGDB_DIR)\VisualGDB.exe" /build "$(ProjectPath)" "/solution:$(SolutionPath)" "/config:$(Configuration)" "/platform:$(Platform)" "$(VISUALGDB_DIR)\VisualGDB.exe" /clean "$(ProjectPath)" "/solution:$(SolutionPath)" "/config:$(Configuration)" "/platform:$(Platform)" diff --git a/knxPython/knxmodule.cpp b/knxPython/knxmodule.cpp index ebbbb8c..f8af2ef 100644 --- a/knxPython/knxmodule.cpp +++ b/knxPython/knxmodule.cpp @@ -1,5 +1,6 @@ #include #include +#include namespace py = pybind11; @@ -15,96 +16,14 @@ namespace py = pybind11; #include "knx/bau57B0.h" #include "knx/group_object_table_object.h" - LinuxPlatform platform; Bau57B0 bau(platform); -#if 1 // this code will go to python later -//float currentValue = 0; -//float maxValue = 0; -//float minValue = RAND_MAX; -//long lastsend = 0; -// -//GroupObject groupObjects[] -//{ -// GroupObject(2), -// GroupObject(2), -// GroupObject(2), -// GroupObject(1) -//} -//; -//#define CURR groupObjects[0] -//#define MAX groupObjects[1] -//#define MIN groupObjects[2] -//#define RESET groupObjects[3] -// -//void measureTemp() -//{ -// long now = platform.millis(); -// if ((now - lastsend) < 2000) -// return; -// -// lastsend = now; -// int r = rand(); -// currentValue = (r * 1.0) / (RAND_MAX * 1.0); -// currentValue *= 100 * 100; -// -// CURR.objectWrite(currentValue); -// -// if (currentValue > maxValue) -// { -// maxValue = currentValue; -// MAX.objectWrite(maxValue); -// } -// -// if (currentValue < minValue) -// { -// minValue = currentValue; -// MIN.objectWrite(minValue); -// } -//} - -//void resetCallback(GroupObject& go) -//{ -// if (go.objectReadBool()) -// { -// maxValue = 0; -// minValue = 10000; -// } -//} - -//void appLoop() -//{ -// if (!bau.configured()) -// return; -// -// measureTemp(); -//} - -void setup() -{ - srand((unsigned int)time(NULL)); - bau.readMemory(); - -// GroupObjectTableObject& got(bau.groupObjectTable()); -// got.groupObjects(groupObjects, 4); - - DeviceObject& devObj(bau.deviceObject()); - devObj.manufacturerId(0xfa); - -// RESET.updateHandler = resetCallback; - - bau.enabled(true); -} -#endif - -bool threadEnabled = false; static void loop() { while (1) { bau.loop(); - //appLoop(); platform.mdelay(100); } } @@ -117,7 +36,10 @@ static void Start() if (started) return; - setup(); + started = true; + + bau.readMemory(); + bau.enabled(true); workerThread = std::thread(loop); workerThread.detach(); @@ -142,17 +64,32 @@ static void RegisterGroupObjects(std::vector& gos) PYBIND11_MAKE_OPAQUE(std::vector); -PYBIND11_MODULE(knx, m) { - m.doc() = "wrapper for knx device lib"; // optional module docstring +PYBIND11_MODULE(knx, m) +{ + m.doc() = "wrapper for knx device lib"; // optional module docstring py::bind_vector>(m, "GroupObjectList"); m.def("Start", &Start, "Start knx handling thread."); - m.def("ProgramMode", (bool (*)())&ProgramMode, "get programing mode active."); + m.def("ProgramMode", (bool(*)())&ProgramMode, "get programing mode active."); m.def("ProgramMode", (bool(*)(bool))&ProgramMode, "Activate / deactivate programing mode."); m.def("RegisterGroupObjects", &RegisterGroupObjects); - py::class_(m, "GroupObject") + py::class_(m, "GroupObject", py::dynamic_attr()) .def(py::init()) - .def("objectWrite", (void(GroupObject::*)(float))&GroupObject::objectWrite); + .def("objectWrite", (void(GroupObject::*)(float))&GroupObject::objectWrite) + .def("asap", &GroupObject::asap) + .def("size", &GroupObject::valueSize) + .def_property("value", + [](GroupObject& go) { return py::bytes((const char*)go.valueRef(), go.valueSize()); }, + [](GroupObject& go, py::bytes bytesValue) + { + const auto value = static_cast(bytesValue); + if (value.length() != go.valueSize()) + throw std::length_error("bytesValue"); + + auto valueRef = go.valueRef(); + memcpy(valueRef, value.c_str(), go.valueSize()); + }) + .def("callBack", (void(GroupObject::*)(GroupObjectUpdatedHandler))&GroupObject::callback); } \ No newline at end of file diff --git a/knxPython/main.py b/knxPython/main.py index 39e104b..07b859a 100644 --- a/knxPython/main.py +++ b/knxPython/main.py @@ -2,6 +2,9 @@ import knx import time import sys +def updated(g1): + print(g1.value) + print("start") gos = knx.GroupObjectList() gos.append(knx.GroupObject(2)) @@ -9,6 +12,11 @@ gos.append(knx.GroupObject(2)) gos.append(knx.GroupObject(2)) gos.append(knx.GroupObject(1)) curr = gos[0] +min = gos[1] +max = gos[2] +reset = gos[3] +reset.callBack(updated) + knx.RegisterGroupObjects(gos) knx.Start() while True: @@ -16,15 +24,11 @@ while True: cmd = sys.stdin.read(1) if cmd == 'q': break - elif cmd == 's': - print("start knx") - name = knx.Start() elif cmd == 'p': currentMode = knx.ProgramMode(not knx.ProgramMode()) print("set programming mode to " + str(currentMode)) elif cmd == 'w': cmd = sys.stdin.read(4) - print(cmd) value = float(cmd) curr.objectWrite(value) print("wrote " + str(value) + " to curr") diff --git a/src/knx/bau_systemB.cpp b/src/knx/bau_systemB.cpp index 0dceee4..8fee035 100644 --- a/src/knx/bau_systemB.cpp +++ b/src/knx/bau_systemB.cpp @@ -83,8 +83,9 @@ void BauSystemB::updateGroupObject(GroupObject & go, uint8_t * data, uint8_t len memcpy(goData, data, length); go.commFlag(cfUpdate); - if (go.updateHandler) - go.updateHandler(go); + GroupObjectUpdatedHandler handler = go.callback(); + if (handler) + handler(go); } void BauSystemB::readMemory() diff --git a/src/knx/device_object.h b/src/knx/device_object.h index c727e54..dcc594c 100644 --- a/src/knx/device_object.h +++ b/src/knx/device_object.h @@ -43,7 +43,7 @@ private: uint8_t _routingCount; uint8_t _prgMode; uint16_t _ownAddress; - uint16_t _manufacturerId; + uint16_t _manufacturerId = 0xfa; //Default to KNXA uint32_t _bauNumber; char _orderNumber[10]; uint8_t _hardwareType[6]; diff --git a/src/knx/group_object.cpp b/src/knx/group_object.cpp index a6df977..75b1ecf 100644 --- a/src/knx/group_object.cpp +++ b/src/knx/group_object.cpp @@ -7,10 +7,11 @@ GroupObject::GroupObject(uint8_t size) { _data = new uint8_t[size]; + memset(_data, 0, size); _commFlag = Ok; _table = 0; _dataLength = size; - updateHandler = 0; + _updateHandler = 0; } GroupObject::GroupObject(const GroupObject& other) @@ -20,7 +21,7 @@ GroupObject::GroupObject(const GroupObject& other) _table = other._table; _dataLength = other._dataLength; _asap = other._asap; - updateHandler = other.updateHandler; + _updateHandler = other._updateHandler; memcpy(_data, other._data, _dataLength); } @@ -252,3 +253,15 @@ void GroupObject::objectWrite(float value) uint32_t tmp = value * 100; objectWriteFloatDpt9(tmp); } + + +void GroupObject::callback(GroupObjectUpdatedHandler handler) +{ + _updateHandler = handler; +} + + +GroupObjectUpdatedHandler GroupObject::callback() +{ + return _updateHandler; +} diff --git a/src/knx/group_object.h b/src/knx/group_object.h index 9a17278..1ca095a 100644 --- a/src/knx/group_object.h +++ b/src/knx/group_object.h @@ -4,6 +4,7 @@ #include #include "knx_types.h" + class GroupObjectTableObject; enum ComFlag @@ -17,7 +18,14 @@ enum ComFlag }; class GroupObject; -typedef void (*GroupObjectUpdatedHandler)(GroupObject& go); + +#ifdef __linux__ +#include +typedef std::function GroupObjectUpdatedHandler; +#else +typedef void(*GroupObjectUpdatedHandler)(GroupObject& go); +#endif + class GroupObject { @@ -109,8 +117,10 @@ public: size_t sizeInTelegram(); uint8_t* valueRef(); uint16_t asap(); - GroupObjectUpdatedHandler updateHandler; + void callback(GroupObjectUpdatedHandler hanlder); + GroupObjectUpdatedHandler callback(); private: + GroupObjectUpdatedHandler _updateHandler; size_t goSize(); uint16_t _asap; ComFlag _commFlag; diff --git a/src/linux_platform.cpp b/src/linux_platform.cpp index 2f2f693..65265a6 100644 --- a/src/linux_platform.cpp +++ b/src/linux_platform.cpp @@ -218,7 +218,7 @@ void LinuxPlatform::doMemoryMapping() _fd = open("flash.bin", O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IROTH); if (_fd < 0) { - perror("Error in file opening"); + puts("Error in file opening"); //exit(-1); } @@ -226,7 +226,7 @@ void LinuxPlatform::doMemoryMapping() uint32_t ret = fstat(_fd, &st); if (ret < 0) { - perror("Error in fstat"); + puts("Error in fstat"); //exit(-1); } @@ -235,7 +235,7 @@ void LinuxPlatform::doMemoryMapping() { if (ftruncate(_fd, FLASHSIZE) != 0) { - perror("Error extending file"); + puts("Error extending file"); //exit(-1); } len_file = FLASHSIZE; @@ -250,7 +250,7 @@ void LinuxPlatform::doMemoryMapping() if (addr == MAP_FAILED) { - perror("Error in mmap"); + puts("Error in mmap"); //exit(-1); } _mappedFile = addr; @@ -308,9 +308,10 @@ uint8_t* LinuxPlatform::allocMemory(size_t size) throw std::overflow_error("MAX_MEM was to small"); return addr; } -#endif void LinuxPlatform::freeMemory(uint8_t* ptr) { /* do nothing. Memory is freed on restart()*/ } +#endif + diff --git a/src/main.cpp b/src/main.cpp index d0094f0..c01a1cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -75,18 +75,10 @@ void setup() srand((unsigned int)time(NULL)); bau.readMemory(); - uint8_t hwType[] = { 0x0, 0x0, 0x8, 0x0, 0x0, 0x2 }; GroupObjectTableObject& got(bau.groupObjectTable()); got.groupObjects(groupObjects, 4); - DeviceObject& devObj(bau.deviceObject()); - devObj.manufacturerId(0xfa); - devObj.bauNumber(0xdeadbeef); - devObj.orderNumber("Coolstuff"); - devObj.hardwareType(hwType); - devObj.version(0x0020); - - RESET.updateHandler = resetCallback; + RESET.callback(resetCallback); if (bau.deviceObject().induvidualAddress() == 0) bau.deviceObject().progMode(true); diff --git a/visualstudio/knx-demo.vgdbproj b/visualstudio/knx-demo.vgdbproj index 0dc1c7e..a93d72a 100644 --- a/visualstudio/knx-demo.vgdbproj +++ b/visualstudio/knx-demo.vgdbproj @@ -171,116 +171,6 @@ - - NodeMCU 1 0 (ESP-12E Module) - - - - - - - - - false - false - false - false - false - false - false - false - false - - false - false - false - false - false - false - true - false - None - false - false - main - true - false - false - false - 0 - - - gdbstub - - 74880 - 115200 - 50 - !DTR;RTS;SLEEP;DTR;!RTS;SLEEP;!DTR;SLEEP - Auto - false - - size4M - freq40M - QIO - - - - true - Disabled - 0 - false - false - true - false - false - - _estack - 0 - false - true - - - esp8266:esp8266:nodemcuv2 - COM7 - - - - CpuFrequency - 80 - - - VTable - flash - - - FlashSize - 4M1M - - - LwIPVariant - v2mss536 - - - Debug - Disabled - - - DebugLevel - None____ - - - FlashErase - none - - - UploadSpeed - 115200 - - - - Sketch - - Arduino Genuino Zero (Native USB Port) @@ -338,6 +228,100 @@ Sketch + + NodeMCU 1 0 (ESP-12E Module) + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + main + true + false + false + false + 0 + + + true + Auto + 0 + false + false + true + false + false + + _estack + 0 + false + true + + + esp8266:esp8266:nodemcuv2 + + + + xtal + 80 + + + vt + flash + + + exception + enabled + + + eesz + 4M + + + ip + lm2f + + + dbg + Disabled + + + lvl + None____ + + + wipe + none + + + baud + 115200 + + + + Sketch + + \ No newline at end of file diff --git a/visualstudio/knx.sln b/visualstudio/knx.sln index 6a3f9cb..eb7e8f4 100644 --- a/visualstudio/knx.sln +++ b/visualstudio/knx.sln @@ -105,36 +105,36 @@ Global {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|Arduino Genuino Zero (Native USB Port).ActiveCfg = Debug|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|NodeMCU 1 0 (ESP-12E Module).ActiveCfg = Debug|NodeMCU 1 0 (ESP-12E Module) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|NodeMCU 1 0 (ESP-12E Module).Build.0 = Debug|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|VisualGDB.ActiveCfg = Debug|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|x64.ActiveCfg = Debug|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|x86.ActiveCfg = Debug|NodeMCU 1 0 (ESP-12E Module) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|VisualGDB.ActiveCfg = Debug|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|x64.ActiveCfg = Debug|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Debug|x86.ActiveCfg = Debug|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|Arduino Genuino Zero (Native USB Port).ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|Arduino Genuino Zero (Native USB Port).Build.0 = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|NodeMCU 1 0 (ESP-12E Module).ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|NodeMCU 1 0 (ESP-12E Module).Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|VisualGDB.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|VisualGDB.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x64.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x64.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x86.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x86.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|VisualGDB.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|VisualGDB.Build.0 = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x64.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x64.Build.0 = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x86.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.MinSizeRel|x86.Build.0 = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|Arduino Genuino Zero (Native USB Port).ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|Arduino Genuino Zero (Native USB Port).Build.0 = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|NodeMCU 1 0 (ESP-12E Module).ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|NodeMCU 1 0 (ESP-12E Module).Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|VisualGDB.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|x64.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|x86.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|VisualGDB.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|x64.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.Release|x86.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|Arduino Genuino Zero (Native USB Port).ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|Arduino Genuino Zero (Native USB Port).Build.0 = Release|Arduino Genuino Zero (Native USB Port) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|NodeMCU 1 0 (ESP-12E Module).ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|NodeMCU 1 0 (ESP-12E Module).Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|VisualGDB.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|VisualGDB.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x64.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x64.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x86.ActiveCfg = Release|NodeMCU 1 0 (ESP-12E Module) - {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x86.Build.0 = Release|NodeMCU 1 0 (ESP-12E Module) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|VisualGDB.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|VisualGDB.Build.0 = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x64.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x64.Build.0 = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x86.ActiveCfg = Release|Arduino Genuino Zero (Native USB Port) + {6165CD6A-91A4-49FA-977A-48F22086CA8E}.RelWithDebInfo|x86.Build.0 = Release|Arduino Genuino Zero (Native USB Port) {527A0D25-BC8E-47B8-AA56-BD991BE6CC67}.Debug|Arduino Genuino Zero (Native USB Port).ActiveCfg = Debug|Arduino Genuino Zero (Native USB Port) {527A0D25-BC8E-47B8-AA56-BD991BE6CC67}.Debug|Arduino Genuino Zero (Native USB Port).Build.0 = Debug|Arduino Genuino Zero (Native USB Port) {527A0D25-BC8E-47B8-AA56-BD991BE6CC67}.Debug|NodeMCU 1 0 (ESP-12E Module).ActiveCfg = Debug|NodeMCU 1 0 (ESP-12E Module)