from pyspcm import *
from spcm_tools import *
import sys

#
# **************************************************************************
# Class for controlling the AWG
#
# User must install the AWG driver for Windows 8/9/10/11, found in
# https://spectrum-instrumentation.com/support/downloads.php
# Look under model M4i 6622-x8
#
# The python module provided in pyspcm is in essence a c/c++ wrapper,
# hence the use of ctype variables in this code.
# **************************************************************************
#


class AWG:
    def __init__(self):
        self.hCard = None  # holds the spcm card instance, this is used by all spcm calls
        self.cardType = int32(0)
        self.serialNumber = int32(0)
        self.sampleRate = int64(0)
        self.memSize = int64(0)
        self.fncType = int32(0)

    def open(self, remote=False):
        # check for remote connection
        if remote:
            self.hCard = spcm_hOpen(create_string_buffer(b'TCPIP::192.168.1.10::inst0::INSTR'))
        else:
            self.hCard = spcm_hOpen(create_string_buffer(b'/dev/spcm0'))
        if self.hCard is None:
            sys.stdout.write("no card found...\n")
        else:
            # initialize variables
            spcm_dwGetParam_i32(self.hCard, SPC_PCITYP,      byref(self.cardType))
            spcm_dwGetParam_i32(self.hCard, SPC_PCISERIALNO, byref(self.serialNumber))
            spcm_dwGetParam_i32(self.hCard, SPC_FNCTYPE,     byref(self.fncType))
            spcm_dwGetParam_i64(self.hCard, SPC_SAMPLERATE,  byref(self.sampleRate))
            spcm_dwGetParam_i64(self.hCard, SPC_PCIMEMSIZE,  byref(self.memSize))
            name = szTypeToName(self.cardType.value)
            sys.stdout.write("Found: {0} sn {1:05d}\n".format(name, self.serialNumber.value))
            sys.stdout.write("Sample Rate: {:.1f} MHz\n".format(self.sampleRate.value / 1000000))
            sys.stdout.write("Memory size: {:.0f} MBytes\n".format(self.memSize.value / 1024 / 1024))

    def close(self):
        spcm_vClose(self.hCard)

    # Check if an error has occurred, return 1 if true
    def checkError(self, customMsg=None):
        toPrint = 0
        msg = "Checking error at " + customMsg + " ... "
        if customMsg is not None:
            toPrint = 1
            sys.stdout.write(msg)
        errReg = uint32(0)
        errVal = int32(0)
        errText = ''
        errCode = spcm_dwGetErrorInfo_i32(self.hCard, byref(errReg), byref(errVal), errText)
        if errCode:
            if toPrint:
                sys.stdout.write(errText)
            else:
                sys.stdout.write(msg + errText)
            return 1
        elif toPrint:
            sys.stdout.write("no error\n")
        return 0