You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ksensors/src/lmsensor.cpp

281 lines
7.3 KiB

/***************************************************************************
lmsensor.cpp - description
-------------------
begin : Mon Aug 6 2001
copyright : (C) 2001 by
email :
***************************************************************************/
/***************************************************************************
* *
* 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "lmsensor.h"
#include "lmsensorschip.h"
#include "stdio.h"
LMSensor::LMSensor(SensorsList *parent): Sensor(parent)
{
feature= -1;
}
LMSensor::~LMSensor(){
}
#if SENSORS_API_VERSION < 0x400 /* libsensor 3 code */
bool LMSensor::init(const sensors_feature_data **data, int *nr1,int *nr2)
#else
bool LMSensor::init(const sensors_feature **data, int *nr1, int *nr2)
#endif
{
double min,max;
const sensors_chip_name *chip_name= getChipName();
const char* main_name = (*data)->name;
feature= (*data)->number;
char *label = NULL;
TQString uniqueSensorName;
#if SENSORS_API_VERSION < 0x400 /* libsensor 3 code */
uniqueSensorName.sprintf("%s_%d_%d.%s", chip_name->prefix, chip_name->bus, chip_name->addr, main_name);
#else
uniqueSensorName.sprintf("%s_%d_%d.%s", chip_name->prefix, chip_name->bus.nr, chip_name->addr, main_name);
#endif
setName(uniqueSensorName.latin1());
#if SENSORS_API_VERSION < 0x400 /* libsensor 3 code */
bool min_found=false;
bool max_found=false;
while( (*data= sensors_get_all_features(*chip_name, nr1, nr2)) && (*data)->mapping!=SENSORS_NO_MAPPING) {
int len = strlen((*data)->name);
const char *postfix = (*data)->name + len - 4;
if (len < 5)
continue;
if((!strcmp(postfix, "_min") || !strcmp(postfix, "_low")) &&
!sensors_get_feature(*chip_name, (*data)->number, &valMin))
min_found=true;
if(!strcmp(postfix, "_max") &&
!sensors_get_feature(*chip_name, (*data)->number, &valMax)) {
max_found=true;
continue;
}
postfix--;
if((!strcmp(postfix, "_over") || !strcmp(postfix, "_high")) &&
!sensors_get_feature(*chip_name, (*data)->number, &valMax))
max_found=true;
}
double newVal;
if ((sensors_get_ignored(*chip_name, feature) != 1) || (sensors_get_feature(*chip_name, feature, &newVal) != 0)) {
return false;
}
if (strstr(main_name, "temp"))
{
setType(lmTemp);
max= 65;
min= 0;
}
else if (strstr(main_name, "fan"))
{
setType(lmFan);
max= 10000;
min= 3000;
}
else if (strstr(main_name, "alarm") || strstr(main_name, "sensor") || strstr(main_name, "vrm"))
{
return false;
}
else
{
setType(lmVoltage);
max= 16;
min= -16;
}
sensors_get_label(*chip_name,feature,&label);
if (label)
{
setDescription(TQString(label));
delete label;
label = NULL;
}
else
{
setDescription(uniqueSensorName.latin1());
}
if(min_found)
min = valMin;
if(max_found)
max = valMax;
#else /* libsensors4 code */
const sensors_subfeature *sub_feature;
const sensors_feature *feature_data = *data;
/* Move to next feature for the loop in LMSensorsChip::createSensors() */
*data = sensors_get_features(chip_name, nr1);
switch(feature_data->type)
{
case SENSORS_FEATURE_IN:
sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_IN_INPUT);
if (!sub_feature)
return false;
feature = sub_feature->number;
if (!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_IN_MIN)) ||
sensors_get_value(chip_name, sub_feature->number, &min))
min = -16;
if (!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_IN_MAX)) ||
sensors_get_value(chip_name, sub_feature->number, &max))
max = 16;
setType(lmVoltage);
break;
case SENSORS_FEATURE_FAN:
sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_FAN_INPUT);
if (!sub_feature)
return false;
feature = sub_feature->number;
if (!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_FAN_MIN)) ||
sensors_get_value(chip_name, sub_feature->number, &min))
min = 3000;
max = 10000;
setType(lmFan);
break;
case SENSORS_FEATURE_TEMP:
sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_TEMP_INPUT);
if (!sub_feature)
return false;
feature = sub_feature->number;
if (!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_TEMP_MIN)) ||
sensors_get_value(chip_name, sub_feature->number, &min))
min = 0;
if ((!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_TEMP_MAX)) &&
!(sub_feature = sensors_get_subfeature(chip_name, feature_data,
SENSORS_SUBFEATURE_TEMP_CRIT))) ||
sensors_get_value(chip_name, sub_feature->number, &max))
max = 65;
setType(lmTemp);
break;
default:
return false;
}
label = sensors_get_label(chip_name, feature_data);
if (label)
{
setDescription(TQString(label));
delete label;
label = NULL;
}
else
setDescription( uniqueSensorName.latin1() );
#endif /* libsensors3 / libsensors4 code */
if(min>max) {
double pivot= min;
min= max;
max= pivot;
}
setValueMax(max,dgCelsius);
setValueMin(min,dgCelsius);
readConfig();
updateValue();
setValueIdeal(getValue());
return true;
}
void LMSensor::updateValue()
{
setValue( readSensorValue(), dgCelsius );
}
double LMSensor::readSensorValue()
{
double newVal;
const sensors_chip_name *chip_name= getChipName();
#if SENSORS_API_VERSION < 0x400 /* libsensor 3 code */
sensors_get_feature(*chip_name, feature, &newVal);
#else
sensors_get_value(chip_name, feature, &newVal);
#endif
return newVal;
}
#define ABSOLUTE_VALUE(n) ( (n)>=0 ? (n) : -(n) )
#define TRUNCATE_VALUE(n) ( (double)(int)(n) )
double LMSensor::calculateIdealValue()
{
double value= readSensorValue();
if(getType()==lmVoltage) {
double decimals= 10;
double module = ABSOLUTE_VALUE(value);
if(module>3.0) {
if( ABSOLUTE_VALUE( 12.0-value)<2.0 ) return 12.0;
if( ABSOLUTE_VALUE(-12.0-value)<2.0 ) return -12.0;
if( ABSOLUTE_VALUE( 5.0-value)<1.0 ) return 5.0;
if( ABSOLUTE_VALUE( -5.0-value)<1.0 ) return -5.0;
if( ABSOLUTE_VALUE( 3.3-value)<0.3 ) return 3.3;
if( ABSOLUTE_VALUE( -3.3-value)<0.3 ) return -3.3;
if(module>4.0) decimals= 1;
}
return TRUNCATE_VALUE((value * decimals)) / decimals;
} else {
return value;
}
}
const sensors_chip_name *LMSensor::getChipName()
{
return ((LMSensorsChip *)parent())->getChipName();
}
#include "lmsensor.moc"