Compare commits
10 Commits
29a13da289
...
bfaea9ef9a
Author | SHA1 | Date | |
---|---|---|---|
|
bfaea9ef9a | ||
|
90ac468c8e | ||
|
c79dca197a | ||
|
6c06233dd6 | ||
|
9c030518c5 | ||
|
b93a6f64e8 | ||
|
3642367826 | ||
|
ff7656f5e7 | ||
|
0edadee37c | ||
|
4e8a898b26 |
@ -92,7 +92,7 @@ IOManager& SAB::getIoManager()
|
||||
return _ioManager;
|
||||
}
|
||||
|
||||
TaskSchedulerManager &SAB::getTaskSchedulerManager()
|
||||
TaskSchedulerManager& SAB::getTaskSchedulerManager()
|
||||
{
|
||||
return _taskSchedulerManager;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -10,6 +10,7 @@ typedef struct view1Packet
|
||||
PowerInfo powerInfo;
|
||||
unsigned char nbViews;
|
||||
const char *version;
|
||||
SAB *sab;
|
||||
} View1Packet;
|
||||
|
||||
//Global info
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user