From ed45d54bf48c55d29165364dfa54f97368ed27ec Mon Sep 17 00:00:00 2001 From: Alex Savin Date: Mon, 5 May 2025 15:57:52 -0400 Subject: [PATCH] Add sensors/sensors.go --- sensors/sensors.go | 189 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 sensors/sensors.go diff --git a/sensors/sensors.go b/sensors/sensors.go new file mode 100644 index 0000000..bd4620c --- /dev/null +++ b/sensors/sensors.go @@ -0,0 +1,189 @@ +package sensors + +// #cgo LDFLAGS: -lsensors +// #include +// #include +// #include +import "C" + +import ( + "log" + "unsafe" +) + +type SubFeature struct { + Name string + Number int32 + Type int32 + Mapping int32 + Flags uint32 + chip *C.struct_sensors_chip_name +} + +func (s SubFeature) GetValue() float64 { + var value C.double + + C.sensors_get_value(s.chip, C.int(s.Number), &value) + + return float64(value) +} + +type Feature struct { + Name string + Number int32 + Type int32 + chip *C.struct_sensors_chip_name + feature *C.struct_sensors_feature +} + +func (f Feature) GetSubFeatures() []SubFeature { + var subfeatures []SubFeature + + var count C.int = 0 + + for { + resp := C.sensors_get_all_subfeatures(f.chip, f.feature, &count) + + if resp == nil { + break + } + + subfeature := SubFeature{ + Name: C.GoString(resp.name), + Number: int32(resp.number), + Type: int32(resp._type), + Mapping: int32(resp.mapping), + Flags: uint32(resp.flags), + chip: f.chip, + } + + subfeatures = append(subfeatures, subfeature) + } + + return subfeatures +} + +func (f Feature) GetLabel() string { + clabel := C.sensors_get_label(f.chip, f.feature) + golabel := C.GoString(clabel) + C.free(unsafe.Pointer(clabel)) + return golabel +} + +func (f Feature) GetValue() float64 { + return f.GetSubFeatures()[0].GetValue() +} + +type Bus struct { + Type int16 + Nr int16 + bus *C.struct_sensors_bus_id +} + +func (b Bus) String() string { + if b.Type == -1 { + return "*" + } else { + return C.GoString(C.sensors_get_adapter_name(b.bus)) + } +} + +type Chip struct { + Prefix string + Bus Bus + Addr int32 + Path string + chip *C.struct_sensors_chip_name +} + +func (c Chip) String() string { + var buffer [200]C.char + + len := C.sensors_snprintf_chip_name(&buffer[0], C.size_t(len(buffer)), c.chip) + + return C.GoStringN(&buffer[0], len) +} + +func (c Chip) AdapterName() string { + return c.Bus.String() +} + +func (c Chip) GetFeatures() []Feature { + var features []Feature + + var count C.int = 0 + + for { + resp := C.sensors_get_features(c.chip, &count) + + if resp == nil { + break + } + + feature := Feature{ + Name: C.GoString(resp.name), + Number: int32(resp.number), + Type: int32(resp._type), + chip: c.chip, + feature: resp, + } + + features = append(features, feature) + } + + return features +} + +func Init() { + filename := C.CString("/etc/sensors3.conf") + defer C.free(unsafe.Pointer(filename)) + + mode := C.CString("r") + defer C.free(unsafe.Pointer(mode)) + + fp, err := C.fopen(filename, mode) + defer C.fclose(fp) + + if fp == nil { + log.Fatal(err) + } + + C.sensors_init(fp) +} + +func Cleanup() { + C.sensors_cleanup() +} + +func GetDetectedChips() []Chip { + var chips []Chip + + var count C.int = 0 + + for { + resp := C.sensors_get_detected_chips(nil, &count) + + if resp == nil { + break + } + + bus := Bus{ + Type: int16(resp.bus._type), + Nr: int16(resp.bus.nr), + bus: &resp.bus, + } + + chip := Chip{ + Prefix: C.GoString(resp.prefix), + Bus: bus, + Addr: int32(resp.addr), + Path: C.GoString(resp.path), + chip: resp, + } + + chips = append(chips, chip) + + } + + return chips +} \ No newline at end of file