first real working version of knxPython

This commit is contained in:
Thomas Kunze
2018-12-22 14:53:31 +01:00
parent 405aab0e5e
commit c44d22f6eb
14 changed files with 191 additions and 249 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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>

View File

@@ -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);
}

View File

@@ -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")