diff --git a/Core/Src/main.c b/Core/Src/main.c index 239f60a..2d23486 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -414,24 +414,174 @@ void SystemClock_Config(void) /* USER CODE BEGIN 4 */ //////////////// USER FUNC //////////////////// +/** + * @brief Проверяет, активен ли указанный элемент для обработки в CAN-шине + * @param num Номер элемента (0x00-0x7F) + * @param i Номер CAN-канала (0 или 1) + * @param z Флаг дополнительных проверок (1 - включить доп. проверки, 0 - только маска) + * @return 1 - элемент активен, 0 - элемент не активен + */ int Isit(int num, int i, int z) { - int res, pls; - - if((num<0)||(num>=0x80)) return 0; - res = Maska[i][num/0x10]; - res &= (1<<(num&0x0F)); - - if(z) - { - pls = (espero[num]>CanRestart[i]/2); - pls = pls || county[num]; - res = res && pls; - } - - return res; + int res, pls; + + //=== ПРОВЕРКА ДИАПАЗОНА ===// + // Если номер элемента вне допустимого диапазона (0x00-0x7F) + if((num < 0) || (num >= 0x80)) + return 0; // Элемент не активен + + //=== ПРОВЕРКА МАСКИ КАНАЛА ===// + // Определяем битовую маску для данного элемента + // num/0x10 - определяем индекс в массиве масок (0-7) + // num&0x0F - определяем позицию бита в слове (0-15) + res = Maska[i][num / 0x10]; // Получаем маску для группы элементов + res &= (1 << (num & 0x0F)); // Проверяем конкретный бит в маске + + //=== ДОПОЛНИТЕЛЬНЫЕ ПРОВЕРКИ (если z != 0) ===// + if(z) + { + // Проверка времени ожидания: если превышена половина времени перезапуска + pls = (espero[num] > CanRestart[i] / 2); + + // ИЛИ проверка счетчика отправки (если county[num] != 0) + pls = pls || county[num]; + + // Комбинированная проверка: должен быть установлен в маске И выполнять условия + res = res && pls; + } + + return res; // Возвращаем результат проверки } +/** + * @brief Функция обработки милисекундных событий системы + * @note Вызывается каждую миллисекунду из SysTick_Handler + */ +void Millisecond() +{ + // Статические переменные для хранения состояния между вызовами + static int CanPowse; // Счетчик для управления CAN-шиной + static unsigned int count_blink = 0, // Счетчик для мигания + count_bright = 0, // Счетчик для управления яркостью + count_mode, // Счетчик режимов мигания + blink_over, // Флаг переключения состояния мигания + blink_alarm, // Флаг мигания аварии + power_lamp, // Состояние силовой лампы + work_diod, // Состояние рабочего светодиода + norm_diod; // Состояние нормального светодиода + static int preTest; // Предыдущее состояние теста + int TST; // Текущее состояние теста + + // Константы времени + #define CANPOWSE 10 // 10 msec - период обновления CAN + #define BLINK_TIME 250 // 0.25 sec - период мигания + + //=== ОБНОВЛЕНИЕ WATCHDOG ===// + if(!cReset) + IWDG->KR = 0xAAAA; // Сброс watchdog таймера + + //=== ПРОВЕРКА АКТИВНОСТИ ТАЙМЕРА ===// + if(!timGo) return; // Если таймер не активен - выход + + //=== ЧТЕНИЕ ПЕРЕКЛЮЧАТЕЛЕЙ И КНОПОК ===// + Jumpers.byt.byte_1 = ReadJumpers(); // Чтение состояния переключателей + Jumpers.bit.bit0 = Buttons.bit.bit0 = TestJumper(); // Чтение состояния кнопки + + //=== УПРАВЛЕНИЕ CAN-ШИНОЙ ===// + if(++CanPowse >= CANPOWSE) + { + CanPowse = 0; // Сброс счетчика + CanGO = 1; // Установка флага разрешения работы CAN + } + + //=== УПРАВЛЕНИЕ РЕЖИМОМ "ЗАСЫПАНИЯ" ===// + if(Alarms.bit.bit8) // Разряд батареи + { + if (Falling_asleep) Falling_asleep--; // Уменьшение времени до "сна" + } + else + Falling_asleep = 1000L * Sleep_time; // Установка времени до "сна" + + //=== ОБРАБОТКА ТЕСТОВОГО РЕЖИМА ===// + TST = TestJumper() | cTestLamp; // Текущее состояние теста (кнопка или команда) + + if(TST & !preTest) // Обнаружение фронта нажатия кнопки + { + count_blink = BLINK_TIME; // Сброс счетчика мигания + count_mode = 0; // Сброс счетчика режимов + } + preTest = TST; // Сохранение состояния для следующего вызова + + //=== УПРАВЛЕНИЕ МИГАНИЕМ ИНДИКАТОРОВ ===// + if(++count_blink >= BLINK_TIME) + { + count_blink = 0; // Сброс счетчика + count_mode++; // Переключение режима + blink_over = (count_mode & 1) ? 1 : 0; // Мигание 1:1 (50%) + blink_alarm = (count_mode & 7) ? 1 : 0; // Мигание 1:7 (12.5%) + } + + //=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯНИЙ ИНДИКАТОРОВ ===// + power_lamp = 1; // Силовая лампа включена + norm_diod = 1; // Нормальный светодиод включен + work_diod = !blink_over; // Рабочий светодиод синхронизирован с миганием + + //=== РЕЖИМ ТЕСТИРОВАНИЯ ===// + if(TST) + { + power_lamp = blink_over; // Мигание силовой лампы + norm_diod = blink_over; // Мигание нормального светодиода + work_diod = blink_over; // Мигание рабочего светодиода + } + //=== РЕЖИМ ОСВЕЩЕНИЯ ===// + else if(Lightness) + { + power_lamp = norm_diod = 0; // Базовое состояние - выключено + + // Уровень освещенности 2: постоянно включено + if(Lightness == 2) power_lamp = norm_diod = 1; + + // Уровень освещенности 3: медленное мигание (50%) + if(Lightness == 3) power_lamp = norm_diod = blink_over; + + // Уровень освещенности 4: быстрое мигание (12.5%) + if(Lightness == 4) power_lamp = norm_diod = blink_alarm; + + // Уровень освещенности 5: инверсное быстрое мигание (87.5%) + if(Lightness == 5) power_lamp = norm_diod = !blink_alarm; + } + //=== РЕЖИМ ОШИБОК ===// + else if(Errors.all) + { + power_lamp = blink_over; // Мигание при ошибках + norm_diod = blink_over; // Мигание при ошибках + } + //=== РЕЖИМ ТРЕВОГ ===// + else if(Alarms.all) + { + power_lamp = blink_alarm; // Быстрое мигание при тревогах + norm_diod = blink_alarm; // Быстрое мигание при тревогах + } + + //=== ШИМ УПРАВЛЕНИЕ ЯРКОСТЬЮ СИЛОВОЙ ЛАМПЫ ===// + if(++count_bright == 10) // maximum_bright (100%) + { + count_bright = 0; + if(power_lamp) Pvt1_ON; // Включение на полную яркость + else Pvt1_OFF; // Выключение + } + + //=== УПРАВЛЕНИЕ ЯРКОСТЬЮ ===// + if(count_bright == Brightness) + if(!TST) Pvt1_OFF; // Отключение лампочки с регулировкой яркости + + //=== УПРАВЛЕНИЕ СВЕТОДИОДАМИ ===// + if(work_diod) LED_2_ON; // Включение рабочего светодиода + else LED_2_OFF; // Выключение рабочего светодиода + + if(norm_diod) LED_3_ON; // Включение нормального светодиода + else LED_3_OFF; // Выключение нормального светодиода +} ///////////////////////////////////////////// @@ -455,7 +605,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) HAL_IncTick(); } /* USER CODE BEGIN Callback 1 */ - + Millisecond(); /* USER CODE END Callback 1 */ }