pilot

Classes:

Pilot([splash, warn_defaults])

Drives the Raspberry Pi

class Pilot(splash=True, warn_defaults=True)[source]

Bases: object

Drives the Raspberry Pi

Coordinates the hardware and networking objects to run tasks.

Typically used with a connection to a Terminal object to coordinate multiple subjects and tasks, but a high priority for future releases is to do the (trivial amount of) work to make this class optionally standalone.

Called as a module with the -f flag to give the location of a prefs file, eg:

python pilot.py -f prefs_file.json

if the -f flag is not passed, looks in the default location for prefs (ie. /usr/autopilot/prefs.json)

Needs the following prefs (typically established by setup.setup_pilot):

  • NAME - The name used by networking objects to address this Pilot

  • BASEDIR - The base directory for autopilot files (/usr/autopilot)

  • PUSHPORT - Router port used by the Terminal we connect to.

  • TERMINALIP - IP Address of our upstream Terminal.

  • MSGPORT - Port used by our own networking object

  • HARDWARE - Any hardware and its mapping to GPIO pins. No pins are required to be set, instead each task defines which pins it needs. Currently the default configuration asks for

    • POKES - hardware.Beambreak

    • LEDS - hardware.LED_RGB

    • PORTS - hardware.Solenoid

  • AUDIOSERVER - Which type, if any, audio server to use (‘jack’, ‘pyo’, or ‘none’)

  • NCHANNELS - Number of audio channels

  • FS - Sampling rate of audio output

  • JACKDSTRING - string used to start the jackd server, see the jack manpages eg:

    jackd -P75 -p16 -t2000 -dalsa -dhw:sndrpihifiberry -P -rfs -n3 -s &
    
  • PIGPIOMASK - Binary mask of pins for pigpio to control, see the pigpio docs , eg:

    1111110000111111111111110000
    
  • PULLUPS - Pin (board) numbers to pull up on boot

  • PULLDOWNS - Pin (board) numbers to pull down on boot.

Variables
  • name (str) – The name used to identify ourselves in networking

  • task (tasks.Task) – The currently instantiated task

  • running (threading.Event) – Flag used to control task running state

  • stage_block (threading.Event) – Flag given to a task to signal when task stages finish

  • file_block (threading.Event) – Flag used to wait for file transfers

  • state (str) – ‘RUNNING’, ‘STOPPING’, ‘IDLE’ - signals what this pilot is up to

  • pulls (list) – list of Pull objects to keep pins pulled up or down

  • server – Either a pyo_server() or JackClient , sound server.

  • node (networking.Net_Node) – Our Net_Node we use to communicate with our main networking object

  • networking (networking.Pilot_Station) – Our networking object to communicate with the outside world

  • ip (str) – Our IPv4 address

  • listens (dict) – Dictionary mapping message keys to methods used to process them.

  • logger (logging.Logger) – Used to log messages and network events.

Attributes:

server

logger

running

stage_block

file_block

quitting

mp.Event to signal when process is quitting

networking

node

Methods:

get_ip()

Get our IP

handshake()

Send the terminal our name and IP to signal that we are alive

update_state()

Send our current state to the Terminal, our Station object will cache this and will handle any future requests.

l_start(value)

Start running a task.

l_stop(value)

Stop the task.

l_param(value)

Change a task parameter mid-run

l_cal_port(value)

Initiate the calibrate_port() routine.

calibrate_port(port_name, n_clicks, ...)

Run port calibration routine

l_cal_result(value)

Save the results of a port calibration

l_bandwidth(value)

Send messages with a poissonian process according to the settings in value

l_stream_video(value)

Start or stop video streaming

calibration_curve([path, calibration])

# compute curve to compute duration from desired volume

init_pigpio()

init_audio()

Initialize an audio server depending on the value of prefs.get('AUDIOSERVER')

blank_LEDs()

If any 'LEDS' are defined in prefs.get('HARDWARE') , instantiate them, set their color to [0,0,0], and then release them.

open_file()

Setup a table to store data locally.

run_task(task_class, task_params)

Called in a new thread, run the task.

server = None
logger = None
running = None
stage_block = None
file_block = None
quitting = None

mp.Event to signal when process is quitting

networking = None
node = None
get_ip()[source]

Get our IP

handshake()[source]

Send the terminal our name and IP to signal that we are alive

update_state()[source]

Send our current state to the Terminal, our Station object will cache this and will handle any future requests.

l_start(value)[source]

Start running a task.

Get the task object by using value[‘task_type’] to select from autopilot.get_task() , then feed the rest of value as kwargs into the task object.

Calls autopilot.run_task() in a new thread

Parameters

value (dict) – A dictionary of task parameters

l_stop(value)[source]

Stop the task.

Clear the running event, set the stage block.

Todo

Do a coherence check between our local file and the Terminal’s data.

Parameters

value – ignored

l_param(value)[source]

Change a task parameter mid-run

Warning

Not Implemented

Parameters

value

l_cal_port(value)[source]

Initiate the calibrate_port() routine.

Parameters

value (dict) – Dictionary of values defining the port calibration to be run, including - port - which port to calibrate - n_clicks - how many openings should be performed - open_dur - how long the valve should be open - iti - ‘inter-trial interval`, or how long should we wait between valve openings.

calibrate_port(port_name, n_clicks, open_dur, iti)[source]

Run port calibration routine

Open a hardware.gpio.Solenoid repeatedly, measure volume of water dispersed, compute lookup table mapping valve open times to volume.

Continuously sends progress of test with CAL_PROGRESS messages

Parameters
  • port_name (str) – Port name as specified in prefs

  • n_clicks (int) – number of times the valve should be opened

  • open_dur (int, float) – how long the valve should be opened for in ms

  • iti (int, float) – how long we should sleep() between openings

l_cal_result(value)[source]

Save the results of a port calibration

l_bandwidth(value)[source]

Send messages with a poissonian process according to the settings in value

l_stream_video(value)[source]

Start or stop video streaming

Parameters

value (dict) –

a dictionary of the form:

{
    'starting': bool, # whether we're starting (True) or stopping
    'camera': str, # the camera to start/stop, of form 'group.camera_id'
    'stream_to': node id that the camera should send to
}
calibration_curve(path=None, calibration=None)[source]

# compute curve to compute duration from desired volume

Parameters
  • calibration

  • path – If present, use calibration file specified, otherwise use default.

init_pigpio()[source]
init_audio()[source]

Initialize an audio server depending on the value of prefs.get(‘AUDIOSERVER’)

blank_LEDs()[source]

If any ‘LEDS’ are defined in prefs.get(‘HARDWARE’) , instantiate them, set their color to [0,0,0], and then release them.

open_file()[source]

Setup a table to store data locally.

Opens prefs.get(‘DATADIR’)/local.h5, creates a group for the current subject, a new table for the current day.

Todo

This needs to be unified with a general file constructor abstracted from Subject so it doesn’t reimplement file creation!!

Returns

(tables.File, tables.Table, tables.tableextension.Row): The file, table, and row for the local data table

run_task(task_class, task_params)[source]

Called in a new thread, run the task.

Opens a file with open_file() , then continually calls task.stages.next to process stages.

Sends data back to the terminal between every stage.

Waits for the task to clear stage_block between stages.