Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
co2ampel
ampel-firmware
Commits
40c139a8
Commit
40c139a8
authored
Feb 09, 2022
by
Eric Duminil
Browse files
Always initialize filesystem, but csv can be off
parent
b9002c70
Pipeline
#5773
passed with stage
in 2 minutes and 8 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
ampel-firmware/ampel-firmware.ino
View file @
40c139a8
...
...
@@ -111,9 +111,7 @@ void setup() {
sensor
::
initialize
();
#ifdef AMPEL_CSV
csv_writer
::
initialize
(
ampel
.
sensorId
);
#endif
#ifdef AMPEL_WIFI // Structure doesn't make sense anymore
wifi
::
defineCommands
();
...
...
@@ -161,10 +159,10 @@ void loop() {
checkSerialInput
();
if
(
sensor
::
processData
())
{
#ifdef AMPEL_CSV
//TODO: Check if not in AP mode. Lines get written with 1970 otherwise.
csv_writer
::
logIfTimeHasCome
(
sensor
::
timestamp
,
sensor
::
co2
,
sensor
::
temperature
,
sensor
::
humidity
);
#endif
if
(
config
::
csv_active
())
{
//TODO: Check if not in AP mode. Lines get written with 1970 otherwise.
csv_writer
::
logIfTimeHasCome
(
sensor
::
timestamp
,
sensor
::
co2
,
sensor
::
temperature
,
sensor
::
humidity
);
}
#if defined(AMPEL_WIFI)
if
(
config
::
mqtt_active
())
{
...
...
ampel-firmware/web_config.cpp
View file @
40c139a8
...
...
@@ -292,9 +292,12 @@ namespace config {
bool
&
daylight_saving_time
=
web_config
::
dstParam
.
value
();
// CSV
bool
csv_active
()
{
return
web_config
::
csvParams
.
isActive
();
}
uint16_t
&
csv_interval
=
web_config
::
csvTimestepParam
.
value
();
// MQTT
// MQTT
bool
mqtt_active
()
{
return
web_config
::
mqttParams
.
isActive
();
}
...
...
ampel-firmware/web_config.h
View file @
40c139a8
...
...
@@ -28,7 +28,7 @@ namespace config {
extern
bool
&
daylight_saving_time
;
// [true / false]
//CSV
//TODO: Add use_csv
bool
csv_active
();
extern
uint16_t
&
csv_interval
;
// [s]
// MQTT
...
...
ampel-firmware/web_server.cpp
View file @
40c139a8
...
...
@@ -7,9 +7,7 @@
#include
"wifi_util.h"
#include
"co2_sensor.h"
#include
"sensor_console.h"
#ifdef AMPEL_CSV
# include "csv_writer.h"
#endif
#include
"csv_writer.h"
#include
"mqtt.h"
#ifdef AMPEL_LORAWAN
# include "lorawan.h"
...
...
@@ -50,10 +48,8 @@ namespace web_server {
void
handlePageNotFound
();
void
handleWebServerCommand
();
#ifdef AMPEL_CSV
void
handleDeleteCSV
();
void
handleWebServerCSV
();
#endif
void
definePages
()
{
header_template
=
...
...
@@ -79,12 +75,10 @@ namespace web_server {
"<div class='pure-u-1'><ul class='pure-menu pure-menu-horizontal pure-menu-list'>
\n
"
"<li class='pure-menu-item'><a href='/config' class='pure-menu-link'>Config</a></li>
\n
"
"<li class='pure-menu-item'><a href='#table' class='pure-menu-link'>Info</a></li>
\n
"
#ifdef AMPEL_CSV
"<li class='pure-menu-item'><a href='#graph' class='pure-menu-link'>Graph</a></li>
\n
"
"<li class='pure-menu-item'><a href='#log' class='pure-menu-link'>Log</a></li>
\n
"
"<li class='pure-menu-item'><a href='%s' class='pure-menu-link'>Download CSV</a></li>
\n
"
#endif
"<li class='pure-menu-item' id='led'>⬤</li>
\n
"
// LED
"<li class='pure-menu-item' id='led'>⬤</li>
\n
"
// LED
"</ul></div></div>
\n
"
"<script>
\n
"
// Show a colored dot on the webpage, with a similar color than on LED Ring.
...
...
@@ -104,12 +98,10 @@ namespace web_server {
"<tr><td>Humidity</td><td>%.1f%%</td></tr>
\n
"
"<tr><td>Last measurement</td><td>%s</td></tr>
\n
"
"<tr><td>Measurement timestep</td><td>%5d s</td></tr>
\n
"
#ifdef AMPEL_CSV
"<tr><th colspan='2'>CSV</th></tr>
\n
"
"<tr><td>Last write</td><td>%s</td></tr>
\n
"
"<tr><td>Timestep</td><td>%5d s</td></tr>
\n
"
"<tr><td>Available drive space</td><td>%d kB</td></tr>
\n
"
#endif
"<tr><th colspan='2'>MQTT</th></tr>
\n
"
"<tr><td>Connected?</td><td>%s</td></tr>
\n
"
"<tr><td>Last publish</td><td>%s</td></tr>
\n
"
...
...
@@ -137,68 +129,62 @@ namespace web_server {
"</table>
\n
"
"<div id='log' class='pure-u-1 pure-u-md-1-2'></div>
\n
"
"<form action='/command'><input type='text' id='send' name='send'><input type='submit' value='Send'></form>
\n
"
#ifdef AMPEL_CSV
"<form action='/delete_csv' method='POST' onsubmit=
\"
return confirm('Are you really sure you want to delete all data?') && (document.body.style.cursor = 'wait');
\"
>"
"<input type='submit' value='Delete CSV'/>"
"</form>
\n
"
#endif
"</div>
\n
"
);
script_template
=
PSTR
(
"<a href='https://transfer.hft-stuttgart.de/gitlab/co2ampel/ampel-firmware' target='_blank'>Source code</a>
\n
"
"<a href='https://transfer.hft-stuttgart.de/gitlab/co2ampel/ampel-documentation' target='_blank'>Documentation</a>
\n
"
#ifdef AMPEL_CSV
"<script>
\n
"
"document.body.style.cursor = 'default';
\n
"
"fetch('%s',{credentials:'include'})
\n
"
".then(response=>response.text())
\n
"
".then(csvText=>csvToTable(csvText))
\n
"
".then(htmlTable=>addLogTableToPage(htmlTable))
\n
"
".then(_=>Plotly.newPlot('graph',data,layout,{displaylogo:false}))
\n
"
".catch(e=>console.error(e));
\n
"
"xs=[];
\n
"
"data=[{x:xs,y:[],type:'scatter',name:'CO<sub>2</sub>',line:{color:'#2ca02c'}},
\n
"
"{x:xs,y:[],type:'scatter',name:'Temperature',yaxis:'y2',line:{color:'#ff7f0e',dash:'dot'}},
\n
"
"{x:xs,y:[],type:'scatter',name:'Humidity',yaxis:'y3',line:{color:'#1f77b4',dash:'dot'}}];
\n
"
"layout={height:600,title:'%s',legend:{xanchor:'right',x:0.2,y:1.0},
\n
"
"xaxis:{domain:[0.0,0.85]},yaxis:{ticksuffix:'ppm',range:[0,2000],dtick:200},
\n
"
"yaxis2:{overlaying:'y',side:'right',ticksuffix:'°C',position:0.9,anchor:'free',range:[0,30],dtick:3},
\n
"
"yaxis3:{overlaying:'y',side:'right',ticksuffix:'%%',position:0.95,anchor:'free',range:[0,100],dtick:10}
\n
"
"};
\n
"
"function csvToTable(csvText) {
\n
"
"csvText=csvText.trim();
\n
"
"lines=csvText.split('
\\
n');
\n
"
"table=document.createElement('table');
\n
"
"table.className='pure-table-striped';
\n
"
"n=lines.length;
\n
"
"lines.forEach((line,i)=>{
\n
"
"fields=line.split(';');
\n
"
"xs.push(fields[0]);
\n
"
"data[0]['y'].push(fields[1]);
\n
"
"data[1]['y'].push(fields[2]);
\n
"
"data[2]['y'].push(fields[3]);
\n
"
"if(i>4 && i<n-12){if(i==5){fields=['...','...','...','...']}else{return;}}
\n
"
"row=document.createElement('tr');
\n
"
"fields.forEach((field,index)=>{
\n
"
"cell=document.createElement(i<2?'th':'td');
\n
"
"cell.appendChild(document.createTextNode(field));
\n
"
"row.appendChild(cell);});
\n
"
"table.appendChild(row);});
\n
"
"return table;}
\n
"
"function addLogTableToPage(table){document.getElementById('log').appendChild(table);}
\n
"
"</script>
\n
"
#endif
"</body>
\n
"
"</html>"
);
"<script>
\n
"
"document.body.style.cursor = 'default';
\n
"
"fetch('%s',{credentials:'include'})
\n
"
".then(response=>response.text())
\n
"
".then(csvText=>csvToTable(csvText))
\n
"
".then(htmlTable=>addLogTableToPage(htmlTable))
\n
"
".then(_=>Plotly.newPlot('graph',data,layout,{displaylogo:false}))
\n
"
".catch(e=>console.error(e));
\n
"
"xs=[];
\n
"
"data=[{x:xs,y:[],type:'scatter',name:'CO<sub>2</sub>',line:{color:'#2ca02c'}},
\n
"
"{x:xs,y:[],type:'scatter',name:'Temperature',yaxis:'y2',line:{color:'#ff7f0e',dash:'dot'}},
\n
"
"{x:xs,y:[],type:'scatter',name:'Humidity',yaxis:'y3',line:{color:'#1f77b4',dash:'dot'}}];
\n
"
"layout={height:600,title:'%s',legend:{xanchor:'right',x:0.2,y:1.0},
\n
"
"xaxis:{domain:[0.0,0.85]},yaxis:{ticksuffix:'ppm',range:[0,2000],dtick:200},
\n
"
"yaxis2:{overlaying:'y',side:'right',ticksuffix:'°C',position:0.9,anchor:'free',range:[0,30],dtick:3},
\n
"
"yaxis3:{overlaying:'y',side:'right',ticksuffix:'%%',position:0.95,anchor:'free',range:[0,100],dtick:10}
\n
"
"};
\n
"
"function csvToTable(csvText) {
\n
"
"csvText=csvText.trim();
\n
"
"lines=csvText.split('
\\
n');
\n
"
"table=document.createElement('table');
\n
"
"table.className='pure-table-striped';
\n
"
"n=lines.length;
\n
"
"lines.forEach((line,i)=>{
\n
"
"fields=line.split(';');
\n
"
"xs.push(fields[0]);
\n
"
"data[0]['y'].push(fields[1]);
\n
"
"data[1]['y'].push(fields[2]);
\n
"
"data[2]['y'].push(fields[3]);
\n
"
"if(i>4 && i<n-12){if(i==5){fields=['...','...','...','...']}else{return;}}
\n
"
"row=document.createElement('tr');
\n
"
"fields.forEach((field,index)=>{
\n
"
"cell=document.createElement(i<2?'th':'td');
\n
"
"cell.appendChild(document.createTextNode(field));
\n
"
"row.appendChild(cell);});
\n
"
"table.appendChild(row);});
\n
"
"return table;}
\n
"
"function addLogTableToPage(table){document.getElementById('log').appendChild(table);}
\n
"
"</script>
\n
"
"</body>
\n
"
"</html>"
);
// Web-server
web_config
::
http
.
on
(
"/"
,
handleWebServerRoot
);
web_config
::
http
.
on
(
"/command"
,
handleWebServerCommand
);
#ifdef AMPEL_CSV
web_config
::
http
.
on
(
csv_writer
::
filename
,
handleWebServerCSV
);
//NOTE: csv_writer should have been initialized first.
web_config
::
http
.
on
(
csv_writer
::
filename
,
handleWebServerCSV
);
web_config
::
http
.
on
(
"/delete_csv"
,
HTTP_POST
,
handleDeleteCSV
);
#endif
}
// Allow access if http_user or http_password are empty, or if provided credentials match
...
...
@@ -228,11 +214,8 @@ namespace web_server {
char
content
[
2000
];
// Update if needed
// INFO - Header size : 1767 - Body size : 1991 - Script size : 1909
snprintf_P
(
content
,
sizeof
(
content
),
header_template
,
sensor
::
co2
,
ampel
.
sensorId
,
wifi
::
local_ip
#ifdef AMPEL_CSV
,
csv_writer
::
filename
#endif
);
snprintf_P
(
content
,
sizeof
(
content
),
header_template
,
sensor
::
co2
,
ampel
.
sensorId
,
wifi
::
local_ip
,
csv_writer
::
filename
);
// Serial.print(F("INFO - Header size : "));
// Serial.print(strlen(content));
...
...
@@ -241,11 +224,9 @@ namespace web_server {
// Body
snprintf_P
(
content
,
sizeof
(
content
),
body_template
,
ampel
.
sensorId
,
sensor
::
co2
,
sensor
::
temperature
,
sensor
::
humidity
,
sensor
::
timestamp
,
config
::
measurement_timestep
,
#ifdef AMPEL_CSV
csv_writer
::
last_successful_write
,
config
::
csv_interval
,
csv_writer
::
getAvailableSpace
()
/
1024
,
#endif
mqtt
::
connected
?
"Yes"
:
"No"
,
mqtt
::
last_successful_publish
,
config
::
mqtt_sending_interval
,
sensor
::
humidity
,
sensor
::
timestamp
,
config
::
measurement_timestep
,
csv_writer
::
last_successful_write
,
config
::
csv_interval
,
csv_writer
::
getAvailableSpace
()
/
1024
,
mqtt
::
connected
?
"Yes"
:
"No"
,
mqtt
::
last_successful_publish
,
config
::
mqtt_sending_interval
,
#if defined(AMPEL_LORAWAN) && defined(ESP32)
lorawan
::
connected
?
"Yes"
:
"No"
,
config
::
lorawan_frequency_plan
,
lorawan
::
last_transmission
,
config
::
lorawan_sending_interval
,
...
...
@@ -259,18 +240,13 @@ namespace web_server {
web_config
::
http
.
sendContent
(
content
);
// Script
snprintf_P
(
content
,
sizeof
(
content
),
script_template
#ifdef AMPEL_CSV
,
csv_writer
::
filename
,
ampel
.
sensorId
#endif
);
snprintf_P
(
content
,
sizeof
(
content
),
script_template
,
csv_writer
::
filename
,
ampel
.
sensorId
);
// Serial.print(F(" - Script size : "));
// Serial.println(strlen(content));
web_config
::
http
.
sendContent
(
content
);
}
#ifdef AMPEL_CSV
void
handleWebServerCSV
()
{
if
(
!
shouldBeAllowed
())
{
return
web_config
::
http
.
requestAuthentication
(
DIGEST_AUTH
);
...
...
@@ -297,7 +273,6 @@ namespace web_server {
web_config
::
http
.
sendHeader
(
"Location"
,
"/"
);
web_config
::
http
.
send
(
303
);
}
#endif
void
handleWebServerCommand
()
{
if
(
!
shouldBeAllowed
())
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment