Merge branch 'master' into develop
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
*.pyo
|
||||
*.pyc
|
||||
+45
-6
@@ -7,6 +7,8 @@ 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
|
||||
@@ -27,6 +29,9 @@ def getRedisVal(redisKey):
|
||||
#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'
|
||||
@@ -36,6 +41,9 @@ redSrv0.set(redWriteFreq,startingWriteFreq)
|
||||
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:
|
||||
@@ -52,18 +60,34 @@ if redSrv0.get('SETTINGS:FOLDER:CURRENT') is None:
|
||||
|
||||
#funzione salva time+data e otto valori letti su file SE LOG è 1
|
||||
def fileSave():
|
||||
resultValue = getRedisVal('RTDATA:VALUE')
|
||||
rawValue = getRedisVal('RTDATA:VALUE:RAW')
|
||||
resultValue = getRedisVal('RTDATA:VALUE:REAL')
|
||||
smoothedValue = 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)
|
||||
try:
|
||||
|
||||
# filepath completo
|
||||
filePath = workingDirectory+"/"+dataFileName
|
||||
|
||||
# verifico se file esista
|
||||
if(exists(filePath)):
|
||||
outFile = open(workingDirectory+"/"+dataFileName, "a")
|
||||
except FileNotFoundError:
|
||||
else:
|
||||
outFile = open(workingDirectory+"/"+dataFileName, "w+")
|
||||
firstRow = "Data e Ora;"
|
||||
firstRow += "Canale A;"
|
||||
firstRow += "Canale B;"
|
||||
firstRow += "Valore Grezzo;"
|
||||
firstRow += "Valore Corretto;"
|
||||
firstRow += "Valore Corretto e Mediato"
|
||||
outFile.write(firstRow+"\r\n")
|
||||
|
||||
# dichiaro una stringa in cui accumulo i valori
|
||||
csvRow = str(lastLog) +";"
|
||||
# scrivo le letture del canale A
|
||||
@@ -74,18 +98,33 @@ def fileSave():
|
||||
chB = getRedisVal('SETTINGS:CHANNEL:B')
|
||||
chBOut = getRedisVal('RTDATA:OUT:'+str(chB))
|
||||
csvRow += chBOut+";"
|
||||
#aggiungo il valore risultante calcolato V1/(V2-V1)
|
||||
csvRow += resultValue
|
||||
#aggiungo il valore pulito
|
||||
csvRow += rawValue+";"
|
||||
#aggiungo il valore corretto con k1 k2 offset
|
||||
csvRow += resultValue+";"
|
||||
#aggiungo il valore risultante MEDIATO
|
||||
csvRow += smoothedValue
|
||||
# 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
|
||||
@@ -93,5 +132,5 @@ while(1):
|
||||
waitTime = int(redSrv0.get(redWriteFreq)) / 1000 - delta.microseconds/1000000
|
||||
if(waitTime < 0.1):
|
||||
waitTime = 0.1
|
||||
# attesa
|
||||
# attesa fra una scrittura e successiva
|
||||
time.sleep(waitTime)
|
||||
+5
-2
@@ -49,7 +49,7 @@ while (1):
|
||||
lastDate = datetime.datetime.now()
|
||||
#formato per data time nomefile: YYYYddmm_HMS
|
||||
format = "%Y%m%d_%H%M%S"
|
||||
#format date e time adando strftime()
|
||||
#format date e time con strftime()
|
||||
nameDate = lastDate.strftime(format) + ".txt"
|
||||
redSrv0.set('RTDATA:SESSION:NAME', nameDate)
|
||||
led.on()
|
||||
@@ -63,7 +63,7 @@ while (1):
|
||||
lastDate = datetime.datetime.now()
|
||||
#formato per data time nomefile: YYYYddmm_HMS
|
||||
format = "%Y%m%d_%H%M%S"
|
||||
#format date e time adando strftime()
|
||||
#format date e time con strftime()
|
||||
nameDate = lastDate.strftime(format) + ".txt"
|
||||
redSrv0.set('RTDATA:SESSION:NAME', nameDate)
|
||||
led.on()
|
||||
@@ -71,6 +71,7 @@ while (1):
|
||||
if stop.is_pressed:
|
||||
#basically la stessa funzione stop_log contenuta in FTServer
|
||||
redSrv0.set('SETTINGS:LOG:STATUS', 0)
|
||||
redSrv0.set('SETTINGS:LOG:WAITER', 0)
|
||||
redSrv0.set('RTDATA:SESSION:NAME', "")
|
||||
|
||||
if cancello.is_pressed:
|
||||
@@ -81,6 +82,7 @@ while (1):
|
||||
# CANCELLO APERTO
|
||||
redSrv0.set('RTDATA:GATE_OPEN', 1)
|
||||
redSrv0.set('SETTINGS:LOG:STATUS', 0)
|
||||
redSrv0.set('SETTINGS:LOG:WAITER', 0)
|
||||
redSrv0.set('RTDATA:SESSION:NAME', "")
|
||||
|
||||
if(getRedisVal('SETTINGS:LOG:STATUS') == "1"):
|
||||
@@ -90,6 +92,7 @@ while (1):
|
||||
|
||||
if(getRedisVal('SETTINGS:POWER:OFF') == "1"):
|
||||
redSrv0.set('SETTINGS:POWER:OFF',0)
|
||||
redSrv0.set('SETTINGS:LOG:WAITER', 0)
|
||||
FTL.FTLog.Write(" FTDInOut requested shutdown")
|
||||
os.system("sudo shutdown -h now")
|
||||
|
||||
|
||||
+105
-89
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from array import *
|
||||
import os
|
||||
import math
|
||||
import time
|
||||
@@ -7,6 +8,7 @@ import datetime
|
||||
import ADS1256
|
||||
import redis
|
||||
import FTL.FTLog
|
||||
import numpy as np
|
||||
|
||||
FTL.FTLog.Write(" FTSampler started")
|
||||
|
||||
@@ -25,50 +27,25 @@ def getRedisVal(redisKey):
|
||||
else:
|
||||
return redSrv0.get(redisKey).decode('utf-8')
|
||||
|
||||
def echoList(redisKey, numVal):
|
||||
currList = redSrv0.lrange(redisKey, 0, numVal)
|
||||
currString = ''
|
||||
for curVal in range(0,numVal,+1):
|
||||
currString = currString + ' ' + str(curVal) + ': ' + str((float)(currList[curVal].decode('utf-8'))) + ' | '
|
||||
print(currString)
|
||||
|
||||
def putRedisListVal(redisKey, value, maxLen):
|
||||
#echoList(redisKey, maxLen)
|
||||
redSrv0.lpush(redisKey, value)
|
||||
# se supero lunghezza --> rimuovo
|
||||
redSrv0.ltrim(redisKey, 0, maxLen)
|
||||
#echoList(redisKey, maxLen)
|
||||
|
||||
def getRmsVal(redisKey, numVal):
|
||||
# leggo lista da redis
|
||||
currList = redSrv0.lrange(redisKey, 0, numVal)
|
||||
numVal= len(currList)
|
||||
# print (len(currList))
|
||||
sumSquare=0
|
||||
# per ogni elemento calcolo quadrato
|
||||
for curVal in range(0,numVal,+1):
|
||||
sumSquare = sumSquare + (float)(currList[curVal].decode('utf-8'))*(float)(currList[curVal].decode('utf-8'))
|
||||
|
||||
# divido e faccio radice quadrata
|
||||
rmsVal = math.sqrt(sumSquare / numVal)
|
||||
|
||||
return rmsVal
|
||||
|
||||
#intervallo in millisecondi fra un campionamento e il successivo
|
||||
redSampleFreq = 'SETTINGS:LOG:FREQ'
|
||||
redSrv0.set(redSampleFreq,100)
|
||||
|
||||
#definizioni variabili
|
||||
redRmsList ='RTDATA:RMSLIST'
|
||||
redSamPer='SETTINGS:LOG:EXETIME'
|
||||
redSampleFreq = 'SETTINGS:LOG:FREQ'
|
||||
|
||||
#se non c'è un valore nei campi di redis, popolo il db
|
||||
redSrv0.set('SETTINGS:LOG:STATUS',0)
|
||||
redSrv0.set('SETTINGS:POWER:OFF',0)
|
||||
if redSrv0.get('SETTINGS:WARNING:EXETIME') is None:
|
||||
redSrv0.set('SETTINGS:WARNING:EXETIME',0)
|
||||
if redSrv0.get('SETTINGS:LOG:FREQ') is None:
|
||||
redSrv0.set('SETTINGS:LOG:FREQ', 50)
|
||||
if redSrv0.get('SETTINGS:DECIMALS:COUNT') is None:
|
||||
redSrv0.set('SETTINGS:DECIMALS:COUNT',1)
|
||||
if redSrv0.get('RTDATA:VALUE:KCONST') is None:
|
||||
redSrv0.set('RTDATA:VALUE:KCONST', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:K1CONST') is None:
|
||||
redSrv0.set('RTDATA:VALUE:K1CONST', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:K2CONST') is None:
|
||||
redSrv0.set('RTDATA:VALUE:K2CONST', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:OFFSET') is None:
|
||||
redSrv0.set('RTDATA:VALUE:OFFSET', 0)
|
||||
if redSrv0.get('SETTINGS:POWER:UPTIME') is None:
|
||||
redSrv0.set('SETTINGS:POWER:UPTIME', 300)
|
||||
if redSrv0.get('SETTINGS:POWER:CH') is None:
|
||||
@@ -77,8 +54,12 @@ if redSrv0.get('RTDATA:VALUE:UMEASURE') is None:
|
||||
redSrv0.set('RTDATA:VALUE:UMEASURE', "-")
|
||||
if redSrv0.get('SETTINGS:LOG:EXETIME') is None:
|
||||
redSrv0.set('SETTINGS:LOG:EXETIME', 1)
|
||||
if redSrv0.get('RTDATA:VALUE') is None:
|
||||
redSrv0.set('RTDATA:VALUE', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:SMOOTHED') is None:
|
||||
redSrv0.set('RTDATA:VALUE:SMOOTHED', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:RAW') is None:
|
||||
redSrv0.set('RTDATA:VALUE:RAW', 1)
|
||||
if redSrv0.get('RTDATA:VALUE:REAL') is None:
|
||||
redSrv0.set('RTDATA:VALUE:REAL', 1)
|
||||
if redSrv0.get('SETTINGS:POWER:THRESH') is None:
|
||||
redSrv0.set('SETTINGS:POWER:THRESH', 0)
|
||||
if redSrv0.get('SETTINGS:SMOOTHING:FUNCTION') is None:
|
||||
@@ -114,11 +95,27 @@ for numCh in range(0,8,+1):
|
||||
if redSrv0.get('RTDATA:OUT:'+str(numCh)) is None:
|
||||
redSrv0.set('RTDATA:OUT:'+str(numCh),1)
|
||||
|
||||
#funzione salva time+data di log e otto valori su redis
|
||||
def redisSave(CHvalue):
|
||||
decimalsCount = int(getRedisVal('SETTINGS:DECIMALS:COUNT'))
|
||||
# calcola la media (colonna x colonna) dei valori ricevuti
|
||||
def calcMean(dataArray):
|
||||
outValues = [0.0] * 8
|
||||
smoothFunction= int(getRedisVal('SETTINGS:SMOOTHING:FUNCTION'))
|
||||
smoothFact= int(getRedisVal('SETTINGS:SMOOTHING:FACTOR'))
|
||||
# verifico il TIPO di Smoothing richiesto: 0 none, 1 media semplice, 2 RMS
|
||||
if (smoothFunction == 1):
|
||||
# effettuo calcolo media mobile
|
||||
outValues = np.sum(dataArray, axis=0) / smoothFact
|
||||
elif (smoothFunction == 2):
|
||||
# calcolo i quadrati
|
||||
outValues = np.sqrt(np.sum(np.square(dataArray), axis=0) / smoothFact)
|
||||
else:
|
||||
# nessuno smooting, passa il primo dei sample acquisiti
|
||||
outValues = dataArray[0]
|
||||
# restituisco valori calcolati
|
||||
return outValues
|
||||
|
||||
#funzione salva time+data di log e otto valori su redis
|
||||
def redisSave(CHvalues):
|
||||
decimalsCount = int(getRedisVal('SETTINGS:DECIMALS:COUNT'))
|
||||
redLastLog = 'RTDATA:TIME:LOG'
|
||||
dateFormat ="%d/%m/%Y %H:%M:%S"
|
||||
rawLastLog = datetime.datetime.now()
|
||||
@@ -127,30 +124,11 @@ def redisSave(CHvalue):
|
||||
for chIndex in range(0,8,+1):
|
||||
redAreaIn = 'RTDATA:CH:'+str(chIndex)
|
||||
redAreaOut = 'RTDATA:OUT:'+str(chIndex)
|
||||
redRmsArea = redRmsList+':'+str(chIndex)
|
||||
innovazione = float("%.4f" % (CHvalue[chIndex]*5.0/0x7fffff))
|
||||
strValIn = innovazione
|
||||
# verifico il TIPO di Smoothing richiesto: 0 none, 1 EWMA, 2 RMS
|
||||
if (smoothFunction == 1):
|
||||
# EWMA: RILEGGO DA REDIS vecchio valore
|
||||
oldVal = float(redSrv0.get(redAreaIn))
|
||||
# effettuo smoothing valore
|
||||
strValIn = (innovazione/smoothFact) + (oldVal * (smoothFact-1) / smoothFact)
|
||||
|
||||
elif (smoothFunction == 2):
|
||||
# accodo innovazioni
|
||||
putRedisListVal(redRmsArea, innovazione, smoothFact)
|
||||
# calcolo valore RMS
|
||||
strValIn = getRmsVal(redRmsArea, smoothFact)
|
||||
else:
|
||||
# nessuno smooting
|
||||
strValIn = innovazione
|
||||
|
||||
strValIn = float("%.4f" % (CHvalues[chIndex]))
|
||||
#salvo valore IN filtrato
|
||||
redSrv0.set(redAreaIn,round(strValIn,8))
|
||||
|
||||
redSrv0.set(redAreaIn,round(strValIn,decimalsCount))
|
||||
# salvo i valori scalati in OUT
|
||||
roundedOut = round(scaleVal(CHvalue[chIndex]*5.0/0x7fffff, chIndex), decimalsCount)
|
||||
roundedOut = round(scaleVal(CHvalues[chIndex], chIndex), decimalsCount)
|
||||
redSrv0.set(redAreaOut,roundedOut)
|
||||
|
||||
#funzione di refresh valori scalati
|
||||
@@ -186,7 +164,7 @@ def checkPowerOff():
|
||||
actVal = float(getRedisVal('RTDATA:CH:' + str(powerChannel)))
|
||||
#controllo che il valore letto sia inferiore al valore impostato di soglia
|
||||
if(actVal < limitVal):
|
||||
#controllo che il sistema sia acceso da 180 secondi prima di spegnere
|
||||
#controllo che il sistema abbia superato l'uptime minimo impostato su redis
|
||||
UptimePower = getRedisVal('SETTINGS:POWER:UPTIME')
|
||||
sysUptime = os.popen("awk '{print $1}' /proc/uptime").readline()
|
||||
if float(sysUptime) > float(UptimePower):
|
||||
@@ -194,48 +172,86 @@ def checkPowerOff():
|
||||
redSrv0.set('SETTINGS:POWER:OFF',1)
|
||||
|
||||
def calculateValue():
|
||||
# funzione per calcolare valore risultante (B/A-B)
|
||||
decimalsCount = int(getRedisVal('SETTINGS:DECIMALS:COUNT'))
|
||||
ch1 = getRedisVal('SETTINGS:CHANNEL:A')
|
||||
ch2 = getRedisVal('SETTINGS:CHANNEL:B')
|
||||
v1 = getRedisVal('RTDATA:OUT:' + ch1)
|
||||
v2 = getRedisVal('RTDATA:OUT:' + ch2)
|
||||
k = getRedisVal('RTDATA:VALUE:KCONST')
|
||||
den = (float(v1)-float(v2))
|
||||
if(den < 0.001):
|
||||
den = 0.001
|
||||
newValue = float(k)*(float(v2)/float(den))
|
||||
redSrv0.set('RTDATA:VALUE',round(newValue,3))
|
||||
k1 = getRedisVal('RTDATA:VALUE:K1CONST')
|
||||
k2 = getRedisVal('RTDATA:VALUE:K2CONST')
|
||||
offset = getRedisVal('RTDATA:VALUE:OFFSET')
|
||||
den = abs(float(v1)-float(v2))
|
||||
if(den < 0.01):
|
||||
den = 0.01
|
||||
# calcolo il valore risultante pulito (senza correzioni)
|
||||
XVal = (float(v2)/float(den))
|
||||
redSrv0.set('RTDATA:VALUE:RAW',round(XVal,decimalsCount))
|
||||
# applicare correzioni (costanti k1*x^2, k2*x e offset)
|
||||
newValue = (float(k1)*float(XVal)*float(XVal))+(float(k2)*float(XVal))+float(offset)
|
||||
redSrv0.set('RTDATA:VALUE:REAL',round(newValue,decimalsCount))
|
||||
strValIn = newValue
|
||||
# EWMA: RILEGGO DA REDIS vecchio valore
|
||||
oldVal = float(redSrv0.get('RTDATA:VALUE:SMOOTHED'))
|
||||
if(oldVal == 0):
|
||||
oldVal = 0.01
|
||||
# se variazione < 50% smooth
|
||||
if((abs(newValue - oldVal) / oldVal) < 0.5):
|
||||
# effettuo smoothing valore
|
||||
eFact = 3
|
||||
strValIn = (newValue/eFact) + (oldVal * (eFact-1) / eFact)
|
||||
redSrv0.set('RTDATA:VALUE:SMOOTHED',round(strValIn,decimalsCount))
|
||||
|
||||
# init oggetto lettura da
|
||||
# init array
|
||||
smoothFact= int(getRedisVal('SETTINGS:SMOOTHING:FACTOR'))
|
||||
initArray = [0.0] * 8
|
||||
meanValues = [0.0] * 8
|
||||
dataBox = np.array([initArray] * smoothFact)
|
||||
redisTime = 'RTDATA:TIME:SRV'
|
||||
|
||||
# init oggetto lettura Digital Analog
|
||||
try:
|
||||
CH = ADS1256.ADS1256()
|
||||
CH.ADS1256_init()
|
||||
|
||||
|
||||
#ciclo principale
|
||||
while(1):
|
||||
redisTime = 'RTDATA:TIME:SRV'
|
||||
# update freq campionamento da redis
|
||||
sampleFreq = getRedisVal(redSampleFreq)
|
||||
smoothFact= int(getRedisVal('SETTINGS:SMOOTHING:FACTOR'))
|
||||
dataBox = np.array([initArray] * smoothFact)
|
||||
now = datetime.datetime.now()
|
||||
dateFormat ="%d/%m/%Y %H:%M:%S"
|
||||
lastLog = now.strftime(dateFormat)
|
||||
redSrv0.set(redisTime,str(lastLog))
|
||||
CHvalue = CH.ADS1256_GetAll()
|
||||
# salvo valori
|
||||
redisSave(CHvalue)
|
||||
# controllo soglia spegnimento
|
||||
checkPowerOff()
|
||||
#calcolo il valore [V2/(V1-V2)]
|
||||
calculateValue()
|
||||
for counter in range(0,smoothFact,+1):
|
||||
# leggo gli 8 valori
|
||||
CHvalue = CH.ADS1256_GetAll()
|
||||
floatArray = np.array(CHvalue, dtype=float)
|
||||
dataBox[counter] = floatArray*float(5.0/0x7fffff)
|
||||
# calcolo e scrittura ogni NUM PERIOD cicli
|
||||
if counter == (smoothFact-1):
|
||||
# faccio gli smoothing colonna x colonna
|
||||
meanValues = calcMean(dataBox)
|
||||
#salvo valori
|
||||
redisSave(meanValues)
|
||||
# controllo soglia spegnimento
|
||||
checkPowerOff()
|
||||
# calcolo il valore k*[V2/(V1-V2)] + offset
|
||||
calculateValue()
|
||||
# riporto ultima esecuzione ad adesso
|
||||
endExec = datetime.datetime.now()
|
||||
# calcolo il delta time dovuto alle esecuzioni
|
||||
delta = endExec - now
|
||||
redSrv0.set('SETTINGS:EXE:TIME',str(delta))
|
||||
oldSPeriod=float(getRedisVal(redSamPer))
|
||||
newSPeriod=0.5*oldSPeriod+0.5*(float(delta.microseconds/1000))
|
||||
redSrv0.set(redSamPer,newSPeriod)
|
||||
waitTime = int(getRedisVal(redSampleFreq)) / 1000 - delta.microseconds/1000000
|
||||
if(waitTime < 0.01):
|
||||
waitTime = 0.01
|
||||
# attesa
|
||||
# attesa viene fatta sempre
|
||||
waitTime = (int(sampleFreq)*smoothFact)/1000 - delta.microseconds/1000000
|
||||
if(waitTime < 0.0):
|
||||
redSrv0.set('SETTINGS:WARNING:EXETIME',1)
|
||||
else:
|
||||
redSrv0.set('SETTINGS:WARNING:EXETIME',0)
|
||||
if(waitTime < 0.001):
|
||||
waitTime = 0.001
|
||||
# vera attesa
|
||||
time.sleep(waitTime)
|
||||
|
||||
#eccezione da ctrl+c in terminale e chiusura
|
||||
@@ -245,5 +261,5 @@ except KeyboardInterrupt:
|
||||
|
||||
#eccezione da errore e chiusura
|
||||
except Exception as errorMessage:
|
||||
FTL.FTLog.Write(str(errorMessage))
|
||||
FTL.FTLog.Write(str(" FTSampler stopped: " + errorMessage))
|
||||
exit()
|
||||
+40
-12
@@ -17,6 +17,7 @@ import logging
|
||||
|
||||
FTL.FTLog.Write(" FTServer started")
|
||||
|
||||
#silenzio i logger
|
||||
logging.getLogger('werkzeug').disabled = True
|
||||
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
|
||||
|
||||
@@ -25,6 +26,7 @@ led = LED(26)
|
||||
|
||||
#assegno ipv4 statico
|
||||
ipv4 = '10.10.10.210'
|
||||
#ipv4 = '10.74.82.210'
|
||||
|
||||
#definisco directory /data
|
||||
dataDir='/home/pi/data/'
|
||||
@@ -87,6 +89,12 @@ def about():
|
||||
@flaskApp.route("/api/v1/channels/all", methods=['GET'])
|
||||
def api_channels_all():
|
||||
numCh = getRedisVal('SETTINGS:SELECTED_CH')
|
||||
exeWarning = getRedisVal('SETTINGS:WARNING:EXETIME')
|
||||
displayWarning = 0
|
||||
if exeWarning == "1":
|
||||
displayWarning = 1
|
||||
elif exeWarning == "0":
|
||||
displayWarning = 0
|
||||
CH = [0,0,0,0,0,0,0,0]
|
||||
OUT = [0,0,0,0,0,0,0,0]
|
||||
OUTMIN = [0,0,0,0,0,0,0,0]
|
||||
@@ -100,7 +108,6 @@ def api_channels_all():
|
||||
UNIMISURA[numCh] = getRedisVal('SETTINGS:UNIT:MEASURE:'+str(numCh))
|
||||
channelsData = {
|
||||
'timeSrv' : getRedisVal('RTDATA:TIME:SRV'),
|
||||
'LogFreq' : getRedisVal('SETTINGS:LOG:FREQ'),
|
||||
'WriteFreq' : getRedisVal('SETTINGS:WRITE:FREQ'),
|
||||
'DecimalsCount' : getRedisVal('SETTINGS:DECIMALS:COUNT'),
|
||||
'Status' : getRedisVal('SETTINGS:LOG:STATUS'),
|
||||
@@ -121,8 +128,13 @@ def api_channels_all():
|
||||
'CurrentWorkFolder' : getRedisVal('SETTINGS:FOLDER:CURRENT'),
|
||||
'RealDateStatus' : getRedisVal('SETTINGS:TIME:REAL'),
|
||||
'SelPowerChannel' : getRedisVal('SETTINGS:POWER:CH'),
|
||||
'SmoothFact' : getRedisVal('SETTINGS:SMOOTHING:FACTOR'),
|
||||
'LogFreq' : getRedisVal('SETTINGS:LOG:FREQ'),
|
||||
'SelProcessing' : getRedisVal('SETTINGS:SMOOTHING:FUNCTION'),
|
||||
'ResultValue' : getRedisVal('RTDATA:VALUE')
|
||||
'ResultValue' : getRedisVal('RTDATA:VALUE:SMOOTHED'),
|
||||
'RealValue' : getRedisVal('RTDATA:VALUE:REAL'),
|
||||
'Crono' : getRedisVal('SETTINGS:LOG:CRONO'),
|
||||
'DisplayAlert' : displayWarning
|
||||
}
|
||||
# restituisce in formato json i dati letti da redis
|
||||
return jsonify(channelsData)
|
||||
@@ -145,10 +157,12 @@ def api_channels_current():
|
||||
elif savedPwd == "viaZavaritt152":
|
||||
showDiv2 = 1
|
||||
showDiv3 = 1
|
||||
#funzione api_channels_all: legge direttamente da redis, ritorna jsonify
|
||||
#funzione legge direttamente da redis, ritorna jsonify
|
||||
result = {
|
||||
'numCh' : numCh,
|
||||
'CostanteK' : getRedisVal('RTDATA:VALUE:KCONST'),
|
||||
'CostanteK1' : getRedisVal('RTDATA:VALUE:K1CONST'),
|
||||
'CostanteK2' : getRedisVal('RTDATA:VALUE:K2CONST'),
|
||||
'Offset' : getRedisVal('RTDATA:VALUE:OFFSET'),
|
||||
'CalcUMeasure' : getRedisVal('RTDATA:VALUE:UMEASURE'),
|
||||
'SmoothFact' : getRedisVal('SETTINGS:SMOOTHING:FACTOR'),
|
||||
'ChanThresh' : getRedisVal('SETTINGS:POWER:THRESH'),
|
||||
@@ -156,6 +170,7 @@ def api_channels_current():
|
||||
'LogFreq' : getRedisVal('SETTINGS:LOG:FREQ'),
|
||||
'DecimalsCount' : getRedisVal('SETTINGS:DECIMALS:COUNT'),
|
||||
'WriteFreq' : getRedisVal('SETTINGS:WRITE:FREQ'),
|
||||
'TimeBeforeWrite' : getRedisVal('SETTINGS:LOG:WAITIME'),
|
||||
'CurrIn' : getRedisVal('RTDATA:CH:'+str(numCh)),
|
||||
'CurrOut' : getRedisVal('RTDATA:OUT:'+str(numCh)),
|
||||
'MaxOut' : getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)),
|
||||
@@ -243,6 +258,7 @@ def start_log():
|
||||
def stop_log():
|
||||
#funzione stop_log: scrive su redis LOG:STATUS -> 0
|
||||
redSrv0.set('SETTINGS:LOG:STATUS', 0)
|
||||
redSrv0.set('SETTINGS:LOG:WAITER', 0)
|
||||
redSrv0.set('RTDATA:SESSION:NAME', "")
|
||||
led.off()
|
||||
return "OK"
|
||||
@@ -250,8 +266,11 @@ def stop_log():
|
||||
@flaskApp.route("/api/v1/data/navigate", methods=['PUT'])
|
||||
def data_navigate():
|
||||
#funzione torna in /data
|
||||
redSrv0.set('SETTINGS:FOLDER:CURRENT',"")
|
||||
return redirect("/logger")
|
||||
if(getRedisVal('SETTINGS:LOG:STATUS') == "0"):
|
||||
redSrv0.set('SETTINGS:FOLDER:CURRENT',"")
|
||||
return redirect("/logger")
|
||||
else:
|
||||
return redirect("/logger")
|
||||
|
||||
@flaskApp.route("/api/v1/data/export", methods=['PUT'])
|
||||
def data_export():
|
||||
@@ -291,9 +310,12 @@ def data_delete():
|
||||
if dataDir == workingDirectory:
|
||||
return redirect("/logger")
|
||||
else:
|
||||
shutil.rmtree(workingDirectory)
|
||||
redSrv0.set('SETTINGS:FOLDER:CURRENT', "")
|
||||
return redirect("/logger")
|
||||
if(getRedisVal('SETTINGS:LOG:STATUS') == "0"):
|
||||
shutil.rmtree(workingDirectory)
|
||||
redSrv0.set('SETTINGS:FOLDER:CURRENT', "")
|
||||
return redirect("/logger")
|
||||
else:
|
||||
return redirect("/logger")
|
||||
|
||||
@flaskApp.route("/api/v1/setup/dateTime", methods=['POST'])
|
||||
def insertDateTime():
|
||||
@@ -402,6 +424,8 @@ def setWriteFrequency():
|
||||
redSrv0.set('SETTINGS:WRITE:FREQ', newWriteFrequency)
|
||||
newLogFrequency = request.form['LogFreq']
|
||||
redSrv0.set('SETTINGS:LOG:FREQ', newLogFrequency)
|
||||
timeBeforeWrite = request.form['TimeBeforeWrite']
|
||||
redSrv0.set('SETTINGS:LOG:WAITIME', timeBeforeWrite)
|
||||
redSrv0.save()
|
||||
# rimando in settings
|
||||
return redirect("/settings")
|
||||
@@ -418,8 +442,12 @@ def setDecimalsCount():
|
||||
@flaskApp.route("/api/v1/kconst", methods=['POST'])
|
||||
def setKConst():
|
||||
#scrive su redis la costante K
|
||||
newKConst = request.form['KConst']
|
||||
redSrv0.set('RTDATA:VALUE:KCONST', newKConst)
|
||||
newK1Const = request.form['K1Const']
|
||||
redSrv0.set('RTDATA:VALUE:K1CONST', newK1Const)
|
||||
newK2Const = request.form['K2Const']
|
||||
redSrv0.set('RTDATA:VALUE:K2CONST', newK2Const)
|
||||
newOffset = request.form['Offset']
|
||||
redSrv0.set('RTDATA:VALUE:OFFSET', newOffset)
|
||||
redSrv0.save()
|
||||
# rimando in settings
|
||||
return redirect("/settings")
|
||||
@@ -480,5 +508,5 @@ def FTShutdown():
|
||||
|
||||
#dichiaro host ipv4 (ottenuto sopra utilizzando il modulo socket)
|
||||
if __name__ == "__main__":
|
||||
FTL.FTLog.Write(" FTServer starting Flask Host!")
|
||||
FTL.FTLog.Write(" FTServer starting Flask Hosting!")
|
||||
flaskApp.run(host=ipv4, port=80, debug=True)
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 411 B |
@@ -6,7 +6,7 @@
|
||||
|
||||
$("#Div0").hide();
|
||||
var intTime=300;
|
||||
var timeout = setTimeout(dataRefresh, intTime);
|
||||
var timeout = setInterval(dataRefresh, intTime);
|
||||
|
||||
function dataRefresh() {
|
||||
// scarico i dati aggioranti
|
||||
@@ -17,7 +17,6 @@
|
||||
$("#Div0").show();
|
||||
}
|
||||
}});
|
||||
timeout = setTimeout(dataRefresh, intTime);
|
||||
};
|
||||
|
||||
</script>
|
||||
@@ -26,11 +25,11 @@
|
||||
<h4>FT Logger</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
Steamware 2021
|
||||
Egalware 2022
|
||||
<br>
|
||||
Software di lettura e scrittura per canali analogici e digitali
|
||||
<br>
|
||||
V 1.1.0
|
||||
V 1.5.0
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
@@ -65,13 +65,12 @@
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--fine contenuto main, inizio footer (data, ora, logo)-->
|
||||
<footer class="py-1 bg-light bg-dark text-light fixed-bottom">
|
||||
<div class="container-fluid">
|
||||
<div class="d-flex align-items-center justify-content-between small">
|
||||
<div><span id="ServerTime"></span></div>
|
||||
<div>© Steamware 2021
|
||||
<div>© Egalware 2022
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,13 +5,16 @@
|
||||
<script type="text/javascript">
|
||||
|
||||
$("#Div0").hide();
|
||||
var intTime=300;
|
||||
var intTimeSlow=2000;
|
||||
var intTime=510;
|
||||
var intTimeSlow=1900;
|
||||
|
||||
// fix visualizzazioni
|
||||
fixTables();
|
||||
dataRefresh();
|
||||
|
||||
timeoutFast = setInterval(dataRefresh, intTime);
|
||||
timeoutSlow = setInterval(fixTables, intTimeSlow);
|
||||
|
||||
function fixFloat(actVal, numCount)
|
||||
{
|
||||
return parseFloat(actVal).toFixed(numCount)
|
||||
@@ -27,13 +30,11 @@
|
||||
// compilo i dati scaricati
|
||||
$("#SelChannelA").html(result.ChA);
|
||||
$("#OutputA").html(fixFloat(result.Outs[result.ChA],numCount));
|
||||
// $("#OutputA").html(result.Outs[result.ChA]);
|
||||
|
||||
setGaugeA(divWidth,result.Outs[result.ChA],result.Outmin[result.ChA],result.Outmax[result.ChA]);
|
||||
|
||||
$("#SelChannelB").html(result.ChB);
|
||||
$("#OutputB").html(fixFloat(result.Outs[result.ChB],numCount));
|
||||
// $("#OutputB").html(result.Outs[result.ChB]);
|
||||
|
||||
setGaugeB(divWidth,result.Outs[result.ChB],result.Outmin[result.ChB],result.Outmax[result.ChB]);
|
||||
|
||||
@@ -42,6 +43,8 @@
|
||||
$("#LastSessionName").html(result.LastSessionName);
|
||||
$("#CurrentFolder").html(result.CurrentWorkFolder);
|
||||
$("#ResultValue").html(result.ResultValue);
|
||||
$("#RealValue").html(result.RealValue);
|
||||
$("#Crono").html(result.Crono);
|
||||
|
||||
if(result.GateOpen == "0")
|
||||
{
|
||||
@@ -87,23 +90,28 @@
|
||||
{
|
||||
$("#Div0").show();
|
||||
}
|
||||
|
||||
$("#ExeWarning").hide();
|
||||
if(result.DisplayAlert == "1")
|
||||
{
|
||||
$("#ExeWarning").show();
|
||||
}
|
||||
|
||||
//scarico unità di misura dei canali mostrati
|
||||
$("#UniMisuA").html(result.UniMeasure[result.ChA]);
|
||||
$("#UniMisuB").html(result.UniMeasure[result.ChB]);
|
||||
$("#CalcUMeasure").html(result.CalcUMeasure);
|
||||
$("#CalcMeasure1").html(result.CalcUMeasure);
|
||||
$("#CalcMeasure2").html(result.CalcUMeasure);
|
||||
$("#SmoothFact").html(result.SmoothFact);
|
||||
$("#LogFreq").html(result.LogFreq);
|
||||
}});
|
||||
|
||||
// A ogni giro di data refresh fix di tabella cartelle e tabella file
|
||||
timeoutFast = setTimeout(dataRefresh, intTime);
|
||||
};
|
||||
|
||||
function fixTables(){
|
||||
fixFileTable();
|
||||
fixFolderTable();
|
||||
|
||||
// A ogni giro di data refresh fix di tabella cartelle e tabella file
|
||||
timeoutSlow = setTimeout(fixTables, intTimeSlow);
|
||||
}
|
||||
|
||||
function setGaugeA(divWidth,chValA,outMinA,outMaxA){
|
||||
@@ -305,9 +313,9 @@
|
||||
</div>
|
||||
<div class="row my-2">
|
||||
<div class="col-12 col-xl-6">
|
||||
<div class="row my-2">
|
||||
<div class="row mb-2">
|
||||
<div class="col-6 pr-0">
|
||||
<div class="card text-center">
|
||||
<div class="card text-center mr-1">
|
||||
<div class="card-header">
|
||||
<strong>Canale A: <span id="SelChannelA"></span></strong>
|
||||
</div>
|
||||
@@ -315,15 +323,15 @@
|
||||
<div id="divChA"></div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<span class="h3" id="OutputA"></span>
|
||||
<span class="h3" id="UniMisuA"></span>
|
||||
<span class="h4" id="OutputA"></span>
|
||||
<span class="h4" id="UniMisuA"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 pl-0">
|
||||
<div class="card text-center">
|
||||
<div class="card text-center ml-1">
|
||||
<div class="card-header">
|
||||
<strong>Canale B: <span id="SelChannelB"></span></strong>
|
||||
</div>
|
||||
@@ -331,33 +339,53 @@
|
||||
<div id="divChB"></div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<span class="h3" id="OutputB"></span>
|
||||
<span class="h3" id="UniMisuB"></span>
|
||||
<span class="h4" id="OutputB"></span>
|
||||
<span class="h4" id="UniMisuB"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card text-center">
|
||||
<div class="card-header">
|
||||
<strong>Calcolo risultante = K * [Valore B / (Valore A - Valore B)]</strong>
|
||||
<div class="card text-center">
|
||||
<div class="card-header text-center">
|
||||
<div class="row">
|
||||
<div class="col-3"></div>
|
||||
<div class="col-6">
|
||||
<strong>Risultante B/(A-B) </strong>
|
||||
</div>
|
||||
<div class="col-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-1"></div>
|
||||
<div class="col-5">
|
||||
<strong>Istant: </strong><span class="h5" id="RealValue"></span>
|
||||
<span class="h5" id="CalcMeasure1"></span>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<strong>Media: </strong><span class="h5" id="ResultValue"></span>
|
||||
<span class="h5" id="CalcMeasure2"></span>
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<span class="h3" id="ResultValue"></span>
|
||||
<span class="h3" id="CalcUMeasure"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-xl-6">
|
||||
<div class="card my-2">
|
||||
<div id="Div7" class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="col-5">
|
||||
<button id="btnStart" type="button" class="btn btn-success btn-block" style="font-size: 110%" onclick="startLog()">
|
||||
<img src="../static/img/play-fill.svg" height="24" width="24"> Inizia Scrittura</button>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="col-2 badge badge-dark text-light text-center">
|
||||
<em><span class="h5" id="Crono"></span></em>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<button id="btnStop" type="button" class="btn btn-danger btn-block" style="font-size: 110%" onclick="stopLog()">
|
||||
<img src="../static/img/stop-fill.svg" height="24" width="24"> Ferma Scrittura</button>
|
||||
</div>
|
||||
@@ -396,9 +424,26 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body" id="Div11"> <!--Div11 ovvero elenco files-->
|
||||
<p class="text-center" id="showData"></p>
|
||||
<p class="text-center" id="showData"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-5">
|
||||
Smooth Factor: <span class="h5" id="SmoothFact"></span>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
Sample Period: <span class="h5" id="LogFreq"></span> ms
|
||||
</div>
|
||||
<span class="badge badge-warning" id="ExeWarning">
|
||||
<img src="../static/img/exclamation-triangle-fill.svg" height="20" widht="20"></img>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
refreshInput();
|
||||
|
||||
var timeout = setTimeout(dataRefresh, intTime);
|
||||
var timeoutSetting = setTimeout(refreshSettings, intTime);
|
||||
var timeout = setInterval(dataRefresh, intTime);
|
||||
var timeoutSetting = setInterval(refreshSettings, intTime);
|
||||
|
||||
function fixFloat(actVal, numCount)
|
||||
{
|
||||
@@ -24,6 +24,7 @@
|
||||
$("#CurrOut").html(fixFloat(result.CurrOut, numCount));
|
||||
$("#LogFreq").val(result.LogFreq);
|
||||
$("#WriteFreq").val(result.WriteFreq);
|
||||
$("#TimeBeforeWrite").val(result.TimeBeforeWrite);
|
||||
$("#DecimalsCount").val(result.DecimalsCount);
|
||||
$("#ServerTime").html(result.timeSrv);
|
||||
$("#ddlChannels").val(result.numCh);
|
||||
@@ -31,7 +32,9 @@
|
||||
$("#MaxOut").val(result.MaxOut);
|
||||
$("#MinIn").val(result.MinIn);
|
||||
$("#MaxIn").val(result.MaxIn);
|
||||
$("#KConst").val(result.CostanteK);
|
||||
$("#K1Const").val(result.CostanteK1);
|
||||
$("#K2Const").val(result.CostanteK2);
|
||||
$("#Offset").val(result.Offset);
|
||||
$("#CurrentFolder").html(result.CurrentWorkFolder);
|
||||
$("#UniMisura").val(result.UniMisura);
|
||||
$("#ChanThresh").val(result.ChanThresh);
|
||||
@@ -63,8 +66,6 @@
|
||||
$("#MinIn").html(result.MinIn);
|
||||
$("#MaxIn").html(result.MaxIn);
|
||||
}});
|
||||
|
||||
timeoutSetting = setTimeout(refreshSettings, intTime);
|
||||
}
|
||||
|
||||
function dataRefresh() {
|
||||
@@ -92,8 +93,6 @@
|
||||
$("#ChanRealMax").html(result.ChRealMax);
|
||||
$("#LastSessionName").html(result.LastSessionName);
|
||||
}});
|
||||
|
||||
timeout = setTimeout(dataRefresh, intTime);
|
||||
};
|
||||
|
||||
function saveMin(){
|
||||
@@ -352,18 +351,34 @@
|
||||
<div class="card my-2 col-12">
|
||||
<div class="row card-header">
|
||||
<i class="fas fa-table mr-1"></i>
|
||||
<strong>Costante K per calcolo (k*risultato)</strong>
|
||||
<strong>Valori per calcolo risultante = k1*x^2 + k2*x + offset</strong>
|
||||
</div>
|
||||
<div class="card-body row">
|
||||
<form class="col-12" method="POST" action="/api/v1/kconst">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">Costante K: </span>
|
||||
<span class="input-group-text">Costante k1: </span>
|
||||
</div>
|
||||
<input type="number" step="0.0000001" class="form-control" id="KConst" name="KConst"></input>
|
||||
<div class="input-group-append">
|
||||
<input type="submit" value="SET" class="btn btn-success"></input>
|
||||
<input type="number" step="0.0000001" class="form-control" id="K1Const" name="K1Const"></input>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">Costante k2: </span>
|
||||
</div>
|
||||
<input type="number" step="0.0000001" class="form-control" id="K2Const" name="K2Const"></input>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">Offset o: </span>
|
||||
</div>
|
||||
<input type="number" step="0.0000001" class="form-control" id="Offset" name="Offset"></input>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8">
|
||||
<input type="submit" value="SET" class="btn btn-success btn-block mt-2"></input>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -484,15 +499,20 @@
|
||||
</div>
|
||||
<div class="card-body row">
|
||||
<form class="col-12" method="POST" action="/api/v1/frequency">
|
||||
<div class="input-group row my-2 px-0">
|
||||
<div class="input-group">
|
||||
<span class="col-6 input-group-text">Periodo di campionamento (ms): </span>
|
||||
<input type="number" class="col-6 form-control" id="LogFreq" name="LogFreq"></input>
|
||||
</div>
|
||||
<div class="input-group row my-2 px-0">
|
||||
<div class="input-group">
|
||||
<span class="col-6 input-group-text">Periodo di scrittura su file (ms): </span>
|
||||
<input type="number" class="col-6 form-control" id="WriteFreq" name="WriteFreq"></input>
|
||||
<br>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<span class="col-6 input-group-text">Ritardo prima scrittura su file (s): </span>
|
||||
<input type="number" min="1" max="5" class="col-6 form-control" id="TimeBeforeWrite" name="TimeBeforeWrite"></input>
|
||||
<br>
|
||||
</div>
|
||||
<div class="row text-center">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8">
|
||||
|
||||
Reference in New Issue
Block a user