#ifndef _SYS_SENSORS_H_
#define _SYS_SENSORS_H_
#include <sys/types.h>
enum sensor_type {
SENSOR_TEMP,
SENSOR_FANRPM,
SENSOR_VOLTS_DC,
SENSOR_VOLTS_AC,
SENSOR_OHMS,
SENSOR_WATTS,
SENSOR_AMPS,
SENSOR_WATTHOUR,
SENSOR_AMPHOUR,
SENSOR_INDICATOR,
SENSOR_INTEGER,
SENSOR_PERCENT,
SENSOR_LUX,
SENSOR_DRIVE,
SENSOR_TIMEDELTA,
SENSOR_ECC,
SENSOR_FREQ,
SENSOR_RESERVED_B,
SENSOR_RESERVED_C,
SENSOR_RESERVED_D,
SENSOR_RESERVED_E,
SENSOR_RESERVED_F,
SENSOR_MAX_TYPES
};
static const char * const sensor_type_s[SENSOR_MAX_TYPES + 1] = {
"temp",
"fan",
"volt",
"acvolt",
"resistance",
"power",
"current",
"watthour",
"amphour",
"indicator",
"raw",
"percent",
"illuminance",
"drive",
"timedelta",
"ecc",
"freq",
"reserved_b",
"reserved_c",
"reserved_d",
"reserved_e",
"reserved_f",
"undefined"
};
#define SENSOR_DRIVE_EMPTY 1
#define SENSOR_DRIVE_READY 2
#define SENSOR_DRIVE_POWERUP 3
#define SENSOR_DRIVE_ONLINE 4
#define SENSOR_DRIVE_IDLE 5
#define SENSOR_DRIVE_ACTIVE 6
#define SENSOR_DRIVE_REBUILD 7
#define SENSOR_DRIVE_POWERDOWN 8
#define SENSOR_DRIVE_FAIL 9
#define SENSOR_DRIVE_PFAIL 10
enum sensor_status {
SENSOR_S_UNSPEC,
SENSOR_S_OK,
SENSOR_S_WARN,
SENSOR_S_CRIT,
SENSOR_S_UNKNOWN
};
struct sensor {
char desc[32];
struct timeval tv;
int64_t value;
enum sensor_type type;
enum sensor_status status;
int numt;
int flags;
#define SENSOR_FINVALID 0x0001
#define SENSOR_FUNKNOWN 0x0002
};
struct sensordev {
int num;
char xname[16];
int maxnumt[SENSOR_MAX_TYPES];
int sensors_count;
};
#define MAXSENSORDEVICES 32
#ifdef _KERNEL
#include <sys/queue.h>
#include <sys/sysctl.h>
struct ksensor {
SLIST_ENTRY(ksensor) list;
char desc[32];
struct timeval tv;
int64_t value;
enum sensor_type type;
enum sensor_status status;
int numt;
int flags;
struct sysctl_oid *oid;
};
SLIST_HEAD(ksensors_head, ksensor);
struct ksensordev {
TAILQ_ENTRY(ksensordev) list;
int num;
char xname[16];
int maxnumt[SENSOR_MAX_TYPES];
int sensors_count;
struct ksensors_head sensors_list;
struct sysctl_oid *oid;
struct sysctl_ctx_list clist;
};
void sensordev_install(struct ksensordev *);
void sensordev_deinstall(struct ksensordev *);
void sensor_attach(struct ksensordev *, struct ksensor *);
void sensor_detach(struct ksensordev *, struct ksensor *);
void sensor_task_register(void *, void (*)(void *), int);
void sensor_task_unregister(void *);
struct sensor_task;
struct sensor_task *
sensor_task_register2(void *, void (*)(void *),
int period, int cpu);
void sensor_task_unregister2(struct sensor_task *);
static __inline void
sensor_set_invalid(struct ksensor *sens)
{
sens->status = SENSOR_S_UNSPEC;
sens->flags &= ~(SENSOR_FUNKNOWN | SENSOR_FINVALID);
sens->flags |= SENSOR_FINVALID;
sens->value = 0;
}
static __inline void
sensor_set_unknown(struct ksensor *sens)
{
sens->status = SENSOR_S_UNKNOWN;
sens->flags &= ~(SENSOR_FUNKNOWN | SENSOR_FINVALID);
sens->flags |= SENSOR_FUNKNOWN;
sens->value = 0;
}
static __inline void
sensor_set(struct ksensor *sens, int64_t val, enum sensor_status status)
{
sens->status = status;
sens->flags &= ~(SENSOR_FUNKNOWN | SENSOR_FINVALID);
sens->value = val;
}
static __inline void
sensor_set_temp_degc(struct ksensor *sens, int degc, enum sensor_status status)
{
sensor_set(sens, (degc * 1000000) + 273150000, status);
}
#endif
#endif