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 a PseudoPositioner.

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() or wm_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:
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 to False.

  • 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 to False.

  • 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.

status() str

Returns a str with the current pv values for the device.

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