#include <EEPROM.h>
#include "tm1637.hpp"
#include "ec11.hpp"
#include "adc.hpp"
#define EEPROM_ADDR_CONFIG 0x00
#define CONFIG_FLAG_AVAILABLE 0x8A
#define CONFIG_POWER_LIMIT_MIN 1
#define CONFIG_POWER_LIMIT_MAX 999
#define CONFIG_EXT_DELAY_MIN 1
#define CONFIG_EXT_DELAY_MAX 999
#define LONG_PRESS_DELAY 1000
char disp_buf[6];
uint16_t loop_count;
uint16_t i;
uint32_t time_in;
uint8_t menu_state;
struct user_config
{
uint8_t available;
int16_t power_limit;
int16_t ext_delay;
};
TM1637 display;
EC11 encoder;
AC_ADC adc;
user_config config;
user_config config_verify;
int32_t limitRange(int32_t min, int32_t max, int32_t val)
{
if (val > max)
{
val = min;
}
if (val < min)
{
val = max;
}
return val;
}
void setup()
{
Serial.begin(115200);
display.init(4, 5);
// encoder.init(2, 6, 3, EC11_PLUS_TYPE_STEP);
encoder.init(2, 6, 3, EC11_PLUS_TYPE_JUMP);
adc.init(A0, A1, 600, 120);
if (display.getAckError())
{
Serial.println(F("TM1637 ACK ERROR"));
}
EEPROM.get(EEPROM_ADDR_CONFIG, config);
if (config.available != CONFIG_FLAG_AVAILABLE)
{
memset(&config, 0x00, sizeof(struct user_config));
config.available = CONFIG_FLAG_AVAILABLE;
config.power_limit = CONFIG_POWER_LIMIT_MIN;
config.ext_delay = CONFIG_EXT_DELAY_MIN;
Serial.println(F("USE DEFAULT CONFIG"));
}
display.setBrightness(2);
display.print(0, F("V001"));
delay(1000);
display.print(0, F("----"));
}
void loop()
{
if (menu_state < 2)
{
//adc.readVoltageRaw();
//adc.readCurrentRaw();
//Serial.println(5.0 / 1024.0 * adc.readPowerRaw());
//loop_count += 1;
snprintf(disp_buf, sizeof(disp_buf), "%4d", (uint16_t)round(5.0 / 1024.0 * adc.readPowerRaw() * 1000));
display.print(0, disp_buf);
}
switch (menu_state)
{
case 0:
if (encoder.isPush())
{
time_in = millis();
menu_state = 1;
encoder.clearPush();
encoder.clearRel();
}
break;
case 1:
if (millis() - time_in > LONG_PRESS_DELAY)
{
menu_state = 2;
}
if (encoder.isRel())
{
menu_state = 0;
encoder.clearRel();
encoder.clearPush();
}
break;
case 2:
while (1)
{
if (encoder.isMove())
{
config.power_limit += encoder.readMoveDir();
config.power_limit = limitRange(CONFIG_POWER_LIMIT_MIN, CONFIG_POWER_LIMIT_MAX, config.power_limit);
encoder.clearMove();
}
if (encoder.isPush())
{
menu_state = 3;
encoder.clearPush();
break;
}
snprintf(disp_buf, sizeof(disp_buf), "P%3u", config.power_limit);
display.print(0, disp_buf);
}
break;
case 3:
while (1)
{
if (encoder.isMove())
{
config.ext_delay += encoder.readMoveDir();
config.ext_delay = limitRange(CONFIG_EXT_DELAY_MIN, CONFIG_EXT_DELAY_MAX, config.ext_delay);
encoder.clearMove();
}
if (encoder.isPush())
{
menu_state = 0;
encoder.clearPush();
EEPROM.put(EEPROM_ADDR_CONFIG, config);
delay(10);
EEPROM.get(EEPROM_ADDR_CONFIG, config_verify);
if (memcmp(&config, &config_verify, sizeof(struct user_config)) == 0)
{
display.print(0, F("DONE"));
}
else
{
display.print(0, F("ERR "));
}
delay(1000);
break;
}
snprintf(disp_buf, sizeof(disp_buf), "t%3u", config.ext_delay);
display.print(0, disp_buf);
}
break;
};
}