worked on smartmon support
authorJean-Philippe Orsini <jeanfi@gmail.com>
Mon, 23 Jan 2012 10:50:19 +0000 (10:50 +0000)
committerJean-Philippe Orsini <jeanfi@gmail.com>
Mon, 23 Jan 2012 10:50:19 +0000 (10:50 +0000)
src/lib/hdd_atasmart.c
src/lib/hdd_hddtemp.c
src/lib/psensor.c
src/lib/psensor.h

index cb5200f..11223b6 100644 (file)
@@ -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++;
+       }
 }
index fc408ae..a511839 100644 (file)
@@ -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);
index de726e4..835741f 100644 (file)
@@ -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);
 }
 
index 968b4d4..a1609ac 100644 (file)
@@ -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,