X-Git-Url: http://pilppa.org/gitweb/?p=lib1wire.git;a=blobdiff_plain;f=src%2FFactory.cc;fp=src%2FFactory.cc;h=d9556e376e4ecc05fe47d06e8d1e1c70f2351b09;hp=76287eb17f553ad89f4a7b24c47fb683c6fa75df;hb=da203ad44792ca37320768f4cbe68587c4806910;hpb=6caee6cb22c1334701afe7aa30bcf9668ca3a5c5 diff --git a/src/Factory.cc b/src/Factory.cc index 76287eb..d9556e3 100644 --- a/src/Factory.cc +++ b/src/Factory.cc @@ -12,6 +12,8 @@ #include #include + +#include "DeviceTypes.hh" #include "Factory.hh" #include "W1TemperatureSensor.hh" #include "W1CounterDevice.hh" @@ -38,33 +40,64 @@ Factory::~Factory() { // TODO Auto-generated destructor stub } -W1Device *Factory::get_device(int family_code, - string device_id, +int Factory::get_family_code_by_device_type(string device_type_param) { + int ret_val = -1; + + if (device_type_param.compare(DEVICE_TYPE_TEMPERATURESENSOR) == 0) { + ret_val = 0x10; + } + else if (device_type_param.compare(DEVICE_TYPE_COUNTER_DEVICE) == 0) { + ret_val = 0x1d; + } + return ret_val; +} + +string Factory::get_device_type_by_family_code(int family_code_param) { + string ret_val; + + switch(family_code_param) { + case 0x10: + case 0x28: + ret_val = DEVICE_TYPE_TEMPERATURESENSOR; + break; + case 0x1d: + ret_val = DEVICE_TYPE_COUNTER_DEVICE; + break; + default: + ret_val = DEVICE_TYPE_UNKNOWN; + log_error("Unknown w1 device type: %d\n", family_code_param); + break; + } + return ret_val; +} + +Device *Factory::create_w1_device(int family_code_param, + string device_id_param, dirent *direntry_param) { - W1Device *ret_val; + Device *ret_val; DeviceConfig *config; string type; ret_val = NULL; - switch(family_code) { + type = get_device_type_by_family_code(family_code_param); + switch(family_code_param) { case 0x10: case 0x28: - ret_val = new W1TemperatureSensor(family_code, device_id, direntry_param); + ret_val = new W1TemperatureSensor(type, device_id_param, direntry_param); break; case 0x1d: - ret_val = new W1CounterDevice(family_code, device_id, direntry_param); + ret_val = new W1CounterDevice(type, device_id_param, direntry_param); break; case 0x81: // 0x81 is the 1-wire USB dongle... No need to create device for it. break; default: - log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code, device_id.c_str()); + log_debug("Unsupported 1-wire-family code: %#x, device not created: %s\n", family_code_param, device_id_param.c_str()); break; } if (ret_val != NULL) { - log_debug("%s: %#x\n", ret_val->get_device_type().c_str(), ret_val->get_w1_family_code()); // check that device config exist - config = get_device_config(device_id); + config = get_device_config(device_id_param); if (config != NULL) { // if not, create default device config type = config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE); @@ -79,14 +112,24 @@ W1Device *Factory::get_device(int family_code, return ret_val; } -W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) { - string folder_name; - string tmp_str; - string device_name; - int pos; - int family_code; - bool suc_flg; - W1Device *ret_val; +Device *Factory::create_w1_device(string device_type_param, + string device_id_param) { + int family_code; + Device *ret_val; + + family_code = get_family_code_by_device_type(device_type_param); + ret_val = create_w1_device(family_code, device_id_param, NULL); + return ret_val; +} + +Device *Factory::create_w1_device(dirent *direntry_param, int *err_code_param) { + string folder_name; + string tmp_str; + string device_name; + int pos; + int family_code; + bool suc_flg; + Device *ret_val; ret_val = NULL; *err_code_param = 0; @@ -101,7 +144,7 @@ W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) { if (suc_flg == true) { log_debug("1-wire device family code: %#x\n", family_code); device_name = folder_name.substr(pos + 1, folder_name.length() - pos); - ret_val = Factory::get_device(family_code, + ret_val = Factory::create_w1_device(family_code, device_name, direntry_param); if ((ret_val == NULL) && @@ -114,14 +157,24 @@ W1Device *Factory::create_device(dirent *direntry_param, int *err_code_param) { return ret_val; } -list Factory::get_device_list() { - DIR *dir; - int err_flg; - struct dirent *direntry; - W1Device *device; - bool is_subdir; - list ret_val; +list Factory::get_device_list() { + DIR *dir; + int err_flg; + struct dirent *direntry; + Device *device; + bool is_subdir; + list rdr_list; + list ret_val; + list::iterator dev_iter; + list::iterator rdr_iter; + DataReader *reader; + string id1; + string id2; + string type; + string dev_type; + bool found; + // scan through the list of devices detected from the 1-wire network dir = opendir(W1_SCAN_ROOTDIR); if (dir != NULL) { direntry = readdir(dir); @@ -129,7 +182,7 @@ list Factory::get_device_list() { is_subdir = W1Util::is_subdirectory(W1_SCAN_ROOTDIR, direntry); if (is_subdir == true) { err_flg = 0; - device = create_device(direntry, &err_flg); + device = create_w1_device(direntry, &err_flg); if (device != NULL) { ret_val.push_back(device); } @@ -146,17 +199,38 @@ list Factory::get_device_list() { log_error("Failed to close 1-wire device directory: %s\n", W1_SCAN_ROOTDIR); } } + // scan through the list of devices which have saved data + rdr_list = get_data_reader_list(); + for (rdr_iter = rdr_list.begin(); rdr_iter != rdr_list.end(); rdr_iter++) { + reader = (DataReader *)*rdr_iter; + id1 = reader->get_device_id(); + found = false; + for (dev_iter = ret_val.begin(); dev_iter != ret_val.end(); dev_iter++) { + device = (Device *)*dev_iter; + id2 = device->get_id(); + if (id1.compare(id2) == 0) { + found = true; + break; + } + } + if (found == false) { + // reader device is not in the list of active devices. create and add it to list as in-active one... + type = reader->get_device_type(); + device = create_w1_device(type, id1); + ret_val.push_back(device); + } + } return ret_val; } -list Factory::get_device_data_list() { +list Factory::get_data_reader_list() { DIR *dir; string dr_name; int err_flg; struct dirent *direntry; - DeviceData *dev_dta; + DataReader *reader; bool is_subdir; - list ret_val; + list ret_val; dr_name = DeviceConfig::get_base_dir_name(); dir = opendir(dr_name.c_str()); @@ -166,8 +240,8 @@ list Factory::get_device_data_list() { if (strcmp(direntry->d_name, "cache") != 0) { is_subdir = W1Util::is_subdirectory(dr_name.c_str(), direntry); if (is_subdir == true) { - dev_dta = new DeviceData(direntry->d_name); - ret_val.push_back(dev_dta); + reader = new DataReader(direntry->d_name); + ret_val.push_back(reader); } } direntry = readdir(dir);