]> pilppa.org Git - lib1wire.git/blob - src/W1Scanner.cc
Initial support for reading log-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
22 using namespace w1;
23 using namespace std;
24
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&))
29 {
30         std::istringstream iss(string_param);
31         return !(iss >> format >> result).fail();
32 }
33
34 W1Scanner::W1Scanner() {
35         log_debug("W1Scanner created\n");
36 }
37
38 W1Scanner::~W1Scanner() {
39 }
40
41 W1Device *W1Scanner::create_device(dirent *direntry) {
42         string          folder_name;
43         string          tmp_str;
44         string          device_name;
45         int             pos;
46         int             family_code;
47         bool            suc_flg;
48         W1Device        *ret_val;
49
50         ret_val         = NULL;
51         folder_name     = direntry->d_name;
52         pos             = folder_name.find("-");
53         if (pos > 0) {
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);
60                         switch(family_code) {
61                                 case    0x10:
62                                 case    0x28:
63                                         ret_val = new W1TemperatureSensor(direntry, family_code, device_name);
64                                         log_debug("temperature sensor: %d\n", ret_val->get_family_code());
65                                         break;
66                                 case    0x1d:
67                                         log_debug("counter device: %d\n", family_code);
68                                         ret_val = new W1CounterDevice(direntry, family_code, device_name);
69                                         break;
70                                 default:
71                                         log_debug("device not created the device, unsupported device type: %d\n", family_code);
72                                         break;
73                         }
74                 }
75         }
76         return ret_val;
77 }
78
79 list<W1Device *> W1Scanner::get_device_list() {
80         DIR                     *dir;
81         int                     err_flg;
82         struct dirent           *direntry;
83         W1Device                *device;
84         list<W1Device *>        ret_val;
85         bool                    is_subdir;
86
87         printf("get_device_list() started\n");
88         dir     = opendir(W1_SCAN_ROOTDIR);
89         if (dir != NULL) {
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);
96                                 if (device != NULL) {
97                                         log_info("device: %d\n", device->get_family_code());
98                                         ret_val.push_back(device);
99                                 }
100                                 else {
101                                         log_info("unsupported device-directory: %s\n", direntry->d_name);
102                                 }
103                         }
104                         direntry        = readdir(dir);
105                 }
106                 err_flg = closedir(dir);
107                 if (err_flg < 0) {
108                         log_error("failed to close 1-wire device directory scanned: %s\n", W1_SCAN_ROOTDIR);
109                 }
110         }
111         return ret_val;
112 }