#!   /usr/bin/env   python
#    coding: utf8
# Copyright CERN, 2011
# Author: Matthieu Cattin <matthieu.cattin@cern.ch>
# Licence: GPL v2 or later.
# Website: http://www.ohwr.org
# Last modifications: 23/5/2012

# Import system modules
import sys
import time
import os

# Import specific modules
from fmc_adc_spec import *
from fmc_adc import *

# Import common modules
from ptsexcept import *
import rr


from PAGE.Agilent33250A import *
from PAGE.SineWaveform import *

"""
test06: Test trigger input

Note: Requires test00.py to run first to load the gateware!
"""

def main (default_directory='.'):

    # Constants declaration
    TEST_NB = 6
    EXPECTED_BITSTREAM_TYPE = 0x1

    USB_DEVICE = "/dev/ttyUSB0"
    RS232_BAUD = 57600
    NB_CHANNELS = 4
    PRE_TRIG_SAMPLES = 500
    POST_TRIG_SAMPLES = 500
    NB_SHOTS = 1
    TIMEOUT = 0.5


    start_test_time = time.time()
    print "================================================================================"
    print "Test%02d start\n" % TEST_NB

    # SPEC object declaration
    print "Loading hardware access library and opening device.\n"
    spec = rr.Gennum()

    # Carrier object declaration (SPEC board specific part)
    # Used to check that the gateware is loaded.
    try:
        carrier = CFmcAdc100mSpec(spec, EXPECTED_BITSTREAM_TYPE)
    except FmcAdc100mSpecOperationError as e:
        raise PtsCritical("Carrier init failed, test stopped: %s" % e)

    # Mezzanine object declaration (FmcAdc100m14b4cha board specific part)
    try:
        fmc = CFmcAdc100m(spec)
    except FmcAdc100mOperationError as e:
        raise PtsCritical("Mezzanine init failed, test stopped: %s" % e)

    try:
        gen = Agilent33250A(device=USB_DEVICE, bauds=RS232_BAUD)
        sine = SineWaveform()

        # Set sine params
        sine.frequency = 1E3
        sine.amplitude = 1
        sine.dc = 0

        # Set AWG and turn it ON
        gen.connect()
        gen.load50 = True
        gen.output = True
        gen.sync = True
        gen.play(sine)

        # Disconnect all inputs
        for i in range(1, NB_CHANNELS+1):
            fmc.set_input_range(i, "OPEN")

        # Set trigger
        # hw trig, rising edge, external, sw disable, no delay
        fmc.set_trig_config(1, 0, 1, 1, 1, 0, 0)

        # Set acquisition
        fmc.set_pre_trig_samples(PRE_TRIG_SAMPLES)
        fmc.set_post_trig_samples(POST_TRIG_SAMPLES)
        fmc.set_shots(NB_SHOTS)

        # Start acquisition
        fmc.stop_acq()
        print "Acquisition FSM state : %s (should be IDLE)" % fmc.get_acq_fsm_state()
        fmc.start_acq()
        print "Wait for trigger."
        time.sleep(TIMEOUT)

        # Switch AWG OFF
        gen.output = False
        gen.sync = False
        gen.close()

        # Check if the trigger has been received
        if('WAIT_TRIG' == fmc.get_acq_fsm_state()):
            print "Acquisition FSM state : %s" % fmc.get_acq_fsm_state()
        else:
            print "The external trigger input is working fine."

    except FmcAdc100mOperationError as e:
        raise PtsError("Test Failed: %s" % e)


    print ""
    print "==> End of test%02d" % TEST_NB
    print "================================================================================"
    end_test_time = time.time()
    print "Test%02d elapsed time: %.2f seconds\n" % (TEST_NB, end_test_time-start_test_time)

    # Raise excepetion if the trigger hasn't been received
    if('WAIT_TRIG' == fmc.get_acq_fsm_state()):
        raise PtsError('External trigger input is not working.')


if __name__ == '__main__' :
    main()
