]> pilppa.org Git - lib1wire.git/blob - src/W1Scanner.cc
formatting fixes
[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 #include "W1Scanner.hh"
17 #include "W1TemperatureSensor.hh"
18
19 using namespace w1;
20 using namespace std;
21
22 W1Scanner::W1Scanner() {
23         log_debug("created");
24 }
25
26 W1Scanner::~W1Scanner() {
27         log_debug("destroyed");
28 }
29
30 bool W1Scanner::is_subdirectory(dirent *direntry) {
31         bool ret_val    = true;
32         if (strcmp(direntry->d_name, ".") == 0 ||
33                 (strcmp(direntry->d_name, "..") == 0)) {
34                         ret_val = false;
35         }
36         return ret_val;
37 }
38
39 template <class T>
40 bool string_to_number(T& result,
41                  const std::string& string_param,
42                  std::ios_base& (*format)(std::ios_base&))
43 {
44         std::istringstream iss(string_param);
45         return !(iss >> format >> result).fail();
46 }
47
48 W1Device *W1Scanner::create_device(dirent *direntry) {
49         string          folder_name;
50         string          temp_str;
51         string          device_name;
52         int             pos;
53         int                     family_code;
54         bool            sucFlg;
55         W1Device        *ret_val;
56
57         ret_val         = NULL;
58         folder_name     = direntry->d_name;
59         pos                     = folder_name.find("-");
60         if (pos > 0) {
61                 temp_str        = folder_name.substr(0, pos);
62                 // number in string is in hex format, convert to int
63                 sucFlg          = string_to_number<int>(family_code, temp_str, hex);
64                 if (sucFlg == true) {
65                         cout << "family_code: " << family_code << endl;
66                         device_name     = folder_name.substr(pos + 1, folder_name.length() - pos);
67                         switch(family_code) {
68                                 case    0x10:
69                                 case    0x28:
70                                         cout << "temperature sensor: " << family_code << endl;
71                                         ret_val = new W1TemperatureSensor(direntry, family_code, device_name);
72                                         break;
73                         }
74                 }
75         }
76         return ret_val;
77
78 }
79
80 list<W1Device *> W1Scanner::get_device_list() {
81         DIR                     *dir;
82         int                     err_flg;
83         struct dirent           *direntry;
84         W1Device                *device;
85         list<W1Device *>        ret_val;
86
87         dir     = opendir(W1_SCAN_ROOTDIR);
88         if (dir != NULL) {
89                 direntry        = readdir(dir);
90                 while(direntry != NULL) {
91                         if (is_subdirectory(direntry) == true) {
92                                 log_debug("dir_name: %s\n", direntry->d_name);
93                                 device  = create_device(direntry);
94                                 if (device != NULL) {
95                                         ret_val.push_back(device);
96                                 }
97                         }
98                         direntry        = readdir(dir);
99                 }
100                 err_flg = closedir(dir);
101                 if (err_flg < 0) {
102                         log_error("failed to close 1-wire device directory scanned: %s\n", W1_SCAN_ROOTDIR);
103                 }
104         }
105         return ret_val;
106 }