aboutsummaryrefslogtreecommitdiff
path: root/FanController/fan_controller/hw/led.c
diff options
context:
space:
mode:
Diffstat (limited to 'FanController/fan_controller/hw/led.c')
-rw-r--r--FanController/fan_controller/hw/led.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/FanController/fan_controller/hw/led.c b/FanController/fan_controller/hw/led.c
new file mode 100644
index 0000000..221ac09
--- /dev/null
+++ b/FanController/fan_controller/hw/led.c
@@ -0,0 +1,184 @@
+/* Autor: Ján Sučan <jan@jansucan.sk>
+ *
+ * Zdrojove kody, ich casti a subory z nich vzniknute priamo alebo nepriamo
+ * (objektove subory, Intel Hex, ...) prosim nepouzivajte komercne, ani ako
+ * sucast komercnych diel. Vsetky ostatne pripady pouzitia su dovolene.
+ *
+ * Please don't use the source codes, their parts and files created from them
+ * directly or indirectly, (object files, Intel Hex files, ...) for commercial
+ * purposes, not even as a part of commercial products. All other use cases
+ * are allowed.
+ */
+
+#include <avr/io.h>
+
+#include <fan_controller/hw/io.h>
+#include <fan_controller/hw/led.h>
+#include <fan_controller/utils.h>
+
+static uint8_t led_green_bar_mask_from_value(uint8_t value);
+
+/** Naposledy pouzita maska pre nastavenie stlpca LED. Je pouziva pre detekciu zmeny zeleneho stlpca LED pre automaticke vypinanie LED. */
+static uint8_t led_green_bar_value_mask_last_set;
+
+/**
+ * @brief Inicializacia LED.
+ *
+ * Zelena LED nalavo bude svietit (s roznym jasom) vzdy, aby indikovala, ze je zariadenie zapnute.
+ */
+void
+led_init(void)
+{
+ io_on_green_led_0();
+}
+
+/**
+ * @brief Zasvietenie cervenej LED.
+ */
+void
+led_red_off(void)
+{
+ io_off_red_led();
+}
+
+/**
+ * @brief Zhasnutie cervenej LED.
+ */
+void
+led_red_on(void)
+{
+ io_on_red_led();
+}
+
+/**
+ * @brief Zhasnutie zelenej LED najviac nalavo.
+ */
+void
+led_min_green_off(void)
+{
+ io_off_green_led_0();
+}
+
+/**
+ * @brief Nastavenie svitu zelenej LED najviac nalavo.
+ *
+ * @param light Svit LED z rozsahu 0 az 255.
+ */
+void
+led_min_green_set(uint8_t light)
+{
+ io_set_green_led_0(light);
+}
+
+/**
+ * @brief Zasvietenie zelenej LED najviac nalavo.
+ */
+void
+led_min_green_on(void)
+{
+ io_on_green_led_0();
+}
+
+/**
+ * @brief Nastavenie zobrazenie jednotlivych LED zelenho stlpca (druhej zlava az poslednej zelenej LED) podla bitovej masky.
+ *
+ * 0. bit bitovej masky zodpoveda zelej LED druhej zlava a ostatne bity nasledujucim LED.
+ *
+ * @param mask Bitova maska rozsvietenia LED. Log. 0 je zhasnutie a log. 1 je zasvietenie prislusnej LED.
+ */
+void
+led_green_bar_show_by_mask(uint8_t mask)
+{
+ void (*led_on[LED_GREEN_BAR_LED_COUNT])(void) = {
+ io_on_green_led_1,
+ io_on_green_led_2,
+ io_on_green_led_3,
+ io_on_green_led_4,
+ io_on_green_led_5,
+ io_on_green_led_6,
+ io_on_green_led_7,
+ io_on_green_led_8
+ };
+
+ void (*led_off[LED_GREEN_BAR_LED_COUNT])(void) = {
+ io_off_green_led_1,
+ io_off_green_led_2,
+ io_off_green_led_3,
+ io_off_green_led_4,
+ io_off_green_led_5,
+ io_off_green_led_6,
+ io_off_green_led_7,
+ io_off_green_led_8
+ };
+
+ for (uint8_t i = 0; i < LED_GREEN_BAR_LED_COUNT; ++i) {
+ // Podla prislusneho bitu masky sa bud zavola funkcia pre zhasnutie alebo pre zasvietenie prislusnej LED
+ if (UTILS_IS_BIT_SET(mask, i)) {
+ (led_on[i])();
+ } else {
+ (led_off[i])();
+ }
+ }
+}
+
+/**
+ * @brief Prevod hodnoty z rozsahu 0 az 255 na masku pre rozsvietenie zeleneho stlpca LED.
+ *
+ * Cim vyssia hodnota tym viac stlpec zelenych LED narastie.
+ *
+ * @param value Hodnota z rozsahu 0 az 255.
+ * @return Maska pre rozsvietenie stlpca zelenych LED.
+ */
+uint8_t
+led_green_bar_mask_from_value(uint8_t value)
+{
+ // Hranice oblasti na ktore je rozdeleny rozsah 0 az 255
+ const uint8_t led_thresholds[] = {
+ 0+16, 32+16, 64+16, 96+16, 128+16, 160+16, 192+16, 224+16
+ };
+ // Pocet oblasti na ktore je rozdeleny rozsah 0 az 255
+ // Kazdej oblasi zodpoveda jedna zelena LED od druhej zlava az po poslednu zelenu. Spolu 8 zelenych LED.
+ const uint8_t threshold_count = sizeof(led_thresholds) / sizeof(led_thresholds[0]);
+
+ uint8_t mask = 0x00;
+
+ for (uint8_t i = 0; i < threshold_count; ++i) {
+ if (value > led_thresholds[i]) {
+ // Hodnota je vyssia ako prislusna hranica, prislusna LED sa nastavi v maske
+ UTILS_SET_BIT(mask, i);
+ } else {
+ // Hodnota nie je vyssia ako hranicna hodnota, nema zmysel dalej porovnavat
+ break;
+ }
+ }
+
+ return mask;
+}
+
+/**
+ * @brief Zisti, ci by hodnota pre nastavenie LED zmenila pocet zasvietenych LED zeleneho stlpca.
+ *
+ * @param value Hodnota z rozsahu 0 az 255.
+ * @retval true Hodnota by sposobila zmenu v rozsvieteni zelenych LED.
+ * @retval false Hodnota by nesposobila zmenu v rozsvieteni zelenych LED.
+ */
+bool
+led_green_bar_will_be_changed_by_value(uint8_t value)
+{
+ return (led_green_bar_value_mask_last_set != led_green_bar_mask_from_value(value));
+}
+
+/**
+ * @brief Rozsvietenie stlpca zelenych LED podla velkosti hodnoty od 0 po 255.
+ *
+ * Cim vyssia hodnota tym viac stlpec zelenych LED narastie.
+ *
+ * @param value Hodnota z rozsahu 0 az 255.
+ */
+void
+led_green_bar_show_by_value(uint8_t value)
+{
+ const uint8_t mask = led_green_bar_mask_from_value(value);
+ led_green_bar_show_by_mask(mask);
+ led_green_bar_value_mask_last_set = mask;
+}