How to use SPI Bit Bang in MPF

Related Config File Sections
spi_bit_bang:
digital_outputs:
switches:

Sometimes you want to read switches from PCBs which contain a shift register or SPI chip (i.e. a 74HCT165). This platforms uses two digital_outputs: and one switches: on another platform to address the SPI chip. Please note that this is relatively slow compared to platforms which interface to SPI natively (such as How to use MPF with Stern SPIKE / SPIKE 2 machines). The main purpose of this platform is to access Stern Spike boards using other control systems than Spike. Primarily, this allows you to use the Spike Trough on any system. However, if you are on Spike or any other platform which natively reads switches via SPI use those means since they are much more efficient.

This is an example:

hardware:
    platform: your_platform, spi_bit_bang    # add your platform first here

spi_bit_bang:
    miso_pin: s_miso
    cs_pin: o_cs
    clock_pin: o_clock
    bit_time: 50ms
    inputs: 8

digital_outputs:
    o_cs:
        number: 1
        type: driver
    o_clock:
        number: 2
        type: driver

switches:
    s_trough_0:
        number: 0
        platform: spi_bit_bang
    s_trough_1:
        number: 1
        platform: spi_bit_bang
    s_trough_2:
        number: 2
        platform: spi_bit_bang
    s_trough_3:
        number: 3
        platform: spi_bit_bang
    s_trough_4:
        number: 4
        platform: spi_bit_bang
    s_trough_5:
        number: 5
        platform: spi_bit_bang
    s_trough_6:
        number: 6
        platform: spi_bit_bang
    s_trough_7:
        number: 7
        platform: spi_bit_bang
    s_miso:
        number: 10

The refresh rate of your platform will be bit_time / (inputs + 2). For instance 8 inputs with 50ms bit_time will result in 2Hz update rate which is not terribly good.

bit_time determines how long MPF will wait after clocking the chip for miso_pin to settle. Depending on your platform it might this might need a while. Especially if your platform is connected via USB because of USB latency and jitter. If your inputs are local (i.e. on a RPi) this might be very short compared and you might be able to achieve 50Hz. At the default 2Hz you will wait in average 250ms for a switch change and 500ms in the worst case. Take that in mind.