#include <time.h>
#include <plp/log.h>
-#include "DeviceConfig.hh"
+#include <plp/DeviceConfig.hh>
+#include <plp/StoreDay.hh>
+
#include "Factory.hh"
-#include "StoreDay.hh"
#include "W1Device.hh"
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 = "";
+ 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 = "";
+ _cfg = NULL;
}
W1Device::~W1Device() {
- list<Data *>::iterator iter;
- Data *data;
-
- for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) {
- data = (Data *)*iter;
- delete(data);
+ log_debug("started\n");
+ save_and_clean_cache();
+ if (reader != NULL) {
+ delete(reader);
+ reader = NULL;
}
- memory_cache.clear();
}
-int W1Device::get_w1_family_code() {
- return family_code;
-}
-
-string W1Device::get_id() {
- return id;
-}
-
-string W1Device::get_name() {
- DeviceConfig *cfg;
-
+string Device::get_name() {
if (name.empty() == true) {
- cfg = Factory::get_device_config(id);
- if (cfg != NULL) {
- name = cfg->get_cfg_value("name");
- delete(cfg);
+ if (_cfg == NULL) {
+ _cfg = DeviceConfig::get_device_config(id);
+ }
+ if (_cfg != NULL) {
+ _cfg->get_config_value(DEVICE_CONFIG_VALUE_KEY__NAME, name);
}
}
return name;
}
-void W1Device::set_name(string name_param) {
- DeviceConfig *cfg;
-
- name = name_param;
- cfg = Factory::get_device_config(id);
- if (cfg != NULL) {
- cfg->set_cfg_value("name", name_param);
- delete(cfg);
+void Device::set_name(string name_param) {
+ if (name.compare(name_param) != 0) {
+ name = name_param;
+ if (_cfg == NULL) {
+ _cfg = DeviceConfig::get_device_config(id);
+ }
+ if (_cfg != NULL) {
+ _cfg->set_config_value(DEVICE_CONFIG_VALUE_KEY__NAME, name_param, true);
+ }
}
}
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;
+ delete(data);
}
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());
}
}
return ret_val;
}
-
-Data *W1Device::get_and_collect_data() {
+Data *W1Device::get_data() {
Data *ret_val;
vector<double> *vect;
vect = get_raw_data();
if (vect != NULL) {
ret_val = new Data(vect, get_unit());
- collect_data(ret_val);
+ 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::collect_data(Data *data) {
- // TODO: add mutex for memory_cache
+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_data() {
- list<Data *>::iterator iter;
- Data *data;
- int dec_precision;
+void W1Device::save_and_clean_cache() {
+ Data *data;
+ int dec_precision;
dec_precision = get_data_decimal_precision();
+ pthread_mutex_lock(&plock);
+ /* needs to be casted to long unsigned int value is "unsigned int" in some
+ toolchains and that would otherwise cause an warning/error
+ */
+ log_debug("memory cache size: %lu\n", (long unsigned int)memory_cache.size());
StoreDay::save(id, &memory_cache, dec_precision);
- for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) {
- data = (Data *)*iter;
+ while(memory_cache.empty() == false) {
+ data = memory_cache.back();
+ memory_cache.pop_back();
delete(data);
}
- memory_cache.clear();
+ pthread_mutex_unlock(&plock);
+}
+
+const DataReader *W1Device::get_datareader() {
+ return reader;
}