# Control functions for the DS-Instruments DAT64L attenuators
# https://dsinstruments.com/wp-content/uploads/2013/09/DAT-Command-List-V2.pdf

import sys
import time     # delay functions

import argparse
import serial   # use the serial module (https://pypi.python.org/pypi/pyserial)

def writeCommand(ser, cmd):
  time.sleep(1) # Wait for previous command to clear
  ser.write(cmd.encode())

def readString(ser):
  time.sleep(1) # Wait for previous command to clear
  return str(ser.readline().decode())

def setDAT64Attenuation(atten_db='0', comport='5', verbose=False):
  ser = serial.Serial('COM'+comport, 115200, timeout=1)
  if verbose and ser.isOpen():    # make sure port is open
    print(ser.name + ' open...')    # tell the user we are starting

  # Only needed once to turn-off the annoying beep when changing settings
  #writeCommand(ser, '*BUZZER OFF\n')

  if verbose:
    writeCommand(ser, 'ATT?\n')
    print('Start attenuation [dB]: '+readString(ser))

  writeCommand(ser, 'ATT '+atten_db+'\n')

  if verbose:
    writeCommand(ser, 'ATT?\n')
    print('End attenuation [dB]: '+readString(ser))

def getDAT64Attenuation(comport='5', verbose=False):
  ser = serial.Serial('COM'+comport, 115200, timeout=1)
  if verbose and ser.isOpen():    # make sure port is open
    print(ser.name + ' open...')    # tell the user we are starting

  writeCommand(ser, 'ATT?\n')
  print('Current attenuation [dB]: '+readString(ser))

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument('--status', action='store_true', help='Show DAT64L status')
  parser.add_argument('--com', default='5', help='Set DAT64L serial port COM# (default=5)')
  parser.add_argument('--atten', default='0', help='Set DAT64L attenuation (0:63 dB, default=0)')
  args = parser.parse_args()

  if args.status:
    getDAT64Attenuation(args.com)
  elif '.' in args.atten:
    print('WARNING: DAT64L attenuation must be integer value (0:63)')
  else:
    atten = int(args.atten)
    if atten < 0 or atten > 63:
      print('')
      print('WARNING:')
      print('Attenuation must be 0:63dB, command will silently fail')
      print('')
    setDAT64Attenuation(args.atten, args.com)
