gestione sottocartelle, export, cancellazione

This commit is contained in:
Marco Locatelli
2021-04-07 15:21:37 +02:00
parent 1a70e01cd7
commit 1e5845a302
5 changed files with 119 additions and 78 deletions
+10 -4
View File
@@ -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
+2
View File
@@ -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):
+53 -29
View File
@@ -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')
+18 -24
View File
@@ -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);
</script>
<div class="container-fluid">
<div class="row my-2">
@@ -234,26 +231,23 @@
</div>
<div class="card mb-4">
<div class="card-header">
<div class="row">
<div class="col-3">
<b>Record Log</b>
<b>Elenco registrazioni</b>
<div class="input-group-text my-2">
<span>Cartella attuale: &nbsp;</span> <span id="CurrentFolder"></span>
</div>
<div class="input-group-text my-2">
<span>Sessione attuale: &nbsp;</span> <span id="LastSessionName"></span>
</div>
<div class="row mt-2">
<div class="col-6">
<button type="button" class="btn btn-primary btn-block" onclick="exportData()">Esporta Cartella</button>
</div>
<div class="col-9">
<div class="input-group-text">
<span>Current Session: &nbsp;</span> <span id="LastSessionName"></span>
</div>
<div class="col-6">
<button type="button" class="btn btn-danger btn-block" onclick="deleteData()">Cancella Cartella</button>
</div>
</div>
</div>
<div class="card-body">
<div class="table-secondary text-center py-2 mb-4 row">
<div class="col-6">
<button type="button" class="btn btn-primary btn-block" onclick="exportData()">Export Data</button>
</div>
<div class="col-6">
<button type="button" class="btn btn-danger btn-block" onclick="deleteData()">Delete Data</button>
</div>
</div>
<p class="text-center" id="showData"></p>
</div>
</div>
+36 -21
View File
@@ -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 @@
</script>
<div class="container-fluid">
<div class="row mx-1 my-2">
<div class="row my-2 px-3">
<div class="card col-6">
<div class="row card-header">
<div class="col-6">
<strong>Channel A</strong>
<strong>Canale A</strong>
</div>
<div class="col-6">
<div class="form-group">
@@ -144,16 +143,16 @@
</div>
</div>
<div class="card-body text-center">
Original: <span id="ChannelA"></span>
Nativo: <span id="ChannelA"></span>
<br>
<strong>Scaled: <span id="OutputA"></span>
<strong>Scalato: <span id="OutputA"></span>
</strong>
</div>
</div>
<div class="card col-6">
<div class="row card-header">
<div class="col-6">
<strong>Channel B</strong>
<strong>Canale B</strong>
</div>
<div class="col-6">
<div class="form-group">
@@ -171,21 +170,21 @@
</div>
</div>
<div class="card-body text-center">
Original: <span id="ChannelB"></span>
Nativo: <span id="ChannelB"></span>
<br>
<strong>Scaled: <span id="OutputB"></span>
<strong>Scalato: <span id="OutputB"></span>
</strong>
</div>
</div>
</div>
<div class="card mb-4">
<div class="card my-2">
<div class="card-header">
<div class="row">
<div class="col-4">
<div class="col-5">
<i class="fas fa-table mr-1"></i>
<strong>Channel Setup</strong>
<strong>Impostazioni scala canale</strong>
</div>
<div class="col-4 text-right">
<div class="col-3 text-right">
<label for="sel1"> Channel n°</label>
</div>
<div class="col-4 text-right">
@@ -202,7 +201,6 @@
</select>
</div>
</div>
</div>
</div>
<h5>
@@ -212,7 +210,7 @@
<div class="col-8">
<div class="row">
<div class="col-4">MIN</div>
<div class="col-4">Current</div>
<div class="col-4">Attuale</div>
<div class="col-4">MAX</div>
</div>
</div>
@@ -261,7 +259,7 @@
<div class="col-2"></div>
<div class="col-8">
<div class="row">
<input type="submit" value="SET OUTPUT SCALE" class="btn btn-success btn-block mx-2 my-2"></input>
<input type="submit" value="SET OUTPUT SCALE" class="btn btn-success btn-block mt-2"></input>
</div>
</div>
<div class="col-2"></div>
@@ -270,7 +268,24 @@
</div>
</h5>
</div>
<div class="card mb-4">
<div class="card my-2">
<div class="card-header">
<strong>Selezione cartella</strong>
<div class="input-group-text my-2">
<span>Cartella attuale: &nbsp;</span> <span id="CurrentFolder"></span>
</div>
</div>
<div class="card-body">
<form class="col-12" method="POST" action="/api/v1/setup/workingtree">
<div class="row input-group my-2">
<span class="col-3 input-group-text">Insert new: &nbsp;</span>
<input type="text" class="col-7 form-control" id="NewFolder" name="NewFolder"></input>
<input type="submit" value="SET" class="btn btn-success btn-block col-2"></input>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-header">
<i class="fas fa-table mr-1"></i>
<strong>Impostazioni Timer</strong>
@@ -285,7 +300,7 @@
<span class="col-8 input-group-text">Periodo di scrittura (ms): &nbsp;</span>
<input type="number" class="col-4 form-control" id="WriteFreq" name="WriteFreq"></input>
<br>
<input type="submit" value="SET" class="btn btn-success btn-block my-2"></input>
<input type="submit" value="SET" class="btn btn-success btn-block mt-2"></input>
</div>
</form>
</div>
@@ -293,10 +308,10 @@
<div class="card my-2">
<div class="card-header">
<i class="fas fa-table mr-1"></i>
<strong>Reset settings to defaults</strong>
<strong>Reset impostazioni predefinite</strong>
</div>
<div class="card-body">
<form method="POST" action="api/v1/setup/resetSettings">
<div class="card-body mb-4">
<form method="POST" action="/api/v1/setup/resetSettings">
<div class="row">
<div class="col-2"></div>
<input type="submit" class="col-8 btn btn-danger btn-block my-2" value="RESET SETTINGS"></input>