add timestamp

This commit is contained in:
remilia 2025-04-25 22:19:38 +08:00
parent 8fc003cfb3
commit 21fd3e32a6
7 changed files with 86 additions and 19 deletions

View File

@ -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'':

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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):

View File

@ -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()