4 * Created on: Oct 20, 2010
18 #include "W1Scanner.hh"
19 #include "W1TemperatureSensor.hh"
20 #include "W1CounterDevice.hh"
25 template <class NumberDataType>
26 bool string_to_number(NumberDataType& result,
27 const std::string& string_param,
28 std::ios_base& (*format)(std::ios_base&))
30 std::istringstream iss(string_param);
31 return !(iss >> format >> result).fail();
34 W1Scanner::W1Scanner() {
35 log_debug("W1Scanner created\n");
38 W1Scanner::~W1Scanner() {
41 W1Device *W1Scanner::create_device(dirent *direntry) {
51 folder_name = direntry->d_name;
52 pos = folder_name.find("-");
54 tmp_str = folder_name.substr(0, pos);
55 // number in string is in hex format, convert to int
56 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
57 if (suc_flg == true) {
58 log_debug("family_code: %d\n", family_code);
59 device_name = folder_name.substr(pos + 1, folder_name.length() - pos);
63 ret_val = new W1TemperatureSensor(direntry, family_code, device_name);
64 log_debug("temperature sensor: %d\n", ret_val->get_family_code());
67 log_debug("counter device: %d\n", family_code);
68 ret_val = new W1CounterDevice(direntry, family_code, device_name);
71 log_debug("device not created the device, unsupported device type: %d\n", family_code);
79 list<W1Device *> W1Scanner::get_device_list() {
82 struct dirent *direntry;
84 list<W1Device *> ret_val;
87 printf("get_device_list() started\n");
88 dir = opendir(W1_SCAN_ROOTDIR);
90 direntry = readdir(dir);
91 while(direntry != NULL) {
92 is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
93 if (is_subdir == true) {
94 log_info("dir_name: %s\n", direntry->d_name);
95 device = create_device(direntry);
97 log_info("device: %d\n", device->get_family_code());
98 ret_val.push_back(device);
101 log_info("unsupported device-directory: %s\n", direntry->d_name);
104 direntry = readdir(dir);
106 err_flg = closedir(dir);
108 log_error("failed to close 1-wire device directory scanned: %s\n", W1_SCAN_ROOTDIR);