#!/usr/bin/python3

import time
import os
import sys
sys.path.append('/home/controls/script/netgpibdata')
import netgpib
import ezca
import numpy as np

from logging import getLogger, config
import yaml

# LIGO CDS
## EPICS channel
ezca = ezca.Ezca(ifo=None)
ch_tmp = "T1:PEM-TEMP_TEMP{}"

## call ezca and write values on channels
def write_epics(ch, temp):
    ezca.write(ch_tmp.format(ch), temp, log=False)

# logging
log_conf = '/home/controls/script/PEM/log_tmp.yml'

config.dictConfig(yaml.load(open(log_conf).read(), Loader=yaml.SafeLoader))
logger = getLogger("mainLogger")

# calibration
## load calibration data
dir_calib = '/home/controls/script/PEM/data_calibtemp/'

calib_data_T4 = np.loadtxt(dir_calib+'D6039588_calibration.txt')
calib_data_T6 = np.loadtxt(dir_calib+'T6_calibration.txt')
calib_data_D6042950 = np.loadtxt(dir_calib+'D6042950_calibration.txt')
calib_data_D6087807 = np.loadtxt(dir_calib+'D6087807_calibration.txt')
calib_data_D6087986 = np.loadtxt(dir_calib+'D6087986_calibration.txt')
calib_data_D6091639 = np.loadtxt(dir_calib+'D6091639_calibration.txt')
calib_data_D6091651 = np.loadtxt(dir_calib+'D6091651_calibration.txt')

## define calibration
def calibT4(T):
    return np.interp(T, calib_data_T4[:,0],calib_data_T4[:,1])

def calibT6(T):
    return np.interp(T, calib_data_T6[:,0],calib_data_T6[:,1])

def calibT7(T):
    return np.interp(T, calib_data_D6042950[:,0],calib_data_D6042950[:,1])

def calibT8(T):
    return np.interp(T, calib_data_D6087807[:,0],calib_data_D6087807[:,1])

def calibT9(T):
    return np.interp(T, calib_data_D6087986[:,0],calib_data_D6087986[:,1])

def calibT10(T):
    return np.interp(T, calib_data_D6091639[:,0],calib_data_D6091639[:,1])

def calibT11(T):
    return np.interp(T, calib_data_D6091651[:,0],calib_data_D6091651[:,1])

# connect temperature monitor
dev = netgpib.netGPIB('192.168.11.11',12)
time.sleep(0.1)

# set log parameter
dev.command('LOGSET 1,1,0,5,8')
time.sleep(0.1)
dev.command('LOGREAD 1,1,1')
time.sleep(0.1)
dev.command('LOGREAD 2,2,1')
time.sleep(0.1)
dev.command('LOGREAD 3,3,1')
time.sleep(0.1)
dev.command('LOGREAD 4,4,1')
time.sleep(0.1)
dev.command('LOGREAD 5,5,1')
time.sleep(0.1)
dev.command('LOGREAD 6,6,1')
time.sleep(0.1)
dev.command('LOGREAD 7,7,1')
time.sleep(0.1)
dev.command('LOGREAD 8,8,1')
time.sleep(0.1)

# main unit
def main_unit():
    # start log
    dev.command('LOG 0')
    time.sleep(0.1)
    dev.command('LOG 1')
    time.sleep(5)
    logger.info("start logging ...")

    # define parameters
    str1 = 'LOGVIEW? '
    counter = 1

    # read temperature
    a1 = dev.query(str1+str(counter)+',1',50)
    time.sleep(0.1)
    a2 = dev.query(str1+str(counter)+',2',50)
    time.sleep(0.1)
    a3 = dev.query(str1+str(counter)+',3',50)
    time.sleep(0.1)
    a4 = dev.query(str1+str(counter)+',4',50)
    time.sleep(0.1)
    a5 = dev.query(str1+str(counter)+',5',50)
    time.sleep(0.1)
    a6 = dev.query(str1+str(counter)+',6',50)
    time.sleep(0.1)
    a7 = dev.query(str1+str(counter)+',7',50)
    time.sleep(0.1)
    a8 = dev.query(str1+str(counter)+',8',50)
    time.sleep(0.1)
    year = int(a1[6:8])
    month = int(a1[0:2])
    date = int(a1[3:5])
    hour = int(a1[9:11])
    minute = int(a1[12:14])
    second = int(a1[15:17])
    year1 = int(a1[6:8])
    month1 = int(a1[0:2])
    date1 = int(a1[3:5])
    hour1 = int(a1[9:11])
    minute1 = int(a1[12:14])
    second1 = int(a1[15:17])
    y1 = float(a1[19:25])
    y2 = float(a2[19:25])
    y3 = float(a3[19:25])
    y4 = float(a4[19:25])
    y5 = float(a5[19:25])
    y6 = float(a6[19:25])
    y7 = float(a7[19:25])
    y8 = float(a8[19:25])
    x = 0

    counter += 1
    i = 0

    while 1:
        try:
            if counter > 340:
                counter = 1
                i += 1
                logger.info(340*i*8)
                dev.command('LOG 0')
                time.sleep(0.1)
                dev.command('LOG 1')
                time.sleep(5)
            if counter % 5 == 0:
                pass

            while 1:
                a1 = dev.query(str1+str(counter)+',1',50)
                time.sleep(0.1)
                year2 = int(a1[6:8])
                month2 = int(a1[0:2])
                date2 = int(a1[3:5])
                hour2 = int(a1[9:11])
                minute2 = int(a1[12:14])
                second2 = int(a1[15:17])
                if year2 > year1:
                    break
                elif month2 > month1:
                    break
                elif date2 > date1:
                    break
                elif hour2 > hour1:
                    break
                elif minute2 > minute1:
                    break
                elif second2 > second1:
                    break
                else:
                    time.sleep(2.5)

            a2 = dev.query(str1+str(counter)+',2',50)
            time.sleep(0.1)
            a3 = dev.query(str1+str(counter)+',3',50)
            time.sleep(0.1)
            a4 = dev.query(str1+str(counter)+',4',50)
            time.sleep(0.1)
            a5 = dev.query(str1+str(counter)+',5',50)
            time.sleep(0.1)
            a6 = dev.query(str1+str(counter)+',6',50)
            time.sleep(0.1)
            a7 = dev.query(str1+str(counter)+',7',50)
            time.sleep(0.1)
            a8 = dev.query(str1+str(counter)+',8',50)
            time.sleep(0.1)

            t1 = float(a1[19:25])
            t2 = float(a2[19:25])
            t3 = float(a3[19:25])
            t4 = float(a4[19:25])
            t5 = float(a5[19:25])
            t6 = float(a6[19:25])
            t7 = float(a7[19:25])
            t8 = float(a8[19:25])
            year1 = year2
            month1 = month2
            date1 = date2
            hour1 = hour2
            minute1 = minute2
            second1 = second2
            x = second2 - second + \
                60 * (minute2 - minute + \
                      60 * (hour2 - hour + \
                            24 * (date2 - date + \
                                  30 * (month2 - month + \
                                        365 * (year2-year)
                                        )
                                  )
                            )
                      )

            # write measurement data to EPICS channels
            write_epics(1,str(t1))
            write_epics(2,str(t2))
            write_epics(3,str(t3))
            write_epics(4,str(t4))
            write_epics(5,str(t5))
            write_epics(6,str(t6))
            write_epics(7,str(t7))
            write_epics(8,str(t8))

            # write calibrated data to EPICS channels
            write_epics("1_CALIB",str(calibT4(t1)))
            write_epics("2_CALIB",str(t2))
            write_epics("3_CALIB",str(calibT6(t3)))
            write_epics("4_CALIB",str(calibT7(t4)))
            write_epics("5_CALIB",str(calibT8(t5)))
            write_epics("6_CALIB",str(calibT9(t6)))
            write_epics("7_CALIB",str(calibT10(t7)))
            write_epics("8_CALIB",str(calibT11(t8)))

            message = 'time:' + str(x) + ' T1:' + str(t1) + ' T2:' + str(t2) + \
                ' T3:' + str(t3) + ' T4:' + str(t4) + ' T5:' + str(t5) + \
                ' T6:' + str(t6) + ' T7:' + str(t7) + ' T8:' + str(t8)
            logger.info(message)
            counter += 1

        except:
            dev.close()
            logger.info('stop logging')
            break

if __name__ == "__main__":
    while True:
        main_unit()

