Implement serial command parser with floating point support

This commit is contained in:
2024-09-22 03:54:28 +02:00
parent 746f81667e
commit 0103834441
5 changed files with 148 additions and 26 deletions

View File

@@ -7,14 +7,13 @@
#include <avr/interrupt.h>
// TODO: Config header for chip specifics like EEPROM size.
// TODO: Make sure wear leveling resets memory correctly.
// TODO: Fix huge serial command input triggering watchdog.
// TODO: Only update EEPROM if value differs from previous.
// TODO: Check thermistor conversion results /w thermometer.
// TODO: Implement primary state machine for update loop.
// TODO: Migrate to ATMega 1284P-PU for 2nd 16-bit timer.
// TODO: Check thermistor conversion results /w thermometer.
// TODO: Implement optional CRC8 sensor measurement check.
// TODO: Use 18.432MHz quarz crystal, burn required fuses.
// TODO: Make sure nothing breaks with negative temperatures.
// TODO: Write an improved command parser (low priority).
// TODO: Implement optional CRC8 sensor measurement check.
// TODO: Proper error handling and recovery (after testing).
// TODO: Check why the MCUCSR EXTRF reset flag is set.
@@ -30,6 +29,10 @@ static enum state_e state;
static word temp, temp_target;
static word dewp, dewp_target;
static int Init(void);
static void Update(void);
static void UpdateSensors(void);
static int Init(void)
{
mem_block_t mem;
@@ -82,8 +85,11 @@ static int Init(void)
if (MEM_Read(&mem) == 0) {
Info("Found persistent configuration in EEPROM!");
Info("Setting targets TEMP='%.2f', DEWP='%.2f'.",
Info("Setting targets TEMP='%.2fC', DEWP='%.2fC'.",
mem.temp, mem.dewp);
temp_target = mem.temp;
dewp_target = mem.dewp;
}
// There is a possiblity to use interrupt signals
@@ -130,6 +136,50 @@ static int Init(void)
}
static void Update(void)
{
char ch;
cmd_t cmd;
mem_block_t mem;
// Parse serial commands
while ((ch = USART_Getc()) >= 0) {
if (!CMD_Parse(ch, &cmd)) {
WDT_Reset();
continue;
}
switch(cmd.type) {
case T_SET: // Configure new persistent target
Info("Setting new target TEMP='%.2fC'...", cmd.args[0]);
Info("Setting new target DEWP='%.2fC'...", cmd.args[1]);
mem.temp = temp_target = cmd.args[0];
mem.dewp = dewp_target = cmd.args[1];
MEM_Write(&mem);
return;
}
}
// Poll sensor values
UpdateSensors();
// Handle state
switch (state) {
case S_IDLE:
break;
case S_HEAT_UP:
break;
case S_COOL_DOWN:
break;
case S_DEHUMIDIFY:
break;
}
UNUSED(temp);
UNUSED(dewp);
UNUSED(temp_target);
UNUSED(dewp_target);
}
static void UpdateSensors(void)
{
float t[6], rh[3], dp[3];
float t_avg, rh_avg, dp_avg;
@@ -167,25 +217,6 @@ static void Update(void)
Info("T2=%.2fC, RH2=%.2f%%, NT2=%.2fC, DEW2=%.2fC", t[1], rh[1], t[4], dp[1]);
Info("T3=%.2fC, RH3=%.2f%%, NT3=%.2fC, DEW3=%.2fC", t[2], rh[2], t[5], dp[2]);
Info("T_AVG=%.2fC, RH_AVG=%.2f%%, DP_AVG=%.2fC", t_avg, rh_avg, dp_avg);
// TODO: Implement state machine
// TODO: Handle serial commands
switch (state) {
case S_IDLE:
break;
case S_HEAT_UP:
break;
case S_COOL_DOWN:
break;
case S_DEHUMIDIFY:
break;
}
UNUSED(temp);
UNUSED(dewp);
UNUSED(temp_target);
UNUSED(dewp_target);
}
int main(void)