The post exceeded the 9500 character limit so I broke it over 2 posts. (2 of 2)
(Continued from previous post)
rtclock.ino
#include <malloc.h>
#include <Wire.h>
#include "RTClib.h"
#define MAXDTSTRINGLEN 100
#define DEFAULTDATEFMT "dddd d MMMM yyyy h:mm:ss tt"
RTC_DS1307 rtc;
char daynamesfull[7][10] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char daynamesabbr[7][4] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char monthnamesfull[12][10] = {
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
char monthnamesabbr[12][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
void getTime(char *dateformat);
void getTimePart(char *timepart);
void strcatchar(char *str1, char char1);
char *substring(char *string, int position, int length);
void rtclock_setup() {
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
}
void getTime(char *formatedDateTime) {
char displayDateTimeFormat[MAXDTSTRINGLEN];
strcpy(displayDateTimeFormat, formatedDateTime);
if(strlen(displayDateTimeFormat)==0) {
strcpy(displayDateTimeFormat, DEFAULTDATEFMT);
}
// Initialize formatedDateTime
strcpy(formatedDateTime, "");
char lastChar = displayDateTimeFormat[0];
char thisChar = '\0';
char currentPart[MAXDTSTRINGLEN];
// Initialize currentPart
strcpy(currentPart, "");
strcatchar(currentPart, lastChar);
for(size_t pos=1; pos<strlen(displayDateTimeFormat); pos++) {
thisChar = displayDateTimeFormat[pos];
if(thisChar != lastChar || pos==strlen(displayDateTimeFormat)-1) {
if(pos==strlen(displayDateTimeFormat)-1 && thisChar==lastChar) {
strcatchar(currentPart, thisChar);
}
getTimePart(currentPart);
strcat(formatedDateTime, currentPart);
strcpy(currentPart, "");
strcatchar(currentPart, thisChar);
if(pos==strlen(displayDateTimeFormat)-1 && thisChar!=lastChar) {
getTimePart(currentPart);
strcat(formatedDateTime, currentPart);
}
}
else {
strcatchar(currentPart, thisChar);
}
lastChar=thisChar;
}
}
void getTimePart(char *timepart) {
// REF: http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
// Not supported are f, F, g, K, z
char validfromatchars[] = "dhHmMsty";
DateTime now = rtc.now();
char *q = strchr(validfromatchars, timepart[0]);
if(!q) {
return;
}
// Handle day formats
if(timepart[0]=='d') {
switch(strlen(timepart)) {
case 4:
strcpy(timepart, daynamesfull[now.dayOfWeek()]);
break;
case 3:
strcpy(timepart, daynamesabbr[now.dayOfWeek()]);
break;
case 2:
if(now.day() < 10) {
sprintf(timepart, "0%d", now.day());
break;
}
case 1:
sprintf(timepart, "%d", now.day());
break;
default:
return;
break;
}
}
// Handle 12 hour formats
else if(timepart[0]=='h') {
switch(strlen(timepart)) {
case 2:
if(now.hour() == 0) {
strcpy(timepart, "12");
break;
}
else if(now.hour() < 10) {
sprintf(timepart, "0%d", now.hour());
break;
}
case 1:
if(now.hour() == 0) {
strcpy(timepart, "12");
}
else if(now.hour() > 12) {
sprintf(timepart, "%d", now.hour()-12);
}
else {
sprintf(timepart, "%d", now.hour());
}
break;
default:
return;
break;
}
}
// Handle 24 hour formats
else if(timepart[0]=='H') {
switch(strlen(timepart)) {
case 2:
if(now.hour() < 10) {
sprintf(timepart, "0%d", now.hour());
break;
}
case 1:
sprintf(timepart, "%d", now.hour());
break;
default:
return;
break;
}
}
// Handle minute formats
else if(timepart[0]=='m') {
switch(strlen(timepart)) {
case 2:
if(now.minute() < 10) {
sprintf(timepart, "0%d", now.minute());
break;
}
case 1:
sprintf(timepart, "%d", now.minute());
break;
default:
return;
break;
}
}
// Handle month formats
else if(timepart[0]=='M') {
switch(strlen(timepart)) {
case 4:
strcpy(timepart, monthnamesfull[now.month()-1]);
break;
case 3:
strcpy(timepart, monthnamesabbr[now.month()-1]);
break;
case 2:
if(now.month() < 10) {
sprintf(timepart, "0%d", now.month());
break;
}
case 1:
sprintf(timepart, "%d", now.month());
break;
default:
return;
break;
}
}
// Handle second formats
else if(timepart[0]=='s') {
switch(strlen(timepart)) {
case 2:
if(now.second() < 10) {
sprintf(timepart, "0%d", now.second());
break;
}
case 1:
sprintf(timepart, "%d", now.second());
break;
default:
return;
break;
}
}
// Handle AM/PM designator formats
else if(timepart[0]=='t') {
switch(strlen(timepart)) {
case 2:
if(now.hour() < 12) {
strcpy(timepart, "AM");
}
else{
strcpy(timepart, "PM");
}
break;
case 1:
if(now.hour() < 12) {
strcpy(timepart, "A");
}
else{
strcpy(timepart, "P");
}
break;
default:
return;
break;
}
}
// Handle year formats
else if(timepart[0]=='y') {
char tempq[10] = "";
sprintf(tempq, "%d", now.year());
switch(strlen(timepart)) {
case 5:
if(now.year()>9999) {
sprintf(timepart, "%d", now.year());
}
else if(now.year()>999) {
sprintf(timepart, "0%d", now.year());
}
else if(now.year()>99) {
sprintf(timepart, "00%d", now.year());
}
else if(now.year()>9) {
sprintf(timepart, "000%d", now.year());
}
else {
sprintf(timepart, "0000%d", now.year());
}
break;
case 4:
if(now.year()>999) {
sprintf(timepart, "%d", now.year());
}
else if(now.year()>99) {
sprintf(timepart, "0%d", now.year());
}
else if(now.year()>9) {
sprintf(timepart, "00%d", now.year());
}
else {
sprintf(timepart, "000%d", now.year());
}
break;
case 3:
if(now.year()>99) {
sprintf(timepart, "%d", now.year());
}
else if(now.year()>9) {
sprintf(timepart, "0%d", now.year());
}
else {
sprintf(timepart, "00%d", now.year());
}
break;
case 2:
if(strlen(tempq) < 2) {
sprintf(timepart, "0%s", tempq);
}
else if(strlen(tempq) == 2) {
sprintf(timepart, "%s", tempq);
}
else {
strcpy(timepart, substring(tempq, strlen(tempq)-1, 2));
}
break;
case 1:
strcpy(timepart, substring(tempq, strlen(tempq), 1));
break;
default:
break;
}
}
}
void strcatchar(char *str1, char char1) {
strcat(str1, " ");
str1[strlen(str1)-1] = char1;
}
char *substring(char *string, int position, int length) {
char *pointer;
int c;
pointer = (char*) malloc(length+1);
if (pointer == NULL)
{
return pointer;
}
for (c = 0 ; c < position -1 ; c++)
string++;
for (c = 0 ; c < length ; c++)
{
*(pointer+c) = *string;
string++;
}
*(pointer+c) = '\0';
return pointer;
}
Here is the serial output with it running on 26 January 2014 at 11:24 AM.
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
COMPLETED SETUP
Sunday 26/1 01 26 2014 11:24:30 AM
As you can see, it is running one time and rebooting the Arduino. I have done several tests and found that it will only reboot if the output is 34 characters or more.
Thank you in advance for pointing out any issues that I may have with the code. I would also appreciate any information on a better way to solve the same problem.