4 * Created on: Dec 11, 2010
15 #include <plp/DeviceConfig.hh>
16 #include <plp/DeviceTypes.hh>
17 #include <plp/FileUtil.hh>
20 #include "W1TemperatureSensor.hh"
21 #include "W1CounterDevice.hh"
27 template <class NumberDataType>
28 bool string_to_number(NumberDataType& result,
29 const std::string& string_param,
30 std::ios_base& (*format)(std::ios_base&))
32 std::istringstream iss(string_param);
33 return !(iss >> format >> result).fail();
37 // TODO Auto-generated constructor stub
41 // TODO Auto-generated destructor stub
45 * Returns family code for the device.
47 * @return w1 family code for the device type. If family code is not found, -1 is returned.
49 int Factory::get_family_code_by_device_type(string device_type_param) {
53 if (device_type_param.compare(DEVICE_TYPE_TEMPERATURESENSOR) == 0) {
56 else if (device_type_param.compare(DEVICE_TYPE_COUNTER_DEVICE) == 0) {
62 string Factory::get_device_type_by_family_code(int family_code_param) {
65 switch(family_code_param) {
68 ret_val = DEVICE_TYPE_TEMPERATURESENSOR;
71 ret_val = DEVICE_TYPE_COUNTER_DEVICE;
74 ret_val = DEVICE_TYPE_UNKNOWN;
75 log_error("Unknown w1 device type: %d\n", family_code_param);
81 Device *Factory::create_device(int family_code_param,
82 string device_id_param,
83 dirent *direntry_param) {
88 type = get_device_type_by_family_code(family_code_param);
89 if (type.empty() == false) {
90 ret_val = create_device(family_code_param,
98 Device *Factory::create_device(int device_w1_family_code_param,
99 string device_type_param,
100 string device_id_param,
101 dirent *direntry_param) {
103 DeviceConfig *config;
107 if (device_type_param.empty() == false) {
108 switch(device_w1_family_code_param) {
111 ret_val = new W1TemperatureSensor(device_id_param, device_type_param, direntry_param);
114 ret_val = new W1CounterDevice(device_id_param, device_type_param, direntry_param);
117 // 0x81 is the 1-wire USB dongle... No need to create device for it.
120 log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", device_w1_family_code_param, device_id_param.c_str());
123 if (ret_val != NULL) {
124 // check that device config exist
125 config = DeviceConfig::get_device_config(device_id_param);
126 if (config != NULL) {
127 // if not, create default device config
128 succ = config->get_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, device_type_param);
130 device_type_param = ret_val->get_type();
131 config->set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, device_type_param, false);
132 config->set_config_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id(), true);
141 Device *Factory::create_device(string device_type_param,
142 string device_id_param) {
147 if (device_type_param.empty() == false) {
148 family_code = get_family_code_by_device_type(device_type_param);
149 if (family_code != -1) {
150 ret_val = create_device(family_code, device_type_param, device_id_param, NULL);
156 Device *Factory::create_device(dirent *direntry_param,
157 int *err_code_param) {
168 folder_name = direntry_param->d_name;
169 pos = folder_name.find("-");
171 tmp_str = folder_name.substr(0, pos);
172 // number in string is in hex format, convert to int
173 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
174 // if family code = 0x81 (1-wire usb dongle), do not try to create the device
175 if (family_code != 0x81) {
176 if (suc_flg == true) {
177 log_debug("1-wire device family code: %#x\n", family_code);
178 device_id = folder_name.substr(pos + 1, folder_name.length() - pos);
179 ret_val = Factory::create_device(family_code,
182 if ((ret_val == NULL) &&
183 (family_code != 0x81)) {
192 list<Device *> Factory::get_device_list() {
193 list<Device *> ret_val;
196 struct dirent *direntry;
199 list<DataReader *> rdr_list;
200 list<Device *>::iterator dev_iter;
201 list<DataReader *>::iterator rdr_iter;
209 // scan through the list of devices detected from the 1-wire network
210 dir = opendir(W1_SCAN_ROOTDIR);
212 direntry = readdir(dir);
213 while(direntry != NULL) {
214 is_subdir = FileUtil::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
215 if (is_subdir == true) {
217 device = create_device(direntry, &err_flg);
218 if (device != NULL) {
219 ret_val.push_back(device);
223 log_info("Unsupported 1-wire device detected: %s\n", direntry->d_name);
227 direntry = readdir(dir);
229 err_flg = closedir(dir);
231 log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
234 // scan through the list of devices which have saved data
235 rdr_list = get_data_reader_list();
236 for (rdr_iter = rdr_list.begin(); rdr_iter != rdr_list.end(); rdr_iter++) {
237 reader = (DataReader *)*rdr_iter;
238 id1 = reader->get_device_id();
240 for (dev_iter = ret_val.begin(); dev_iter != ret_val.end(); dev_iter++) {
241 device = (Device *)*dev_iter;
242 id2 = device->get_id();
243 if (id1.compare(id2) == 0) {
248 if (found == false) {
249 // reader device is not in the list of active devices. create and add it to list as in-active one...
250 found = reader->get_device_type(type);
252 device = create_device(type, id1);
253 if (device != NULL) {
254 ret_val.push_back(device);
259 while(rdr_list.empty() == false) {
260 reader = rdr_list.back();
267 list<DataReader *> Factory::get_data_reader_list() {
271 struct dirent *direntry;
274 list<DataReader *> ret_val;
276 dr_name = DeviceConfig::get_base_dir_name();
277 dir = opendir(dr_name.c_str());
279 direntry = readdir(dir);
280 while(direntry != NULL) {
281 if (strcmp(direntry->d_name, "cache") != 0) {
282 is_subdir = FileUtil::is_subdirectory(dr_name.c_str(), direntry);
283 if (is_subdir == true) {
284 reader = new DataReader(direntry->d_name);
285 ret_val.push_back(reader);
288 direntry = readdir(dir);
290 err_flg = closedir(dir);
292 log_error("Failed to close 1-wire device data directory: %s\n", dr_name.c_str());