#!/usr/bin/python import time import datetime import redis import os import os.path import FTL.FTLog from os.path import exists FTL.FTLog.Write(" FTLogger started") #configurazione per lavorare su server redis locale REDIS_PORT = 6379 REDIS_HOST = '127.0.0.1' redSrv0 = redis.Redis( host=REDIS_HOST, port=REDIS_PORT, db=0) #funzione per leggere e decodificare da redis def getRedisVal(redisKey): if redSrv0.get(redisKey) is None: return redSrv0.get(redisKey) else: return redSrv0.get(redisKey).decode('utf-8') #assegno directory per file di data output DATA_path = "/home/pi/data/" #assegno waiter a 0 (attesa prima di scrivere 2 secondi) redSrv0.set('SETTINGS:LOG:WAITER',0) #intervallo in millisecondi fra una scrittura su file e la successiva startingWriteFreq = 1000 redWriteFreq = 'SETTINGS:WRITE:FREQ' redSrv0.set(redWriteFreq,startingWriteFreq) #se non c'è un valore nei campi di redis, popolo il db redisTime = 'RTDATA:TIME:SRV' redSrv0.set('SETTINGS:LOG:STATUS',0) redSrv0.set('SETTINGS:POWER:OFF',0) redSrv0.set('SETTINGS:LOG:CRONO', "00:00:00") if redSrv0.get('SETTINGS:LOG:WAITIME') is None: redSrv0.set('SETTINGS:LOG:WAITIME', 2) if redSrv0.get('SETTINGS:SELECTED_CH') is None: redSrv0.set('SETTINGS:SELECTED_CH',0) if redSrv0.get('SETTINGS:FOLDER:CURRENT') is None: redSrv0.set('SETTINGS:FOLDER:CURRENT', "") for numCh in range(0,8,+1): if redSrv0.get('SETTINGS:IN:MAX:'+str(numCh)) is None: redSrv0.set('SETTINGS:IN:MAX:'+str(numCh),100) if redSrv0.get('SETTINGS:IN:MIN:'+str(numCh)) is None: redSrv0.set('SETTINGS:IN:MIN:'+str(numCh),0) if redSrv0.get('SETTINGS:OUT:MAX:'+str(numCh)) is None: redSrv0.set('SETTINGS:OUT:MAX:'+str(numCh),100) if redSrv0.get('SETTINGS:OUT:MIN:'+str(numCh)) is None: redSrv0.set('SETTINGS:OUT:MIN:'+str(numCh),0) #funzione salva time+data e otto valori letti su file SE LOG è 1 def fileSave(): rawIstant = getRedisVal('RTDATA:VALUE:RAW') fixedIstant = getRedisVal('RTDATA:VALUE:REAL') rawAverage = getRedisVal('RTDATA:VALUE:SMRAW') fixedAverage = getRedisVal('RTDATA:VALUE:SMOOTHED') currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') workingDirectory = (DATA_path+currentFolder) #dò un nome al nuovo file dataFileName = getRedisVal('RTDATA:SESSION:NAME') dateFormat ="%d/%m/%Y %H:%M:%S" rawLastLog = datetime.datetime.now() #format date e time con strftime() lastLog = rawLastLog.strftime(dateFormat) # filepath completo filePath = workingDirectory+"/"+dataFileName # verifico se file esista if(exists(filePath)): outFile = open(workingDirectory+"/"+dataFileName, "a") else: outFile = open(workingDirectory+"/"+dataFileName, "w+") firstRow = "Data Ora;" firstRow += "Ch A;" firstRow += "Ch B;" firstRow += "Istant Grezzo;" firstRow += "Istant Corretto;" firstRow += "Mediato Grezzo;" firstRow += "Mediato Corretto" outFile.write(firstRow+"\r\n") # dichiaro una stringa in cui accumulo i valori csvRow = str(lastLog) +";" # scrivo le letture del canale A chA = getRedisVal('SETTINGS:CHANNEL:A') chAOut = getRedisVal('RTDATA:OUT:'+str(chA)) csvRow += chAOut+";" # scrivo le letture del canale B chB = getRedisVal('SETTINGS:CHANNEL:B') chBOut = getRedisVal('RTDATA:OUT:'+str(chB)) csvRow += chBOut+";" #aggiungo il valore istant raw csvRow += rawIstant+";" #aggiungo il valore istant fixed csvRow += fixedIstant+";" #aggiungo il valore average raw csvRow += rawAverage+";" #aggiungo il valore average fixed csvRow += fixedAverage # scrivo in blocco la riga dei valori outFile.write(csvRow +"\r\n") outFile.close() #ciclo principale, salva time attuale e se LOG:STATUS è 1 fa fileSave() while(1): now = datetime.datetime.now() # solo se su redis LOG è 1 eseguo il ciclo principale if(getRedisVal('SETTINGS:LOG:STATUS') == "1"): redSrv0.set('SETTINGS:LOG:CRONO', "00:00:00") #attendo 2 secondi all'avvio della registrazione if(getRedisVal('SETTINGS:LOG:WAITER') == "0"): time.sleep(int(getRedisVal('SETTINGS:LOG:WAITIME'))) #salvo startTime per inizio cronometro registrazione startTime = time.perf_counter() redSrv0.set('SETTINGS:LOG:WAITER', 1) fileSave() #a ogni fileSave() misuro tempo trascorso da inizio registrazione e lo mostro e format date e time con strftime() crono = time.strftime('%H:%M:%S', time.gmtime(int(time.perf_counter() - startTime))) redSrv0.set('SETTINGS:LOG:CRONO',crono) # riporto ultima esecuzione ad adesso endExec = datetime.datetime.now() # calcolo il delta dovuto alle esecuzioni delta = endExec - now waitTime = int(redSrv0.get(redWriteFreq)) / 1000 - delta.microseconds/1000000 if(waitTime < 0.1): waitTime = 0.1 # attesa fra una scrittura e successiva time.sleep(waitTime)