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.seq_meta = RfSequenceMeta.from_name(msg.name)
self.send(SeqMetaMsg('live', msg.name)) self.send(SeqMetaMsg('live', msg.name))
elif isinstance(msg, RequestRfFrameMsg): elif isinstance(msg, RequestRfFrameMsg):
raise NotImplementedError()
if self.switch: if self.switch:
braw = self.get_data() braw = self.get_data()
if braw == b'': if braw == b'':

View File

@ -11,7 +11,7 @@ from flandre.nodes.Device import Device, DeviceCmd
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, \ from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, \
ImagingConfigNameListMsg, BeamformerMsg, RobotRtsiMsg, SeqMetaMsg, DeviceEnabledMsg, RfFrameMsg 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 from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -79,8 +79,8 @@ class Muxer(Node):
# todo fixit driver no empty # todo fixit driver no empty
self.rep_socket.send(BeamformerMsg(b'nop').encode_msg()) self.rep_socket.send(BeamformerMsg(b'nop').encode_msg())
return return
_, sequence_id, encoder = struct.unpack_from('=IQi', self.driver_data_raw) # _, sequence_id, encoder = struct.unpack_from('=IQi', self.driver_data_raw)
driver_data_body = self.driver_data_raw[4 + 8 + 4:] ts, sequence_id, encoder, driver_data_body = b2t(self.driver_data_raw)
data_msg = RfFrameMsg(0, RfFrameMemory( data_msg = RfFrameMsg(0, RfFrameMemory(
RfFrameMeta( RfFrameMeta(
encoder=encoder, encoder=encoder,

View File

@ -1,3 +1,4 @@
import json
import logging import logging
import struct import struct
from pathlib import Path from pathlib import Path
@ -9,6 +10,7 @@ from flandre.config import C
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \ from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \
RequestRfFrameMsg, RecordFrameMsg, RobotRtsiMsg, SeqMetaMsg RequestRfFrameMsg, RecordFrameMsg, RobotRtsiMsg, SeqMetaMsg
from flandre.utils.RfFrame import b2t
from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -25,6 +27,8 @@ class Recorder(Node):
self.record_commit = None self.record_commit = None
self.record_path: Path | None = None self.record_path: Path | None = None
self.play_mode = None self.play_mode = None
self.arr: list[RobotRtsiMsg] = []
self.isrecord = False
def loop(self): def loop(self):
self.rtsi = RobotRtsiMsg( self.rtsi = RobotRtsiMsg(
@ -39,8 +43,7 @@ class Recorder(Node):
for k in socks: for k in socks:
if k == device_socket: if k == device_socket:
buffer = device_socket.recv() buffer = device_socket.recv()
_, sequence_id, encoder = struct.unpack_from('=IQi', buffer) ts, sequence_id, encoder, s = b2t(buffer)
s = buffer[4 + 8 + 4:]
if self.seq_meta_live is not None and s.__len__() // 2 == np.prod(self.seq_meta_live.shape): if self.seq_meta_live is not None and s.__len__() // 2 == np.prod(self.seq_meta_live.shape):
(self.record_path / RfFrameMeta( (self.record_path / RfFrameMeta(
encoder=encoder, encoder=encoder,
@ -57,7 +60,7 @@ class Recorder(Node):
robot_force_roll=self.rtsi.force[3], robot_force_roll=self.rtsi.force[3],
robot_force_pitch=self.rtsi.force[4], robot_force_pitch=self.rtsi.force[4],
robot_force_yal=self.rtsi.force[5], robot_force_yal=self.rtsi.force[5],
).filename).write_bytes(s) ).filename(ts)).write_bytes(s)
self.send(RecordFrameMsg(s.__len__(), sequence_id)) self.send(RecordFrameMsg(s.__len__(), sequence_id))
if k == self.c.sub: if k == self.c.sub:
msg = self.recv() msg = self.recv()
@ -71,6 +74,8 @@ class Recorder(Node):
elif isinstance(msg, SetRecordMsg): elif isinstance(msg, SetRecordMsg):
self.record_enable = msg.enable self.record_enable = msg.enable
if msg.enable: if msg.enable:
self.isrecord = True
self.arr.clear()
seq_meta = self.seq_meta_live seq_meta = self.seq_meta_live
self.record_commit = msg.commit self.record_commit = msg.commit
seq_meta.commit = msg.commit seq_meta.commit = msg.commit
@ -79,6 +84,14 @@ class Recorder(Node):
self.record_path = p self.record_path = p
device_socket.connect(C.live_push_socket) device_socket.connect(C.live_push_socket)
else: else:
self.isrecord = False
device_socket.disconnect(C.live_push_socket) 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): elif isinstance(msg, RobotRtsiMsg):
self.rtsi = msg self.rtsi = msg
if self.isrecord:
self.arr.append(self.rtsi)

View File

@ -1,6 +1,7 @@
import dataclasses import dataclasses
import json import json
import struct import struct
import time
from enum import auto, Enum from enum import auto, Enum
from pathlib import Path from pathlib import Path
@ -66,9 +67,24 @@ class BG(Enum):
class Msg: class Msg:
MAGIC = 1919810 MAGIC = 1919810
def __init__(self):
self.ts = time.time_ns()
@classmethod @classmethod
def decode_base(cls, data: bytes) -> 'Msg': 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: def encode(self) -> bytes:
return json.dumps(self.__dict__).encode() return json.dumps(self.__dict__).encode()
@ -79,10 +95,12 @@ class Msg:
@classmethod @classmethod
def decode_msg(cls, msg: bytes): 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 assert magic == cls.MAGIC
class_: 'Msg' = globals()[BG(eid).name] class_: 'Msg' = globals()[BG(eid).name]
return class_.decode(msg[8:]) msg2 = class_.decode(msg[16:])
msg2.ts = ts
return msg2
@classmethod @classmethod
def eid(cls): def eid(cls):
@ -93,7 +111,7 @@ class Msg:
return struct.pack('I', cls.MAGIC) return struct.pack('I', cls.MAGIC)
def encode_msg(self): def encode_msg(self):
return self.magic() + self.eid() + self.encode() return self.magic() + self.eid() + self.encode_ts() + self.encode()
@property @property
def dict(self): def dict(self):
@ -154,18 +172,22 @@ class NodeOnlineMsg(Msg):
class StrMsg(Msg): class StrMsg(Msg):
value: str = '' value: str = ''
@dataclasses.dataclass @dataclasses.dataclass
class IntMsg(Msg): class IntMsg(Msg):
value: int = 0 value: int = 0
@dataclasses.dataclass @dataclasses.dataclass
class KeyPressMsg(StrMsg): class KeyPressMsg(StrMsg):
pass pass
@dataclasses.dataclass @dataclasses.dataclass
class InterruptMsg(StrMsg): class InterruptMsg(StrMsg):
pass pass
@dataclasses.dataclass @dataclasses.dataclass
class BoolMsg(Msg): class BoolMsg(Msg):
value: bool value: bool
@ -197,9 +219,11 @@ class DeviceConnectedMsg(BoolMsg):
class DeviceOnlineMsg(BoolMsg): class DeviceOnlineMsg(BoolMsg):
pass pass
class MaxMsg(IntMsg): class MaxMsg(IntMsg):
pass pass
@dataclasses.dataclass @dataclasses.dataclass
class SetRecordMsg(Msg): class SetRecordMsg(Msg):
enable: bool enable: bool
@ -524,6 +548,17 @@ if __name__ == '__main__':
# c2 = c.decode(c.encode()) # c2 = c.decode(c.encode())
# print(c2.sender, c2.meta, c2.data, c2._header) # print(c2.sender, c2.meta, c2.data, c2._header)
rfmat = RfMat(np.array([1, 2, 3]), RfFrameMeta(), RfSequenceMeta()) # rfmat = RfMat(np.array([1, 2, 3]), RfFrameMeta(), RfSequenceMeta())
e = RfMatMsg(rfmat).encode() # e = RfMatMsg(rfmat).encode()
d = RfMatMsg.decode(e) # 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 pathlib import Path
from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
@ -37,3 +38,9 @@ class RfFrameMemory(RfFrame):
def __bytes__(self): def __bytes__(self):
return self.data 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}') arr.append(f'{p2a[p]}={vs}')
return ",".join(arr) return ",".join(arr)
@property def filename(self, ts=0):
def filename(self): return self.name + f'.{ts}bin'
return self.name + '.bin'
@classmethod @classmethod
def from_path(clz, path: Path | str): def from_path(clz, path: Path | str):

View File

@ -2,6 +2,7 @@ import dataclasses
import hashlib import hashlib
import inspect import inspect
import sys import sys
import time
from enum import Enum from enum import Enum
from pathlib import Path, PosixPath from pathlib import Path, PosixPath
@ -64,6 +65,7 @@ class Decorator(object):
class DC: class DC:
def __init__(self): def __init__(self):
pass pass
def f1(self, arg): def f1(self, arg):
print('f1', arg) print('f1', arg)
@ -71,6 +73,10 @@ class DC:
print('f2', arg) print('f2', arg)
class E1:
a = 1
if __name__ == '__main__': if __name__ == '__main__':
# print(sys.argv) # print(sys.argv)
# print(dir(ASD())) # print(dir(ASD()))
@ -97,6 +103,12 @@ if __name__ == '__main__':
# print(3) # print(3)
# case _: # case _:
# print(2) # print(2)
dc = DC() # dc = DC()
dc.f1(11,cond=False) # dc.f1(11,cond=False)
dc.f2(22) # dc.f2(22)
a = E1()
b = E1()
a.a = 1413
print(b.a)
print()