/* * W1Scanner.cc * * Created on: Oct 20, 2010 * Author: lamikr */ #include #include #include #include #include #include #include "W1Scanner.hh" #include "W1TemperatureSensor.hh" #include "W1CounterDevice.hh" using namespace w1; using namespace std; W1Scanner::W1Scanner() { log_debug("created\n"); } W1Scanner::~W1Scanner() { log_debug("destroyed\n"); } bool W1Scanner::is_subdirectory(dirent *direntry) { bool ret_val = true; if (strcmp(direntry->d_name, ".") == 0 || (strcmp(direntry->d_name, "..") == 0)) { ret_val = false; } return ret_val; } template bool string_to_number(T& result, const std::string& string_param, std::ios_base& (*format)(std::ios_base&)) { std::istringstream iss(string_param); return !(iss >> format >> result).fail(); } W1Device *W1Scanner::create_device(dirent *direntry) { string folder_name; string temp_str; string device_name; int pos; int family_code; bool sucFlg; W1Device *ret_val; ret_val = NULL; folder_name = direntry->d_name; pos = folder_name.find("-"); if (pos > 0) { temp_str = folder_name.substr(0, pos); // number in string is in hex format, convert to int sucFlg = string_to_number(family_code, temp_str, hex); if (sucFlg == true) { cout << "family_code: " << family_code << endl; device_name = folder_name.substr(pos + 1, folder_name.length() - pos); switch(family_code) { case 0x10: case 0x28: cout << "temperature sensor: " << family_code << endl; ret_val = new W1TemperatureSensor(direntry, family_code, device_name); break; case 0x1d: cout << "counter device: " << family_code << endl; ret_val = new W1CounterDevice(direntry, family_code, device_name); break; } } } return ret_val; } list W1Scanner::get_device_list() { DIR *dir; int err_flg; struct dirent *direntry; W1Device *device; list ret_val; dir = opendir(W1_SCAN_ROOTDIR); if (dir != NULL) { direntry = readdir(dir); while(direntry != NULL) { if (is_subdirectory(direntry) == true) { log_debug("dir_name: %s\n", direntry->d_name); device = create_device(direntry); if (device != NULL) { ret_val.push_back(device); } } direntry = readdir(dir); } err_flg = closedir(dir); if (err_flg < 0) { log_error("failed to close 1-wire device directory scanned: %s\n", W1_SCAN_ROOTDIR); } } return ret_val; }