]> pilppa.org Git - lib1wire.git/blob - src/Factory.cc
Refactoring and fixes.
[lib1wire.git] / src / Factory.cc
1 /*
2  * Factory.cc
3  *
4  *  Created on: Dec 11, 2010
5  *      Author: lamikr
6  */
7
8 #include <string>
9 #include <sstream>
10 #include <iostream>
11
12 #include <string.h>
13
14 #include <plp/log.h>
15 #include "Factory.hh"
16 #include "W1TemperatureSensor.hh"
17 #include "W1CounterDevice.hh"
18 #include "W1Util.hh"
19
20 using namespace w1;
21 using namespace std;
22
23 template <class NumberDataType>
24 bool string_to_number(NumberDataType& result,
25                  const std::string& string_param,
26                  std::ios_base& (*format)(std::ios_base&))
27 {
28         std::istringstream iss(string_param);
29         return !(iss >> format >> result).fail();
30 }
31
32 Factory::Factory() {
33         // TODO Auto-generated constructor stub
34 }
35
36 Factory::~Factory() {
37         // TODO Auto-generated destructor stub
38 }
39
40 W1Device *Factory::get_device(int family_code,
41                         string device_id,
42                         dirent *direntry_param) {
43         W1Device        *ret_val;
44         DeviceConfig    *config;
45
46         ret_val = NULL;
47         switch(family_code) {
48                 case    0x10:
49                 case    0x28:
50                         ret_val = new W1TemperatureSensor(family_code, device_id, direntry_param);
51                         break;
52                 case    0x1d:
53                         ret_val = new W1CounterDevice(family_code, device_id, direntry_param);
54                         break;
55                 default:
56                         log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code, device_id.c_str());
57                         break;
58         }
59         if (ret_val != NULL) {
60                 log_debug("%s: %#x\n", ret_val->get_device_type().c_str(), ret_val->get_w1_family_code());
61                 // check that device config exist
62                 config  = get_device_config(device_id);
63                 if (config != NULL) {
64                         // if not, create default device config
65                         string  type;
66                         type    = config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
67                         if (type.empty() == true) {
68                                 type    = ret_val->get_device_type();
69                                 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type);
70                                 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
71                         }
72                         delete(config);
73                 }
74         }
75         return ret_val;
76 }
77
78 W1Device *Factory::create_device(dirent *direntry_param) {
79         string          folder_name;
80         string          tmp_str;
81         string          device_name;
82         int             pos;
83         int             family_code;
84         bool            suc_flg;
85         W1Device        *ret_val;
86
87         ret_val         = NULL;
88         folder_name     = direntry_param->d_name;
89         pos             = folder_name.find("-");
90         if (pos > 0) {
91                 tmp_str = folder_name.substr(0, pos);
92                 // number in string is in hex format, convert to int
93                 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
94                 if (suc_flg == true) {
95                         log_debug("1-wire device family code: %#x\n", family_code);
96                         device_name     = folder_name.substr(pos + 1, folder_name.length() - pos);
97                         ret_val         = Factory::get_device(family_code,
98                                                         device_name,
99                                                         direntry_param);
100                 }
101         }
102         return ret_val;
103 }
104
105 list<W1Device *> Factory::get_device_list() {
106         DIR                     *dir;
107         int                     err_flg;
108         struct dirent           *direntry;
109         W1Device                *device;
110         bool                    is_subdir;
111         list<W1Device *>        ret_val;
112
113         dir     = opendir(W1_SCAN_ROOTDIR);
114         if (dir != NULL) {
115                 direntry        = readdir(dir);
116                 while(direntry != NULL) {
117                         is_subdir       = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
118                         if (is_subdir == true) {
119                                 device  = create_device(direntry);
120                                 if (device != NULL) {
121                                         ret_val.push_back(device);
122                                 }
123                                 else {
124                                         log_info("Unsupported 1-wire device detected: %s\n", direntry->d_name);
125                                 }
126                         }
127                         direntry        = readdir(dir);
128                 }
129                 err_flg = closedir(dir);
130                 if (err_flg < 0) {
131                         log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
132                 }
133         }
134         return ret_val;
135 }
136
137 list<DeviceData *> Factory::get_device_data_list() {
138         DIR                     *dir;
139         string                  dr_name;
140         int                     err_flg;
141         struct dirent           *direntry;
142         DeviceData              *dev_dta;
143         bool                    is_subdir;
144         list<DeviceData *>      ret_val;
145
146         dr_name = DeviceConfig::get_base_dir_name();
147         dir     = opendir(dr_name.c_str());
148         if (dir != NULL) {
149                 direntry        = readdir(dir);
150                 while(direntry != NULL) {
151                         if (strcmp(direntry->d_name, "cache") != 0) {
152                                 is_subdir       = W1Util::is_subdirectory(dr_name.c_str(), direntry);
153                                 if (is_subdir == true) {
154                                         dev_dta = new DeviceData(direntry->d_name);
155                                         ret_val.push_back(dev_dta);
156                                 }
157                         }
158                         direntry        = readdir(dir);
159                 }
160                 err_flg = closedir(dir);
161                 if (err_flg < 0) {
162                         log_error("Failed to close 1-wire device data directory: %s\n", dr_name.c_str());
163                 }
164         }
165         return ret_val;
166 }
167
168 DeviceConfig *Factory::get_device_config(string device_id) {
169         DeviceConfig    *ret_val;
170
171         ret_val = new DeviceConfig(device_id);
172         return ret_val;
173 }