backlight.c (7435B)
1 /* 2 Copyright 2013 Mathias Andersson <wraul@dbox.se> 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include "backlight.h" 19 #include "eeconfig.h" 20 #include "debug.h" 21 22 backlight_config_t backlight_config; 23 24 #ifndef BACKLIGHT_DEFAULT_ON 25 # define BACKLIGHT_DEFAULT_ON true 26 #endif 27 28 #ifndef BACKLIGHT_DEFAULT_LEVEL 29 # define BACKLIGHT_DEFAULT_LEVEL BACKLIGHT_LEVELS 30 #endif 31 32 #ifndef BACKLIGHT_DEFAULT_BREATHING 33 # define BACKLIGHT_DEFAULT_BREATHING false 34 #else 35 # undef BACKLIGHT_DEFAULT_BREATHING 36 # define BACKLIGHT_DEFAULT_BREATHING true 37 #endif 38 39 #ifdef BACKLIGHT_BREATHING 40 // TODO: migrate to backlight_config_t 41 static uint8_t breathing_period = BREATHING_PERIOD; 42 #endif 43 44 static void backlight_check_config(void) { 45 /* Add some out of bound checks for backlight config */ 46 47 if (backlight_config.level > BACKLIGHT_LEVELS) { 48 backlight_config.level = BACKLIGHT_LEVELS; 49 } 50 } 51 52 /** \brief Backlight initialization 53 * 54 * FIXME: needs doc 55 */ 56 void backlight_init(void) { 57 eeconfig_read_backlight(&backlight_config); 58 if (!backlight_config.valid) { 59 dprintf("backlight_init backlight_config.valid = 0. Write default values to EEPROM.\n"); 60 eeconfig_update_backlight_default(); 61 } 62 backlight_check_config(); 63 64 backlight_set(backlight_config.enable ? backlight_config.level : 0); 65 } 66 67 /** \brief Backlight increase 68 * 69 * FIXME: needs doc 70 */ 71 void backlight_increase(void) { 72 if (backlight_config.level < BACKLIGHT_LEVELS) { 73 backlight_config.level++; 74 } 75 backlight_config.enable = 1; 76 eeconfig_update_backlight(&backlight_config); 77 dprintf("backlight increase: %u\n", backlight_config.level); 78 backlight_set(backlight_config.level); 79 } 80 81 /** \brief Backlight decrease 82 * 83 * FIXME: needs doc 84 */ 85 void backlight_decrease(void) { 86 if (backlight_config.level > 0) { 87 backlight_config.level--; 88 backlight_config.enable = !!backlight_config.level; 89 eeconfig_update_backlight(&backlight_config); 90 } 91 dprintf("backlight decrease: %u\n", backlight_config.level); 92 backlight_set(backlight_config.level); 93 } 94 95 /** \brief Backlight toggle 96 * 97 * FIXME: needs doc 98 */ 99 void backlight_toggle(void) { 100 bool enabled = backlight_config.enable; 101 dprintf("backlight toggle: %u\n", enabled); 102 if (enabled) 103 backlight_disable(); 104 else 105 backlight_enable(); 106 } 107 108 /** \brief Enable backlight 109 * 110 * FIXME: needs doc 111 */ 112 void backlight_enable(void) { 113 if (backlight_config.enable) return; // do nothing if backlight is already on 114 115 backlight_config.enable = true; 116 if (backlight_config.raw == 1) // enabled but level == 0 117 backlight_config.level = 1; 118 eeconfig_update_backlight(&backlight_config); 119 dprintf("backlight enable\n"); 120 backlight_set(backlight_config.level); 121 } 122 123 /** \brief Disable backlight 124 * 125 * FIXME: needs doc 126 */ 127 void backlight_disable(void) { 128 if (!backlight_config.enable) return; // do nothing if backlight is already off 129 130 backlight_config.enable = false; 131 eeconfig_update_backlight(&backlight_config); 132 dprintf("backlight disable\n"); 133 backlight_set(0); 134 } 135 136 /** /brief Get the backlight status 137 * 138 * FIXME: needs doc 139 */ 140 bool is_backlight_enabled(void) { 141 return backlight_config.enable; 142 } 143 144 /** \brief Backlight step through levels 145 * 146 * FIXME: needs doc 147 */ 148 void backlight_step(void) { 149 backlight_config.level++; 150 if (backlight_config.level > BACKLIGHT_LEVELS) { 151 backlight_config.level = 0; 152 } 153 backlight_config.enable = !!backlight_config.level; 154 eeconfig_update_backlight(&backlight_config); 155 dprintf("backlight step: %u\n", backlight_config.level); 156 backlight_set(backlight_config.level); 157 } 158 159 /** \brief Backlight set level without EEPROM update 160 * 161 */ 162 void backlight_level_noeeprom(uint8_t level) { 163 if (level > BACKLIGHT_LEVELS) level = BACKLIGHT_LEVELS; 164 backlight_config.level = level; 165 backlight_config.enable = !!backlight_config.level; 166 backlight_set(backlight_config.level); 167 } 168 169 /** \brief Backlight set level 170 * 171 * FIXME: needs doc 172 */ 173 void backlight_level(uint8_t level) { 174 backlight_level_noeeprom(level); 175 eeconfig_update_backlight(&backlight_config); 176 } 177 178 void eeconfig_update_backlight_current(void) { 179 eeconfig_update_backlight(&backlight_config); 180 } 181 182 void eeconfig_update_backlight_default(void) { 183 backlight_config.valid = true; 184 backlight_config.enable = BACKLIGHT_DEFAULT_ON; 185 backlight_config.breathing = BACKLIGHT_DEFAULT_BREATHING; 186 backlight_config.level = BACKLIGHT_DEFAULT_LEVEL; 187 eeconfig_update_backlight(&backlight_config); 188 } 189 190 /** \brief Get backlight level 191 * 192 * FIXME: needs doc 193 */ 194 uint8_t get_backlight_level(void) { 195 return backlight_config.level; 196 } 197 198 #ifdef BACKLIGHT_BREATHING 199 /** \brief Backlight breathing toggle 200 * 201 * FIXME: needs doc 202 */ 203 void backlight_toggle_breathing(void) { 204 bool breathing = backlight_config.breathing; 205 dprintf("backlight breathing toggle: %u\n", breathing); 206 if (breathing) 207 backlight_disable_breathing(); 208 else 209 backlight_enable_breathing(); 210 } 211 212 /** \brief Enable backlight breathing 213 * 214 * FIXME: needs doc 215 */ 216 void backlight_enable_breathing(void) { 217 if (backlight_config.breathing) return; // do nothing if breathing is already on 218 219 backlight_config.breathing = true; 220 eeconfig_update_backlight(&backlight_config); 221 dprintf("backlight breathing enable\n"); 222 breathing_enable(); 223 } 224 225 /** \brief Disable backlight breathing 226 * 227 * FIXME: needs doc 228 */ 229 void backlight_disable_breathing(void) { 230 if (!backlight_config.breathing) return; // do nothing if breathing is already off 231 232 backlight_config.breathing = false; 233 eeconfig_update_backlight(&backlight_config); 234 dprintf("backlight breathing disable\n"); 235 breathing_disable(); 236 } 237 238 /** \brief Get the backlight breathing status 239 * 240 * FIXME: needs doc 241 */ 242 bool is_backlight_breathing(void) { 243 return backlight_config.breathing; 244 } 245 246 // following are marked as weak purely for backwards compatibility 247 __attribute__((weak)) void breathing_period_set(uint8_t value) { 248 breathing_period = value ? value : 1; 249 } 250 251 __attribute__((weak)) uint8_t get_breathing_period(void) { 252 return breathing_period; 253 } 254 255 __attribute__((weak)) void breathing_period_default(void) { 256 breathing_period_set(BREATHING_PERIOD); 257 } 258 259 __attribute__((weak)) void breathing_period_inc(void) { 260 breathing_period_set(breathing_period + 1); 261 } 262 263 __attribute__((weak)) void breathing_period_dec(void) { 264 breathing_period_set(breathing_period - 1); 265 } 266 267 __attribute__((weak)) void breathing_toggle(void) { 268 if (is_breathing()) 269 breathing_disable(); 270 else 271 breathing_enable(); 272 } 273 274 #endif 275 276 // defaults for backlight api 277 __attribute__((weak)) void backlight_init_ports(void) {} 278 279 __attribute__((weak)) void backlight_set(uint8_t level) {} 280 281 __attribute__((weak)) void backlight_task(void) {}