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.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'':
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user