tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
commit 0dcb074f4b49a65b570ee2d8a1de21ddffcddd53
parent 98bc683a535b86acafdc9b1ef82f8dd04ee671f2
Author: Martin Klöckner <mjkloeckner@gmail.com>
Date:   Sat,  4 Apr 2026 13:44:07 -0300

Usar `static` y `const` siempre que sea posible

Diffstat:
Mfirmware/app/inc/task_buttons_attribute.h | 2--
Mfirmware/app/inc/task_menu_attribute.h | 2--
Mfirmware/app/inc/task_system_attribute.h | 2--
Mfirmware/app/src/display_i2c.c | 44++++++++++++++++++++++----------------------
Mfirmware/app/src/ds18b20.c | 87++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mfirmware/app/src/task_buttons.c | 8++++----
Mfirmware/app/src/task_buzzer.c | 22++++++++++++----------
Mfirmware/app/src/task_leds.c | 21+++++++++------------
Mfirmware/app/src/task_menu.c | 36++++++++++++++++++++----------------
Mfirmware/app/src/task_menu_interface.c | 3+--
Mfirmware/app/src/task_system.c | 75++++++++++++++++++++++++++++++++++++++-------------------------------------
Mfirmware/app/src/task_system_interface.c | 3+--
Mfirmware/app/src/task_temp_ctrl.c | 21+++++++++++++++------
13 files changed, 170 insertions(+), 156 deletions(-)
diff --git a/firmware/app/inc/task_buttons_attribute.h b/firmware/app/inc/task_buttons_attribute.h
@@ -91,8 +91,6 @@ typedef struct {
     task_buttons_ev_t event;
 } task_buttons_dta_t;
 
-extern task_buttons_dta_t task_buttons_dta_list[];
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/firmware/app/inc/task_menu_attribute.h b/firmware/app/inc/task_menu_attribute.h
@@ -52,8 +52,6 @@ typedef struct {
     bool event_flag;
 } task_menu_dta_t;
 
-extern task_menu_dta_t task_menu_dta;
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/firmware/app/inc/task_system_attribute.h b/firmware/app/inc/task_system_attribute.h
@@ -54,8 +54,6 @@ typedef struct {
     bool             event_flag;
 } task_system_dta_t;
 
-extern task_system_dta_t task_system_dta;
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/firmware/app/src/display_i2c.c b/firmware/app/src/display_i2c.c
@@ -48,10 +48,6 @@
 #define DISPLAY_LINE4_FIRST_CHAR_ADDR 84
 
 // Private variables
-static bool b_display_i2c_dma_done;
-static uint32_t g_display_i2c_tick;
-static uint8_t async_buffer[4];
-
 typedef enum {
     DISPLAY_CMD,
     DISPLAY_CHAR,
@@ -63,20 +59,24 @@ typedef struct {
     uint8_t data;
 } display_data_t;
 
-static struct {
+typedef struct {
     uint8_t head;
     uint8_t tail;
     uint8_t count;
     display_data_t queue[DISPLAY_ASYNC_QUEUE_LEN];
-} display_async_queue;
+} display_async_queue_t;
 
-// Private functions declaration
-void display_i2c_send_cmd(uint8_t cmd);
-void display_i2c_send_data(uint8_t data);
+static bool b_display_i2c_dma_done;
+static uint32_t g_display_i2c_tick;
+static uint8_t async_buffer[4];
+static display_async_queue_t display_async_queue;
 
-void display_i2c_async_write(display_data_t data);
-void display_i2c_async_enqueue(display_data_t data);
-display_data_t display_i2c_async_dequeue(void);
+// Private functions declaration
+static void display_i2c_send_cmd(uint8_t cmd);
+static void display_i2c_send_data(uint8_t data);
+static void display_i2c_async_write(display_data_t data);
+static void display_i2c_async_enqueue(display_data_t data);
+static display_data_t display_i2c_async_dequeue(void);
 
 // Public functions definition
 void display_i2c_init(void)
@@ -201,21 +201,21 @@ bool display_i2c_async_done(void)
 
 void display_i2c_async_tick(void)
 {
-    if (0 == g_display_i2c_tick)
+    if (0 < g_display_i2c_tick)
+    {
+        g_display_i2c_tick--;
+    }
+    else
     {
         if ((display_async_queue.count != 0) && b_display_i2c_dma_done)
         {
             display_i2c_async_write(display_i2c_async_dequeue());
         } 
     }
-    else
-    {
-        g_display_i2c_tick--;
-    }
 }
 
 // Private functions definitions
-void display_i2c_send_cmd(uint8_t cmd)
+static void display_i2c_send_cmd(uint8_t cmd)
 {
     uint8_t buffer[4], data_u, data_l;
 
@@ -230,7 +230,7 @@ void display_i2c_send_cmd(uint8_t cmd)
     HAL_I2C_Master_Transmit(&hi2c1, DISPLAY_I2C_ADDRESS<<1, (uint8_t*)buffer, 4, 100);
 }
 
-void display_i2c_send_data(uint8_t data)
+static void display_i2c_send_data(uint8_t data)
 {
     uint8_t data_u, data_l;
     uint8_t data_t[4];
@@ -246,7 +246,7 @@ void display_i2c_send_data(uint8_t data)
     HAL_I2C_Master_Transmit(&hi2c1, DISPLAY_I2C_ADDRESS<<1, (uint8_t *)data_t, 4, 100);
 }
 
-void display_i2c_async_write(display_data_t data)
+static void display_i2c_async_write(display_data_t data)
 {
     uint8_t data_u, data_l;
     memset(async_buffer, 0, sizeof(async_buffer));
@@ -289,13 +289,13 @@ void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
     b_display_i2c_dma_done = true;
 }
 
-void display_i2c_async_enqueue(display_data_t data)
+static void display_i2c_async_enqueue(display_data_t data)
 {
     display_async_queue.count++;
     display_async_queue.queue[display_async_queue.head++] = data;
 }
 
-display_data_t display_i2c_async_dequeue(void)
+static display_data_t display_i2c_async_dequeue(void)
 {
     display_async_queue.count--;
     return display_async_queue.queue[display_async_queue.tail++];
diff --git a/firmware/app/src/ds18b20.c b/firmware/app/src/ds18b20.c
@@ -56,29 +56,28 @@ static struct {
 } ds18b20_async_queue;
 
 // Private global variables
-uint32_t g_ds18b20_tick;
-uint16_t g_ds18b20_temp, g_ds18b20_update_count;
-uint8_t g_temp_lsb, g_temp_msb;
-uint8_t g_ds18b20_tx_buffer[8], g_ds18b20_rx_buffer[8];
-bool b_ds18b20_dma_tx_done, b_ds18b20_dma_rx_done;
-bool b_ds18b20_rx_data_processed, b_ds18b20_async_temp_ready;
+static uint32_t g_ds18b20_tick;
+static uint16_t g_ds18b20_temp, g_ds18b20_update_count;
+static uint8_t g_temp_lsb, g_temp_msb;
+static uint8_t g_ds18b20_tx_buffer[8], g_ds18b20_rx_buffer[8];
+static bool b_ds18b20_dma_tx_done, b_ds18b20_dma_rx_done;
+static bool b_ds18b20_rx_data_processed, b_ds18b20_async_temp_ready;
 
 // Private functions declaration
 //// Blocking calls
-void ds18b20_write(uint8_t data);
-void ds18b20_read_temp(void);
-void ds18b20_set_resolution(uint8_t resolution);
-uint8_t ds18b20_get_rx_byte(void);
-void ds18b20_byte_to_array_of_bytes(uint8_t byte, uint8_t *array);
+static bool ds18b20_reset(void);
+static void ds18b20_write(uint8_t data);
+static void ds18b20_set_resolution(uint8_t resolution);
+static uint8_t ds18b20_get_rx_byte(void);
+static void ds18b20_byte_to_array_of_bytes(uint8_t byte, uint8_t *array);
 //// Asynchronous calls
-void ds18b20_dma_write(ds18b20_data_t data);
-void ds18b20_async_reset(void);
-void ds18b20_async_enqueue(ds18b20_data_t data);
-ds18b20_data_t ds18b20_async_dequeue(void);
-ds18b20_data_t ds18b20_async_queue_head(void);
-ds18b20_data_t ds18b20_async_queue_tail(void);
-
-uint8_t ds18b20_reset(void)
+static void ds18b20_dma_write(ds18b20_data_t data);
+static void ds18b20_async_reset(void);
+static void ds18b20_async_enqueue(ds18b20_data_t data);
+static ds18b20_data_t ds18b20_async_dequeue(void);
+static ds18b20_data_t ds18b20_async_queue_tail(void);
+
+static bool ds18b20_reset(void)
 {
     uint8_t data = 0xF0;
 
@@ -91,16 +90,16 @@ uint8_t ds18b20_reset(void)
     {
         // Initialization failed
         LOGGER_ERROR("Couldn't read temperature sensor");
-        return 1;
+        return true;
     }
 
     __HAL_UART_DISABLE(&huart1);
     LL_USART_SetBaudRate(USART1, HAL_RCC_GetPCLK2Freq(), G_DATA_BAUDRATE);
     __HAL_UART_ENABLE(&huart1);
-    return 0;
+    return false;
 }
 
-void ds18b20_set_resolution(uint8_t resolution)
+static void ds18b20_set_resolution(uint8_t resolution)
 {
     uint8_t config;
 
@@ -147,21 +146,21 @@ void ds18b20_init(void)
     ds18b20_async_queue.count = 0;
 }
 
-void ds18b20_write(uint8_t data)
+static void ds18b20_write(uint8_t data)
 {
     uint8_t buffer[8];
     ds18b20_byte_to_array_of_bytes(data, buffer);
     HAL_UART_Transmit(&huart1, buffer, 8, 100);
 }
 
-void ds18b20_async_reset(void)
+static void ds18b20_async_reset(void)
 {
     ds18b20_async_enqueue((ds18b20_data_t){DS18B20_QUEUE_SET_BAUD_SLOW});
     ds18b20_async_enqueue((ds18b20_data_t){DS18B20_QUEUE_RESET});
     ds18b20_async_enqueue((ds18b20_data_t){DS18B20_QUEUE_SET_BAUD_FAST});
 }
 
-void ds18b20_dma_write(ds18b20_data_t data)
+static void ds18b20_dma_write(ds18b20_data_t data)
 {
     switch (data.type)
     {
@@ -219,7 +218,7 @@ void ds18b20_dma_write(ds18b20_data_t data)
     }
 }
 
-void ds18b20_byte_to_array_of_bytes(uint8_t byte, uint8_t *array)
+static void ds18b20_byte_to_array_of_bytes(uint8_t byte, uint8_t *array)
 {
     for (uint8_t i = 0; i < 8; ++i)
     {
@@ -227,7 +226,7 @@ void ds18b20_byte_to_array_of_bytes(uint8_t byte, uint8_t *array)
     }
 }
 
-uint8_t ds18b20_get_rx_byte(void)
+static uint8_t ds18b20_get_rx_byte(void)
 {
     uint8_t received_value = 0;
 
@@ -263,7 +262,11 @@ void ds18b20_async_tick(void)
     }
     else
     {
-        if (0 == g_ds18b20_tick)
+        if (0 < g_ds18b20_tick)
+        {
+            g_ds18b20_tick--;
+        }
+        else
         {
             if ((0 != ds18b20_async_queue.count)
                     && b_ds18b20_dma_tx_done
@@ -272,10 +275,6 @@ void ds18b20_async_tick(void)
                 ds18b20_dma_write(ds18b20_async_dequeue());
             }
         }
-        else
-        {
-            g_ds18b20_tick--;
-        }
     }
 }
 
@@ -310,26 +309,36 @@ int16_t ds18b20_async_get_temp(void)
     return g_ds18b20_temp;
 }
 
-void ds18b20_async_enqueue(ds18b20_data_t data)
+static void ds18b20_async_enqueue(ds18b20_data_t data)
 {
     ds18b20_async_queue.count++;
     ds18b20_async_queue.queue[ds18b20_async_queue.head++] = data;
 }
 
-ds18b20_data_t ds18b20_async_dequeue(void)
+#if 0
+static ds18b20_data_t ds18b20_async_dequeue(void)
 {
     ds18b20_async_queue.count--;
-    return ds18b20_async_queue.queue[ds18b20_async_queue.tail++];
+    ds18b20_data_t ret = ds18b20_async_queue.queue[ds18b20_async_queue.tail];
+
+    if ((DS18B20_QUEUE_READ_LSB != ret.type) || (DS18B20_QUEUE_READ_LSB != ret.type))
+    {
+        ds18b20_async_queue.tail++;
+    }
+
+    return res;
 }
+#endif
 
-ds18b20_data_t ds18b20_async_queue_tail(void)
+static ds18b20_data_t ds18b20_async_dequeue(void)
 {
-    return ds18b20_async_queue.queue[(ds18b20_async_queue.tail) - 1];
+    ds18b20_async_queue.count--;
+    return ds18b20_async_queue.queue[ds18b20_async_queue.tail++];
 }
 
-ds18b20_data_t ds18b20_async_queue_head(void)
+static ds18b20_data_t ds18b20_async_queue_tail(void)
 {
-    return ds18b20_async_queue.queue[ds18b20_async_queue.head];
+    return ds18b20_async_queue.queue[(ds18b20_async_queue.tail) - 1];
 }
 
 // Callbacks definition
diff --git a/firmware/app/src/task_buttons.c b/firmware/app/src/task_buttons.c
@@ -26,7 +26,7 @@
 #define BTN_X_PRESSED GPIO_PIN_RESET
 #define BTN_X_HOVER   GPIO_PIN_SET
 
-const task_buttons_cfg_t task_buttons_cfg_list[] = {
+static const task_buttons_cfg_t task_buttons_cfg_list[] = {
     {ID_BTN_A, BTN_A_GPIO_Port, BTN_A_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_A_IDLE, EV_SYS_BTN_A_ACTIVE},
     {ID_BTN_B, BTN_B_GPIO_Port, BTN_B_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_B_IDLE, EV_SYS_BTN_B_ACTIVE},
     {ID_BTN_C, BTN_C_GPIO_Port, BTN_C_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_C_IDLE, EV_SYS_BTN_C_ACTIVE},
@@ -35,7 +35,7 @@ const task_buttons_cfg_t task_buttons_cfg_list[] = {
 
 #define BUTTONS_CFG_QTY (sizeof(task_buttons_cfg_list)/sizeof(task_buttons_cfg_t))
 
-task_buttons_dta_t task_buttons_dta_list[] = {
+static task_buttons_dta_t task_buttons_dta_list[] = {
     {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
     {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
     {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
@@ -48,7 +48,7 @@ task_buttons_dta_t task_buttons_dta_list[] = {
 volatile uint32_t g_task_buttons_tick_cnt;
 
 // Private functions declaration
-void task_buttons_statechart(void);
+static void task_buttons_statechart(void);
 
 void task_buttons_init(void *parameters)
 {
@@ -99,7 +99,7 @@ void task_buttons_update(void *parameters)
     }
 }
 
-void task_buttons_statechart(void)
+static void task_buttons_statechart(void)
 {
     uint32_t index;
     const task_buttons_cfg_t *p_task_buttons_cfg;
diff --git a/firmware/app/src/task_buzzer.c b/firmware/app/src/task_buzzer.c
@@ -20,25 +20,24 @@
 #define SHORT_BEEP_MS 35ul
 #define LONG_BEEP_MS  500ul
 
-const task_buzzer_cfg_t task_buzzer_cfg_list[] = {
+static const task_buzzer_cfg_t task_buzzer_cfg_list[] = {
     {ID_BUZ_A, &htim3, TIM_CHANNEL_1, BUZZER_FREQ, SHORT_BEEP_MS, LONG_BEEP_MS}
 };
 
 #define BUZZER_CFG_QTY (sizeof(task_buzzer_cfg_list)/sizeof(task_buzzer_cfg_t))
 
+// Private functions declaration
+static void task_buzzer_statechart(void);
+static uint16_t task_buzzer_freq_to_pres(uint16_t freq);
+
+// Exported data definition
+volatile uint32_t g_task_buzzer_tick_cnt;
 task_buzzer_dta_t task_buzzer_dta_list[] = {
     {TICK_INI_MS, ST_BUZ_XX_OFF, EV_BUZ_XX_OFF, false},
 };
 
 #define BUZZER_DTA_QTY (sizeof(task_buzzer_dta_list)/sizeof(task_buzzer_dta_t))
 
-// Private functions declaration
-void task_buzzer_statechart(void);
-uint16_t task_buzzer_freq_to_pres(uint16_t freq);
-
-// External data declaration
-volatile uint32_t g_task_buzzer_tick_cnt;
-
 // External functions definition
 void task_buzzer_init(void *parameters)
 {
@@ -97,7 +96,7 @@ void task_buzzer_update(void *parameters)
     }
 }
 
-void task_buzzer_statechart(void)
+static void task_buzzer_statechart(void)
 {
     uint32_t index;
     const task_buzzer_cfg_t *p_task_buzzer_cfg;
@@ -189,10 +188,13 @@ void task_buzzer_statechart(void)
     }
 }
 
+
+// TODO: replace this defines with HAL variables/functions which returns the
+// APB1 timer clock and timer 3 auto reload value (if exists)
 #define APB1_TIMER_CLOCK 64000000UL
 #define TIMER3_ARR       8000UL
 
-uint16_t task_buzzer_freq_to_pres(uint16_t freq)
+static uint16_t task_buzzer_freq_to_pres(uint16_t freq)
 {
     if (0 == freq)
     {
diff --git a/firmware/app/src/task_leds.c b/firmware/app/src/task_leds.c
@@ -8,11 +8,9 @@
 /* Project includes */
 #include "main.h"
 
-/* Demo includes */
 #include "logger.h"
 #include "dwt.h"
 
-/* Application & Tasks includes */
 #include "app.h"
 #include "task_leds_attribute.h"
 #include "task_leds_interface.h"
@@ -27,27 +25,27 @@
 #define LED_ON  GPIO_PIN_SET
 #define LED_OFF GPIO_PIN_RESET
 
-const task_leds_cfg_t task_leds_cfg_list[] = {
+static const task_leds_cfg_t task_leds_cfg_list[] = {
     {ID_LED_A, LD2_GPIO_Port, LD2_Pin, LED_ON, LED_OFF, DEL_LED_XX_BLI, DEL_LED_XX_PUL},
     {ID_LED_B, LD3_GPIO_Port, LD3_Pin, LED_ON, LED_OFF, DEL_LED_XX_BLI, DEL_LED_XX_PUL},
 };
 
 #define LEDS_CFG_QTY (sizeof(task_leds_cfg_list)/sizeof(task_leds_cfg_t))
 
-task_leds_dta_t task_leds_dta_list[] = {
-    {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
-    {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
-};
-
 #define LEDS_DTA_QTY (sizeof(task_leds_dta_list)/sizeof(task_leds_dta_t))
 
 // Private functions declaration
-void task_leds_statechart(void);
+static void task_leds_statechart(void);
 
-// External data declaration
+// Exported data definition
 uint32_t g_task_leds_cnt;
 volatile uint32_t g_task_leds_tick_cnt;
 
+task_leds_dta_t task_leds_dta_list[] = {
+    {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
+    {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
+};
+
 // External functions definition
 void task_leds_init(void *parameters)
 {
@@ -60,7 +58,6 @@ void task_leds_init(void *parameters)
     g_task_leds_cnt = G_TASK_LEDS_CNT_INIT;
     for (index = 0; LEDS_DTA_QTY > index; index++)
     {
-        /* Update Task led Configuration & Data Pointer */
         p_task_leds_cfg = &task_leds_cfg_list[index];
         p_task_leds_dta = &task_leds_dta_list[index];
 
@@ -106,7 +103,7 @@ void task_leds_update(void *parameters)
     }
 }
 
-void task_leds_statechart(void)
+static void task_leds_statechart(void)
 {
     uint32_t index;
     const task_leds_cfg_t *p_task_leds_cfg;
diff --git a/firmware/app/src/task_menu.c b/firmware/app/src/task_menu.c
@@ -21,16 +21,18 @@
 #define G_TASK_MEN_TICK_CNT_INI            0ul
 #define G_TASK_MEN_DISPLAY_UPDATE_RATE_MS  1000ul
 
-task_menu_dta_t task_menu_dta = {
+static task_menu_dta_t task_menu_dta = {
     G_TASK_MEN_TICK_INI, ST_MEN_IDLE, EV_MEN_ST_IDLE, false
 };
 
 // Private functions declaration
-void task_menu_statechart(void *parameters);
+static void task_menu_statechart(void *parameters);
+static void task_menu_set_state(task_menu_st_t new_state);
+static uint8_t task_menu_count_digits(int16_t n);
 
 // Private variables
-bool g_display_update = false;
-task_menu_st_t g_menu_prev_state;
+static bool g_display_update;
+static task_menu_st_t g_menu_prev_state;
 static int16_t temp_sensor_prev;
 
 // Public variables
@@ -98,7 +100,7 @@ void task_menu_update(void *parameters)
     }
 }
 
-void menu_set_state(task_menu_st_t new_state)
+static void task_menu_set_state(task_menu_st_t new_state)
 {
     task_menu_dta_t *p_task_menu_dta;
     p_task_menu_dta = &task_menu_dta;
@@ -117,8 +119,9 @@ void menu_set_state(task_menu_st_t new_state)
     }
 }
 
-int count_digits(int n) {
-    int count = 0;
+static uint8_t task_menu_count_digits(int16_t n)
+{
+    uint8_t count = 0;
 
     if (n == 0) return 1;
     if (n < 0) n = -n;
@@ -131,7 +134,7 @@ int count_digits(int n) {
     return count;
 }
 
-void task_menu_statechart(void *parameters)
+static void task_menu_statechart(void *parameters)
 {
     task_menu_dta_t *p_task_menu_dta;
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
@@ -152,7 +155,7 @@ void task_menu_statechart(void *parameters)
         {
             case EV_MEN_ST_IDLE:
             case EV_MEN_INACTIVE_TIMEOUT:
-                menu_set_state(ST_MEN_IDLE);
+                task_menu_set_state(ST_MEN_IDLE);
             break;
 
             case EV_MEN_DISPLAY_UPDATE:
@@ -160,23 +163,23 @@ void task_menu_statechart(void *parameters)
             break;
 
             case EV_MEN_ST_CLOCK_SET:
-                menu_set_state(ST_MEN_CLOCK_SET);
+                task_menu_set_state(ST_MEN_CLOCK_SET);
             break;
 
             case EV_MEN_ST_TEMP_SET:
-                menu_set_state(ST_MEN_TEMP_SET);
+                task_menu_set_state(ST_MEN_TEMP_SET);
             break;
 
             case EV_MEN_ST_TIMER_SET_STATUS:
-                menu_set_state(ST_MEN_TIMER_SET_STATUS);
+                task_menu_set_state(ST_MEN_TIMER_SET_STATUS);
             break;
 
             case EV_MEN_ST_TIMER_SET_START:
-                menu_set_state(ST_MEN_TIMER_SET_START);
+                task_menu_set_state(ST_MEN_TIMER_SET_START);
             break;
 
             case EV_MEN_ST_TIMER_SET_END:
-                menu_set_state(ST_MEN_TIMER_SET_END);
+                task_menu_set_state(ST_MEN_TIMER_SET_END);
             break;
 
             default: break;
@@ -211,7 +214,8 @@ void task_menu_statechart(void *parameters)
                 {
                     display_i2c_async_write_string("On");
                     display_i2c_async_set_cursor_pos(10, 0);
-                    snprintf(menu_row_str, 20, "%5d%%", p_shared_data->temp_ctrl_pwm_dc);
+                    snprintf(menu_row_str, 20, "%5d%%",
+                            p_shared_data->temp_ctrl_pwm_dc);
                     display_i2c_async_write_string(menu_row_str);
                 }
                 else
@@ -224,7 +228,7 @@ void task_menu_statechart(void *parameters)
                 memset(menu_row_str, '\0', sizeof(menu_row_str));
                 snprintf(menu_row_str, 20, "%s %*d(%d)%cC",
                         p_shared_data->timer->enabled ? "[P]" : "   ",
-                        (8 - count_digits(p_shared_data->temp_set_point)),
+                        (8 - task_menu_count_digits(p_shared_data->temp_set_point)),
                         p_shared_data->temp_sensor,
                         p_shared_data->temp_set_point,
                         G_DISPLAY_CHAR_DEGREE_CODE);
diff --git a/firmware/app/src/task_menu_interface.c b/firmware/app/src/task_menu_interface.c
@@ -21,8 +21,7 @@
 #define EVENT_UNDEFINED (255)
 #define MAX_EVENTS      (16)
 
-static struct
-{
+static struct {
     uint32_t head;
     uint32_t tail;
     uint32_t count;
diff --git a/firmware/app/src/task_system.c b/firmware/app/src/task_system.c
@@ -20,50 +20,49 @@
 #include "task_buzzer_attribute.h"
 #include "task_buzzer_interface.h"
 
-#define G_TASK_SYS_CNT_INI           0ul
-#define G_TASK_SYS_TICK_CNT_INI      0ul
-#define G_TASK_SYS_EEPROM_START_ADDR 0x0801FC00
-#define G_TASK_SYS_EEPROM_END_ADDR   0x0801FFF0
+#define G_TASK_SYS_CNT_INI              0ul
+#define G_TASK_SYS_TICK_CNT_INI         0ul
+#define G_TASK_SYS_EEPROM_START_ADDR    0x0801FC00
+#define G_TASK_SYS_EEPROM_END_ADDR      0x0801FFF0
+#define G_TASK_SYS_TIMER_UPDATE_RATE_MS 1000ul
 
 #define DEL_SYS_MIN 0ul
 #define DEL_SYS_MED 50ul
 #define DEL_SYS_MAX 500ul
-#define G_TASK_SYSTEM_TICK_UPDATE_RATE_MS 1000ul
 
-//  If persistent values are lost these are the timer default values
-#define TIMER_DEFAULT_START_HOUR 0000
-#define TIMER_DEFAULT_START_MIN  0000
-#define TIMER_DEFAULT_END_HOUR   0000
-#define TIMER_DEFAULT_END_MIN    0000
+// If persistent values are lost these are the timer default values
+#define TIMER_DEFAULT_START_HOUR 00ul
+#define TIMER_DEFAULT_START_MIN  00ul
+#define TIMER_DEFAULT_END_HOUR   12ul
+#define TIMER_DEFAULT_END_MIN    00ul
 #define TIMER_DEFAULT_STATUS     false
 
-task_system_dta_t task_system_dta = {
+// Exported variables
+volatile uint32_t g_task_system_tick_cnt; // Updated every ms by SysTick callback
+
+// Private variables
+static task_system_dta_t task_system_dta = {
     DEL_SYS_MIN, ST_SYS_IDLE, EV_SYS_IDLE, false
 };
 
 #define SYSTEM_DTA_QTY (sizeof(task_system_dta)/sizeof(task_system_dta_t))
 
-// Private variables
+static uint32_t g_task_system_timer_tick;
 static task_system_timer_t task_system_timer = {
     TIMER_DEFAULT_START_HOUR, TIMER_DEFAULT_START_MIN,
     TIMER_DEFAULT_END_HOUR, TIMER_DEFAULT_END_MIN,
     TIMER_DEFAULT_STATUS
 };
 
-uint32_t g_task_system_timer_tick;
-
-// Exported variables
-volatile uint32_t g_task_system_tick_cnt; // Updated every ms by SysTick callback
-
 // Private function declaration
-void task_system_statechart(void *parameters);
-void task_system_timer_update(void *parameters);
-void task_system_rtc_init(void);
-void task_system_rtc_increment_hour(void);
-void task_system_rtc_increment_min(void);
-void task_system_eeprom_read_param(void *parameters);
-void task_system_eeprom_write_param(void *parameters);
-uint32_t task_system_eeprom_get_current_addr(void);
+static void task_system_statechart(void *parameters);
+static void task_system_timer_update(void *parameters);
+static void task_system_rtc_init(void);
+static void task_system_rtc_increment_hour(void);
+static void task_system_rtc_increment_min(void);
+static void task_system_eeprom_read_param(void *parameters);
+static void task_system_eeprom_write_param(void *parameters);
+static uint32_t task_system_eeprom_get_current_addr(void);
 
 // Public function definition
 void task_system_init(void *parameters)
@@ -107,7 +106,7 @@ void task_system_update(void *parameters)
     {
         if (0 == g_task_system_timer_tick)
         {
-            g_task_system_timer_tick = G_TASK_SYSTEM_TICK_UPDATE_RATE_MS;
+            g_task_system_timer_tick = G_TASK_SYS_TIMER_UPDATE_RATE_MS;
             task_system_timer_update(parameters);
         }
         else
@@ -131,7 +130,7 @@ void task_system_update(void *parameters)
 }
 
 // Private function definition
-void task_system_rtc_init(void)
+static void task_system_rtc_init(void)
 {
     HAL_PWR_EnableBkUpAccess();
 
@@ -152,21 +151,21 @@ void task_system_rtc_init(void)
     }
 }
 
-void task_system_rtc_increment_hour()
+static void task_system_rtc_increment_hour()
 {
     HAL_RTC_GetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
     s_time.Hours = (s_time.Hours + 1) % 24;
     HAL_RTC_SetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
 }
 
-void task_system_rtc_increment_min()
+static void task_system_rtc_increment_min()
 {
     HAL_RTC_GetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
     s_time.Minutes = (s_time.Minutes + 1) % 60;
     HAL_RTC_SetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
 }
 
-uint32_t task_system_eeprom_get_current_addr(void)
+static uint32_t task_system_eeprom_get_current_addr(void)
 {
     uint32_t addr = G_TASK_SYS_EEPROM_START_ADDR;
 
@@ -184,7 +183,7 @@ uint32_t task_system_eeprom_get_current_addr(void)
     return 0;
 }
 
-void task_system_eeprom_read_param(void *parameters)
+static void task_system_eeprom_read_param(void *parameters)
 {
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
 
@@ -202,7 +201,7 @@ void task_system_eeprom_read_param(void *parameters)
 // also has the benefit that there is no need to erase the full page all the
 // time but only once the page fills which after 512 writes (2 bytes on a page
 // of 1024 bytes).
-void task_system_eeprom_write_param(void *parameters)
+static void task_system_eeprom_write_param(void *parameters)
 {
     uint32_t new_addr, curr_addr;
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
@@ -253,7 +252,7 @@ void task_system_eeprom_write_param(void *parameters)
     return;
 }
 
-void task_system_statechart(void *parameters)
+static void task_system_statechart(void *parameters)
 {
     task_system_dta_t *p_task_system_dta = &task_system_dta;
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
@@ -455,8 +454,8 @@ void task_system_statechart(void *parameters)
     }
 }
 
-// TOOD: Only check timer conditions every second (not on every tick)
-void task_system_timer_update(void *parameters)
+// TODO: Only check timer conditions every second (not on every tick)
+static void task_system_timer_update(void *parameters)
 {
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
     uint16_t start_24, end_24, clock_24;
@@ -470,8 +469,10 @@ void task_system_timer_update(void *parameters)
     HAL_RTC_GetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
 
     clock_24 = (s_time.Hours*100) + s_time.Minutes;
-    start_24 = (p_shared_data->timer->start_hour*100) + p_shared_data->timer->start_min;
-    end_24   = (p_shared_data->timer->end_hour*100) + p_shared_data->timer->end_min;
+    start_24 = (p_shared_data->timer->start_hour*100) +
+                p_shared_data->timer->start_min;
+    end_24 = (p_shared_data->timer->end_hour*100) +
+              p_shared_data->timer->end_min;
 
     new_temp_ctrl_state = ((end_24 > start_24)
                 ? ((clock_24 >= start_24) && (clock_24 < end_24))
diff --git a/firmware/app/src/task_system_interface.c b/firmware/app/src/task_system_interface.c
@@ -16,8 +16,7 @@
 #define EVENT_UNDEFINED (255)
 #define MAX_EVENTS      (16)
 
-static struct
-{
+static struct {
     uint32_t head;
     uint32_t tail;
     uint32_t count;
diff --git a/firmware/app/src/task_temp_ctrl.c b/firmware/app/src/task_temp_ctrl.c
@@ -22,7 +22,10 @@ typedef struct {
     uint32_t tim_channel;
 } task_temp_ctrl_cfg_t;
 
-task_temp_ctrl_cfg_t task_temp_ctrl_cfg = {&htim1, TIM_CHANNEL_1};
+static const task_temp_ctrl_cfg_t task_temp_ctrl_cfg = {&htim1, TIM_CHANNEL_1};
+
+// Private functions declaration
+static inline int16_t ceil_i16(int16_t val, int16_t max_val);
 
 // Public data definition
 volatile uint32_t g_task_temp_ctrl_tick_cnt; // Incremented by HAL_SysTick callback
@@ -32,7 +35,7 @@ void task_temp_ctrl_init(void *parameters)
 {
     LOGGER_INFO("Initializing `task_temp_ctrl`...");
 
-    task_temp_ctrl_cfg_t *p_task_cfg = &task_temp_ctrl_cfg;
+    const task_temp_ctrl_cfg_t *p_task_cfg = &task_temp_ctrl_cfg;
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
 
     __HAL_TIM_SET_COMPARE(p_task_cfg->htim,
@@ -43,11 +46,16 @@ void task_temp_ctrl_init(void *parameters)
     LOGGER_INFO("Done initializing `task_temp_ctrl`");
 }
 
+static inline int16_t ceil_i16(int16_t val, int16_t max_val)
+{
+    return val > max_val ? max_val : val;
+}
+
 void task_temp_ctrl_update(void *parameters)
 {
     bool b_time_update_required;
     shared_data_type *p_shared_data = (shared_data_type *)parameters;
-    task_temp_ctrl_cfg_t *p_task_cfg = &task_temp_ctrl_cfg;
+    const task_temp_ctrl_cfg_t *p_task_cfg = &task_temp_ctrl_cfg;
 
     __asm("CPSID i");
     if (G_TASK_CTRL_TICK_CNT_INI < g_task_temp_ctrl_tick_cnt)
@@ -71,10 +79,11 @@ void task_temp_ctrl_update(void *parameters)
         }
         __asm("CPSIE i");
 
-        int16_t dtemp = (p_shared_data->temp_set_point - p_shared_data->temp_sensor);
-        if (dtemp > 0)
+        int16_t error = p_shared_data->temp_set_point - p_shared_data->temp_sensor;
+
+        if (error > 0)
         {
-            p_shared_data->temp_ctrl_pwm_dc = dtemp;
+            p_shared_data->temp_ctrl_pwm_dc = ceil_i16(error*error, 80);
         }
         else {
             p_shared_data->temp_ctrl_pwm_dc = 0;