backlight.c 7.3 KB

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