/**
******************************************************************************
* @file upp_errors.c
* @brief Ошибки УПП и их обработка
******************************************************************************
* @details
******************************************************************************/
#include "upp_errors.h" // всё остальное по работе с УПП
UPP_Errors_t errors;

static UPP_ErrorType_t UPP_SelectCommonError(void)
{
  // Пока нет ошибки
  UPP_ErrorType_t best = Err_None;
  // Приоритет отсутствия ошибок
  uint8_t best_prio = UPP_ErrorPriority[Err_None];

  // Перебираем все возможные ошибки по enum
  for (int e = Err_None + 1; e <= Err_UnderFrequency; e++)
  {
    // Проверяем: установлен ли соответствующий бит в pui.all
    // e-1, потому что ошибка №1 = бит 0, ошибка №2 = бит 1 и т.д.
    if (errors.pui.all & (1u << (e - 1)))
    {
      // Получаем приоритет этой ошибки
      uint8_t pr = UPP_ErrorPriority[e];

      // Если её приоритет лучше (меньше число) — запоминаем
      if (pr < best_prio)
      {
        best_prio = pr;
        best = (UPP_ErrorType_t)e;
      }
    }
  }

  // Возвращаем самую важную (наивысшего приоритета) ошибку
  return best;
}

void UPP_ErrorsHandle(void)
{
  errors.common = UPP_SelectCommonError();
}