-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwlm.py
138 lines (109 loc) · 4.47 KB
/
wlm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"""
Module to work with High Finesse Angstrom WS7 Wavelength Meter
Or send Dummy data in debug mode
"""
import argparse
import ctypes, random, time, math
DLL_PATH = "C:\Windows\System32\wlmData.dll"
class WavelengthMeter:
def __init__(self, dllpath=DLL_PATH, debug=False):
"""
Wavelength meter class.
Argument: Optional path to the dll. Default: "C:\Windows\System32\wlmData.dll"
"""
self.channels = []
self.dllpath = dllpath
self.debug = debug
if not debug:
self.dll = ctypes.WinDLL(dllpath)
self.dll.GetWavelengthNum.restype = ctypes.c_double
self.dll.GetFrequencyNum.restype = ctypes.c_double
self.dll.GetSwitcherMode.restype = ctypes.c_long
def GetExposureMode(self):
if not self.debug:
return (self.dll.GetExposureMode(ctypes.c_bool(0))==1)
else:
return True
def SetExposureMode(self, b):
if not self.debug:
return self.dll.SetExposureMode(ctypes.c_bool(b))
else:
return 0
def GetWavelength(self, channel: int=1):
if not self.debug:
return self.dll.GetWavelengthNum(ctypes.c_long(channel), ctypes.c_double(0))
else:
return []
def GetFrequency(self, channel: int=1):
if not self.debug:
return self.dll.GetFrequencyNum(ctypes.c_long(channel), ctypes.c_double(0))*1000
else:
return []
def GetAll(self):
return {
"debug": self.debug,
"wavelength": self.GetWavelength(),
"frequency": self.GetFrequency(),
"exposureMode": self.GetExposureMode()
}
@property
def wavelengths(self):
return [self.GetWavelength(i + 1) for i in range(8)]
## For debugging purposes
@property
def wavelength(self):
return self.GetWavelength(1)
@property
def frequencies(self):
return [self.GetFrequency(i + 1) for i in range(8)]
@property
def switcher_mode(self):
if not self.debug:
return self.dll.GetSwitcherMode(ctypes.c_long(0))
else:
return 0
@switcher_mode.setter
def switcher_mode(self, mode):
if not self.debug:
self.dll.SetSwitcherMode(ctypes.c_long(int(mode)))
else:
pass
# Simulate WavelengthMeter data or use real data (depending on debug mode)
def get_wavemeter_data(wlm):
if wlm.debug:
base_wavelengths = [460.861, 689.264, 679.289, 707.202, 921.724, 800.0, 650.0, 500.0]
base_frequencies = [384229.18, 384227.29, 384232.37, 384229.26, 384230.5, 384231.0, 384228.5, 384227.0]
wavelengths_data = [base + random.uniform(-0.01, 0.01) for base in base_wavelengths]
frequencies_data = [base + random.uniform(-0.5, 0.5) for base in base_frequencies]
# Time-dependent triangular scan on wavelength[0]
current_time = time.time()
wavelengths_data[0] = base_wavelengths[0] + triangular_wave(current_time, 0.1, 20)
else:
wavelengths_data = wlm.wavelengths
frequencies_data = wlm.frequencies
return {
"wavelengths": wavelengths_data,
"frequencies": frequencies_data
}
## Dummuy data generation of triangular wave
def triangular_wave(t, amplitude=0.5, period=10):
"""Generates a triangular wave with the given amplitude and period."""
return amplitude * (2 / math.pi) * math.asin(math.sin(2 * math.pi * t / period))
if __name__ == '__main__':
# Command line arguments parsing
parser = argparse.ArgumentParser(description='Reads out wavelength values from the High Finesse Angstrom WS7 wavemeter.')
parser.add_argument('--debug', dest='debug', action='store_const',
const=True, default=False,
help='Runs the script in debug mode simulating wavelength values')
parser.add_argument('channels', metavar='ch', type=int, nargs='*',
help='Channel to get the wavelength, by default all channels from 1 to 8',
default=range(1, 9))
args = parser.parse_args()
wlm = WavelengthMeter(debug=args.debug)
# Print wavelength data for the specified channels
for i in args.channels:
print(f"Wavelength at channel {i}:\t{wlm.wavelengths[i-1]:.4f} nm")
# Example of real data interaction (or simulated)
data = get_wavemeter_data(wlm)
print("Wavelengths:", data['wavelengths'])
print("Frequencies:", data['frequencies'])