backlight.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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 "quantum.h"
  15. #include "backlight.h"
  16. #include "eeconfig.h"
  17. #include "debug.h"
  18. #if defined(STM32F0XX) || defined(STM32F0xx)
  19. # pragma message("Backlight support for STMF072 has had limited testing, YMMV. If unsure, set 'BACKLIGHT_ENABLE = no' in your rules.mk")
  20. #endif
  21. backlight_config_t backlight_config;
  22. #ifdef BACKLIGHT_BREATHING
  23. // TODO: migrate to backlight_config_t
  24. static uint8_t breathing_period = BREATHING_PERIOD;
  25. #endif
  26. /** \brief Backlight initialization
  27. *
  28. * FIXME: needs doc
  29. */
  30. void backlight_init(void) {
  31. /* check signature */
  32. if (!eeconfig_is_enabled()) {
  33. eeconfig_init();
  34. }
  35. backlight_config.raw = eeconfig_read_backlight();
  36. if (backlight_config.level > BACKLIGHT_LEVELS) {
  37. backlight_config.level = BACKLIGHT_LEVELS;
  38. }
  39. backlight_set(backlight_config.enable ? backlight_config.level : 0);
  40. }
  41. /** \brief Backlight increase
  42. *
  43. * FIXME: needs doc
  44. */
  45. void backlight_increase(void) {
  46. if (backlight_config.level < BACKLIGHT_LEVELS) {
  47. backlight_config.level++;
  48. }
  49. backlight_config.enable = 1;
  50. eeconfig_update_backlight(backlight_config.raw);
  51. dprintf("backlight increase: %u\n", backlight_config.level);
  52. backlight_set(backlight_config.level);
  53. }
  54. /** \brief Backlight decrease
  55. *
  56. * FIXME: needs doc
  57. */
  58. void backlight_decrease(void) {
  59. if (backlight_config.level > 0) {
  60. backlight_config.level--;
  61. backlight_config.enable = !!backlight_config.level;
  62. eeconfig_update_backlight(backlight_config.raw);
  63. }
  64. dprintf("backlight decrease: %u\n", backlight_config.level);
  65. backlight_set(backlight_config.level);
  66. }
  67. /** \brief Backlight toggle
  68. *
  69. * FIXME: needs doc
  70. */
  71. void backlight_toggle(void) {
  72. bool enabled = backlight_config.enable;
  73. dprintf("backlight toggle: %u\n", enabled);
  74. if (enabled)
  75. backlight_disable();
  76. else
  77. backlight_enable();
  78. }
  79. /** \brief Enable backlight
  80. *
  81. * FIXME: needs doc
  82. */
  83. void backlight_enable(void) {
  84. if (backlight_config.enable) return; // do nothing if backlight is already on
  85. backlight_config.enable = true;
  86. if (backlight_config.raw == 1) // enabled but level == 0
  87. backlight_config.level = 1;
  88. eeconfig_update_backlight(backlight_config.raw);
  89. dprintf("backlight enable\n");
  90. backlight_set(backlight_config.level);
  91. }
  92. /** \brief Disable backlight
  93. *
  94. * FIXME: needs doc
  95. */
  96. void backlight_disable(void) {
  97. if (!backlight_config.enable) return; // do nothing if backlight is already off
  98. backlight_config.enable = false;
  99. eeconfig_update_backlight(backlight_config.raw);
  100. dprintf("backlight disable\n");
  101. backlight_set(0);
  102. }
  103. /** /brief Get the backlight status
  104. *
  105. * FIXME: needs doc
  106. */
  107. bool is_backlight_enabled(void) { return backlight_config.enable; }
  108. /** \brief Backlight step through levels
  109. *
  110. * FIXME: needs doc
  111. */
  112. void backlight_step(void) {
  113. backlight_config.level++;
  114. if (backlight_config.level > BACKLIGHT_LEVELS) {
  115. backlight_config.level = 0;
  116. }
  117. backlight_config.enable = !!backlight_config.level;
  118. eeconfig_update_backlight(backlight_config.raw);
  119. dprintf("backlight step: %u\n", backlight_config.level);
  120. backlight_set(backlight_config.level);
  121. }
  122. /** \brief Backlight set level without EEPROM update
  123. *
  124. */
  125. void backlight_level_noeeprom(uint8_t level) {
  126. if (level > BACKLIGHT_LEVELS) level = BACKLIGHT_LEVELS;
  127. backlight_config.level = level;
  128. backlight_config.enable = !!backlight_config.level;
  129. backlight_set(backlight_config.level);
  130. }
  131. /** \brief Backlight set level
  132. *
  133. * FIXME: needs doc
  134. */
  135. void backlight_level(uint8_t level) {
  136. backlight_level_noeeprom(level);
  137. eeconfig_update_backlight(backlight_config.raw);
  138. }
  139. /** \brief Update current backlight state to EEPROM
  140. *
  141. */
  142. void eeconfig_update_backlight_current(void) { eeconfig_update_backlight(backlight_config.raw); }
  143. /** \brief Get backlight level
  144. *
  145. * FIXME: needs doc
  146. */
  147. uint8_t get_backlight_level(void) { return backlight_config.level; }
  148. #ifdef BACKLIGHT_BREATHING
  149. /** \brief Backlight breathing toggle
  150. *
  151. * FIXME: needs doc
  152. */
  153. void backlight_toggle_breathing(void) {
  154. bool breathing = backlight_config.breathing;
  155. dprintf("backlight breathing toggle: %u\n", breathing);
  156. if (breathing)
  157. backlight_disable_breathing();
  158. else
  159. backlight_enable_breathing();
  160. }
  161. /** \brief Enable backlight breathing
  162. *
  163. * FIXME: needs doc
  164. */
  165. void backlight_enable_breathing(void) {
  166. if (backlight_config.breathing) return; // do nothing if breathing is already on
  167. backlight_config.breathing = true;
  168. eeconfig_update_backlight(backlight_config.raw);
  169. dprintf("backlight breathing enable\n");
  170. breathing_enable();
  171. }
  172. /** \brief Disable backlight breathing
  173. *
  174. * FIXME: needs doc
  175. */
  176. void backlight_disable_breathing(void) {
  177. if (!backlight_config.breathing) return; // do nothing if breathing is already off
  178. backlight_config.breathing = false;
  179. eeconfig_update_backlight(backlight_config.raw);
  180. dprintf("backlight breathing disable\n");
  181. breathing_disable();
  182. }
  183. /** \brief Get the backlight breathing status
  184. *
  185. * FIXME: needs doc
  186. */
  187. bool is_backlight_breathing(void) { return backlight_config.breathing; }
  188. // following are marked as weak purely for backwards compatibility
  189. __attribute__((weak)) void breathing_period_set(uint8_t value) { breathing_period = value ? value : 1; }
  190. __attribute__((weak)) uint8_t get_breathing_period(void) { return breathing_period; }
  191. __attribute__((weak)) void breathing_period_default(void) { breathing_period_set(BREATHING_PERIOD); }
  192. __attribute__((weak)) void breathing_period_inc(void) { breathing_period_set(breathing_period + 1); }
  193. __attribute__((weak)) void breathing_period_dec(void) { breathing_period_set(breathing_period - 1); }
  194. __attribute__((weak)) void breathing_toggle(void) {
  195. if (is_breathing())
  196. breathing_disable();
  197. else
  198. breathing_enable();
  199. }
  200. #endif
  201. // defaults for backlight api
  202. __attribute__((weak)) void backlight_init_ports(void) {}
  203. __attribute__((weak)) void backlight_set(uint8_t level) {}
  204. __attribute__((weak)) void backlight_task(void) {}