Skip to content

Commit d4cdf6b

Browse files
committed
Mysterious bug - MWE
1 parent b6afc94 commit d4cdf6b

File tree

3 files changed

+25
-101
lines changed

3 files changed

+25
-101
lines changed

python_host_node.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import depthai as dai
2+
import time
3+
4+
class Printer(dai.HostNode):
5+
def run(self):
6+
print("hello world")
7+
8+
p = dai.Pipeline()
9+
p.create(Printer)
10+
p.start()
11+
p.wait()

src/pipeline/PipelineBindings.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -116,29 +116,21 @@ void PipelineBindings::bind(pybind11::module& m, void* pCallstack){
116116
.def("setBoardConfig", &Pipeline::setBoardConfig, DOC(dai, Pipeline, setBoardConfig))
117117
.def("getBoardConfig", &Pipeline::getBoardConfig, DOC(dai, Pipeline, getBoardConfig))
118118
// 'Template' create function
119-
//.def("create", &Pipeline::create<HostNode>)
120-
/*
121-
.def("test", [](py::object class_){
122-
return py::module_::import("builtins").attr("issubclass")(
123-
class_.attr("__base__"),
124-
py::cast(HostNode)
125-
);
126-
//return dynamic_cast<HostNode&>(py::cast(&class_)) == nullptr;
127-
})*/
128119
.def("create", [](dai::Pipeline& p, py::object class_) {
129-
//if (class_.attr("__base__")
130-
//if (dynamic_cast<HostNode>(py::cast(class_)) != nullptr) {
131-
//if (py::cast<std::string>(class_.attr("__base__").attr("__name__")) == "HostNode") {
132-
py::print("Detected HostNode");
120+
if (py::cast<std::string>(class_.attr("__base__").attr("__name__")) == "HostNode") {
121+
#if 0
133122
py::cast<std::shared_ptr<HostNode>>(class_())->run();
123+
#else
134124
auto host_node = py::cast<std::shared_ptr<HostNode>>(class_());
135-
//Test
125+
//std::shared_ptr<HostNode> host_node = py::cast<std::shared_ptr<HostNode>>(class_());
126+
//std::shared_ptr<HostNode> host_node = class_().cast<std::shared_ptr<HostNode>>();
136127
host_node->run();
137-
py::print("Created HostNode");
138-
p.add(host_node);
139-
py::print("pipeline add");
140-
return (std::shared_ptr<Node>) host_node;
141-
//}
128+
#endif
129+
130+
//p.add(host_node);
131+
//return (std::shared_ptr<Node>) host_node;
132+
return (std::shared_ptr<Node>) nullptr;
133+
}
142134
auto node = createNode(p, class_);
143135
if(node == nullptr){
144136
throw std::invalid_argument(std::string(py::str(class_)) + " is not a subclass of depthai.node");
Lines changed: 3 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,23 @@
11
#include "NodeBindings.hpp"
22
#include "Common.hpp"
33

4-
//#include "depthai/pipeline/Pipeline.hpp"
5-
//#include "depthai/pipeline/Node.hpp"
6-
//#include "depthai/pipeline/node/Script.hpp"
74
#include "depthai/pipeline/HostNode.hpp"
85

96
using namespace dai;
107

11-
// TODO(Zimamazim) Should be replaced with CRTP
12-
//class PyHostNode : public NodeCRTP<HostNode, PyHostNode> {
13-
class PyHostNode : public HostNode {
8+
class PyHostNode : public NodeCRTP<HostNode, PyHostNode> {
149
public:
15-
using HostNode::HostNode;
16-
1710
void run() override {
1811
PYBIND11_OVERRIDE_PURE(
1912
void,
2013
HostNode,
2114
run);
2215
}
23-
24-
// TODO(Zimamazim) Should be replaced with CRTP
25-
const char* getName() const override {
26-
return "PLACEHOLDER";
27-
}
28-
29-
// TODO(Zimamazim) Should be replaced with CRTP
30-
std::unique_ptr<Node> clone() const override {
31-
return std::make_unique<PyHostNode>(*this);
32-
}
33-
};
34-
35-
class Pokus {
36-
public:
37-
virtual void run() = 0;
38-
};
39-
40-
class PyPokus : public Pokus {
41-
public:
42-
//using Pokus::Pokus;
43-
void run() override {
44-
PYBIND11_OVERRIDE_PURE(
45-
void,
46-
Pokus,
47-
run
48-
);}
49-
5016
};
5117

5218
void bind_hostnode(pybind11::module& m, void* pCallstack){
53-
54-
//using namespace dai::node;
55-
56-
// Node and Properties declare upfront
57-
//py::class_<ScriptProperties> scriptProperties(m, "ScriptProperties", DOC(dai, ScriptProperties));
58-
auto hostNode = py::class_<HostNode, PyHostNode, /*ThreadedNode,*/ std::shared_ptr<HostNode>>(m, "HostNode", DOC(dai, node, HostNode));
59-
auto pokusNode = py::class_<Pokus, PyPokus, std::shared_ptr<Pokus>>(m, "Pokus");
60-
61-
//TODO(Zimamazim): Understand why shared_ptr<HostNode> is used
62-
//TODO(Zimamazim): Understand why callstack is used
19+
// declare upfront
20+
auto hostNode = py::class_<HostNode, PyHostNode, ThreadedNode, std::shared_ptr<HostNode>>(m, "HostNode", DOC(dai, node, HostNode));
6321

6422
///////////////////////////////////////////////////////////////////////
6523
///////////////////////////////////////////////////////////////////////
@@ -74,45 +32,8 @@ void bind_hostnode(pybind11::module& m, void* pCallstack){
7432
///////////////////////////////////////////////////////////////////////
7533
///////////////////////////////////////////////////////////////////////
7634

77-
pokusNode
78-
.def(py::init<>())
79-
.def("run", &Pokus::run)
80-
;
81-
//m.def("pokus", [](Pokus *pokus){ pokus->run(); });
82-
m.def("pokus", [](py::object o){
83-
py::cast<std::shared_ptr<Pokus>>(o())->run();
84-
});
8535
hostNode
8636
.def(py::init<>())
8737
.def("run", &HostNode::run)
8838
;
89-
90-
m.def("testHost", [](py::object o){
91-
92-
py::cast<std::shared_ptr<HostNode>>(o())->run();
93-
//return py::module_::import("builtins").attr("issubclass")(o, hostNode);
94-
//return py::cast<std::string>(o.attr("__base__").attr("__name__")) == "HostNode";
95-
});
96-
/*
97-
// Properties
98-
scriptProperties
99-
.def_readwrite("scriptUri", &ScriptProperties::scriptUri, DOC(dai, ScriptProperties, scriptUri))
100-
.def_readwrite("scriptName", &ScriptProperties::scriptName, DOC(dai, ScriptProperties, scriptName))
101-
.def_readwrite("processor", &ScriptProperties::processor, DOC(dai, ScriptProperties, processor))
102-
;
103-
104-
// Node
105-
script
106-
.def_readonly("inputs", &Script::inputs)
107-
.def_readonly("outputs", &Script::outputs)
108-
.def("setScriptPath", &Script::setScriptPath, DOC(dai, node, Script, setScriptPath))
109-
.def("setScript", py::overload_cast<const std::string&, const std::string&>(&Script::setScript), py::arg("script"), py::arg("name") = "", DOC(dai, node, Script, setScript))
110-
.def("setScript", py::overload_cast<const std::vector<std::uint8_t>&, const std::string&>(&Script::setScript), py::arg("data"), py::arg("name") = "", DOC(dai, node, Script, setScript, 2))
111-
.def("setScriptPath", &Script::setScriptPath, py::arg("path"), py::arg("name") = "", DOC(dai, node, Script, setScriptPath))
112-
.def("getScriptName", &Script::getScriptName, DOC(dai, node, Script, getScriptName))
113-
.def("setProcessor", &Script::setProcessor, DOC(dai, node, Script, setProcessor))
114-
.def("getProcessor", &Script::getProcessor, DOC(dai, node, Script, getProcessor))
115-
;
116-
daiNodeModule.attr("Script").attr("Properties") = scriptProperties;
117-
*/
11839
}

0 commit comments

Comments
 (0)