]> pilppa.org Git - lib1wire.git/blobdiff - src/W1Device.cc
Started defining generic device type base classes that could be used
[lib1wire.git] / src / W1Device.cc
index 48f366db655a1d74bdf92d717b629a03e7e8c168..4c108e3857fdb500c5a296c3f3b2f8809212cc72 100644 (file)
@@ -5,31 +5,51 @@
  *      Author: lamikr
  */
 #include <iostream>
+#include <fstream>
+#include <sstream>
+#include <iomanip>
+
 #include <time.h>
+#include <plp/log.h>
 
+#include "DeviceConfig.hh"
+#include "Factory.hh"
+#include "StoreDay.hh"
 #include "W1Device.hh"
 
-using namespace w1;
 using namespace std;
+using namespace w1;
+using namespace plp;
 
-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("1-wire device's 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;
 }
 
@@ -38,29 +58,81 @@ string W1Device::get_id() {
 }
 
 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) {
+       DeviceConfig    *cfg;
+
        name    = name_param;
+       cfg     = Factory::get_device_config(id);
+       if (cfg != NULL) {
+               cfg->set_cfg_value("name", name_param);
+               delete(cfg);
+       }
 }
 
-string W1Device::get_time() {
-       time_t          wtime;
-       struct tm       *ltime;
-       char            buffer[80];
+void W1Device::printout() {
+       Data    *data;
+       string  text;
+
+       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());
+       }
+}
+
+string W1Device::to_string(double dbl_val, int digit_count) {
        string          ret_val;
+       ostringstream   out;
 
-       time(&wtime);
-       ltime   = localtime(&wtime);
-       strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", ltime);
-       ret_val = buffer;
+       out << fixed << setprecision(digit_count) << dbl_val;
+       ret_val = out.str();
        return ret_val;
 }
 
-void W1Device::printout() {
-       string text;
+Data *W1Device::get_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::collect_data(Data *data) {
+       // TODO: add mutex for memory_cache
+       memory_cache.push_back(data);
+}
+
+void W1Device::save_data() {
+       list<Data *>::iterator  iter;
+       Data                    *data;
+       int                     dec_precision;
 
-       text    = get_time() + ": device type = <unknown>, id = " + id + ", value = " + get_value();
-       cout << text << endl;
+       dec_precision   = get_data_decimal_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();
 }