Fork of Ds3231 library that replaces inheritance of I2C class with a private member var of type I2C *

Dependents:   ard2pmod DS3231_Alarm_Demo MAXREFDES130_131_Demo MAXREFDES130_Demo

Fork of ds3231 by Maxim Integrated

Revision:
15:16ca4c747252
Parent:
12:b9f13fd8c1b6
Child:
16:e1c0f63595d9
--- a/ds3231.cpp	Wed Mar 18 00:06:59 2015 +0000
+++ b/ds3231.cpp	Mon Mar 28 19:17:34 2016 +0000
@@ -1,19 +1,4 @@
 /******************************************************************//**
-* @file ds3231.cpp
-*
-* @author Justin Jordan
-*
-* @version 1.0
-*
-* Started: 11NOV14
-*
-* Updated: 
-*
-* @brief Source file for DS3231 class
-*
-***********************************************************************
-*
-* @copyright 
 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
@@ -49,56 +34,60 @@
 #include "ds3231.h"
 
 
-/**********************************************************//**
-* Constructor for Ds3231 Class
-*
-* On Entry:
-*     @param[in] sda - sda pin of I2C bus
-*     @param[in] scl - scl pin of I2C bus
-*
-* On Exit:
-*    @return none
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-*
-* @endcode
-**************************************************************/
-Ds3231::Ds3231(PinName sda, PinName scl) : I2C(sda, scl)
+#define DS3231_I2C_ADRS 0x68 
+#define I2C_WRITE 0
+#define I2C_READ  1
+
+#define AM_PM     (1 << 5) 
+#define MODE      (1 << 6)
+#define DY_DT     (1 << 6)
+#define ALRM_MASK (1 << 7)
+
+//control register bit masks
+#define A1IE  (1 << 0)
+#define A2IE  (1 << 1)
+#define INTCN (1 << 2)
+#define RS1   (1 << 3)
+#define RS2   (1 << 4)
+#define CONV  (1 << 5)
+#define BBSQW (1 << 6)
+#define EOSC  (1 << 7)
+
+//status register bit masks
+#define A1F     (1 << 0)
+#define A2F     (1 << 1)
+#define BSY     (1 << 2)
+#define EN32KHZ (1 << 3)
+#define OSF     (1 << 7)
+
+
+//*********************************************************************
+Ds3231::Ds3231(PinName sda, PinName scl) 
+:_p_i2c(new I2C(sda, scl)), _i2c_owner(true), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE), 
+_r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ)
 {
-    w_adrs = ((DS3231_I2C_ADRS << 1) | I2C_WRITE);
-    r_adrs = ((DS3231_I2C_ADRS << 1) | I2C_READ);
 }
 
 
-/**********************************************************//**
-* Sets the time on DS3231
-* Struct data is in integrer format, not BCD.  Fx will convert
-* to BCD for you.
-*
-* On Entry:
-*     @param[in] time - struct cotaining time data; 
-*
-* On Exit:
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //time = 12:00:00 AM 12hr mode
-* ds3231_time_t time = {12, 0, 0, 0, 1}
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.set_time(time);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
+Ds3231::Ds3231(I2C & i2c_bus)
+:_p_i2c(&i2c_bus), _i2c_owner(false), _w_adrs((DS3231_I2C_ADRS << 1) | I2C_WRITE), 
+_r_adrs((DS3231_I2C_ADRS << 1) | I2C_READ)
+{
+}
+
+
+//*********************************************************************
+Ds3231::~Ds3231()
+{
+    if(_i2c_owner)
+    {
+        delete _p_i2c;
+    }
+}
+
+
+//*********************************************************************
 uint16_t Ds3231::set_time(ds3231_time_t time)
 {
     uint8_t data[] = {0,0,0,0};
@@ -135,34 +124,12 @@
     }
     else
     {
-        return(write(w_adrs,(const char*) data, data_length));
+        return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
     }
 }
 
 
-/**********************************************************//**
-* Sets the calendar on DS3231
-*
-* On Entry:
-*     @param[in] calendar - struct cotaining calendar data 
-*
-* On Exit:
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //see datasheet for calendar format
-* ds3231_calendar_t calendar = {1, 1, 1, 0}; 
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.set_calendar(calendar);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::set_calendar(ds3231_calendar_t calendar)
 {
     uint8_t data[] = {0,0,0,0,0};
@@ -184,37 +151,12 @@
     }
     else
     {
-        return(write(w_adrs,(const char*) data, data_length));
+        return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
     }
 }
 
 
-/**********************************************************//**
-* Set either Alarm1 or Alarm2 of DS3231
-*
-* On Entry:
-*     @param[in] alarm - struct cotaining alarm data 
-*                        
-*     @param[in] one_r_two - TRUE for Alarm1 and FALSE for 
-*                            Alarm2
-*
-* On Exit:
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //see ds3231.h for .members and datasheet for alarm format
-* ds3231_alrm_t alarm; 
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.set_alarm(alarm, FALSE);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::set_alarm(ds3231_alrm_t alarm, bool one_r_two)
 {
     uint8_t data[] = {0,0,0,0,0};
@@ -339,34 +281,12 @@
     }
     else
     {
-        return(write(w_adrs,(const char*) data, data_length));
+        return(_p_i2c->write(_w_adrs,(const char*) data, data_length));
     }
 }
 
 
-/**********************************************************//**
-* Set control and status registers of DS3231
-*
-* On Entry:
-*     @param[in] data - Struct containing control and status 
-*                       register data
-*
-* On Exit:
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15);  
-* 
-* //do not use 0xAA, see datasheet for appropriate data 
-* ds3231_cntl_stat_t data = {0xAA, 0xAA}; 
-*
-* rtn_val = rtc.set_cntl_stat_reg(data);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::set_cntl_stat_reg(ds3231_cntl_stat_t data)
 {
     uint8_t local_data[] = {0,0,0};
@@ -377,46 +297,22 @@
     local_data[data_length++] = data.status;
 
     //users responsibility to make sure data is logical
-    return(write(w_adrs,(const char*) local_data, data_length));
+    return(_p_i2c->write(_w_adrs,(const char*) local_data, data_length));
 }
 
 
-/**********************************************************//**
-* Gets the time on DS3231
-*
-* On Entry:
-*     @param[in] time - pointer to struct for storing time data
-*
-* On Exit:
-*     @param[out] time - contains current integrer rtc time 
-*                        data
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //time = 12:00:00 AM 12hr mode
-* ds3231_time_t time = {12, 0, 0, 0, 1} 
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.get_time(&time);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::get_time(ds3231_time_t* time)
 {
     uint16_t rtn_val = 1;
     uint8_t data[3];
     
     data[0] = SECONDS;
-    rtn_val = write(w_adrs, (const char*) data, 1);
+    rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
     
     if(!rtn_val)
     {
-        rtn_val = read(r_adrs,(char *) data, 3);
+        rtn_val = _p_i2c->read(_r_adrs,(char *) data, 3);
         
         time->seconds = bcd_2_uchar(data[0]);
         time->minutes = bcd_2_uchar(data[1]);
@@ -437,43 +333,18 @@
 }
 
 
-/**********************************************************//**
-* Gets the calendar on DS3231
-*
-* On Entry:
-*     @param[in] calendar - pointer to struct for storing 
-*                           calendar data
-*
-* On Exit:
-*     @param[out] calendar - contains current integer rtc 
-*                            calendar data
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //see datasheet for calendar format
-* ds3231_calendar_t calendar = {1, 1, 1, 0}; 
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.get_calendar(&calendar);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::get_calendar(ds3231_calendar_t* calendar)
 {
     uint16_t rtn_val = 1;
     uint8_t data[4];
     
     data[0] = DAY;
-    rtn_val = write(w_adrs, (const char*) data, 1);
+    rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
     
     if(!rtn_val)
     {
-        rtn_val = read(r_adrs,(char *) data, 4);
+        rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
         
         calendar->day = bcd_2_uchar(data[0]);
         calendar->date = bcd_2_uchar(data[1]);
@@ -485,34 +356,7 @@
 }
 
 
-/**********************************************************//**
-* Get either Alarm1 or Alarm2 of DS3231
-*
-* On Entry:
-*     @param[in] alarm - pointer to struct for storing alarm 
-*                        data; 
-*
-*     @param[in] one_r_two - TRUE for Alarm1 and FALSE for 
-*                            Alarm2
-*
-* On Exit:
-*     @param[out] alarm - contains integer alarm data
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* //see ds3231.h for .members and datasheet for alarm format
-* ds3231_alrm_t alarm; 
-* uint16_t rtn_val;
-*
-* rtn_val = rtc.get_alarm(&alarm, FALSE);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::get_alarm(ds3231_alrm_t* alarm, bool one_r_two)
 {
     uint16_t rtn_val = 1;
@@ -521,11 +365,11 @@
     if(one_r_two)
     {
         data[0] = ALRM1_SECONDS;
-        rtn_val = write(w_adrs, (const char*) data, 1);
+        rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
         
         if(!rtn_val)
         {
-            rtn_val = read(r_adrs,(char *) data, 4);
+            rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
             
             alarm->seconds = bcd_2_uchar(data[0]&0x7F);
             alarm->am1 = (data[0]&ALRM_MASK);
@@ -559,11 +403,11 @@
     else
     {
         data[0] = ALRM2_MINUTES;
-        rtn_val = write(w_adrs, (const char*) data, 1);
+        rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
         
         if(!rtn_val)
         {
-            rtn_val = read(r_adrs,(char *) data, 4);
+            rtn_val = _p_i2c->read(_r_adrs,(char *) data, 4);
             
             alarm->minutes = bcd_2_uchar(data[0]&0x7F);
             alarm->am2 = (data[0]&ALRM_MASK);
@@ -597,42 +441,18 @@
 }
 
 
-/**********************************************************//**
-* Get control and status registers of DS3231
-*
-* On Entry:
-*     @param[in] data - pointer to struct for storing control 
-*                       and status register data
-*
-* On Exit:
-*     @param[out] data - contains control and status registers
-*                        data
-*     @return return value = 0 on success, non-0 on failure
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15);  
-* 
-* //do not use 0xAA, see datasheet for appropriate data 
-* ds3231_cntl_stat_t data = {0xAA, 0xAA}; 
-*
-* rtn_val = rtc.get_cntl_stat_reg(&data);
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::get_cntl_stat_reg(ds3231_cntl_stat_t* data)
 {
     uint16_t rtn_val = 1;
     uint8_t local_data[2];
     
     local_data[0] = CONTROL;
-    rtn_val = write(w_adrs, (const char*) local_data, 1);
+    rtn_val = _p_i2c->write(_w_adrs, (const char*) local_data, 1);
     
     if(!rtn_val)
     {
-        rtn_val = read(r_adrs,(char *) local_data, 2);
+        rtn_val = _p_i2c->read(_r_adrs,(char *) local_data, 2);
         
         data->control = local_data[0];
         data->status = local_data[1];
@@ -642,37 +462,18 @@
 }
 
 
-/**********************************************************//**
-* Get temperature data of DS3231
-*
-* On Entry:
-*
-* On Exit:
-*     @return return value = raw temperature data
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* uint16_t temp; 
-*
-* temp = rtc.get_temperature();
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::get_temperature(void)
 {
     uint16_t rtn_val = 1;
     uint8_t data[2];
     
     data[0] = MSB_TEMP;
-    rtn_val = write(w_adrs, (const char*) data, 1);
+    rtn_val = _p_i2c->write(_w_adrs, (const char*) data, 1);
     
     if(!rtn_val)
     {
-        read(r_adrs,(char *) data, 2);
+        _p_i2c->read(_r_adrs,(char *) data, 2);
         
         rtn_val = data[0] << 8;
         rtn_val |= data[1];
@@ -682,28 +483,7 @@
 }
 
 
-/**********************************************************//**
-* Get epoch time based on current RTC time and date.  
-* DS3231 must be configured and running before this fx is 
-* called
-*
-* On Entry:
-*
-* On Exit:
-*     @return return value = epoch time
-*
-* Example:
-* @code
-* 
-* //instantiate rtc object
-* Ds3231 rtc(D14, D15); 
-* 
-* time_t epoch_time; 
-*
-* epoch_time = rtc.get_epoch();
-*
-* @endcode
-**************************************************************/
+//*********************************************************************
 time_t Ds3231::get_epoch(void)
 {
     //system vars
@@ -749,16 +529,7 @@
 }
 
 
-/**********************************************************//**
-* Private mmber fx, converts unsigned char to BCD
-*
-* On Entry:
-*     @param[in] data - 0-255
-*
-* On Exit:
-*     @return bcd_result = BCD representation of data
-*
-**************************************************************/
+//*********************************************************************
 uint16_t Ds3231::uchar_2_bcd(uint8_t data)
 {
    uint16_t bcd_result = 0;
@@ -778,16 +549,7 @@
 }
 
 
-/**********************************************************//**
-* Private mmber fx, converts BCD to a uint8_t
-*
-* On Entry:
-*     @param[in] bcd - 0-99
-*
-* On Exit:
-*     @return rtn_val = integer rep. of BCD
-*
-**************************************************************/
+//*********************************************************************
 uint8_t Ds3231::bcd_2_uchar(uint8_t bcd)
 {
     uint8_t rtn_val = 0;