Skip to content

Commit deb044c

Browse files
committed
Merge branch 'network_user_bootloader' into develop
2 parents 9935070 + 9c1babb commit deb044c

File tree

10 files changed

+101
-14
lines changed

10 files changed

+101
-14
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ pybind11_add_module(${TARGET_NAME}
100100
src/pipeline/AssetManagerBindings.cpp
101101
src/openvino/OpenVINOBindings.cpp
102102
src/log/LogBindings.cpp
103+
src/VersionBindings.cpp
103104

104105
src/pipeline/node/NodeBindings.cpp
105106

examples/ColorCamera/rgb_preview.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
print('Connected cameras: ', device.getConnectedCameras())
2727
# Print out usb speed
2828
print('Usb speed: ', device.getUsbSpeed().name)
29+
# Bootloader version
30+
if device.getBootloaderVersion() is not None:
31+
print('Bootloader version: ', device.getBootloaderVersion())
2932

3033
# Output queue will be used to get the rgb frames from the output defined above
3134
qRgb = device.getOutputQueue(name="rgb", maxSize=4, blocking=False)

examples/bootloader/bootloader_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
print("USB Bootloader - supports only Flash memory")
1515
supportedMemTypes = [dai.DeviceBootloader.Memory.FLASH];
1616
else:
17-
print("NETWORK Bootloader")
17+
print(f"NETWORK Bootloader, is User Bootloader: {bl.isUserBootloader()}")
1818

1919
try:
2020
for mem in supportedMemTypes:
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python3
2+
3+
import depthai as dai
4+
import sys
5+
import time
6+
7+
deviceInfos = dai.DeviceBootloader.getAllAvailableDevices()
8+
if len(deviceInfos) == 0:
9+
print("No device found to flash. Exiting.")
10+
exit(-1)
11+
else:
12+
for i, di in enumerate(deviceInfos):
13+
print(f'[{i}] {di.getMxId()} [{di.protocol.name}]', end='')
14+
if di.state == dai.XLinkDeviceState.X_LINK_BOOTLOADER:
15+
with dai.DeviceBootloader(di) as bl:
16+
print(f' current bootloader: {bl.getVersion()}', end='')
17+
print()
18+
selected = input(f'Which DepthAI device to flash User Bootloader for (Note: Only NETWORK supported) [0..{len(deviceInfos)-1}]: ')
19+
info = deviceInfos[int(selected)]
20+
21+
# Open DeviceBootloader and allow flashing bootloader
22+
with dai.DeviceBootloader(info) as bl:
23+
print("User Bootloader version to flash:", bl.getVersion())
24+
25+
# Create a progress callback lambda
26+
progress = lambda p : print(f'Flashing progress: {p*100:.1f}%')
27+
28+
print(f"Flashing User Bootloader...")
29+
startTime = time.monotonic()
30+
(res, message) = bl.flashUserBootloader(progress)
31+
if res:
32+
print("Flashing successful. Took", time.monotonic() - startTime, "seconds")
33+
else:
34+
print("Flashing failed:", message)

src/DeviceBindings.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,16 @@ static void bindConstructors(ARG& arg){
279279
py::gil_scoped_release release;
280280
return std::make_unique<D>(config, deviceInfo);
281281
}), py::arg("config"), py::arg("deviceInfo"), DOC(dai, DeviceBase, DeviceBase, 19))
282+
283+
// DeviceInfo version
284+
.def(py::init([](const DeviceInfo& deviceInfo){
285+
py::gil_scoped_release release;
286+
return std::make_unique<D>(deviceInfo);
287+
}), py::arg("deviceInfo"), DOC(dai, DeviceBase, DeviceBase, 20))
288+
.def(py::init([](const DeviceInfo& deviceInfo, UsbSpeed maxUsbSpeed){
289+
py::gil_scoped_release release;
290+
return std::make_unique<D>(deviceInfo, maxUsbSpeed);
291+
}), py::arg("deviceInfo"), py::arg("maxUsbSpeed"), DOC(dai, DeviceBase, DeviceBase, 21))
282292
;
283293

284294
}
@@ -459,6 +469,7 @@ void DeviceBindings::bind(pybind11::module& m, void* pCallstack){
459469
.def_static("getDeviceByMxId", &DeviceBase::getDeviceByMxId, py::arg("mxId"), DOC(dai, DeviceBase, getDeviceByMxId))
460470

461471
// methods
472+
.def("getBootloaderVersion", &DeviceBase::getBootloaderVersion, DOC(dai, DeviceBase, getBootloaderVersion))
462473
.def("isPipelineRunning", [](DeviceBase& d) { py::gil_scoped_release release; return d.isPipelineRunning(); }, DOC(dai, DeviceBase, isPipelineRunning))
463474
.def("startPipeline", [](DeviceBase& d){
464475
// Issue an deprecation warning

src/DeviceBootloaderBindings.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ void DeviceBootloaderBindings::bind(pybind11::module& m, void* pCallstack){
99

1010
// Type definitions
1111
py::class_<DeviceBootloader> deviceBootloader(m, "DeviceBootloader", DOC(dai, DeviceBootloader));
12-
py::class_<DeviceBootloader::Version> deviceBootloaderVersion(deviceBootloader, "Version", DOC(dai, DeviceBootloader, Version));
1312
py::enum_<DeviceBootloader::Type> deviceBootloaderType(deviceBootloader, "Type");
1413
py::enum_<DeviceBootloader::Memory> deviceBootloaderMemory(deviceBootloader, "Memory");
1514
py::enum_<DeviceBootloader::Section> deviceBootloaderSection(deviceBootloader, "Section");
@@ -34,17 +33,6 @@ void DeviceBootloaderBindings::bind(pybind11::module& m, void* pCallstack){
3433

3534

3635
// Bind DeviceBootloader
37-
deviceBootloaderVersion
38-
.def(py::init<const std::string&>(), py::arg("v"), DOC(dai, DeviceBootloader, Version, Version))
39-
.def(py::init<unsigned, unsigned, unsigned>(), py::arg("major"), py::arg("minor"), py::arg("patch"), DOC(dai, DeviceBootloader, Version, Version, 2))
40-
.def("__str__", &DeviceBootloader::Version::toString)
41-
.def("__eq__", &DeviceBootloader::Version::operator==)
42-
.def("__lt__", &DeviceBootloader::Version::operator<)
43-
.def("__gt__", &DeviceBootloader::Version::operator>)
44-
.def("toStringSemver", &DeviceBootloader::Version::toStringSemver)
45-
.def("getBuildInfo", &DeviceBootloader::Version::getBuildInfo)
46-
;
47-
4836
deviceBootloaderType
4937
.value("AUTO", DeviceBootloader::Type::AUTO)
5038
.value("USB", DeviceBootloader::Type::USB)
@@ -150,11 +138,13 @@ void DeviceBootloaderBindings::bind(pybind11::module& m, void* pCallstack){
150138

151139
.def("readApplicationInfo", [](DeviceBootloader& db, DeviceBootloader::Memory mem) { py::gil_scoped_release release; return db.readApplicationInfo(mem); }, py::arg("memory"), DOC(dai, DeviceBootloader, readApplicationInfo))
152140
.def("getMemoryInfo", [](DeviceBootloader& db, DeviceBootloader::Memory memory) { py::gil_scoped_release release; return db.getMemoryInfo(memory); }, DOC(dai, DeviceBootloader, getMemoryInfo))
141+
.def("isUserBootloader", [](DeviceBootloader& db) { py::gil_scoped_release release; return db.isUserBootloader(); }, DOC(dai, DeviceBootloader, isUserBootloader))
153142

154143
.def("flashDepthaiApplicationPackage", [](DeviceBootloader& db, std::function<void(float)> progressCallback, std::vector<uint8_t> package, DeviceBootloader::Memory memory) { py::gil_scoped_release release; return db.flashDepthaiApplicationPackage(progressCallback, package); }, py::arg("progressCallback"), py::arg("package"), py::arg("memory") = DeviceBootloader::Memory::AUTO, DOC(dai, DeviceBootloader, flashDepthaiApplicationPackage))
155144
.def("flashDepthaiApplicationPackage", [](DeviceBootloader& db, std::vector<uint8_t> package, DeviceBootloader::Memory memory) { py::gil_scoped_release release; return db.flashDepthaiApplicationPackage(package); }, py::arg("package"), py::arg("memory") = DeviceBootloader::Memory::AUTO, DOC(dai, DeviceBootloader, flashDepthaiApplicationPackage, 2))
156145
.def("flashBootloader", [](DeviceBootloader& db, std::function<void(float)> progressCallback, const Path& path) { py::gil_scoped_release release; return db.flashBootloader(progressCallback, path); }, py::arg("progressCallback"), py::arg("path") = "", DOC(dai, DeviceBootloader, flashBootloader))
157146
.def("flashBootloader", [](DeviceBootloader& db, DeviceBootloader::Memory memory, DeviceBootloader::Type type, std::function<void(float)> progressCallback, dai::Path path) { py::gil_scoped_release release; return db.flashBootloader(memory, type, progressCallback, path); }, py::arg("memory"), py::arg("type"), py::arg("progressCallback"), py::arg("path") = "", DOC(dai, DeviceBootloader, flashBootloader, 2))
147+
.def("flashUserBootloader", [](DeviceBootloader& db, std::function<void(float)> progressCallback, const Path& path) { py::gil_scoped_release release; return db.flashUserBootloader(progressCallback, path); }, py::arg("progressCallback"), py::arg("path") = "", DOC(dai, DeviceBootloader, flashUserBootloader))
158148

159149
.def("readConfigData", [](DeviceBootloader& db, DeviceBootloader::Memory memory, DeviceBootloader::Type type) { py::gil_scoped_release release; return db.readConfigData(memory, type); }, py::arg("memory") = DeviceBootloader::Memory::AUTO, py::arg("type") = DeviceBootloader::Type::AUTO, DOC(dai, DeviceBootloader, readConfigData))
160150
.def("flashConfigData", [](DeviceBootloader& db, nlohmann::json configData, DeviceBootloader::Memory memory, DeviceBootloader::Type type) { py::gil_scoped_release release; return db.flashConfigData(configData, memory, type); }, py::arg("configData"), py::arg("memory") = DeviceBootloader::Memory::AUTO, py::arg("type") = DeviceBootloader::Type::AUTO, DOC(dai, DeviceBootloader, flashConfigData))

src/VersionBindings.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "VersionBindings.hpp"
2+
3+
// depthai
4+
#include "depthai/device/Version.hpp"
5+
6+
void VersionBindings::bind(pybind11::module& m, void* pCallstack){
7+
8+
using namespace dai;
9+
10+
// Type definitions
11+
py::class_<Version> version(m, "Version", DOC(dai, Version));
12+
13+
///////////////////////////////////////////////////////////////////////
14+
///////////////////////////////////////////////////////////////////////
15+
///////////////////////////////////////////////////////////////////////
16+
// Call the rest of the type defines, then perform the actual bindings
17+
Callstack* callstack = (Callstack*) pCallstack;
18+
auto cb = callstack->top();
19+
callstack->pop();
20+
cb(m, pCallstack);
21+
///////////////////////////////////////////////////////////////////////
22+
///////////////////////////////////////////////////////////////////////
23+
///////////////////////////////////////////////////////////////////////
24+
25+
// Bind DeviceBootloader
26+
version
27+
.def(py::init<const std::string&>(), py::arg("v"), DOC(dai, Version, Version))
28+
.def(py::init<unsigned, unsigned, unsigned>(), py::arg("major"), py::arg("minor"), py::arg("patch"), DOC(dai, Version, Version, 2))
29+
.def("__str__", &Version::toString, DOC(dai, Version, toString))
30+
.def("__eq__", &Version::operator==)
31+
.def("__lt__", &Version::operator<)
32+
.def("__gt__", &Version::operator>)
33+
.def("toStringSemver", &Version::toStringSemver, DOC(dai, Version, toStringSemver))
34+
.def("getBuildInfo", &Version::getBuildInfo, DOC(dai, Version, getBuildInfo))
35+
.def("getSemver", &Version::getSemver, DOC(dai, Version, getSemver))
36+
;
37+
38+
}

src/VersionBindings.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#pragma once
2+
3+
// pybind
4+
#include "pybind11_common.hpp"
5+
6+
struct VersionBindings {
7+
static void bind(pybind11::module& m, void* pCallstack);
8+
};

src/py_bindings.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "DataQueueBindings.hpp"
2828
#include "openvino/OpenVINOBindings.hpp"
2929
#include "log/LogBindings.hpp"
30+
#include "VersionBindings.hpp"
3031

3132
PYBIND11_MODULE(depthai, m)
3233
{
@@ -43,6 +44,7 @@ PYBIND11_MODULE(depthai, m)
4344
std::deque<StackFunction> callstack;
4445
DatatypeBindings::addToCallstack(callstack);
4546
callstack.push_front(&LogBindings::bind);
47+
callstack.push_front(&VersionBindings::bind);
4648
callstack.push_front(&DataQueueBindings::bind);
4749
callstack.push_front(&OpenVINOBindings::bind);
4850
NodeBindings::addToCallstack(callstack);

0 commit comments

Comments
 (0)