aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsrc/sketch.py171
1 files changed, 51 insertions, 120 deletions
diff --git a/src/sketch.py b/src/sketch.py
index b7500c8..5f170b2 100755
--- a/src/sketch.py
+++ b/src/sketch.py
@@ -19,14 +19,24 @@ import numpy as np
# Our interface for simulation / hardware
import qpsk
+# For debugging
+import logging
+
+#================================================
+# Debugging tools
+
+logging.basicConfig(format="[%(levelname)s] %(asctime)s %(message)s", level=logging.DEBUG)
+logger = logging.getLogger(__name__)
+
+#================================================
+# Initialize DearPyGUI
-# Create GL context and initialize DearPyGUI
create_context()
create_viewport()
setup_dearpygui()
# Show demo for dev
-show_demo()
+# show_demo()
#================================================
# Custom GNURadio blocks
@@ -43,15 +53,16 @@ class pygui_plot_block(gr.sync_block):
# TODO: parametrize with nsamples
self.buffer = np.linspace(0, 1, 1000)
- def construct_gui(self, width, height):
+ def construct_gui(self, width, height, **kwargs):
# Create plot
- with plot(label=self.title, height=height, width=width):
+ with plot(label=self.title, height=height, width=width, **kwargs):
add_plot_legend()
add_plot_axis(mvXAxis, label=self.xlabel)
add_plot_axis(mvYAxis, label=self.ylabel)
def work(self, input_items, output_items):
# This is a sink (no output)
+ # TODO: add samples to display buffer
return 0
@@ -64,26 +75,34 @@ class pygui_constellation_block(gr.sync_block):
self.xlabel = xlabel
selt.ylabel = ylabel
+ def construct_gui(self, width, height, **kwargs):
+ # TODO: Create a widget based ons scatter plot
+ pass
+
+ def work(self, input_items, output_items):
+ # This is a sink (no output)
+ # TODO: add samples to display buffer
+ return 0
+
#================================================
# GUI Callback functions
-def _on_flowgraph_close():
- pass
-
-def _on_rx_node_link(sender, app_data):
+# Flow graph window
+def on_rx_node_link(sender, app_data):
link_id_1, link_id_2 = app_data
- print(app_data)
add_node_link(link_id_1, link_id_2, parent=sender)
-def _on_rx_node_delink(sender, app_data):
+def on_rx_node_delink(sender, app_data):
link_id = app_data
delete_item(link_id)
#================================================
# Set up GNURadio simulation
+# Global variables, yes I know they are ugly
sim = qpsk.qpsk_nogui()
+sim_running = False
# Catch signals
def sim_sig_handler(sig=None, frame=None):
@@ -96,37 +115,38 @@ signal.signal(signal.SIGINT, sim_sig_handler)
signal.signal(signal.SIGTERM, sim_sig_handler);
# Add GUI blocks
-locked_time_plot = pygui_plot_block(title="Locked signal", xlabel="t")
+locked_time_plot = pygui_plot_block(title="Locked signal", ylabel="Amplitude", xlabel="Time")
sim.connect((sim.digital_costas_loop_cc_0, 0), (locked_time_plot, 0))
#================================================
-# Simulation Control Window
+# Settings Window
+
+with window(label="Settings", width=200, height=400, pos=(25, 450), tag="sim_win"):
+ add_button(label="Toggle Fullscreen", callback= toggle_viewport_fullscreen)
-with window(label="Simulation", width=200, height=400, pos=(25, 450), tag="sim_win"):
- add_text("Simulation state:")
+ add_text("Simulation running:")
+ add_text("false", tag="sim_running_lbl")
with group(horizontal=True):
def on_sim_start_btn_clicked():
sim.start()
-
- configure_item("sim_start_btn", enabled=False)
- configure_item("sim_stop_btn", enabled=True)
+ sim_runnig = True
+ logger.debug("Started simulation")
def on_sim_stop_btn_clicked():
sim.stop()
sim.wait()
-
- configure_item("sim_start_btn", enabled=True)
- configure_item("sim_stop_btn", enabled=False)
+ sim_running = False
+ logger.debug("Stopped simulation")
add_button(label="Start", tag="sim_start_btn", callback=on_sim_start_btn_clicked)
- add_button(label="Stop", enabled=False, tag="sim_stop_btn", callback=on_sim_stop_btn_clicked)
+ add_button(label="Stop", tag="sim_stop_btn", callback=on_sim_stop_btn_clicked)
#================================================
# Flow Graph Window
-with window(label="RX DSP Flow Graph", width=800, height=400, on_close=_on_flowgraph_close, pos=(25,25), tag="rx_win"):
- with node_editor(callback=_on_rx_node_link, delink_callback=_on_rx_node_delink):
+with window(label="RX DSP Flow Graph", width=800, height=400, pos=(25,25), tag="rx_win"):
+ with node_editor(callback=on_rx_node_link, delink_callback=on_rx_node_delink):
with node(label="USRP Source", pos=(20,100)):
with node_attribute(tag="src_out", attribute_type=mvNode_Attr_Output):
add_text("Signal from antenna")
@@ -142,12 +162,12 @@ with window(label="RX DSP Flow Graph", width=800, height=400, on_close=_on_flowg
with node_attribute(tag="eq_in", attribute_type=mvNode_Attr_Input):
add_text("Input")
- with node_attribute(tag="eq_out", attribute_type=mvNode_Attr_Output):
- add_text("Equalized")
-
with node_attribute(attribute_type=mvNode_Attr_Static):
add_knob_float(label="Gain")
+ with node_attribute(tag="eq_out", attribute_type=mvNode_Attr_Output):
+ add_text("Equalized")
+
with node(label="Phase Locked Loop", pos=(600, 200)):
with node_attribute(tag="pll_in", attribute_type=mvNode_Attr_Input):
add_text("Input")
@@ -167,98 +187,8 @@ with window(label="RX DSP Flow Graph", width=800, height=400, on_close=_on_flowg
with window(label="Time domain plots", width=800, height=400, pos=(850,25), tag="time_plots_win"):
locked_time_plot.construct_gui(width=780, height=300)
-
#================================================
-# QPSK Window
-
-# q = qp.qpsk_nogui()
-
-# with window(label="QPSK", width=1500, height=800, on_close=_on_flowgraph_close, pos=(100,100), tag="rx_win"):
-# with node_editor(callback=_on_rx_node_link, delink_callback=_on_rx_node_delink):
-#
-# with node(label="USRP Source ", pos=(20,100)):
-# with node_attribute(tag="src_out", attribute_type=mvNode_Attr_Output):
-# add_text("Signal Source Random")
-# print(q.analog_random_source_x_0)
-# # TO DO: Signal Plot
-#
-# with node(label="Constellation Modulator", pos=(200,200)):
-# with node_attribute(tag="modul_in", attribute_type=mvNode_Attr_Input):
-# add_text("Input")
-# add_text(f'Sample {q.sps}')
-#
-# with node_attribute(tag="modul_out", attribute_type=mvNode_Attr_Output):
-# add_text("Output")
-#
-# with node(label="Channel Model", pos=(420,100)):
-# with node_attribute(tag="channel_in", attribute_type=mvNode_Attr_Input):
-# add_text("Input")
-#
-# with node_attribute(tag="channel_out", attribute_type=mvNode_Attr_Output):
-# add_text("Output")
-#
-# with node(label="Clock Sync", pos=(550,200)):
-# with node_attribute(tag="clksync_in", attribute_type=mvNode_Attr_Input):
-# add_text("Input")
-#
-# with node_attribute(tag="clksync_out", attribute_type=mvNode_Attr_Output):
-# add_text("Synchronized")
-#
-#
-# with node(label="Equalizer", pos=(700,100)):
-# with node_attribute(attribute_type=mvNode_Attr_Static):
-# add_input_float(label="Gain", width=150)
-#
-# with node_attribute(tag="eq_in", attribute_type=mvNode_Attr_Input):
-# add_text("Input")
-#
-# with node_attribute(tag="eq_out", attribute_type=mvNode_Attr_Output):
-# add_text("Equalized")
-#
-#
-# with node(label="Phase Locked Loop", pos=(950, 200)):
-# with node_attribute(tag="pll_in", attribute_type=mvNode_Attr_Input):
-# add_text("Input")
-#
-# with node_attribute(tag="pll_out", attribute_type=mvNode_Attr_Output):
-# add_text("Locked")
-#
-#
-# add_node_link(get_alias_id("src_out"), get_alias_id("modul_in"))
-# add_node_link(get_alias_id("modul_out"), get_alias_id("channel_in"))
-# add_node_link(get_alias_id("channel_out"), get_alias_id("clksync_in"))
-# add_node_link(get_alias_id("clksync_out"), get_alias_id("eq_in"))
-# add_node_link(get_alias_id("eq_out"), get_alias_id("pll_in"))
-#
-
-
-#================================================
-# Plot Time Window Test
-
-# creating data
-# sindatax = []
-# sindatay = []
-# for i in range(0, 500):
-# sindatax.append(i / 1000)
-# sindatay.append(0.5 + 0.5 * sin(50 * i / 1000))
-#
-# with window(label="Plots"):
-# add_text("Hello world")
-# # create plot
-# with plot(label="Line Series", height=400, width=400):
-# # optionally create legend
-# add_plot_legend()
-#
-# # REQUIRED: create x and y axes
-# add_plot_axis(mvXAxis, label="x")
-# add_plot_axis(mvYAxis, label="y", tag="y_axis")
-#
-# # series belong to a y axis
-# add_line_series(sindatax, sindatay, label="0.5 + 0.5 * sin(x)", parent="y_axis")
-
-#================================================
-
-
+# Start GUI
# Start window and main loop
show_viewport()
@@ -267,6 +197,7 @@ start_dearpygui()
# clean up gui
destroy_context()
-# Stop GNURadio
-sim.stop()
-sim.wait()
+# Stop GNURadio
+if sim_running:
+ sim.stop()
+ sim.wait()