import time
import sys
from labjack import ljm

# Important! Change these to match your devices
generator_id = "480010001"
receiver_id = "480010002"

# Open two LabJack T8s
print("\nExample: Running ESS Stream on two Labjack T8s")
generator_handle = ljm.openS("T8", "ANY", generator_id)  # Only T8s are supported
receiver_handle = ljm.openS("T8", "ANY", receiver_id)  # Only T8s are supported

print("\nMake sure FIO3 of the Generator is connected to it's own FIO1 and the Receiver's FIO1")

# Stream Configuration
scanRate = 1000
numReads = 10  # The number of eStreamRead calls that will be performed.
aScanListNames = ["AIN0", "AIN1"]  # Scan list names to stream
numAddresses = len(aScanListNames)
aScanList = ljm.namesToAddresses(numAddresses, aScanListNames)[0]

scansPerRead = int(scanRate / 2)
success = True
totSamples = 0

# First configure the Receiver, then the Generator
try:
    # Configure the Receiver
    ljm.eWriteName(receiver_handle, "STREAM_CLOCK_SOURCE", 8) # Important!
    ljm.eWriteName(receiver_handle, "STREAM_TRIGGER_INDEX", 0)
    ljm.eWriteName(receiver_handle, "AIN_ALL_RANGE", 0)
    ljm.eWriteName(receiver_handle, "STREAM_RESOLUTION_INDEX", 0) 
    gen_scanRate = ljm.eStreamStart(receiver_handle, scansPerRead, numAddresses, aScanList, scanRate)
    time.sleep(0.01) # Wait 10ms
    print("\nReceiver Stream started with a scan rate of %0.0f Hz. Waiting for the Generator to start now" % gen_scanRate)

    # Configure the Generator
    ljm.eWriteName(generator_handle, "STREAM_CLOCK_SOURCE", 4) # Important!
    ljm.eWriteName(generator_handle, "STREAM_TRIGGER_INDEX", 0)
    ljm.eWriteName(generator_handle, "AIN_ALL_RANGE", 0)
    ljm.eWriteName(generator_handle, "STREAM_RESOLUTION_INDEX", 0)
    rec_scanRate = ljm.eStreamStart(generator_handle, scansPerRead, numAddresses, aScanList, scanRate)
    print("\nGenerator Stream started with a scan rate of %0.0f Hz." % rec_scanRate)

    # Verify that both are running at the same actual scanrate
    if gen_scanRate != rec_scanRate:
        print("Generator and Receiver have mismatched scan rates! Verify above code and firmware")
        success = False

    print("\nPerforming %i stream reads." % numReads)
    totScans = 0

    i = 1
    while i <= numReads:
        gen_data = ljm.eStreamRead(generator_handle)
        rec_data = ljm.eStreamRead(receiver_handle)

        samples = len(gen_data[0]) / numAddresses
        totSamples += samples

        print("\neStreamRead %i, 1st sample out of %i" % (i, samples))
        genAinStr = ""
        recAinStr = ""
        for j in range(0, numAddresses):
            genAinStr += "%s = %0.5f, " % (aScanListNames[j], gen_data[0][j])
            recAinStr += "%s = %0.5f, " % (aScanListNames[j], rec_data[0][j])
        print("     Generator: %s" % genAinStr)
        print("     Receiver:  %s" % recAinStr)
        i += 1

    print("\nTotal scans = %i" % (totSamples))
except ljm.LJMError:
    ljme = sys.exc_info()[1]
    print(ljme)
    success = False
except Exception:
    e = sys.exc_info()[1]
    print(e)
    success = False

try:
    print("\nStopping Receiver Stream First")
    ljm.eStreamStop(receiver_handle)
    print("\nStopping Generator Stream")
    ljm.eStreamStop(generator_handle)
except ljm.LJMError:
    ljme = sys.exc_info()[1]
    print(ljme)
    success = False
except Exception:
    e = sys.exc_info()[1]
    print(e)
    success = False

# Close handles
ljm.close(receiver_handle)
ljm.close(generator_handle)

# Report results
if success:
    print("\nSuccessfully ran ESS Stream, closing devices now")
else:
    print("\nFailed to run ESS Stream, closing devices now")