]> pilppa.org Git - lib1wire.git/blob - src/W1Scanner.cc
Initial support for reading and writing device specific config data.
[lib1wire.git] / src / W1Scanner.cc
1 /*
2  * W1Scanner.cc
3  *
4  *  Created on: Oct 20, 2010
5  *      Author: lamikr
6  */
7
8 #include <string.h>
9 #include <malloc.h>
10
11 #include <string>
12 #include <sstream>
13 #include <iostream>
14
15 #include <plp/log.h>
16
17 #include "W1Util.hh"
18 #include "W1Scanner.hh"
19 #include "W1TemperatureSensor.hh"
20 #include "W1CounterDevice.hh"
21 #include "Factory.hh"
22
23 using namespace w1;
24 using namespace std;
25
26 template <class NumberDataType>
27 bool string_to_number(NumberDataType& result,
28                  const std::string& string_param,
29                  std::ios_base& (*format)(std::ios_base&))
30 {
31         std::istringstream iss(string_param);
32         return !(iss >> format >> result).fail();
33 }
34
35 W1Scanner::W1Scanner() {
36         log_debug("W1Scanner created\n");
37 }
38
39 W1Scanner::~W1Scanner() {
40 }
41
42 W1Device *W1Scanner::create_device(dirent *direntry_param) {
43         string          folder_name;
44         string          tmp_str;
45         string          device_name;
46         int             pos;
47         int             family_code;
48         bool            suc_flg;
49         W1Device        *ret_val;
50
51         ret_val         = NULL;
52         folder_name     = direntry_param->d_name;
53         pos             = folder_name.find("-");
54         if (pos > 0) {
55                 tmp_str = folder_name.substr(0, pos);
56                 // number in string is in hex format, convert to int
57                 suc_flg = string_to_number<int>(family_code, tmp_str, hex);
58                 if (suc_flg == true) {
59                         log_debug("family_code: %d\n", family_code);
60                         device_name     = folder_name.substr(pos + 1, folder_name.length() - pos);
61                         ret_val         = Factory::get_device(family_code,
62                                                         device_name,
63                                                         direntry_param);
64                 }
65         }
66         return ret_val;
67 }
68
69 list<W1Device *> W1Scanner::get_device_list() {
70         DIR                     *dir;
71         int                     err_flg;
72         struct dirent           *direntry;
73         W1Device                *device;
74         list<W1Device *>        ret_val;
75         bool                    is_subdir;
76
77         printf("get_device_list() started\n");
78         dir     = opendir(W1_SCAN_ROOTDIR);
79         if (dir != NULL) {
80                 direntry        = readdir(dir);
81                 while(direntry != NULL) {
82                         is_subdir       = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry);
83                         if (is_subdir == true) {
84                                 log_info("dir_name: %s\n", direntry->d_name);
85                                 device  = create_device(direntry);
86                                 if (device != NULL) {
87                                         log_info("device: %d\n", device->get_family_code());
88                                         ret_val.push_back(device);
89                                 }
90                                 else {
91                                         log_info("unsupported device-directory: %s\n", direntry->d_name);
92                                 }
93                         }
94                         direntry        = readdir(dir);
95                 }
96                 err_flg = closedir(dir);
97                 if (err_flg < 0) {
98                         log_error("failed to close 1-wire device directory scanned: %s\n", W1_SCAN_ROOTDIR);
99                 }
100         }
101         return ret_val;
102 }