aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gr-fadingui/grc/fadingui_datasource.block.yml13
-rw-r--r--src/gr-fadingui/python/datasource.py46
2 files changed, 42 insertions, 17 deletions
diff --git a/src/gr-fadingui/grc/fadingui_datasource.block.yml b/src/gr-fadingui/grc/fadingui_datasource.block.yml
index 67f0275..5f34591 100644
--- a/src/gr-fadingui/grc/fadingui_datasource.block.yml
+++ b/src/gr-fadingui/grc/fadingui_datasource.block.yml
@@ -1,10 +1,10 @@
id: fadingui_datasource
-label: UI Data Source
+label: UI Framed Data Source
category: '[fadingui]'
templates:
imports: import fadingui
- make: fadingui.datasource(vec_len=${vec_len}, sock_addr=${sock_addr}, file_list=${file_list})
+ make: fadingui.datasource(vec_len=${vec_len}, header_len=${header_len}, sock_addr=${sock_addr}, file_list=${file_list})
# Make one 'parameters' list entry for every parameter you want settable from the GUI.
# Keys include:
@@ -15,7 +15,12 @@ parameters:
- id: vec_len
label: Vector length
dtype: int
- default: 512
+ default: 501
+
+- id: header_len
+ label: Header length
+ dtype: int
+ default: 11
- id: sock_addr
label: Socket Address
@@ -40,7 +45,7 @@ outputs:
- label: out
domain: stream
dtype: byte
- vlen: ${vec_len}
+ vlen: ${ vec_len + header_len }
# 'file_format' specifies the version of the GRC yml format used in the file
# and should usually not be changed.
diff --git a/src/gr-fadingui/python/datasource.py b/src/gr-fadingui/python/datasource.py
index 2a54ce3..1914d33 100644
--- a/src/gr-fadingui/python/datasource.py
+++ b/src/gr-fadingui/python/datasource.py
@@ -28,14 +28,19 @@ class datasource(gr.sync_block):
"""
Loads data from a file choosen in the graphical user interface.
"""
- def __init__(self, vec_len, sock_addr, file_list):
+
+ HEADER_LEN = 11;
+
+ def __init__(self, vec_len, header_len, sock_addr, file_list):
+ # FIXME: find a better solution
+ assert(header_len == datasource.HEADER_LEN)
+
gr.sync_block.__init__(self,
name="datasource",
in_sig=None,
- out_sig=[np.dtype('{vec_len}b')])
+ out_sig=[np.dtype(f'{vec_len + header_len}b')])
# parameters
- self.header_size = 11
self.vec_len = vec_len
self.sock_addr = sock_addr
self.file_list = file_list
@@ -45,40 +50,55 @@ class datasource(gr.sync_block):
self.fsize = None
self.fpos = 0
+ # cache
+ self.header_cache = None
+
# TODO: make it possible to choose from UI
self.load_file(file_list[0])
def load_file(self, fname):
self.fdata = np.fromfile(fname, np.byte)
- self.fsize = len(self.data)
+ self.fsize = len(self.fdata)
# TODO: remove debugging statements
print(f"datasource: loaded file size={self.fsize}, head:")
print(self.fdata[:10])
- def make_frame(self, data_size):
+ def make_header(self, data_size):
# TODO: check that data_size is not too big
pilot = 0x1248
header = f"p{pilot:04x}s{data_size:04x}d".encode("ascii")
- arr = np.array(bytearray(header))
-
- assert(len(arr) == self.header_size)
+ arr = np.frombuffer(header, dtype=np.dtype("byte"))
return arr
def work(self, input_items, output_items):
out = output_items[0]
+ print(self.fpos)
if self.fpos + self.vec_len > self.fsize:
+ # FIXME: repair broken code below
+ self.fpos = 0
+ return 0;
+
rest = self.fsize - self.fpos
- out[:rest] = self.fdata[self.fpos:rest]
- out[rest:] = 0 # TODO: replace with 01010101.. seq or scramble
+ # cannot use cached header
+ header = self.make_header(rest)
+ data = self.fdata[self.fpos:rest]
+
+ frame_size = datasource.HEADER_LEN + rest
+ out[:] = np.concatenate([header, data])
self.fpos = 0
- return 0
+ return rest
- out[:] = self.fdata[self.fpos:self.fpos + self.vec_len]
- self.fpos += self.vec_len
+ if self.header_cache == None:
+ self.header = self.make_header(self.vec_len)
+ data = self.fdata[self.fpos:self.fpos + self.vec_len]
+
+ out[:] = np.concatenate([self.header, data])
+
+ self.fpos += self.vec_len
return len(output_items[0])