add timestamp
This commit is contained in:
parent
8fc003cfb3
commit
21fd3e32a6
@ -220,6 +220,7 @@ class Device(Node):
|
||||
self.seq_meta = RfSequenceMeta.from_name(msg.name)
|
||||
self.send(SeqMetaMsg('live', msg.name))
|
||||
elif isinstance(msg, RequestRfFrameMsg):
|
||||
raise NotImplementedError()
|
||||
if self.switch:
|
||||
braw = self.get_data()
|
||||
if braw == b'':
|
||||
|
||||
@ -11,7 +11,7 @@ from flandre.nodes.Device import Device, DeviceCmd
|
||||
from flandre.nodes.Node import Node
|
||||
from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, \
|
||||
ImagingConfigNameListMsg, BeamformerMsg, RobotRtsiMsg, SeqMetaMsg, DeviceEnabledMsg, RfFrameMsg
|
||||
from flandre.utils.RfFrame import RfFrameMemory
|
||||
from flandre.utils.RfFrame import RfFrameMemory, b2t
|
||||
from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -79,8 +79,8 @@ class Muxer(Node):
|
||||
# todo fixit driver no empty
|
||||
self.rep_socket.send(BeamformerMsg(b'nop').encode_msg())
|
||||
return
|
||||
_, sequence_id, encoder = struct.unpack_from('=IQi', self.driver_data_raw)
|
||||
driver_data_body = self.driver_data_raw[4 + 8 + 4:]
|
||||
# _, sequence_id, encoder = struct.unpack_from('=IQi', self.driver_data_raw)
|
||||
ts, sequence_id, encoder, driver_data_body = b2t(self.driver_data_raw)
|
||||
data_msg = RfFrameMsg(0, RfFrameMemory(
|
||||
RfFrameMeta(
|
||||
encoder=encoder,
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import json
|
||||
import logging
|
||||
import struct
|
||||
from pathlib import Path
|
||||
@ -9,6 +10,7 @@ from flandre.config import C
|
||||
from flandre.nodes.Node import Node
|
||||
from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \
|
||||
RequestRfFrameMsg, RecordFrameMsg, RobotRtsiMsg, SeqMetaMsg
|
||||
from flandre.utils.RfFrame import b2t
|
||||
from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -25,6 +27,8 @@ class Recorder(Node):
|
||||
self.record_commit = None
|
||||
self.record_path: Path | None = None
|
||||
self.play_mode = None
|
||||
self.arr: list[RobotRtsiMsg] = []
|
||||
self.isrecord = False
|
||||
|
||||
def loop(self):
|
||||
self.rtsi = RobotRtsiMsg(
|
||||
@ -39,8 +43,7 @@ class Recorder(Node):
|
||||
for k in socks:
|
||||
if k == device_socket:
|
||||
buffer = device_socket.recv()
|
||||
_, sequence_id, encoder = struct.unpack_from('=IQi', buffer)
|
||||
s = buffer[4 + 8 + 4:]
|
||||
ts, sequence_id, encoder, s = b2t(buffer)
|
||||
if self.seq_meta_live is not None and s.__len__() // 2 == np.prod(self.seq_meta_live.shape):
|
||||
(self.record_path / RfFrameMeta(
|
||||
encoder=encoder,
|
||||
@ -57,7 +60,7 @@ class Recorder(Node):
|
||||
robot_force_roll=self.rtsi.force[3],
|
||||
robot_force_pitch=self.rtsi.force[4],
|
||||
robot_force_yal=self.rtsi.force[5],
|
||||
).filename).write_bytes(s)
|
||||
).filename(ts)).write_bytes(s)
|
||||
self.send(RecordFrameMsg(s.__len__(), sequence_id))
|
||||
if k == self.c.sub:
|
||||
msg = self.recv()
|
||||
@ -71,6 +74,8 @@ class Recorder(Node):
|
||||
elif isinstance(msg, SetRecordMsg):
|
||||
self.record_enable = msg.enable
|
||||
if msg.enable:
|
||||
self.isrecord = True
|
||||
self.arr.clear()
|
||||
seq_meta = self.seq_meta_live
|
||||
self.record_commit = msg.commit
|
||||
seq_meta.commit = msg.commit
|
||||
@ -79,6 +84,14 @@ class Recorder(Node):
|
||||
self.record_path = p
|
||||
device_socket.connect(C.live_push_socket)
|
||||
else:
|
||||
self.isrecord = False
|
||||
device_socket.disconnect(C.live_push_socket)
|
||||
arrj = []
|
||||
for msg in self.arr:
|
||||
arrj.append(msg.dict)
|
||||
(self.record_path / f'rtsi.{self.arr[0].ts}.json').write_text(json.dumps(arrj))
|
||||
|
||||
elif isinstance(msg, RobotRtsiMsg):
|
||||
self.rtsi = msg
|
||||
if self.isrecord:
|
||||
self.arr.append(self.rtsi)
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import dataclasses
|
||||
import json
|
||||
import struct
|
||||
import time
|
||||
from enum import auto, Enum
|
||||
from pathlib import Path
|
||||
|
||||
@ -66,9 +67,24 @@ class BG(Enum):
|
||||
class Msg:
|
||||
MAGIC = 1919810
|
||||
|
||||
def __init__(self):
|
||||
self.ts = time.time_ns()
|
||||
|
||||
@classmethod
|
||||
def decode_base(cls, data: bytes) -> 'Msg':
|
||||
return cls(**json.loads(data.decode()))
|
||||
j = json.loads(data.decode())
|
||||
j2 = j.copy()
|
||||
if 'ts' in j:
|
||||
del j2['ts']
|
||||
c = cls(**j2)
|
||||
if 'ts' in j:
|
||||
c.ts = j['ts']
|
||||
return c
|
||||
|
||||
def encode_ts(self):
|
||||
if not hasattr(self, 'ts'):
|
||||
self.ts = time.time_ns()
|
||||
return struct.pack('Q', self.ts)
|
||||
|
||||
def encode(self) -> bytes:
|
||||
return json.dumps(self.__dict__).encode()
|
||||
@ -79,10 +95,12 @@ class Msg:
|
||||
|
||||
@classmethod
|
||||
def decode_msg(cls, msg: bytes):
|
||||
magic, eid = struct.unpack('II', msg[:8])
|
||||
magic, eid, ts = struct.unpack('IIQ', msg[:16])
|
||||
assert magic == cls.MAGIC
|
||||
class_: 'Msg' = globals()[BG(eid).name]
|
||||
return class_.decode(msg[8:])
|
||||
msg2 = class_.decode(msg[16:])
|
||||
msg2.ts = ts
|
||||
return msg2
|
||||
|
||||
@classmethod
|
||||
def eid(cls):
|
||||
@ -93,7 +111,7 @@ class Msg:
|
||||
return struct.pack('I', cls.MAGIC)
|
||||
|
||||
def encode_msg(self):
|
||||
return self.magic() + self.eid() + self.encode()
|
||||
return self.magic() + self.eid() + self.encode_ts() + self.encode()
|
||||
|
||||
@property
|
||||
def dict(self):
|
||||
@ -154,18 +172,22 @@ class NodeOnlineMsg(Msg):
|
||||
class StrMsg(Msg):
|
||||
value: str = ''
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class IntMsg(Msg):
|
||||
value: int = 0
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class KeyPressMsg(StrMsg):
|
||||
pass
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class InterruptMsg(StrMsg):
|
||||
pass
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class BoolMsg(Msg):
|
||||
value: bool
|
||||
@ -197,9 +219,11 @@ class DeviceConnectedMsg(BoolMsg):
|
||||
class DeviceOnlineMsg(BoolMsg):
|
||||
pass
|
||||
|
||||
|
||||
class MaxMsg(IntMsg):
|
||||
pass
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class SetRecordMsg(Msg):
|
||||
enable: bool
|
||||
@ -524,6 +548,17 @@ if __name__ == '__main__':
|
||||
# c2 = c.decode(c.encode())
|
||||
# print(c2.sender, c2.meta, c2.data, c2._header)
|
||||
|
||||
rfmat = RfMat(np.array([1, 2, 3]), RfFrameMeta(), RfSequenceMeta())
|
||||
e = RfMatMsg(rfmat).encode()
|
||||
d = RfMatMsg.decode(e)
|
||||
# rfmat = RfMat(np.array([1, 2, 3]), RfFrameMeta(), RfSequenceMeta())
|
||||
# e = RfMatMsg(rfmat).encode()
|
||||
# d = RfMatMsg.decode(e)
|
||||
r = RobotRtsiMsg([], [])
|
||||
r2 = r.decode_msg(r.encode_msg())
|
||||
r3 = r2.decode_msg(r2.encode_msg())
|
||||
print(r.ts)
|
||||
print(r2.ts)
|
||||
print(r3.ts)
|
||||
|
||||
r = RobotRtsiMsg([], [])
|
||||
r2 = r.decode_msg(r.encode_msg())
|
||||
print(r.ts)
|
||||
print(r2.ts)
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import struct
|
||||
from pathlib import Path
|
||||
|
||||
from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
|
||||
@ -37,3 +38,9 @@ class RfFrameMemory(RfFrame):
|
||||
|
||||
def __bytes__(self):
|
||||
return self.data
|
||||
|
||||
|
||||
def b2t(b: bytes):
|
||||
_, sequence_id, ts, encoder = struct.unpack_from('=IQQi', b)
|
||||
buffer = b[4 + 8 + 8 + 4:]
|
||||
return ts, sequence_id, encoder, buffer
|
||||
|
||||
@ -47,9 +47,8 @@ class RfMeta:
|
||||
arr.append(f'{p2a[p]}={vs}')
|
||||
return ",".join(arr)
|
||||
|
||||
@property
|
||||
def filename(self):
|
||||
return self.name + '.bin'
|
||||
def filename(self, ts=0):
|
||||
return self.name + f'.{ts}bin'
|
||||
|
||||
@classmethod
|
||||
def from_path(clz, path: Path | str):
|
||||
|
||||
@ -2,6 +2,7 @@ import dataclasses
|
||||
import hashlib
|
||||
import inspect
|
||||
import sys
|
||||
import time
|
||||
from enum import Enum
|
||||
from pathlib import Path, PosixPath
|
||||
|
||||
@ -64,6 +65,7 @@ class Decorator(object):
|
||||
class DC:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def f1(self, arg):
|
||||
print('f1', arg)
|
||||
|
||||
@ -71,6 +73,10 @@ class DC:
|
||||
print('f2', arg)
|
||||
|
||||
|
||||
class E1:
|
||||
a = 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# print(sys.argv)
|
||||
# print(dir(ASD()))
|
||||
@ -97,6 +103,12 @@ if __name__ == '__main__':
|
||||
# print(3)
|
||||
# case _:
|
||||
# print(2)
|
||||
dc = DC()
|
||||
dc.f1(11,cond=False)
|
||||
dc.f2(22)
|
||||
# dc = DC()
|
||||
# dc.f1(11,cond=False)
|
||||
# dc.f2(22)
|
||||
|
||||
a = E1()
|
||||
b = E1()
|
||||
a.a = 1413
|
||||
print(b.a)
|
||||
print()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user