4 * Created on: Dec 11, 2010
16 #include "W1TemperatureSensor.hh"
17 #include "W1CounterDevice.hh"
23 template <class NumberDataType>
24 bool string_to_number(NumberDataType& result,
25 const std::string& string_param,
26 std::ios_base& (*format)(std::ios_base&))
28 std::istringstream iss(string_param);
29 return !(iss >> format >> result).fail();
33 // TODO Auto-generated constructor stub
37 // TODO Auto-generated destructor stub
40 W1Device *Factory::get_device(int family_code,
42 dirent *direntry_param) {
47 log_debug("family_code: %d\n", family_code);
51 ret_val = new W1TemperatureSensor(family_code, device_id, direntry_param);
52 log_debug("temperature sensor: %d\n", ret_val->get_family_code());
55 ret_val = new W1CounterDevice(family_code, device_id, direntry_param);
56 log_debug("counter device: %d\n", family_code);
59 log_debug("device not created, unsupported device type: %d\n", family_code);
62 if (ret_val != NULL) {
63 // check that device config exist
64 // if not, create default...
65 config = get_device_config(device_id);
68 type = config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
69 if (type.empty() == true) {
70 type = ret_val->get_device_type();
71 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type);
72 config->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
79 W1Device *Factory::create_device(dirent *direntry_param) {
89 folder_name = direntry_param->d_name;
90 pos = folder_name.find("-");
92 tmp_str = folder_name.substr(0, pos);
93 // number in string is in hex format, convert to int
94 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
95 if (suc_flg == true) {
96 log_debug("family_code: %d\n", family_code);
97 device_name = folder_name.substr(pos + 1, folder_name.length() - pos);
98 ret_val = Factory::get_device(family_code,
106 list<W1Device *> Factory::get_device_list() {
109 struct dirent *direntry;
112 list<W1Device *> ret_val;
114 printf("get_device_list() started\n");
115 dir = opendir(W1_SCAN_ROOTDIR);
117 direntry = readdir(dir);
118 while(direntry != NULL) {
119 is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
120 if (is_subdir == true) {
121 log_info("dir_name: %s\n", direntry->d_name);
122 device = create_device(direntry);
123 if (device != NULL) {
124 log_info("device: %d\n", device->get_family_code());
125 ret_val.push_back(device);
128 log_info("unsupported device-directory: %s\n", direntry->d_name);
131 direntry = readdir(dir);
133 err_flg = closedir(dir);
135 log_error("failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
141 list<DeviceData *> Factory::get_device_data_list() {
145 struct dirent *direntry;
148 list<DeviceData *> ret_val;
150 printf("get_device_list() started\n");
151 dr_name = DeviceConfig::get_base_dir_name();
152 dir = opendir(dr_name.c_str());
154 direntry = readdir(dir);
155 while(direntry != NULL) {
156 if (strcmp(direntry->d_name, "cache") != 0) {
157 is_subdir = W1Util::is_subdirectory(dr_name.c_str(), direntry);
158 if (is_subdir == true) {
159 dev_dta = new DeviceData(direntry->d_name);
160 log_info("dir_name: %s\n", direntry->d_name);
161 ret_val.push_back(dev_dta);
164 direntry = readdir(dir);
166 err_flg = closedir(dir);
168 log_error("failed to close 1-wire device data directory: %s\n", dr_name.c_str());
174 DeviceConfig *Factory::get_device_config(string device_id) {
175 DeviceConfig *ret_val;
177 ret_val = new DeviceConfig(device_id);