X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=src%2FW1Device.cc;h=f2e85902c0c6e3afa1b75085beda15e5ba27c063;hb=557fe3a639d7bd6fd146fdc9d573cf53bb2adff0;hp=a765cd36a6091432b4d2577ae6828efc3f36694b;hpb=d58713adbc518552c11fd19bd21ae8bd11ab434f;p=lib1wire.git diff --git a/src/W1Device.cc b/src/W1Device.cc index a765cd3..f2e8590 100644 --- a/src/W1Device.cc +++ b/src/W1Device.cc @@ -12,67 +12,86 @@ #include #include -#include "W1Store.hh" +#include +#include + +#include "Factory.hh" #include "W1Device.hh" -using namespace w1; using namespace std; +using namespace w1; +using namespace plp; -W1Device::W1Device(int family_code_param, - string device_id_param, - dirent *direntry_param) { +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; - rootdir = W1_SCAN_ROOTDIR; - temp_str = W1_SLAVE_FILE; - dir_path = rootdir + "/" + direntry_param->d_name; - slave_file = dir_path + "/" + temp_str; - log_debug("w1 data file: %s\n", slave_file.c_str()); - family_code = family_code_param; - id = device_id_param; - name = device_id_param; -} - -W1Device::~W1Device() { - list::iterator iter; - Data *data; - - for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) { - data = (Data *)*iter; - delete(data); + 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()); } - memory_cache.clear(); -} - -int W1Device::get_w1_family_code() { - return family_code; + else { + lifecycle_status = LIFECYCLE_STATUS__UNAVAILABLE; + } + reader = new DataReader(id); + name = ""; } -string W1Device::get_id() { - return id; +W1Device::~W1Device() { + save_and_clean_cache(); + delete(reader); } string W1Device::get_name() { + DeviceConfig *cfg; + + if (name.empty() == true) { + cfg = DeviceConfig::get_device_config(id); + if (cfg != NULL) { + name = cfg->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__NAME); + delete(cfg); + } + } return name; } void W1Device::set_name(string name_param) { - name = name_param; + DeviceConfig *cfg; + + if (name.compare(name_param) != 0) { + name = name_param; + cfg = DeviceConfig::get_device_config(id); + if (cfg != NULL) { + cfg->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__NAME, name_param); + delete(cfg); + } + } } void W1Device::printout() { Data *data; string text; + string type; + string name; - data = get_and_collect_data(); + data = get_data(); if (data != NULL) { text = data->to_string(); cout << text << endl; } else { - log_error("Could not data for %s device: %s\n", get_device_type().c_str(), get_name().c_str()); + type = get_type(); + name = get_name(); + log_error("Could not read data for %s device: %s\n", type.c_str(), name.c_str()); } } @@ -85,36 +104,51 @@ string W1Device::to_string(double dbl_val, int digit_count) { return ret_val; } - -Data *W1Device::get_and_collect_data() { +Data *W1Device::get_data() { Data *ret_val; vector *vect; + log_debug("get_data() started\n"); ret_val = NULL; vect = get_raw_data(); if (vect != NULL) { + log_debug("get_data() got raw data\n"); ret_val = new Data(vect, get_unit()); - collect_data(ret_val); + cache(ret_val); delete(vect); + log_debug("get_data() got raw data done\n"); + } + else { + log_debug("get_data() try to read old already saved data\n"); + // read old data already saved + ret_val = reader->get_latest_data(); + log_debug("get_data() try to read old already saved data done\n"); } return ret_val; } -void W1Device::collect_data(Data *data) { +void W1Device::cache(Data *data) { // TODO: add mutex for memory_cache memory_cache.push_back(data); + if (memory_cache.size() > 5) { + save_and_clean_cache(); + } } -void W1Device::save_data() { +void W1Device::save_and_clean_cache() { list::iterator iter; Data *data; int dec_precision; dec_precision = get_data_decimal_precision(); - W1Store::save(id, &memory_cache, dec_precision); + StoreDay::save(id, &memory_cache, dec_precision); for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) { data = (Data *)*iter; delete(data); } memory_cache.clear(); } + +DataReader *W1Device::get_device_data() { + return reader; +}