pcdsdevices.positioner.FuncPositioner
- class pcdsdevices.positioner.FuncPositioner(*, name, move, get_pos, set_pos=None, stop=None, done=None, check_value=None, info=None, egu='', limits=None, update_rate=1, timeout=60, notepad_pv=None, parent=None, kind=None, **kwargs)
Class for hacking together a positioner-like object.
Before you use this, make sure your use case cannot be easily handled by a
PVPositioner
or by aPseudoPositioner
.This should be fast to set up, but has the following limitations: - Inspection tools will not work properly, in general - typhos, happi, and similar tools will not work - It is not possible to know ahead of time if any control layer signals
poked by this device are connected.
Metadata about the control layer will not be provided.
It’s not possible to intelligently subscribe to control layer signals. Everything will be periodic polls on background threads.
Session performance may be negatively impacted by slow polling functions.
- Parameters:
name (str, keyword-only) – The name to use when we refer to this positioner.
move (func, keyword-only) – The function to call to cause the device to move. The signature must be def fn(position)
get_pos (func, keyword-only) – The function to call to check the device’s position. The signature must be def fn()
set_pos (func, optional, keyword-only) – If provided, the function to call to change the device’s shown position without moving it. The signature must be def fn(position)
stop (func, optional, keyword-only) – If provided, the function to call to stop the motor. The signature must be def fn()
done (func, optional, keyword-only) – If provided, the function to call to check if the device is done moving. The signature must be def fn() -> bool, and it must return True when motion is complete and false otherwise.
check_value (func, optional, keyword-only) – If provided, an extra function to call to check if it is safe to move. The signature must be def fn(position) -> raise ValueError
info (func, optional, keyword-only) – If provided, an extra function to add data to the ipython console pretty-print. The signature must be def fn() -> dict{str: value}.
egu (str, optional) – If provided, the metadata units for the positioner.
limits (tuple of floats, optional) – If provided, we’ll raise an exception to reject moves outside of this range.
update_rate (float, optional) – How often to update the position and check for move completion during a move. Defaults to 1 second.
timeout (float, optional) – How long to wait before marking an in-progress move as failed. Defaults to 60 seconds.
notepad_pv (str, optional) – If provided, a PV to put to whenever we move. This can be used to allow other elements in the control system to see what this positioner is doing.
Methods
- camonitor()
Shows a live-updating motor position in the terminal.
This will be the value that is returned by the
position
attribute.This method ends cleanly at a ctrl+c or after a call to
end_monitor_thread()
, which may be useful when this is called in a background thread.
- describe()
Return the description as a dictionary
- Returns:
dict – Dictionary of name and formatted description string
- end_monitor_thread()
Stop a
camonitor()
orwm_update()
that is running in another thread.
- move(*args, **kwargs)
Move to a specified position, optionally waiting for motion to complete.
- Parameters:
position – Position to move to
moved_cb (callable) – Call this callback when movement has finished. This callback must accept one keyword argument: ‘obj’ which will be set to this positioner instance.
wait (bool, optional) – Wait until motion has completed
timeout (float, optional) – Maximum time to wait for a motion
- Returns:
status (MoveStatus)
- Raises:
TimeoutError – When motion takes longer than
timeout
ValueError – On invalid positions
RuntimeError – If motion fails other than timing out
- mv(position, timeout=None, wait=False, log=True)
Absolute move to a position.
- Parameters:
position – Desired end position.
timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.
wait (bool, optional) – If
True
, wait for motion completion before returning. Defaults toFalse
.log (bool, optional) – If
True
, logs the move at INFO level.
- mv_ginput(timeout=None)
Moves to a location the user clicks on.
If there are existing plots, this will be the position on the most recently active plot. If there are no existing plots, an empty plot will be created with the motor’s limits as the range.
- mvr(delta, timeout=None, wait=False, log=True)
Relative move from this position.
- Parameters:
delta (float) – Desired change in position.
timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.
wait (bool, optional) – If
True
, wait for motion completion before returning. Defaults toFalse
.log (bool, optional) – If
True
, logs the move at INFO level.
- post_elog_status()
Post device status to the primary elog, if possible.
- read()
- read_configuration()
- screen()
Open a screen for controlling the device.
Default behavior is the typhos screen, but this method can be overridden for more specialized screens.
- set(new_position: Any, *, timeout: float | None = None, moved_cb: Callable | None = None, wait: bool = False) StatusBase
Set a value and return a Status object
- Parameters:
new_position (object) – The input here is whatever the device requires (this should be over-ridden by the implementation. For example a motor would take a float, a shutter the strings {‘Open’, ‘Close’}, and a goineometer (h, k, l) tuples
timeout (float, optional) – Maximum time to wait for the motion. If None, the default timeout for this positioner is used.
moved_cb (callable, optional) –
Deprecated
Call this callback when movement has finished. This callback must accept one keyword argument: ‘obj’ which will be set to this positioner instance.
wait (bool, optional) –
Deprecated
If the method should block until the Status object reports it is done.
Defaults to False
- Returns:
status (StatusBase) – Status object to indicate when the motion / set is done.
- set_position(position)
Alias for set_current_position.
Will fail if the motor does not have set_current_position.
- stop(*args, **kwargs)
Stops motion.
Sub-classes must extend this method to _actually_ stop the device.
- Parameters:
success (bool, optional) –
If the move should be considered a success despite the stop.
Defaults to False
- tweak(scale=0.1)
Control this motor using the arrow keys.
Use left arrow to step negative and right arrow to step positive. Use up arrow to increase step size and down arrow to decrease step size. Press q or ctrl+c to quit.
- Parameters:
scale (float) – starting step size, default = 0.1
- umv(position, timeout=None, log=True, newline=True)
Move to a position, wait, and update with a progress bar.
- Parameters:
position (float) – Desired end position.
timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.
log (bool, optional) – If True, logs the move at INFO level.
newline (bool, optional) – If True, inserts a newline after the updates.
- umvr(delta, timeout=None, log=True, newline=True)
Relative move from this position, wait, and update with a progress bar.
- Parameters:
delta (float) – Desired change in position.
timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.
log (bool, optional) – If True, logs the move at INFO level.
newline (bool, optional) – If True, inserts a newline after the updates.
- wait(timeout=None)
- wm()
Get the mover’s current positon (where motor).
- wm_update()
Shows a live-updating motor position in the terminal.
This will be the value that is returned by the
position
attribute.This method ends cleanly at a ctrl+c or after a call to
end_monitor_thread()
, which may be useful when this is called in a background thread.
Attributes
- connected
If the device is connected.
Subclasses should override this
- egu
The engineering units (EGU) for positions
- high_limit
- hints
- kind
- limits
- low_limit
- moving
Whether or not the motor is moving
- Returns:
moving (bool)
- position
- settle_time
Amount of time to wait after moves to report status completion
- subscriptions: ClassVar[FrozenSet[str]] = frozenset({'_req_done', 'done_moving', 'readback', 'start_moving'})
- timeout
Amount of time to wait before to considering a motion as failed