27#define PYOBJECT_NULL_STRING PyBytes_FromStringAndSize("", 0)
28#define C_STR_TO_PY_BYTES(cstr) \
29 PyBytes_FromStringAndSize(cstr.c_str(), cstr.size())
33 T obj_ptr = (T)PyCapsule_GetPointer(pyobj, type_ptr.c_str());
34 if (obj_ptr ==
nullptr) {
35 AERROR <<
"PyObjectToPtr failed,type->" << type_ptr <<
"pyobj: " << pyobj;
41 char *filepath =
nullptr;
43 if (!PyArg_ParseTuple(args,
const_cast<char *
>(
"s#:new_PyRecordReader"),
45 AERROR <<
"cyber_new_PyRecordReader parsetuple failed!";
51 return PyCapsule_New(reader,
"apollo_cyber_record_pyrecordfilereader",
56 PyObject *pyobj_rec_reader =
nullptr;
57 if (!PyArg_ParseTuple(args,
const_cast<char *
>(
"O:delete_PyRecordReader"),
63 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
64 pyobj_rec_reader,
"apollo_cyber_record_pyrecordfilereader"));
65 if (
nullptr == reader) {
66 AERROR <<
"delete_PyRecordReader:reader ptr is null!";
76 PyObject *pyobj_reader =
nullptr;
77 uint64_t begin_time = 0;
78 uint64_t end_time = std::numeric_limits<uint64_t>::max();
79 if (!PyArg_ParseTuple(args,
80 const_cast<char *
>(
"OKK:PyRecordReader_ReadMessage"),
81 &pyobj_reader, &begin_time, &end_time)) {
85 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
86 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
87 if (
nullptr == reader) {
88 AERROR <<
"PyRecordReader_ReadMessage ptr is null!";
92 const auto result = reader->
ReadMessage(begin_time, end_time);
93 PyObject *pyobj_bag_message = PyDict_New();
95 PyObject *bld_name = Py_BuildValue(
"s", result.channel_name.c_str());
96 PyDict_SetItemString(pyobj_bag_message,
"channel_name", bld_name);
100 Py_BuildValue(
"y#", result.data.c_str(), result.data.length());
102 ACHECK(bld_data) <<
"Py_BuildValue returns NULL.";
103 PyDict_SetItemString(pyobj_bag_message,
"data", bld_data);
106 PyObject *bld_type = Py_BuildValue(
"s", result.data_type.c_str());
107 PyDict_SetItemString(pyobj_bag_message,
"data_type", bld_type);
110 PyObject *bld_time = Py_BuildValue(
"s",
"timestamp");
111 PyObject *bld_rtime = Py_BuildValue(
"K", result.timestamp);
112 PyDict_SetItem(pyobj_bag_message, bld_time, bld_rtime);
114 Py_DECREF(bld_rtime);
116 PyObject *bld_end = Py_BuildValue(
"s",
"end");
117 PyDict_SetItem(pyobj_bag_message, bld_end, result.end ? Py_True : Py_False);
120 return pyobj_bag_message;
125 PyObject *pyobj_reader =
nullptr;
126 char *channel_name =
nullptr;
127 if (!PyArg_ParseTuple(
128 args,
const_cast<char *
>(
"Os:PyRecordReader_GetMessageNumber"),
129 &pyobj_reader, &channel_name)) {
130 AERROR <<
"PyRecordReader_GetMessageNumber:PyRecordReader failed!";
131 return PyLong_FromUnsignedLongLong(0);
134 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
135 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
136 if (
nullptr == reader) {
137 AERROR <<
"PyRecordReader_GetMessageNumber ptr is null!";
138 return PyLong_FromUnsignedLongLong(0);
141 uint64_t num = reader->GetMessageNumber(channel_name);
142 return PyLong_FromUnsignedLongLong(num);
146 PyObject *pyobj_reader =
nullptr;
147 char *channel_name =
nullptr;
148 if (!PyArg_ParseTuple(
149 args,
const_cast<char *
>(
"Os:cyber_PyRecordReader_GetMessageType"),
150 &pyobj_reader, &channel_name)) {
151 AERROR <<
"PyRecordReader_GetMessageType:PyRecordReader failed!";
155 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
156 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
157 if (
nullptr == reader) {
158 AERROR <<
"PyRecordReader_GetMessageType ptr is null!";
162 const std::string msg_type = reader->
GetMessageType(channel_name);
167 PyObject *pyobj_reader =
nullptr;
168 char *channel_name =
nullptr;
169 if (!PyArg_ParseTuple(args,
170 const_cast<char *
>(
"Os:PyRecordReader_GetProtoDesc"),
171 &pyobj_reader, &channel_name)) {
172 AERROR <<
"PyRecordReader_GetProtoDesc failed!";
176 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
177 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
178 if (
nullptr == reader) {
179 AERROR <<
"PyRecordReader_GetProtoDesc ptr is null!";
183 const std::string pb_desc = reader->
GetProtoDesc(channel_name);
188 PyObject *pyobj_reader =
nullptr;
189 if (!PyArg_ParseTuple(
190 args,
const_cast<char *
>(
"O:cyber_PyRecordReader_GetHeaderString"),
195 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
196 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
197 if (
nullptr == reader) {
198 AERROR <<
"PyRecordReader_GetHeaderString ptr is null!";
207 PyObject *pyobj_reader =
nullptr;
208 if (!PyArg_ParseTuple(args,
209 const_cast<char *
>(
"O:cyber_PyRecordReader_Reset"),
211 AERROR <<
"cyber_PyRecordReader_Reset:PyArg_ParseTuple failed!";
216 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
217 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
218 if (
nullptr == reader) {
219 AERROR <<
"PyRecordReader_Reset reader is null!";
230 PyObject *pyobj_reader =
nullptr;
231 if (!PyArg_ParseTuple(
232 args,
const_cast<char *
>(
"O:cyber_PyRecordReader_GetChannelList"),
234 AERROR <<
"cyber_PyRecordReader_GetChannelList:PyArg_ParseTuple failed!";
239 auto *reader =
reinterpret_cast<PyRecordReader *
>(PyCapsule_GetPointer(
240 pyobj_reader,
"apollo_cyber_record_pyrecordfilereader"));
241 if (
nullptr == reader) {
242 AERROR <<
"PyRecordReader_GetChannelList reader is null!";
247 std::set<std::string> channel_list = reader->GetChannelList();
248 PyObject *pyobj_list = PyList_New(channel_list.size());
250 for (
const std::string &channel : channel_list) {
251 PyList_SetItem(pyobj_list, pos, Py_BuildValue(
"s", channel.c_str()));
260 return PyCapsule_New(writer,
"apollo_cyber_record_pyrecordfilewriter",
265 PyObject *pyobj_rec_writer =
nullptr;
266 if (!PyArg_ParseTuple(args,
const_cast<char *
>(
"O:delete_PyRecordWriter"),
267 &pyobj_rec_writer)) {
272 auto *writer =
reinterpret_cast<PyRecordWriter *
>(PyCapsule_GetPointer(
273 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter"));
274 if (
nullptr == writer) {
275 AERROR <<
"delete_PyRecordWriter:writer is null!";
285 PyObject *pyobj_rec_writer =
nullptr;
286 char *path =
nullptr;
288 if (!PyArg_ParseTuple(args,
289 const_cast<char *
>(
"Os#:cyber_PyRecordWriter_Open"),
290 &pyobj_rec_writer, &path, &len)) {
291 AERROR <<
"cyber_PyRecordWriter_Open:PyArg_ParseTuple failed!";
296 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter");
298 if (
nullptr == writer) {
299 AERROR <<
"PyRecordWriter_Open:writer is null!";
303 std::string path_str(path, len);
304 if (!writer->
Open(path_str)) {
311 PyObject *pyobj_rec_writer =
nullptr;
312 if (!PyArg_ParseTuple(args,
const_cast<char *
>(
"O:delete_PyRecordWriter"),
313 &pyobj_rec_writer)) {
318 auto *writer =
reinterpret_cast<PyRecordWriter *
>(PyCapsule_GetPointer(
319 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter"));
320 if (
nullptr == writer) {
321 AERROR <<
"cyber_PyRecordWriter_Close: writer is null!";
331 PyObject *pyobj_rec_writer =
nullptr;
332 char *channel =
nullptr;
333 char *type =
nullptr;
334 char *proto_desc =
nullptr;
336 if (!PyArg_ParseTuple(
337 args,
const_cast<char *
>(
"Osss#:cyber_PyRecordWriter_WriteChannel"),
338 &pyobj_rec_writer, &channel, &type, &proto_desc, &len)) {
339 AERROR <<
"cyber_PyRecordWriter_WriteChannel parsetuple failed!";
343 auto *writer = PyObjectToPtr<PyRecordWriter *>(
344 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter");
346 if (
nullptr == writer) {
347 AERROR <<
"cyber_PyRecordWriter_WriteChannel:writer ptr is null!";
351 std::string proto_desc_str(proto_desc, len);
352 if (!writer->WriteChannel(channel, type, proto_desc_str)) {
359 PyObject *pyobj_rec_writer =
nullptr;
360 char *channel_name =
nullptr;
361 char *rawmessage =
nullptr;
364 char *proto_desc =
nullptr;
365 Py_ssize_t len_desc = 0;
367 if (!PyArg_ParseTuple(
368 args,
const_cast<char *
>(
"Oss#Ks#:cyber_PyRecordWriter_WriteMessage"),
369 &pyobj_rec_writer, &channel_name, &rawmessage, &len, &time,
370 &proto_desc, &len_desc)) {
371 AERROR <<
"cyber_PyRecordWriter_WriteMessage parsetuple failed!";
375 auto *writer = PyObjectToPtr<PyRecordWriter *>(
376 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter");
378 if (
nullptr == writer) {
379 AERROR <<
"cyber_PyRecordWriter_WriteMessage:writer ptr is null!";
383 std::string rawmessage_str(rawmessage, len);
384 std::string desc_str(proto_desc, len_desc);
385 if (!writer->WriteMessage(channel_name, rawmessage_str, time, desc_str)) {
386 AERROR <<
"cyber_PyRecordWriter_WriteMessage:WriteMessage failed!";
394 PyObject *pyobj_rec_writer =
nullptr;
395 uint64_t size_kilobytes = 0;
397 if (!PyArg_ParseTuple(
400 "OK:cyber_PyRecordWriter_SetSizeOfFileSegmentation"),
401 &pyobj_rec_writer, &size_kilobytes)) {
403 <<
"cyber_PyRecordWriter_SetSizeOfFileSegmentation parsetuple failed!";
407 auto *writer = PyObjectToPtr<PyRecordWriter *>(
408 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter");
410 if (
nullptr == writer) {
412 <<
"cyber_PyRecordWriter_SetSizeOfFileSegmentation:writer ptr is null!";
416 if (!writer->SetSizeOfFileSegmentation(size_kilobytes)) {
417 AERROR <<
"cyber_PyRecordWriter_SetSizeOfFileSegmentation failed!";
425 PyObject *pyobj_rec_writer =
nullptr;
426 uint64_t time_sec = 0;
428 if (!PyArg_ParseTuple(
431 "OK:cyber_PyRecordWriter_SetIntervalOfFileSegmentation"),
432 &pyobj_rec_writer, &time_sec)) {
433 AERROR <<
"cyber_PyRecordWriter_SetIntervalOfFileSegmentation parsetuple "
438 auto *writer = PyObjectToPtr<PyRecordWriter *>(
439 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter");
441 if (
nullptr == writer) {
442 AERROR <<
"cyber_PyRecordWriter_SetIntervalOfFileSegmentation:writer ptr "
447 if (!writer->SetIntervalOfFileSegmentation(time_sec)) {
448 AERROR <<
"cyber_PyRecordWriter_SetIntervalOfFileSegmentation failed!";
456 PyObject *pyobj_rec_writer =
nullptr;
457 char *channel_name =
nullptr;
458 if (!PyArg_ParseTuple(
459 args,
const_cast<char *
>(
"Os:PyRecordWriter_GetMessageNumber"),
460 &pyobj_rec_writer, &channel_name)) {
461 AERROR <<
"PyRecordWriter_GetMessageNumber:PyRecordWriter_GetMessageNumber "
463 return PyLong_FromUnsignedLongLong(0);
466 auto *writer =
reinterpret_cast<PyRecordWriter *
>(PyCapsule_GetPointer(
467 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter"));
468 if (
nullptr == writer) {
469 AERROR <<
"PyRecordWriter_GetMessageNumber ptr is null!";
470 return PyLong_FromUnsignedLongLong(0);
473 uint64_t num = writer->GetMessageNumber(channel_name);
474 return PyLong_FromUnsignedLongLong(num);
478 PyObject *pyobj_rec_writer =
nullptr;
479 char *channel_name =
nullptr;
480 if (!PyArg_ParseTuple(args,
481 const_cast<char *
>(
"Os:PyRecordWriter_GetMessageType"),
482 &pyobj_rec_writer, &channel_name)) {
483 AERROR <<
"PyRecordWriter_GetMessageType failed!";
487 auto *writer =
reinterpret_cast<PyRecordWriter *
>(PyCapsule_GetPointer(
488 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter"));
489 if (
nullptr == writer) {
490 AERROR <<
"PyRecordWriter_GetMessageType ptr is null!";
499 PyObject *pyobj_rec_writer =
nullptr;
500 char *channel_name =
nullptr;
501 if (!PyArg_ParseTuple(args,
502 const_cast<char *
>(
"Os:PyRecordWriter_GetProtoDesc"),
503 &pyobj_rec_writer, &channel_name)) {
504 AERROR <<
"PyRecordWriter_GetProtoDesc failed!";
508 auto *writer =
reinterpret_cast<PyRecordWriter *
>(PyCapsule_GetPointer(
509 pyobj_rec_writer,
"apollo_cyber_record_pyrecordfilewriter"));
510 if (
nullptr == writer) {
511 AERROR <<
"PyRecordWriter_GetProtoDesc ptr is null!";
515 const std::string proto_desc_str = writer->
GetProtoDesc(channel_name);
519static PyMethodDef _cyber_record_methods[] = {
546 {
"PyRecordWriter_SetSizeOfFileSegmentation",
548 {
"PyRecordWriter_SetIntervalOfFileSegmentation",
557 {
nullptr,
nullptr, 0,
nullptr}
562 static struct PyModuleDef module_def = {
563 PyModuleDef_HEAD_INIT,
564 "_cyber_record_wrapper",
565 "CyberRecord module",
567 _cyber_record_methods,
574 AINFO <<
"init _cyber_record_wrapper";
575 return PyModule_Create(&module_def);
std::string GetProtoDesc(const std::string &channel_name)
std::string GetMessageType(const std::string &channel_name)
std::string GetHeaderString()
BagMessage ReadMessage(uint64_t begin_time=0, uint64_t end_time=std::numeric_limits< uint64_t >::max())
const std::string & GetProtoDesc(const std::string &channel_name) const
bool Open(const std::string &path)
const std::string & GetMessageType(const std::string &channel_name) const
PyObject * cyber_PyRecordWriter_WriteChannel(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_Open(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_GetMessageNumber(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordReader_GetHeaderString(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_WriteMessage(PyObject *self, PyObject *args)
#define PYOBJECT_NULL_STRING
PyObject * cyber_PyRecordReader_GetMessageType(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_Close(PyObject *self, PyObject *args)
PyObject * cyber_new_PyRecordReader(PyObject *self, PyObject *args)
T PyObjectToPtr(PyObject *pyobj, const std::string &type_ptr)
PyObject * cyber_PyRecordWriter_SetIntervalOfFileSegmentation(PyObject *self, PyObject *args)
#define C_STR_TO_PY_BYTES(cstr)
PyObject * cyber_delete_PyRecordWriter(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_SetSizeOfFileSegmentation(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordReader_Reset(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordReader_GetProtoDesc(PyObject *self, PyObject *args)
PyObject * cyber_new_PyRecordWriter(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordReader_ReadMessage(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_GetProtoDesc(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordReader_GetMessageNumber(PyObject *self, PyObject *args)
PyObject * cyber_delete_PyRecordReader(PyObject *self, PyObject *args)
PyObject * cyber_PyRecordWriter_GetMessageType(PyObject *self, PyObject *args)
PyMODINIT_FUNC PyInit__cyber_record_wrapper(void)
Init function of this module
PyObject * cyber_PyRecordReader_GetChannelList(PyObject *self, PyObject *args)