|
@@ -11,10 +11,7 @@ import pyqtgraph as pg
|
|
|
from math import ceil
|
|
|
import numpy as np
|
|
|
import socket
|
|
|
-<<<<<<< HEAD
|
|
|
import sys
|
|
|
-=======
|
|
|
->>>>>>> da4c26e... Added ethernet socket to FrequencyExtractWidget
|
|
|
|
|
|
|
|
|
|
|
@@ -105,45 +102,122 @@ class FrequencyExtractWidget(kcgw.KCGWidgets):
|
|
|
self.port = self.createSpinbox(1024, 65535)
|
|
|
self.port.setValue(56000)
|
|
|
self.ethernetControls.addWidget(self.port)
|
|
|
- self.ethButton = self.createButton("Connect", connect=self.connectEthernet)
|
|
|
+ self.ethButton = self.createButton("Connect", connect=self.connectButtonClicked)
|
|
|
self.ethernetControls.addWidget(self.ethButton)
|
|
|
|
|
|
self.socketConnected = False
|
|
|
|
|
|
|
|
|
+ #7-Bit encoding values
|
|
|
+ self.encodingControls = QtGui.QHBoxLayout()
|
|
|
+
|
|
|
+ self.encodeBase = self.createSpinbox(0, 10000, interval=1, connect=self.updateRange)
|
|
|
+ self.encodingControls.addWidget(self.createLabel("Encoding Offset:"))
|
|
|
+ self.encodingControls.addWidget(self.encodeBase)
|
|
|
+ self.encodeStep = QtGui.QDoubleSpinBox()
|
|
|
+ self.encodeStep.setDecimals(2)
|
|
|
+ self.encodeStep.setMaximum(1000.)
|
|
|
+ self.encodeStep.setMinimum(0.)
|
|
|
+ self.encodeStep.setSingleStep(0.01)
|
|
|
+
|
|
|
+ self.encodeStep.valueChanged.connect(self.updateRange)
|
|
|
+ self.encodingControls.addWidget(self.createLabel("Encoding Step:"))
|
|
|
+ self.encodingControls.addWidget(self.encodeStep)
|
|
|
+ self.encodingRange = self.createLabel("NaN")
|
|
|
+ self.encodingControls.addWidget(self.createLabel("Valid Range:"))
|
|
|
+ self.encodingControls.addWidget(self.encodingRange)
|
|
|
+
|
|
|
+ self.encodeBase.setValue(10)
|
|
|
+ self.encodeStep.setValue(0.08)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
self.layout.addLayout(self.plotBox)
|
|
|
self.layout.addLayout(self.controlsBox)
|
|
|
self.layout.addLayout(self.frequencyTools)
|
|
|
self.layout.addLayout(self.ethernetControls)
|
|
|
+ self.layout.addWidget(self.createLabel("7-Bit Encoding controls (kHz):"))
|
|
|
+ self.layout.addLayout(self.encodingControls)
|
|
|
self.setLayout(self.layout)
|
|
|
self.setWindowTitle("Frequency Extract")
|
|
|
|
|
|
|
|
|
+ def connectButtonClicked(self):
|
|
|
+ if not self.socketConnected:
|
|
|
+ self.connectEthernet()
|
|
|
+ else:
|
|
|
+ self.disconnectEthernet()
|
|
|
+
|
|
|
+
|
|
|
def connectEthernet(self):
|
|
|
+ if self.socketConnected:
|
|
|
+ return
|
|
|
+
|
|
|
+ #closing a socket also frees the underlying File-Descriptor,
|
|
|
+ #so we need to create a new socket every time we want to create
|
|
|
+ #a new connection
|
|
|
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
+
|
|
|
+ try:
|
|
|
+ socket.inet_aton(self.ip.text())
|
|
|
+ except OSError:
|
|
|
+ print("Malformed IP: %s"%self.ip.text())
|
|
|
+ return
|
|
|
+
|
|
|
+ try:
|
|
|
+ self.socket.connect((self.ip.text(), self.port.value()))
|
|
|
+ self.socketConnected = True
|
|
|
+ self.ethButton.setText("Disconnect")
|
|
|
+ except:
|
|
|
+ print("Failed to connect to %s"%self.ip.text())
|
|
|
+ self.socket = None
|
|
|
+
|
|
|
+
|
|
|
+ def closeSocket(self):
|
|
|
+ try:
|
|
|
+ self.socket.close()
|
|
|
+ except:
|
|
|
+ pass
|
|
|
+
|
|
|
+ self.socketConnected = False
|
|
|
+ self.ethButton.setText("Connect")
|
|
|
+
|
|
|
+
|
|
|
+ def disconnectEthernet(self):
|
|
|
+ if not self.socketConnected:
|
|
|
+ return
|
|
|
+
|
|
|
+ #We tell the other end that we want to close the connection
|
|
|
+ #by sending 0xFF. Our values are usually 7-Bit encoded, meaning
|
|
|
+ #0xFF is an "Invalid" value and can be used for signalling
|
|
|
+ self.sendValue(0xFF)
|
|
|
+ self.closeSocket()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ def sendValue(self, value):
|
|
|
if not self.socketConnected:
|
|
|
+ return
|
|
|
+
|
|
|
+ #socket.sendall() has two different behaviours, based on the Python
|
|
|
+ #version.
|
|
|
+ #In Python2, socket.sendall() will only accept a string
|
|
|
+ #But in Python3, socket.sendall() will only accept a byte-sequence
|
|
|
|
|
|
- #closing the socket also frees the underlying File-Descriptor,
|
|
|
- #so we need to create a new socket every time we want to create
|
|
|
- #a new connection
|
|
|
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
-
|
|
|
- try:
|
|
|
- socket.inet_aton(self.ip.text())
|
|
|
- except OSError:
|
|
|
- print("Malformed IP: %s"%self.ip.text())
|
|
|
- return
|
|
|
-
|
|
|
- try:
|
|
|
- self.socket.connect((self.ip.text(), self.port.value()))
|
|
|
- self.socketConnected = True
|
|
|
- self.ethButton.setText("Disconnect")
|
|
|
- except:
|
|
|
- print("Failed to connect to %s"%self.ip.text())
|
|
|
- self.socket = None
|
|
|
+ toSend = None
|
|
|
+ if sys.version_info[0] == 2:
|
|
|
+ toSend = chr(value)
|
|
|
else:
|
|
|
- self.socket.close()
|
|
|
- self.socketConnected = False
|
|
|
- self.ethButton.setText("Connect")
|
|
|
+ #bytes converts an array of integers into their shortest possible
|
|
|
+ #bytewise representation.
|
|
|
+ toSend = bytes([value])
|
|
|
+
|
|
|
+ try:
|
|
|
+ self.socket.sendall(toSend)
|
|
|
+ except:
|
|
|
+ print("Failed to send... closing down connection")
|
|
|
+ self.closeSocket()
|
|
|
+
|
|
|
|
|
|
def sendFreqEth(self, freq):
|
|
|
if not self.socketConnected:
|
|
@@ -152,8 +226,8 @@ class FrequencyExtractWidget(kcgw.KCGWidgets):
|
|
|
#We work in the kHz domain
|
|
|
freq /= 1000
|
|
|
|
|
|
- offset = 10
|
|
|
- step = 0.08
|
|
|
+ offset = self.encodeBase.value()
|
|
|
+ step = self.encodeStep.value()
|
|
|
max = (offset + (step * 127))
|
|
|
|
|
|
if (freq > max) or (freq < offset):
|
|
@@ -166,14 +240,13 @@ class FrequencyExtractWidget(kcgw.KCGWidgets):
|
|
|
tmp -= step
|
|
|
count += 1
|
|
|
|
|
|
- #bytes converts an array of integers into their shortest possible
|
|
|
- #bytewise representation.
|
|
|
- try:
|
|
|
- self.socket.sendall(bytes([count]))
|
|
|
- except:
|
|
|
- print("Failed to send... closing down connection")
|
|
|
- self.socket.close()
|
|
|
- self.socketConnected = False
|
|
|
+ self.sendValue(count)
|
|
|
+
|
|
|
+
|
|
|
+ def updateRange(self):
|
|
|
+ rangeMin = self.encodeBase.value()
|
|
|
+ rangeMax = rangeMin + (self.encodeStep.value() * 127)
|
|
|
+ self.encodingRange.setText("%.2f - %.2f (kHz)"%(rangeMin, rangeMax))
|
|
|
|
|
|
|
|
|
def dataSetChanged(self, data=None):
|
|
@@ -269,6 +342,9 @@ class FrequencyExtractWidget(kcgw.KCGWidgets):
|
|
|
|
|
|
self.board_config.unobserve(self, 'lastDataSet')
|
|
|
|
|
|
+ #Tell the receiving end that we want to terminate the connection.
|
|
|
+ self.sendValue(0xFF)
|
|
|
+
|
|
|
|
|
|
def addFrequencyExtractWidget():
|
|
|
global __widget_id__
|
|
@@ -280,4 +356,4 @@ def addFrequencyExtractWidget():
|
|
|
w = FrequencyExtractWidget(nid, global_objects.get_global('area'))
|
|
|
global_objects.get_global('area').newWidget(w, "Frequency Extract", nid, widget_type=4)
|
|
|
|
|
|
-kcgw.register_widget(QtGui.QIcon(config.icon_path("sproject.svg")), "Frequency Extract", addFrequencyExtractWidget, "Ctrl+e")
|
|
|
+kcgw.register_widget(QtGui.QIcon(config.icon_path("bbb.png")), "Frequency Extract", addFrequencyExtractWidget, "Ctrl+e")
|