/* * W1TemperatureSensor.cc * * Created on: Oct 20, 2010 * Author: lamikr */ #include #include #include #include #include "W1Util.hh" #include "W1TemperatureSensor.hh" #include using namespace std; using namespace w1; 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(); } string convert_celcius_value_to_three_digits(string raw_value) { string ret_val; int int_val; bool suc_flg; double dbl_val; suc_flg = string_to_number(dbl_val, raw_value, dec); if (suc_flg == true) { dbl_val = dbl_val / 1000; std::ostringstream out; out << fixed << setprecision(3) << dbl_val; ret_val = out.str(); } else { ret_val = raw_value; } return ret_val; } W1TemperatureSensor::W1TemperatureSensor(dirent *direntry, int family_code_param, string id_param): W1Device(direntry, family_code_param, id_param) { log_debug("trying to open file: %s\n", slave_file.c_str()); ifstream ifs(slave_file.c_str()); if (ifs.is_open() == false) { string text; text = get_time() + ": device type = " + get_devicetype_name() + ", id = " + id + ", could not read file: " + slave_file + "\n"; log_debug(text.c_str()); log_debug("verify that you have w1_therm kernel module loaded.\n"); ifs.close(); } } W1TemperatureSensor::~W1TemperatureSensor() { } bool W1TemperatureSensor::is_supported_family_code(int family_code) { bool ret_val; ret_val = false; switch(family_code) { case 0x10: case 0x28: ret_val = true; break; } return ret_val; } string W1TemperatureSensor::get_raw_value() { string temp; string ret_val; string last_line; int pos; int length; string formatted_data; int int_value; ret_val = ""; ifstream ifs(slave_file.c_str()); if (ifs.is_open() == true) { while(getline(ifs, temp)) { if (temp.length() > 0) { last_line = temp; } } ifs.close(); length = last_line.length(); if (length > 0) { pos = last_line.find("t="); if ((pos >= 0) && (pos + 2 < length)) { ret_val = last_line.substr(pos + 2); } } } ret_val = convert_celcius_value_to_three_digits(ret_val); return ret_val; } string W1TemperatureSensor::get_unit() { return "C"; } string W1TemperatureSensor::get_devicetype_name() { return "Temperature Sensor"; }