# for PYTHON 3+ with pySerial module installed
# DS INSTRUMENTS 2017 PYTHON SCPI REMOTE CONTROL EXAMPLE
#
# MyDrive/StingerTeam/Manuals/RFSynth

import serial   # use the serial module (https://pypi.python.org/pypi/pyserial)
import time     # delay functions
import sys

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 errorString(ser):
  writeCommand(ser, 'SYST:ERR?\n')
  return readString(ser)

def sendSG400LSettings(reset='0', frq_mhz='1575.42', pwr_dbm='0.0', verbose=False):
  ser = serial.Serial("COM3", 115200, timeout=1)  # Change the COM PORT NUMBER to match your device
  if verbose and ser.isOpen():    # make sure port is open
    print(ser.name + ' open...')    # tell the user we are starting

  if (reset == '1'):
    print('Reseting SG4400 - wait...')
    writeCommand(ser, '*RST\n')
    time.sleep(15) # Wait a while for the box to reboot
    print('RESET: '+readString(ser)) # print the unit information

  # Only needed once to turn-off the annoying beep when changing settings
  #writeCommand(ser, '*BUZZER OFF\n')

  if pwr_dbm == 'off':    
    writeCommand(ser, 'OUTP:STAT OFF\n')
  else:
    writeCommand(ser, 'OUTP:STAT ON\n')
    writeCommand(ser, 'POWER '+pwr_dbm+'\n')
    if verbose:
      print('POWER Resp: '+errorString(ser))

  writeCommand(ser, 'FREQ:CW '+frq_mhz+'MHZ\n')
  if verbose:
    print('FREQ Resp: '+errorString(ser))

  if verbose:
    writeCommand(ser, 'FREQ:CW?\n')
    print('Freq: '+readString(ser))
    writeCommand(ser, 'POWER?\n')
    print('Power: '+readString(ser))
    writeCommand(ser, 'OUTP:STAT?\n')
    print('Output: '+readString(ser))

if __name__ == "__main__":
  frq_mhz = str(1580.42)
  pwr_dbm = str(-20.0)
  reset = str(0)

  if (len(sys.argv) > 1):
    frq_mhz = sys.argv[1]
  if (len(sys.argv) > 2):
    pwr_dbm = sys.argv[2] # -20 to 10dBm or 'off'
  if (len(sys.argv) > 3):
    reset = sys.argv[3]

  if pwr_dbm != 'off':
    tmp_pwr = float(pwr_dbm)
    if tmp_pwr < -21.5 or tmp_pwr > 10:
      print('')
      print('WARNING:')
      print('Power range is -21.5 to 10dBm, command will silently fail')
      print('')

  sendSG400LSettings(reset, frq_mhz, pwr_dbm)
