#include <string.h>
#include <plp/log.h>
+#include <plp/DeviceConfig.hh>
+#include <plp/DeviceTypes.hh>
+#include <plp/FileUtil.hh>
-#include "DeviceTypes.hh"
#include "Factory.hh"
#include "W1TemperatureSensor.hh"
#include "W1CounterDevice.hh"
-#include "W1Util.hh"
using namespace w1;
using namespace plp;
// TODO Auto-generated destructor stub
}
+/**
+ * Returns family code for the device.
+ *
+ * @return w1 family code for the device type. If family code is not found, -1 is returned.
+ */
int Factory::get_family_code_by_device_type(string device_type_param) {
- int ret_val = -1;
+ int ret_val;
+ ret_val = -1;
if (device_type_param.compare(DEVICE_TYPE_TEMPERATURESENSOR) == 0) {
ret_val = 0x10;
}
return ret_val;
}
-Device *Factory::create_w1_device(int family_code_param,
+Device *Factory::create_device(int family_code_param,
string device_id_param,
dirent *direntry_param) {
Device *ret_val;
- DeviceConfig *config;
string type;
ret_val = NULL;
type = get_device_type_by_family_code(family_code_param);
- switch(family_code_param) {
- case 0x10:
- case 0x28:
- ret_val = new W1TemperatureSensor(type, device_id_param, direntry_param);
- break;
- case 0x1d:
- 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_param, device_id_param.c_str());
- break;
+ if (type.empty() == false) {
+ ret_val = create_device(family_code_param,
+ type,
+ device_id_param,
+ direntry_param);
}
- if (ret_val != NULL) {
- // check that device config exist
- 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);
- if (type.empty() == true) {
- type = ret_val->get_device_type();
- config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type);
- config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
+ return ret_val;
+}
+
+Device *Factory::create_device(int device_w1_family_code_param,
+ string device_type_param,
+ string device_id_param,
+ dirent *direntry_param) {
+ Device *ret_val;
+ DeviceConfig *config;
+ bool succ;
+
+ ret_val = NULL;
+ if (device_type_param.empty() == false) {
+ switch(device_w1_family_code_param) {
+ case 0x10:
+ case 0x28:
+ ret_val = new W1TemperatureSensor(device_id_param, device_type_param, direntry_param);
+ break;
+ case 0x1d:
+ ret_val = new W1CounterDevice(device_id_param, device_type_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", device_w1_family_code_param, device_id_param.c_str());
+ break;
+ }
+ if (ret_val != NULL) {
+ // check that device config exist
+ config = DeviceConfig::get_device_config(device_id_param);
+ if (config != NULL) {
+ // if not, create default device config
+ succ = config->get_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, device_type_param);
+ if (succ == false) {
+ device_type_param = ret_val->get_type();
+ config->set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, device_type_param, false);
+ config->set_config_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id(), true);
+ }
+ delete(config);
}
- delete(config);
}
}
return ret_val;
}
-Device *Factory::create_w1_device(string device_type_param,
+Device *Factory::create_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);
+ ret_val = NULL;
+ if (device_type_param.empty() == false) {
+ family_code = get_family_code_by_device_type(device_type_param);
+ if (family_code != -1) {
+ ret_val = create_device(family_code, device_type_param, device_id_param, NULL);
+ }
+ }
return ret_val;
}
-Device *Factory::create_w1_device(dirent *direntry_param, int *err_code_param) {
+Device *Factory::create_device(dirent *direntry_param,
+ int *err_code_param) {
string folder_name;
string tmp_str;
- string device_name;
+ string device_id;
int pos;
int family_code;
bool suc_flg;
if (family_code != 0x81) {
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::create_w1_device(family_code,
- device_name,
+ device_id = folder_name.substr(pos + 1, folder_name.length() - pos);
+ ret_val = Factory::create_device(family_code,
+ device_id,
direntry_param);
if ((ret_val == NULL) &&
(family_code != 0x81)) {
}
list<Device *> Factory::get_device_list() {
+ list<Device *> ret_val;
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;
if (dir != NULL) {
direntry = readdir(dir);
while(direntry != NULL) {
- is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
+ is_subdir = FileUtil::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
if (is_subdir == true) {
err_flg = 0;
- device = create_w1_device(direntry, &err_flg);
+ device = create_device(direntry, &err_flg);
if (device != NULL) {
ret_val.push_back(device);
}
}
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);
+ found = reader->get_device_type(type);
+ if (found == true) {
+ device = create_device(type, id1);
+ if (device != NULL) {
+ ret_val.push_back(device);
+ }
+ }
}
}
+ while(rdr_list.empty() == false) {
+ reader = rdr_list.back();
+ rdr_list.pop_back();
+ delete(reader);
+ }
return ret_val;
}
direntry = readdir(dir);
while(direntry != NULL) {
if (strcmp(direntry->d_name, "cache") != 0) {
- is_subdir = W1Util::is_subdirectory(dr_name.c_str(), direntry);
+ is_subdir = FileUtil::is_subdirectory(dr_name.c_str(), direntry);
if (is_subdir == true) {
reader = new DataReader(direntry->d_name);
ret_val.push_back(reader);
}
return ret_val;
}
-
-DeviceConfig *Factory::get_device_config(string device_id) {
- DeviceConfig *ret_val;
-
- ret_val = new DeviceConfig(device_id);
- return ret_val;
-}