2 * W1TemperatureSensor.cc
4 * Created on: Oct 20, 2010
13 #include "W1TemperatureSensor.hh"
20 #define CONST_UNIT_CELCIUS "C"
22 template <class NumberDataType>
23 bool string_to_number(NumberDataType& result,
24 const std::string& string_param,
25 std::ios_base& (*format)(std::ios_base&))
27 std::istringstream iss(string_param);
28 return !(iss >> format >> result).fail();
31 double convert_w1_temperature_to_celcius(string raw_value, int *err_flg) {
36 suc_flg = string_to_number<double>(dbl_val, raw_value, dec);
37 if (suc_flg == true) {
38 dbl_val = dbl_val / 1000;
41 std::ostringstream out;
42 out << fixed << setprecision(3) << dbl_val;
47 log_error("Failed to convert temperature %s to celsius value", raw_value.c_str());
53 W1TemperatureSensor::W1TemperatureSensor(int family_code_param,
54 string device_id_param,
55 dirent *direntry_param): W1Device(family_code_param, device_id_param, direntry_param) {
58 log_debug("trying to open file: %s\n", slave_file.c_str());
59 ifstream ifs(slave_file.c_str());
60 if (ifs.is_open() == false) {
61 text = get_time() + ": device type = " + get_device_type() + ", id = " + id + ", could not read file: " + slave_file + "\n";
62 log_debug(text.c_str());
63 log_debug("verify that you have w1_therm kernel module loaded.\n");
68 W1TemperatureSensor::~W1TemperatureSensor() {
71 bool W1TemperatureSensor::is_supported_w1_family_code(int family_code) {
84 vector<double> *W1TemperatureSensor::get_raw_data() {
85 vector<double> *ret_val;
95 ifstream ifs(slave_file.c_str());
96 if (ifs.is_open() == true) {
97 while(getline(ifs, tmp_str)) {
98 if (tmp_str.empty() == false) {
103 b_cnt = val_str.length();
105 pos = val_str.find("t=");
107 ((pos + 2) < b_cnt)) {
108 val_str = val_str.substr(pos + 2);
109 val_dbl = convert_w1_temperature_to_celcius(val_str, &err_flg);
111 ret_val = new vector<double>();
112 ret_val->push_back(val_dbl);
120 string W1TemperatureSensor::get_unit() {
121 return CONST_UNIT_CELCIUS;
124 string W1TemperatureSensor::get_device_type() {
125 return "Temperature Sensor";