#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
DeStatiX A9 LED Tester - dynattenik@

Simple test for the 9 LED USB-RS232 adapter (8 signal LEDs + 1 power LED):
lights one LED at a time, in order, forever, until Ctrl+C.

    python DeStatiX_A9_LED_Tester.py          # 0.5 s per LED
    python DeStatiX_A9_LED_Tester.py 0.2      # 0.2 s per LED

Requires: pip install ftd2xx + FTDI official D2XX driver.
"""

import sys
import time

import ftd2xx

# bit0 TXD  bit1 RXD  bit2 RTS  bit3 CTS  bit4 DTR  bit5 DSR  bit6 DCD  bit7 RI
BIT = {'TXD': 0, 'RXD': 1, 'RTS': 2, 'CTS': 3,
       'DTR': 4, 'DSR': 5, 'DCD': 6, 'RI': 7}

ORDER = ['DTR', 'TXD', 'RXD', 'DCD', 'RI', 'CTS', 'RTS', 'DSR']  # lighting order
DELAY = 0.5                                                       # seconds per LED


def main():
    delay = float(sys.argv[1]) if len(sys.argv) > 1 else DELAY

    dev = ftd2xx.open(0)              # first D2XX device
    dev.setBaudRate(921600)
    dev.setBitMode(0xFF, 0x01)        # 0x01 = asynchronous bit-bang, all outputs

    print('dynattenik@  DeStatiX A9 LED tester  -  Ctrl+C to stop')
    print('order: %s' % ' -> '.join(ORDER))

    try:
        while True:
            for name in ORDER:
                value = 0xFF ^ (1 << BIT[name])   # pull one bit low = LED on
                dev.write(bytes([value]))
                print('\r  LED: %-4s  byte: 0x%02X  %s'
                      % (name, value, format(value, '08b')), end='', flush=True)
                time.sleep(delay)
    except KeyboardInterrupt:
        print('\nstopping ...')
    finally:
        dev.write(b'\xFF')            # all LEDs off
        dev.setBitMode(0x00, 0x00)    # leave bit-bang mode
        dev.close()
        print('all LEDs off, device closed.')


if __name__ == '__main__':
    main()
