+ return ret_val;
+}
+
+Device *Factory::create_w1_device(int family_code_param,
+ string device_id_param,
+ dirent *direntry_param) {
+ Device *ret_val;
+ string type;
+
+ ret_val = NULL;
+ type = get_device_type_by_family_code(family_code_param);
+ if (type.empty() == false) {
+ ret_val = create_w1_device(family_code_param,
+ type,
+ device_id_param,
+ direntry_param);
+ }
+ return ret_val;
+}
+
+Device *Factory::create_w1_device(int family_code_param,
+ string device_id_param,
+ string type_param,
+ dirent *direntry_param) {
+ Device *ret_val;
+ DeviceConfig *config;
+
+ ret_val = NULL;
+ if (type_param.empty() == false) {
+ switch(family_code_param) {
+ case 0x10:
+ case 0x28:
+ ret_val = new W1TemperatureSensor(device_id_param, type_param, direntry_param);
+ break;
+ case 0x1d:
+ ret_val = new W1CounterDevice(device_id_param, 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", 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
+ type_param = config->get_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
+ if (type_param.empty() == true) {
+ type_param = ret_val->get_type();
+ config->set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type_param);
+ config->set_config_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
+ }
+ delete(config);
+ }
+ }
+ }
+ return ret_val;
+}
+
+Device *Factory::create_w1_device(string device_type_param,
+ string device_id_param) {
+ int family_code;
+ Device *ret_val;
+
+ 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_w1_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) {
+ 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;
+ folder_name = direntry_param->d_name;
+ pos = folder_name.find("-");
+ if (pos > 0) {
+ tmp_str = folder_name.substr(0, pos);
+ // number in string is in hex format, convert to int
+ suc_flg = string_to_number<int>(family_code, tmp_str, hex);
+ // if family code = 0x81 (1-wire usb dongle), do not try to create the device
+ 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,
+ direntry_param);
+ if ((ret_val == NULL) &&
+ (family_code != 0x81)) {
+ *err_code_param = 1;
+ }