Newer
Older
smart-home-server / devices / relay / relay_esp8266 / RelayLogic.h
#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