53 lines
		
	
	
		
			892 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			892 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright (c) 2025 Rodrigo Arias Mallo <rodarima@gmail.com>
 | |
|  * SPDX-License-Identifier: GPL-3.0-or-later */
 | |
| 
 | |
| #include "overheat.h"
 | |
| #include <string.h>
 | |
| 
 | |
| void
 | |
| overheat_init(struct overheat *o)
 | |
| {
 | |
| 	memset(o, 0, sizeof(struct overheat));
 | |
| }
 | |
| 
 | |
| void
 | |
| overheat_input(struct overheat *o, unsigned long t_ms, float temp)
 | |
| {
 | |
| 	unsigned long delta = t_ms - o->last_time;
 | |
| 
 | |
| 	if (delta < OVH_INTERVAL)
 | |
| 		return;
 | |
| 
 | |
| 	o->temp[o->next++] = temp;
 | |
| 	if (o->next >= OVH_NSAMPLES)
 | |
| 		o->next = 0;
 | |
| 	if (o->n < OVH_NSAMPLES)
 | |
| 		o->n++;
 | |
| 
 | |
| 	/* Recompute state */
 | |
| 	float tmin = 10000.0, tmax = 0.0;
 | |
| 	for (int i = 0; i < o->n; i++) {
 | |
| 		if (o->temp[i] < tmin)
 | |
| 			tmin = o->temp[i];
 | |
| 		if (o->temp[i] > tmax)
 | |
| 			tmax = o->temp[i];
 | |
| 	}
 | |
| 
 | |
| 	o->delta = tmax - tmin;
 | |
| }
 | |
| 
 | |
| float
 | |
| overheat_delta(struct overheat *o)
 | |
| {
 | |
| 	return o->delta;
 | |
| }
 | |
| 
 | |
| int
 | |
| overheat_panic(struct overheat *o)
 | |
| {
 | |
| 	if (o->delta > OVH_THRESHOLD)
 | |
| 		return 1;
 | |
| 	else
 | |
| 		return 0;
 | |
| }
 | 
