Loading src/Anritsu_MS2830A.py +70 −70 Original line number Diff line number Diff line Loading @@ -6,18 +6,18 @@ import pyvisa class Anritsu_MS2830A(): ''' """ Python class for the Anritsu MS2830A Signal Source Analyzer ''' """ def __init__(self, name, address = 'GPIB::18::INSTR'): ''' """ Initializes Input: name (string) : name of the instrument address (string) : GPIB address ''' """ logging.info(__name__ + ' : Initializing instrument') Loading @@ -35,15 +35,15 @@ class Anritsu_MS2830A(): exit() def who_am_i(self): ''' """ default comand in order to know which is the instrument connected ''' """ return str(self._visainstrument.query('*IDN?')) def set_reset(self): ''' """ reset command ''' """ return self._visainstrument.write('*RST') def self_test(self): Loading @@ -59,9 +59,9 @@ class Anritsu_MS2830A(): return self._visainstrument.write('INST SPECT') def get_resourcelist(self, resource_man): ''' """ gets the list of available resources ''' """ return self._list_res ###################################### Loading @@ -69,27 +69,27 @@ class Anritsu_MS2830A(): ###################################### def do_set_resolutionBW(self, BW): ''' """ sets the resolution bandwidth ''' """ self._visainstrument.write('RB %e'%(BW)) def do_get_resolutionBW(self): ''' """ gets the resolution bandwidth ''' """ return float(self._visainstrument.query('RB?')) def do_set_videoBW(self, BW): ''' """ sets the video bandwidth ''' """ self._visainstrument.write('VB %e'%(BW)) def do_get_videoBW(self): ''' """ gets the video bandwidth ''' """ return float(self._visainstrument.query('VB?')) ###################################### Loading @@ -97,21 +97,21 @@ class Anritsu_MS2830A(): ###################################### def do_get_sweeptime(self): ''' """ gets the center frequency ''' """ return float(self._visainstrument.query('swe:time?')) def set_trace_points_sweeptime(self, points): ''' """ sets the trace point for time sweep ''' """ self._visainstrument.write('SWE:POIN %i' % (points)) def get_trace_points_sweeptime(self): ''' """ query the trace point for time sweep ''' """ return int(self._visainstrument.query('SWE:POIN?')) #def do_get_sweeptime_averages(self): Loading @@ -121,16 +121,16 @@ class Anritsu_MS2830A(): # return self.get_sweeptime() def set_continuous_sweep_mode(self,value): ''' """ value='ON' Continuous sweep value='OFF' Single sweep ''' """ self._visainstrument.write('INIT:CONT %s'%(value)) def sweep(self): ''' """ perform a sweep and wait for it to finish ''' """ self._visainstrument.write('INIT; *WAI') ###################################### Loading @@ -138,56 +138,56 @@ class Anritsu_MS2830A(): ###################################### def do_set_centerfreq(self, centerfreq): ''' """ sets the center frequency ''' """ self._visainstrument.write('CNF %i' % (centerfreq)) def do_get_centerfreq(self): ''' """ gets the center frequency ''' """ return float(self._visainstrument.query('CNF?')) def do_set_freqspan(self, freqspan): ''' """ sets the frequency span ''' """ self._visainstrument.write('freq:span %e'%(freqspan)) def do_get_freqspan(self): ''' """ gets the frequency span ''' """ return float(self._visainstrument.query('freq:span?')) def do_set_startfreq(self, freq): ''' """ sets the start frequency ''' """ self._visainstrument.write('STF %i'%(freq)) def do_get_startfreq(self): ''' """ gets the start frequency ''' """ return float(self._visainstrument.query('STF?')) def do_set_stopfreq(self, freq): ''' """ sets the stop frequency ''' """ self._visainstrument.write('SOF %i'%(freq)) def do_get_stopfreq(self): ''' """ gets the stop frequency ''' """ return float(self._visainstrument.query('SOF?')) ###################################### Loading @@ -195,26 +195,26 @@ class Anritsu_MS2830A(): ###################################### def do_set_powerunit(self,unit): ''' """ sets the unit for powers provide unit as a string! ("DBm") ''' """ self._visainstrument.write('unit:pow %s'%(unit)) def do_get_powerunit(self): ''' """ gets the power unit for powers ''' """ return self._visainstrument.query('unit:pow') def do_get_averages(self): ''' """ Get number of averages Input: None Output: number of averages ''' """ return int(self._visainstrument.query(':AVER:COUNT?')) Loading @@ -223,37 +223,37 @@ class Anritsu_MS2830A(): ###################################### def set_zoom_spot_marker(self,number = 1,type = "SPOT"): ''' """ sets the zoom spot ''' """ self._visainstrument.write('CALC:MARK:WIDT:TYPE %i,%s'%(number,type)) def set_marker(self,marker,frequency): ''' """ sets marker number marker to frequency ''' """ self._visainstrument.write('calc:mark%i:x %e'%(marker, frequency)) self.enable_marker(marker) def get_marker(self,marker): ''' """ gets frequency of marker ''' """ return float(self._visainstrument.query('calc:mark%i:x?'%(marker))) def get_marker_level(self,marker): ''' """ gets power level of indicated marker ''' """ return float(self._visainstrument.query('calc:mark%i:y?'%(marker))) def enable_marker(self,marker,state='ON'): ''' """ marker: ON or OFF ''' """ self._visainstrument.write('CALC:MARK%i %s'%(marker,state)) ###################################### Loading @@ -261,31 +261,31 @@ class Anritsu_MS2830A(): ###################################### def set_amplitude_scale(self, scale): ''' """ sets amplitude scale (log) ''' """ self._visainstrument.write('LOGSCALEDIV %i' %(scale)) def get_amplitude_scale(self): ''' """ gets amplitude scale ''' """ return self._visainstrument.query('LOGSCALEDIV?') def set_reference_level(self, db): ''' """ sets reference level ''' """ self._visainstrument.write('RLV %iDBM' %(db)) def get_reference_level(self): ''' """ gets reference level ''' """ return self._visainstrument.query('RLV?') ###################################### Loading @@ -303,10 +303,10 @@ class Anritsu_MS2830A(): return trace def get_frequencies(self): ''' """ returns an array with the frequencies of the points returned by get_trace() ideally suitable as x-axis for plots ''' """ return np.linspace(self.get_startfreq(),self.get_stopfreq(),self.set_trace_points_sweeptime()) def get_storagemode(self): Loading src/Utils.py +35 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,11 @@ import json from math import log10 """ Python module that contains utily functions for the Anritsu MS2830A Signal Source Analyzer and measurements """ def set_SPA_for_measure(ms2830a, config_file, manual_command): """ This method allows to set the Anritsu MS2830A for the measurements Loading Loading @@ -50,7 +55,10 @@ def set_SPA_for_measure(ms2830a, config_file, manual_command): return log_list def plot_lineplot(trace): """ Plot trace retrieved from Anritsu MS2830A Signal Source Analyzer """ x = np.arange(len(trace)) # x axis dataset = pd.DataFrame({"points": x , "dbM": trace}) Loading @@ -60,16 +68,28 @@ def plot_lineplot(trace): def save_data_as_csv(trace): """ Utility function for saving data in csv extension """ dataset = pd.DataFrame(trace) dataset.to_csv("../data/measure-" + str(datetime.datetime.now()) + ".csv") def read_config_file(filename): """ Utility function for reading configuration file (JSON) """ data = [] with open(filename, 'r') as file: data = file.read() return json.loads(data) def write_config_file(filename, confDict): """ Utility function for writing configuration file (JSON) """ json_obj = json.dumps(confDict, indent=4) with open(filename, 'w') as file: file.write(json_obj) Loading @@ -81,22 +101,29 @@ def write_config_file(filename, confDict): def W2dBm(W): """ Function to convert from W to dBm """ return 10. * log10(W) + 30 def dBm2W(dBm): """ Function to convert from dBm to W """ return 10**((dBm)/10.) / 1000 def getWatts(dBm): """ Function to return a list of watts values """ return map(dBm2W, dBm) def getCalculus(traces): """ Function that returns useful calculus from trace data """ dMeasure = traces[4] - traces[0] drMeasure = traces[4] / traces[0] Loading @@ -112,6 +139,10 @@ def getCalculus(traces): ############################ def clear_message(self, trace_number): """ UI function """ if(trace_number == 0): self.Message1.configure(background="green", font=("Helvetica",24)) elif(trace_number == 1): Loading @@ -128,6 +159,10 @@ def clear_message(self, trace_number): self.Message5.configure(background="green", font=("Helvetica",24)) def clear_background(self): """ UI function """ self.Message1.configure(background="#d9d9d9", font=("Helvetica", 10)) self.Message2.configure(background="#d9d9d9", font=("Helvetica", 10)) self.Message3.configure(background="#d9d9d9", font=("Helvetica", 10)) Loading src/asd.csv 0 → 100644 +5002 −0 File added.Preview size limit exceeded, changes collapsed. Show changes src/gui.py +3 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import sys from tkinter import Radiobutton from tkinter.constants import DISABLED from typing import Text from matplotlib.pyplot import text Loading Loading @@ -105,6 +106,8 @@ class UserInterface: configuration_tab.configuration(self, self.TNotebook1, config_interface, config_file) measure_tab.measure(self,self.TNotebook1) self.TNotebook1.tab(2, state=DISABLED) if __name__ == '__main__': vp_start_gui() Loading src/tabs/configuration_tab.py +35 −21 Original line number Diff line number Diff line from logging import disable from tkinter import Tk from tkinter.constants import DISABLED from tkinter.font import NORMAL import Anritsu_MS2830A as SPA import Utils import logging Loading Loading @@ -27,10 +29,14 @@ def configuration(self, TNotebook1, config_interface, config_file): h_text = 0.029 w_text = 0.291 y_button = 0.739 y_button = 0.749 h_button = 40 w_button = 150 # fonts font_label = ("Arial",10) font_title = ("Arial",12) ################################## # TAB 2 # ################################## Loading @@ -39,49 +45,53 @@ def configuration(self, TNotebook1, config_interface, config_file): self.TNotebook1.add(self.TNotebook1_t2, padding=3) self.TNotebook1.tab(1, text="Configuration",compound="left",underline="-1",) self.LabelTitleConfig = tk.Label(self.TNotebook1_t2) self.LabelTitleConfig.place(relx=0.005, rely=0.014, height=h_label, width=w_label) self.LabelTitleConfig.configure(text='''Configuration''', font=font_title) self.Label1 = tk.Label(self.TNotebook1_t2) self.Label1.place(relx=x_label, rely=0.042, height=h_label, width=w_label) self.Label1.place(relx=x_label, rely=0.052, height=h_label, width=w_label) self.Label1.configure(text='''Start frequency''') self.Label2 = tk.Label(self.TNotebook1_t2) self.Label2.place(relx=x_label, rely=0.113, height=h_label, width=w_label) self.Label2.place(relx=x_label, rely=0.123, height=h_label, width=w_label) self.Label2.configure(text='''Stop Frequency''') self.Label3 = tk.Label(self.TNotebook1_t2) self.Label3.place(relx=x_label, rely=0.184, height=h_label, width=w_label) self.Label3.place(relx=x_label, rely=0.194, height=h_label, width=w_label) self.Label3.configure(text='''Sweep Trace Points''') self.Label4 = tk.Label(self.TNotebook1_t2) self.Label4.place(relx=x_label, rely=0.255, height=h_label, width=w_label) self.Label4.place(relx=x_label, rely=0.265, height=h_label, width=w_label) self.Label4.configure(text='''Resolution Bandwith''') self.Label5 = tk.Label(self.TNotebook1_t2) self.Label5.place(relx=x_label, rely=0.326, height=h_label, width=w_label) self.Label5.place(relx=x_label, rely=0.336, height=h_label, width=w_label) self.Label5.configure(text='''Video Bandwith''') self.Label6 = tk.Label(self.TNotebook1_t2) self.Label6.place(relx=x_label, rely=0.397, height=h_label, width=w_label) self.Label6.place(relx=x_label, rely=0.407, height=h_label, width=w_label) self.Label6.configure(text='''Amplitude log scale''') self.Label7 = tk.Label(self.TNotebook1_t2) self.Label7.place(relx=x_label, rely=0.468, height=h_label, width=w_label) self.Label7.place(relx=x_label, rely=0.478, height=h_label, width=w_label) self.Label7.configure(text='''Reference Level''') self.Label8 = tk.Label(self.TNotebook1_t2) self.Label8.place(relx=x_label, rely=0.539, height=h_label, width=w_label) self.Label8.place(relx=x_label, rely=0.549, height=h_label, width=w_label) self.Label8.configure(text='''Zoom Spot Marker number''') self.Label9 = tk.Label(self.TNotebook1_t2) self.Label9.place(relx=x_label, rely=0.61, height=h_label, width=w_label) self.Label9.place(relx=x_label, rely=0.62, height=h_label, width=w_label) self.Label9.configure(text='''Zoom Spot Marker type''') self.Label10 = tk.Label(self.TNotebook1_t2) self.Label10.place(relx=x_label, rely=0.681, height=h_label, width=w_label) self.Label10.place(relx=x_label, rely=0.691, height=h_label, width=w_label) self.Label10.configure(text='''Manual commands''') # entry self.Entry1 = tk.Entry(self.TNotebook1_t2) self.Entry1.place(relx=x_text, rely=0.042, relheight=h_text, relwidth=w_text) self.Entry1.place(relx=x_text, rely=0.052, relheight=h_text, relwidth=w_text) self.Entry1.configure(background="white") self.Entry1.configure(font="TkTextFont") self.Entry1.configure(selectbackground="blue") Loading @@ -89,7 +99,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry1.insert(0, config_file["start_freq"]) self.Entry2 = tk.Entry(self.TNotebook1_t2) self.Entry2.place(relx=x_text, rely=0.113, relheight=h_text, relwidth=w_text) self.Entry2.place(relx=x_text, rely=0.123, relheight=h_text, relwidth=w_text) self.Entry2.configure(background="white") self.Entry2.configure(font="TkTextFont") self.Entry2.configure(selectbackground="blue") Loading @@ -97,7 +107,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry2.insert(0, config_file["stop_freq"]) self.Entry3 = tk.Entry(self.TNotebook1_t2) self.Entry3.place(relx=x_text, rely=0.184, relheight=h_text, relwidth=w_text) self.Entry3.place(relx=x_text, rely=0.194, relheight=h_text, relwidth=w_text) self.Entry3.configure(background="white") self.Entry3.configure(font="TkTextFont") self.Entry3.configure(selectbackground="blue") Loading @@ -105,7 +115,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry3.insert(0, config_file["sweep_trace_points"]) self.Entry4 = tk.Entry(self.TNotebook1_t2) self.Entry4.place(relx=x_text, rely=0.255, relheight=h_text, relwidth=w_text) self.Entry4.place(relx=x_text, rely=0.265, relheight=h_text, relwidth=w_text) self.Entry4.configure(background="white") self.Entry4.configure(font="TkTextFont") self.Entry4.configure(selectbackground="blue") Loading @@ -113,7 +123,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry4.insert(0, config_file["resolution_bandwith"]) self.Entry5 = tk.Entry(self.TNotebook1_t2) self.Entry5.place(relx=x_text, rely=0.326, relheight=h_text, relwidth=w_text) self.Entry5.place(relx=x_text, rely=0.336, relheight=h_text, relwidth=w_text) self.Entry5.configure(background="white") self.Entry5.configure(font="TkTextFont") self.Entry5.configure(selectbackground="blue") Loading @@ -121,7 +131,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry5.insert(0, config_file["video_bandwith"]) self.Entry6 = tk.Entry(self.TNotebook1_t2) self.Entry6.place(relx=x_text, rely=0.397, relheight=h_text, relwidth=w_text) self.Entry6.place(relx=x_text, rely=0.407, relheight=h_text, relwidth=w_text) self.Entry6.configure(background="white") self.Entry6.configure(font="TkTextFont") self.Entry6.configure(selectbackground="blue") Loading @@ -129,7 +139,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry6.insert(0, config_file["amplitude_log_scale"]) self.Entry7 = tk.Entry(self.TNotebook1_t2) self.Entry7.place(relx=x_text, rely=0.468, relheight=h_text, relwidth=w_text) self.Entry7.place(relx=x_text, rely=0.478, relheight=h_text, relwidth=w_text) self.Entry7.configure(background="white") self.Entry7.configure(font="TkTextFont") self.Entry7.configure(selectbackground="blue") Loading @@ -137,7 +147,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry7.insert(0, config_file["reference_level"]) self.Entry8 = tk.Entry(self.TNotebook1_t2) self.Entry8.place(relx=x_text, rely=0.539, relheight=h_text, relwidth=w_text) self.Entry8.place(relx=x_text, rely=0.549, relheight=h_text, relwidth=w_text) self.Entry8.configure(background="white") self.Entry8.configure(font="TkTextFont") self.Entry8.configure(selectbackground="blue") Loading @@ -145,7 +155,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry8.insert(0, config_file["zoom_spot_marker"][0]) self.Entry9 = tk.Entry(self.TNotebook1_t2) self.Entry9.place(relx=x_text, rely=0.61, relheight=h_text, relwidth=w_text) self.Entry9.place(relx=x_text, rely=0.62, relheight=h_text, relwidth=w_text) self.Entry9.configure(background="white") self.Entry9.configure(font="TkTextFont") self.Entry9.configure(selectbackground="blue") Loading @@ -153,7 +163,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry9.insert(0, config_file["zoom_spot_marker"][1]) self.Entry10 = tk.Entry(self.TNotebook1_t2) self.Entry10.place(relx=x_text, rely=0.681, relheight=h_text, relwidth=w_text) self.Entry10.place(relx=x_text, rely=0.691, relheight=h_text, relwidth=w_text) self.Entry10.configure(background="white") self.Entry10.configure(font="TkTextFont") self.Entry10.configure(selectbackground="blue") Loading Loading @@ -202,6 +212,9 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Text1.insert(tk.END, "\nConfiguration\n") for log in log_list: self.Text1.insert(tk.END, "\t" + log + "\n") self.TNotebook1.tab(2, state=NORMAL) self.Button3.config(state=NORMAL) except: self.Text1.insert(tk.END, "\nConnection problem\n") Loading @@ -222,4 +235,5 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Button3.place(relx=0.665, rely=y_button, height=h_button, width=w_button) self.Button3.configure(command=plot_data) self.Button3.configure(borderwidth="2") self.Button3.configure(state=DISABLED) self.Button3.configure(text='''Plot data''') Loading
src/Anritsu_MS2830A.py +70 −70 Original line number Diff line number Diff line Loading @@ -6,18 +6,18 @@ import pyvisa class Anritsu_MS2830A(): ''' """ Python class for the Anritsu MS2830A Signal Source Analyzer ''' """ def __init__(self, name, address = 'GPIB::18::INSTR'): ''' """ Initializes Input: name (string) : name of the instrument address (string) : GPIB address ''' """ logging.info(__name__ + ' : Initializing instrument') Loading @@ -35,15 +35,15 @@ class Anritsu_MS2830A(): exit() def who_am_i(self): ''' """ default comand in order to know which is the instrument connected ''' """ return str(self._visainstrument.query('*IDN?')) def set_reset(self): ''' """ reset command ''' """ return self._visainstrument.write('*RST') def self_test(self): Loading @@ -59,9 +59,9 @@ class Anritsu_MS2830A(): return self._visainstrument.write('INST SPECT') def get_resourcelist(self, resource_man): ''' """ gets the list of available resources ''' """ return self._list_res ###################################### Loading @@ -69,27 +69,27 @@ class Anritsu_MS2830A(): ###################################### def do_set_resolutionBW(self, BW): ''' """ sets the resolution bandwidth ''' """ self._visainstrument.write('RB %e'%(BW)) def do_get_resolutionBW(self): ''' """ gets the resolution bandwidth ''' """ return float(self._visainstrument.query('RB?')) def do_set_videoBW(self, BW): ''' """ sets the video bandwidth ''' """ self._visainstrument.write('VB %e'%(BW)) def do_get_videoBW(self): ''' """ gets the video bandwidth ''' """ return float(self._visainstrument.query('VB?')) ###################################### Loading @@ -97,21 +97,21 @@ class Anritsu_MS2830A(): ###################################### def do_get_sweeptime(self): ''' """ gets the center frequency ''' """ return float(self._visainstrument.query('swe:time?')) def set_trace_points_sweeptime(self, points): ''' """ sets the trace point for time sweep ''' """ self._visainstrument.write('SWE:POIN %i' % (points)) def get_trace_points_sweeptime(self): ''' """ query the trace point for time sweep ''' """ return int(self._visainstrument.query('SWE:POIN?')) #def do_get_sweeptime_averages(self): Loading @@ -121,16 +121,16 @@ class Anritsu_MS2830A(): # return self.get_sweeptime() def set_continuous_sweep_mode(self,value): ''' """ value='ON' Continuous sweep value='OFF' Single sweep ''' """ self._visainstrument.write('INIT:CONT %s'%(value)) def sweep(self): ''' """ perform a sweep and wait for it to finish ''' """ self._visainstrument.write('INIT; *WAI') ###################################### Loading @@ -138,56 +138,56 @@ class Anritsu_MS2830A(): ###################################### def do_set_centerfreq(self, centerfreq): ''' """ sets the center frequency ''' """ self._visainstrument.write('CNF %i' % (centerfreq)) def do_get_centerfreq(self): ''' """ gets the center frequency ''' """ return float(self._visainstrument.query('CNF?')) def do_set_freqspan(self, freqspan): ''' """ sets the frequency span ''' """ self._visainstrument.write('freq:span %e'%(freqspan)) def do_get_freqspan(self): ''' """ gets the frequency span ''' """ return float(self._visainstrument.query('freq:span?')) def do_set_startfreq(self, freq): ''' """ sets the start frequency ''' """ self._visainstrument.write('STF %i'%(freq)) def do_get_startfreq(self): ''' """ gets the start frequency ''' """ return float(self._visainstrument.query('STF?')) def do_set_stopfreq(self, freq): ''' """ sets the stop frequency ''' """ self._visainstrument.write('SOF %i'%(freq)) def do_get_stopfreq(self): ''' """ gets the stop frequency ''' """ return float(self._visainstrument.query('SOF?')) ###################################### Loading @@ -195,26 +195,26 @@ class Anritsu_MS2830A(): ###################################### def do_set_powerunit(self,unit): ''' """ sets the unit for powers provide unit as a string! ("DBm") ''' """ self._visainstrument.write('unit:pow %s'%(unit)) def do_get_powerunit(self): ''' """ gets the power unit for powers ''' """ return self._visainstrument.query('unit:pow') def do_get_averages(self): ''' """ Get number of averages Input: None Output: number of averages ''' """ return int(self._visainstrument.query(':AVER:COUNT?')) Loading @@ -223,37 +223,37 @@ class Anritsu_MS2830A(): ###################################### def set_zoom_spot_marker(self,number = 1,type = "SPOT"): ''' """ sets the zoom spot ''' """ self._visainstrument.write('CALC:MARK:WIDT:TYPE %i,%s'%(number,type)) def set_marker(self,marker,frequency): ''' """ sets marker number marker to frequency ''' """ self._visainstrument.write('calc:mark%i:x %e'%(marker, frequency)) self.enable_marker(marker) def get_marker(self,marker): ''' """ gets frequency of marker ''' """ return float(self._visainstrument.query('calc:mark%i:x?'%(marker))) def get_marker_level(self,marker): ''' """ gets power level of indicated marker ''' """ return float(self._visainstrument.query('calc:mark%i:y?'%(marker))) def enable_marker(self,marker,state='ON'): ''' """ marker: ON or OFF ''' """ self._visainstrument.write('CALC:MARK%i %s'%(marker,state)) ###################################### Loading @@ -261,31 +261,31 @@ class Anritsu_MS2830A(): ###################################### def set_amplitude_scale(self, scale): ''' """ sets amplitude scale (log) ''' """ self._visainstrument.write('LOGSCALEDIV %i' %(scale)) def get_amplitude_scale(self): ''' """ gets amplitude scale ''' """ return self._visainstrument.query('LOGSCALEDIV?') def set_reference_level(self, db): ''' """ sets reference level ''' """ self._visainstrument.write('RLV %iDBM' %(db)) def get_reference_level(self): ''' """ gets reference level ''' """ return self._visainstrument.query('RLV?') ###################################### Loading @@ -303,10 +303,10 @@ class Anritsu_MS2830A(): return trace def get_frequencies(self): ''' """ returns an array with the frequencies of the points returned by get_trace() ideally suitable as x-axis for plots ''' """ return np.linspace(self.get_startfreq(),self.get_stopfreq(),self.set_trace_points_sweeptime()) def get_storagemode(self): Loading
src/Utils.py +35 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,11 @@ import json from math import log10 """ Python module that contains utily functions for the Anritsu MS2830A Signal Source Analyzer and measurements """ def set_SPA_for_measure(ms2830a, config_file, manual_command): """ This method allows to set the Anritsu MS2830A for the measurements Loading Loading @@ -50,7 +55,10 @@ def set_SPA_for_measure(ms2830a, config_file, manual_command): return log_list def plot_lineplot(trace): """ Plot trace retrieved from Anritsu MS2830A Signal Source Analyzer """ x = np.arange(len(trace)) # x axis dataset = pd.DataFrame({"points": x , "dbM": trace}) Loading @@ -60,16 +68,28 @@ def plot_lineplot(trace): def save_data_as_csv(trace): """ Utility function for saving data in csv extension """ dataset = pd.DataFrame(trace) dataset.to_csv("../data/measure-" + str(datetime.datetime.now()) + ".csv") def read_config_file(filename): """ Utility function for reading configuration file (JSON) """ data = [] with open(filename, 'r') as file: data = file.read() return json.loads(data) def write_config_file(filename, confDict): """ Utility function for writing configuration file (JSON) """ json_obj = json.dumps(confDict, indent=4) with open(filename, 'w') as file: file.write(json_obj) Loading @@ -81,22 +101,29 @@ def write_config_file(filename, confDict): def W2dBm(W): """ Function to convert from W to dBm """ return 10. * log10(W) + 30 def dBm2W(dBm): """ Function to convert from dBm to W """ return 10**((dBm)/10.) / 1000 def getWatts(dBm): """ Function to return a list of watts values """ return map(dBm2W, dBm) def getCalculus(traces): """ Function that returns useful calculus from trace data """ dMeasure = traces[4] - traces[0] drMeasure = traces[4] / traces[0] Loading @@ -112,6 +139,10 @@ def getCalculus(traces): ############################ def clear_message(self, trace_number): """ UI function """ if(trace_number == 0): self.Message1.configure(background="green", font=("Helvetica",24)) elif(trace_number == 1): Loading @@ -128,6 +159,10 @@ def clear_message(self, trace_number): self.Message5.configure(background="green", font=("Helvetica",24)) def clear_background(self): """ UI function """ self.Message1.configure(background="#d9d9d9", font=("Helvetica", 10)) self.Message2.configure(background="#d9d9d9", font=("Helvetica", 10)) self.Message3.configure(background="#d9d9d9", font=("Helvetica", 10)) Loading
src/asd.csv 0 → 100644 +5002 −0 File added.Preview size limit exceeded, changes collapsed. Show changes
src/gui.py +3 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import sys from tkinter import Radiobutton from tkinter.constants import DISABLED from typing import Text from matplotlib.pyplot import text Loading Loading @@ -105,6 +106,8 @@ class UserInterface: configuration_tab.configuration(self, self.TNotebook1, config_interface, config_file) measure_tab.measure(self,self.TNotebook1) self.TNotebook1.tab(2, state=DISABLED) if __name__ == '__main__': vp_start_gui() Loading
src/tabs/configuration_tab.py +35 −21 Original line number Diff line number Diff line from logging import disable from tkinter import Tk from tkinter.constants import DISABLED from tkinter.font import NORMAL import Anritsu_MS2830A as SPA import Utils import logging Loading Loading @@ -27,10 +29,14 @@ def configuration(self, TNotebook1, config_interface, config_file): h_text = 0.029 w_text = 0.291 y_button = 0.739 y_button = 0.749 h_button = 40 w_button = 150 # fonts font_label = ("Arial",10) font_title = ("Arial",12) ################################## # TAB 2 # ################################## Loading @@ -39,49 +45,53 @@ def configuration(self, TNotebook1, config_interface, config_file): self.TNotebook1.add(self.TNotebook1_t2, padding=3) self.TNotebook1.tab(1, text="Configuration",compound="left",underline="-1",) self.LabelTitleConfig = tk.Label(self.TNotebook1_t2) self.LabelTitleConfig.place(relx=0.005, rely=0.014, height=h_label, width=w_label) self.LabelTitleConfig.configure(text='''Configuration''', font=font_title) self.Label1 = tk.Label(self.TNotebook1_t2) self.Label1.place(relx=x_label, rely=0.042, height=h_label, width=w_label) self.Label1.place(relx=x_label, rely=0.052, height=h_label, width=w_label) self.Label1.configure(text='''Start frequency''') self.Label2 = tk.Label(self.TNotebook1_t2) self.Label2.place(relx=x_label, rely=0.113, height=h_label, width=w_label) self.Label2.place(relx=x_label, rely=0.123, height=h_label, width=w_label) self.Label2.configure(text='''Stop Frequency''') self.Label3 = tk.Label(self.TNotebook1_t2) self.Label3.place(relx=x_label, rely=0.184, height=h_label, width=w_label) self.Label3.place(relx=x_label, rely=0.194, height=h_label, width=w_label) self.Label3.configure(text='''Sweep Trace Points''') self.Label4 = tk.Label(self.TNotebook1_t2) self.Label4.place(relx=x_label, rely=0.255, height=h_label, width=w_label) self.Label4.place(relx=x_label, rely=0.265, height=h_label, width=w_label) self.Label4.configure(text='''Resolution Bandwith''') self.Label5 = tk.Label(self.TNotebook1_t2) self.Label5.place(relx=x_label, rely=0.326, height=h_label, width=w_label) self.Label5.place(relx=x_label, rely=0.336, height=h_label, width=w_label) self.Label5.configure(text='''Video Bandwith''') self.Label6 = tk.Label(self.TNotebook1_t2) self.Label6.place(relx=x_label, rely=0.397, height=h_label, width=w_label) self.Label6.place(relx=x_label, rely=0.407, height=h_label, width=w_label) self.Label6.configure(text='''Amplitude log scale''') self.Label7 = tk.Label(self.TNotebook1_t2) self.Label7.place(relx=x_label, rely=0.468, height=h_label, width=w_label) self.Label7.place(relx=x_label, rely=0.478, height=h_label, width=w_label) self.Label7.configure(text='''Reference Level''') self.Label8 = tk.Label(self.TNotebook1_t2) self.Label8.place(relx=x_label, rely=0.539, height=h_label, width=w_label) self.Label8.place(relx=x_label, rely=0.549, height=h_label, width=w_label) self.Label8.configure(text='''Zoom Spot Marker number''') self.Label9 = tk.Label(self.TNotebook1_t2) self.Label9.place(relx=x_label, rely=0.61, height=h_label, width=w_label) self.Label9.place(relx=x_label, rely=0.62, height=h_label, width=w_label) self.Label9.configure(text='''Zoom Spot Marker type''') self.Label10 = tk.Label(self.TNotebook1_t2) self.Label10.place(relx=x_label, rely=0.681, height=h_label, width=w_label) self.Label10.place(relx=x_label, rely=0.691, height=h_label, width=w_label) self.Label10.configure(text='''Manual commands''') # entry self.Entry1 = tk.Entry(self.TNotebook1_t2) self.Entry1.place(relx=x_text, rely=0.042, relheight=h_text, relwidth=w_text) self.Entry1.place(relx=x_text, rely=0.052, relheight=h_text, relwidth=w_text) self.Entry1.configure(background="white") self.Entry1.configure(font="TkTextFont") self.Entry1.configure(selectbackground="blue") Loading @@ -89,7 +99,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry1.insert(0, config_file["start_freq"]) self.Entry2 = tk.Entry(self.TNotebook1_t2) self.Entry2.place(relx=x_text, rely=0.113, relheight=h_text, relwidth=w_text) self.Entry2.place(relx=x_text, rely=0.123, relheight=h_text, relwidth=w_text) self.Entry2.configure(background="white") self.Entry2.configure(font="TkTextFont") self.Entry2.configure(selectbackground="blue") Loading @@ -97,7 +107,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry2.insert(0, config_file["stop_freq"]) self.Entry3 = tk.Entry(self.TNotebook1_t2) self.Entry3.place(relx=x_text, rely=0.184, relheight=h_text, relwidth=w_text) self.Entry3.place(relx=x_text, rely=0.194, relheight=h_text, relwidth=w_text) self.Entry3.configure(background="white") self.Entry3.configure(font="TkTextFont") self.Entry3.configure(selectbackground="blue") Loading @@ -105,7 +115,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry3.insert(0, config_file["sweep_trace_points"]) self.Entry4 = tk.Entry(self.TNotebook1_t2) self.Entry4.place(relx=x_text, rely=0.255, relheight=h_text, relwidth=w_text) self.Entry4.place(relx=x_text, rely=0.265, relheight=h_text, relwidth=w_text) self.Entry4.configure(background="white") self.Entry4.configure(font="TkTextFont") self.Entry4.configure(selectbackground="blue") Loading @@ -113,7 +123,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry4.insert(0, config_file["resolution_bandwith"]) self.Entry5 = tk.Entry(self.TNotebook1_t2) self.Entry5.place(relx=x_text, rely=0.326, relheight=h_text, relwidth=w_text) self.Entry5.place(relx=x_text, rely=0.336, relheight=h_text, relwidth=w_text) self.Entry5.configure(background="white") self.Entry5.configure(font="TkTextFont") self.Entry5.configure(selectbackground="blue") Loading @@ -121,7 +131,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry5.insert(0, config_file["video_bandwith"]) self.Entry6 = tk.Entry(self.TNotebook1_t2) self.Entry6.place(relx=x_text, rely=0.397, relheight=h_text, relwidth=w_text) self.Entry6.place(relx=x_text, rely=0.407, relheight=h_text, relwidth=w_text) self.Entry6.configure(background="white") self.Entry6.configure(font="TkTextFont") self.Entry6.configure(selectbackground="blue") Loading @@ -129,7 +139,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry6.insert(0, config_file["amplitude_log_scale"]) self.Entry7 = tk.Entry(self.TNotebook1_t2) self.Entry7.place(relx=x_text, rely=0.468, relheight=h_text, relwidth=w_text) self.Entry7.place(relx=x_text, rely=0.478, relheight=h_text, relwidth=w_text) self.Entry7.configure(background="white") self.Entry7.configure(font="TkTextFont") self.Entry7.configure(selectbackground="blue") Loading @@ -137,7 +147,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry7.insert(0, config_file["reference_level"]) self.Entry8 = tk.Entry(self.TNotebook1_t2) self.Entry8.place(relx=x_text, rely=0.539, relheight=h_text, relwidth=w_text) self.Entry8.place(relx=x_text, rely=0.549, relheight=h_text, relwidth=w_text) self.Entry8.configure(background="white") self.Entry8.configure(font="TkTextFont") self.Entry8.configure(selectbackground="blue") Loading @@ -145,7 +155,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry8.insert(0, config_file["zoom_spot_marker"][0]) self.Entry9 = tk.Entry(self.TNotebook1_t2) self.Entry9.place(relx=x_text, rely=0.61, relheight=h_text, relwidth=w_text) self.Entry9.place(relx=x_text, rely=0.62, relheight=h_text, relwidth=w_text) self.Entry9.configure(background="white") self.Entry9.configure(font="TkTextFont") self.Entry9.configure(selectbackground="blue") Loading @@ -153,7 +163,7 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Entry9.insert(0, config_file["zoom_spot_marker"][1]) self.Entry10 = tk.Entry(self.TNotebook1_t2) self.Entry10.place(relx=x_text, rely=0.681, relheight=h_text, relwidth=w_text) self.Entry10.place(relx=x_text, rely=0.691, relheight=h_text, relwidth=w_text) self.Entry10.configure(background="white") self.Entry10.configure(font="TkTextFont") self.Entry10.configure(selectbackground="blue") Loading Loading @@ -202,6 +212,9 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Text1.insert(tk.END, "\nConfiguration\n") for log in log_list: self.Text1.insert(tk.END, "\t" + log + "\n") self.TNotebook1.tab(2, state=NORMAL) self.Button3.config(state=NORMAL) except: self.Text1.insert(tk.END, "\nConnection problem\n") Loading @@ -222,4 +235,5 @@ def configuration(self, TNotebook1, config_interface, config_file): self.Button3.place(relx=0.665, rely=y_button, height=h_button, width=w_button) self.Button3.configure(command=plot_data) self.Button3.configure(borderwidth="2") self.Button3.configure(state=DISABLED) self.Button3.configure(text='''Plot data''')