4 * Created on: Dec 11, 2010
16 #include "W1TemperatureSensor.hh"
17 #include "W1CounterDevice.hh"
24 template <class NumberDataType>
25 bool string_to_number(NumberDataType& result,
26 const std::string& string_param,
27 std::ios_base& (*format)(std::ios_base&))
29 std::istringstream iss(string_param);
30 return !(iss >> format >> result).fail();
34 // TODO Auto-generated constructor stub
38 // TODO Auto-generated destructor stub
41 W1Device *Factory::get_device(int family_code,
43 dirent *direntry_param) {
52 ret_val = new W1TemperatureSensor(family_code, device_id, direntry_param);
55 ret_val = new W1CounterDevice(family_code, device_id, direntry_param);
58 // 0x81 is the 1-wire USB dongle... No need to create device for it.
61 log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code, device_id.c_str());
64 if (ret_val != NULL) {
65 log_debug("%s: %#x\n", ret_val->get_device_type().c_str(), ret_val->get_w1_family_code());
66 // check that device config exist
67 config = get_device_config(device_id);
69 // if not, create default device config
70 type = config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
71 if (type.empty() == true) {
72 type = ret_val->get_device_type();
73 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type);
74 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
82 W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) {
93 folder_name = direntry_param->d_name;
94 pos = folder_name.find("-");
96 tmp_str = folder_name.substr(0, pos);
97 // number in string is in hex format, convert to int
98 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
99 // if family code = 0x81 (1-wire usb dongle), do not try to create the device
100 if (family_code != 0x81) {
101 if (suc_flg == true) {
102 log_debug("1-wire device family code: %#x\n", family_code);
103 device_name = folder_name.substr(pos + 1, folder_name.length() - pos);
104 ret_val = Factory::get_device(family_code,
107 if ((ret_val == NULL) &&
108 (family_code != 0x81)) {
117 list<W1Device *> Factory::get_device_list() {
120 struct dirent *direntry;
123 list<W1Device *> ret_val;
125 dir = opendir(W1_SCAN_ROOTDIR);
127 direntry = readdir(dir);
128 while(direntry != NULL) {
129 is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
130 if (is_subdir == true) {
132 device = create_device(direntry, &err_flg);
133 if (device != NULL) {
134 ret_val.push_back(device);
138 log_info("Unsupported 1-wire device detected: %s\n", direntry->d_name);
142 direntry = readdir(dir);
144 err_flg = closedir(dir);
146 log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
152 list<DeviceData *> Factory::get_device_data_list() {
156 struct dirent *direntry;
159 list<DeviceData *> ret_val;
161 dr_name = DeviceConfig::get_base_dir_name();
162 dir = opendir(dr_name.c_str());
164 direntry = readdir(dir);
165 while(direntry != NULL) {
166 if (strcmp(direntry->d_name, "cache") != 0) {
167 is_subdir = W1Util::is_subdirectory(dr_name.c_str(), direntry);
168 if (is_subdir == true) {
169 dev_dta = new DeviceData(direntry->d_name);
170 ret_val.push_back(dev_dta);
173 direntry = readdir(dir);
175 err_flg = closedir(dir);
177 log_error("Failed to close 1-wire device data directory: %s\n", dr_name.c_str());
183 DeviceConfig *Factory::get_device_config(string device_id) {
184 DeviceConfig *ret_val;
186 ret_val = new DeviceConfig(device_id);