]> pilppa.org Git - lib1wire.git/blobdiff - src/Factory.cc
Support for querying the list devices having data stored.
[lib1wire.git] / src / Factory.cc
index c81dbe198e3a37c4e423da65fa76611b34632fb6..8a09eaa9d0b22bd0f7a4e2fbb6c26505aca058ef 100644 (file)
@@ -5,14 +5,30 @@
  *      Author: lamikr
  */
 
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#include <string.h>
+
 #include <plp/log.h>
 #include "Factory.hh"
 #include "W1TemperatureSensor.hh"
 #include "W1CounterDevice.hh"
+#include "W1Util.hh"
 
 using namespace w1;
 using namespace std;
 
+template <class NumberDataType>
+bool string_to_number(NumberDataType& result,
+                 const std::string& string_param,
+                 std::ios_base& (*format)(std::ios_base&))
+{
+       std::istringstream iss(string_param);
+       return !(iss >> format >> result).fail();
+}
+
 Factory::Factory() {
        // TODO Auto-generated constructor stub
 }
@@ -60,6 +76,101 @@ W1Device *Factory::get_device(int family_code,
        return ret_val;
 }
 
+W1Device *Factory::create_device(dirent *direntry_param) {
+       string          folder_name;
+       string          tmp_str;
+       string          device_name;
+       int             pos;
+       int             family_code;
+       bool            suc_flg;
+       W1Device        *ret_val;
+
+       ret_val         = NULL;
+       folder_name     = direntry_param->d_name;
+       pos             = folder_name.find("-");
+       if (pos > 0) {
+               tmp_str = folder_name.substr(0, pos);
+               // number in string is in hex format, convert to int
+               suc_flg = string_to_number<int>(family_code, tmp_str, hex);
+               if (suc_flg == true) {
+                       log_debug("family_code: %d\n", family_code);
+                       device_name     = folder_name.substr(pos + 1, folder_name.length() - pos);
+                       ret_val         = Factory::get_device(family_code,
+                                                       device_name,
+                                                       direntry_param);
+               }
+       }
+       return ret_val;
+}
+
+list<W1Device *> Factory::get_device_list() {
+       DIR                     *dir;
+       int                     err_flg;
+       struct dirent           *direntry;
+       W1Device                *device;
+       bool                    is_subdir;
+       list<W1Device *>        ret_val;
+
+       printf("get_device_list() started\n");
+       dir     = opendir(W1_SCAN_ROOTDIR);
+       if (dir != NULL) {
+               direntry        = readdir(dir);
+               while(direntry != NULL) {
+                       is_subdir       = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
+                       if (is_subdir == true) {
+                               log_info("dir_name: %s\n", direntry->d_name);
+                               device  = create_device(direntry);
+                               if (device != NULL) {
+                                       log_info("device: %d\n", device->get_family_code());
+                                       ret_val.push_back(device);
+                               }
+                               else {
+                                       log_info("unsupported device-directory: %s\n", direntry->d_name);
+                               }
+                       }
+                       direntry        = readdir(dir);
+               }
+               err_flg = closedir(dir);
+               if (err_flg < 0) {
+                       log_error("failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
+               }
+       }
+       return ret_val;
+}
+
+list<DeviceData *> Factory::get_device_data_list() {
+       DIR                     *dir;
+       string                  dr_name;
+       int                     err_flg;
+       struct dirent           *direntry;
+       DeviceData              *dev_dta;
+       bool                    is_subdir;
+       list<DeviceData *>      ret_val;
+
+       printf("get_device_list() started\n");
+       dr_name = DeviceConfig::get_base_dir_name();
+       dir     = opendir(dr_name.c_str());
+       if (dir != NULL) {
+               direntry        = readdir(dir);
+               while(direntry != NULL) {
+                       if (strcmp(direntry->d_name, "cache") != 0) {
+                               is_subdir       = W1Util::is_subdirectory(dr_name.c_str(), direntry);
+                               if (is_subdir == true) {
+                                       dev_dta = new DeviceData(direntry->d_name);
+                                       log_info("dir_name: %s\n", direntry->d_name);
+                                       ret_val.push_back(dev_dta);
+                               }
+                       }
+                       direntry        = readdir(dir);
+               }
+               err_flg = closedir(dir);
+               if (err_flg < 0) {
+                       log_error("failed to close 1-wire device data directory: %s\n", dr_name.c_str());
+               }
+       }
+       return ret_val;
+}
+
 DeviceConfig *Factory::get_device_config(string device_id) {
        DeviceConfig    *ret_val;