Skip to content

TL: Modify a driver's trigger

FAST Serial Protocol: Overview & First Steps

This documentation section is about the FAST Serial Protocol (FSP) commands, which are the low-level commands a host computer sends to a FAST board. Most FAST Pinball makers do not need to know about these details, since the pinball game framework (such as the Mission Pinball Framework) handles this communication for you.

If you're writing your own game framework, we have a series of programming guides. Also, be sure to read the overview of how FSP works and how to connect first.

The TL: command modifies how a driver is triggered and/or manually triggers it to fire.

Nano Controllers use N instead

The FAST Nano Controller uses the letter N for switch & driver-related commands instead of L. So everything here applies to the Nano too, except the commands are -N: /N: SN: DN: QN:.

This command only works for existing drivers which have been previously configured using the DL: command. (If you're not familiar with the DL: command, read about it first, including the section on how FAST drivers work.)

Once configured, a driver's "trigger" is whatever causes it to activate. For hardware-controlled drivers, that's a switch in the machine changing state, and for software-controlled drivers, that's using this command itself. (So what happens when a driver is actually triggered? That depends on the driver mode you configured with the DL: command.)

Some examples of trigger-related things you can do with the TL: command include:

  • Manually fire a driver (eject a ball, pulse a magnet, enable a motor, reset targets, pop a bumper during ball search, etc.)
  • Disconnect a driver from its autofire switch (disable pops, slings, and flippers during tilt or game end)
  • Connect a driver to its autofire switch (enable flippers, pops, etc. on ball start)
  • Changes the switch a driver uses for autofire actions (swapped flipper button "drunk mode")

All of these actions could, in theory, be achieved by sending a new driver config via the DL: command, however, using the TL: command is preferred. The main reason for this is since the DL: command destroys the existing driver object, any running timers (cool down, rapid fire, pwm times) or transitions (switch debouncing) in process are hard killed, and the driver is completely reset. (For example, if you applied a new DL: command to a flipper driver while the player was holding the button, the flipper would deactivate since it was killed and then reactivate once the new one got set up.) The TL: command just changes the trigger for an existing running driver, so all the timers and other processes stay intact.

Also the TL: command is much faster. (The TL: command will typically return a TL:P response in 1-2ms, versus 10-30ms when a DL: command is used to set up a new driver object.)

Command Syntax

TL:<driver_id>,<control>,<switch_id>

<driver_id>

FAST driver number, zero-based, in hex. (Remember all values in the FAST Serial Protocol are in hex.)

<control>

A value which is used to manually trigger this driver or to enable/disable physical switch control

  • 0 = Sets the driver to automatic (hardware-controlled) mode, meaning the driver will fire when its associated switch changes state.
  • 1 = Manually "tap" the driver, used to manually fire pulse-type driver modes (eject a ball, reset drop target, fire the knocker). This command does not change the prior automatic setting and the driver stays in whatever state it was before this command manually fired it.
  • 2 = Turn the driver off and disconnect it from its physical switch (disable an autofire driver during tilt, after game, turn off a motor, etc.)
  • 3 = Turn the driver on, used with hold-type driver modes (turn on a motor, enable the bill validator, etc.) If the driver was set for automatic mode, this will disable the automatic mode as well.

Geek dive on how the TL: command really works

Technically-speaking, this control value temporarily overrides portions of the trigger bitmask for a driver which had been previously configured via the DL: command. Here's that trigger bitmask again:

BIT    7           6       5        4        3         2         1         0
      [DISABLE_SW][MANUAL][INV_SW2][INV_SW1][ONE_SHOT][NOT USED][NOT USED][DRV_ENA]

And here's how the various TL: control modes modify this bitmask for the driver.

  • 0 = Auto, clears bit 6 (MANUAL) and 7 (DISABLE_SW)
  • 1 = Manual tap, sets bit 3 (ONE_SHOT)
  • 2 = Driver off, sets bit 7 (DISABLE_SW), clears bit 6 (MANUAL)
  • 3 = Driver on, sets bit 6 (MANUAL) and 7 (DISABLE_SW)

<switch_id>

This parameter is optional and not commonly used.

Changes the physical switch associated with a driver's autofire configuration. This value will completely replace and overwrite whatever switch value was sent via the original DL: command. To change back to the original switch, send another TL: command with the original switch numbers.

This value is the FAST switch number, zero-based, hex. For example, TL:10,00,16 changes the switch that controls Driver 10 to switch 16.

In practical use, this could be used to implement a "novelty flipper" modes. You could use the TL: command for each flipper driver to:

  • Swap the left and right flipper buttons that control the driver (swapped flippers)
  • Disable the hold coil while keeping the main coil configured normally (no hold flippers)

(If you want to change the flipper strength (weak flippers), or invert the switches (flippers up by default, push button to lower them), you would need to send new DL: commands.)

Real-world examples

If you want to see examples of how the TL: command is used and how it relates to the DL: command, we have examples for common uses like pop bumpers and flippers in our programming guide.

N or > jump the next page, P or < for previous, search with S or ?