]> pilppa.org Git - lib1wire.git/blobdiff - src/Factory.cc
Api cleanups for device querying
[lib1wire.git] / src / Factory.cc
index 76287eb17f553ad89f4a7b24c47fb683c6fa75df..d9556e376e4ecc05fe47d06e8d1e1c70f2351b09 100644 (file)
@@ -12,6 +12,8 @@
 #include <string.h>
 
 #include <plp/log.h>
+
+#include "DeviceTypes.hh"
 #include "Factory.hh"
 #include "W1TemperatureSensor.hh"
 #include "W1CounterDevice.hh"
@@ -38,33 +40,64 @@ Factory::~Factory() {
        // TODO Auto-generated destructor stub
 }
 
-W1Device *Factory::get_device(int family_code,
-                       string device_id,
+int Factory::get_family_code_by_device_type(string device_type_param) {
+       int     ret_val = -1;
+
+       if (device_type_param.compare(DEVICE_TYPE_TEMPERATURESENSOR) == 0) {
+               ret_val = 0x10;
+       }
+       else if (device_type_param.compare(DEVICE_TYPE_COUNTER_DEVICE) == 0) {
+               ret_val = 0x1d;
+       }
+       return ret_val;
+}
+
+string Factory::get_device_type_by_family_code(int family_code_param) {
+       string  ret_val;
+
+       switch(family_code_param) {
+               case    0x10:
+               case    0x28:
+                       ret_val = DEVICE_TYPE_TEMPERATURESENSOR;
+                       break;
+               case    0x1d:
+                       ret_val = DEVICE_TYPE_COUNTER_DEVICE;
+                       break;
+               default:
+                       ret_val = DEVICE_TYPE_UNKNOWN;
+                       log_error("Unknown w1 device type: %d\n", family_code_param);
+                       break;
+       }
+       return ret_val;
+}
+
+Device *Factory::create_w1_device(int family_code_param,
+                       string device_id_param,
                        dirent *direntry_param) {
-       W1Device        *ret_val;
+       Device          *ret_val;
        DeviceConfig    *config;
        string          type;
 
        ret_val = NULL;
-       switch(family_code) {
+       type    = get_device_type_by_family_code(family_code_param);
+       switch(family_code_param) {
                case    0x10:
                case    0x28:
-                       ret_val = new W1TemperatureSensor(family_code, device_id, direntry_param);
+                       ret_val = new W1TemperatureSensor(type, device_id_param, direntry_param);
                        break;
                case    0x1d:
-                       ret_val = new W1CounterDevice(family_code, device_id, direntry_param);
+                       ret_val = new W1CounterDevice(type, device_id_param, direntry_param);
                        break;
                case    0x81:
                        // 0x81 is the 1-wire USB dongle... No need to create device for it.
                        break;
                default:
-                       log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code, device_id.c_str());
+                       log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code_param, device_id_param.c_str());
                        break;
        }
        if (ret_val != NULL) {
-               log_debug("%s: %#x\n", ret_val->get_device_type().c_str(), ret_val->get_w1_family_code());
                // check that device config exist
-               config  = get_device_config(device_id);
+               config  = get_device_config(device_id_param);
                if (config != NULL) {
                        // if not, create default device config
                        type    = config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
@@ -79,14 +112,24 @@ W1Device *Factory::get_device(int family_code,
        return ret_val;
 }
 
-W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) {
-       string          folder_name;
-       string          tmp_str;
-       string          device_name;
-       int             pos;
-       int             family_code;
-       bool            suc_flg;
-       W1Device        *ret_val;
+Device *Factory::create_w1_device(string device_type_param,
+                       string device_id_param) {
+       int     family_code;
+       Device  *ret_val;
+
+       family_code     = get_family_code_by_device_type(device_type_param);
+       ret_val         = create_w1_device(family_code, device_id_param, NULL);
+       return ret_val;
+}
+
+Device *Factory::create_w1_device(dirent *direntry_param, int *err_code_param) {
+       string  folder_name;
+       string  tmp_str;
+       string  device_name;
+       int     pos;
+       int     family_code;
+       bool    suc_flg;
+       Device  *ret_val;
 
        ret_val         = NULL;
        *err_code_param = 0;
@@ -101,7 +144,7 @@ W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) {
                        if (suc_flg == true) {
                                log_debug("1-wire device family code: %#x\n", family_code);
                                device_name     = folder_name.substr(pos + 1, folder_name.length() - pos);
-                               ret_val         = Factory::get_device(family_code,
+                               ret_val         = Factory::create_w1_device(family_code,
                                                                device_name,
                                                                direntry_param);
                                if ((ret_val == NULL) &&
@@ -114,14 +157,24 @@ W1Device *Factory::create_device(dirent *direntry_param, int *err_code_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;
+list<Device *> Factory::get_device_list() {
+       DIR                             *dir;
+       int                             err_flg;
+       struct dirent                   *direntry;
+       Device                          *device;
+       bool                            is_subdir;
+       list<DataReader *>              rdr_list;
+       list<Device *>                  ret_val;
+       list<Device *>::iterator        dev_iter;
+       list<DataReader *>::iterator    rdr_iter;
+       DataReader                      *reader;
+       string                          id1;
+       string                          id2;
+       string                          type;
+       string                          dev_type;
+       bool                            found;
 
+       // scan through the list of devices detected from the 1-wire network
        dir     = opendir(W1_SCAN_ROOTDIR);
        if (dir != NULL) {
                direntry        = readdir(dir);
@@ -129,7 +182,7 @@ list<W1Device *> Factory::get_device_list() {
                        is_subdir       = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
                        if (is_subdir == true) {
                                err_flg = 0;
-                               device  = create_device(direntry, &err_flg);
+                               device  = create_w1_device(direntry, &err_flg);
                                if (device != NULL) {
                                        ret_val.push_back(device);
                                }
@@ -146,17 +199,38 @@ list<W1Device *> Factory::get_device_list() {
                        log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
                }
        }
+       // scan through the list of devices which have saved data
+       rdr_list        = get_data_reader_list();
+       for (rdr_iter = rdr_list.begin(); rdr_iter != rdr_list.end(); rdr_iter++) {
+               reader  = (DataReader *)*rdr_iter;
+               id1     = reader->get_device_id();
+               found   = false;
+               for (dev_iter = ret_val.begin(); dev_iter != ret_val.end(); dev_iter++) {
+                       device  = (Device *)*dev_iter;
+                       id2     = device->get_id();
+                       if (id1.compare(id2) == 0) {
+                               found   = true;
+                               break;
+                       }
+               }
+               if (found == false) {
+                       // reader device is not in the list of active devices. create and add it to list as in-active one...
+                       type    = reader->get_device_type();
+                       device  = create_w1_device(type, id1);
+                       ret_val.push_back(device);
+               }
+       }
        return ret_val;
 }
 
-list<DeviceData *> Factory::get_device_data_list() {
+list<DataReader *> Factory::get_data_reader_list() {
        DIR                     *dir;
        string                  dr_name;
        int                     err_flg;
        struct dirent           *direntry;
-       DeviceData              *dev_dta;
+       DataReader              *reader;
        bool                    is_subdir;
-       list<DeviceData *>      ret_val;
+       list<DataReader *>      ret_val;
 
        dr_name = DeviceConfig::get_base_dir_name();
        dir     = opendir(dr_name.c_str());
@@ -166,8 +240,8 @@ list<DeviceData *> Factory::get_device_data_list() {
                        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);
-                                       ret_val.push_back(dev_dta);
+                                       reader  = new DataReader(direntry->d_name);
+                                       ret_val.push_back(reader);
                                }
                        }
                        direntry        = readdir(dir);