Compare commits

...

13 Commits

16 changed files with 282 additions and 81 deletions

View File

@ -2,12 +2,15 @@
#For the moment, there is a web and ftp server. Maybe more to come. #For the moment, there is a web and ftp server. Maybe more to come.
#Ports are between 1 and 65535. #Ports are between 1 and 65535.
#0 means unlimitted. #0 means unlimitted.
#An empty password means the service is open.
#The blank new line at then end of the file is mendatory. Without it, the last parameter won't be read. #The blank new line at then end of the file is mendatory. Without it, the last parameter won't be read.
WEB_ENABLED : 'true' WEB_ENABLED : 'true'
WEB_PORT : 80 WEB_PORT : 80
WEB_MAX_CLIENT : 0 WEB_MAX_CLIENT : 0
FTP_ENABLED : 'true' FTP_ENABLED : 'true'
FTP_LOGIN : 'ESP8266'
FTP_PASSWORD : '12345678'
FTP_PORT : 21 FTP_PORT : 21
FTP_DATA_PORT : 1024 FTP_DATA_PORT : 1024
FTP_MAX_CLIENT : 0 FTP_MAX_CLIENT : 0

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="stylesheet" href="rsrc/style.css" /> <link rel="stylesheet" href="rsrc/style.css"/>
<link rel="shortcut icon" href="rsrc/favicon.ico" type="image/x-icon"/> <link rel="shortcut icon" href="rsrc/favicon.ico" type="image/x-icon"/>
<script src="rsrc/script.js"></script> <script src="rsrc/script.js"></script>
<title>ESP8266 DASHBOARD</title> <title>ESP8266 DASHBOARD</title>
@ -16,11 +16,21 @@
<div class="item"> <div class="item">
<p><span id="sigStrength"></span> dBm</p> <p><span id="sigStrength"></span> dBm</p>
</div> </div>
<div class="item"> <div class="item" id="strIco">
<p><span id="sigStrengthPercent"></span> %</p> <img id="imgSig1" src="rsrc/sigstr1.png" alt="sigstr1">
<img id="imgSig2" src="rsrc/sigstr2.png" alt="sigstr2" style="display:none;">
<img id="imgSig3" src="rsrc/sigstr3.png" alt="sigstr3" style="display:none;">
<img id="imgSig4" src="rsrc/sigstr4.png" alt="sigstr4" style="display:none;">
<img id="imgSig5" src="rsrc/sigstr5.png" alt="sigstr5" style="display:none;">
<p style="position:absolute;bottom:-15px;left:0;">
<span id="sigStrengthPercent"></span> %
</p>
</div>
<div class="item">
<p><span id="battLevel"></span></p>
</div> </div>
<div class="item" style="margin-left: auto;"> <div class="item" style="margin-left: auto;">
<p><span id="battLevel"></span></p> <p><span id="temperature"></span></p>
</div> </div>
<div class="item" > <div class="item" >
<p>PING : <br /><span id="execTime"></span> ms</p> <p>PING : <br /><span id="execTime"></span> ms</p>
@ -34,23 +44,67 @@
<div class="subSection"> <div class="subSection">
<table> <table>
<tr> <tr>
<td> <th>
<h2 class="categorie">AP Info</h2> <h2 class="categorie">AP Info</h2>
</th>
<th>
<h2 class="categorie">STA Info</h2>
</th>
<th>
<h2 class="categorie">System Info</h2>
</th>
</tr>
<tr>
<td>
<p>SSID : </p> <p>SSID : </p>
<p>Password : </p>
</td> </td>
<td> <td>
<h2 class="categorie">STA Info</h2>
<p>Local IP : <span id="localIP"></span></p> <p>Local IP : <span id="localIP"></span></p>
</td> </td>
<td> <td>
<h2 class="categorie">System Info</h2>
<p>Free ram : <span id="ramInfo"></span> Byte(s)</p> <p>Free ram : <span id="ramInfo"></span> Byte(s)</p>
</td>
</tr>
<tr>
<td>
<p>Password : </p>
</td>
<td>
</td>
<td>
<p>CPU Frequ : <span id="cpuInfo"></span> Mhz</p> <p>CPU Frequ : <span id="cpuInfo"></span> Mhz</p>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<p>Heap frag : <span id="fragInfo"></span> %</p> <p>Heap frag : <span id="fragInfo"></span> %</p>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<p>Max block : <span id="blockInfo"></span> Byte(s)</p> <p>Max block : <span id="blockInfo"></span> Byte(s)</p>
</td> </td>
</tr> </tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<p>Up time : <span id="upTime"></span></p>
</td>
</tr>
</table> </table>
</div> </div>
<div class="subSection inline" style="width:30%;"> <div class="subSection inline" style="width:30%;">
@ -66,9 +120,9 @@
<p> <p>
Set RTC value : <br /> Set RTC value : <br />
<br /> <br />
Time : <input type="number">:<input type="number">:<input type="number"><br /> Time : <input id="hour" type="number" min="0" max="23">h:<input id="minute" type="number" min="0" max="59">m:<input id="second" type="number" min="0" max="59">s<br />
Date : <input type="number">/<input type="number">/<input type="number"><br /><br /> Date : <input id="day" type="number" min="1" max="31">d/<input id="month" type="number" min="1" max="12">m/<input id="year" type="number" min="2000" max="3000">y<br /><br />
<button>DO IT !</button> <button onclick="setRtcClock();">DO IT !</button><p><span id="rtcSetMsg" ></span></p>
</p> </p>
</div> </div>
</div> </div>

View File

@ -35,6 +35,15 @@ function init()
powerInfo(); powerInfo();
powerInfoInter = setInterval(powerInfo,10000); powerInfoInter = setInterval(powerInfo,10000);
//We init the time boxes
var curDate = new Date();
document.getElementById('hour').value = curDate.getHours();
document.getElementById('minute').value = curDate.getMinutes();
document.getElementById('second').value = curDate.getSeconds();
document.getElementById('day').value = curDate.getDate();
document.getElementById('month').value = curDate.getMonth() + 1;
document.getElementById('year').value = curDate.getFullYear();
console.log("Ending setup"); console.log("Ending setup");
} }
@ -187,6 +196,8 @@ function refreshSysInfo()
document.getElementById('cpuInfo').innerHTML = systemInfoObj['CPU freq']; document.getElementById('cpuInfo').innerHTML = systemInfoObj['CPU freq'];
document.getElementById('fragInfo').innerHTML = systemInfoObj['heap frag']; document.getElementById('fragInfo').innerHTML = systemInfoObj['heap frag'];
document.getElementById('blockInfo').innerHTML = systemInfoObj['max block']; document.getElementById('blockInfo').innerHTML = systemInfoObj['max block'];
document.getElementById('upTime').innerHTML = systemInfoObj['up time'].days + ' days ' + systemInfoObj['up time'].hours + ' hours ' + systemInfoObj['up time'].minutes + ' minutes ' + systemInfoObj['up time'].seconds + ' seconds ';
document.getElementById('temperature').innerHTML = systemInfoObj['temperature'].level + systemInfoObj['temperature'].unit;
} }
else else
{ {
@ -195,6 +206,8 @@ function refreshSysInfo()
document.getElementById('cpuInfo').innerHTML = 'NaN'; document.getElementById('cpuInfo').innerHTML = 'NaN';
document.getElementById('fragInfo').innerHTML = 'NaN'; document.getElementById('fragInfo').innerHTML = 'NaN';
document.getElementById('blockInfo').innerHTML = 'NaN'; document.getElementById('blockInfo').innerHTML = 'NaN';
document.getElementById('upTime').innerHTML = 'NaN';
document.getElementById('temperature').innerHTML = 'NaN';
} }
break; break;
default: default:
@ -237,6 +250,8 @@ function refreshSigStrength()
document.getElementById('sigStrength').innerHTML = wifiStaObj.RSSI; document.getElementById('sigStrength').innerHTML = wifiStaObj.RSSI;
document.getElementById('sigStrengthPercent').innerHTML = wifiStaObj.RSSI2; document.getElementById('sigStrengthPercent').innerHTML = wifiStaObj.RSSI2;
document.getElementById('localIP').innerHTML = wifiStaObj['local IP']; document.getElementById('localIP').innerHTML = wifiStaObj['local IP'];
setSigStrenthPicture(wifiStaObj.RSSI2
);
} }
else else
{ {
@ -256,6 +271,50 @@ function refreshSigStrength()
ajaxReq.send(); ajaxReq.send();
} }
function setSigStrenthPicture(value)
{
if(value < 5)
{
document.getElementById('imgSig1').style.display = 'block';
document.getElementById('imgSig2').style.display = 'none';
document.getElementById('imgSig3').style.display = 'none';
document.getElementById('imgSig4').style.display = 'none';
document.getElementById('imgSig5').style.display = 'none';
}
else if(value < 20)
{
document.getElementById('imgSig1').style.display = 'none';
document.getElementById('imgSig2').style.display = 'block';
document.getElementById('imgSig3').style.display = 'none';
document.getElementById('imgSig4').style.display = 'none';
document.getElementById('imgSig5').style.display = 'none';
}
else if(value < 40)
{
document.getElementById('imgSig1').style.display = 'none';
document.getElementById('imgSig2').style.display = 'none';
document.getElementById('imgSig3').style.display = 'block';
document.getElementById('imgSig4').style.display = 'none';
document.getElementById('imgSig5').style.display = 'none';
}
else if(value < 80)
{
document.getElementById('imgSig1').style.display = 'none';
document.getElementById('imgSig2').style.display = 'none';
document.getElementById('imgSig3').style.display = 'none';
document.getElementById('imgSig4').style.display = 'block';
document.getElementById('imgSig5').style.display = 'none';
}
else
{
document.getElementById('imgSig1').style.display = 'none';
document.getElementById('imgSig2').style.display = 'none';
document.getElementById('imgSig3').style.display = 'none';
document.getElementById('imgSig4').style.display = 'none';
document.getElementById('imgSig5').style.display = 'block';
}
}
function sdCardMountUnmnout(action) function sdCardMountUnmnout(action)
{ {
console.log("Sd card action : "+action); console.log("Sd card action : "+action);
@ -639,4 +698,78 @@ function setIoLevel(pin,mode)
ajaxReq.ontimeout = onTimeOut; ajaxReq.ontimeout = onTimeOut;
ajaxReq.open('GET',"/sab/io/set/level?"+pinOnly+'='+ (mode == 'HIGH' ? '1' : '0')); ajaxReq.open('GET',"/sab/io/set/level?"+pinOnly+'='+ (mode == 'HIGH' ? '1' : '0'));
ajaxReq.send(); ajaxReq.send();
}
function setRtcClock()
{
//First we chech the typeof the data
var hour = parseInt(document.getElementById('hour').value);
var minute = parseInt(document.getElementById('minute').value);
var second = parseInt(document.getElementById('second').value);
var day = parseInt(document.getElementById('day').value);
var month = parseInt(document.getElementById('month').value);
var year = parseInt(document.getElementById('year').value);
if( isFinite(hour) &&
isFinite(minute) &&
isFinite(second) &&
isFinite(day) &&
isFinite(month) &&
isFinite(year) )
{
//First, we create the request string : datetime=day_month_year_hours_minutes_seconds
var data = day+"_"+month+"_"+year+"_"+hour+"_"+minute+"_"+second;
var ajaxReq = new XMLHttpRequest();
ajaxReq.timeout = 5000;
ajaxReq.onreadystatechange = function()
{
switch(this.readyState)
{
case 0:
break;
case 1:
console.log("Connection established");
break;
case 2:
console.log("Request received");
break;
case 3:
console.log("Processing request");
break;
case 4:
console.log("Response is ready");
if(this.status != 0){onConnected(); document.getElementById('execTime').innerHTML = new Date().getTime() - execTimeStart;}
if(this.status == 200)
{
console.log("Response : " + this.responseText);
var rtcRespObj = JSON.parse(this.responseText);
console.log(rtcRespObj);
document.getElementById('rtcSetMsg').innerHTML = rtcRespObj.status;
document.getElementById('rtcSetMsg').style.color = 'green';
}
else
{
console.log("Error, status is : " + this.status);
document.getElementById('rtcSetMsg').innerHTML = 'Failed to execute';
document.getElementById('rtcSetMsg').style.color = 'red';
}
break;
default:
console.log("Unknown state");
}
}
ajaxReq.ontimeout = onTimeOut;
ajaxReq.open('GET',"/sab/rtc/set/datetime?datetime="+data);
console.log("datetime="+data);
execTimeStart = new Date().getTime();
ajaxReq.send();
}
else
{
console.error("Non numeric values encountered to set the rtc clock");
document.getElementById('rtcSetMsg').innerHTML = 'Failed to execute';
document.getElementById('rtcSetMsg').style.color = 'red';
}
} }

View File

@ -17,7 +17,7 @@ header > h1
margin:0; margin:0;
padding:0; padding:0;
} }
#conIcon > img #conIcon > img, #strIco > img
{ {
width:70px; width:70px;
padding:0; padding:0;
@ -54,6 +54,16 @@ footer > p
table table
{ {
width:100%; width:100%;
/*border-collapse:collapse;*/
}
table p
{
margin:2px;
}
table th, table td
{
/*border:1px solid black;*/
padding:0;
} }
nav nav
{ {
@ -62,7 +72,7 @@ nav
} }
input[type='number'] input[type='number']
{ {
width:40px; width:50px;
} }
.menuContainer .menuContainer
{ {
@ -78,6 +88,7 @@ input[type='number']
margin:0 10px 0 0; margin:0 10px 0 0;
background-color:white; background-color:white;
min-width:60px; min-width:60px;
position: relative;
} }
.item-start .item-start

View File

@ -4,7 +4,6 @@ CFGParameterValue::CFGParameterValue():DictionaryInterface(),_parameter(NULL), _
{ {
} }
CFGParameterValue::CFGParameterValue(const char *parameter, const char *value, boolean quotedParameter, boolean quotedValue):_quotedParameter(quotedParameter), _quotedValue(quotedValue) CFGParameterValue::CFGParameterValue(const char *parameter, const char *value, boolean quotedParameter, boolean quotedValue):_quotedParameter(quotedParameter), _quotedValue(quotedValue)
{ {
_parameter = (char *) malloc((strlen(parameter) * sizeof(char)) + 1); //+1 for the string terminating character _parameter = (char *) malloc((strlen(parameter) * sizeof(char)) + 1); //+1 for the string terminating character
@ -13,7 +12,6 @@ CFGParameterValue::CFGParameterValue(const char *parameter, const char *value, b
strcpy(_parameter, parameter); strcpy(_parameter, parameter);
strcpy(_value, value); strcpy(_value, value);
} }
CFGParameterValue::CFGParameterValue(const char *parameter, const char *value):CFGParameterValue() CFGParameterValue::CFGParameterValue(const char *parameter, const char *value):CFGParameterValue()
{ {
_parameter = (char *) malloc((strlen(parameter) * sizeof(char)) + 1); //+1 for the string terminating character _parameter = (char *) malloc((strlen(parameter) * sizeof(char)) + 1); //+1 for the string terminating character

View File

@ -3,28 +3,18 @@
ConnectivityManager::ConnectivityManager() : _error(0), _sdCardManager(NULL) ConnectivityManager::ConnectivityManager() : _error(0), _sdCardManager(NULL)
{ {
persistent(false); persistent(false);
WiFi.disconnect();
WiFi.softAPdisconnect(); if(!WiFi.disconnect(true))_error |= STA_ENABLED_DISABLE_ERR;
if(!WiFi.softAPdisconnect(true))_error |= AP_ENABLED_DISABLE_ERR;
if(!enableSTAAndAP(false))_error &= AP_AND_STA_ENABLED_ERR; if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error |= AP_SETUP_ERR;
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error &= AP_SETUP_ERR;
} }
ConnectivityManager::ConnectivityManager(SDCardManager &sdCardManager) : _error(0), _sdCardManager(&sdCardManager) ConnectivityManager::ConnectivityManager(SDCardManager &sdCardManager) : _error(0), _sdCardManager(&sdCardManager)
{ {
persistent(false); persistent(false);
WiFi.disconnect();
WiFi.softAPdisconnect();
if(!enableSTAAndAP(false))_error &= AP_AND_STA_ENABLED_ERR; startAP();
else connectToSTA();
{
//SOFT AP PART
startAP();
//STATION PART
connectToSTA();
}
} }
boolean ConnectivityManager::connectToSTA() boolean ConnectivityManager::connectToSTA()
@ -32,8 +22,9 @@ boolean ConnectivityManager::connectToSTA()
//STATION PART //STATION PART
CFGFileParser cfgFileParserSTA(*_sdCardManager, STA_CFG_FILE); CFGFileParser cfgFileParserSTA(*_sdCardManager, STA_CFG_FILE);
CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParserSTA.parseFile(); CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParserSTA.parseFile();
boolean toBeReturned(true); boolean toBeReturned(true);
if(!WiFi.disconnect(true))_error |= STA_ENABLED_DISABLE_ERR;
if(cfgDictionary != NULL) if(cfgDictionary != NULL)
{ {
@ -43,12 +34,10 @@ boolean ConnectivityManager::connectToSTA()
{ {
if(!begin((*cfgDictionary)("SSID")->stringValue(), (*cfgDictionary)("PASSWORD")->stringValue())) if(!begin((*cfgDictionary)("SSID")->stringValue(), (*cfgDictionary)("PASSWORD")->stringValue()))
{ {
_error &= AP_SETUP_ERR; _error |= STA_SETUP_ERR;
toBeReturned = false; toBeReturned = false;
} }
} }
else
enableSTA(false);
} }
else else
toBeReturned = false; toBeReturned = false;
@ -65,14 +54,15 @@ boolean ConnectivityManager::startAP()
{ {
CFGFileParser cfgFileParser(*_sdCardManager, AP_CFG_FILE); CFGFileParser cfgFileParser(*_sdCardManager, AP_CFG_FILE);
CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParser.parseFile(); CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParser.parseFile();
boolean toBeReturned(true); boolean toBeReturned(true);
if(!WiFi.softAPdisconnect(true))_error |= AP_ENABLED_DISABLE_ERR;
if(cfgDictionary == NULL) if(cfgDictionary == NULL)
{ {
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error &= AP_SETUP_ERR; if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error |= AP_SETUP_ERR;
toBeReturned = false; return false;
} }
else if((*cfgDictionary)("SSID") != NULL && (*cfgDictionary)("PASSWORD") != NULL && (*cfgDictionary)("CHANNEL") != NULL && (*cfgDictionary)("SSID_HIDDEN") != NULL && (*cfgDictionary)("AP_MAX_CONNECTION") != NULL && (*cfgDictionary)("ENABLED") != NULL) else if((*cfgDictionary)("SSID") != NULL && (*cfgDictionary)("PASSWORD") != NULL && (*cfgDictionary)("CHANNEL") != NULL && (*cfgDictionary)("SSID_HIDDEN") != NULL && (*cfgDictionary)("AP_MAX_CONNECTION") != NULL && (*cfgDictionary)("ENABLED") != NULL)
{ {
@ -80,21 +70,19 @@ boolean ConnectivityManager::startAP()
{ {
if(!softAP((*cfgDictionary)("SSID")->stringValue(), strcmp((*cfgDictionary)("PASSWORD")->stringValue(),"") == 0 ? NULL:(*cfgDictionary)("PASSWORD")->stringValue(), (*cfgDictionary)("CHANNEL")->intValue(), (*cfgDictionary)("SSID_HIDDEN")->booleanValue(), (*cfgDictionary)("AP_MAX_CONNECTION")->intValue())) if(!softAP((*cfgDictionary)("SSID")->stringValue(), strcmp((*cfgDictionary)("PASSWORD")->stringValue(),"") == 0 ? NULL:(*cfgDictionary)("PASSWORD")->stringValue(), (*cfgDictionary)("CHANNEL")->intValue(), (*cfgDictionary)("SSID_HIDDEN")->booleanValue(), (*cfgDictionary)("AP_MAX_CONNECTION")->intValue()))
{ {
_error &= AP_SETUP_ERR; _error |= AP_SETUP_ERR;
toBeReturned = false; toBeReturned = false;
} }
} }
else
enableAP(false);
delete cfgDictionary;
} }
else else
{ {
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error &= AP_SETUP_ERR; if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error |= AP_SETUP_ERR;
delete cfgDictionary;
toBeReturned = false; toBeReturned = false;
} }
delete cfgDictionary;
return toBeReturned; return toBeReturned;
} }

View File

@ -11,6 +11,11 @@
#define MAX_RSSI -50 #define MAX_RSSI -50
#define COEF_RSSI 3.225806452 #define COEF_RSSI 3.225806452
#define STA_ENABLED_DISABLE_ERR B00001000
#define AP_ENABLED_DISABLE_ERR B00000001
#define AP_SETUP_ERR B00000010
#define STA_SETUP_ERR B00000100
class ConnectivityManager : public ESP8266WiFiClass class ConnectivityManager : public ESP8266WiFiClass
{ {
friend class SAB; friend class SAB;
@ -18,14 +23,15 @@ class ConnectivityManager : public ESP8266WiFiClass
boolean enableSTAAndAP(boolean enable); boolean enableSTAAndAP(boolean enable);
boolean isSTAEnabled(); boolean isSTAEnabled();
boolean isAPEnabled(); boolean isAPEnabled();
boolean connectToSTA();
boolean startAP();
unsigned char RSSIPercent(); unsigned char RSSIPercent();
unsigned char getError() const; unsigned char getError() const;
protected: protected:
ConnectivityManager(); ConnectivityManager();
ConnectivityManager(SDCardManager &sdCardManager); ConnectivityManager(SDCardManager &sdCardManager);
boolean connectToSTA();
boolean startAP();
private: private:
unsigned char _error; unsigned char _error;
SDCardManager *_sdCardManager; SDCardManager *_sdCardManager;

View File

@ -16,7 +16,7 @@ _error(0)
{ {
//We set the gpio up //We set the gpio up
initGPIO(); initGPIO();
Serial.begin(500000, SERIAL_8N1, SERIAL_TX_ONLY); Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
Serial.println(); Serial.println();
delay(200); delay(200);
@ -28,6 +28,8 @@ _error(0)
_screenManager.init(); _screenManager.init();
_connectivityManager = new ConnectivityManager(_sdCardManager); _connectivityManager = new ConnectivityManager(_sdCardManager);
if(!_pcf.begin()){_error |= IO_INIT_ERR;} if(!_pcf.begin()){_error |= IO_INIT_ERR;}
_powerUpTime = _rtcManager.getDateTime();
} }
SAB::SAB(const BoardConfig boardConfig, const unsigned int webServerPort, const unsigned int ftpServerPort) : _boardConfig(boardConfig), SAB::SAB(const BoardConfig boardConfig, const unsigned int webServerPort, const unsigned int ftpServerPort) : _boardConfig(boardConfig),
@ -47,7 +49,7 @@ _error(0)
{ {
//We set the gpio up //We set the gpio up
initGPIO(); initGPIO();
Serial.begin(500000, SERIAL_8N1, SERIAL_TX_ONLY); Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
Serial.println(); Serial.println();
delay(200); delay(200);
//We initialize the pins for the I2C communication //We initialize the pins for the I2C communication
@ -58,6 +60,8 @@ _error(0)
_screenManager.init(); _screenManager.init();
_connectivityManager = new ConnectivityManager(_sdCardManager); _connectivityManager = new ConnectivityManager(_sdCardManager);
if(!_pcf.begin()){_error |= IO_INIT_ERR;} if(!_pcf.begin()){_error |= IO_INIT_ERR;}
_powerUpTime = _rtcManager.getDateTime();
} }
void SAB::initGPIO() void SAB::initGPIO()
@ -115,6 +119,11 @@ PowerManager& SAB::getPowerManager()
return _powerManager; return _powerManager;
} }
TimeSpan SAB::getUpTime()
{
return _rtcManager.getDateTime() - _powerUpTime;
}
BoardConfig SAB::getBoardConfig() const BoardConfig SAB::getBoardConfig() const
{ {
return _boardConfig; return _boardConfig;

View File

@ -39,7 +39,9 @@ class SAB
IOManager& getIoManager(); IOManager& getIoManager();
TaskSchedulerManager& getTaskSchedulerManager(); TaskSchedulerManager& getTaskSchedulerManager();
PowerManager& getPowerManager(); PowerManager& getPowerManager();
TimeSpan getUpTime();
BoardConfig getBoardConfig() const; BoardConfig getBoardConfig() const;
const char *getSoftVersion() const; const char *getSoftVersion() const;
unsigned char getError() const; unsigned char getError() const;
private: private:
@ -60,6 +62,7 @@ class SAB
TaskSchedulerManager _taskSchedulerManager; TaskSchedulerManager _taskSchedulerManager;
PowerManager _powerManager; PowerManager _powerManager;
DateTime _powerUpTime;
uint8_t _error; uint8_t _error;
}; };

View File

@ -77,6 +77,6 @@ void TCPClient::freeDataBuffer(uint16_t size)
#endif #endif
} }
strcpy((char *)_data, (char *)_data + secureSize); memmove(_data, _data + secureSize, _dataSize - secureSize + 1 /*We do not forget to copy the \0 at then end*/);
_dataSize -= secureSize; _dataSize -= secureSize;
} }

View File

@ -2,7 +2,7 @@
//#define DEBUG_WEBCL //#define DEBUG_WEBCL
WEBClient::WEBClient(WiFiClient client, uint8_t id, uint16_t maxResourceBuffer, uint16_t maxBodyBuffer, uint16_t dataBufferSize) : TCPClient(client, id, dataBufferSize), _WEBClientState(WEBServer<WEBClient>::WEBClientState::ACCEPTED), _httpParserState(WEBServer<WEBClient>::HttpParserStatus::HTTP_VERB), _fileSentBytes(0) WEBClient::WEBClient(WiFiClient client, uint8_t id, uint16_t maxResourceBuffer, uint16_t maxBodyBuffer, uint16_t dataBufferSize) : TCPClient(client, id, dataBufferSize), _WEBClientState(WEBServer<WEBClient>::WEBClientState::ACCEPTED), _httpParserState(WEBServer<WEBClient>::HttpParserStatus::HTTP_VERB), _fileSentBytes(0), _range(0)
{ {
#ifdef DEBUG_WEBCL #ifdef DEBUG_WEBCL
Serial.println("WEBClient : Standard constructor called"); Serial.println("WEBClient : Standard constructor called");

View File

@ -17,6 +17,7 @@ class WEBClient : public TCPClient
WEBServer<WEBClient>::HttpRequestData _httpRequestData; WEBServer<WEBClient>::HttpRequestData _httpRequestData;
WEBServer<WEBClient>::HttpParserStatus _httpParserState; WEBServer<WEBClient>::HttpParserStatus _httpParserState;
uint64_t _fileSentBytes; uint64_t _fileSentBytes;
uint64_t _range; //Used to store the value of the range param for file downloading
void clearHttpRequestData(); void clearHttpRequestData();
}; };

View File

@ -19,10 +19,6 @@ typedef enum { GPIO_0 = 0,
ADC = A0, ADC = A0,
DEFAULT_PIN = -1 } Pin; DEFAULT_PIN = -1 } Pin;
#define AP_AND_STA_ENABLED_ERR B00000001
#define AP_SETUP_ERR B00000010
#define STA_SETUP_ERR B00000100
#define NO_ERROR 0 #define NO_ERROR 0
#define NO_CURRENT_VIEW NULL #define NO_CURRENT_VIEW NULL

View File

@ -25,7 +25,7 @@ boolean task_blink(void *pData)
boolean task_batt_sensing(void *pData) boolean task_batt_sensing(void *pData)
{ {
View1Packet *p = (View1Packet *) pData; View1Packet *p = (View1Packet *) pData;
//Serial.println(F("BATT SENSING...")); Serial.printf_P(F("BATT SENSING...\nRunning since : %d s\n"), millis()/1000);
p->powerInfo = p->sab->getPowerManager().getPowerInfo(); p->powerInfo = p->sab->getPowerManager().getPowerInfo();
return true; return true;

View File

@ -8,25 +8,25 @@ boolean homeInfo(Adafruit_SSD1306 &display, void *pData)
switch(p->powerInfo.powerType) switch(p->powerInfo.powerType)
{ {
case PowerManager::USB: case PowerManager::USB:
sprintf(power_str,"USB"); sprintf_P(power_str,PSTR("USB"));
break; break;
default: default:
sprintf(power_str,"BATT(%u%%)", p->powerInfo.level); sprintf_P(power_str,PSTR("BATT(%u%%)"), p->powerInfo.level);
} }
if(p->sdCardSize != 0.0) if(p->sdCardSize != 0.0)
sprintf(sdCard,"%.2fGB",p->sdCardSize); sprintf_P(sdCard,PSTR("%.2fGB"),p->sdCardSize);
else else
sprintf(sdCard,"NO CARD"); sprintf_P(sdCard,PSTR("NO CARD"));
sprintf_P(time_str, F("Time : %s:%s:%s\nDate : %s/%s/%d\nFree RAM : %d\nSdCard : %s\nPower : %s\nViews : %u\n") sprintf_P(time_str, PSTR("Time : %s:%s:%s\nDate : %s/%s/%d\nFree RAM : %d\nSdCard : %s\nPower : %s\nViews : %u\n")
, dateTimeFormater(zero_prepended[0],p->dateTime.hour(),'0') , dateTimeFormater(zero_prepended[0],p->dateTime.hour(),'0')
, dateTimeFormater(zero_prepended[1],p->dateTime.minute(),'0') , dateTimeFormater(zero_prepended[1],p->dateTime.minute(),'0')
, dateTimeFormater(zero_prepended[2],p->dateTime.second(),'0') , dateTimeFormater(zero_prepended[2],p->dateTime.second(),'0')
, dateTimeFormater(zero_prepended[3],p->dateTime.day(),'0') , dateTimeFormater(zero_prepended[3],p->dateTime.day(),'0')
, dateTimeFormater(zero_prepended[4],p->dateTime.month(),'0') , dateTimeFormater(zero_prepended[4],p->dateTime.month(),'0')
, p->dateTime.year(),ESP.getFreeHeap(),sdCard,power_str, p->nbViews); , p->dateTime.year(),ESP.getFreeHeap(),sdCard,power_str, p->nbViews);
sprintf_P(pageTitle, F("GLOBAL INFO v %s"),p->version); sprintf_P(pageTitle, PSTR("GLOBAL INFO v %s"),p->version);
display.println(time_str); display.println(time_str);
display.setCursor(0,56); display.setCursor(0,56);
display.println(pageTitle); display.println(pageTitle);
@ -38,13 +38,13 @@ boolean rtcInfo(Adafruit_SSD1306 &display, void *pData)
{ {
char buffer[300] = ""; char buffer[300] = "";
SAB *p = (SAB *) pData; SAB *p = (SAB *) pData;
TimeSpan ts(p->getUpTime());
sprintf_P(buffer, F("Rtc temp : %.2f C"), p->getRtcManager().getTemperature()); sprintf_P(buffer, PSTR("Rtc temp : %.2f C\nUp Time : \n %d d %d h %d m %d s"), p->getRtcManager().getTemperature(), ts.days(), ts.hours(), ts.minutes(), ts.seconds());
display.println(buffer); display.println(buffer);
display.setCursor(0,56); display.setCursor(0,56);
display.println(F("RTC INFO")); display.print(FPSTR("RTC INFO"));
return true; return true;
} }
@ -55,14 +55,14 @@ boolean apInfo(Adafruit_SSD1306 &display, void *pData)
ViewAPPacket *p = (ViewAPPacket *) pData; ViewAPPacket *p = (ViewAPPacket *) pData;
if(p->enabled) if(p->enabled)
sprintf_P(conn_str,F("Ip addr : %u.%u.%u.%u\nMac addr : \n%s\nConns : %u\nSSID : %s\n") ,p->ipAddr[0], p->ipAddr[1], p->ipAddr[2], p->ipAddr[3], p->macAddr.c_str(), p->nbOfCon, p->ssid.c_str()); sprintf_P(conn_str,PSTR("Ip addr : %u.%u.%u.%u\nMac addr : \n%s\nConns : %u\nSSID : %s\n") ,p->ipAddr[0], p->ipAddr[1], p->ipAddr[2], p->ipAddr[3], p->macAddr.c_str(), p->nbOfCon, p->ssid.c_str());
else else
sprintf_P(conn_str,F("AP connectivity\nis not enabled\nCheck the cfg file\n")); sprintf_P(conn_str,PSTR("AP connectivity\nis not enabled\nCheck the cfg file\n"));
display.println(conn_str); display.println(conn_str);
display.setCursor(0,56); display.setCursor(0,56);
display.println(F("AP INFO")); display.print(FPSTR("AP INFO"));
return true; return true;
} }
@ -74,14 +74,14 @@ boolean staInfo(Adafruit_SSD1306 &display, void *pData)
ViewSTAPacket *p = (ViewSTAPacket *) pData; ViewSTAPacket *p = (ViewSTAPacket *) pData;
if(p->enabled) if(p->enabled)
sprintf_P(conn_str, F("Ip addr : %u.%u.%u.%u\nMac addr : \n%s\nSignal : %d dBm\n"), p->ipAddr[0], p->ipAddr[1], p->ipAddr[2], p->ipAddr[3], p->macAddr.c_str(), p->sigStrength); sprintf_P(conn_str, PSTR("Ip addr : %u.%u.%u.%u\nMac addr : \n%s\nSignal : %d dBm\n"), p->ipAddr[0], p->ipAddr[1], p->ipAddr[2], p->ipAddr[3], p->macAddr.c_str(), p->sigStrength);
else else
sprintf_P(conn_str,F("STA connectivity\nis not enabled\nCheck the cfg file\n")); sprintf_P(conn_str,PSTR("STA connectivity\nis not enabled\nCheck the cfg file\n"));
display.println(conn_str); display.println(conn_str);
display.setCursor(0,56); display.setCursor(0,56);
display.println(F("STA INFO")); display.println(FPSTR("STA INFO"));
return true; return true;
} }
@ -93,11 +93,11 @@ boolean memInfo(Adafruit_SSD1306 &display, void *pData)
uint16_t biggestContigMemBlock; uint16_t biggestContigMemBlock;
uint8_t frag; uint8_t frag;
ESP.getHeapStats(&freeMem, &biggestContigMemBlock, &frag); ESP.getHeapStats(&freeMem, &biggestContigMemBlock, &frag);
sprintf_P(dispBuffer, F("Free RAM : %u\nHeap frag : %u\nMax block : %u\nFree Flash : %u\nProg size : %u\nCPU Freq : %u MHz\n"), freeMem, frag, biggestContigMemBlock, ESP.getFreeSketchSpace(), ESP.getSketchSize(), ESP.getCpuFreqMHz()); sprintf_P(dispBuffer, PSTR("Free RAM : %u\nHeap frag : %u\nMax block : %u\nFree Flash : %u\nProg size : %u\nCPU Freq : %u MHz\n"), freeMem, frag, biggestContigMemBlock, ESP.getFreeSketchSpace(), ESP.getSketchSize(), ESP.getCpuFreqMHz());
display.println(dispBuffer); display.println(dispBuffer);
display.setCursor(0,56); display.setCursor(0,56);
display.println(F("SYS INFO")); display.println(FPSTR("SYS INFO"));
return true; return true;
} }
@ -112,7 +112,7 @@ boolean ioInfo(Adafruit_SSD1306 &display, void *pData)
char buff[30] = ""; char buff[30] = "";
display.setCursor(0,2); display.setCursor(0,2);
display.print(F("0 1 2 3 4 5 6 7")); display.print(FPSTR("0 1 2 3 4 5 6 7"));
sprintf(buff,"%c %c %c %c %c %c %c %c", sprintf(buff,"%c %c %c %c %c %c %c %c",
p->ioMode[0] ? 'O' : 'I', p->ioMode[0] ? 'O' : 'I',
p->ioMode[1] ? 'O' : 'I', p->ioMode[1] ? 'O' : 'I',
@ -135,7 +135,7 @@ boolean ioInfo(Adafruit_SSD1306 &display, void *pData)
p->ioState[7] ? display.fillRect(119,31,9,17,WHITE) : display.drawRect(119,31,9,17,WHITE);//7 p->ioState[7] ? display.fillRect(119,31,9,17,WHITE) : display.drawRect(119,31,9,17,WHITE);//7
display.setCursor(0,56); display.setCursor(0,56);
display.println(F("I/O INFO")); display.println(FPSTR("I/O INFO"));
return true; return true;
} }
@ -145,13 +145,13 @@ boolean sysErrorInfo(Adafruit_SSD1306 &display, void *pData)
char error_str[300]; char error_str[300];
display.print("Rst reason : ");display.println(ESP.getResetReason()); display.print(FPSTR("Rst reason : ")); display.println(ESP.getResetReason());
display.print("RTC : ");display.println((p->getError() & SAB::RTC_BEGIN_ERR) != 0 ? "ERROR":"OK"); display.print(FPSTR("RTC : "));display.println((p->getError() & SAB::RTC_BEGIN_ERR) != 0 ? "ERROR":"OK");
display.print("DISPLAY : ");display.println((p->getError() & SAB::DISP_BEGIN_ERR) != 0 ? "ERROR":"OK"); display.print(FPSTR("DISPLAY : "));display.println((p->getError() & SAB::DISP_BEGIN_ERR) != 0 ? "ERROR":"OK");
display.print("SDCard : ");display.println((p->getError() & SAB::SDCARD_INIT_ERR) != 0 ? "ERROR":"OK"); display.print(FPSTR("SDCard : "));display.println((p->getError() & SAB::SDCARD_INIT_ERR) != 0 ? "ERROR":"OK");
display.print("IO : ");display.println((p->getError() & SAB::IO_INIT_ERR) != 0 ? "ERROR":"OK"); display.print(FPSTR("IO : "));display.println((p->getError() & SAB::IO_INIT_ERR) != 0 ? "ERROR":"OK");
display.setCursor(0,56); display.setCursor(0,56);
display.print(F("SYS ERROR CODE : "));display.println(p->getError()); display.print(FPSTR("SYS ERROR CODE : "));display.println(p->getError());
return true; return true;
} }

View File

@ -1,6 +1,5 @@
#ifndef WEBAPI_H #ifndef WEBAPI_H
#define WEBAPI_H #define WEBAPI_H
//#include "WebServerManager.h"
#include "SAB.h" #include "SAB.h"
#include "views.h" #include "views.h"