diff options
Diffstat (limited to 'gr-qtgui/python/qtgui/graphicoverlay.py')
-rw-r--r-- | gr-qtgui/python/qtgui/graphicoverlay.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/gr-qtgui/python/qtgui/graphicoverlay.py b/gr-qtgui/python/qtgui/graphicoverlay.py new file mode 100644 index 0000000000..defef31d17 --- /dev/null +++ b/gr-qtgui/python/qtgui/graphicoverlay.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2020 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# + +import sys +import threading +import time + +from gnuradio import gr +import pmt + +# This thread just gets us out of the sync_block's init function so the messaging +# system and scheduler are active. +class offloadThread(threading.Thread): + def __init__(self, callback, overlayList, listDelay, repeat): + threading.Thread.__init__(self) + self.callback = callback + self.overlayList = overlayList + self.listDelay = listDelay + self.threadRunning = False + self.stopThread = False + self.repeat = repeat + + def run(self): + self.stopThread = False + self.threadRunning = True + + # Wait for main __init__ to finish + time.sleep(0.5) + + if (type(self.overlayList) == list and self.listDelay > 0.0): + while self.repeat and not self.stopThread: + for curItem in self.overlayList: + self.callback(curItem) + + if self.stopThread: + break + + time.sleep(self.listDelay) + + if self.stopThread: + break + else: + self.callback(self.overlayList) + + self.threadRunning = False + +class GrGraphicOverlay(gr.sync_block): + """ + This block is an example of how to feed an overlay to a graphic item. + The graphic item overlay is expecting a dictionary with the following + keys: 'filename','x','y', and optionally a 'scalefactor'. A list of + dictionaries can also be supplied to support multiple items. + + Any file can be added to the graphic item as an overlay and the + particular item indexed by its filename can be updated by passing + in new x/y coordinates. To remove an overlay, use coordinates -1,-1 + for the x,y coordinates. + + This sample block sends either a dictionary or list of dictionaries + to the graphicitem block. To test updating a single overlay item, + you can use a list with the same file but different coordinates and + use the update delay > 0.0 to animate it. + """ + def __init__(self, overlayList, listDelay, repeat): + gr.sync_block.__init__(self, name="GrGraphicsOverlay", in_sig=None, + out_sig=None) + + self.overlayList = overlayList + self.listDelay = listDelay + if type(self.overlayList) is not dict and type(self.overlayList) is not list: + gr.log.error("The specified input is not valid. " + "Please specify either a dictionary item with the following keys: " + "'filename','x','y'[,'scalefactor'] or a list of dictionary items.") + sys.exit(1) + + self.message_port_register_out(pmt.intern("overlay")) + + self.thread = offloadThread(self.overlayCallback, self.overlayList, listDelay, + repeat) + self.thread.start() + + def overlayCallback(self, msgData): + # Need to let init finish before this can be called so need to thread it out. + meta = pmt.to_pmt(msgData) + pdu = pmt.cons(meta, pmt.PMT_NIL) + self.message_port_pub(pmt.intern('overlay'), pdu) + + def stop(self): + self.thread.stopThread = True + + while self.thread.threadRunning: + time.sleep(0.1) + + return True + |