Stairs/src/settings/triggers/time.cpp

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;
}
}
}
}