sqil-core 0.1.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sqil_core/__init__.py +1 -0
- sqil_core/config_log.py +42 -0
- sqil_core/experiment/__init__.py +11 -0
- sqil_core/experiment/_analysis.py +125 -0
- sqil_core/experiment/_events.py +25 -0
- sqil_core/experiment/_experiment.py +553 -0
- sqil_core/experiment/data/plottr.py +778 -0
- sqil_core/experiment/helpers/_function_override_handler.py +111 -0
- sqil_core/experiment/helpers/_labone_wrappers.py +12 -0
- sqil_core/experiment/instruments/__init__.py +2 -0
- sqil_core/experiment/instruments/_instrument.py +190 -0
- sqil_core/experiment/instruments/drivers/SignalCore_SC5511A.py +515 -0
- sqil_core/experiment/instruments/local_oscillator.py +205 -0
- sqil_core/experiment/instruments/server.py +175 -0
- sqil_core/experiment/instruments/setup.yaml +21 -0
- sqil_core/experiment/instruments/zurich_instruments.py +55 -0
- sqil_core/fit/__init__.py +23 -0
- sqil_core/fit/_core.py +179 -31
- sqil_core/fit/_fit.py +544 -94
- sqil_core/fit/_guess.py +304 -0
- sqil_core/fit/_models.py +50 -1
- sqil_core/fit/_quality.py +266 -0
- sqil_core/resonator/__init__.py +2 -0
- sqil_core/resonator/_resonator.py +256 -74
- sqil_core/utils/__init__.py +40 -13
- sqil_core/utils/_analysis.py +226 -0
- sqil_core/utils/_const.py +83 -18
- sqil_core/utils/_formatter.py +127 -55
- sqil_core/utils/_plot.py +272 -6
- sqil_core/utils/_read.py +178 -95
- sqil_core/utils/_utils.py +147 -0
- {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/METADATA +9 -1
- sqil_core-1.1.0.dist-info/RECORD +36 -0
- {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/WHEEL +1 -1
- sqil_core-0.1.0.dist-info/RECORD +0 -19
- {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,515 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""
|
3
|
+
Created on Fri Mar 19 14:11:31 2021
|
4
|
+
|
5
|
+
@author: Chao Zhou
|
6
|
+
|
7
|
+
A simple driver for SignalCore SC5511A to be used with QCoDes, transferred from the one written by Erick Brindock
|
8
|
+
"""
|
9
|
+
|
10
|
+
import ctypes
|
11
|
+
import logging
|
12
|
+
from typing import Any, Dict, Optional
|
13
|
+
|
14
|
+
import yaml
|
15
|
+
|
16
|
+
# from helpers.customized_drivers.sc5511a import * #is this actually required?
|
17
|
+
from qcodes import Instrument
|
18
|
+
from qcodes.utils.validators import Enum, Numbers
|
19
|
+
|
20
|
+
# from Hatlab_QCoDes_Drivers import DLLPATH
|
21
|
+
# import Hatlab_QCoDes_Drivers
|
22
|
+
|
23
|
+
# ChainedSigCores = yaml.safe_load(open(Hatlab_QCoDes_Drivers.__path__[0]+"\\..\\DeviceInfo\\ChainedSigCores.yaml"))
|
24
|
+
DLLPATH = r"C:\Program Files\SignalCore\SC5511A\api\c\x64"
|
25
|
+
|
26
|
+
|
27
|
+
def search_5511(max_connection=20):
|
28
|
+
"""
|
29
|
+
param max_connection: maximum number of connected device
|
30
|
+
"""
|
31
|
+
dll_5511 = ctypes.CDLL(DLLPATH + "//sc5511a.dll")
|
32
|
+
sn_buffers = [
|
33
|
+
ctypes.create_string_buffer(8) for i in range(max_connection)
|
34
|
+
] # buffer to store list of serial numbers
|
35
|
+
pointers = (ctypes.c_char_p * max_connection)(
|
36
|
+
*map(ctypes.addressof, sn_buffers)
|
37
|
+
) # pointer list for the buffers
|
38
|
+
n_5511 = dll_5511.sc5511a_search_devices(ctypes.byref(pointers))
|
39
|
+
pointer_list = []
|
40
|
+
if n_5511 == 0:
|
41
|
+
print("No SC5511A 20GHz-SigCire is connected")
|
42
|
+
else:
|
43
|
+
print("Following SC5511A 20GHz-SigCores are connected:")
|
44
|
+
for i in range(n_5511):
|
45
|
+
print(pointers[i])
|
46
|
+
pointer_list.append(pointers[i].decode("utf-8"))
|
47
|
+
return pointer_list
|
48
|
+
|
49
|
+
|
50
|
+
class Device_rf_params_t(ctypes.Structure):
|
51
|
+
_fields_ = [
|
52
|
+
("rf1_freq", ctypes.c_ulonglong),
|
53
|
+
("start_freq", ctypes.c_ulonglong),
|
54
|
+
("stop_freq", ctypes.c_ulonglong),
|
55
|
+
("step_freq", ctypes.c_ulonglong),
|
56
|
+
("sweep_dwell_time", ctypes.c_uint),
|
57
|
+
("sweep_cycles", ctypes.c_uint),
|
58
|
+
("buffer_time", ctypes.c_uint),
|
59
|
+
("rf_level", ctypes.c_float),
|
60
|
+
("rf2_freq", ctypes.c_short),
|
61
|
+
]
|
62
|
+
|
63
|
+
|
64
|
+
class Device_temperature_t(ctypes.Structure):
|
65
|
+
_fields_ = [("device_temp", ctypes.c_float)]
|
66
|
+
|
67
|
+
|
68
|
+
class Operate_status_t(ctypes.Structure):
|
69
|
+
_fields_ = [
|
70
|
+
("rf1_lock_mode", ctypes.c_ubyte),
|
71
|
+
("rf1_loop_gain", ctypes.c_ubyte),
|
72
|
+
("device_access", ctypes.c_ubyte),
|
73
|
+
("rf2_standby", ctypes.c_ubyte),
|
74
|
+
("rf1_standby", ctypes.c_ubyte),
|
75
|
+
("auto_pwr_disable", ctypes.c_ubyte),
|
76
|
+
("alc_mode", ctypes.c_ubyte),
|
77
|
+
("rf1_out_enable", ctypes.c_ubyte),
|
78
|
+
("ext_ref_lock_enable", ctypes.c_ubyte),
|
79
|
+
("ext_ref_detect", ctypes.c_ubyte),
|
80
|
+
("ref_out_select", ctypes.c_ubyte),
|
81
|
+
("list_mode_running", ctypes.c_ubyte),
|
82
|
+
("rf1_mode", ctypes.c_ubyte),
|
83
|
+
("harmonic_ss", ctypes.c_ubyte),
|
84
|
+
("over_temp", ctypes.c_ubyte),
|
85
|
+
]
|
86
|
+
|
87
|
+
|
88
|
+
class Pll_status_t(ctypes.Structure):
|
89
|
+
_fields_ = [
|
90
|
+
("sum_pll_ld", ctypes.c_ubyte),
|
91
|
+
("crs_pll_ld", ctypes.c_ubyte),
|
92
|
+
("fine_pll_ld", ctypes.c_ubyte),
|
93
|
+
("crs_ref_pll_ld", ctypes.c_ubyte),
|
94
|
+
("crs_aux_pll_ld", ctypes.c_ubyte),
|
95
|
+
("ref_100_pll_ld", ctypes.c_ubyte),
|
96
|
+
("ref_10_pll_ld", ctypes.c_ubyte),
|
97
|
+
("rf2_pll_ld", ctypes.c_ubyte),
|
98
|
+
]
|
99
|
+
|
100
|
+
|
101
|
+
class List_mode_t(ctypes.Structure):
|
102
|
+
_fields_ = [
|
103
|
+
("sss_mode", ctypes.c_ubyte),
|
104
|
+
("sweep_dir", ctypes.c_ubyte),
|
105
|
+
("tri_waveform", ctypes.c_ubyte),
|
106
|
+
("hw_trigger", ctypes.c_ubyte),
|
107
|
+
("step_on_hw_trig", ctypes.c_ubyte),
|
108
|
+
("return_to_start", ctypes.c_ubyte),
|
109
|
+
("trig_out_enable", ctypes.c_ubyte),
|
110
|
+
("trig_out_on_cycle", ctypes.c_ubyte),
|
111
|
+
]
|
112
|
+
|
113
|
+
|
114
|
+
class Device_status_t(ctypes.Structure):
|
115
|
+
_fields_ = [
|
116
|
+
("list_mode", List_mode_t),
|
117
|
+
("operate_status_t", Operate_status_t),
|
118
|
+
("pll_status_t", Pll_status_t),
|
119
|
+
]
|
120
|
+
|
121
|
+
|
122
|
+
class Device_info_t(ctypes.Structure):
|
123
|
+
_fields_ = [
|
124
|
+
("serial_number", ctypes.c_uint32),
|
125
|
+
("hardware_revision", ctypes.c_float),
|
126
|
+
("firmware_revision", ctypes.c_float),
|
127
|
+
("manufacture_date", ctypes.c_uint32),
|
128
|
+
]
|
129
|
+
|
130
|
+
|
131
|
+
# End of Structures------------------------------------------------------------
|
132
|
+
class SignalCore_SC5511A(Instrument):
|
133
|
+
def __init__(
|
134
|
+
self, name: str, serial_number: str, dll=None, debug=False, **kwargs: Any
|
135
|
+
):
|
136
|
+
super().__init__(name, **kwargs)
|
137
|
+
logging.info(
|
138
|
+
__name__
|
139
|
+
+ f" : Initializing instrument SignalCore generator {serial_number}"
|
140
|
+
)
|
141
|
+
if dll is not None:
|
142
|
+
self._dll = dll
|
143
|
+
else:
|
144
|
+
self._dll = ctypes.CDLL(DLLPATH + "//sc5511a.dll")
|
145
|
+
|
146
|
+
if debug:
|
147
|
+
print(self._dll)
|
148
|
+
|
149
|
+
self._dll.sc5511a_open_device.restype = ctypes.c_uint64
|
150
|
+
self._handle = ctypes.c_void_p(
|
151
|
+
self._dll.sc5511a_open_device(
|
152
|
+
ctypes.c_char_p(bytes(serial_number, "utf-8"))
|
153
|
+
)
|
154
|
+
)
|
155
|
+
self._serial_number = ctypes.c_char_p(bytes(serial_number, "utf-8"))
|
156
|
+
self._rf_params = Device_rf_params_t(0, 0, 0, 0, 0, 0, 0, 0, 0)
|
157
|
+
self._status = Operate_status_t(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
158
|
+
self._open = False
|
159
|
+
self._temperature = Device_temperature_t(0)
|
160
|
+
|
161
|
+
self._pll_status = Pll_status_t()
|
162
|
+
self._list_mode = List_mode_t()
|
163
|
+
self._device_status = Device_status_t(
|
164
|
+
self._list_mode, self._status, self._pll_status
|
165
|
+
)
|
166
|
+
if debug:
|
167
|
+
print(serial_number, self._handle)
|
168
|
+
self._dll.sc5511a_get_device_status(
|
169
|
+
self._handle, ctypes.byref(self._device_status)
|
170
|
+
)
|
171
|
+
status = self._device_status.operate_status_t.rf1_out_enable
|
172
|
+
print("check status", status)
|
173
|
+
|
174
|
+
self._dll.sc5511a_close_device(self._handle)
|
175
|
+
self._device_info = Device_info_t(0, 0, 0, 0)
|
176
|
+
self.get_idn()
|
177
|
+
self.do_set_auto_level_disable(
|
178
|
+
0
|
179
|
+
) # setting this to 1 will lead to unstable output power
|
180
|
+
|
181
|
+
# self.do_set_ref_out_freq(10)
|
182
|
+
# if serial_number in ChainedSigCores["Modified_Ref_In"]:
|
183
|
+
# self.do_set_ref_out_freq(100)
|
184
|
+
# elif serial_number in ChainedSigCores["Origional_Ref_In"]:
|
185
|
+
# self.do_set_ref_out_freq(10)
|
186
|
+
|
187
|
+
self.add_parameter(
|
188
|
+
"power",
|
189
|
+
label="power",
|
190
|
+
get_cmd=self.do_get_power,
|
191
|
+
get_parser=float,
|
192
|
+
set_cmd=self.do_set_power,
|
193
|
+
set_parser=float,
|
194
|
+
unit="dBm",
|
195
|
+
vals=Numbers(min_value=-144, max_value=19),
|
196
|
+
)
|
197
|
+
|
198
|
+
self.add_parameter(
|
199
|
+
"output_status",
|
200
|
+
label="output_status",
|
201
|
+
get_cmd=self.do_get_output_status,
|
202
|
+
get_parser=int,
|
203
|
+
set_cmd=self.do_set_output_status,
|
204
|
+
set_parser=int,
|
205
|
+
vals=Numbers(min_value=0, max_value=1),
|
206
|
+
)
|
207
|
+
|
208
|
+
self.add_parameter(
|
209
|
+
"frequency",
|
210
|
+
label="frequency",
|
211
|
+
get_cmd=self.do_get_frequency,
|
212
|
+
get_parser=float,
|
213
|
+
set_cmd=self.do_set_frequency,
|
214
|
+
set_parser=float,
|
215
|
+
unit="Hz",
|
216
|
+
vals=Numbers(min_value=0, max_value=20e9),
|
217
|
+
)
|
218
|
+
|
219
|
+
self.add_parameter(
|
220
|
+
"reference_source",
|
221
|
+
label="reference_source",
|
222
|
+
get_cmd=self.do_get_reference_source,
|
223
|
+
get_parser=int,
|
224
|
+
set_cmd=self.do_set_reference_source,
|
225
|
+
set_parser=int,
|
226
|
+
vals=Numbers(min_value=0, max_value=1),
|
227
|
+
)
|
228
|
+
|
229
|
+
self.add_parameter(
|
230
|
+
"auto_level_disable",
|
231
|
+
label="0 = power is leveled on frequency change",
|
232
|
+
get_cmd=self.do_get_auto_level_disable,
|
233
|
+
get_parser=int,
|
234
|
+
set_cmd=self.do_set_auto_level_disable,
|
235
|
+
set_parser=int,
|
236
|
+
vals=Numbers(min_value=0, max_value=1),
|
237
|
+
)
|
238
|
+
|
239
|
+
self.add_parameter(
|
240
|
+
"ref_out_freq",
|
241
|
+
label="reference out frequency in MHz",
|
242
|
+
get_cmd=self.do_get_ref_out_freq,
|
243
|
+
get_parser=int,
|
244
|
+
set_cmd=self.do_set_ref_out_freq,
|
245
|
+
set_parser=int,
|
246
|
+
vals=Enum(10, 100),
|
247
|
+
)
|
248
|
+
|
249
|
+
self.add_parameter(
|
250
|
+
"temperature",
|
251
|
+
label="temperature",
|
252
|
+
get_cmd=self.do_get_device_temp,
|
253
|
+
get_parser=float,
|
254
|
+
unit="C",
|
255
|
+
vals=Numbers(min_value=0, max_value=200),
|
256
|
+
)
|
257
|
+
|
258
|
+
if self._device_status.operate_status_t.ext_ref_lock_enable == 0:
|
259
|
+
self.do_set_reference_source(1)
|
260
|
+
|
261
|
+
def set_open(self, open):
|
262
|
+
if open and not self._open:
|
263
|
+
self._handle = ctypes.c_void_p(
|
264
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
265
|
+
)
|
266
|
+
self._open = True
|
267
|
+
elif not open and self._open:
|
268
|
+
self._dll.sc5511a_close_device(self._handle)
|
269
|
+
self._open = False
|
270
|
+
return True
|
271
|
+
|
272
|
+
def close(self):
|
273
|
+
self.set_open(0)
|
274
|
+
|
275
|
+
def get_device_status(self):
|
276
|
+
self._handle = ctypes.c_void_p(
|
277
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
278
|
+
)
|
279
|
+
self._dll.sc5511a_get_device_status(
|
280
|
+
self._handle, ctypes.byref(self._device_status)
|
281
|
+
)
|
282
|
+
self._dll.sc5511a_close_device(self._handle)
|
283
|
+
return self._device_status
|
284
|
+
|
285
|
+
def do_set_output_status(self, enable):
|
286
|
+
"""
|
287
|
+
Turns the output of RF1 on or off.
|
288
|
+
Input:
|
289
|
+
enable (int) = OFF = 0 ; ON = 1
|
290
|
+
"""
|
291
|
+
logging.info(__name__ + " : Setting output to %s" % enable)
|
292
|
+
c_enable = ctypes.c_ubyte(enable)
|
293
|
+
self._handle = ctypes.c_void_p(
|
294
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
295
|
+
)
|
296
|
+
completed = self._dll.sc5511a_set_output(self._handle, c_enable)
|
297
|
+
self._dll.sc5511a_close_device(self._handle)
|
298
|
+
return completed
|
299
|
+
|
300
|
+
def do_get_output_status(self):
|
301
|
+
"""
|
302
|
+
Reads the output status of RF1
|
303
|
+
Output:
|
304
|
+
status (int) : OFF = 0 ; ON = 1
|
305
|
+
"""
|
306
|
+
logging.info(__name__ + " : Getting output")
|
307
|
+
self._handle = ctypes.c_void_p(
|
308
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
309
|
+
)
|
310
|
+
self._dll.sc5511a_get_device_status(
|
311
|
+
self._handle, ctypes.byref(self._device_status)
|
312
|
+
)
|
313
|
+
status = self._device_status.operate_status_t.rf1_out_enable
|
314
|
+
self._dll.sc5511a_close_device(self._handle)
|
315
|
+
return status
|
316
|
+
|
317
|
+
def do_set_frequency(self, frequency):
|
318
|
+
"""
|
319
|
+
Sets RF1 frequency. Valid between 100MHz and 20GHz
|
320
|
+
Args:
|
321
|
+
frequency (int) = frequency in Hz
|
322
|
+
"""
|
323
|
+
c_freq = ctypes.c_ulonglong(int(frequency))
|
324
|
+
logging.info(__name__ + " : Setting frequency to %s" % frequency)
|
325
|
+
close = False
|
326
|
+
if not self._open:
|
327
|
+
self._handle = ctypes.c_void_p(
|
328
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
329
|
+
)
|
330
|
+
close = True
|
331
|
+
if_set = self._dll.sc5511a_set_freq(self._handle, c_freq)
|
332
|
+
if close:
|
333
|
+
self._dll.sc5511a_close_device(self._handle)
|
334
|
+
return if_set
|
335
|
+
|
336
|
+
def do_get_frequency(self):
|
337
|
+
logging.info(__name__ + " : Getting frequency")
|
338
|
+
self._handle = ctypes.c_void_p(
|
339
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
340
|
+
)
|
341
|
+
self._dll.sc5511a_get_rf_parameters(self._handle, ctypes.byref(self._rf_params))
|
342
|
+
frequency = self._rf_params.rf1_freq
|
343
|
+
self._dll.sc5511a_close_device(self._handle)
|
344
|
+
return frequency
|
345
|
+
|
346
|
+
def do_set_reference_source(self, lock_to_external):
|
347
|
+
logging.info(__name__ + " : Setting reference source to %s" % lock_to_external)
|
348
|
+
ref_out_freq = self.do_get_ref_out_freq()
|
349
|
+
ref_out_sel = ctypes.c_ubyte(0 if ref_out_freq == 10 else 1)
|
350
|
+
lock = ctypes.c_ubyte(lock_to_external)
|
351
|
+
self._handle = ctypes.c_void_p(
|
352
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
353
|
+
)
|
354
|
+
# source = self._dll.sc5511a_set_clock_reference(self._handle, ref_out_sel, lock) #does not work for firmware > 3.6
|
355
|
+
source = self._dll.sc5511a_set_clock_reference(
|
356
|
+
self._handle, ref_out_sel, ref_out_sel, lock, lock
|
357
|
+
)
|
358
|
+
self._dll.sc5511a_close_device(self._handle)
|
359
|
+
return source
|
360
|
+
|
361
|
+
def do_set_standby(self, enable=False):
|
362
|
+
self._handle = ctypes.c_void_p(
|
363
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
364
|
+
)
|
365
|
+
error_code = self._dll.sc5511a_set_standby(self._handle, enable)
|
366
|
+
self._dll.sc5511a_close_device(self._handle)
|
367
|
+
return error_code, enable
|
368
|
+
|
369
|
+
def do_get_reference_source(self):
|
370
|
+
logging.info(__name__ + " : Getting reference source")
|
371
|
+
self._handle = ctypes.c_void_p(
|
372
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
373
|
+
)
|
374
|
+
self._dll.sc5511a_get_device_status(
|
375
|
+
self._handle, ctypes.byref(self._device_status)
|
376
|
+
)
|
377
|
+
enabled = (
|
378
|
+
self._device_status.operate_status_t.ext_ref_lock_enable
|
379
|
+
and self._device_status.operate_status_t.ext_ref_detect
|
380
|
+
)
|
381
|
+
self._dll.sc5511a_close_device(self._handle)
|
382
|
+
return enabled
|
383
|
+
|
384
|
+
def do_set_ref_out_freq(self, freq):
|
385
|
+
logging.info(__name__ + " : Setting reference out freq to %s" % freq)
|
386
|
+
if freq == 10:
|
387
|
+
ref_out_sel = 0
|
388
|
+
elif freq == 100:
|
389
|
+
ref_out_sel = 1
|
390
|
+
|
391
|
+
ref_out_sel = ctypes.c_ubyte(ref_out_sel)
|
392
|
+
lock = ctypes.c_ubyte(self.do_get_reference_source())
|
393
|
+
self._handle = ctypes.c_void_p(
|
394
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
395
|
+
)
|
396
|
+
source = self._dll.sc5511a_set_clock_reference(self._handle, ref_out_sel, lock)
|
397
|
+
self._dll.sc5511a_close_device(self._handle)
|
398
|
+
return source
|
399
|
+
|
400
|
+
def do_get_ref_out_freq(self):
|
401
|
+
logging.info(__name__ + " : Getting reference source")
|
402
|
+
self._handle = ctypes.c_void_p(
|
403
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
404
|
+
)
|
405
|
+
self._dll.sc5511a_get_device_status(
|
406
|
+
self._handle, ctypes.byref(self._device_status)
|
407
|
+
)
|
408
|
+
ref_out_sel = self._device_status.operate_status_t.ref_out_select
|
409
|
+
freq = 100 if ref_out_sel else 10
|
410
|
+
self._dll.sc5511a_close_device(self._handle)
|
411
|
+
return freq
|
412
|
+
|
413
|
+
def do_set_power(self, power):
|
414
|
+
logging.info(__name__ + " : Setting power to %s" % power)
|
415
|
+
c_power = ctypes.c_float(power)
|
416
|
+
close = False
|
417
|
+
if not self._open:
|
418
|
+
self._handle = ctypes.c_void_p(
|
419
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
420
|
+
)
|
421
|
+
close = True
|
422
|
+
completed = self._dll.sc5511a_set_level(self._handle, c_power)
|
423
|
+
if close:
|
424
|
+
self._dll.sc5511a_close_device(self._handle)
|
425
|
+
return completed
|
426
|
+
|
427
|
+
def do_get_power(self):
|
428
|
+
logging.info(__name__ + " : Getting Power")
|
429
|
+
self._handle = ctypes.c_void_p(
|
430
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
431
|
+
)
|
432
|
+
self._dll.sc5511a_get_rf_parameters(self._handle, ctypes.byref(self._rf_params))
|
433
|
+
rf_level = self._rf_params.rf_level
|
434
|
+
self._dll.sc5511a_close_device(self._handle)
|
435
|
+
return rf_level
|
436
|
+
|
437
|
+
def get_ext_ref_lock():
|
438
|
+
# prints whether or not an external reference is detected
|
439
|
+
error_code, OPERATE = SC1.get_operate_status()
|
440
|
+
if OPERATE["ext_ref_detect"] == 0:
|
441
|
+
print("There is no external reference detected")
|
442
|
+
if OPERATE["ext_ref_detect"] == 1:
|
443
|
+
print("An external reference has been detected")
|
444
|
+
_error_handler(error_code)
|
445
|
+
return OPERATE["ext_ref_detect"]
|
446
|
+
|
447
|
+
def do_set_auto_level_disable(self, enable):
|
448
|
+
logging.info(__name__ + " : Settingalc auto to %s" % enable)
|
449
|
+
if enable == 1:
|
450
|
+
enable = 0
|
451
|
+
elif enable == 0:
|
452
|
+
enable = 1
|
453
|
+
c_enable = ctypes.c_ubyte(enable)
|
454
|
+
self._handle = ctypes.c_void_p(
|
455
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
456
|
+
)
|
457
|
+
completed = self._dll.sc5511a_set_auto_level_disable(self._handle, c_enable)
|
458
|
+
self._dll.sc5511a_close_device(self._handle)
|
459
|
+
return completed
|
460
|
+
|
461
|
+
def do_get_auto_level_disable(self):
|
462
|
+
logging.info(__name__ + " : Getting alc auto status")
|
463
|
+
self._handle = ctypes.c_void_p(
|
464
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
465
|
+
)
|
466
|
+
self._dll.sc5511a_get_device_status(
|
467
|
+
self._handle, ctypes.byref(self._device_status)
|
468
|
+
)
|
469
|
+
enabled = self._device_status.operate_status_t.auto_pwr_disable
|
470
|
+
self._dll.sc5511a_close_device(self._handle)
|
471
|
+
if enabled == 1:
|
472
|
+
enabled = 0
|
473
|
+
elif enabled == 0:
|
474
|
+
enabled = 1
|
475
|
+
return enabled
|
476
|
+
|
477
|
+
def do_get_device_temp(self):
|
478
|
+
logging.info(__name__ + " : Getting device temperature")
|
479
|
+
self._handle = ctypes.c_void_p(
|
480
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
481
|
+
)
|
482
|
+
self._dll.sc5511a_get_temperature(self._handle, ctypes.byref(self._temperature))
|
483
|
+
device_temp = self._temperature.device_temp
|
484
|
+
self._dll.sc5511a_close_device(self._handle)
|
485
|
+
return device_temp
|
486
|
+
|
487
|
+
def get_idn(self) -> Dict[str, Optional[str]]:
|
488
|
+
logging.info(__name__ + " : Getting device info")
|
489
|
+
self._handle = ctypes.c_void_p(
|
490
|
+
self._dll.sc5511a_open_device(self._serial_number)
|
491
|
+
)
|
492
|
+
self._dll.sc5511a_get_device_info(self._handle, ctypes.byref(self._device_info))
|
493
|
+
device_info = self._device_info
|
494
|
+
self._dll.sc5511a_close_device(self._handle)
|
495
|
+
|
496
|
+
def date_decode(date_int: int):
|
497
|
+
date_str = f"{date_int:032b}"
|
498
|
+
yr = f"20{int(date_str[:8],2)}"
|
499
|
+
month = f"{int(date_str[16:24],2)}"
|
500
|
+
day = f"{int(date_str[8:16],2)}"
|
501
|
+
return f"{month}/{day}/{yr}"
|
502
|
+
|
503
|
+
IDN: Dict[str, Optional[str]] = {
|
504
|
+
"vendor": "SignalCore",
|
505
|
+
"model": "SC5511A",
|
506
|
+
"serial_number": self._serial_number.value.decode("utf-8"),
|
507
|
+
"firmware_revision": device_info.firmware_revision,
|
508
|
+
"hardware_revision": device_info.hardware_revision,
|
509
|
+
"manufacture_date": date_decode(device_info.manufacture_date),
|
510
|
+
}
|
511
|
+
return IDN
|
512
|
+
|
513
|
+
|
514
|
+
if __name__ == "__main__":
|
515
|
+
SC3 = SignalCore_SC5511A("SC3", "10003C69")
|