From f606bd3f16446091d0b88255a497a64e3f623aa3 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Mon, 23 Jan 2012 10:50:19 +0000 Subject: [PATCH] worked on smartmon support --- src/lib/hdd_atasmart.c | 53 +++++++++++++++++++++++++++++++++++++++++--------- src/lib/hdd_hddtemp.c | 4 ++-- src/lib/psensor.c | 4 +++- src/lib/psensor.h | 3 +++ 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/lib/hdd_atasmart.c b/src/lib/hdd_atasmart.c index cb5200f..11223b6 100644 --- a/src/lib/hdd_atasmart.c +++ b/src/lib/hdd_atasmart.c @@ -35,18 +35,23 @@ static int filter_sd(const char *p) } static struct psensor * -create_sensor(char *id, char *name, int values_max_length) +create_sensor(char *id, char *name, SkDisk *disk, int values_max_length) { - return psensor_create(id, - strdup(name), - SENSOR_TYPE_HDD_TEMP, - values_max_length); + struct psensor *s; + s = psensor_create(id, + strdup(name), + SENSOR_TYPE_HDD_TEMP_ATASMART, + values_max_length); + + s->disk = disk; + + return s; } struct psensor **hdd_psensor_list_add(struct psensor **sensors, int values_max_length) { - char **paths, **tmp; + char **paths, **tmp, *id; SkDisk *disk; struct psensor *sensor, **tmp_sensors, **result; @@ -57,14 +62,17 @@ struct psensor **hdd_psensor_list_add(struct psensor **sensors, result = sensors; tmp = paths; while (*tmp) { - log_debug("hdd_psensor_list_add open %s", tmp); + log_debug("hdd_psensor_list_add open %s", *tmp); if (!sk_disk_open(*tmp, &disk)) { - char *id = malloc(strlen("hdd at") + strlen(*tmp) + 1); + id = malloc(strlen("hdd at") + strlen(*tmp) + 1); strcpy(id, "hdd at"); strcat(id, *tmp); - sensor = create_sensor(id, *tmp, values_max_length); + sensor = create_sensor(id, + *tmp, + disk, + values_max_length); tmp_sensors = psensor_list_add(result, sensor); @@ -86,4 +94,31 @@ struct psensor **hdd_psensor_list_add(struct psensor **sensors, void hdd_psensor_list_update(struct psensor **sensors) { + struct psensor **cur, *s; + uint64_t kelvin; + int ret; + double c; + + cur = sensors; + while (*cur) { + s = *cur; + if (s->type == SENSOR_TYPE_HDD_TEMP_ATASMART) { + ret = sk_disk_smart_read_data(s->disk); + + if (!ret) { + ret = sk_disk_smart_get_temperature(s->disk, + &kelvin); + + if (!ret) { + c = (kelvin - 273150) / 1000; + psensor_set_current_value(s, c); + log_debug("hdd atasmart: %s %.2f", + s->id, + c); + } + } + } + + cur++; + } } diff --git a/src/lib/hdd_hddtemp.c b/src/lib/hdd_hddtemp.c index fc408ae..a511839 100644 --- a/src/lib/hdd_hddtemp.c +++ b/src/lib/hdd_hddtemp.c @@ -116,7 +116,7 @@ static int str_index(char *str, char d) static struct psensor * create_sensor(char *id, char *name, int values_max_length) { - return psensor_create(id, name, SENSOR_TYPE_HDD_TEMP, + return psensor_create(id, name, SENSOR_TYPE_HDD_TEMP_HDDTEMP, values_max_length); } @@ -219,7 +219,7 @@ static void update(struct psensor **sensors, struct hdd_info *info) struct psensor **sensor_cur = sensors; while (*sensor_cur) { - if ((*sensor_cur)->type == SENSOR_TYPE_HDD_TEMP + if ((*sensor_cur)->type == SENSOR_TYPE_HDD_TEMP_HDDTEMP && !strcmp((*sensor_cur)->id + 4, info->name)) psensor_set_current_value(*sensor_cur, (float)info->temp); diff --git a/src/lib/psensor.c b/src/lib/psensor.c index de726e4..835741f 100644 --- a/src/lib/psensor.c +++ b/src/lib/psensor.c @@ -446,7 +446,9 @@ void psensor_list_update_measures(struct psensor **sensors) cpu_psensor_list_update(sensors); #endif - if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDD_TEMP)) + if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDD_TEMP_HDDTEMP) + || psensor_list_contains_type(sensors, + SENSOR_TYPE_HDD_TEMP_ATASMART)) hdd_psensor_list_update(sensors); } diff --git a/src/lib/psensor.h b/src/lib/psensor.h index 968b4d4..a1609ac 100644 --- a/src/lib/psensor.h +++ b/src/lib/psensor.h @@ -41,6 +41,9 @@ enum psensor_type { SENSOR_TYPE_CPU_USAGE = 0x0800, SENSOR_TYPE_AMD = 0x1000, + SENSOR_TYPE_HDD_TEMP_ATASMART = 0x2000 | SENSOR_TYPE_HDD_TEMP, + SENSOR_TYPE_HDD_TEMP_HDDTEMP = 0x4000 | SENSOR_TYPE_HDD_TEMP, + SENSOR_TYPE_AMD_TEMP = SENSOR_TYPE_AMD | SENSOR_TYPE_TEMP, SENSOR_TYPE_AMD_FAN = SENSOR_TYPE_AMD | SENSOR_TYPE_FAN, -- 2.7.4