diff --git a/logger/FTLogger.py b/logger/FTLogger.py index 2e828ac..170362c 100644 --- a/logger/FTLogger.py +++ b/logger/FTLogger.py @@ -3,6 +3,8 @@ import time import datetime import redis +import os +import os.path #configurazione per lavorare su server redis locale REDIS_PORT = 6379 @@ -14,7 +16,10 @@ redSrv0 = redis.Redis( #funzione per leggere e decodificare da redis def getRedisVal(redisKey): - return redSrv0.get(redisKey).decode('utf-8') + 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/" @@ -30,6 +35,8 @@ if redSrv0.get('SETTINGS:LOG:STATUS') is None: redSrv0.set('SETTINGS:LOG:STATUS',0) 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', "default") 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) @@ -42,15 +49,17 @@ if redSrv0.get('SETTINGS:SELECTED_CH') is None: #funzione salva time+data e otto valori letti su file (SE LOG è 1) def fileSave(): + 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() lastLog = rawLastLog.strftime(dateFormat) try: - outFile = open(DATA_path+"/"+dataFileName, "a") + outFile = open(workingDirectory+"/"+dataFileName, "a") except FileNotFoundError: - print("Creating new data.csv") - outFile = open(DATA_path+"/"+dataFileName, "w+") + outFile = open(workingDirectory+"/"+dataFileName, "w+") outFile.write("# LOG started at " + str(lastLog)) # dichiaro una stringa in cui accumulo i valori csvRow = str(lastLog) +"," @@ -64,7 +73,7 @@ def fileSave(): outFile.write(csvRow +"\r\n") outFile.close() -#ciclo principale, salva time attuale e se LOG:STATUS è 1 fa il ciclo principale +#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 diff --git a/logger/log/PyLog.txt b/logger/log/PyLog.txt index 94b20d1..28aa885 100644 --- a/logger/log/PyLog.txt +++ b/logger/log/PyLog.txt @@ -84,3 +84,4 @@ 2021-04-01 15:20:08.570454 Caught error: name 'now' is not defined 2021-04-01 15:21:11.244154 Caught error: name 'now' is not defined 2021-04-02 09:27:42.781175 Caught error: Connection closed by server. +2021-04-08 11:19:48.305652 Caught error: Error 111 connecting to 127.0.0.1:6379. Connection refused. diff --git a/sampler/FTSampler.py b/sampler/FTSampler.py index 690b2c1..0be510b 100644 --- a/sampler/FTSampler.py +++ b/sampler/FTSampler.py @@ -16,21 +16,26 @@ redSrv0 = redis.Redis( #funzione per leggere e decodificare da redis def getRedisVal(redisKey): - return redSrv0.get(redisKey).decode('utf-8') + if redSrv0.get(redisKey) is None: + return redSrv0.get(redisKey) + else: + return redSrv0.get(redisKey).decode('utf-8') -#assegno director: log per file di debug e data per file output +#assegno director log per file di debug LOG_path = "/home/pi/Flythis/logger/log/" -DATA_path = "/home/pi/data/" - -startingSampleFreq = 250 #intervallo in millisecondi fra un campionamento e il successivo +startingSampleFreq = 250 redSampleFreq = 'SETTINGS:LOG:FREQ' redSrv0.set(redSampleFreq,startingSampleFreq) #se non c'è un valore nei campi di redis, popolo il db redSrv0.set('SETTINGS:LOG:STATUS',0) redisTime = 'RTDATA:TIME:SRV' +if redSrv0.get('SETTINGS:PASSWORD:CURRENT') is None: + redSrv0.set('SETTINGS:PASSWORD:CURRENT',"-") +if redSrv0.get('SETTINGS:FOLDER:CURRENT') is None: + redSrv0.set('SETTINGS:FOLDER:CURRENT', "default") if redSrv0.get('SETTINGS:SELECTED_CH') is None: redSrv0.set('SETTINGS:SELECTED_CH',0) for numCh in range(0,8,+1): @@ -86,17 +91,15 @@ try: outVal = chOutMin + ((inValue-chInMin) * (deltaOut / deltaIn)) return outVal -#ciclo principale, salva time attuale e se LOG:STATUS è 1 fa il ciclo principale +#ciclo principale while(1): now = datetime.datetime.now() redSrv0.set(redisTime,str(now)) - #print(logStatus) - # solo se su redis LOG è 1 eseguo il ciclo principale CHvalue = CH.ADS1256_GetAll() redisSave(CHvalue) # riporto ultima esecuzione ad adesso endExec = datetime.datetime.now() - # calcolo il delta dovuto alle esecuzioni + # calcolo il delta time dovuto alle esecuzioni delta = endExec - now waitTime = int(redSrv0.get(redSampleFreq)) / 1000 - delta.microseconds/1000000 if(waitTime < 0.1): diff --git a/server/FTServer.py b/server/FTServer.py index 85bfe02..06c777d 100644 --- a/server/FTServer.py +++ b/server/FTServer.py @@ -4,16 +4,19 @@ from flask import Flask, render_template, jsonify, request from datetime import datetime from flask.wrappers import Request import redis -import os +import os, glob import json from werkzeug.utils import redirect import os.path, time -#from pathlib import Path -#from stat import S_ISREG, ST_CTIME, ST_MODE +from distutils.dir_util import copy_tree +import shutil #assegno ipv4 statico ipv4 = '10.74.83.210' +#definisco directory /data +dataDir='/home/pi/data/' + #configurazione per lavorare su server redis locale REDIS_PORT = 6379 REDIS_HOST = '127.0.0.1' @@ -24,7 +27,10 @@ redSrv0 = redis.Redis( #funzione per leggere e decodificare da redis def getRedisVal(redisKey): - return redSrv0.get(redisKey).decode('utf-8') + if redSrv0.get(redisKey) is None: + return redSrv0.get(redisKey) + else: + return redSrv0.get(redisKey).decode('utf-8') flaskApp = Flask(__name__) flaskApp.config['JSON_SORT_KEYS'] = False @@ -70,12 +76,10 @@ def about(): #assegno il template html di riferimento return render_template('about.html', **channelsData) -# definisco una NUOVA route a cui rispondere su chiamta in metodo GET x restituire dati aggiornati +# funzione api_channels_all: legge direttamente da redis, ritorna jsonify @flaskApp.route("/api/v1/channels/all", methods=['GET']) def api_channels_all(): numCh = getRedisVal('SETTINGS:SELECTED_CH') - #funzione api_channels_all: legge direttamente da redis, ritorna jsonify - 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] @@ -85,7 +89,6 @@ def api_channels_all(): OUT[numCh] = getRedisVal('RTDATA:OUT:'+str(numCh)) OUTMIN[numCh] = getRedisVal('SETTINGS:OUT:MIN:'+str(numCh)) OUTMAX[numCh] = getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)) - channelsData = { 'timeSrv' : getRedisVal('RTDATA:TIME:SRV'), 'timeLog' : getRedisVal('RTDATA:TIME:LOG'), @@ -102,7 +105,8 @@ def api_channels_all(): 'ChScaleMin' : getRedisVal('SETTINGS:IN:MIN:'+str(numCh)), 'ChRealMax' : getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)), 'ChRealMin' : getRedisVal('SETTINGS:OUT:MIN:'+str(numCh)), - 'LastSessionName' : getRedisVal('RTDATA:SESSION:NAME') + 'LastSessionName' : getRedisVal('RTDATA:SESSION:NAME'), + 'CurrentWorkFolder' : getRedisVal('SETTINGS:FOLDER:CURRENT') } # restituisce in formato json i dati letti da redis return jsonify(channelsData) @@ -111,6 +115,21 @@ def api_channels_all(): @flaskApp.route("/api/v1/channels/current", methods=['GET']) def api_channels_current(): numCh = getRedisVal('SETTINGS:SELECTED_CH') + savedPwd = getRedisVal('SETTINGS:PASSWORD:CURRENT') + if savedPwd is None: + redSrv0.set('SETTINGS:PASSWORD:CURRENT',"") + # tutto false + showDiv1 = 0 + showDiv2 = 0 + showDiv3 = 0 + if savedPwd == "": + showDiv1 = 1 + elif savedPwd == "viaZavaritt": + showDiv3 = 1 + elif savedPwd == "viaZavaritt152": + showDiv2 = 1 + showDiv3 = 1 + #funzione api_channels_all: legge direttamente da redis, ritorna jsonify result = { 'numCh' : numCh, @@ -123,34 +142,29 @@ def api_channels_current(): 'MaxOut' : getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)), 'MinOut' : getRedisVal('SETTINGS:OUT:MIN:'+str(numCh)), 'MaxIn' : getRedisVal('SETTINGS:IN:MAX:'+str(numCh)), - 'MinIn' : getRedisVal('SETTINGS:IN:MIN:'+str(numCh)) + 'MinIn' : getRedisVal('SETTINGS:IN:MIN:'+str(numCh)), + 'CurrentWorkFolder' : getRedisVal('SETTINGS:FOLDER:CURRENT'), + 'ShowDiv01' : showDiv1, + 'ShowDiv02' : showDiv2, + 'ShowDiv03' : showDiv3, } # restituisce in formato json i dati letti da redis return jsonify(result) - # elenco file nella directory @flaskApp.route("/api/v1/files/list", methods=['GET']) def api_get_files(): - dataDir='/home/pi/data/' - fileList = os.listdir(dataDir) - # #all entries in the directory w/ stats - # data = (os.path.join(dataDir, fn) for fn in os.listdir(dataDir)) - # data = ((os.stat(path), path) for path in data) - # # regular files, insert creation date - # data = ((stat[ST_CTIME], path) - # for stat, path in data if S_ISREG(stat[ST_MODE])) - + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + fileList = os.listdir(workingDirectory) lista = [] idx=0 # for item in sorted(data): for item in fileList: - t_obj = time.strptime(time.ctime(os.path.getctime(dataDir+item))) + t_obj = time.strptime(time.ctime(os.path.getctime(workingDirectory+"/"+item))) # Transforming the time object to a timestamp - # of ISO 8601 format T_stamp = time.strftime("%Y-%m-%d %H:%M:%S", t_obj) - current = {"name": item,"size": os.path.getsize(dataDir+item), "date":T_stamp} - # current = {"name": item,"size": os.path.getsize(dataDir+item), "date":time.ctime(os.path.getctime(dataDir+item))} + current = {"name": item,"size": os.path.getsize(workingDirectory+"/"+item), "date":T_stamp} lista.append(current) idx=idx+1 return jsonify(fileTable = lista) @@ -158,16 +172,21 @@ def api_get_files(): # Route di comando x LOG: start e stop @flaskApp.route("/api/v1/log/start", methods=['PUT']) def start_log(): - #funzione start_log: scrive su redis LOG:STATUS -> 1 - redSrv0.set('SETTINGS:LOG:STATUS', 1) - #data e time ora - lastDate = datetime.now() - #formato per data time nomefile: YYYYddmm_HMS - format = "%Y%m%d_%H%M%S" - #format date e time adando strftime() - nameDate = lastDate.strftime(format) + ".csv" - redSrv0.set('RTDATA:SESSION:NAME', nameDate) - return "OK" + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + if os.path.isdir(workingDirectory) is True: + #funzione start_log: scrive su redis LOG:STATUS -> 1 + redSrv0.set('SETTINGS:LOG:STATUS', 1) + #data e time ora + lastDate = datetime.now() + #formato per data time nomefile: YYYYddmm_HMS + format = "%Y%m%d_%H%M%S" + #format date e time adando strftime() + nameDate = lastDate.strftime(format) + ".csv" + redSrv0.set('RTDATA:SESSION:NAME', nameDate) + return "OK" + else: + return "OK" @flaskApp.route("/api/v1/log/stop", methods=['PUT']) def stop_log(): @@ -176,6 +195,45 @@ def stop_log(): redSrv0.set('RTDATA:SESSION:NAME', "-") return "OK" +@flaskApp.route("/api/v1/data/export", methods=['PUT']) +def data_export(): + #funzione dataExport: copia + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + scriptMount = """ + if [ -a /dev/sd[a-z]1 ] + then + /bin/mount /dev/sd[a-z]1 /mnt/USB + else + /bin/mount /dev/sd[a-z] /mnt/USB + fi + """ + os.system("bash -c '%s'" % scriptMount) + usbDrive='/mnt/USB/' + dataDestination = (usbDrive+currentFolder) + if os.path.isdir(dataDestination) is True: + copy_tree(workingDirectory, dataDestination) + else: + os.mkdir(dataDestination) + copy_tree(workingDirectory, dataDestination) + return redirect("/logger") + +@flaskApp.route("/api/v1/data/delete", methods=['PUT']) +def data_delete(): + #funzione dataDelete: cancella + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + shutil.rmtree(workingDirectory) + redSrv0.set('SETTINGS:FOLDER:CURRENT', "not set") + return redirect("/logger") + +@flaskApp.route("/api/v1/setup/passwordInput", methods=['POST']) +def insertPassword(): + #funzione inserimento password + currentPassword = request.form['PasswordForm'] + redSrv0.set('SETTINGS:PASSWORD:CURRENT', currentPassword, ex=5*60) + return redirect("/settings") + @flaskApp.route("/api/v1/setup/saveInMin", methods=['PUT']) def setupInMin(): # devo leggere il channel attualmente selezionato @@ -221,6 +279,19 @@ def setWriteFrequency(): # rimando in settings return redirect("/settings") +@flaskApp.route("/api/v1/setup/workingtree", methods=['POST']) +def setWorkingTree(): + #funzione set directory scrive su redis il testo preso dall'input in settings + newWorkFolder = request.form['NewFolder'] + redSrv0.set('SETTINGS:FOLDER:CURRENT', newWorkFolder) + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + if os.path.isdir(workingDirectory) is True: + return redirect("/logger") + else: + os.mkdir(workingDirectory) + return redirect("/logger") + @flaskApp.route("/api/v1/scaleout", methods=['POST']) def setScale(): indexCh = getRedisVal('SETTINGS:SELECTED_CH') diff --git a/server/templates/about.html b/server/templates/about.html index e0168f8..5bce330 100644 --- a/server/templates/about.html +++ b/server/templates/about.html @@ -6,24 +6,16 @@ var intTime=2000;
-
+
- - About Analogger +

Steamware Srl

-

Steamware Srl

+ FT Logger Software 2021
-

Analog and Digital reader and logger software

-
-
-

Version 0.2.1

-
-
-

Last Patched:
- 02/04/2021

+ Analog and Digital reader and logger software
diff --git a/server/templates/layout.html b/server/templates/layout.html index 3c6e341..51b4f0a 100644 --- a/server/templates/layout.html +++ b/server/templates/layout.html @@ -4,8 +4,8 @@ - - + + {{ title }} diff --git a/server/templates/logger.html b/server/templates/logger.html index 9d11497..5c1f069 100644 --- a/server/templates/logger.html +++ b/server/templates/logger.html @@ -3,10 +3,13 @@ {% block content %}
@@ -174,9 +208,6 @@
OUT
-
@@ -192,39 +223,46 @@
OUT
-
-
+
- +
- -
-
- Logger period: ms -
-
- File Write period: ms +
-
-
-
-
- Record Log +
+
+ Folder salvataggio file. Attuale:  
+
+
+
+
+ Insert new:   + +
-
-
- Current Session:   -
+ +
+
+
+
+ Elenco registrazioni +
+ Sessione attuale:   +
+
+
+ +
+
+
@@ -232,6 +270,14 @@

+
{% endblock %} \ No newline at end of file diff --git a/server/templates/settings.html b/server/templates/settings.html index a28f5dd..3d21a56 100644 --- a/server/templates/settings.html +++ b/server/templates/settings.html @@ -10,7 +10,6 @@ // carico la prima volta i dati function refreshInput() { - // scarico i dati aggioranti $.ajax({url: "/api/v1/channels/current", success: function(result){ // compilo i dati scaricati $("#CurrIn").html(result.CurrIn); @@ -24,11 +23,22 @@ $("#MaxOut").val(result.MaxOut); $("#MinIn").html(result.MinIn); $("#MaxIn").html(result.MaxIn); + $("#CurrentFolder").html(result.CurrentWorkFolder); + // inizio nascondendo div2 e div3 + $("#Div2").hide(); + $("#Div3").hide(); + if(result.ShowDiv02 == "1") + { + $("#Div2").show(); + } + if(result.ShowDiv03 == "1") + { + $("#Div3").show(); + } }}); } function refreshSettings() { - // scarico i dati aggioranti $.ajax({url: "/api/v1/channels/current", success: function(result){ // compilo i dati scaricati $("#CurrIn").html(result.CurrIn); @@ -78,7 +88,7 @@ } }) }; - + function saveMax(){ $.ajax({ type: 'PUT' @@ -122,187 +132,196 @@
-
-
+
+
-
- Channel A -
-
-
- -
-
+ Autenticazione utente
-
- Original: -
- Scaled: - -
-
-
-
-
- Channel B -
-
-
- -
-
-
-
- Original: -
- Scaled: - +
+
+
+ Password:   + + +
+
-
-
-
-
- - Channel Setup +
+
+
+
+ Canale A +
+ +
-
+
+ Nativo: +
+ Scalato: + +
+
+
+
+
+
+ Canale B +
+ +
+
+
+ Nativo: +
+ Scalato: + +
+
+
+
+
+
+
+
+ + Impostazioni scala canale +
+
-
-
- -
-
-
-
-
-
-
-
-
MIN
-
Current
-
MAX
-
-
-
IN
-
-
-
000
-
000
-
000
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
OUT
+
-
- -
-
{{ Out0 }}
-
- -
+
MIN
+
Attuale
+
MAX
-
-
+
-
-
-
-
- +
+
IN
+
+
+
000
+
000
+
000
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+ +
+
OUT
+
+
+
+ +
+
{{ Out0 }}
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
-
-
-
-
-
- - Impostazioni Timer +
+
+ + Impostazioni Timer +
+
+
+
+ Periodo di campionamento (ms):   + +
+
+ Periodo di scrittura (ms):   + +
+ +
+
+
-
-
-
- Periodo di campionamento (ms):   - -
-
- Periodo di scrittura (ms):   - -
- -
-
-
-
-
-
- - Reset settings to defaults -
-
-
-
-
- -
-
-
+
+
+ + Reset impostazioni predefinite +
+
+
+
+
+ +
+
+
+