|
|
|
//
|
|
|
|
// Created by MightyPork on 2022/08/20.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "fancontrol.h"
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
|
#include "freertos/timers.h"
|
|
|
|
#include "settings.h"
|
|
|
|
#include "actuators.h"
|
|
|
|
|
|
|
|
struct FanControlState gState = {};
|
|
|
|
|
|
|
|
static void timerCallback(TimerHandle_t xTimer);
|
|
|
|
|
|
|
|
void settings_blind_time_set(uint16_t blind_time) {
|
|
|
|
bool nadoraz = (gState.blind_position >= gSettings.blind_time) || (gState.blind_position >= blind_time);
|
|
|
|
|
|
|
|
gSettings.blind_time = blind_time;
|
|
|
|
|
|
|
|
if (nadoraz) {
|
|
|
|
gState.blind_position = blind_time;
|
|
|
|
}
|
|
|
|
|
|
|
|
settings_persist(SETTINGS_blind_time);
|
|
|
|
}
|
|
|
|
|
|
|
|
void fancontrol_init() {
|
|
|
|
gState.vent_mode = gSettings.initial_mode;
|
|
|
|
gState.set_power = gSettings.initial_power;
|
|
|
|
|
|
|
|
xTimerCreate("fanctl",
|
|
|
|
pdMS_TO_TICKS(1000),
|
|
|
|
pdTRUE,
|
|
|
|
NULL,
|
|
|
|
timerCallback);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void timerCallback(TimerHandle_t xTimer) {
|
|
|
|
// posun rolety
|
|
|
|
if (gAct.blind) {
|
|
|
|
if (gState.blind_position < gSettings.blind_time) {
|
|
|
|
gState.blind_position++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (gState.blind_position > 0) {
|
|
|
|
gState.blind_position--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (gAct.power > 0) {
|
|
|
|
if (gState.real_direction != gAct.dir) {
|
|
|
|
if (gState.ramp > 0) {
|
|
|
|
gState.ramp--;
|
|
|
|
} else {
|
|
|
|
gState.run_time = 0;
|
|
|
|
gState.real_direction = gAct.dir;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (gState.ramp < gSettings.ramp_time) {
|
|
|
|
gState.ramp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gState.run_time++;
|
|
|
|
} else {
|
|
|
|
if (gState.ramp > 0) {
|
|
|
|
gState.ramp--;
|
|
|
|
} else {
|
|
|
|
gState.run_time = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (gState.vent_mode) {
|
|
|
|
case VENT_MODE_OFF:
|
|
|
|
act_motor_power_set(0);
|
|
|
|
act_blind_set(0);
|
|
|
|
break;
|
|
|
|
case VENT_MODE_FREE:
|
|
|
|
act_motor_power_set(0);
|
|
|
|
act_blind_set(1);
|
|
|
|
break;
|
|
|
|
case VENT_MODE_OUT:
|
|
|
|
act_motor_direction_set(MOTOR_DIR_OUT);
|
|
|
|
act_blind_set(1);
|
|
|
|
if (gState.blind_position >= gSettings.blind_time) {
|
|
|
|
act_motor_power_set(gState.set_power);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case VENT_MODE_IN:
|
|
|
|
act_motor_direction_set(MOTOR_DIR_IN);
|
|
|
|
act_blind_set(1);
|
|
|
|
if (gState.blind_position >= gSettings.blind_time) {
|
|
|
|
act_motor_power_set(gState.set_power);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case VENT_MODE_RECUP:
|
|
|
|
act_blind_set(1);
|
|
|
|
if (gState.blind_position >= gSettings.blind_time) {
|
|
|
|
act_motor_power_set(gState.set_power);
|
|
|
|
|
|
|
|
// Stop condition
|
|
|
|
if (gState.real_direction == gAct.dir) {
|
|
|
|
if (gState.run_time >= gSettings.recup_time) {
|
|
|
|
// zmena smeru
|
|
|
|
gState.run_time = 0;
|
|
|
|
act_motor_direction_set(1 - gAct.dir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gAct.dir == gState.real_direction && gState.ramp >= gSettings.ramp_time) {
|
|
|
|
// Measure temperatures
|
|
|
|
int16_t t1 = 200;
|
|
|
|
int16_t t2 = 200; // TODO
|
|
|
|
|
|
|
|
gState.t_actual_1 = t1;
|
|
|
|
gState.t_actual_2 = t2;
|
|
|
|
|
|
|
|
switch (gState.real_direction) {
|
|
|
|
case MOTOR_DIR_IN:
|
|
|
|
gState.t_outdoor = t2;
|
|
|
|
gState.t_intake = t1;
|
|
|
|
break;
|
|
|
|
case MOTOR_DIR_OUT:
|
|
|
|
gState.t_indoor = t1;
|
|
|
|
gState.t_exhaust = t2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|