sd-card: Only add header to the results file if it’s empty
[brewing-logger:firmware.git] / rtc.c
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /*
3  * Brewing Logger.
4  * Copyright (C) Philip Withnall 2012 <philip@tecnocode.co.uk>
5  *
6  * Brewing Logger is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Brewing Logger is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Brewing Logger.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "config.h"
21
22 #include <avr/io.h>
23
24 #include "lib/ds3231.h"
25
26 #include "rtc.h"
27
28 /**
29  * \file
30  * \brief Real-time clock control.
31  *
32  * Initialisation and interaction of the real-time clock peripheral so that accurate timestamps can be extracted from it for LogEntrys. The clock is
33  * never initialised to an absolute time, but its use does guarantee that the relation between timestamps on log entries will always be accurate. The
34  * absolute timestamp of a log entry can then be calculated from the timestamp of the first log entry and the start time in the brew configuration.
35  */
36
37 /**
38  * \brief Initialise RTC.
39  *
40  * Initialise the I2C bus and the RTC chip (which is the only slave on that bus). This does not set the current time on the RTC chip, but does ensure
41  * that it's counting the progression of time.
42  */
43 void rtc_init (void)
44 {
45         uint8_t error_code;
46
47         /* Set up the TWI ports for the RTC. */
48         reset_rtc_i2c ();
49
50         /* Set the control and status registers. */
51         error_code = set_rtc_register_pointer (0x0e);
52         _delay_us (10); /* let the I2C bus recover */
53         if (error_code == 0) {
54                 /* Control and status registers. Disable everything we can. */
55                 const uint8_t control_values[] = { 0x04, 0x00 };
56                 error_code = write_i2c_device (0xD0, 2, (uint8_t *) &control_values);
57         }
58 }