Skip to content

Commit 5bfc7bc

Browse files
authored
ZED SDK 2.3 features #52
- mem leak fix struct - add function getDeviceList with associated struct and enum
2 parents 9418355 + 0c8ba46 commit 5bfc7bc

File tree

5 files changed

+133
-14
lines changed

5 files changed

+133
-14
lines changed

pyzed/camera.pxd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from libcpp cimport bool
2424
from libcpp.pair cimport pair
25+
from libcpp.vector cimport vector
2526

2627
cimport pyzed.defines as defines
2728
cimport pyzed.core as core
@@ -239,6 +240,9 @@ cdef extern from 'sl/Camera.hpp' namespace 'sl':
239240
@staticmethod
240241
types.ERROR_CODE sticktoCPUCore(int cpu_core)
241242

243+
@staticmethod
244+
vector[types.DeviceProperties] getDeviceList()
245+
242246
bool saveDepthAs(Camera &zed, defines.DEPTH_FORMAT format, types.String name, float factor)
243247
bool savePointCloudAs(Camera &zed, defines.POINT_CLOUD_FORMAT format, types.String name,
244248
bool with_color)

pyzed/camera.pyx

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ cdef class PyInitParameters:
7676
else:
7777
raise TypeError("Argument is not of right type.")
7878

79+
def __dealloc__(self):
80+
del self.init
81+
7982
def save(self, str filename):
8083
filename_save = filename.encode()
8184
return self.init.save(types.String(<char*> filename_save))
@@ -255,6 +258,9 @@ cdef class PyRuntimeParameters:
255258
else:
256259
raise TypeError()
257260

261+
def __dealloc__(self):
262+
del self.runtime
263+
258264
def save(self, str filename):
259265
filename_save = filename.encode()
260266
return self.runtime.save(types.String(<char*> filename_save))
@@ -301,6 +307,9 @@ cdef class PyTrackingParameters:
301307
self.tracking = new TrackingParameters(init_pos.transform, _enable_memory, types.String())
302308
else:
303309
raise TypeError("Argument init_pos must be initialized first with PyTransform().")
310+
311+
def __dealloc__(self):
312+
del self.tracking
304313

305314
def save(self, str filename):
306315
filename_save = filename.encode()
@@ -350,6 +359,9 @@ cdef class PySpatialMappingParameters:
350359
else:
351360
raise TypeError()
352361

362+
def __dealloc__(self):
363+
del self.spatial
364+
353365
def set_resolution(self, resolution=PyRESOLUTION.PyRESOLUTION_HIGH):
354366
if isinstance(resolution, PyRESOLUTION):
355367
self.spatial.set(<MAPPING_RESOLUTION> resolution.value)
@@ -701,7 +713,6 @@ cdef class PyZEDCamera:
701713
filename = area_file_path.encode()
702714
self.camera.disableTracking(types.String(<char*> filename))
703715

704-
705716
def reset_tracking(self, core.PyTransform path):
706717
return types.PyERROR_CODE(self.camera.resetTracking(path.transform))
707718

@@ -750,15 +761,27 @@ cdef class PyZEDCamera:
750761
def disable_recording(self):
751762
self.camera.disableRecording()
752763

753-
def get_sdk_version(self):
754-
return self.camera.getSDKVersion().get().decode()
764+
def get_sdk_version(cls):
765+
return cls.camera.getSDKVersion().get().decode()
755766

756-
def is_zed_connected(self):
757-
return self.camera.isZEDconnected()
767+
def is_zed_connected(cls):
768+
return cls.camera.isZEDconnected()
758769

759-
def stickto_cpu_core(self, int cpu_core):
760-
return types.PyERROR_CODE(self.camera.sticktoCPUCore(cpu_core))
770+
def stickto_cpu_core(cls, int cpu_core):
771+
return types.PyERROR_CODE(cls.camera.sticktoCPUCore(cpu_core))
761772

773+
def get_device_list(cls):
774+
vect_ = cls.camera.getDeviceList()
775+
vect_python = []
776+
for i in range(vect_.size()):
777+
prop = types.PyDeviceProperties()
778+
prop.camera_state = vect_[i].camera_state
779+
prop.id = vect_[i].id
780+
prop.path = vect_[i].path.get().decode()
781+
prop.camera_model = vect_[i].camera_model
782+
prop.serial_number = vect_[i].serial_number
783+
vect_python.append(prop)
784+
return vect_python
762785

763786
def save_camera_depth_as(PyZEDCamera zed, format, str name, factor=1):
764787
if isinstance(format, defines.PyDEPTH_FORMAT) and factor <= 65536:
@@ -767,7 +790,6 @@ def save_camera_depth_as(PyZEDCamera zed, format, str name, factor=1):
767790
else:
768791
raise TypeError("Arguments must be of PyDEPTH_FORMAT type and factor not over 65536.")
769792

770-
771793
def save_camera_point_cloud_as(PyZEDCamera zed, format, str name, with_color=False):
772794
if isinstance(format, defines.PyPOINT_CLOUD_FORMAT):
773795
name_save = name.encode()

pyzed/mesh.pyx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ cdef class PyMeshFilterParameters:
5252
def __cinit__(self):
5353
self.meshFilter = new MeshFilterParameters(MESH_FILTER_LOW)
5454

55+
def __dealloc__(self):
56+
del self.meshFilter
57+
5558
def set(self, filter=PyFILTER.PyFILTER_LOW):
5659
if isinstance(filter, PyFILTER):
5760
self.meshFilter.set(filter.value)
@@ -147,6 +150,9 @@ cdef class PyChunk:
147150
cdef class PyMesh:
148151
def __cinit__(self):
149152
self.mesh = new Mesh()
153+
154+
def __dealloc__(self):
155+
del self.mesh
150156

151157
@property
152158
def chunks(self):

pyzed/types.pxd

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ cdef extern from "sl/types.hpp" namespace "sl":
6060
ERROR_CODE_NO_GPU_DETECTED,
6161
ERROR_CODE_LAST
6262

63-
String errorCode2str(ERROR_CODE err)
63+
String toString(ERROR_CODE o)
6464

6565
void sleep_ms(int time)
6666

@@ -70,16 +70,32 @@ cdef extern from "sl/types.hpp" namespace "sl":
7070
MODEL_LAST
7171

7272
String model2str(MODEL model)
73+
String toString(MODEL o)
7374

74-
cdef cppclass String 'sl::String':
75+
ctypedef enum CAMERA_STATE:
76+
CAMERA_STATE_AVAILABLE,
77+
CAMERA_STATE_NOT_AVAILABLE,
78+
CAMERA_STATE_LAST
79+
80+
String toString(CAMERA_STATE o)
7581

82+
cdef cppclass String 'sl::String':
7683
String()
7784
String(const char *data)
7885
void set(const char *data)
7986
const char *get() const
8087
bool empty() const
8188
string std_str() const
8289

90+
cdef cppclass DeviceProperties:
91+
DeviceProperties()
92+
CAMERA_STATE camera_state
93+
int id
94+
String path
95+
MODEL camera_model
96+
unsigned int serial_number
97+
98+
String toString(DeviceProperties o)
8399

84100
cdef cppclass Vector2[T]:
85101
int size()

pyzed/types.pyx

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,97 @@ class PyERROR_CODE(enum.Enum):
5757
PyERROR_CODE_LAST = ERROR_CODE_LAST
5858

5959
def __str__(self):
60-
return to_str(errorCode2str(self.value)).decode()
60+
return to_str(toString(<ERROR_CODE>self.value)).decode()
6161

6262
def __repr__(self):
63-
return to_str(errorCode2str(self.value)).decode()
63+
return to_str(toString(<ERROR_CODE>self.value)).decode()
6464

6565
class PyMODEL(enum.Enum):
6666
PyMODEL_ZED = MODEL_ZED
6767
PyMODEL_ZED_M = MODEL_ZED_M
6868
PyMODEL_LAST = MODEL_LAST
6969

7070
def __str__(self):
71-
return to_str(model2str(self.value)).decode()
71+
return to_str(toString(<MODEL>self.value)).decode()
7272

7373
def __repr__(self):
74-
return to_str(model2str(self.value)).decode()
74+
return to_str(toString(<MODEL>self.value)).decode()
7575

76+
class PyCAMERA_STATE(enum.Enum):
77+
PyCAMERA_STATE_AVAILABLE = CAMERA_STATE_AVAILABLE
78+
PyCAMERA_STATE_NOT_AVAILABLE = CAMERA_STATE_NOT_AVAILABLE
79+
PyCAMERA_STATE_LAST = CAMERA_STATE_LAST
80+
81+
def __str__(self):
82+
return to_str(toString(<CAMERA_STATE>self.value)).decode()
83+
84+
def __repr__(self):
85+
return to_str(toString(<CAMERA_STATE>self.value)).decode()
7686

7787
def c_sleep_ms(int time):
7888
sleep_ms(time)
7989

90+
cdef class PyDeviceProperties:
91+
cdef DeviceProperties c_device_properties
92+
93+
def __cinit__(self):
94+
self.c_device_properties = DeviceProperties()
95+
96+
@property
97+
def camera_state(self):
98+
return self.c_device_properties.camera_state
99+
@camera_state.setter
100+
def camera_state(self, camera_state):
101+
if isinstance(camera_state, PyCAMERA_STATE):
102+
self.c_device_properties.camera_state = (<CAMERA_STATE> camera_state.value)
103+
elif isinstance(camera_state, int):
104+
self.c_device_properties.camera_state = (<CAMERA_STATE> camera_state)
105+
else:
106+
raise TypeError("Argument is not of PyCAMERA_STATE type.")
107+
108+
@property
109+
def id(self):
110+
return self.c_device_properties.id
111+
@id.setter
112+
def id(self, id):
113+
self.c_device_properties.id = id
114+
115+
@property
116+
def path(self):
117+
if not self.c_device_properties.path.empty():
118+
return self.c_device_properties.path.get().decode()
119+
else:
120+
return ""
121+
@path.setter
122+
def path(self, str path):
123+
path_ = path.encode()
124+
self.c_device_properties.path = (String(<char*> path_))
125+
126+
@property
127+
def camera_model(self):
128+
return self.c_device_properties.camera_model
129+
@camera_model.setter
130+
def camera_model(self, camera_model):
131+
if isinstance(camera_model, PyMODEL):
132+
self.c_device_properties.camera_model = (<MODEL> camera_model.value)
133+
elif isinstance(camera_model, int):
134+
self.c_device_properties.camera_model = (<MODEL> camera_model)
135+
else:
136+
raise TypeError("Argument is not of PyMODEL type.")
137+
138+
@property
139+
def serial_number(self):
140+
return self.c_device_properties.serial_number
141+
@serial_number.setter
142+
def serial_number(self, serial_number):
143+
self.c_device_properties.serial_number = serial_number
144+
145+
def __str__(self):
146+
return to_str(toString(self.c_device_properties)).decode()
147+
148+
def __repr__(self):
149+
return to_str(toString(self.c_device_properties)).decode()
150+
80151

81152
cdef class PyMatrix3f:
82153
def __cinit__(self):

0 commit comments

Comments
 (0)