Skip to content

Commit

Permalink
Add Check Hex String block
Browse files Browse the repository at this point in the history
Checks data from input port from "Starting Position" on for a "Hex String".

    If the incoming string matches the entered string, data will be passed to output port "ok", else to "fail".

    Example for a match:

    Entered block parameters:
    "Hex String" = 4450304E4641	(ASCII for DP0NFA)
    "Starting Position" = 10		(Starts counting from 0 on)

    Data coming into input port: "02300400000000003D0E4450304E4641000100C300B7142EF90F9C06290000000"

(cherry picked from commit e191a1e)
  • Loading branch information
DL7NDR authored and daniestevez committed Jan 4, 2025
1 parent add8005 commit 2f8cdd5
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 0 deletions.
1 change: 1 addition & 0 deletions grc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ install(FILES
satellites_check_crc16_ccitt_false.block.yml
satellites_check_crc.block.yml
satellites_check_eseo_crc.block.yml
satellites_check_hex_string.block.yml
satellites_check_swiatowid_crc.block.yml
satellites_check_tt64_crc.block.yml
satellites_convolutional_encoder.block.yml
Expand Down
48 changes: 48 additions & 0 deletions grc/satellites_check_hex_string.block.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# auto-generated by grc.converter

id: satellites_check_hex_string
label: Check Hex String
category: '[Satellites]/Misc'

parameters:
- id: hexstring
label: Hex String
dtype: string
default: "c0ffee"

- id: startindex
label: Starting Position
dtype: int
default: 0

inputs:
- domain: message
id: in

outputs:
- domain: message
id: ok
optional: true
- domain: message
id: fail
optional: true

templates:
imports: import satellites
make: satellites.check_hex_string(${hexstring}, ${startindex})

documentation: |-
Checks data from input port from "Starting Position" on for a "Hex String".
If the incoming string matches the entered string, data will be passed to output port "ok", else to "fail".
Example for a match:
Entered block parameters:
"Hex String" = 4450304E4641 (ASCII for DP0NFA)
"Starting Position" = 10 (Starts counting from 0 on)
Data coming into input port: "02300400000000003D0E4450304E4641000100C300B7142EF90F9C06290000000"
file_format: 1
1 change: 1 addition & 0 deletions python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ GR_PYTHON_INSTALL(
check_crc16_ccitt_false.py
check_crc.py
check_eseo_crc.py
check_hex_string.py
check_swiatowid_crc.py
check_tt64_crc.py
crc32c.py
Expand Down
1 change: 1 addition & 0 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
from .check_crc16_ccitt_false import check_crc16_ccitt_false
from .check_crc import check_crc
from .check_eseo_crc import check_eseo_crc
from .check_hex_string import check_hex_string
from .check_swiatowid_crc import check_swiatowid_crc
from .check_tt64_crc import check_tt64_crc
from .eseo_line_decoder import eseo_line_decoder
Expand Down
50 changes: 50 additions & 0 deletions python/check_hex_string.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Copyright 2024 DL7NDR Daniel (https://www.qrz.com/db/DL7NDR)
#
# This file is part of gr-satellites
#
# SPDX-License-Identifier: GPL-3.0-or-later
#


from gnuradio import gr
import pmt


class check_hex_string(gr.basic_block):
"""
Checks incoming hex string from a specified position
for a given hex string.
"""
def __init__(self, hexstring, startindex=0):
gr.basic_block.__init__(
self,
name='check_hex_string',
in_sig=[],
out_sig=[])

self.hexstring = bytes.fromhex(hexstring)
self.startindex = startindex

self.message_port_register_in(pmt.intern('in'))
self.set_msg_handler(pmt.intern('in'), self.handle_msg)
self.message_port_register_out(pmt.intern('ok'))
self.message_port_register_out(pmt.intern('fail'))

def handle_msg(self, msg_pmt):
msg = pmt.cdr(msg_pmt)
if not pmt.is_u8vector(msg):
print('[ERROR] Received invalid message type. Expected u8vector')
return
packet = bytes(pmt.u8vector_elements(msg))

hex_str = packet[self.startindex:self.startindex + len(self.hexstring)]

if hex_str == self.hexstring:
# match
self.message_port_pub(pmt.intern('ok'), msg_pmt)
else:
# no match
self.message_port_pub(pmt.intern('fail'), msg_pmt)

0 comments on commit 2f8cdd5

Please sign in to comment.