quisk-kc4upr/n2adr/uhf_widgets.py

146 lines
6.0 KiB
Python
Executable File

# Please do not change this widgets module for Quisk. Instead copy
# it to your own quisk_widgets.py and make changes there.
#
# This module is used to add extra widgets to the QUISK screen.
from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
import wx, time
import _quisk as QS
class BottomWidgets: # Add extra widgets to the bottom of the screen
def __init__(self, app, hardware, conf, frame, gbs, vertBox):
self.config = conf
self.hardware = hardware
self.application = app
self.correct_screen = None
self.num_rows_added = 1
start_row = app.widget_row # The first available row
start_col = app.button_start_col # The start of the button columns
b = app.QuiskPushbutton(frame, hardware.TestVfoPlus, 'Adf+')
bw, bh = b.GetMinSize()
gbs.Add(b, (start_row, start_col), flag=wx.EXPAND)
b = app.QuiskPushbutton(frame, hardware.TestVfoMinus, 'Adf-')
gbs.Add(b, (start_row, start_col + 1), flag=wx.EXPAND)
b = app.QuiskPushbutton(frame, self.OnBtnCorrect, 'Corr')
gbs.Add(b, (start_row, start_col + 2), flag=wx.EXPAND)
self.status_label = app.QuiskText(frame, 'Ready', bh)
gbs.Add(self.status_label, (start_row, start_col + 3), (1, 24), flag=wx.EXPAND)
def UpdateText(self, text):
self.status_label.SetLabel(text)
def OnBtnCorrect(self, event):
if self.correct_screen:
self.correct_screen.Raise()
else:
self.correct_screen = QCorrect(self, self.application.width)
class QCorrect(wx.Frame):
"""Create a window with DC adjustment controls"""
f_DcI = "DC adjustment for In-Phase %.6f"
f_DcQ = "DC adjustment for Quadrature %.6f"
def __init__(self, parent, width):
self.parent = parent
self.application = parent.application
self.config = parent.config
self.hardware = parent.hardware
t = "DC Null Adjustment"
wx.Frame.__init__(self, self.application.main_frame, -1, t, pos=(50, 100), style=wx.CAPTION)
panel = wx.Panel(self)
self.MakeControls(panel, width)
self.Show()
def MakeControls(self, panel, width): # Make controls for DC adjustment
self.old_DcI = self.DcI = self.hardware.DcI
self.old_DcQ = self.DcQ = self.hardware.DcQ
self.hardware.NewUdpCorrect(self.DcI, self.DcQ)
sl_max = width * 4 // 10 # maximum +/- value for slider
self.dc_scale = float(0.3) / sl_max
font = wx.Font(self.config.default_font_size, wx.FONTFAMILY_SWISS, wx.NORMAL,
wx.FONTWEIGHT_NORMAL, False, self.config.quisk_typeface)
chary = self.GetCharHeight()
y = chary * 3 // 10
self.t_DcI = wx.StaticText(panel, -1, self.f_DcI % self.old_DcI, pos=(0, y))
self.t_DcI.SetFont(font)
y += self.t_DcI.GetSize().GetHeight()
self.DcI1 = wx.Slider(panel, -1, 0, -sl_max, sl_max,
pos=(0, y), size=(width, -1))
y += self.DcI1.GetSize().GetHeight()
self.DcI2 = wx.Slider(panel, -1, 0, -sl_max, sl_max,
pos=(0, y), size=(width, -1))
y += self.DcI2.GetSize().GetHeight()
self.PositionDcI(self.old_DcI)
self.t_DcQ = wx.StaticText(panel, -1, self.f_DcQ % self.old_DcQ, pos=(0, y))
self.t_DcQ.SetFont(font)
y += self.t_DcQ.GetSize().GetHeight()
self.DcQ1 = wx.Slider(panel, -1, 0, -sl_max, sl_max,
pos=(0, y), size=(width, -1))
y += self.DcQ1.GetSize().GetHeight()
self.DcQ2 = wx.Slider(panel, -1, 0, -sl_max, sl_max,
pos=(0, y), size=(width, -1))
y += self.DcQ2.GetSize().GetHeight()
sv = self.application.QuiskPushbutton(panel, self.OnBtnSave, 'Save')
cn = self.application.QuiskPushbutton(panel, self.OnBtnCancel, 'Cancel')
w, h = cn.GetSize().Get()
sv.SetSize((w, h))
y += h // 4
x = (width - w * 3) // 4
sv.SetPosition((x, y))
cn.SetPosition((x*3 + w*2, y))
sv.SetBackgroundColour('light blue')
cn.SetBackgroundColour('light blue')
y += h
y += h // 4
self.DcI1.SetBackgroundColour('aquamarine')
self.DcI2.SetBackgroundColour('orange')
self.DcQ1.SetBackgroundColour('aquamarine')
self.DcQ2.SetBackgroundColour('orange')
self.PositionDcQ(self.old_DcQ)
self.SetClientSize(wx.Size(width, y))
self.DcI1.Bind(wx.EVT_SCROLL, self.OnChange)
self.DcI2.Bind(wx.EVT_SCROLL, self.OnFineDcI)
self.DcQ1.Bind(wx.EVT_SCROLL, self.OnChange)
self.DcQ2.Bind(wx.EVT_SCROLL, self.OnFineDcQ)
def PositionDcI(self, dc): # set pos1, pos2 for I
pos2 = round(dc / self.dc_scale)
remain = dc - pos2 * self.dc_scale
pos1 = round(remain / self.dc_scale * 50.0)
self.DcI1.SetValue(pos1)
self.DcI2.SetValue(pos2)
def PositionDcQ(self, dc): # set pos1, pos2 for Q
pos2 = round(dc / self.dc_scale)
remain = dc - pos2 * self.dc_scale
pos1 = round(remain / self.dc_scale * 50.0)
self.DcQ1.SetValue(pos1)
self.DcQ2.SetValue(pos2)
def OnChange(self, event):
dc = self.dc_scale * self.DcI1.GetValue() / 50.0 + self.dc_scale * self.DcI2.GetValue()
if abs(dc) < self.dc_scale * 3.0 / 50.0:
dc = 0.0
self.t_DcI.SetLabel(self.f_DcI % dc)
self.DcI = dc
dc = self.dc_scale * self.DcQ1.GetValue() / 50.0 + self.dc_scale * self.DcQ2.GetValue()
if abs(dc) < self.dc_scale * 3.0 / 50.0:
dc = 0.0
self.t_DcQ.SetLabel(self.f_DcQ % dc)
self.DcQ = dc
self.hardware.NewUdpCorrect(self.DcI, self.DcQ)
def OnFineDcI(self, event): # re-center the fine slider when the coarse slider is adjusted
dc = self.dc_scale * self.DcI1.GetValue() / 50.0 + self.dc_scale * self.DcI2.GetValue()
self.PositionDcI(dc)
self.OnChange(event)
def OnFineDcQ(self, event): # re-center the fine slider when the coarse slider is adjusted
dc = self.dc_scale * self.DcQ1.GetValue() / 50.0 + self.dc_scale * self.DcQ2.GetValue()
self.PositionDcQ(dc)
self.OnChange(event)
def OnBtnSave(self, event):
self.hardware.CorrectTxDc[self.hardware.band] = (self.hardware.tx_frequency * 1E-6, self.DcI, self.DcQ)
self.hardware.PrintUdpCorrect()
self.parent.correct_screen = None
self.Destroy()
def OnBtnCancel(self, event=None):
self.hardware.NewUdpCorrect(self.old_DcI, self.old_DcQ)
self.parent.correct_screen = None
self.Destroy()