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