Apollo 11.0
自动驾驶开放平台
py_cyber.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include <string>
20#include <vector>
21
22#include <Python.h>
23
32
33#define PyInt_AsLong PyLong_AsLong
34#define PyInt_FromLong PyLong_FromLong
35#define PYOBJECT_NULL_STRING PyBytes_FromStringAndSize("", 0)
36#define C_STR_TO_PY_BYTES(cstr) \
37 PyBytes_FromStringAndSize(cstr.c_str(), cstr.size())
38
39google::protobuf::Message *PyChannelUtils::raw_msg_class_ = nullptr;
40
41static PyObject *cyber_py_init(PyObject *self, PyObject *args) {
42 char *data = nullptr;
43 Py_ssize_t len = 0;
44 if (!PyArg_ParseTuple(args, const_cast<char *>("s#:cyber_py_init"), &data,
45 &len)) {
46 AERROR << "cyber_py_init:PyArg_ParseTuple failed!";
47 Py_RETURN_FALSE;
48 }
49 std::string module_name(data, len);
50 bool is_init = apollo::cyber::py_init(module_name);
51 if (is_init) {
52 Py_RETURN_TRUE;
53 } else {
54 Py_RETURN_FALSE;
55 }
56}
57
58static PyObject *cyber_py_ok(PyObject *self, PyObject *args) {
59 bool is_ok = apollo::cyber::py_ok();
60 if (is_ok) {
61 Py_RETURN_TRUE;
62 } else {
63 Py_RETURN_FALSE;
64 }
65}
66
67static PyObject *cyber_py_shutdown(PyObject *self, PyObject *args) {
69 Py_INCREF(Py_None);
70 return Py_None;
71}
72
73static PyObject *cyber_py_is_shutdown(PyObject *self, PyObject *args) {
74 bool is_shutdown = apollo::cyber::py_is_shutdown();
75 if (is_shutdown) {
76 Py_RETURN_TRUE;
77 } else {
78 Py_RETURN_FALSE;
79 }
80}
81
82static PyObject *cyber_py_waitforshutdown(PyObject *self, PyObject *args) {
84 Py_INCREF(Py_None);
85 return Py_None;
86}
87
88template <typename T>
89T PyObjectToPtr(PyObject *pyobj, const std::string &type_ptr) {
90 T obj_ptr = (T)PyCapsule_GetPointer(pyobj, type_ptr.c_str());
91 if (obj_ptr == nullptr) {
92 AERROR << "PyObjectToPtr failed,type->" << type_ptr << "pyobj: " << pyobj;
93 }
94 return obj_ptr;
95}
96
97PyObject *cyber_new_PyWriter(PyObject *self, PyObject *args) {
98 char *channel_name = nullptr;
99 char *data_type = nullptr;
100 uint32_t qos_depth = 1;
101
102 PyObject *node_pyobj = nullptr;
103 if (!PyArg_ParseTuple(args, const_cast<char *>("ssIO:new_PyWriter"),
104 &channel_name, &data_type, &qos_depth, &node_pyobj)) {
105 Py_INCREF(Py_None);
106 return Py_None;
107 }
108
109 Node *node = reinterpret_cast<Node *>(
110 PyCapsule_GetPointer(node_pyobj, "apollo_cyber_pynode"));
111 if (nullptr == node) {
112 AERROR << "node is null";
113 Py_INCREF(Py_None);
114 return Py_None;
115 }
116
117 PyWriter *writer =
118 new PyWriter((std::string const &)*channel_name,
119 (std::string const &)*data_type, qos_depth, node);
120 PyObject *pyobj_writer =
121 PyCapsule_New(writer, "apollo_cyber_pywriter", nullptr);
122 return pyobj_writer;
123}
124
125PyObject *cyber_delete_PyWriter(PyObject *self, PyObject *args) {
126 PyObject *writer_py = nullptr;
127 if (!PyArg_ParseTuple(args, const_cast<char *>("O:delete_PyWriter"),
128 &writer_py)) {
129 Py_INCREF(Py_None);
130 return Py_None;
131 }
132
133 PyWriter *writer = reinterpret_cast<PyWriter *>(
134 PyCapsule_GetPointer(writer_py, "apollo_cyber_pywriter"));
135 delete writer;
136 Py_INCREF(Py_None);
137 return Py_None;
138}
139
140PyObject *cyber_PyWriter_write(PyObject *self, PyObject *args) {
141 PyObject *pyobj_writer = nullptr;
142 char *data = nullptr;
143 Py_ssize_t len = 0;
144 if (!PyArg_ParseTuple(args, const_cast<char *>("Os#:cyber_PyWriter_write"),
145 &pyobj_writer, &data, &len)) {
146 AERROR << "cyber_PyWriter_write:cyber_PyWriter_write failed!";
147 return PyInt_FromLong(1);
148 }
149
150 PyWriter *writer =
151 PyObjectToPtr<PyWriter *>(pyobj_writer, "apollo_cyber_pywriter");
152
153 if (nullptr == writer) {
154 AERROR << "cyber_PyWriter_write:writer ptr is null!";
155 return PyInt_FromLong(1);
156 }
157
158 std::string data_str(data, len);
159 int ret = writer->write(data_str);
160 return PyInt_FromLong(ret);
161}
162
163PyObject *cyber_new_PyReader(PyObject *self, PyObject *args) {
164 char *channel_name = nullptr;
165 char *data_type = nullptr;
166 PyObject *node_pyobj = nullptr;
167 if (!PyArg_ParseTuple(args, const_cast<char *>("ssO:new_PyReader"),
168 &channel_name, &data_type, &node_pyobj)) {
169 Py_INCREF(Py_None);
170 return Py_None;
171 }
172
173 Node *node = reinterpret_cast<Node *>(
174 PyCapsule_GetPointer(node_pyobj, "apollo_cyber_pynode"));
175 if (!node) {
176 AERROR << "node is null";
177 Py_INCREF(Py_None);
178 return Py_None;
179 }
180
181 PyReader *reader = new PyReader((std::string const &)*channel_name,
182 (std::string const &)*data_type, node);
183 PyObject *pyobj_reader =
184 PyCapsule_New(reader, "apollo_cyber_pyreader", nullptr);
185 return pyobj_reader;
186}
187
188PyObject *cyber_delete_PyReader(PyObject *self, PyObject *args) {
189 PyObject *reader_py = nullptr;
190 if (!PyArg_ParseTuple(args, const_cast<char *>("O:delete_PyReader"),
191 &reader_py)) {
192 Py_INCREF(Py_None);
193 return Py_None;
194 }
195
196 PyReader *reader = reinterpret_cast<PyReader *>(
197 PyCapsule_GetPointer(reader_py, "apollo_cyber_pyreader"));
198 delete reader;
199 Py_INCREF(Py_None);
200 return Py_None;
201}
202
203PyObject *cyber_PyReader_read(PyObject *self, PyObject *args) {
204 PyObject *pyobj_reader = nullptr;
205 PyObject *pyobj_iswait = nullptr;
206
207 if (!PyArg_ParseTuple(args, const_cast<char *>("OO:cyber_PyReader_read"),
208 &pyobj_reader, &pyobj_iswait)) {
209 AERROR << "cyber_PyReader_read:PyArg_ParseTuple failed!";
210 Py_INCREF(Py_None);
211 return Py_None;
212 }
213 PyReader *reader =
214 PyObjectToPtr<PyReader *>(pyobj_reader, "apollo_cyber_pyreader");
215 if (nullptr == reader) {
216 AERROR << "cyber_PyReader_read:PyReader ptr is null!";
217 Py_INCREF(Py_None);
218 return Py_None;
219 }
220
221 int r = PyObject_IsTrue(pyobj_iswait);
222 if (r == -1) {
223 AERROR << "cyber_PyReader_read:pyobj_iswait is error!";
224 Py_INCREF(Py_None);
225 return Py_None;
226 }
227
228 bool wait = (r == 1);
229
230 const std::string reader_ret = reader->read(wait);
231 return C_STR_TO_PY_BYTES(reader_ret);
232}
233
234PyObject *cyber_PyReader_register_func(PyObject *self, PyObject *args) {
235 PyObject *pyobj_regist_fun = nullptr;
236 PyObject *pyobj_reader = nullptr;
237
238 int (*callback_fun)(char const *) = (int (*)(char const *))0;
239
240 if (!PyArg_ParseTuple(args, const_cast<char *>("OO:PyReader_register_func"),
241 &pyobj_reader, &pyobj_regist_fun)) {
242 Py_INCREF(Py_None);
243 return Py_None;
244 }
245
246 PyReader *reader =
247 PyObjectToPtr<PyReader *>(pyobj_reader, "apollo_cyber_pyreader");
248 callback_fun = (int (*)(const char *i))PyInt_AsLong(pyobj_regist_fun);
249 if (reader) {
250 AINFO << "reader regist fun";
251 reader->register_func(callback_fun);
252 }
253
254 Py_INCREF(Py_None);
255 return Py_None;
256}
257
258PyObject *cyber_new_PyClient(PyObject *self, PyObject *args) {
259 char *channel_name = nullptr;
260 char *data_type = nullptr;
261 PyObject *node_pyobj = nullptr;
262 if (!PyArg_ParseTuple(args, const_cast<char *>("ssO:new_PyClient"),
263 &channel_name, &data_type, &node_pyobj)) {
264 Py_INCREF(Py_None);
265 return Py_None;
266 }
267
268 Node *node = reinterpret_cast<Node *>(
269 PyCapsule_GetPointer(node_pyobj, "apollo_cyber_pynode"));
270 if (!node) {
271 AERROR << "node is null";
272 Py_INCREF(Py_None);
273 return Py_None;
274 }
275
276 PyClient *client = new PyClient((std::string const &)*channel_name,
277 (std::string const &)*data_type, node);
278 PyObject *pyobj_client =
279 PyCapsule_New(client, "apollo_cyber_pyclient", nullptr);
280 return pyobj_client;
281}
282
283PyObject *cyber_delete_PyClient(PyObject *self, PyObject *args) {
284 PyObject *client_py = nullptr;
285 if (!PyArg_ParseTuple(args, const_cast<char *>("O:delete_PyClient"),
286 &client_py)) {
287 Py_INCREF(Py_None);
288 return Py_None;
289 }
290
291 PyClient *client = reinterpret_cast<PyClient *>(
292 PyCapsule_GetPointer(client_py, "apollo_cyber_pyclient"));
293 delete client;
294 Py_INCREF(Py_None);
295 return Py_None;
296}
297
298PyObject *cyber_PyClient_send_request(PyObject *self, PyObject *args) {
299 PyObject *pyobj_client = nullptr;
300 char *data = nullptr;
301 Py_ssize_t len = 0;
302 if (!PyArg_ParseTuple(args, const_cast<char *>("Os#:PyClient_send_request"),
303 &pyobj_client, &data, &len)) {
304 AERROR << "cyber_PyClient_send_request:PyArg_ParseTuple failed!";
306 }
307
308 PyClient *client =
309 PyObjectToPtr<PyClient *>(pyobj_client, "apollo_cyber_pyclient");
310
311 if (nullptr == client) {
312 AERROR << "cyber_PyClient_send_request:client ptr is null!";
314 }
315
316 std::string data_str(data, len);
317 ADEBUG << "c++:PyClient_send_request data->[ " << data_str << "]";
318 const std::string response_str =
319 client->send_request((std::string const &)data_str);
320 ADEBUG << "c++:response data->[ " << response_str << "]";
321 return C_STR_TO_PY_BYTES(response_str);
322}
323
324PyObject *cyber_new_PyService(PyObject *self, PyObject *args) {
325 char *channel_name = nullptr;
326 char *data_type = nullptr;
327 PyObject *node_pyobj = nullptr;
328 if (!PyArg_ParseTuple(args, const_cast<char *>("ssO:new_PyService"),
329 &channel_name, &data_type, &node_pyobj)) {
330 Py_INCREF(Py_None);
331 return Py_None;
332 }
333
334 Node *node = reinterpret_cast<Node *>(
335 PyCapsule_GetPointer(node_pyobj, "apollo_cyber_pynode"));
336 if (!node) {
337 AERROR << "node is null";
338 Py_INCREF(Py_None);
339 return Py_None;
340 }
341
342 PyService *service = new PyService((std::string const &)*channel_name,
343 (std::string const &)*data_type, node);
344 PyObject *pyobj_service =
345 PyCapsule_New(service, "apollo_cyber_pyservice", nullptr);
346 return pyobj_service;
347}
348
349PyObject *cyber_delete_PyService(PyObject *self, PyObject *args) {
350 PyObject *pyobj_service = nullptr;
351 if (!PyArg_ParseTuple(args, const_cast<char *>("O:delete_PyService"),
352 &pyobj_service)) {
353 Py_INCREF(Py_None);
354 return Py_None;
355 }
356
357 PyService *service = reinterpret_cast<PyService *>(
358 PyCapsule_GetPointer(pyobj_service, "apollo_cyber_pyservice"));
359 delete service;
360 Py_INCREF(Py_None);
361 return Py_None;
362}
363
364PyObject *cyber_PyService_register_func(PyObject *self, PyObject *args) {
365 PyObject *pyobj_regist_fun = nullptr;
366 PyObject *pyobj_service = nullptr;
367
368 int (*callback_fun)(char const *) = (int (*)(char const *))0;
369
370 if (!PyArg_ParseTuple(args, const_cast<char *>("OO:PyService_register_func"),
371 &pyobj_service, &pyobj_regist_fun)) {
372 Py_INCREF(Py_None);
373 return Py_None;
374 }
375
376 PyService *service =
377 PyObjectToPtr<PyService *>(pyobj_service, "apollo_cyber_pyservice");
378 callback_fun = (int (*)(const char *i))PyInt_AsLong(pyobj_regist_fun);
379 if (service) {
380 AINFO << "service regist fun";
381 service->register_func(callback_fun);
382 }
383
384 Py_INCREF(Py_None);
385 return Py_None;
386}
387
388PyObject *cyber_PyService_read(PyObject *self, PyObject *args) {
389 PyObject *pyobj_service = nullptr;
390 if (!PyArg_ParseTuple(args, const_cast<char *>("O:cyber_PyService_read"),
391 &pyobj_service)) {
392 AERROR << "cyber_PyService_read:PyArg_ParseTuple failed!";
394 }
395 PyService *service =
396 PyObjectToPtr<PyService *>(pyobj_service, "apollo_cyber_pyservice");
397 if (nullptr == service) {
398 AERROR << "cyber_PyService_read:service ptr is null!";
400 }
401
402 const std::string reader_ret = service->read();
403 ADEBUG << "c++:PyService_read -> " << reader_ret;
404 return C_STR_TO_PY_BYTES(reader_ret);
405}
406
407PyObject *cyber_PyService_write(PyObject *self, PyObject *args) {
408 PyObject *pyobj_service = nullptr;
409 char *data = nullptr;
410 Py_ssize_t len = 0;
411 if (!PyArg_ParseTuple(args, const_cast<char *>("Os#:cyber_PyService_write"),
412 &pyobj_service, &data, &len)) {
413 AERROR << "cyber_PyService_write:PyArg_ParseTuple failed!";
414 return PyInt_FromLong(1);
415 }
416
417 PyService *service =
418 PyObjectToPtr<PyService *>(pyobj_service, "apollo_cyber_pyservice");
419
420 if (nullptr == service) {
421 AERROR << "cyber_PyService_write:writer ptr is null!";
422 return PyInt_FromLong(1);
423 }
424
425 std::string data_str(data, len);
426 ADEBUG << "c++:PyService_write data->[ " << data_str << "]";
427 int ret = service->write((std::string const &)data_str);
428 return PyInt_FromLong(ret);
429}
430
431PyObject *cyber_new_PyNode(PyObject *self, PyObject *args) {
432 char *node_name = nullptr;
433 if (!PyArg_ParseTuple(args, const_cast<char *>("s:new_PyNode"), &node_name)) {
434 Py_INCREF(Py_None);
435 return Py_None;
436 }
437
438 PyNode *node = new PyNode((std::string const &)node_name);
439 PyObject *pyobj_node = PyCapsule_New(node, "apollo_cyber_pynode", nullptr);
440 return pyobj_node;
441}
442
443PyObject *cyber_delete_PyNode(PyObject *self, PyObject *args) {
444 PyObject *pyobj_node = nullptr;
445 if (!PyArg_ParseTuple(args, const_cast<char *>("O:delete_PyNode"),
446 &pyobj_node)) {
447 Py_INCREF(Py_None);
448 return Py_None;
449 }
450
451 PyNode *node = reinterpret_cast<PyNode *>(
452 PyCapsule_GetPointer(pyobj_node, "apollo_cyber_pynode"));
453 delete node;
454 Py_INCREF(Py_None);
455 return Py_None;
456}
457
458PyObject *cyber_PyNode_create_writer(PyObject *self, PyObject *args) {
459 PyObject *pyobj_node = nullptr;
460 char *channel_name = nullptr;
461 char *type_name = nullptr;
462 uint32_t qos_depth = 1;
463
464 if (!PyArg_ParseTuple(args, const_cast<char *>("OssI:PyNode_create_writer"),
465 &pyobj_node, &channel_name, &type_name, &qos_depth)) {
466 AERROR << "cyber_PyNode_create_writer:PyArg_ParseTuple failed!";
467 Py_INCREF(Py_None);
468 return Py_None;
469 }
470
471 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
472 if (nullptr == node) {
473 AERROR << "cyber_PyNode_create_writer:node ptr is null!";
474 Py_INCREF(Py_None);
475 return Py_None;
476 }
477
478 PyWriter *writer = reinterpret_cast<PyWriter *>(
479 (node->create_writer((std::string const &)channel_name,
480 (std::string const &)type_name, qos_depth)));
481
482 if (nullptr == writer) {
483 AERROR << "cyber_PyNode_create_writer:writer is null!";
484 Py_INCREF(Py_None);
485 return Py_None;
486 }
487 PyObject *pyobj_writer =
488 PyCapsule_New(writer, "apollo_cyber_pywriter", nullptr);
489 return pyobj_writer;
490}
491
492PyObject *cyber_PyNode_create_reader(PyObject *self, PyObject *args) {
493 char *channel_name = nullptr;
494 char *type_name = nullptr;
495 PyObject *pyobj_node = nullptr;
496
497 if (!PyArg_ParseTuple(args, const_cast<char *>("Oss:PyNode_create_reader"),
498 &pyobj_node, &channel_name, &type_name)) {
499 AERROR << "PyNode_create_reader:PyArg_ParseTuple failed!";
500 Py_INCREF(Py_None);
501 return Py_None;
502 }
503
504 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
505 if (nullptr == node) {
506 AERROR << "PyNode_create_reader:node ptr is null!";
507 Py_INCREF(Py_None);
508 return Py_None;
509 }
510
511 PyReader *reader = reinterpret_cast<PyReader *>((node->create_reader(
512 (std::string const &)channel_name, (std::string const &)type_name)));
513 ACHECK(reader) << "PyReader is NULL!";
514
515 PyObject *pyobj_reader =
516 PyCapsule_New(reader, "apollo_cyber_pyreader", nullptr);
517 return pyobj_reader;
518}
519
520PyObject *cyber_PyNode_create_client(PyObject *self, PyObject *args) {
521 char *channel_name = nullptr;
522 char *type_name = nullptr;
523 PyObject *pyobj_node = nullptr;
524
525 if (!PyArg_ParseTuple(args, const_cast<char *>("Oss:PyNode_create_client"),
526 &pyobj_node, &channel_name, &type_name)) {
527 AERROR << "PyNode_create_client:PyArg_ParseTuple failed!";
528 Py_INCREF(Py_None);
529 return Py_None;
530 }
531
532 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
533 if (nullptr == node) {
534 AERROR << "PyNode_create_client:node ptr is null!";
535 Py_INCREF(Py_None);
536 return Py_None;
537 }
538
539 PyClient *client = reinterpret_cast<PyClient *>((node->create_client(
540 (std::string const &)channel_name, (std::string const &)type_name)));
541 PyObject *pyobj_client =
542 PyCapsule_New(client, "apollo_cyber_pyclient", nullptr);
543
544 return pyobj_client;
545}
546
547PyObject *cyber_PyNode_create_service(PyObject *self, PyObject *args) {
548 char *channel_name = nullptr;
549 char *type_name = nullptr;
550 PyObject *pyobj_node = nullptr;
551
552 if (!PyArg_ParseTuple(args,
553 const_cast<char *>("Oss:cyber_PyNode_create_service"),
554 &pyobj_node, &channel_name, &type_name)) {
555 AERROR << "cyber_PyNode_create_service:PyArg_ParseTuple failed!";
556 Py_INCREF(Py_None);
557 return Py_None;
558 }
559
560 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
561 if (nullptr == node) {
562 AERROR << "cyber_PyNode_create_service:node ptr is null!";
563 Py_INCREF(Py_None);
564 return Py_None;
565 }
566
567 PyService *service = reinterpret_cast<PyService *>((node->create_service(
568 (std::string const &)channel_name, (std::string const &)type_name)));
569 PyObject *pyobj_service =
570 PyCapsule_New(service, "apollo_cyber_pyservice", nullptr);
571 return pyobj_service;
572}
573
574PyObject *cyber_PyNode_shutdown(PyObject *self, PyObject *args) {
575 PyObject *pyobj_node = nullptr;
576
577 if (!PyArg_ParseTuple(args, const_cast<char *>("O:PyNode_shutdown"),
578 &pyobj_node)) {
579 AERROR << "cyber_PyNode_shutdown:PyNode_shutdown failed!";
580 Py_INCREF(Py_None);
581 return Py_None;
582 }
583
584 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
585 if (nullptr == node) {
586 AERROR << "cyber_PyNode_shutdown:node ptr is null!";
587 Py_INCREF(Py_None);
588 return Py_None;
589 }
590 node->shutdown();
591 Py_INCREF(Py_None);
592 return Py_None;
593}
594
595PyObject *cyber_PyNode_register_message(PyObject *self, PyObject *args) {
596 PyObject *pyobj_node = nullptr;
597 char *desc = nullptr;
598 int len = 0;
599 if (!PyArg_ParseTuple(args,
600 const_cast<char *>("Os#:cyber_PyNode_register_message"),
601 &pyobj_node, &desc, &len)) {
602 AERROR << "cyber_PyNode_register_message: failed!";
603 Py_INCREF(Py_None);
604 return Py_None;
605 }
606 PyNode *node = PyObjectToPtr<PyNode *>(pyobj_node, "apollo_cyber_pynode");
607 if (nullptr == node) {
608 AERROR << "cyber_PyNode_register_message:node ptr is null! desc->" << desc;
609 Py_INCREF(Py_None);
610 return Py_None;
611 }
612 std::string desc_str(desc, len);
613 node->register_message((std::string const &)desc_str);
614 Py_INCREF(Py_None);
615 return Py_None;
616}
617
618PyObject *cyber_PyChannelUtils_get_msg_type(PyObject *self, PyObject *args) {
619 char *channel_name = nullptr;
620 Py_ssize_t len = 0;
621 unsigned char sleep_s = 0;
622 if (!PyArg_ParseTuple(
623 args, const_cast<char *>("s#B:cyber_PyChannelUtils_get_msg_type"),
624 &channel_name, &len, &sleep_s)) {
625 AERROR << "cyber_PyChannelUtils_get_msg_type failed!";
627 }
628 std::string channel(channel_name, len);
629 const std::string msg_type =
631 return C_STR_TO_PY_BYTES(msg_type);
632}
633
635 PyObject *self, PyObject *args) {
636 char *msgtype = nullptr;
637 char *rawdata = nullptr;
638 Py_ssize_t len = 0;
639 if (!PyArg_ParseTuple(
640 args,
641 const_cast<char *>(
642 "ss#:cyber_PyChannelUtils_get_debugstring_by_msgtype_rawmsgdata"),
643 &msgtype, &rawdata, &len)) {
644 AERROR
645 << "cyber_PyChannelUtils_get_debugstring_by_msgtype_rawmsgdata failed!";
647 }
648 std::string raw_data(rawdata, len);
649 const std::string debug_string =
651 return C_STR_TO_PY_BYTES(debug_string);
652}
653
654static PyObject *cyber_PyChannelUtils_get_active_channels(PyObject *self,
655 PyObject *args) {
656 unsigned char sleep_s = 0;
657 if (!PyArg_ParseTuple(
658 args,
659 const_cast<char *>("B:cyber_PyChannelUtils_get_active_channels"),
660 &sleep_s)) {
661 AERROR << "cyber_PyChannelUtils_get_active_channels failed!";
662 Py_INCREF(Py_None);
663 return Py_None;
664 }
665
666 std::vector<std::string> channel_list =
668 PyObject *pyobj_list = PyList_New(channel_list.size());
669 size_t pos = 0;
670 for (const std::string &channel : channel_list) {
671 PyList_SetItem(pyobj_list, pos, Py_BuildValue("s", channel.c_str()));
672 pos++;
673 }
674
675 return pyobj_list;
676}
677
678// return dict value look like:
679// { 'channel1':[atrr1, atrr2, atrr3],
680// 'channel2':[atrr1, atrr2]
681// }
682static PyObject *cyber_PyChannelUtils_get_channels_info(PyObject *self,
683 PyObject *args) {
684 auto channelsinfo = PyChannelUtils::get_channels_info();
685 PyObject *pyobj_channelinfo_dict = PyDict_New();
686 for (auto &channelinfo : channelsinfo) {
687 std::string channel_name = channelinfo.first;
688 PyObject *bld_name = Py_BuildValue("s", channel_name.c_str());
689 std::vector<std::string> &roleAttr_list = channelinfo.second;
690 PyObject *pyobj_list = PyList_New(roleAttr_list.size());
691
692 size_t pos = 0;
693 for (auto &attr : roleAttr_list) {
694 PyList_SetItem(pyobj_list, pos, C_STR_TO_PY_BYTES(attr));
695 pos++;
696 }
697 PyDict_SetItem(pyobj_channelinfo_dict, bld_name, pyobj_list);
698 Py_DECREF(bld_name);
699 }
700 return pyobj_channelinfo_dict;
701}
702
703PyObject *cyber_PyNodeUtils_get_active_nodes(PyObject *self, PyObject *args) {
704 unsigned char sleep_s = 0;
705 if (!PyArg_ParseTuple(
706 args, const_cast<char *>("B:cyber_PyNodeUtils_get_active_nodes"),
707 &sleep_s)) {
708 AERROR << "cyber_PyNodeUtils_get_active_nodes failed!";
709 Py_INCREF(Py_None);
710 return Py_None;
711 }
712
713 std::vector<std::string> nodes_name =
715 PyObject *pyobj_list = PyList_New(nodes_name.size());
716 size_t pos = 0;
717 for (const std::string &name : nodes_name) {
718 PyList_SetItem(pyobj_list, pos, Py_BuildValue("s", name.c_str()));
719 pos++;
720 }
721
722 return pyobj_list;
723}
724
725PyObject *cyber_PyNodeUtils_get_node_attr(PyObject *self, PyObject *args) {
726 char *node_name = nullptr;
727 Py_ssize_t len = 0;
728 unsigned char sleep_s = 0;
729 if (!PyArg_ParseTuple(
730 args, const_cast<char *>("s#B:cyber_PyNodeUtils_get_node_attr"),
731 &node_name, &len, &sleep_s)) {
732 AERROR << "cyber_PyNodeUtils_get_node_attr failed!";
733 Py_INCREF(Py_None);
734 return Py_None;
735 }
736 std::string name(node_name, len);
737 const std::string node_attr =
739 return C_STR_TO_PY_BYTES(node_attr);
740}
741
742PyObject *cyber_PyNodeUtils_get_readersofnode(PyObject *self, PyObject *args) {
743 char *node_name = nullptr;
744 Py_ssize_t len = 0;
745 unsigned char sleep_s = 0;
746 if (!PyArg_ParseTuple(
747 args, const_cast<char *>("s#B:cyber_PyNodeUtils_get_readersofnode"),
748 &node_name, &len, &sleep_s)) {
749 AERROR << "cyber_PyNodeUtils_get_readersofnode failed!";
750 Py_INCREF(Py_None);
751 return Py_None;
752 }
753 std::string name(node_name, len);
754 std::vector<std::string> readers_channel =
756 PyObject *pyobj_list = PyList_New(readers_channel.size());
757 size_t pos = 0;
758 for (const std::string &channel : readers_channel) {
759 PyList_SetItem(pyobj_list, pos, Py_BuildValue("s", channel.c_str()));
760 pos++;
761 }
762
763 return pyobj_list;
764}
765
766PyObject *cyber_PyNodeUtils_get_writersofnode(PyObject *self, PyObject *args) {
767 char *node_name = nullptr;
768 Py_ssize_t len = 0;
769 unsigned char sleep_s = 0;
770 if (!PyArg_ParseTuple(
771 args, const_cast<char *>("s#B:cyber_PyNodeUtils_get_writersofnode"),
772 &node_name, &len, &sleep_s)) {
773 AERROR << "cyber_PyNodeUtils_get_writersofnode failed!";
774 Py_INCREF(Py_None);
775 return Py_None;
776 }
777 std::string name(node_name, len);
778 std::vector<std::string> writers_channel =
780 PyObject *pyobj_list = PyList_New(writers_channel.size());
781 size_t pos = 0;
782 for (const std::string &channel : writers_channel) {
783 PyList_SetItem(pyobj_list, pos, Py_BuildValue("s", channel.c_str()));
784 pos++;
785 }
786
787 return pyobj_list;
788}
789
791 PyObject *args) {
792 unsigned char sleep_s = 0;
793 if (!PyArg_ParseTuple(
794 args,
795 const_cast<char *>("B:cyber_PyServiceUtils_get_active_services"),
796 &sleep_s)) {
797 AERROR << "cyber_PyServiceUtils_get_active_services failed!";
798 Py_INCREF(Py_None);
799 return Py_None;
800 }
801
802 std::vector<std::string> services_name =
804 PyObject *pyobj_list = PyList_New(services_name.size());
805 size_t pos = 0;
806 for (const std::string &name : services_name) {
807 PyList_SetItem(pyobj_list, pos, Py_BuildValue("s", name.c_str()));
808 pos++;
809 }
810
811 return pyobj_list;
812}
813
815 PyObject *args) {
816 char *srv_name = nullptr;
817 Py_ssize_t len = 0;
818 unsigned char sleep_s = 0;
819 if (!PyArg_ParseTuple(
820 args, const_cast<char *>("s#B:cyber_PyServiceUtils_get_service_attr"),
821 &srv_name, &len, &sleep_s)) {
822 AERROR << "cyber_PyServiceUtils_get_service_attr failed!";
823 Py_INCREF(Py_None);
824 return Py_None;
825 }
826 std::string name(srv_name, len);
827 const std::string srv_attr = PyServiceUtils::get_service_attr(name, sleep_s);
828 return C_STR_TO_PY_BYTES(srv_attr);
829}
830
834static PyMethodDef _cyber_methods[] = {
835 // PyInit fun
836 {"py_init", cyber_py_init, METH_VARARGS, ""},
837 {"py_ok", cyber_py_ok, METH_NOARGS, ""},
838 {"py_shutdown", cyber_py_shutdown, METH_NOARGS, ""},
839 {"py_is_shutdown", cyber_py_is_shutdown, METH_NOARGS, ""},
840 {"py_waitforshutdown", cyber_py_waitforshutdown, METH_NOARGS, ""},
841
842 // PyWriter fun
843 {"new_PyWriter", cyber_new_PyWriter, METH_VARARGS, ""},
844 {"delete_PyWriter", cyber_delete_PyWriter, METH_VARARGS, ""},
845 {"PyWriter_write", cyber_PyWriter_write, METH_VARARGS, ""},
846
847 // PyReader fun
848 {"new_PyReader", cyber_new_PyReader, METH_VARARGS, ""},
849 {"delete_PyReader", cyber_delete_PyReader, METH_VARARGS, ""},
850 {"PyReader_register_func", cyber_PyReader_register_func, METH_VARARGS, ""},
851 {"PyReader_read", cyber_PyReader_read, METH_VARARGS, ""},
852
853 // PyClient fun
854 {"new_PyClient", cyber_new_PyClient, METH_VARARGS, ""},
855 {"delete_PyClient", cyber_delete_PyClient, METH_VARARGS, ""},
856 {"PyClient_send_request", cyber_PyClient_send_request, METH_VARARGS, ""},
857 // PyService fun
858 {"new_PyService", cyber_new_PyService, METH_VARARGS, ""},
859 {"delete_PyService", cyber_delete_PyService, METH_VARARGS, ""},
860 {"PyService_register_func", cyber_PyService_register_func, METH_VARARGS,
861 ""},
862 {"PyService_read", cyber_PyService_read, METH_VARARGS, ""},
863 {"PyService_write", cyber_PyService_write, METH_VARARGS, ""},
864 // PyNode fun
865 {"new_PyNode", cyber_new_PyNode, METH_VARARGS, ""},
866 {"delete_PyNode", cyber_delete_PyNode, METH_VARARGS, ""},
867 {"PyNode_shutdown", cyber_PyNode_shutdown, METH_VARARGS, ""},
868 {"PyNode_create_writer", cyber_PyNode_create_writer, METH_VARARGS, ""},
869 {"PyNode_register_message", cyber_PyNode_register_message, METH_VARARGS,
870 ""},
871 {"PyNode_create_reader", cyber_PyNode_create_reader, METH_VARARGS, ""},
872 {"PyNode_create_client", cyber_PyNode_create_client, METH_VARARGS, ""},
873 {"PyNode_create_service", cyber_PyNode_create_service, METH_VARARGS, ""},
874
875 {"PyChannelUtils_get_msg_type", cyber_PyChannelUtils_get_msg_type,
876 METH_VARARGS, ""},
877 {"PyChannelUtils_get_debugstring_by_msgtype_rawmsgdata",
879 ""},
880 {"PyChannelUtils_get_active_channels",
881 cyber_PyChannelUtils_get_active_channels, METH_VARARGS, ""},
882 {"PyChannelUtils_get_channels_info", cyber_PyChannelUtils_get_channels_info,
883 METH_VARARGS, ""},
884
885 {"PyNodeUtils_get_active_nodes", cyber_PyNodeUtils_get_active_nodes,
886 METH_VARARGS, ""},
887 {"PyNodeUtils_get_node_attr", cyber_PyNodeUtils_get_node_attr, METH_VARARGS,
888 ""},
889 {"PyNodeUtils_get_readersofnode", cyber_PyNodeUtils_get_readersofnode,
890 METH_VARARGS, ""},
891 {"PyNodeUtils_get_writersofnode", cyber_PyNodeUtils_get_writersofnode,
892 METH_VARARGS, ""},
893
894 {"PyServiceUtils_get_active_services",
896 {"PyServiceUtils_get_service_attr", cyber_PyServiceUtils_get_service_attr,
897 METH_VARARGS, ""},
898
899 {nullptr, nullptr, 0, nullptr} /* sentinel */
900};
901
903PyMODINIT_FUNC PyInit__cyber_wrapper(void) {
904 static struct PyModuleDef module_def = {
905 PyModuleDef_HEAD_INIT,
906 "_cyber_wrapper", // Module name.
907 "Cyber module", // Module doc.
908 -1, // Module size.
909 _cyber_methods, // Module methods.
910 nullptr,
911 nullptr,
912 nullptr,
913 nullptr,
914 };
915
916 return PyModule_Create(&module_def);
917}
Node is the fundamental building block of Cyber RT.
Definition node.h:44
static std::unordered_map< std::string, std::vector< std::string > > get_channels_info(uint8_t sleep_s=2)
Definition py_cyber.h:396
static std::string get_msgtype_by_channelname(const std::string &channel_name, uint8_t sleep_s=0)
Definition py_cyber.h:372
static std::string get_debugstring_by_msgtype_rawmsgdata(const std::string &msg_type, const std::string &rawmsgdata)
Definition py_cyber.h:343
static std::vector< std::string > get_active_channels(uint8_t sleep_s=2)
Definition py_cyber.h:386
std::string send_request(std::string request)
Definition py_cyber.h:263
static std::vector< std::string > get_readersofnode(const std::string &node_name, uint8_t sleep_s=2)
Definition py_cyber.h:470
static std::vector< std::string > get_writersofnode(const std::string &node_name, uint8_t sleep_s=2)
Definition py_cyber.h:492
static std::string get_node_attr(const std::string &node_name, uint8_t sleep_s=2)
Definition py_cyber.h:448
static std::vector< std::string > get_active_nodes(uint8_t sleep_s=2)
Definition py_cyber.h:427
PyReader * create_reader(const std::string &channel, const std::string &type)
Definition py_cyber.h:309
PyService * create_service(const std::string &service, const std::string &type)
Definition py_cyber.h:316
PyWriter * create_writer(const std::string &channel, const std::string &type, uint32_t qos_depth=1)
Definition py_cyber.h:296
PyClient * create_client(const std::string &service, const std::string &type)
Definition py_cyber.h:324
void register_message(const std::string &desc)
Definition py_cyber.h:305
std::string read(bool wait=false)
Definition py_cyber.h:130
void register_func(int(*func)(const char *))
Definition py_cyber.h:128
static std::vector< std::string > get_active_services(uint8_t sleep_s=2)
Definition py_cyber.h:517
static std::string get_service_attr(const std::string &service_name, uint8_t sleep_s=2)
Definition py_cyber.h:538
void register_func(int(*func)(const char *))
Definition py_cyber.h:205
int write(const std::string &data)
Definition py_cyber.h:216
int write(const std::string &data)
Definition py_cyber.h:94
#define ACHECK(cond)
Definition log.h:80
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
bool py_is_shutdown()
Definition py_cyber.h:66
void py_shutdown()
Definition py_cyber.h:64
void py_waitforshutdown()
Definition py_cyber.h:68
bool py_init(const std::string &module_name)
Definition py_cyber.h:46
bool py_ok()
Definition py_cyber.h:62
PyObject * cyber_PyChannelUtils_get_msg_type(PyObject *self, PyObject *args)
Definition py_cyber.cc:618
PyObject * cyber_PyReader_read(PyObject *self, PyObject *args)
Definition py_cyber.cc:203
PyObject * cyber_PyNodeUtils_get_node_attr(PyObject *self, PyObject *args)
Definition py_cyber.cc:725
PyObject * cyber_delete_PyReader(PyObject *self, PyObject *args)
Definition py_cyber.cc:188
PyObject * cyber_PyServiceUtils_get_active_services(PyObject *self, PyObject *args)
Definition py_cyber.cc:790
PyObject * cyber_PyNode_create_client(PyObject *self, PyObject *args)
Definition py_cyber.cc:520
#define PYOBJECT_NULL_STRING
Definition py_cyber.cc:35
PyObject * cyber_PyNodeUtils_get_active_nodes(PyObject *self, PyObject *args)
Definition py_cyber.cc:703
PyObject * cyber_delete_PyClient(PyObject *self, PyObject *args)
Definition py_cyber.cc:283
PyObject * cyber_delete_PyWriter(PyObject *self, PyObject *args)
Definition py_cyber.cc:125
#define PyInt_AsLong
Definition py_cyber.cc:33
#define PyInt_FromLong
Definition py_cyber.cc:34
PyMODINIT_FUNC PyInit__cyber_wrapper(void)
Init function of this module
Definition py_cyber.cc:903
PyObject * cyber_new_PyWriter(PyObject *self, PyObject *args)
Definition py_cyber.cc:97
PyObject * cyber_new_PyClient(PyObject *self, PyObject *args)
Definition py_cyber.cc:258
PyObject * cyber_PyService_register_func(PyObject *self, PyObject *args)
Definition py_cyber.cc:364
PyObject * cyber_PyWriter_write(PyObject *self, PyObject *args)
Definition py_cyber.cc:140
PyObject * cyber_PyNodeUtils_get_writersofnode(PyObject *self, PyObject *args)
Definition py_cyber.cc:766
PyObject * cyber_PyNode_create_service(PyObject *self, PyObject *args)
Definition py_cyber.cc:547
T PyObjectToPtr(PyObject *pyobj, const std::string &type_ptr)
Definition py_cyber.cc:89
PyObject * cyber_delete_PyNode(PyObject *self, PyObject *args)
Definition py_cyber.cc:443
#define C_STR_TO_PY_BYTES(cstr)
Definition py_cyber.cc:36
PyObject * cyber_PyService_write(PyObject *self, PyObject *args)
Definition py_cyber.cc:407
PyObject * cyber_PyChannelUtils_get_debugstring_by_msgtype_rawmsgdata(PyObject *self, PyObject *args)
Definition py_cyber.cc:634
PyObject * cyber_new_PyReader(PyObject *self, PyObject *args)
Definition py_cyber.cc:163
PyObject * cyber_new_PyNode(PyObject *self, PyObject *args)
Definition py_cyber.cc:431
PyObject * cyber_PyReader_register_func(PyObject *self, PyObject *args)
Definition py_cyber.cc:234
PyObject * cyber_PyClient_send_request(PyObject *self, PyObject *args)
Definition py_cyber.cc:298
PyObject * cyber_new_PyService(PyObject *self, PyObject *args)
Definition py_cyber.cc:324
PyObject * cyber_PyNodeUtils_get_readersofnode(PyObject *self, PyObject *args)
Definition py_cyber.cc:742
PyObject * cyber_PyNode_shutdown(PyObject *self, PyObject *args)
Definition py_cyber.cc:574
PyObject * cyber_PyService_read(PyObject *self, PyObject *args)
Definition py_cyber.cc:388
PyObject * cyber_PyNode_create_writer(PyObject *self, PyObject *args)
Definition py_cyber.cc:458
PyObject * cyber_PyServiceUtils_get_service_attr(PyObject *self, PyObject *args)
Definition py_cyber.cc:814
PyObject * cyber_delete_PyService(PyObject *self, PyObject *args)
Definition py_cyber.cc:349
PyObject * cyber_PyNode_register_message(PyObject *self, PyObject *args)
Definition py_cyber.cc:595
PyObject * cyber_PyNode_create_reader(PyObject *self, PyObject *args)
Definition py_cyber.cc:492