coffee/barista/heater.c
2025-11-02 19:24:02 +01:00

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;
}