X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=src%2FFactory.cc;h=8a09eaa9d0b22bd0f7a4e2fbb6c26505aca058ef;hb=8c97cbb9b5f8997fe9ab3917fcbea66d74b45837;hp=c81dbe198e3a37c4e423da65fa76611b34632fb6;hpb=6c332c9dfe49d7fe08478946decce32a8f577ef4;p=lib1wire.git diff --git a/src/Factory.cc b/src/Factory.cc index c81dbe1..8a09eaa 100644 --- a/src/Factory.cc +++ b/src/Factory.cc @@ -5,14 +5,30 @@ * Author: lamikr */ +#include +#include +#include + +#include + #include #include "Factory.hh" #include "W1TemperatureSensor.hh" #include "W1CounterDevice.hh" +#include "W1Util.hh" using namespace w1; using namespace std; +template +bool string_to_number(NumberDataType& result, + const std::string& string_param, + std::ios_base& (*format)(std::ios_base&)) +{ + std::istringstream iss(string_param); + return !(iss >> format >> result).fail(); +} + Factory::Factory() { // TODO Auto-generated constructor stub } @@ -60,6 +76,101 @@ W1Device *Factory::get_device(int family_code, return ret_val; } +W1Device *Factory::create_device(dirent *direntry_param) { + string folder_name; + string tmp_str; + string device_name; + int pos; + int family_code; + bool suc_flg; + W1Device *ret_val; + + ret_val = NULL; + 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(family_code, tmp_str, hex); + if (suc_flg == true) { + log_debug("family_code: %d\n", family_code); + device_name = folder_name.substr(pos + 1, folder_name.length() - pos); + ret_val = Factory::get_device(family_code, + device_name, + direntry_param); + } + } + return ret_val; +} + +list Factory::get_device_list() { + DIR *dir; + int err_flg; + struct dirent *direntry; + W1Device *device; + bool is_subdir; + list ret_val; + + printf("get_device_list() started\n"); + dir = opendir(W1_SCAN_ROOTDIR); + if (dir != NULL) { + direntry = readdir(dir); + while(direntry != NULL) { + is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry); + if (is_subdir == true) { + log_info("dir_name: %s\n", direntry->d_name); + device = create_device(direntry); + if (device != NULL) { + log_info("device: %d\n", device->get_family_code()); + ret_val.push_back(device); + } + else { + log_info("unsupported device-directory: %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); + } + } + return ret_val; +} + +list Factory::get_device_data_list() { + DIR *dir; + string dr_name; + int err_flg; + struct dirent *direntry; + DeviceData *dev_dta; + bool is_subdir; + list ret_val; + + printf("get_device_list() started\n"); + 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 = W1Util::is_subdirectory(dr_name.c_str(), direntry); + if (is_subdir == true) { + dev_dta = new DeviceData(direntry->d_name); + log_info("dir_name: %s\n", direntry->d_name); + ret_val.push_back(dev_dta); + } + } + 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()); + } + } + return ret_val; +} + DeviceConfig *Factory::get_device_config(string device_id) { DeviceConfig *ret_val;