rpi4b-temp-humidity/ths.c

108 lines
3.2 KiB
C

/*
* ths.c - Utilities for reading sysctl based temp. and humidity sensors
* Copyright (C) 2024 Alexander Rosenberg
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version. See the LICENSE file for more information.
*/
#include "ths.h"
#include "util.h"
#include <err.h>
#include <sys/sysctl.h>
#include <inttypes.h>
THS *ths_open(const char *temp_key, const char *humid_key, const char *fail_key) {
THS *ths = malloc_checked(sizeof(THS));
if (temp_key) {
ths->temp_mib_len = THS_MIB_BUF_SIZE;
if (sysctlnametomib(temp_key, ths->temp_mib, &ths->temp_mib_len) < 0) {
warn("could not look up temp. key name: \"%s\"", temp_key);
free(ths);
return NULL;
}
} else {
ths->temp_mib_len = 0;
}
if (humid_key) {
ths->humid_mib_len = THS_MIB_BUF_SIZE;
if (sysctlnametomib(humid_key, ths->humid_mib, &ths->humid_mib_len) < 0) {
warn("could not look up humid. key name: \"%s\"", humid_key);
free(ths);
return NULL;
}
} else {
ths->humid_mib_len = 0;
}
if (fail_key) {
ths->fail_mib_len = THS_MIB_BUF_SIZE;
if (sysctlnametomib(fail_key, ths->fail_mib, &ths->fail_mib_len) < 0) {
warn("could not look up fail key name: \"%s\"", fail_key);
free(ths);
return NULL;
}
} else {
ths->fail_mib_len = 0;
}
LOG_VERBOSE("Opened THS with temp. key: \"%s\"\n"
" humid. key: \"%s\"\n"
" fail key: \"%s\"\n",
temp_key, humid_key, fail_key);
return ths;
}
void ths_close(THS *ths) {
free(ths);
}
int32_t ths_read_fails(const THS *ths) {
if (!ths->fail_mib_len) {
warnx("THS sensor does not support reading failure count");
return -1;
}
uint32_t ret_buf;
size_t ret_buf_size = sizeof(uint32_t);
if (sysctl(ths->fail_mib, ths->fail_mib_len, &ret_buf,
&ret_buf_size, NULL, 0) < 0) {
warn("could not read THS fail count");
return -1;
}
if (ret_buf > 0) {
LOG_VERBOSE("THS sensor reported: %" PRIu32 " fails\n", ret_buf)
}
return ret_buf;
}
int32_t ths_read_temp(const THS *ths) {
if (!ths->temp_mib_len) {
warnx("THS sensor does not support reading temperature");
return -1;
}
uint32_t ret_buf;
size_t ret_buf_size = sizeof(uint32_t);
if (sysctl(ths->temp_mib, ths->temp_mib_len, &ret_buf,
&ret_buf_size, NULL, 0) < 0) {
warn("could not read THS temperature");
return -1;
}
return ret_buf;
}
int32_t ths_read_humid(const THS *ths) {
if (!ths->humid_mib_len) {
warnx("THS sensor does not support reading humidity");
return -1;
}
uint32_t ret_buf;
size_t ret_buf_size = sizeof(uint32_t);
if (sysctl(ths->humid_mib, ths->humid_mib_len, &ret_buf,
&ret_buf_size, NULL, 0) < 0) {
warn("could not read THS humidity");
return -1;
}
return ret_buf;
}