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