/* * W1Device.cc * * Created on: Oct 20, 2010 * Author: lamikr */ #include #include #include #include #include #include #include #include #include "Factory.hh" #include "W1Device.hh" using namespace std; using namespace w1; using namespace plp; W1Device::W1Device(string device_id_param, string device_type_param, dirent *direntry_param) : SensorDevice(device_id_param, device_type_param) { string rootdir; string device_dir; string temp_str; pthread_mutex_init(&plock, NULL); type = device_type_param; id = device_id_param; if (direntry_param != NULL) { rootdir = W1_SCAN_ROOTDIR; temp_str = W1_SLAVE_FILE; dir_path = rootdir + "/" + direntry_param->d_name; slave_file = dir_path + "/" + temp_str; lifecycle_status = LIFECYCLE_STATUS__AVAILABLE; log_debug("1-wire device's data file: %s\n", slave_file.c_str()); } else { lifecycle_status = LIFECYCLE_STATUS__UNAVAILABLE; } reader = new DataReader(id); name = ""; } W1Device::~W1Device() { log_debug("started\n"); save_and_clean_cache(); if (reader != NULL) { delete(reader); reader = NULL; } } string W1Device::get_name() { DeviceConfig *cfg; if (name.empty() == true) { cfg = DeviceConfig::get_device_config(id); if (cfg != NULL) { name = cfg->get_config_value(DEVICE_CONFIG_VALUE_KEY__NAME); delete(cfg); } } return name; } void W1Device::set_name(string name_param) { DeviceConfig *cfg; if (name.compare(name_param) != 0) { name = name_param; cfg = DeviceConfig::get_device_config(id); if (cfg != NULL) { cfg->set_config_value(DEVICE_CONFIG_VALUE_KEY__NAME, name_param); delete(cfg); } } } void W1Device::printout() { Data *data; string text; string type; string name; data = get_data(); if (data != NULL) { text = data->to_string(); cout << text << endl; delete(data); } else { type = get_type(); name = get_name(); log_error("Could not read data for %s device: %s\n", type.c_str(), name.c_str()); } } string W1Device::to_string(double dbl_val, int digit_count) { string ret_val; ostringstream out; out << fixed << setprecision(digit_count) << dbl_val; ret_val = out.str(); return ret_val; } Data *W1Device::get_data() { Data *ret_val; vector *vect; ret_val = NULL; vect = get_raw_data(); if (vect != NULL) { ret_val = new Data(vect, get_unit()); cache(ret_val); delete(vect); log_debug("%s returning new data\n", id.c_str()); } else { // read old already saved data log_debug("%s returning old saved data\n", id.c_str()); ret_val = reader->get_latest_data(); } return ret_val; } void W1Device::cache(Data *new_data) { Data *data; int dec_precision; data = new_data->clone(); pthread_mutex_lock(&plock); memory_cache.push_back(data); if (memory_cache.size() > 5) { dec_precision = get_data_decimal_precision(); StoreDay::save(id, &memory_cache, dec_precision); while(memory_cache.empty() == false) { data = memory_cache.back(); memory_cache.pop_back(); delete(data); } } pthread_mutex_unlock(&plock); } void W1Device::save_and_clean_cache() { Data *data; int dec_precision; dec_precision = get_data_decimal_precision(); pthread_mutex_lock(&plock); log_debug("memory cache size: %d\n", memory_cache.size()); StoreDay::save(id, &memory_cache, dec_precision); while(memory_cache.empty() == false) { data = memory_cache.back(); memory_cache.pop_back(); delete(data); } pthread_mutex_unlock(&plock); } const DataReader *W1Device::get_device_data() { return reader; }