mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	first real working version of knxPython
This commit is contained in:
		
							parent
							
								
									405aab0e5e
								
							
						
					
					
						commit
						c44d22f6eb
					
				| @ -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()) | ||||
|  | ||||
| @ -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) | ||||
| include_directories(../src pybind11/include) | ||||
|  | ||||
| @ -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) | ||||
| @ -44,7 +44,7 @@ | ||||
|   </ImportGroup> | ||||
|   <PropertyGroup Label="UserMacros" /> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
|     <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;$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath> | ||||
|     <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)</NMakeIncludeSearchPath> | ||||
|     <NMakeForcedIncludes>$(ProjectDir)\gcc_Debug.h;$(VISUALGDB_DIR)\gcc_compat.h;$(NMakeForcedIncludes)</NMakeForcedIncludes> | ||||
|     <NMakeBuildCommandLine>"$(VISUALGDB_DIR)\VisualGDB.exe" /build "$(ProjectPath)" "/solution:$(SolutionPath)"  "/config:$(Configuration)" "/platform:$(Platform)"</NMakeBuildCommandLine> | ||||
|     <NMakeCleanCommandLine>"$(VISUALGDB_DIR)\VisualGDB.exe" /clean "$(ProjectPath)" "/solution:$(SolutionPath)"  "/config:$(Configuration)" "/platform:$(Platform)"</NMakeCleanCommandLine> | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| #include <pybind11/pybind11.h> | ||||
| #include <pybind11/stl_bind.h> | ||||
| #include <pybind11/functional.h> | ||||
|      | ||||
| 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<GroupObject>& gos) | ||||
| 
 | ||||
| PYBIND11_MAKE_OPAQUE(std::vector<GroupObject>); | ||||
| 
 | ||||
| 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<std::vector<GroupObject>>(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_<GroupObject>(m, "GroupObject") | ||||
|     py::class_<GroupObject>(m, "GroupObject", py::dynamic_attr()) | ||||
|         .def(py::init<uint8_t>()) | ||||
|         .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<std::string>(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); | ||||
| } | ||||
| @ -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") | ||||
|  | ||||
| @ -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() | ||||
|  | ||||
| @ -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]; | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| #include <stdint.h> | ||||
| #include "knx_types.h" | ||||
| 
 | ||||
| 
 | ||||
| class GroupObjectTableObject; | ||||
| 
 | ||||
| enum ComFlag | ||||
| @ -17,7 +18,14 @@ enum ComFlag | ||||
| }; | ||||
| 
 | ||||
| class GroupObject; | ||||
| typedef void (*GroupObjectUpdatedHandler)(GroupObject& go); | ||||
| 
 | ||||
| #ifdef __linux__ | ||||
| #include <functional> | ||||
| typedef std::function<void(GroupObject&)> 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; | ||||
|  | ||||
| @ -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 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										10
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								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); | ||||
|  | ||||
| @ -171,116 +171,6 @@ | ||||
|     </CodeAnalyzerSettings> | ||||
|   </CodeSense> | ||||
|   <Configurations> | ||||
|     <VisualGDBConfiguration> | ||||
|       <PlatformName>NodeMCU 1 0 (ESP-12E Module)</PlatformName> | ||||
|       <DebugSettingsOverride xsi:type="com.visualgdb.debug.embedded"> | ||||
|         <AdditionalStartupCommands> | ||||
|           <GDBPreStartupCommands /> | ||||
|           <GDBStartupCommands /> | ||||
|           <GDBFinalizationCommands /> | ||||
|         </AdditionalStartupCommands> | ||||
|         <AdditionalGDBSettings> | ||||
|           <Features> | ||||
|             <DisableAutoDetection>false</DisableAutoDetection> | ||||
|             <UseFrameParameter>false</UseFrameParameter> | ||||
|             <SimpleValuesFlagSupported>false</SimpleValuesFlagSupported> | ||||
|             <ListLocalsSupported>false</ListLocalsSupported> | ||||
|             <ByteLevelMemoryCommandsAvailable>false</ByteLevelMemoryCommandsAvailable> | ||||
|             <ThreadInfoSupported>false</ThreadInfoSupported> | ||||
|             <PendingBreakpointsSupported>false</PendingBreakpointsSupported> | ||||
|             <SupportTargetCommand>false</SupportTargetCommand> | ||||
|             <ReliableBreakpointNotifications>false</ReliableBreakpointNotifications> | ||||
|           </Features> | ||||
|           <EnableSmartStepping>false</EnableSmartStepping> | ||||
|           <FilterSpuriousStoppedNotifications>false</FilterSpuriousStoppedNotifications> | ||||
|           <ForceSingleThreadedMode>false</ForceSingleThreadedMode> | ||||
|           <UseAppleExtensions>false</UseAppleExtensions> | ||||
|           <CanAcceptCommandsWhileRunning>false</CanAcceptCommandsWhileRunning> | ||||
|           <MakeLogFile>false</MakeLogFile> | ||||
|           <IgnoreModuleEventsWhileStepping>true</IgnoreModuleEventsWhileStepping> | ||||
|           <UseRelativePathsOnly>false</UseRelativePathsOnly> | ||||
|           <ExitAction>None</ExitAction> | ||||
|           <DisableDisassembly>false</DisableDisassembly> | ||||
|           <ExamineMemoryWithXCommand>false</ExamineMemoryWithXCommand> | ||||
|           <StepIntoNewInstanceEntry>main</StepIntoNewInstanceEntry> | ||||
|           <ExamineRegistersInRawFormat>true</ExamineRegistersInRawFormat> | ||||
|           <DisableSignals>false</DisableSignals> | ||||
|           <EnableAsyncExecutionMode>false</EnableAsyncExecutionMode> | ||||
|           <EnableNonStopMode>false</EnableNonStopMode> | ||||
|           <MaxBreakpointLimit>0</MaxBreakpointLimit> | ||||
|         </AdditionalGDBSettings> | ||||
|         <DebugMethod> | ||||
|           <ID>gdbstub</ID> | ||||
|           <Configuration xsi:type="com.visualgdb.edp.espxx.settings.gdbstub"> | ||||
|             <StubBaudRate>74880</StubBaudRate> | ||||
|             <BootloaderBaudRate>115200</BootloaderBaudRate> | ||||
|             <BootloaderResetDelay>50</BootloaderResetDelay> | ||||
|             <BootloaderActivationSequence>!DTR;RTS;SLEEP;DTR;!RTS;SLEEP;!DTR;SLEEP</BootloaderActivationSequence> | ||||
|             <ProgramMode>Auto</ProgramMode> | ||||
|             <SuppressResetConfirmation>false</SuppressResetConfirmation> | ||||
|             <FLASHSettings> | ||||
|               <Size>size4M</Size> | ||||
|               <Frequency>freq40M</Frequency> | ||||
|               <Mode>QIO</Mode> | ||||
|             </FLASHSettings> | ||||
|           </Configuration> | ||||
|         </DebugMethod> | ||||
|         <AutoDetectRTOS>true</AutoDetectRTOS> | ||||
|         <SemihostingSupport>Disabled</SemihostingSupport> | ||||
|         <SemihostingPollingDelay>0</SemihostingPollingDelay> | ||||
|         <StepIntoEntryPoint>false</StepIntoEntryPoint> | ||||
|         <ReloadFirmwareOnReset>false</ReloadFirmwareOnReset> | ||||
|         <ValidateEndOfStackAddress>true</ValidateEndOfStackAddress> | ||||
|         <StopAtEntryPoint>false</StopAtEntryPoint> | ||||
|         <EnableVirtualHalts>false</EnableVirtualHalts> | ||||
|         <DynamicAnalysisSettings /> | ||||
|         <EndOfStackSymbol>_estack</EndOfStackSymbol> | ||||
|         <TimestampProviderTicksPerSecond>0</TimestampProviderTicksPerSecond> | ||||
|         <KeepConsoleAfterExit>false</KeepConsoleAfterExit> | ||||
|         <CheckInterfaceDrivers>true</CheckInterfaceDrivers> | ||||
|       </DebugSettingsOverride> | ||||
|       <BuildSettingsExtension xsi:type="com.visualgdb.build.external.arduino.extension"> | ||||
|         <BoardID>esp8266:esp8266:nodemcuv2</BoardID> | ||||
|         <COMPort>COM7</COMPort> | ||||
|         <Properties> | ||||
|           <Entries> | ||||
|             <KeyValue> | ||||
|               <Key>CpuFrequency</Key> | ||||
|               <Value>80</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>VTable</Key> | ||||
|               <Value>flash</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>FlashSize</Key> | ||||
|               <Value>4M1M</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>LwIPVariant</Key> | ||||
|               <Value>v2mss536</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>Debug</Key> | ||||
|               <Value>Disabled</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>DebugLevel</Key> | ||||
|               <Value>None____</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>FlashErase</Key> | ||||
|               <Value>none</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>UploadSpeed</Key> | ||||
|               <Value>115200</Value> | ||||
|             </KeyValue> | ||||
|           </Entries> | ||||
|         </Properties> | ||||
|         <DebugUnoptimizedComponentTypes>Sketch</DebugUnoptimizedComponentTypes> | ||||
|       </BuildSettingsExtension> | ||||
|     </VisualGDBConfiguration> | ||||
|     <VisualGDBConfiguration> | ||||
|       <PlatformName>Arduino Genuino Zero (Native USB Port)</PlatformName> | ||||
|       <DebugSettingsOverride xsi:type="com.visualgdb.debug.embedded"> | ||||
| @ -338,6 +228,100 @@ | ||||
|         <DebugUnoptimizedComponentTypes>Sketch</DebugUnoptimizedComponentTypes> | ||||
|       </BuildSettingsExtension> | ||||
|     </VisualGDBConfiguration> | ||||
|     <VisualGDBConfiguration> | ||||
|       <PlatformName>NodeMCU 1 0 (ESP-12E Module)</PlatformName> | ||||
|       <DebugSettingsOverride xsi:type="com.visualgdb.debug.embedded"> | ||||
|         <AdditionalStartupCommands /> | ||||
|         <AdditionalGDBSettings> | ||||
|           <Features> | ||||
|             <DisableAutoDetection>false</DisableAutoDetection> | ||||
|             <UseFrameParameter>false</UseFrameParameter> | ||||
|             <SimpleValuesFlagSupported>false</SimpleValuesFlagSupported> | ||||
|             <ListLocalsSupported>false</ListLocalsSupported> | ||||
|             <ByteLevelMemoryCommandsAvailable>false</ByteLevelMemoryCommandsAvailable> | ||||
|             <ThreadInfoSupported>false</ThreadInfoSupported> | ||||
|             <PendingBreakpointsSupported>false</PendingBreakpointsSupported> | ||||
|             <SupportTargetCommand>false</SupportTargetCommand> | ||||
|             <ReliableBreakpointNotifications>false</ReliableBreakpointNotifications> | ||||
|           </Features> | ||||
|           <EnableSmartStepping>false</EnableSmartStepping> | ||||
|           <FilterSpuriousStoppedNotifications>false</FilterSpuriousStoppedNotifications> | ||||
|           <ForceSingleThreadedMode>false</ForceSingleThreadedMode> | ||||
|           <UseAppleExtensions>false</UseAppleExtensions> | ||||
|           <CanAcceptCommandsWhileRunning>false</CanAcceptCommandsWhileRunning> | ||||
|           <MakeLogFile>false</MakeLogFile> | ||||
|           <IgnoreModuleEventsWhileStepping>true</IgnoreModuleEventsWhileStepping> | ||||
|           <UseRelativePathsOnly>false</UseRelativePathsOnly> | ||||
|           <ExitAction>None</ExitAction> | ||||
|           <DisableDisassembly>false</DisableDisassembly> | ||||
|           <ExamineMemoryWithXCommand>false</ExamineMemoryWithXCommand> | ||||
|           <StepIntoNewInstanceEntry>main</StepIntoNewInstanceEntry> | ||||
|           <ExamineRegistersInRawFormat>true</ExamineRegistersInRawFormat> | ||||
|           <DisableSignals>false</DisableSignals> | ||||
|           <EnableAsyncExecutionMode>false</EnableAsyncExecutionMode> | ||||
|           <EnableNonStopMode>false</EnableNonStopMode> | ||||
|           <MaxBreakpointLimit>0</MaxBreakpointLimit> | ||||
|         </AdditionalGDBSettings> | ||||
|         <DebugMethod /> | ||||
|         <AutoDetectRTOS>true</AutoDetectRTOS> | ||||
|         <SemihostingSupport>Auto</SemihostingSupport> | ||||
|         <SemihostingPollingDelay>0</SemihostingPollingDelay> | ||||
|         <StepIntoEntryPoint>false</StepIntoEntryPoint> | ||||
|         <ReloadFirmwareOnReset>false</ReloadFirmwareOnReset> | ||||
|         <ValidateEndOfStackAddress>true</ValidateEndOfStackAddress> | ||||
|         <StopAtEntryPoint>false</StopAtEntryPoint> | ||||
|         <EnableVirtualHalts>false</EnableVirtualHalts> | ||||
|         <DynamicAnalysisSettings /> | ||||
|         <EndOfStackSymbol>_estack</EndOfStackSymbol> | ||||
|         <TimestampProviderTicksPerSecond>0</TimestampProviderTicksPerSecond> | ||||
|         <KeepConsoleAfterExit>false</KeepConsoleAfterExit> | ||||
|         <CheckInterfaceDrivers>true</CheckInterfaceDrivers> | ||||
|       </DebugSettingsOverride> | ||||
|       <BuildSettingsExtension xsi:type="com.visualgdb.build.external.arduino.extension"> | ||||
|         <BoardID>esp8266:esp8266:nodemcuv2</BoardID> | ||||
|         <Properties> | ||||
|           <Entries> | ||||
|             <KeyValue> | ||||
|               <Key>xtal</Key> | ||||
|               <Value>80</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>vt</Key> | ||||
|               <Value>flash</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>exception</Key> | ||||
|               <Value>enabled</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>eesz</Key> | ||||
|               <Value>4M</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>ip</Key> | ||||
|               <Value>lm2f</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>dbg</Key> | ||||
|               <Value>Disabled</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>lvl</Key> | ||||
|               <Value>None____</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>wipe</Key> | ||||
|               <Value>none</Value> | ||||
|             </KeyValue> | ||||
|             <KeyValue> | ||||
|               <Key>baud</Key> | ||||
|               <Value>115200</Value> | ||||
|             </KeyValue> | ||||
|           </Entries> | ||||
|         </Properties> | ||||
|         <DebugUnoptimizedComponentTypes>Sketch</DebugUnoptimizedComponentTypes> | ||||
|       </BuildSettingsExtension> | ||||
|     </VisualGDBConfiguration> | ||||
|   </Configurations> | ||||
|   <ProgramArgumentsSuggestions /> | ||||
| </VisualGDBProjectSettings2> | ||||
| @ -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) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user