gestione sottocartelle, export, cancellazione
This commit is contained in:
+10
-4
@@ -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
|
||||
|
||||
@@ -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
@@ -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')
|
||||
|
||||
@@ -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: </span> <span id="CurrentFolder"></span>
|
||||
</div>
|
||||
<div class="input-group-text my-2">
|
||||
<span>Sessione attuale: </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: </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>
|
||||
|
||||
@@ -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: </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: </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): </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>
|
||||
|
||||
Reference in New Issue
Block a user