""" Arduino Sensor Logger

    Logger program for logging data from an Arduino

    Configuration values at the start.

"""

#### Settings
# Serial port to connect to arduino
#serialport = '/dev/tty.usbmodem142201' # mac
#serialport = '/dev/tty.usbmodem1421101' # mac with USB extension
serialport = '/dev/ttyACM0'
#serialport = '/dev/tty.usbmodem1421' # mac
#serialport = '/dev/tty.usbmodem1421101' # mac with USB extension
# Serial transfer rate
serialbaud = 9600
# Log file name (can contain strftime formatting)
#logfile = '/data/comp_mon_log_%y%m%d.txt'
logfile = '/home/pi/berthoud/voltlog%y%m%d.txt'

#### Imports
import serial
import time
import os
import re

#### Setup
# Setup connection
comm = serial.Serial(serialport,serialbaud,timeout=0.02)
print(f"Opened serial connection with {serialport}")
# Get backlog from serial port
time.sleep(2.0)
comm.read(1000)
#### Main Loop
while True:
    # wait
    time.sleep(0.2)
    # Read the data
    data = ''
    if comm.in_waiting:
        dataval = comm.readline().decode().strip()
        print(f"read {dataval}")
    else:
        continue
    # Add to logfile
    # On the fly converts strftime to current time
    with open(time.strftime(logfile), 'at') as outf:
        outext = time.strftime("%y-%m-%d %H:%M:%S ") + dataval + '\n'
        datetime = time.strftime("%y-%m-%d %H:%M:%S")
        outf.write(outext)
        outf.close()

while False:
    # Get the value
    try:
        comm.write(readcmd.encode())
        time.sleep(lograte/5.)
        dataval = comm.read(1000).decode().strip()
    except:
        # If fail to read, close then open connection, try to read again
        try:
            # Try to close connection
            try:
                comm.close()
            except:
                print("Failed Closing connection")
            # Open connection
            time.sleep(lograte/5.)
            comm = serial.Serial(serialport,serialbaud,timeout=0.02)
            print(f"Opened serial connection with {serialport}")
            # Clear serial buffer with empty command
            time.sleep(lograte/5.)
            comm.write('\n'.encode())
            time.sleep(lograte/5.)
            dataval = comm.read(1000).decode().strip()            
            # Read data
            comm.write(readcmd.encode())
            time.sleep(lograte/5.)
            dataval = comm.read(1000).decode().strip()
        except:
            # This fails as well - return bad data
            dataval = '-'
