diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gr-fadingui/grc/fadingui_datasource.block.yml | 13 | ||||
-rw-r--r-- | src/gr-fadingui/python/datasource.py | 46 |
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]) |