4 * Created on: Dec 11, 2010
15 #include <plp/DeviceConfig.hh>
16 #include <plp/DeviceTypes.hh>
17 #include <plp/FileUtil.hh>
20 #include "W1TemperatureSensor.hh"
21 #include "W1CounterDevice.hh"
27 template <class NumberDataType>
28 bool string_to_number(NumberDataType& result,
29 const std::string& string_param,
30 std::ios_base& (*format)(std::ios_base&))
32 std::istringstream iss(string_param);
33 return !(iss >> format >> result).fail();
37 // TODO Auto-generated constructor stub
41 // TODO Auto-generated destructor stub
44 int Factory::get_family_code_by_device_type(string device_type_param) {
47 if (device_type_param.compare(DEVICE_TYPE_TEMPERATURESENSOR) == 0) {
50 else if (device_type_param.compare(DEVICE_TYPE_COUNTER_DEVICE) == 0) {
56 string Factory::get_device_type_by_family_code(int family_code_param) {
59 switch(family_code_param) {
62 ret_val = DEVICE_TYPE_TEMPERATURESENSOR;
65 ret_val = DEVICE_TYPE_COUNTER_DEVICE;
68 ret_val = DEVICE_TYPE_UNKNOWN;
69 log_error("Unknown w1 device type: %d\n", family_code_param);
75 Device *Factory::create_w1_device(int family_code_param,
76 string device_id_param,
77 dirent *direntry_param) {
83 type = get_device_type_by_family_code(family_code_param);
84 switch(family_code_param) {
87 ret_val = new W1TemperatureSensor(device_id_param, type, direntry_param);
90 ret_val = new W1CounterDevice(device_id_param, type, direntry_param);
93 // 0x81 is the 1-wire USB dongle... No need to create device for it.
96 log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code_param, device_id_param.c_str());
99 if (ret_val != NULL) {
100 // check that device config exist
101 config = DeviceConfig::get_device_config(device_id_param);
102 if (config != NULL) {
103 // if not, create default device config
104 type = config->get_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE);
105 if (type.empty() == true) {
106 type = ret_val->get_type();
107 config->set_config_value(DEVICE_CONFIG_VALUE_KEY__TYPE, type);
108 config->set_config_value(DEVICE_CONFIG_VALUE_KEY__ID, ret_val->get_id());
116 Device *Factory::create_w1_device(string device_type_param,
117 string device_id_param) {
121 family_code = get_family_code_by_device_type(device_type_param);
122 ret_val = create_w1_device(family_code, device_id_param, NULL);
126 Device *Factory::create_w1_device(dirent *direntry_param, int *err_code_param) {
137 folder_name = direntry_param->d_name;
138 pos = folder_name.find("-");
140 tmp_str = folder_name.substr(0, pos);
141 // number in string is in hex format, convert to int
142 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
143 // if family code = 0x81 (1-wire usb dongle), do not try to create the device
144 if (family_code != 0x81) {
145 if (suc_flg == true) {
146 log_debug("1-wire device family code: %#x\n", family_code);
147 device_name = folder_name.substr(pos + 1, folder_name.length() - pos);
148 ret_val = Factory::create_w1_device(family_code,
151 if ((ret_val == NULL) &&
152 (family_code != 0x81)) {
161 list<Device *> Factory::get_device_list() {
162 list<Device *> ret_val;
165 struct dirent *direntry;
168 list<DataReader *> rdr_list;
169 list<Device *>::iterator dev_iter;
170 list<DataReader *>::iterator rdr_iter;
178 // scan through the list of devices detected from the 1-wire network
179 dir = opendir(W1_SCAN_ROOTDIR);
181 direntry = readdir(dir);
182 while(direntry != NULL) {
183 is_subdir = FileUtil::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
184 if (is_subdir == true) {
186 device = create_w1_device(direntry, &err_flg);
187 if (device != NULL) {
188 ret_val.push_back(device);
192 log_info("Unsupported 1-wire device detected: %s\n", direntry->d_name);
196 direntry = readdir(dir);
198 err_flg = closedir(dir);
200 log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR);
203 // scan through the list of devices which have saved data
204 rdr_list = get_data_reader_list();
205 for (rdr_iter = rdr_list.begin(); rdr_iter != rdr_list.end(); rdr_iter++) {
206 reader = (DataReader *)*rdr_iter;
207 id1 = reader->get_device_id();
209 for (dev_iter = ret_val.begin(); dev_iter != ret_val.end(); dev_iter++) {
210 device = (Device *)*dev_iter;
211 id2 = device->get_id();
212 if (id1.compare(id2) == 0) {
217 if (found == false) {
218 // reader device is not in the list of active devices. create and add it to list as in-active one...
219 type = reader->get_device_type();
220 device = create_w1_device(type, id1);
221 ret_val.push_back(device);
224 while(rdr_list.empty() == false) {
225 reader = rdr_list.back();
232 list<DataReader *> Factory::get_data_reader_list() {
236 struct dirent *direntry;
239 list<DataReader *> ret_val;
241 dr_name = DeviceConfig::get_base_dir_name();
242 dir = opendir(dr_name.c_str());
244 direntry = readdir(dir);
245 while(direntry != NULL) {
246 if (strcmp(direntry->d_name, "cache") != 0) {
247 is_subdir = FileUtil::is_subdirectory(dr_name.c_str(), direntry);
248 if (is_subdir == true) {
249 reader = new DataReader(direntry->d_name);
250 ret_val.push_back(reader);
253 direntry = readdir(dir);
255 err_flg = closedir(dir);
257 log_error("Failed to close 1-wire device data directory: %s\n", dr_name.c_str());