power: Split sensor power management code out into power.[ch]
[brewing-logger:firmware.git] / power.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 #include <util/delay.h>
24
25 #include "adc.h"
26 #include "power.h"
27
28 /**
29  * \file
30  * \brief Power management.
31  *
32  * Handling of power domains (mainly the sensor power domain), plus disabling unused microcontroller features at initialisation time.
33  */
34
35 /**
36  * \brief Initialise power management.
37  *
38  * Set up power management, including the sensor power domain. Initialise the sensor power domain to be off by default.
39  */
40 void power_init (void)
41 {
42         SENSOR_POWER_DDR |= (1 << SENSOR_POWER_OUT);
43         sensor_power_set_state (SENSOR_POWER_OFF);
44
45         /* Turn off various other bits of hardware we never use. */
46         ACSR &= ~(1 << ACIE); /* analogue comparator */
47         ACSR |= (1 << ACD);
48         DIDR1 |= (1 << AIN1D) | (1 << AIN0D);
49
50         DIDR0 = 0xff; /* ADC digital inputs */
51 }
52
53 /**
54  * \brief Turn sensor power on/off.
55  *
56  * Turn the power supply for the sensors and associated hardware (such as the ADC) on or off.
57  */
58 void sensor_power_set_state (SensorPowerState new_state)
59 {
60         switch (new_state) {
61                 case SENSOR_POWER_ON:
62                         SENSOR_POWER_PORT |= (1 << SENSOR_POWER_OUT);
63                         adc_power_up ();
64                         _delay_us (600); /* gas sensor requires 600us to stabilise */
65                         break;
66                 case SENSOR_POWER_OFF:
67                         adc_power_down ();
68                         SENSOR_POWER_PORT &= ~(1 << SENSOR_POWER_OUT);
69                         break;
70                 default:
71                         ASSERT_NOT_REACHED ();
72         }
73 }
74
75 /**
76  * \brief Get sensor power state.
77  *
78  * Get the state of the power supply to the sensors.
79  */
80 SensorPowerState sensor_power_get_state (void)
81 {
82         return (SENSOR_POWER_PORT & (1 << SENSOR_POWER_OUT)) ? SENSOR_POWER_ON : SENSOR_POWER_OFF;
83 }