Przeglądaj źródła

Code cleanup after DS3231 trim

tags/v1.2.0
Bertrand Lemasle 7 lat temu
rodzic
commit
b64990c0a5
7 zmienionych plików z 50 dodań i 145 usunięć
  1. +2
    -0
      GpsTracker/Core.cpp
  2. +2
    -0
      GpsTracker/Debug.cpp
  3. +6
    -4
      GpsTracker/Flash.h
  4. +8
    -11
      GpsTracker/Rtc.cpp
  5. +0
    -1
      GpsTracker/Rtc.h
  6. +26
    -111
      GpsTracker/Time2.cpp
  7. +6
    -18
      GpsTracker/Time2.h

+ 2
- 0
GpsTracker/Core.cpp Wyświetl plik

@@ -4,6 +4,8 @@

#define LOGGER_NAME "Core"

using namespace utils;

namespace core {
uint16_t sleepTime = SLEEP_DEFAULT_TIME_SECONDS;;



+ 2
- 0
GpsTracker/Debug.cpp Wyświetl plik

@@ -103,6 +103,8 @@ int freeRam2() { // dirty hack because putting it in namespace doesn't compile
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}

using namespace utils;

namespace debug {

namespace details {


+ 6
- 4
GpsTracker/Flash.h Wyświetl plik

@@ -2,10 +2,12 @@

#include <Arduino.h>

namespace flash {
namespace utils {
namespace flash {

template<typename T, size_t N> size_t getArraySize(T(&)[N]) { return N; }
template<typename T> void read(const T *source, T &dest) {
memcpy_P(&dest, source, sizeof(T));
template<typename T, size_t N> size_t getArraySize(T(&)[N]) { return N; }
template<typename T> void read(const T *source, T &dest) {
memcpy_P(&dest, source, sizeof(T));
}
}
}

+ 8
- 11
GpsTracker/Rtc.cpp Wyświetl plik

@@ -8,6 +8,8 @@

#define LOGGER_NAME "Rtc"

using namespace utils;

namespace rtc {
void setup() {
@@ -32,7 +34,7 @@ namespace rtc {
timestamp_t getTime() {
tmElements_t time;
getTime(time);
return makeTimestamp(time);
return time::makeTimestamp(time);
}

void getTime(tmElements_t &time) {
@@ -43,12 +45,6 @@ namespace rtc {
VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
}

void setTime(const timestamp_t timestamp) {
tmElements_t time;
breakTime(timestamp, time);
setTime(time);
}

void setTime(const tmElements_t &time) {
VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);

@@ -62,21 +58,22 @@ namespace rtc {
tmElements_t alarmTime;

getTime(currentTime);
breakTime(makeTimestamp(currentTime) + seconds, alarmTime);
time::breakTime(time::makeTimestamp(currentTime) + seconds, alarmTime);

setAlarm(alarmTime);
}

void setAlarm(const tmElements_t &time) {
hardware::i2c::powerOn();
RTC.writeAlarm1(DS3231_ALM_DTHMS, time);
RTC.writeAlarm1(DS3231_ALM_HMS, time);

RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag
RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
hardware::i2c::powerOff();

NOTICE_FORMAT("setAlarm", "Next alarm : %d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
NOTICE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.Hour, time.Minute, time.Second);

hardware::i2c::powerOff();
}

}

+ 0
- 1
GpsTracker/Rtc.h Wyświetl plik

@@ -9,7 +9,6 @@ namespace rtc {

timestamp_t getTime();
void getTime(tmElements_t &time);
void setTime(timestamp_t time);
void setTime(const tmElements_t &time);

void setAlarm(uint16_t seconds);


+ 26
- 111
GpsTracker/Time2.cpp Wyświetl plik

@@ -10,123 +10,38 @@
#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL)
#define SECS_YR_2000 (946684800UL) // the time at the start of y2k

/* Useful Macros for getting elapsed time */
#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN)
#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR)
#define dayOfWeek(_time_) ((( _time_ / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) // this is number of days since Jan 1 2000
#define elapsedSecsToday(_time_) (_time_ % SECS_PER_DAY) // the number of seconds since last midnight
// The following macros are used in calculating alarms and assume the clock is set to a date later than Jan 1 1971
// Always set the correct time before settting alarms
#define previousMidnight(_time_) (( _time_ / SECS_PER_DAY) * SECS_PER_DAY) // time at the start of the given day
#define nextMidnight(_time_) ( previousMidnight(_time_) + SECS_PER_DAY ) // time at the end of the given day
#define elapsedSecsThisWeek(_time_) (elapsedSecsToday(_time_) + ((dayOfWeek(_time_)-1) * SECS_PER_DAY) ) // note that week starts on day 1
#define previousSunday(_time_) (_time_ - elapsedSecsThisWeek(_time_)) // time at the start of the week for the given time
#define nextSunday(_time_) ( previousSunday(_time_)+SECS_PER_WEEK) // time at the end of the week for the given time


/* Useful Macros for converting elapsed time to a timestamp_t */
#define minutesTotimestamp_t ((M)) ( (M) * SECS_PER_MIN)
#define hoursTotimestamp_t ((H)) ( (H) * SECS_PER_HOUR)
#define daysTotimestamp_t ((D)) ( (D) * SECS_PER_DAY) // fixed on Jul 22 2011
#define weeksTotimestamp_t ((W)) ( (W) * SECS_PER_WEEK)

// leap year calulator expects year argument as years offset from 2000
#define LEAP_YEAR(Y) ( ((2000+Y)>0) && !((2000+Y)%4) && ( ((2000+Y)%100) || !((2000+Y)%400) ) )

static const uint8_t monthDays[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; // API starts months from 1, this array starts from 0
/*==============================================================================*/
/* Utility functions */

__attribute__((__optimize__("O2")))
void breakTime(const timestamp_t timeInput, tmElements_t &tm) {
// break the given timestamp_t into time components
// this is a more compact version of the C library localtime function
// note that year is offset from 2000 !!!
namespace utils {
namespace time {

uint8_t year;
uint8_t month, monthLength;
uint32_t time;
unsigned long days;
__attribute__((__optimize__("O2")))
timestamp_t makeTimestamp(const tmElements_t &time) {
timestamp_t timestamp;

time = (uint32_t)timeInput;
tm.Second = time % 60;
time /= 60; // now it is minutes
tm.Minute = time % 60;
time /= 60; // now it is hours
tm.Hour = time % 24;
time /= 24; // now it is days
//tm.Wday = ((time + 4) % 7) + 1; // Sunday is day 1
timestamp += (time.Day - 1) * SECS_PER_DAY;
timestamp += time.Hour * SECS_PER_HOUR;
timestamp += time.Minute * SECS_PER_MIN;
timestamp += time.Second;

year = 0;
days = 0;
while ((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) {
year++;
return timestamp;
}
tm.Year = year; // year is offset from 2000

days -= LEAP_YEAR(year) ? 366 : 365;
time -= days; // now it is days in this year, starting at 0

days = 0;
month = 0;
monthLength = 0;
for (month = 0; month<12; month++) {
if (month == 1) { // february
if (LEAP_YEAR(year)) {
monthLength = 29;
}
else {
monthLength = 28;
}
}
else {
monthLength = monthDays[month];
}

if (time >= monthLength) {
time -= monthLength;
}
else {
break;
}
__attribute__((__optimize__("O2")))
void breakTime(timestamp_t timestamp, tmElements_t &time) {
time.Year = 0;
time.Month = 0;

time.Day = 0;
time.Second = timestamp % 60;
timestamp /= 60; // now it is minutes
time.Minute = timestamp % 60;
timestamp /= 60; // now it is hours
time.Hour = timestamp % 24;
timestamp /= 24; // now it is days
time.Day = timestamp; //this is purely for indication / computation only as it might get over the number of days in a month
}
tm.Month = month + 1; // jan is month 1
tm.Day = time + 1; // day of month
}

__attribute__((__optimize__("O2")))
timestamp_t makeTimestamp(const tmElements_t &tm) {
// assemble time elements into timestamp_t
// note year argument is offset from 2000 (see macros in time.h to convert to other formats)
// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9

int i;
uint32_t seconds;

// seconds from 2000 till 1 jan 00:00:00 of the given year
seconds = tm.Year*(SECS_PER_DAY * 365);
for (i = 0; i < tm.Year; i++) {
if (LEAP_YEAR(i)) {
seconds += SECS_PER_DAY; // add extra days for leap years
}
}

// add days for this year, months start from 1
for (i = 1; i < tm.Month; i++) {
if ((i == 2) && LEAP_YEAR(tm.Year)) {
seconds += SECS_PER_DAY * 29;
}
else {
seconds += SECS_PER_DAY * monthDays[i - 1]; //monthDay array starts from 0
}
}
seconds += (tm.Day - 1) * SECS_PER_DAY;
seconds += tm.Hour * SECS_PER_HOUR;
seconds += tm.Minute * SECS_PER_MIN;
seconds += tm.Second;
return (timestamp_t)seconds;
}
/*=====================================================*/
/* Low level system time functions */

//TODO : + and - operator between tmElements_t and timestamp_t
}

+ 6
- 18
GpsTracker/Time2.h Wyświetl plik

@@ -3,22 +3,10 @@
#include <Arduino.h>
#include <Time3.h>

namespace utils {
namespace time {


/*============================================================================*/

//typedef unsigned long timestamp_t;

//typedef struct {
// uint8_t Second;
// uint8_t Minute;
// uint8_t Hour;
// //uint8_t Wday; // day of week, sunday is day 1
// uint8_t Day;
// uint8_t Month;
// uint8_t Year; // offset from 1970;
//} tmElements_t;

/* low level functions to convert to and from system time */
void breakTime(const timestamp_t time, tmElements_t &tm); // break timestamp_t into elements
timestamp_t makeTimestamp(const tmElements_t &tm); // convert time elements into timestamp_t
void breakTime(const timestamp_t time, tmElements_t &tm);
timestamp_t makeTimestamp(const tmElements_t &tm);
}
}

Ładowanie…
Anuluj
Zapisz