Northern Widget
DS3231
/*F********************************************************************
*
**********************************************************************/
#include
#include "ds3231.h"
//************************* DEFINES ************************************
#define BUFF_MAX 128
//************************* PROTOTYPES ************************************
void parse_cmd(char *cmd, int cmdsize);
//************************* VARIABLES ************************************
uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 5000;
/*F********************************************************************
*
**********************************************************************/
void
setup()
{
Serial.begin( BAUD );
Wire.begin();
DS3231_init( DS3231_CONTROL_INTCN );
memset( recv, 0, BUFF_MAX );
Serial.println( "GET time" );
}
/*F********************************************************************
*
**********************************************************************/
void
loop()
{
char in, buff[BUFF_MAX];
unsigned long now = millis();
struct ts t;
if( (now - prev > interval) && (Serial.available() <= 0))
{ // SHOW TIME ONCE IN A WHILE
DS3231_get( &t );
#ifdef CONFIG_UNIXTIME
// THERE IS A COMPILE TIME OPTION IN LIBRARY TO INCLUDE UNIXTIME SUPPORT
#ifdef __AVR__
snprintf( buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
#error AVR
#else
snprintf( buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %d", t.year,
#endif
t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
#else
snprintf( buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
t.mon, t.mday, t.hour, t.min, t.sec);
#endif
Serial.println( buff );
prev = now;
}
if( Serial.available() > 0)
{
in = Serial.read();
if( (in == 10 || in == 13) && (recv_size > 0))
{
parse_cmd( recv, recv_size );
recv_size = 0;
recv[0] = 0;
}
else if( in < 48 || in > 122)
{ ; } // IGNORE ~[0-9A-Za-z]
else if( recv_size > BUFF_MAX - 2)
{ // DROP LINES THAT ARE TOO LONG
recv_size = 0; // DROP
recv[0] = 0;
} else if( recv_size < BUFF_MAX - 2)
{
recv[recv_size] = in;
recv[recv_size + 1] = 0;
recv_size += 1;
}
}
}
/*F********************************************************************
*
**********************************************************************/
void
parse_cmd( char *cmd, int cmdsize)
{
uint8_t i, reg_val;
char buff[BUFF_MAX];
struct ts t;
// snprintf( buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
// Serial.print( buff );
// TssmmhhWDDMMYYYY AKA SET TIME
if( cmd[0] == 84 && cmdsize == 16) // 84: 'T'
{ // T355720619112011
t.sec = inp2toi( cmd, 1 );
t.min = inp2toi( cmd, 3 );
t.hour = inp2toi( cmd, 5 );
t.wday = cmd[7] - 48;
t.mday = inp2toi( cmd, 8 );
t.mon = inp2toi( cmd, 10 );
t.year = inp2toi( cmd, 12 ) * 100 + inp2toi( cmd, 14 );
DS3231_set( t );
Serial.println( "OK" );
}
else if( cmd[0] == 49 && cmdsize == 1 ) // 49: '1'
{ // "1" GET ALARM 1
DS3231_get_a1( &buff[0], 59 );
Serial.println( buff );
}
else if( cmd[0] == 50 && cmdsize == 1) // 50: '2'
{ // "2" GET ALARM 1
DS3231_get_a2( &buff[0], 59 );
Serial.println( buff );
}
else if( cmd[0] == 51 && cmdsize == 1) // 51: '3'
{ // "3" GET AGING REGISTER
Serial.print( "aging reg is ");
Serial.println( DS3231_get_aging(), DEC);
}
else if( cmd[0] == 65 && cmdsize == 9) / 65: 'A'
{ // "A" SET ALARM 1
DS3231_set_creg( DS3231_CONTROL_INTCN | DS3231_CONTROL_A1IE );
for( i = 0; i < 4; i++) //ASSMMHHDD
{ // SS,MM,HH,DD
time[i] = (cmd[2 * i +1] -48) * 10 +cmd[2 * i +2] -48;
}
uint8_t flags[5] = { 0, 0, 0, 0, 0 };
DS3231_set_a1( time[0], time[1], time[2], time[3], flags );
DS3231_get_a1( &buff[0], 59 );
Serial.println( buff );
}
else if( cmd[0] == 66 && cmdsize == 7) // 66: 'B'
{ // "B" SET Alarm 2
DS3231_set_creg( DS3231_CONTROL_INTCN | DS3231_CONTROL_A2IE );
for( i = 0; i < 4; i++ ) // BMMHHDD
{ // MM,HH,DD
time[i] = (cmd[2 * i +1] -48) * 10 +cmd[2 * i +2] -48;
}
uint8_t flags[5] = { 0, 0, 0, 0 };
DS3231_set_a2( time[0], time[1], time[2], flags );
DS3231_get_a2( &buff[0], 59 );
Serial.println( buff );
}
else if( cmd[0] == 67 && cmdsize == 1) // 67: 'C'
{ // "C" - GET TEMPERATURE REGISTER
Serial.print( "temperature reg is " );
Serial.println( DS3231_get_treg(), DEC );
}
else if( cmd[0] == 68 && cmdsize == 1 ) // 68: 'D'
{ // "D" - RESET STATUS REGISTER ALARM FLAGS
reg_val = DS3231_get_sreg();
reg_val &= B11111100;
DS3231_set_sreg( reg_val );
}
else if( cmd[0] == 70 && cmdsize == 1) // 70: 'F'
{ // "F" - CUSTOM FCT
reg_val = DS3231_get_addr( 0x5 );
Serial.print( "orig " );
Serial.print( reg_val,DEC );
Serial.print( "month is " );
Serial.println( bcdtodec( reg_val & 0x1F), DEC );
}
else if( cmd[0] == 71 && cmdsize == 1) // 71: 'G'
DS3231_set_aging( 0 ); // "G" - SET AGING STATUS REGISTER
else if( cmd[0] == 83 && cmdsize == 1) // 83: 'S'
{ // "S" - GET STATUS REGISTER
Serial.print( "status reg is " );
Serial.println( DS3231_get_sreg(), DEC );
}
else
{
Serial.print( "unknown command prefix " );
Serial.println( cmd[0] );
Serial.println( cmd[0], DEC );
}
}