#include "main.h" #include "generic_macros.h" #include "lcd.h" #include "DNI.h" static int DNI_read(void) { HAL_ADC_Start(&hadc1); HAL_StatusTypeDef s = HAL_ADC_PollForConversion(&hadc1, 100); if (HAL_OK != s) return -s; else return HAL_ADC_GetValue(&hadc1); } static int DNI_convert_to_celsius(int value) { return (2512 - value) << 2; } static void DNI_print(int temperature) { int add_sign = temperature < 0; if (add_sign) temperature = ~(temperature - 1); // if value is not positive, the string conversion will break int temp1 = temperature; for (int i = 0; i < 2; i++) { temperature /= 10; display_write_data_byte('0' + (char) (temp1 - temperature * 10)); temp1 = temperature; } display_write_data_byte('.'); for (int i = 0; i < 3; i++) { temperature /= 10; display_write_data_byte('0' + (char) (temp1 - temperature * 10)); temp1 = temperature; if (temp1 == 0) { display_write_data_seq(" "); break; } } if (add_sign) { DISPLAY_SET_CURSOR(1, 9); display_write_data_byte('-'); } } static void DNI_print_celsius(int temperature) { DISPLAY_SET_CURSOR(1, 15); DISPLAY_SET_DECREMENT; display_write_data_seq("C "); DNI_print(temperature); } static void print_ok(void) { DISPLAY_SET_CURSOR(1, 4); DISPLAY_SET_INCREMENT; display_write_data_seq("OK"); } static void print_error(int err_code) { DISPLAY_SET_CURSOR(1, 4); DISPLAY_SET_INCREMENT; switch (err_code) { case HAL_OK: break; case HAL_ERROR: display_write_data_seq("HAL_ERROR"); break; case HAL_BUSY: display_write_data_seq("HAL_BUSY"); break; case HAL_TIMEOUT: display_write_data_seq("HAL_TIMEOUT"); break; default: display_write_data_seq("WRONG ERROR"); break; } } int DNI_show_celsius(void) { DISPLAY_CLEAR; DISPLAY_SET_INCREMENT; display_write_data_seq("DNI Temperature"); int value = DNI_read(); if (value < 0) { print_error(-value); return 1; } else { int temp = DNI_convert_to_celsius(value); DNI_print_celsius(temp); print_ok(); return 0; } }