Skip to content
This repository was archived by the owner on Nov 1, 2023. It is now read-only.

Commit 16ca13a

Browse files
committed
Fix datalog implementation
- Removed MemoryBuffer, and only provide two ways of creating a reader instead - TODO: example needs to be better - TODO: need to provide a 'get' function for a record which figures out the right type for you - TODO: py::make_iterator isn't handled by pybind11-stubgen, which is annoying
1 parent 434ec59 commit 16ca13a

File tree

6 files changed

+156
-95
lines changed

6 files changed

+156
-95
lines changed

examples/printlog.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import pathlib
5+
6+
from wpiutil.log import DataLogReader
7+
8+
if __name__ == "__main__":
9+
parser = argparse.ArgumentParser()
10+
parser.add_argument("infile")
11+
args = parser.parse_args()
12+
13+
reader = DataLogReader(args.infile)
14+
for record in reader:
15+
if record.isStart():
16+
print(record.getStartData())
17+
else:
18+
print(record.getBoolean())

examples/writelog.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import pathlib
5+
6+
from wpiutil.log import DataLog, BooleanLogEntry
7+
8+
9+
if __name__ == "__main__":
10+
11+
parser = argparse.ArgumentParser()
12+
parser.add_argument("out", type=pathlib.Path)
13+
args = parser.parse_args()
14+
15+
if args.out.is_dir():
16+
datalog = DataLog(str(args.out))
17+
else:
18+
datalog = DataLog(str(args.out.parent), args.out.name)
19+
20+
bools = BooleanLogEntry(datalog, "/bools")
21+
bools.append(True)
22+
bools.append(False)

gen/DataLogReader.yml

Lines changed: 95 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,58 +30,125 @@ classes:
3030
IsFinish:
3131
IsSetMetadata:
3232
GetStartData:
33+
param_override:
34+
out:
35+
force_out: true
36+
default:
3337
GetFinishEntry:
38+
param_override:
39+
out:
40+
force_out: true
41+
default:
3442
GetSetMetadataData:
43+
param_override:
44+
out:
45+
force_out: true
46+
default:
3547
GetBoolean:
3648
GetInteger:
3749
GetFloat:
3850
GetDouble:
3951
GetString:
52+
param_override:
53+
value:
54+
force_out: true
55+
default:
4056
GetBooleanArray:
57+
param_override:
58+
arr:
59+
force_out: true
60+
default:
4161
GetIntegerArray:
62+
param_override:
63+
arr:
64+
force_out: true
65+
default:
4266
GetFloatArray:
67+
param_override:
68+
arr:
69+
force_out: true
70+
default:
4371
GetDoubleArray:
72+
param_override:
73+
arr:
74+
force_out: true
75+
default:
4476
GetStringArray:
77+
param_override:
78+
arr:
79+
force_out: true
80+
default:
4581
DataLogIterator:
46-
subpackage: log
47-
methods:
48-
DataLogIterator:
49-
# TODO: https://github.com/robotpy/robotpy-build/issues/160
50-
operator==:
51-
ignore: true
52-
operator!=:
53-
ignore: true
54-
operator<:
55-
ignore: true
56-
operator>:
57-
ignore: true
58-
operator<=:
59-
ignore: true
60-
operator>=:
61-
ignore: true
62-
operator*:
63-
ignore: true # XXX: https://github.com/robotpy/robotpy-build/issues/159
64-
rename: get
82+
ignore: true
6583
DataLogReader:
6684
subpackage: log
6785
typealias:
6886
- wpi::MemoryBuffer
6987
methods:
7088
DataLogReader:
89+
ignore: true
7190
IsValid:
7291
GetVersion:
7392
GetExtraHeader:
7493
GetBufferIdentifier:
7594
begin:
76-
rename: __iter__
95+
ignore: true
7796
end:
97+
ignore: true
7898

7999
inline_code: |
80-
cls_DataLogIterator
81-
.def("__iter__", [](DataLogIterator &self) { return self; })
82-
.def("__next__", [](DataLogIterator &self) {
83-
auto& record = *self;
84-
++self;
85-
return record;
86-
})
87-
;
100+
cls_StartRecordData
101+
.def("__repr__", [](const wpi::log::StartRecordData &data) -> std::string {
102+
return "StartRecordData(entry=" + std::to_string(data.entry) + ", "
103+
"name=\"" + std::string(data.name) + "\", "
104+
"type=\"" + std::string(data.type) + "\", "
105+
"metadata=\"" + std::string(data.metadata) + "\")";
106+
});
107+
108+
cls_MetadataRecordData
109+
.def("__repr__", [](const wpi::log::MetadataRecordData &data) -> std::string {
110+
return "MetadataRecordData(entry=" + std::to_string(data.entry) + ", "
111+
"metadata=\"" + std::string(data.metadata) + "\")";
112+
});
113+
114+
115+
cls_DataLogReader
116+
.def(py::init([](const std::string &filename) {
117+
std::error_code ec;
118+
auto mbuf = wpi::MemoryBuffer::GetFile(filename, ec);
119+
if (ec) {
120+
py::gil_scoped_acquire gil;
121+
#ifdef _WIN32
122+
PyErr_SetFromWindowsErr(ec.value());
123+
#else
124+
errno = ec.value();
125+
PyErr_SetFromErrno(PyExc_OSError);
126+
#endif
127+
throw py::error_already_set();
128+
}
129+
130+
return std::make_shared<wpi::log::DataLogReader>(std::move(mbuf));
131+
}),
132+
release_gil(), py::arg("filename"))
133+
134+
.def(py::init([](const py::buffer &buffer, const std::string &name) {
135+
auto req = buffer.request();
136+
if (req.itemsize != 1) {
137+
throw py::value_error("buffer must only contain bytes");
138+
} else if (req.ndim != 1) {
139+
throw py::value_error("buffer must only have a single dimension");
140+
}
141+
142+
auto mbuf = wpi::MemoryBuffer::GetMemBuffer(wpi::span((uint8_t*)req.ptr, req.size), name);
143+
144+
{
145+
py::gil_scoped_release gil;
146+
return std::make_shared<wpi::log::DataLogReader>(std::move(mbuf));
147+
}
148+
}),
149+
py::arg("buffer"), py::arg("name") = "",
150+
py::keep_alive<1, 2>())
151+
.def("__iter__", [](wpi::log::DataLogReader * that) {
152+
return py::make_iterator(that->begin(), that->end());
153+
}, py::keep_alive<0,1>());
154+

gen/MemoryBuffer.yml

Lines changed: 0 additions & 63 deletions
This file was deleted.

pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[build-system]
2-
requires = ["robotpy-build<2023.0.0,>=2022.2.0"]
2+
requires = ["robotpy-build<2023.0.0,>=2022.2.2"]
33

44
[tool.robotpy-build]
55
base_package = "wpiutil"
@@ -26,7 +26,6 @@ libs = ["wpiutil"]
2626
# wpi
2727
DataLog = "wpi/DataLog.h"
2828
DataLogReader = "wpi/DataLogReader.h"
29-
MemoryBuffer = "wpi/MemoryBuffer.h"
3029
PortForwarder = "wpi/PortForwarder.h"
3130
StackTrace = "wpi/StackTrace.h"
3231

wpiutil/__init__.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,27 @@
11
from . import _init_wpiutil
22

33
# autogenerated by 'robotpy-build create-imports wpiutil wpiutil._wpiutil'
4-
from ._wpiutil import PortForwarder
4+
from ._wpiutil import (
5+
ControlRecordType,
6+
PortForwarder,
7+
Sendable,
8+
SendableBuilder,
9+
SendableRegistry,
10+
getStackTrace,
11+
getStackTraceDefault,
12+
# log,
13+
)
514

6-
__all__ = ["PortForwarder"]
15+
__all__ = [
16+
"ControlRecordType",
17+
"PortForwarder",
18+
"Sendable",
19+
"SendableBuilder",
20+
"SendableRegistry",
21+
"getStackTrace",
22+
"getStackTraceDefault",
23+
# "log",
24+
]
725

826
# Imported for side effects only
927
from . import _stacktrace

0 commit comments

Comments
 (0)