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