#!/usr/bin/python3

import time
import os
import sys
import serial
import ezca
from math import log10

from logging import getLogger, config
import yaml

# LIGO CDS
## EPICS channel
ezca = ezca.Ezca(ifo=None)
ch_vac = "T1:PEM-VAC_VAC"
ch_log = "T1:PEM-VAC_LOG"

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

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

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

# connect pressure monitor
## USB port directory
port = '/dev/ttyUSB0'

## parameters of serial connection
kws = dict(baudrate=9600, bytesize=serial.EIGHTBITS, 
           parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, 
           timeout=0, xonxoff=True, rtscts=False, dsrdtr=False)

ser = serial.Serial('/dev/ttyUSB0', **kws)
time.sleep(0.1)

# functions
def send(cmd):
    retval = ser.write(cmd)
    ser.flush()

def readlines():
    return ''.join([l.decode() for l in ser.readlines()])

def sendrecv(cmd):
    res = send(cmd)
    time.sleep(0.1)
    ret_str = readlines()
    return ret_str

# request for current value
request = '$PRD\r'.encode('utf-8')

# main unit
def main_unit():
## start log
    logger.info('start logging ...')

## read pressure evry 0.5 sec
    while 1:
        try:
            msg = sendrecv(request)
            val = float(msg[3:-1])
            val_log = log10(val)
            write_epics(ch_vac, str(val))
            write_epics(ch_log, str(val_log))
            logger.info("val = {:.2e}".format(val))
            time.sleep(2)
        except:
            ser.close()
            logger.info('stop logging')
            break

# def daemonize():
#     pid = os.fork()

#     if pid > 0:  # parent process
#         pid_file = open('/var/run/vac_readd.pid', 'w')
#         pid_file.write(str(pid)+'\n')
#         pid_file.close()
#         sys.exit()

#     if pid == 0:  # child process
#         main_unit()

if __name__ == '__main__':
    while True:
        # daemonize()
        main_unit()
