#########################################
###### DO NOT MODIFY THE CODE BELOW #####
#########################################
global print_log, sendFeedback, sys, inspect, os, traceback, testcommons
import sys, inspect, os, traceback, testcommons

def print_log(testName, DEVICE, text):
    testcommons.print_log(testName, DEVICE, text)
    
def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
    ret = testcommons.sendFeedback(testPath, testName, DEVICE, returnString, testPassed)
    set_return(ret)
    
def startTest(testName, DEVICE, params):
    #get the path of this script
    testcommons.print_pio()
    import inspect
    testPath = inspect.getfile(inspect.currentframe()) 
    #by default, failed 
    ret = 'Test failed'
    success = False   
    #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
    plotName = DEVICE + ' - ' + testName    
#########################################	
###### WRITE YOUR CODE HERE BELOW #######  
#########################################
    print_log(testName, DEVICE, 'testpath A: ' + testPath )
    print_log(testName, DEVICE, 'parameters: '  + str(params) )
    print_log(testName, DEVICE, 'device: ' + DEVICE  )
    #scan = ManualScan(['time'], ['SetV', 'ActualV', 'ActualI'] , [0.0], [30.0], [20])
    scan = ManualScan(['time'], ['SetV', 'ActualV', 'ActualI'])
    scan.setPlotTitle(plotName)
    scan.start()
    try:
        #Creating channels: dimension 1
        #Ramp rate
        SetRamp = Channel(DEVICE + ':Set-RampA', type = 'd')
        #SetRamp = Channel('pw84:ai', type = 'd')
        #LinearPositioner SetV
        SetV = Channel(DEVICE + ':Set-VA', type = 'd')
        #SetV = Channel('pw84:ai', type = 'd')
        #Timestamp time
        #ScalarDetector ActualV
        ActualV = Channel(DEVICE + ':Actual-VA', type = 'd')
        #ActualV = Channel('pw84:ai', type = 'd')
        #ScalarDetector ActualI
        ActualI = Channel(DEVICE + ':Actual-IA', type = 'd')
        #ActualI = Channel('pw84:ai', type = 'd')
    except:
        import traceback
        sendFeedback(testPath, testName, DEVICE, 'Unable to create channel - ' + traceback.format_exc(), False)
        #raise Exception('Unable to create channel - ' + traceback.format_exc())   
        return

    #Init
    SetRamp.put(10.0, timeout=None)

    #set voltage to 0
    print_log(testName, DEVICE,  'Ramping down power supply A to 0V' )
    SetV.put(0.0, timeout=None)

    #wait up to 2 minutes for voltage to be ~0
    for setpoint1 in frange(0.0, 120.0, 1.0, True):
        detector2 = ActualV.get()
        if detector2 <= 1.0:
            break
        sleep(0.5)

    #Dimension 1
    #LinearPositioner SetV
    print_log(testName, DEVICE,  'Ramping up power supply A' )
    for setpoint1 in frange(0.0, 20.0, 5.0, True): 
        if setpoint1 > 50.0 or setpoint1 < 0.0:
            break
        SetV.put(setpoint1, timeout=None) # TODO: Set appropriate timeout
        readback1 = SetV.get()
        if abs(readback1 - setpoint1) > 0.9 : # TODO: Check accuracy
            raise Exception('SetV could not be set to the value ' + str(setpoint1))
            ret = 'SetV could not be set to the value ' + str(setpoint1) + '(measured value: '+str(readback1)+')'
            success = False        
            break
        #scan quickly the output during some seconds
        for setpoint2 in range(0, 20):
            #Detector time
            detector1 = float(java.lang.System.currentTimeMillis())
            #Detector ActualV
            detector2 = ActualV.get()
            detector3 = ActualI.get()
            #scan.append ([setpoint1], [readback1], [detector1, detector2])
            #append(setpoints, positions, values)
            scan.append ([detector1], [detector1], [readback1, detector2, detector3]) 
            sleep( 0.1 ) # Settling time        
        ret = 'Test ps A completed'
        success = True

    #reset output to 0V
    SetV.put(0.0, timeout=None)
    #Closing channels
    SetV.close()
    ActualV.close()
    ActualI.close()

    scan.end()
#########################################	
############# END OF YOUR CODE ##########
#########################################
###### DO NOT MODIFY THE CODE BELOW #####
#########################################        
    sendFeedback(testPath, testName, DEVICE, ret, success)


#launch the test
#parameters = {}
startTest(test, device, parameters)
    