+ 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_id;
+ 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_id = folder_name.substr(pos + 1, folder_name.length() - pos);
+ ret_val = Factory::create_w1_device(family_code,
+ device_id,
+ direntry_param);
+ if ((ret_val == NULL) &&
+ (family_code != 0x81)) {
+ *err_code_param = 1;
+ }
+ }
+ }
+ }
+ return ret_val;
+}
+
+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 *>::iterator dev_iter;
+ list<DataReader *>::iterator rdr_iter;
+ DataReader *reader;
+ string id1;
+ string id2;
+ string type;
+ string dev_type;
+ bool found;
+
+ // scan through the list of devices detected from the 1-wire network
+ dir = opendir(W1_SCAN_ROOTDIR);
+ if (dir != NULL) {
+ direntry = readdir(dir);
+ while(direntry != NULL) {
+ is_subdir = FileUtil::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
+ if (is_subdir == true) {
+ err_flg = 0;
+ device = create_w1_device(direntry, &err_flg);
+ if (device != NULL) {
+ ret_val.push_back(device);
+ }
+ else {
+ if (err_flg != 0) {
+ log_info("Unsupported 1-wire device detected: %s\n", direntry->d_name);
+ }
+ }
+ }
+ direntry = readdir(dir);
+ }
+ err_flg = closedir(dir);
+ if (err_flg < 0) {
+ log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
+ }
+ }
+ // scan through the list of devices which have saved data
+ rdr_list = get_data_reader_list();
+ for (rdr_iter = rdr_list.begin(); rdr_iter != rdr_list.end(); rdr_iter++) {
+ reader = (DataReader *)*rdr_iter;
+ id1 = reader->get_device_id();
+ found = false;
+ for (dev_iter = ret_val.begin(); dev_iter != ret_val.end(); dev_iter++) {
+ device = (Device *)*dev_iter;
+ id2 = device->get_id();
+ if (id1.compare(id2) == 0) {
+ found = true;
+ break;
+ }
+ }
+ 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();
+ if (type.empty() == false) {
+ device = create_w1_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;
+}
+
+list<DataReader *> Factory::get_data_reader_list() {
+ DIR *dir;
+ string dr_name;
+ int err_flg;
+ struct dirent *direntry;
+ DataReader *reader;
+ bool is_subdir;
+ list<DataReader *> ret_val;
+
+ dr_name = DeviceConfig::get_base_dir_name();
+ dir = opendir(dr_name.c_str());
+ if (dir != NULL) {
+ direntry = readdir(dir);
+ while(direntry != NULL) {
+ if (strcmp(direntry->d_name, "cache") != 0) {
+ 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);
+ }
+ }
+ direntry = readdir(dir);
+ }
+ err_flg = closedir(dir);
+ if (err_flg < 0) {
+ log_error("Failed to close 1-wire device data directory: %s\n", dr_name.c_str());
+ }
+ }