48 lines
891 B
C
48 lines
891 B
C
/* Copyright (c) 2025 Rodrigo Arias Mallo <rodarima@gmail.com>
|
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
|
|
#include "heater.h"
|
|
|
|
#define HEATER_T_ON 500UL /* ms */
|
|
#define HEATER_T_OFF 5000UL /* ms */
|
|
|
|
void
|
|
heater_on(struct heater *h, unsigned long t_ms)
|
|
{
|
|
if (h->st == HEATER_ON)
|
|
return;
|
|
|
|
h->next_t = t_ms + HEATER_T_ON;
|
|
h->st = HEATER_ON;
|
|
h->turn_on = 1;
|
|
}
|
|
|
|
void
|
|
heater_off(struct heater *h)
|
|
{
|
|
h->st = HEATER_OFF;
|
|
h->turn_on = 0;
|
|
}
|
|
|
|
int
|
|
heater_state(struct heater *h, unsigned long t_ms)
|
|
{
|
|
if (h->st == HEATER_OFF)
|
|
return 0;
|
|
|
|
/* Switch state if current time exceeds time limit
|
|
* in the current state */
|
|
/* FIXME: Integer overflow can cause the heater to turn on forever */
|
|
if (t_ms > h->next_t) {
|
|
if (h->turn_on) {
|
|
h->turn_on = 0;
|
|
h->next_t = t_ms + HEATER_T_OFF;
|
|
} else {
|
|
h->turn_on = 1;
|
|
h->next_t = t_ms + HEATER_T_ON;
|
|
}
|
|
}
|
|
|
|
return h->turn_on;
|
|
}
|