/* * W1Scanner.cc * * Created on: Oct 20, 2010 * Author: lamikr */ #include #include #include #include #include #include #include "W1Util.hh" #include "W1Scanner.hh" #include "W1TemperatureSensor.hh" #include "W1CounterDevice.hh" using namespace w1; using namespace std; template bool string_to_number(NumberDataType& result, const std::string& string_param, std::ios_base& (*format)(std::ios_base&)) { std::istringstream iss(string_param); return !(iss >> format >> result).fail(); } W1Scanner::W1Scanner() { log_debug("W1Scanner created\n"); } W1Scanner::~W1Scanner() { } W1Device *W1Scanner::create_device(dirent *direntry) { string folder_name; string tmp_str; string device_name; int pos; int family_code; bool suc_flg; W1Device *ret_val; ret_val = NULL; folder_name = direntry->d_name; pos = folder_name.find("-"); if (pos > 0) { tmp_str = folder_name.substr(0, pos); // number in string is in hex format, convert to int suc_flg = string_to_number(family_code, tmp_str, hex); if (suc_flg == true) { log_debug("family_code: %d\n", family_code); device_name = folder_name.substr(pos + 1, folder_name.length() - pos); switch(family_code) { case 0x10: case 0x28: ret_val = new W1TemperatureSensor(direntry, family_code, device_name); log_debug("temperature sensor: %d\n", ret_val->get_family_code()); break; case 0x1d: log_debug("counter device: %d\n", family_code); ret_val = new W1CounterDevice(direntry, family_code, device_name); break; default: log_debug("device not created the device, unsupported device type: %d\n", family_code); break; } } } return ret_val; } list W1Scanner::get_device_list() { DIR *dir; int err_flg; struct dirent *direntry; W1Device *device; list ret_val; bool is_subdir; printf("get_device_list() started\n"); dir = opendir(W1_SCAN_ROOTDIR); if (dir != NULL) { direntry = readdir(dir); while(direntry != NULL) { is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry); if (is_subdir == true) { log_info("dir_name: %s\n", direntry->d_name); device = create_device(direntry); if (device != NULL) { log_info("device: %d\n", device->get_family_code()); ret_val.push_back(device); } else { log_info("unsupported device-directory: %s\n", direntry->d_name); } } 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; }