148 lines
2.9 KiB
C++
148 lines
2.9 KiB
C++
/*
|
|
* Stairs
|
|
* Copyright 2017 (c) Mark van Renswoude
|
|
*
|
|
* https://git.x2software.net/pub/Stairs
|
|
*/
|
|
#include "time.h"
|
|
#include <string.h>
|
|
#include <FS.h>
|
|
#include "../../debug.h"
|
|
|
|
|
|
timeDayOfWeek_t toTimeDayOfWeek(DayOfWeek day)
|
|
{
|
|
switch (day)
|
|
{
|
|
case Monday: return dowMonday;
|
|
case Tuesday: return dowTuesday;
|
|
case Wednesday: return dowWednesday;
|
|
case Thursday: return dowThursday;
|
|
case Friday: return dowFriday;
|
|
case Saturday: return dowSaturday;
|
|
case Sunday: return dowSunday;
|
|
}
|
|
|
|
return dowInvalid;
|
|
}
|
|
|
|
|
|
DayOfWeek toDayOfWeek(timeDayOfWeek_t timeDay)
|
|
{
|
|
switch (timeDay)
|
|
{
|
|
case dowSunday: return Sunday;
|
|
case dowMonday: return Monday;
|
|
case dowTuesday: return Tuesday;
|
|
case dowWednesday: return Wednesday;
|
|
case dowThursday: return Thursday;
|
|
case dowFriday: return Friday;
|
|
case dowSaturday: return Saturday;
|
|
}
|
|
|
|
return Monday;
|
|
}
|
|
|
|
|
|
struct Header
|
|
{
|
|
uint8_t version;
|
|
uint8_t triggerCount;
|
|
uint16_t transitionTime;
|
|
};
|
|
|
|
|
|
void TimeTriggerSettings::read()
|
|
{
|
|
_dln("TimeTriggerSettings :: Loading time triggers");
|
|
File f = SPIFFS.open(TimeTriggerSettingsFile, "r");
|
|
if (!f)
|
|
return;
|
|
|
|
if (!f.available())
|
|
return;
|
|
|
|
Header header;
|
|
f.readBytes((char*)&header, sizeof(Header));
|
|
|
|
if (header.version != 1)
|
|
return;
|
|
|
|
mTransitionTime = header.transitionTime;
|
|
beginSetTriggers(header.triggerCount);
|
|
|
|
if (header.triggerCount > 0)
|
|
f.readBytes((char*)&mTriggers, header.triggerCount * sizeof(TimeTrigger));
|
|
|
|
endSetTriggers();
|
|
|
|
f.close();
|
|
}
|
|
|
|
|
|
void TimeTriggerSettings::write()
|
|
{
|
|
_dln("TimeTriggerSettings :: Saving time triggers");
|
|
File f = SPIFFS.open(TimeTriggerSettingsFile, "w");
|
|
if (!f)
|
|
return;
|
|
|
|
Header header;
|
|
header.version = 1;
|
|
header.transitionTime = mTransitionTime;
|
|
header.triggerCount = mTriggerCount;
|
|
|
|
f.write((uint8_t*)&header, sizeof(Header));
|
|
f.write((uint8_t*)&mTriggers, header.triggerCount * sizeof(TimeTrigger));
|
|
f.close();
|
|
}
|
|
|
|
|
|
void TimeTriggerSettings::beginSetTriggers(uint8_t count)
|
|
{
|
|
if (mTriggers != nullptr)
|
|
delete [] mTriggers;
|
|
|
|
mTriggers = new TimeTrigger[count];
|
|
mTriggerCount = count;
|
|
}
|
|
|
|
|
|
void TimeTriggerSettings::setTrigger(uint8_t index, TimeTrigger* value)
|
|
{
|
|
memcpy(&mTriggers[index], value, sizeof(TimeTrigger));
|
|
}
|
|
|
|
|
|
void TimeTriggerSettings::endSetTriggers()
|
|
{
|
|
// Sort triggers by time of day
|
|
// Based on the Comb sort implementation by Rob Tillaart
|
|
// http://forum.arduino.cc/index.php?topic=280486.0
|
|
uint8_t i, j;
|
|
uint8_t gap;
|
|
bool swapped = true;
|
|
TimeTrigger temp;
|
|
|
|
gap = mTriggerCount;
|
|
while (gap > 1 || swapped)
|
|
{
|
|
if (gap > 1)
|
|
{
|
|
gap = gap * 10/13;
|
|
if (gap == 9 || gap == 10) gap = 11;
|
|
}
|
|
|
|
swapped = false;
|
|
for (i = 0, j = gap; j < mTriggerCount; i++, j++)
|
|
{
|
|
if (mTriggers[i].timeOfDay > mTriggers[j].timeOfDay)
|
|
{
|
|
temp = mTriggers[i];
|
|
mTriggers[i] = mTriggers[j];
|
|
mTriggers[j] = temp;
|
|
swapped = true;
|
|
}
|
|
}
|
|
}
|
|
} |