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.
#Ports are between 1 and 65535.
#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.
WEB_ENABLED : 'true'
WEB_PORT : 80
WEB_MAX_CLIENT : 0
FTP_ENABLED : 'true'
FTP_LOGIN : 'ESP8266'
FTP_PASSWORD : '12345678'
FTP_PORT : 21
FTP_DATA_PORT : 1024
FTP_MAX_CLIENT : 0

View File

@ -2,7 +2,7 @@
<html>
<head>
<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"/>
<script src="rsrc/script.js"></script>
<title>ESP8266 DASHBOARD</title>
@ -16,11 +16,21 @@
<div class="item">
<p><span id="sigStrength"></span> dBm</p>
</div>
<div class="item">
<p><span id="sigStrengthPercent"></span> %</p>
<div class="item" id="strIco">
<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 class="item" style="margin-left: auto;">
<p><span id="battLevel"></span></p>
<p><span id="temperature"></span></p>
</div>
<div class="item" >
<p>PING : <br /><span id="execTime"></span> ms</p>
@ -34,23 +44,67 @@
<div class="subSection">
<table>
<tr>
<td>
<th>
<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>Password : </p>
</td>
<td>
<h2 class="categorie">STA Info</h2>
<p>Local IP : <span id="localIP"></span></p>
</td>
<td>
<h2 class="categorie">System Info</h2>
<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>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<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>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<p>Up time : <span id="upTime"></span></p>
</td>
</tr>
</table>
</div>
<div class="subSection inline" style="width:30%;">
@ -66,9 +120,9 @@
<p>
Set RTC value : <br />
<br />
Time : <input type="number">:<input type="number">:<input type="number"><br />
Date : <input type="number">/<input type="number">/<input type="number"><br /><br />
<button>DO IT !</button>
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 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 onclick="setRtcClock();">DO IT !</button><p><span id="rtcSetMsg" ></span></p>
</p>
</div>
</div>

View File

@ -35,6 +35,15 @@ function init()
powerInfo();
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");
}
@ -187,6 +196,8 @@ function refreshSysInfo()
document.getElementById('cpuInfo').innerHTML = systemInfoObj['CPU freq'];
document.getElementById('fragInfo').innerHTML = systemInfoObj['heap frag'];
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
{
@ -195,6 +206,8 @@ function refreshSysInfo()
document.getElementById('cpuInfo').innerHTML = 'NaN';
document.getElementById('fragInfo').innerHTML = 'NaN';
document.getElementById('blockInfo').innerHTML = 'NaN';
document.getElementById('upTime').innerHTML = 'NaN';
document.getElementById('temperature').innerHTML = 'NaN';
}
break;
default:
@ -237,6 +250,8 @@ function refreshSigStrength()
document.getElementById('sigStrength').innerHTML = wifiStaObj.RSSI;
document.getElementById('sigStrengthPercent').innerHTML = wifiStaObj.RSSI2;
document.getElementById('localIP').innerHTML = wifiStaObj['local IP'];
setSigStrenthPicture(wifiStaObj.RSSI2
);
}
else
{
@ -256,6 +271,50 @@ function refreshSigStrength()
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)
{
console.log("Sd card action : "+action);
@ -639,4 +698,78 @@ function setIoLevel(pin,mode)
ajaxReq.ontimeout = onTimeOut;
ajaxReq.open('GET',"/sab/io/set/level?"+pinOnly+'='+ (mode == 'HIGH' ? '1' : '0'));
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;
padding:0;
}
#conIcon > img
#conIcon > img, #strIco > img
{
width:70px;
padding:0;
@ -54,6 +54,16 @@ footer > p
table
{
width:100%;
/*border-collapse:collapse;*/
}
table p
{
margin:2px;
}
table th, table td
{
/*border:1px solid black;*/
padding:0;
}
nav
{
@ -62,7 +72,7 @@ nav
}
input[type='number']
{
width:40px;
width:50px;
}
.menuContainer
{
@ -78,6 +88,7 @@ input[type='number']
margin:0 10px 0 0;
background-color:white;
min-width:60px;
position: relative;
}
.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)
{
_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(_value, value);
}
CFGParameterValue::CFGParameterValue(const char *parameter, const char *value):CFGParameterValue()
{
_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)
{
persistent(false);
WiFi.disconnect();
WiFi.softAPdisconnect();
if(!enableSTAAndAP(false))_error &= AP_AND_STA_ENABLED_ERR;
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error &= AP_SETUP_ERR;
if(!WiFi.disconnect(true))_error |= STA_ENABLED_DISABLE_ERR;
if(!WiFi.softAPdisconnect(true))_error |= AP_ENABLED_DISABLE_ERR;
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error |= AP_SETUP_ERR;
}
ConnectivityManager::ConnectivityManager(SDCardManager &sdCardManager) : _error(0), _sdCardManager(&sdCardManager)
{
persistent(false);
WiFi.disconnect();
WiFi.softAPdisconnect();
if(!enableSTAAndAP(false))_error &= AP_AND_STA_ENABLED_ERR;
else
{
//SOFT AP PART
startAP();
//STATION PART
connectToSTA();
}
startAP();
connectToSTA();
}
boolean ConnectivityManager::connectToSTA()
@ -32,8 +22,9 @@ boolean ConnectivityManager::connectToSTA()
//STATION PART
CFGFileParser cfgFileParserSTA(*_sdCardManager, STA_CFG_FILE);
CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParserSTA.parseFile();
boolean toBeReturned(true);
if(!WiFi.disconnect(true))_error |= STA_ENABLED_DISABLE_ERR;
if(cfgDictionary != NULL)
{
@ -43,12 +34,10 @@ boolean ConnectivityManager::connectToSTA()
{
if(!begin((*cfgDictionary)("SSID")->stringValue(), (*cfgDictionary)("PASSWORD")->stringValue()))
{
_error &= AP_SETUP_ERR;
_error |= STA_SETUP_ERR;
toBeReturned = false;
}
}
else
enableSTA(false);
}
else
toBeReturned = false;
@ -65,14 +54,15 @@ boolean ConnectivityManager::startAP()
{
CFGFileParser cfgFileParser(*_sdCardManager, AP_CFG_FILE);
CFGDictionary<CFGParameterValue> *cfgDictionary = (CFGDictionary<CFGParameterValue> *) cfgFileParser.parseFile();
boolean toBeReturned(true);
if(!WiFi.softAPdisconnect(true))_error |= AP_ENABLED_DISABLE_ERR;
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)
{
@ -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()))
{
_error &= AP_SETUP_ERR;
_error |= AP_SETUP_ERR;
toBeReturned = false;
}
}
else
enableAP(false);
delete cfgDictionary;
}
else
{
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error &= AP_SETUP_ERR;
delete cfgDictionary;
if(!softAP("ESP8266SwissArmyBoard", NULL, 1, false, 8))_error |= AP_SETUP_ERR;
toBeReturned = false;
}
delete cfgDictionary;
return toBeReturned;
}

View File

@ -11,6 +11,11 @@
#define MAX_RSSI -50
#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
{
friend class SAB;
@ -18,14 +23,15 @@ class ConnectivityManager : public ESP8266WiFiClass
boolean enableSTAAndAP(boolean enable);
boolean isSTAEnabled();
boolean isAPEnabled();
boolean connectToSTA();
boolean startAP();
unsigned char RSSIPercent();
unsigned char getError() const;
protected:
ConnectivityManager();
ConnectivityManager(SDCardManager &sdCardManager);
boolean connectToSTA();
boolean startAP();
private:
unsigned char _error;
SDCardManager *_sdCardManager;

View File

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

View File

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

View File

@ -77,6 +77,6 @@ void TCPClient::freeDataBuffer(uint16_t size)
#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;
}

View File

@ -2,7 +2,7 @@
//#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
Serial.println("WEBClient : Standard constructor called");

View File

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

View File

@ -19,10 +19,6 @@ typedef enum { GPIO_0 = 0,
ADC = A0,
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_CURRENT_VIEW NULL

View File

@ -25,7 +25,7 @@ boolean task_blink(void *pData)
boolean task_batt_sensing(void *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();
return true;

View File

@ -8,25 +8,25 @@ boolean homeInfo(Adafruit_SSD1306 &display, void *pData)
switch(p->powerInfo.powerType)
{
case PowerManager::USB:
sprintf(power_str,"USB");
sprintf_P(power_str,PSTR("USB"));
break;
default:
sprintf(power_str,"BATT(%u%%)", p->powerInfo.level);
sprintf_P(power_str,PSTR("BATT(%u%%)"), p->powerInfo.level);
}
if(p->sdCardSize != 0.0)
sprintf(sdCard,"%.2fGB",p->sdCardSize);
sprintf_P(sdCard,PSTR("%.2fGB"),p->sdCardSize);
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[1],p->dateTime.minute(),'0')
, dateTimeFormater(zero_prepended[2],p->dateTime.second(),'0')
, dateTimeFormater(zero_prepended[3],p->dateTime.day(),'0')
, dateTimeFormater(zero_prepended[4],p->dateTime.month(),'0')
, 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.setCursor(0,56);
display.println(pageTitle);
@ -38,13 +38,13 @@ boolean rtcInfo(Adafruit_SSD1306 &display, void *pData)
{
char buffer[300] = "";
SAB *p = (SAB *) pData;
sprintf_P(buffer, F("Rtc temp : %.2f C"), p->getRtcManager().getTemperature());
TimeSpan ts(p->getUpTime());
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.setCursor(0,56);
display.println(F("RTC INFO"));
display.print(FPSTR("RTC INFO"));
return true;
}
@ -55,14 +55,14 @@ boolean apInfo(Adafruit_SSD1306 &display, void *pData)
ViewAPPacket *p = (ViewAPPacket *) pData;
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
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.setCursor(0,56);
display.println(F("AP INFO"));
display.print(FPSTR("AP INFO"));
return true;
}
@ -74,14 +74,14 @@ boolean staInfo(Adafruit_SSD1306 &display, void *pData)
ViewSTAPacket *p = (ViewSTAPacket *) pData;
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
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.setCursor(0,56);
display.println(F("STA INFO"));
display.println(FPSTR("STA INFO"));
return true;
}
@ -93,11 +93,11 @@ boolean memInfo(Adafruit_SSD1306 &display, void *pData)
uint16_t biggestContigMemBlock;
uint8_t 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.setCursor(0,56);
display.println(F("SYS INFO"));
display.println(FPSTR("SYS INFO"));
return true;
}
@ -112,7 +112,7 @@ boolean ioInfo(Adafruit_SSD1306 &display, void *pData)
char buff[30] = "";
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",
p->ioMode[0] ? '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
display.setCursor(0,56);
display.println(F("I/O INFO"));
display.println(FPSTR("I/O INFO"));
return true;
}
@ -145,13 +145,13 @@ boolean sysErrorInfo(Adafruit_SSD1306 &display, void *pData)
char error_str[300];
display.print("Rst reason : ");display.println(ESP.getResetReason());
display.print("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("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("Rst reason : ")); display.println(ESP.getResetReason());
display.print(FPSTR("RTC : "));display.println((p->getError() & SAB::RTC_BEGIN_ERR) != 0 ? "ERROR":"OK");
display.print(FPSTR("DISPLAY : "));display.println((p->getError() & SAB::DISP_BEGIN_ERR) != 0 ? "ERROR":"OK");
display.print(FPSTR("SDCard : "));display.println((p->getError() & SAB::SDCARD_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.print(F("SYS ERROR CODE : "));display.println(p->getError());
display.print(FPSTR("SYS ERROR CODE : "));display.println(p->getError());
return true;
}

View File

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