Compare commits

...

10 Commits

14 changed files with 107 additions and 34 deletions

View File

@ -92,7 +92,7 @@ IOManager& SAB::getIoManager()
return _ioManager;
}
TaskSchedulerManager &SAB::getTaskSchedulerManager()
TaskSchedulerManager& SAB::getTaskSchedulerManager()
{
return _taskSchedulerManager;
}

View File

@ -33,7 +33,7 @@ class SAB
ConnectivityManager& getConnectivityManager();
WEBServerManager& getWebServerManager();
IOManager& getIoManager();
TaskSchedulerManager &getTaskSchedulerManager();
TaskSchedulerManager& getTaskSchedulerManager();
ScreenConfig getScreenConfig() const;
PinMapping getPinConfig() const;
SDCardConfig getSdCardConfig() const;

View File

@ -49,6 +49,11 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM
return this;
}
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setSeconds(uint32_t seconds)
{
return TaskSchedulerManagerHelper::Schedule::setMillis(seconds*1000);
}
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setDateTime(DateTime &dateTime)
{
_everyMillis = 0;
@ -69,13 +74,13 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM
return this;
}
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerRightAway(boolean enabled)
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerRightAway(boolean enabled)
{
_triggerRightAway = enabled;
return this;
}
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerType(TriggerType triggerType)
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerType(TriggerType triggerType)
{
_triggerType = triggerType;
return this;
@ -106,12 +111,16 @@ TaskSchedulerManager::TaskSchedulerManager(RtcManager &rtcManager) : _nextTaskIn
boolean TaskSchedulerManager::addTask(const char *name, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
{
return _taskDataDictio.add(name, new TaskData({*schedule, taskRoutine, pData}));
boolean result = _taskDataDictio.add(name, new TaskData({*schedule, taskRoutine, pData}));
delete schedule;
return result;
}
boolean TaskSchedulerManager::addTask(uint8_t id, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
{
return _taskDataDictio.add(id, new TaskData({*schedule, taskRoutine, pData}));
boolean result = _taskDataDictio.add(id, new TaskData({*schedule, taskRoutine, pData}));
delete schedule;
return result;
}
boolean TaskSchedulerManager::removeTask(const char *name)
@ -175,11 +184,13 @@ void TaskSchedulerManager::runTaskScheduler()
{
p->schedule._millis = millis();
p->schedule._hasBeenTriggeredRightAway = true;
p->schedule._triggered = true;
(*(p->taskRoutine))(p->pData);
}
else if(millis() - p->schedule._millis >= p->schedule._everyMillis) //We execute the task
{
p->schedule._millis = millis();
p->schedule._triggered = true;
(*(p->taskRoutine))(p->pData);
}
}
@ -188,12 +199,21 @@ void TaskSchedulerManager::runTaskScheduler()
p->schedule._millis = millis();
}
}
else
else //Probably AT mode task
{
}
}
if(p->schedule._mode != TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE)_nextTaskIndexToBeRun++;
if(p->schedule._triggerType != TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE)_nextTaskIndexToBeRun++;
else if(p->schedule._triggerType == TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE && p->schedule._triggered) //If the task has to be deleted after executing and if it has been executed, we delete it
{
_taskDataDictio.removeAt(_nextTaskIndexToBeRun);
}
}
const unsigned int TaskSchedulerManager::taskCount()
{
return _taskDataDictio.count();
}

View File

@ -26,11 +26,12 @@ namespace TaskSchedulerManagerHelper
static Schedule *scheduleBuilder();
Schedule *setMillis(uint64_t millis);
Schedule *setSeconds(uint32_t seconds);
Schedule *setDateTime(DateTime &dateTime);
Schedule *setDays(uint8_t days);
Schedule *setMonths(uint16_t months);
Schedule *triggerRightAway(boolean enabled);
Schedule *triggerType(TriggerType triggerType);
Schedule *setTriggerRightAway(boolean enabled);
Schedule *setTriggerType(TriggerType triggerType);
Schedule *setMode(Mode mode);
Schedule *setEnabled(boolean enabled);
protected:
@ -45,7 +46,7 @@ namespace TaskSchedulerManagerHelper
TriggerType _triggerType;
Mode _mode;
boolean _enabled;
uint64_t _millis;
uint64_t _millis; //Used to internally keep track of the time elapsed for this task
uint64_t _everyMillis; //We can use millis or DateTime, but not both e.g every 00h 10m 00s 000ms
DateTime *_dateTime;
};
@ -69,6 +70,7 @@ class TaskSchedulerManager
boolean disableTask(uint8_t id);
boolean clearTask();
void runTaskScheduler();
const unsigned int taskCount();
protected:
TaskSchedulerManager();
TaskSchedulerManager(RtcManager &rtcManager);

View File

@ -58,7 +58,7 @@ boolean WEBServerManager::runServer()
#ifdef DEBUG
Serial.println("Sending response !!!");
#endif
//We first check if it s an api call
//We first check if it's an api call
if(!sendPageToClientFromApiDictio(&_wifiClient))
{
sendPageToClientFromSdCard(&_wifiClient);

View File

@ -10,9 +10,9 @@
SAB sab;
unsigned long currentMs = 0, batteryMs = 0, buttonMs = 0;
unsigned long currentMs = 0, buttonMs = 0;
volatile boolean ioStateChange(false);
View1Packet v1p = {sab.getRtcManager().getDateTime(), sab.getSdCardManager().getSize(GBYTE), sab.getPowerInfo(),0, sab.getSoftVersion()};
View1Packet v1p = {sab.getRtcManager().getDateTime(), sab.getSdCardManager().getSize(GBYTE), sab.getPowerInfo(),0, sab.getSoftVersion(), &sab};
ViewAPPacket vap = {sab.getConnectivityManager().softAPmacAddress(), sab.getConnectivityManager().softAPSSID(), sab.getConnectivityManager().softAPIP(), sab.getConnectivityManager().softAPgetStationNum()};
ViewSTAPacket vstap = {sab.getConnectivityManager().macAddress(), sab.getConnectivityManager().localIP(), sab.getConnectivityManager().RSSI()};
ViewIoInfoPacket vio = {{0},{0}};
@ -64,8 +64,8 @@ void setup()
sab.getWebServerManager().addApiRoutine("/sab/sdcard/unmount", &(sdCardUnmountApi), &sdCardApiPacket, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/sab/sdcard/mount", &(sdCardMountApi), &sdCardApiPacket, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/esp/restart", &(espRestartApi), NULL, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/esp/reset", &(espResetApi), NULL, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/esp/restart", &(espRestartApi), &sab, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/esp/reset", &(espResetApi), &sab, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/sab/wifi/stainfo", &(staWifiInfoApi), &sab, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/sab/systeminfo", &(systemInfoApi), &sab, WEBServerManager::GET);
sab.getWebServerManager().addApiRoutine("/sab/power/info", &(powerInfoApi), &sab, WEBServerManager::GET);
@ -79,6 +79,7 @@ void setup()
sab.getTaskSchedulerManager().addTask(1, TaskSchedulerManagerHelper::Schedule::scheduleBuilder()->setEnabled(false), &(task1));
sab.getTaskSchedulerManager().addTask(2, TaskSchedulerManagerHelper::Schedule::scheduleBuilder()->setMillis(5000)->setEnabled(false), &(task2));
sab.getTaskSchedulerManager().addTask(3, TaskSchedulerManagerHelper::Schedule::scheduleBuilder()->setMillis(5000), &(task_blink), &sab);
sab.getTaskSchedulerManager().addTask(4, TaskSchedulerManagerHelper::Schedule::scheduleBuilder()->setSeconds(10), &(task_batt_sensing), &v1p);
Serial.println("End setup");
}
@ -106,17 +107,7 @@ void loop()
if(ioStateChange) Serial.println(F("ISR triggered"));
ioStateChange = false;
}
if(millis() - batteryMs >= 10000)
{
batteryMs = millis();
v1p.powerInfo = sab.getPowerInfo();
#ifdef DEBUG
Serial.print(F("Running : "));Serial.println(millis()/1000);
#endif
}
if(digitalRead(GPIO_0) == 0 && millis() - buttonMs > 500)
{
buttonMs = millis();

View File

@ -33,3 +33,19 @@ char *addChar(char *pointer, const char character)
return pointer;
}
char *dateTimeFormater(char *pointer, const uint8_t value, const char character)
{
if(pointer == NULL)
return pointer;
if(value < 10)
{
sprintf(pointer,"%d", value);
*(pointer+1) = *(pointer);*(pointer) = character;*(pointer+2) = '\0';
}
else
sprintf(pointer,"%d", value);
return pointer;
}

View File

@ -66,4 +66,6 @@ typedef struct powerInfo
char *addChar(char *pointer, const char character);
char *dateTimeFormater(char *pointer, const uint8_t value, const char character);
#endif //DEFINITION_H

View File

@ -13,8 +13,24 @@ boolean task2(void *pData)
return true;
}
boolean task_blink(void *pData)
{
SAB *p = (SAB *) pData;
p->getIoManager().getPcf().togglePin(PCF8574::P2);
return true;
}
boolean task_batt_sensing(void *pData)
{
View1Packet *p = (View1Packet *) pData;
Serial.println(F("BATT SENSING..."));
p->powerInfo = p->sab->getPowerInfo();
return true;
}
boolean task_esp_reset_restart(void * pData)
{
ESP.restart();
}

View File

@ -2,9 +2,12 @@
#define TASKS_H
#include <Arduino.h>
#include "SAB.h"
#include "views.h"
boolean task1(void *);
boolean task2(void *);
boolean task_blink(void *);
boolean task_batt_sensing(void *);
boolean task_esp_reset_restart(void *);
#endif //TASKS_H

View File

@ -8,5 +8,8 @@
*/
#define SOFT_VERSION "1.0.0" //First version tracking
#define SOFT_VERSION "1.1.0" //Added trailing zeros to the date and time
#define SOFT_VERSION "1.1.1" //Added delayed esp restart/reset api call
#define SOFT_VERSION "1.1.2" //Fixed a big memory leak :( shame on me...
#endif //VERSIONS_H

View File

@ -2,7 +2,7 @@
boolean view_1(Adafruit_SSD1306 &display, void *pData)
{
char time_str[300] = "", power_str[15] = "", sdCard[10] = "", pageTitle[22] = "";
char time_str[300] = "", power_str[15] = "", sdCard[10] = "", pageTitle[22] = "", zero_prepended[5][3] = {"","","","",""};
View1Packet *p = (View1Packet *) pData;
switch(p->powerInfo.powerType)
@ -18,8 +18,14 @@ boolean view_1(Adafruit_SSD1306 &display, void *pData)
sprintf(sdCard,"%.2fGB",p->sdCardSize);
else
sprintf(sdCard,"NO CARD");
sprintf(time_str,"Time : %d:%d:%d\nDate : %d/%d/%d\nFree RAM : %d\nSdCard : %s\nPower : %s\nViews : %u\n", p->dateTime.hour(), p->dateTime.minute(), p->dateTime.second(), p->dateTime.day(), p->dateTime.month(), p->dateTime.year(),ESP.getFreeHeap(),sdCard,power_str, p->nbViews);
sprintf(time_str,"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(pageTitle, "GLOBAL INFO v %s",p->version);
display.println(time_str);
display.setCursor(0,56);

View File

@ -10,6 +10,7 @@ typedef struct view1Packet
PowerInfo powerInfo;
unsigned char nbViews;
const char *version;
SAB *sab;
} View1Packet;
//Global info

View File

@ -1,5 +1,6 @@
#include "SAB.h"
#include "webApi.h"
#include "tasks.h"
boolean apiTesterApi(WEBServerManager::HttpRequestData &HRD, WiFiClient* wc, void* pData)
{
@ -134,16 +135,28 @@ boolean sdCardMountApi(WEBServerManager::HttpRequestData &HRD, WiFiClient *wc, v
boolean espRestartApi(WEBServerManager::HttpRequestData &HRD, WiFiClient *wc, void *pData)
{
ESP.restart();
SAB *sab = (SAB*)pData;
char buffer[200];
sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"message\" : \"module restarting in 10 seconds\" }");
wc->print(buffer);
unsigned int id = sab->getTaskSchedulerManager().taskCount()+1;
sab->getTaskSchedulerManager().addTask(id, TaskSchedulerManagerHelper::Schedule::scheduleBuilder()
->setSeconds(10)
->setTriggerType(TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE)
->setTriggerRightAway(false), &(task_esp_reset_restart), NULL);
Serial.print(F("Task id : "));Serial.println(id);
return true;
}
boolean espResetApi(WEBServerManager::HttpRequestData &HRD, WiFiClient *wc, void *pData)
{
ESP.restart();
return true;
return espRestartApi(HRD, wc, pData);
}
boolean sdCardSizeApi(WEBServerManager::HttpRequestData &HRD, WiFiClient *wc, void *pData)