// Simple date conversions and calculations
#include "RTClib.h"
//RTC_Millis rtc;
const char UBX_MSG_FMT[] = "$%s*%2X\n";
const char UBX_BAUD_STR[] = "PUBX,41,1,3,3,%d,0";
const char UBX_MSG_STR[] = "PUBX,40,%s,0,%d,0,0,0,0";
void showDate(const char* txt, const DateTime& dt) {
Serial.printf("%s %04d/%02d/%02d %02d:%02d:%02d", txt, dt.year(), dt.month(), dt.day(), dt.hour(), dt.minute(), dt.second());
Serial.printf(" = %ds / %dd since 1970\n", dt.unixtime(), dt.unixtime() / 86400L);
Serial.println();
}
void showTimeSpan(const char* txt, const TimeSpan& ts) {
Serial.printf("%s %d days %d hours %d minutes %d seconds (%d total seconds)\n", txt, ts.days(), ts.hours(), ts.minutes(), ts.seconds(), ts.totalseconds());
Serial.println();
}
byte check_sum(char* buff, int len){
byte cs = 0;
for (int i = 0; i < len; i++) {
cs = cs ^ byte(buff[i]);
}
return cs;
}
void send_ubx_msg(char* msg, byte state) {
char buff[30];
char buff2[30];
int strSize = sprintf(buff, UBX_MSG_STR, msg, state);
byte cs = check_sum(buff, strSize);
Serial.printf(UBX_MSG_FMT, buff, cs);
}
void disable_NMEA_msg(char* msg) {
send_ubx_msg(msg, 0);
}
void enable_NMEA_msg(char* msg) {
send_ubx_msg(msg, 1);
}
void set_ubx_baudrate(uint32_t baud){
char buff[30];
int strSize = sprintf(buff, UBX_BAUD_STR, baud);
byte cs = check_sum(buff, strSize);
Serial.printf(UBX_MSG_FMT, buff, cs);
}
void setup () {
Serial.begin(57600);
delay(5000);
//rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
// DateTime time = rtc.now();
DateTime time (2026, 03, 03, 00, 48, 30);
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_FULL:\t") + time.timestamp(DateTime::TIMESTAMP_FULL));
//Date Only
Serial.println(String("DateTime::TIMESTAMP_DATE:\t") + time.timestamp(DateTime::TIMESTAMP_DATE));
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_TIME:\t") + time.timestamp(DateTime::TIMESTAMP_TIME));
Serial.println("\n");
DateTime pp = DateTime(1772501850);
showDate("pp", pp);
pp = DateTime(2021, 12, 25, 1, 2, 3);
showDate("pp", pp);
Serial.println("\n");
DateTime dt6 (2026, 03, 03, 01, 37, 30);
showDate("dt6", dt6);
DateTime dt7 (dt6.unixtime() - 3 * 3600); // One hour later.
showDate("dt7", dt7);
DateTime dt75 = dt6 + TimeSpan(0, -3, 0, 0); // One hour later with TimeSpan addition.
showDate("dt7.5", dt75);
TimeSpan ts2 = dt7 - dt6;
showTimeSpan("dt7-dt6", ts2);
char pp2[] = "PUBX,41,1,3,3,57600,0";
byte cs;
for (int i = 0; i < (sizeof(pp2) - 1); i++) {
cs = cs ^ byte(pp2[i]);
}
Serial.printf("$%s*%02X\n",pp2,cs);
char pp3[] = "PUBX,40,RMC,0,0,0,0,0,0";
cs=0;
for (int i = 0; i < (sizeof(pp3) - 1); i++) {
cs = cs ^ byte(pp3[i]);
}
Serial.printf("$%s*%02X\n",pp3,cs);
char pp4[] = "PUBX,40,GSV,0,1,0,0,0,0";
cs=0;
for (int i = 0; i < (sizeof(pp4) - 1); i++) {
cs = cs ^ byte(pp4[i]);
}
Serial.printf("$%s*%02X\n",pp4,cs);
char ubxmsg[] = "PUBX,41,1,3,3,%d,0"; //$PUBX,41,1,3,3,115200,0*1C
char buff[30];
char buff2[30];
int j = sprintf(buff,ubxmsg,115200);
Serial.println(buff);
cs=0;
Serial.println(j/*sizeof(buff)*/);
for (int i = 0; i < j; i++) {
cs = cs ^ byte(buff[i]);
}
j = sprintf(buff2,"$%s*%02X\n",buff,cs);
Serial.println(buff2);
disable_NMEA_msg("RMC");
disable_NMEA_msg("GGA");
enable_NMEA_msg("RMC");
set_ubx_baudrate(115200);
}
void loop () {
delay(100);
}