#define DEVICE_TYPE "button"
#define CHANNEL_NUM 3
#define FW_VERSION "1.0.0 alpha"
#include <sh_core_esp8266.h>
#include "ButtonLogic.h"
// --------------------- УСТРОЙСТВЕННЫЙ КОНФИГ ---------------------
const uint16_t BUTTON_EEPROM_BASE = getDeviceEepromStart();
// если когда-нибудь понадобится хранить состояние каналов:
const uint16_t BUTTON_STATE_ADDR = BUTTON_EEPROM_BASE; // например
// const uint16_t RELAY_OTHER_ADDR = BUTTON_EEPROM_BASE + 16;
// Количество каналов уже задано в Config.h через CHANNEL_NUM.
const uint8_t BUTTON_PINS[CHANNEL_NUM] = { 5, 6, 7 };
const uint8_t SIGNAL_LED = 2;
// Состояние каналов (по умолчанию все выключены)
bool channelState[CHANNEL_NUM] = { false, false, false };
// ---------------------------------------------------------------
// void relayLoadStates() {
// EEPROM.begin(EEPROM_SIZE);
// for (uint8_t ch = 0; ch < CHANNEL_NUM; ch++) {
// uint8_t v = EEPROM.read(BUTTON_STATE_ADDR + ch);
// // 0xFF считаем "ничего не записано" → по умолчанию выкл
// if (v == 0xFF) {
// channelState[ch] = false;
// } else {
// channelState[ch] = (v != 0);
// }
// }
// EEPROM.end();
// // применяем к железу
// for (uint8_t ch = 0; ch < CHANNEL_NUM; ch++) {
// applyChannelState(ch, channelState[ch]);
// }
// }
// void relaySaveStates() {
// EEPROM.begin(EEPROM_SIZE);
// for (uint8_t ch = 0; ch < CHANNEL_NUM; ch++) {
// EEPROM.write(BUTTON_STATE_ADDR + ch, channelState[ch] ? 1 : 0);
// }
// EEPROM.commit();
// EEPROM.end();
// }
void appendStatusJsonFields(String &json) {
// Базовое поле "status":"ok" уже добавлено в REST_API.h,
// мы лишь дополняем JSON полем channels.
json += ",\"channels\":[";
for (uint8_t ch = 0; ch < CHANNEL_NUM; ch++) {
if (ch > 0) json += ",";
json += "{";
json += "\"id\":" + String(ch) + ",";
json += "\"state\":\"";
json += getChannelState(ch) ? "on" : "off";
json += "\"";
json += "}";
}
json += "]";
}
void appendAboutJsonFields(String &json) {
json += ",\"channels\":" + String(CHANNEL_NUM);
}
bool deviceHandleAction(const String &action,
const String ¶msJson,
String &errorCode,
String &errorMessage)
{
// if (action == "set_state") {
// String state = extractJsonStringValue(paramsJson, "state");
// if (state != "on" && state != "off") {
// errorCode = "IllegalActionOrParams";
// errorMessage = "Invalid state";
// return false;
// }
// setOn(state == "on");
// relaySaveStates();
// return true;
// }
// if (action == "set_channel_state") {
// // Канал
// int ch = extractJsonIntValue(paramsJson, "channel");
// if (ch < 0 || ch >= CHANNEL_NUM) {
// errorCode = "IllegalActionOrParams";
// errorMessage = "Invalid channel index";
// return false;
// }
// // State
// String state = extractJsonStringValue(paramsJson, "state");
// state.toLowerCase();
// if (state != "on" && state != "off") {
// errorCode = "IllegalActionOrParams";
// errorMessage = "Invalid state";
// return false;
// }
// bool newState = (state == "on");
// setChannelState(ch, newState);
// relaySaveStates();
// return true;
// }
// if (action == "toggle_channel") {
// int ch = extractJsonIntValue(paramsJson, "channel");
// if (ch < 0 || ch >= CHANNEL_NUM) {
// errorCode = "IllegalActionOrParams";
// errorMessage = "Invalid channel index";
// return false;
// }
// bool newState = !getChannelState(ch);
// setChannelState(ch, newState);
// relaySaveStates();
// return true;
// }
errorCode = "IllegalActionOrParams";
errorMessage = "Unknown action";
return false;
}
void deviceHandleReset() {
for (uint8_t ch = 0; ch < CHANNEL_NUM; ch++) {
channelState[ch] = false;
applyChannelState(ch, false);
}
EEPROM.begin(EEPROM_SIZE);
for (uint16_t addr = DEVICE_EEPROM_START; addr < EEPROM_SIZE; addr++) {
EEPROM.write(addr, 0xFF);
}
EEPROM.commit();
EEPROM.end();
}
void setup() {
// relayLoadStates();
coreSetup();
}
void loop() {
coreLoop();
}