/* * W1TemperatureSensor.cc * * Created on: Oct 20, 2010 * Author: lamikr */ #include #include #include #include #include #include "W1TemperatureSensor.hh" using namespace std; using namespace w1; #define CONST_UNIT_CELCIUS "C" template bool string_to_number(NumberDataType& result, const std::string& string_param, std::ios_base& (*format)(std::ios_base&)) { std::istringstream iss(string_param); return !(iss >> format >> result).fail(); } double convert_w1_temperature_to_celcius(string raw_value, int *err_flg) { bool suc_flg; double dbl_val; dbl_val = 0; suc_flg = string_to_number(dbl_val, raw_value, dec); if (suc_flg == true) { dbl_val = dbl_val / 1000; *err_flg = 0; /* std::ostringstream out; out << fixed << setprecision(3) << dbl_val; ret_val = out.str(); */ } else { log_error("Failed to convert temperature %s to celsius value", raw_value.c_str()); *err_flg = 1; } return dbl_val; } W1TemperatureSensor::W1TemperatureSensor(string device_id_param, string device_type_param, dirent *direntry_param): W1Device(device_id_param, device_type_param, direntry_param) { ifstream ifs(slave_file.c_str()); if (ifs.is_open() == false) { log_error("%s: %s failed to read data from file: %s\n", id.c_str(), get_type().c_str(), slave_file.c_str()); log_error("Verify that you have w1_therm kernel module loaded.\n"); ifs.close(); } } W1TemperatureSensor::~W1TemperatureSensor() { log_debug("W1TemperatureSensor destructor\n"); } vector *W1TemperatureSensor::get_raw_data() { vector *ret_val; string tmp_str; string val_str; double val_dbl; int pos; int b_cnt; int err_flg; ret_val = NULL; err_flg = 0; ifstream ifs(slave_file.c_str()); if (ifs.is_open() == true) { while(getline(ifs, tmp_str)) { if (tmp_str.empty() == false) { val_str = tmp_str; } } ifs.close(); b_cnt = val_str.length(); if (b_cnt > 0) { pos = val_str.find("t="); if ((pos >= 0) && ((pos + 2) < b_cnt)) { val_str = val_str.substr(pos + 2); val_dbl = convert_w1_temperature_to_celcius(val_str, &err_flg); if (err_flg == 0) { ret_val = new vector(); ret_val->push_back(val_dbl); } } } } return ret_val; } string W1TemperatureSensor::get_unit() { return CONST_UNIT_CELCIUS; } unsigned int W1TemperatureSensor::get_data_decimal_precision() { return 3; }