/* Copyright (c) 2025 Rodrigo Arias Mallo * 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; }