#ifndef RELAY_LOGIC_H
#define RELAY_LOGIC_H
#include <Arduino.h>
// Массив пинов — определяем в .ino, а здесь только объявляем
extern const uint8_t RELAY_PINS[CHANNEL_NUM];
// Состояния каналов — тоже логика реле, а не ядра
extern bool channelState[CHANNEL_NUM];
extern const bool RELAY_INVERT[CHANNEL_NUM];
// Включение/выключение конкретного канала
inline void applyChannelState(uint8_t ch, bool on) {
if (ch >= CHANNEL_NUM) return;
uint8_t pin = RELAY_PINS[ch];
// Логика: on ^ invert → физический уровень
bool physicalOn = on ^ RELAY_INVERT[ch]; // XOR
digitalWrite(pin, physicalOn ? HIGH : LOW);
}
inline bool getChannelState(uint8_t ch) {
if (ch >= CHANNEL_NUM) return false;
return channelState[ch];
}
// Установить состояние канала + callback + сохранение
void setChannelState(uint8_t ch, bool on) {
if (ch >= CHANNEL_NUM) return;
channelState[ch] = on;
applyChannelState(ch, on);
}
// Для старой совместимости
bool getPrimaryState() {
return getChannelState(0);
}
inline void setOn(bool on) {
setChannelState(0, on);
}
#endif