• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Author: Jon Trulson <jtrulson@ics.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Adapted from Seeed Studio library:
6  * https://github.com/Seeed-Studio/RTC_DS1307
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining
9  * a copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sublicense, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be
17  * included in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  */
27 #pragma once
28 
29 #include <string>
30 #include <mraa/i2c.hpp>
31 
32 #define DS1307_I2C_BUS     0
33 #define DS1307_I2C_ADDR    0x68
34 
35 // Days of the week
36 #define DS1307_DAY_MON 1
37 #define DS1307_DAY_TUE 2
38 #define DS1307_DAY_WED 3
39 #define DS1307_DAY_THU 4
40 #define DS1307_DAY_FRI 5
41 #define DS1307_DAY_SAT 6
42 #define DS1307_DAY_SUN 7
43 
44 namespace upm {
45   /**
46    * @brief DS1307 Real-Time Clock library
47    * @defgroup ds1307 libupm-ds1307
48    * @ingroup seeed i2c time
49    */
50 
51   /**
52    * @library ds1307
53    * @sensor ds1307
54    * @comname Grove RTC (Real-Time Clock)
55    * @altname DS1307 RTC
56    * @type time
57    * @man seeed
58    * @con i2c
59    *
60    * @brief API for the DS1307 Real-Time CLock
61    *
62    * UPM module for the DS1307-based real-time clock. The clock can provide information
63    * about seconds, minutes, hours, day of the week, day of the month,
64    * month, and year. It can operate in either a 24-hour or a 12-hour format.
65    * This device can also output a square wave at 1Khz, 4Khz, 8Khz, and 32Khz.
66    * However, this capability is not implemented in this module.
67    *
68    * @image html ds1307.jpg
69    * @snippet ds1307.cxx Interesting
70    */
71   class DS1307 {
72   public:
73     /**
74      * DS1307 constructor
75      *
76      * @param bus I2C bus to use
77      */
78     DS1307(int bus);
79 
80     /**
81      * Loads all the time values
82      *
83      * @return True if time data loaded successfully
84      */
85     bool loadTime();
86 
87     /**
88      * Sets the time. You should call loadTime() beforehand to
89      * maintain consistency
90      *
91      * @return True if time is set successfully
92      */
93     bool setTime();
94 
95     /**
96      * Enables an oscillator on the clock.
97      *
98      * @return 0 (mraa::SUCCESS) if successful; non-zero otherwise
99      */
100     mraa::Result enableClock();
101 
102     /**
103      * Disables the oscillator on the clock. This prevents the clock
104      * from updating any time/date values
105      *
106      * @return 0 (mraa::SUCCESS) if successful; non-zero otherwise
107      */
108     mraa::Result disableClock();
109 
110     /**
111      * Writes value(s) into registers
112      *
113      * @param reg Register location to start writing into
114      * @param buffer Buffer for data storage
115      * @param len Number of bytes to write
116      * @return 0 (mraa::SUCCESS) if successful; non-zero otherwise
117      */
118     mraa::Result writeBytes(uint8_t reg, uint8_t *buffer, int len);
119 
120     /**
121      * Reads value(s) from registers
122      *
123      * @param reg Register location to start reading from
124      * @param buffer Buffer for data storage
125      * @param len Number of bytes to read
126      * @return Number of bytes read
127      */
128     int readBytes(uint8_t reg, uint8_t *buffer, int len);
129 
130     /**
131      * Converts a BCD value into decimal
132      *
133      * @param val BCD value to convert
134      * @return Converted decimal value
135      */
136     unsigned int bcdToDec(uint8_t val);
137 
138     /**
139      * Converts a decimal value into BCD
140      *
141      * @param val Decimal value to convert
142      * @return Converted BCD value
143      */
144     uint8_t decToBcd(unsigned int val);
145 
146     // These variables store the time data loaded with loadTime(), and
147     // are the source of data when setTime() is called.  It is a
148     // good idea to call loadTime() to set up the current values before
149     // calling setTime() to ensure RTC data is consistent
150 
151     /**
152      * Holds seconds
153      */
154     unsigned int seconds;
155     /**
156      * Holds minutes
157      */
158     unsigned int minutes;
159     /**
160      * Holds hours; 1-12 in the am/pm format, 0-23 otherwise
161      */
162     unsigned int hours;
163     /**
164      * Holds a day of the week; 1-7, where 1 is Sunday
165      */
166     unsigned int dayOfWeek;
167     /**
168      * Holds a day of the month, 1-31
169      */
170     unsigned int dayOfMonth;
171     /**
172      * Holds a month, 1-12
173      */
174     unsigned int month;
175     /**
176      * Holds a year, 0-99
177      */
178     unsigned int year;
179     /**
180      * True if the am/pm format is used, false otherwise
181      */
182     bool amPmMode;
183     /**
184      * For the am/pm format, it is true if it's pm, false otherwise
185      */
186     bool pm;
187 
188   private:
189     mraa::I2c m_i2c;
190   };
191 }
192 
193 
194