diff --git a/logger/FTLogger.py b/logger/FTLogger.py index 2e828ac..305f427 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 @@ -30,6 +32,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 +46,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 +70,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/sampler/FTSampler.py b/sampler/FTSampler.py index 35d0743..45951d1 100644 --- a/sampler/FTSampler.py +++ b/sampler/FTSampler.py @@ -29,6 +29,8 @@ 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: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): diff --git a/server/FTServer.py b/server/FTServer.py index 47ad29d..cee28db 100644 --- a/server/FTServer.py +++ b/server/FTServer.py @@ -9,8 +9,7 @@ import json from werkzeug.utils import redirect import os.path, time from distutils.dir_util import copy_tree -#from pathlib import Path -#from stat import S_ISREG, ST_CTIME, ST_MODE +import shutil #assegno ipv4 statico ipv4 = '10.74.83.210' @@ -18,9 +17,6 @@ ipv4 = '10.74.83.210' #definisco directory /data dataDir='/home/pi/data/' -#definisco directory per export Data -#dataDestination='/media/pi/KING_8GB/Data' - #configurazione per lavorare su server redis locale REDIS_PORT = 6379 REDIS_HOST = '127.0.0.1' @@ -77,12 +73,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') - 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] @@ -92,7 +86,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'), @@ -109,7 +102,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) @@ -130,7 +124,8 @@ 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') } # restituisce in formato json i dati letti da redis return jsonify(result) @@ -138,15 +133,17 @@ def api_channels_current(): # elenco file nella directory @flaskApp.route("/api/v1/files/list", methods=['GET']) def api_get_files(): - fileList = os.listdir(dataDir) + 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 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(workingDirectory+"/"+item), "date":T_stamp} lista.append(current) idx=idx+1 return jsonify(fileTable = lista) @@ -154,16 +151,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(): @@ -175,6 +177,8 @@ def stop_log(): @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 @@ -184,16 +188,23 @@ def data_export(): fi """ os.system("bash -c '%s'" % scriptMount) - dataDestination='/mnt/USB' - copy_tree(dataDir,dataDestination) - return "OK" + 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("/settings") @flaskApp.route("/api/v1/data/delete", methods=['PUT']) def data_delete(): #funzione dataDelete: cancella - for file in os.scandir(dataDir): - os.remove(file.path) - return "OK" + currentFolder = getRedisVal('SETTINGS:FOLDER:CURRENT') + workingDirectory = (dataDir+currentFolder) + shutil.rmtree(workingDirectory) + redSrv0.set('SETTINGS:FOLDER:CURRENT', "not set") + return redirect("/settings") @flaskApp.route("/api/v1/setup/saveInMin", methods=['PUT']) def setupInMin(): @@ -240,6 +251,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("/settings") + else: + os.mkdir(workingDirectory) + return redirect("/settings") + @flaskApp.route("/api/v1/scaleout", methods=['POST']) def setScale(): indexCh = getRedisVal('SETTINGS:SELECTED_CH') diff --git a/server/templates/logger.html b/server/templates/logger.html index a2e854a..d452514 100644 --- a/server/templates/logger.html +++ b/server/templates/logger.html @@ -42,6 +42,7 @@ $("#LoggerTime").html(result.timeLog); $("#ServerTime").html(result.timeSrv); $("#LastSessionName").html(result.LastSessionName); + $("#CurrentFolder").html(result.CurrentWorkFolder); }}); timeout = setTimeout(dataRefresh, intTime); @@ -140,7 +141,6 @@ } function UpdateFileTable(fileTable) { - // EXTRACT VALUE FOR HTML HEADER. var col = []; for (var i = 0; i < fileTable.length; i++) { @@ -150,20 +150,18 @@ } } } - // CREATE DYNAMIC TABLE. var table = document.createElement("table"); // CREATE HTML TABLE HEADER ROW USING THE EXTRACTED HEADERS ABOVE. - - var tr = table.insertRow(-1); // TABLE ROW. - + // TABLE ROW. + var tr = table.insertRow(-1); + // TABLE HEADER. for (var i = 0; i < col.length; i++) { - var th = document.createElement("th"); // TABLE HEADER. + var th = document.createElement("th"); th.innerHTML = col[i]; tr.appendChild(th); } - // ADD JSON DATA TO THE TABLE AS ROWS. for (var i = 0; i < fileTable.length; i++) { tr = table.insertRow(-1); @@ -172,15 +170,14 @@ tabCell.innerHTML = fileTable[i][col[j]]; } } - // FINALLY ADD THE NEWLY CREATED TABLE WITH JSON DATA TO A CONTAINER. var divContainer = document.getElementById("showData"); divContainer.innerHTML = ""; divContainer.appendChild(table); } - // fix file UpdateFileTable(fileTable); +
@@ -234,26 +231,23 @@
-
-
- Record Log + Elenco registrazioni +
+ Cartella attuale:   +
+
+ Sessione attuale:   +
+
+
+
-
-
- Current Session:   -
+
+
-
-
- -
-
- -
-

diff --git a/server/templates/settings.html b/server/templates/settings.html index a28f5dd..4031aa8 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,11 @@ $("#MaxOut").val(result.MaxOut); $("#MinIn").html(result.MinIn); $("#MaxIn").html(result.MaxIn); + $("#CurrentFolder").html(result.CurrentWorkFolder); }}); } function refreshSettings() { - // scarico i dati aggioranti $.ajax({url: "/api/v1/channels/current", success: function(result){ // compilo i dati scaricati $("#CurrIn").html(result.CurrIn); @@ -122,11 +121,11 @@
-
+
- Channel A + Canale A
@@ -144,16 +143,16 @@
- Original: + Nativo:
- Scaled: + Scalato:
- Channel B + Canale B
@@ -171,21 +170,21 @@
- Original: + Nativo:
- Scaled: + Scalato:
-
+
-
+
- Channel Setup + Impostazioni scala canale
-
+
@@ -202,7 +201,6 @@
-
@@ -212,7 +210,7 @@
MIN
-
Current
+
Attuale
MAX
@@ -261,7 +259,7 @@
- +
@@ -270,7 +268,24 @@
-
+
+
+ Selezione cartella +
+ Cartella attuale:   +
+
+
+
+
+ Insert new:   + + +
+
+
+
+
Impostazioni Timer @@ -285,7 +300,7 @@ Periodo di scrittura (ms):  
- +
@@ -293,10 +308,10 @@
- Reset settings to defaults + Reset impostazioni predefinite
-
-
+
+