*/
#include <iostream>
#include <fstream>
+#include <sstream>
+#include <iomanip>
#include <time.h>
+#include <plp/log.h>
+#include "DeviceConfig.hh"
+#include "Factory.hh"
+#include "W1Store.hh"
#include "W1Device.hh"
using namespace w1;
using namespace std;
-W1Device::W1Device(dirent *direntry, int family_code_param, string id_param) {
+W1Device::W1Device(int family_code_param,
+ string device_id_param,
+ dirent *direntry_param) {
string rootdir;
string device_dir;
string temp_str;
rootdir = W1_SCAN_ROOTDIR;
temp_str = W1_SLAVE_FILE;
- dir_path = rootdir + "/" + direntry->d_name;
+ 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 = id_param;
- name = id_param;
+ id = device_id_param;
+ name = "";
}
W1Device::~W1Device() {
+ list<Data *>::iterator iter;
+ Data *data;
+
+ for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) {
+ data = (Data *)*iter;
+ delete(data);
+ }
+ memory_cache.clear();
}
-int W1Device::get_family_code() {
+int W1Device::get_w1_family_code() {
return family_code;
}
}
string W1Device::get_name() {
+ DeviceConfig *cfg;
+
+ if (name.empty() == true) {
+ cfg = Factory::get_device_config(id);
+ if (cfg != NULL) {
+ name = cfg->get_cfg_value("name");
+ delete(cfg);
+ }
+ }
return name;
}
void W1Device::set_name(string name_param) {
- name = name_param;
-}
-
-string W1Device::get_time() {
- time_t wtime;
- struct tm *ltime;
- char buffer[80];
- string ret_val;
+ DeviceConfig *cfg;
- time(&wtime);
- ltime = localtime(&wtime);
- strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", ltime);
- ret_val = buffer;
- return ret_val;
+ name = name_param;
+ cfg = Factory::get_device_config(id);
+ if (cfg != NULL) {
+ cfg->set_cfg_value("name", name_param);
+ delete(cfg);
+ }
}
void W1Device::printout() {
- string text;
+ Data *data;
+ string text;
- text = get_formatted_data();
- cout << text << endl;
+ data = get_and_collect_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());
+ }
}
-string W1Device::get_formatted_data() {
- string ret_val;
+string W1Device::to_string(double dbl_val, int digit_count) {
+ string ret_val;
+ ostringstream out;
- ret_val = get_formatted_data(get_value());
+ out << fixed << setprecision(digit_count) << dbl_val;
+ ret_val = out.str();
return ret_val;
}
-string W1Device::get_formatted_data(string value) {
- string ret_val;
- ret_val = get_time() + ": device type = " + get_devicetype_name() + ", id = " + id + ", value = " + value + " " + get_unit();
+Data *W1Device::get_and_collect_data() {
+ Data *ret_val;
+ vector<double> *vect;
+
+ ret_val = NULL;
+ vect = get_raw_data();
+ if (vect != NULL) {
+ ret_val = new Data(vect, get_unit());
+ collect_data(ret_val);
+ delete(vect);
+ }
return ret_val;
}
-void W1Device::add_to_memory_cache(std::string formatted_data) {
+void W1Device::collect_data(Data *data) {
// TODO: add mutex for memory_cache
- memory_cache.push_back(formatted_data);
+ memory_cache.push_back(data);
}
-void W1Device::store() {
- string file_path = "/tmp/" + id + ".txt";
- string text_line;
- ofstream data_file(file_path.c_str(), ios::app);
-
- cout << "storing to " << file_path << "data size " << memory_cache.size() << endl;
- // TODO: add mutex to protect memory_cache while it's read and emptied
- if (data_file.is_open()) {
- while(memory_cache.size() > 0) {
- text_line = memory_cache.front();
- memory_cache.pop_front();
- if (text_line.length() > 0) {
- cout << "storing line: " << text_line << endl;
- data_file << text_line << endl;
- }
- }
- data_file.close();
- }
- else {
- cout << "could not open file " << file_path << " for writing data." << endl;
+void W1Device::save_data() {
+ list<Data *>::iterator iter;
+ Data *data;
+ int dec_precision;
+
+ dec_precision = get_data_decimal_precision();
+ W1Store::save(id, &memory_cache, dec_precision);
+ for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) {
+ data = (Data *)*iter;
+ delete(data);
}
+ memory_cache.clear();
}