*** Wartungsfenster jeden ersten Mittwoch vormittag im Monat ***

Skip to content
Snippets Groups Projects
Commit 00ef24ed authored by Schabbauer, Johannes's avatar Schabbauer, Johannes
Browse files

Merge branch 'main' into 'spectrumCard'

# Conflicts:
#   TimeBaseAOMDriver/blacs_workers.py
parents d55bc061 7a5d04de
No related branches found
No related tags found
1 merge request!2Added new spectrum awg card.
...@@ -7,10 +7,6 @@ ...@@ -7,10 +7,6 @@
# # # #
##################################################################### #####################################################################
import numpy as np
from labscript_utils import dedent
from enum import IntEnum
from labscript_devices.IMAQdxCamera.blacs_workers import IMAQdxCameraWorker from labscript_devices.IMAQdxCamera.blacs_workers import IMAQdxCameraWorker
# Don't import API yet so as not to throw an error, allow worker to run as a dummy # Don't import API yet so as not to throw an error, allow worker to run as a dummy
...@@ -26,17 +22,9 @@ class DCAM_Camera(object): ...@@ -26,17 +22,9 @@ class DCAM_Camera(object):
(i.e. transition_to_buffered, get_attributes, snap, etc). (i.e. transition_to_buffered, get_attributes, snap, etc).
Attributes: Attributes:
propList (dict): Dictionary with property names and keys.
timeout (int): Timeout in ms
camera (dcamAPI.Dcam): Handle to connected camera. camera (dcamAPI.Dcam): Handle to connected camera.
get_props (list): This list sets which values of each property object
are returned when queried by :obj:`get_attribute`.
pixel_formats (IntEnum): An IntEnum object that is automatically
populated with the supported pixel types of the connected camera.
width (int): Width of images for most recent acquisition.
Used by :obj:`_decode_image_data` to format images correctly.
height (int): Height of images for most recent acquisition.
Used by :obj:`_decode_image_data` to format images correctly.
pixelFormat (str): Pixel format name for most recent acquisition.
Used by :obj:`_decode_image_data` to format images correctly.
_abort_acquisition (bool): Abort flag that is polled during buffered _abort_acquisition (bool): Abort flag that is polled during buffered
acquisitions. acquisitions.
""" """
...@@ -52,9 +40,9 @@ class DCAM_Camera(object): ...@@ -52,9 +40,9 @@ class DCAM_Camera(object):
This function also does a significant amount of default configuration. This function also does a significant amount of default configuration.
Args: Args:
serial_number (str): serial number of camera to connect to serial_number (int): serial number of camera to connect to
""" """
self.timeout = 60000 self.timeout = 5000
global dcamAPI global dcamAPI
import user_devices.DCAMCamera.dcam as dcamAPI import user_devices.DCAMCamera.dcam as dcamAPI
...@@ -65,7 +53,7 @@ class DCAM_Camera(object): ...@@ -65,7 +53,7 @@ class DCAM_Camera(object):
dcamAPI.Dcamapi.uninit() dcamAPI.Dcamapi.uninit()
raise RuntimeError(msg) raise RuntimeError(msg)
print('Connecting to S/N: %s ...'%serial_number) print(f'Connecting to S/N: {serial_number:06x} ...')
#Iterate Trough Cameras #Iterate Trough Cameras
for camID in range(dcamAPI.Dcamapi.get_devicecount()): for camID in range(dcamAPI.Dcamapi.get_devicecount()):
self.camera = dcamAPI.Dcam(camID) self.camera = dcamAPI.Dcam(camID)
...@@ -106,7 +94,6 @@ class DCAM_Camera(object): ...@@ -106,7 +94,6 @@ class DCAM_Camera(object):
Args: Args:
attr_dict (dict): dictionary of property dictionaries to set for the camera. attr_dict (dict): dictionary of property dictionaries to set for the camera.
""" """
print(attr_dict)
for attr, value in attr_dict.items(): for attr, value in attr_dict.items():
propID = self.propList[attr] propID = self.propList[attr]
self.camera.prop_setvalue(propID,value) self.camera.prop_setvalue(propID,value)
...@@ -154,8 +141,6 @@ class DCAM_Camera(object): ...@@ -154,8 +141,6 @@ class DCAM_Camera(object):
Returns: Returns:
numpy.array: Acquired image numpy.array: Acquired image
""" """
self.camera
self.configure_acquisition(continuous=False,bufferCount=1) self.configure_acquisition(continuous=False,bufferCount=1)
self.camera.cap_snapshot() self.camera.cap_snapshot()
...@@ -176,8 +161,6 @@ class DCAM_Camera(object): ...@@ -176,8 +161,6 @@ class DCAM_Camera(object):
def configure_acquisition(self, continuous=True, bufferCount=10): def configure_acquisition(self, continuous=True, bufferCount=10):
"""Configure acquisition buffer count and grab mode. """Configure acquisition buffer count and grab mode.
This method also saves image width, heigh, and pixelFormat to class
attributes for returned image formatting.
Args: Args:
continuous (:obj:`bool`, optional): If True, camera will continuously continuous (:obj:`bool`, optional): If True, camera will continuously
...@@ -194,26 +177,27 @@ class DCAM_Camera(object): ...@@ -194,26 +177,27 @@ class DCAM_Camera(object):
msg='Dcam.buf_alloc() fails with error {}'.format(dcamAPI.DCAMERR(dcamAPI.Dcamapi.lasterr()).name) msg='Dcam.buf_alloc() fails with error {}'.format(dcamAPI.DCAMERR(dcamAPI.Dcamapi.lasterr()).name)
raise RuntimeError(msg) raise RuntimeError(msg)
self.width = self.camera.prop_getvalue(dcamAPI.DCAM_IDPROP.IMAGE_WIDTH) # Start acquisition
self.height = self.camera.prop_getvalue(dcamAPI.DCAM_IDPROP.IMAGE_HEIGHT) # if continuous or bufferCount>1:
self.pixelFormat = self.camera.prop_getvaluetext(dcamAPI.DCAM_IDPROP.IMAGE_PIXELTYPE,self.camera.prop_getvalue(dcamAPI.DCAM_IDPROP.IMAGE_PIXELTYPE)) self.camera.cap_start()
if continuous:
self.camera.cap_start(True)
def grab(self): def grab(self,bufferNo=-1):
"""Grab and return single image during pre-configured acquisition. """Grab and return single image during pre-configured acquisition.
Args:
bufferNo (int): number of image in buffer.
If bufferNo=-1 (default), the function call of
buf_getframedata() is equal to buf_getlastframedata()
Returns: Returns:
numpy.array: Returns formatted image numpy.array: Returns formatted image
""" """
if(self.camera.cap_status()==dcamAPI.DCAMCAP_STATUS.READY): if self.camera.wait_capevent_frameready(self.timeout):
self.camera.cap_start() image = self.camera.buf_getframedata(bufferNo)
if self.camera.wait_capevent_frameready(self.timeout) is not False:
image = self.camera.buf_getlastframedata()
else: else:
dcamerr = dcamAPI.Dcamapi.lasterr() dcamerr = dcamAPI.Dcamapi.lasterr()
if dcamerr.is_timeout(): if dcamerr.is_timeout():
print('===: timeout') raise RuntimeError('===: timeout')
else: else:
msg='Dcam.wait() fails with error {}'.format(dcamAPI.DCAMERR(dcamerr).name) msg='Dcam.wait() fails with error {}'.format(dcamAPI.DCAMERR(dcamerr).name)
raise RuntimeError(msg) raise RuntimeError(msg)
...@@ -237,8 +221,8 @@ class DCAM_Camera(object): ...@@ -237,8 +221,8 @@ class DCAM_Camera(object):
print("Abort during acquisition.") print("Abort during acquisition.")
self._abort_acquisition = False self._abort_acquisition = False
return return
images.append(self.grab()) images.append(self.grab(bufferNo=i))
print(f"Got image {i+1} of {n_images}.") print(f"Got image {i+1} of {n_images}.")
print(f"Got {len(images)} of {n_images} images.") print(f"Got {len(images)} of {n_images} images.")
...@@ -258,10 +242,10 @@ class DCAM_Camera(object): ...@@ -258,10 +242,10 @@ class DCAM_Camera(object):
dcamAPI.Dcamapi.uninit() dcamAPI.Dcamapi.uninit()
class DCAMCameraWorker(IMAQdxCameraWorker): class DCAMCameraWorker(IMAQdxCameraWorker):
"""FlyCapture2 API Camera Worker. """DCAMCameraWorker API Camera Worker.
Inherits from obj:`IMAQdxCameraWorker`. Defines :obj:`interface_class` and overloads Inherits from obj:`IMAQdxCameraWorker`. Defines :obj:`interface_class` and overloads
:obj:`get_attributes_as_dict` to use FlyCapture2Camera.get_attributes() method.""" :obj:`get_attributes_as_dict` to use DCAMCameraWorker.get_attributes() method."""
interface_class = DCAM_Camera interface_class = DCAM_Camera
def get_attributes_as_dict(self, visibility_level): def get_attributes_as_dict(self, visibility_level):
......
...@@ -34,13 +34,13 @@ class TimeBaseWorker(Worker): ...@@ -34,13 +34,13 @@ class TimeBaseWorker(Worker):
group = file[f"devices/{device_name}"] group = file[f"devices/{device_name}"]
for channel in group: for channel in group:
for attr,value in group[channel].attrs.items(): for attr,value in group[channel].attrs.items():
if self.smart_cache[channel][attr] != group[channel].attrs[attr] or fresh: if self.smart_cache[channel].get(attr) != group[channel].attrs[attr] or fresh:
# Disable sweep mode, if it was in use. # Disable sweep mode, if it was in use.
# This is necessary is update the sweep mode parameters. # This is necessary is update the sweep mode parameters.
if self.smart_cache["Sswpm"] != 0: if self.smart_cache[channel].get("Sswpm") != 0:
print(f"Programming {channel}, Sswpm=0") print(f"Programming {channel}, Sswpm=0")
self.client.send(f"{channel}|Sswpm:0\r\n".encode()) self.client.send(f"{channel}|Sswpm:0\r\n".encode())
self.smart_cache["Sswpm"] = 0 self.smart_cache[channel]["Sswpm"] = 0
time.sleep(0.01) time.sleep(0.01)
if attr == "Sswpm": if attr == "Sswpm":
# Skip sweep mode, becasue I want to enable it only after # Skip sweep mode, becasue I want to enable it only after
...@@ -51,10 +51,10 @@ class TimeBaseWorker(Worker): ...@@ -51,10 +51,10 @@ class TimeBaseWorker(Worker):
self.smart_cache[channel][attr] = group[channel].attrs[attr] self.smart_cache[channel][attr] = group[channel].attrs[attr]
time.sleep(0.01) # TODO: What's the best time here? Do we need to wait at all? According to the DIM-3000 manual the rate is 10 commands per second, it seems router can also handle faster times? time.sleep(0.01) # TODO: What's the best time here? Do we need to wait at all? According to the DIM-3000 manual the rate is 10 commands per second, it seems router can also handle faster times?
# Program actual value of sweep mode # Program actual value of sweep mode
if group[channel]["Sswpm"] != 0: if group[channel].attrs["Sswpm"] != 0:
print(f"Programming {channel}, Sswpm") print(f"Programming {channel}, Sswpm")
self.client.send(f"{channel}|Sswpm:{group[channel]['Sswpm']}\r\n".encode()) self.client.send(f"{channel}|Sswpm:{group[channel].attrs['Sswpm']}\r\n".encode())
self.smart_cache["Sswpm"] = {group[channel]['Sswpm']} self.smart_cache[channel]["Sswpm"] = {group[channel].attrs['Sswpm']}
time.sleep(0.01) time.sleep(0.01)
if not initial_values[channel]["gate"]: if not initial_values[channel]["gate"]:
......
...@@ -71,7 +71,8 @@ class TimeBaseAOM(Device): ...@@ -71,7 +71,8 @@ class TimeBaseAOM(Device):
""" """
if value not in self.parent_device.FM_deviations: if value not in self.parent_device.FM_deviations:
raise LabscriptError(f"FM devivation of {self.name} is none of the allowed values.") raise LabscriptError(f"FM devivation of {self.name} is none of the allowed values.")
self.FM_deviation.constant(value) set_value = int(np.round(np.log2(value/3200)))
self.FM_deviation.constant(set_value)
...@@ -158,6 +159,8 @@ class TimeBaseAOMDriver(Device): ...@@ -158,6 +159,8 @@ class TimeBaseAOMDriver(Device):
if command=="Sampl": if command=="Sampl":
# Amplitude has to be programmed in 0.1*dBm # Amplitude has to be programmed in 0.1*dBm
AOM_group.attrs[command] = np.round(10*output.static_value).astype(np.int32) AOM_group.attrs[command] = np.round(10*output.static_value).astype(np.int32)
AOM_group.attrs["Sfampl"] =np.round(10*output.static_value).astype(np.int32)
else: else:
AOM_group.attrs[command] = np.round(output.static_value).astype(np.int32) AOM_group.attrs[command] = np.round(output.static_value).astype(np.int32)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment