/* * DeviceManager.cc * * Created on: Mar 3, 2011 * Author: lamikr */ #include #include #include #include #include #include #include #include #include "DeviceManagerServer.hh" #include "../src/plp/devicebus/DeviceBusMessageId.hh" using namespace plpdevicebus; static void *device_data_reader_thread(void *thread_args_pointer) { list *_dev_lst; list::iterator list_iter; Device *device; SensorDevice *sensor; long read_int_sec; plp::Data *data; read_int_sec = DeviceConfig::get_read_interval_seconds(); if (read_int_sec < 0) read_int_sec = 600; _dev_lst = (list *)thread_args_pointer; while(1) { for (list_iter = _dev_lst->begin(); list_iter != _dev_lst->end(); list_iter++) { device = (Device *)*list_iter; sensor = dynamic_cast(device); if (sensor != NULL) { data = sensor->get_data(); if (data != NULL) delete(data); } } sleep(read_int_sec); } pthread_exit(NULL); } DeviceManagerServer::DeviceManagerServer(list dev_lst_param) { //DeviceConfig::set_base_dir_name(storage_dir_param); //_dev_lst = Factory::get_device_list(); _dev_lst = dev_lst_param; /* In some toolchains the size is not unsigned int instead of long unsigned int, and that can cause warnings/errors without typecasting */ log_info("device count: %lu\n", (long unsigned int)_dev_lst.size()); _lstnr_thrd = 0; pthread_create(&_lstnr_thrd, NULL, device_data_reader_thread, (void *)&_dev_lst); } DeviceManagerServer::~DeviceManagerServer() { } void decode_device_to_busmessage(const BusMessage *ret_val, Device *device, int indx) { ostringstream key; SensorDevice *sensor; Data *data; string data_str; if ((ret_val != NULL) && (device != NULL)) { key.str(""); key << RSP__DEVICE_LIST__ID << indx; ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_id()); key.str(""); key << RSP__DEVICE_LIST__NAME << indx; ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_name()); key.str(""); key << RSP__DEVICE_LIST__TYPE << indx; ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_type()); key.str(""); key << RSP__DEVICE_LIST__LF_STATE << indx; ((BusMessage *)ret_val)->add_int_parameter(key.str(), device->get_lifecycle_state()); sensor = dynamic_cast(device); if (sensor != NULL) { key.str(""); key << RSP__DEVICE_LIST__DATA << indx; data = sensor->get_data(); if (data != NULL) { data_str = data->to_string(); log_debug("returning data: %s\n", data_str.c_str()); ((BusMessage *)ret_val)->add_string_parameter(key.str(), data_str); delete(data); } } } } void DeviceManagerServer::get_device_list(const BusMessage *ret_val) { list::iterator list_iter; Device *device; int indx; indx = 0; ((BusMessage *)ret_val)->add_int_parameter(RSP__DEVICE_LIST__DEVICE_COUNT, _dev_lst.size()); for (list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) { device = (Device *)*list_iter; decode_device_to_busmessage(ret_val, device, indx); indx++; } } const Device *DeviceManagerServer::get_device_by_id(string id_param) { Device *ret_val; Device *device; list::iterator list_iter; ret_val = NULL; for(list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) { device = (Device *)*list_iter; if (device != NULL) { if (device->get_id().compare(id_param) == 0) { ret_val = device; break; } } } return ret_val; } static void add_data_values_to_bus_message(const BusMessage *msg_rsp_param, Data *data, string key_name_base_param) { string val_str; val_str = data->to_string(); ((BusMessage *)msg_rsp_param)->add_string_parameter(key_name_base_param, val_str); } void decode_data_to_busmessage(const BusMessage *ret_val, const DataReader *reader) { DataRange *dr; Data *data; data = ((DataReader *)reader)->get_latest_data(); if (data != NULL) { add_data_values_to_bus_message(ret_val, data, RSP__GET_LATEST_DATA__VALUE); //((BusMessage *)ret_val)->printout(); delete(data); } dr = ((DataReader *)reader)->get_daily_summary(MIN); if (dr != NULL) { if (dr->get_count() > 0) { data = dr->get_first();; add_data_values_to_bus_message(ret_val, data, RSP__GET_LATEST_DATA__MIN_VALUE); delete(data); } delete(dr); } dr = ((DataReader *)reader)->get_daily_summary(MAX); if (dr != NULL) { if (dr->get_count() > 0) { data = dr->get_first(); add_data_values_to_bus_message(ret_val, data, RSP__GET_LATEST_DATA__MAX_VALUE); delete(data); } delete(dr); } } void DeviceManagerServer::get_latest_data(BusMessage *msg_req_param, const BusMessage *ret_val) { string id; int err_flg; Device *dev; SensorDevice *sensor; ostringstream key; const DataReader *reader; id = msg_req_param->get_string_parameter(REQ__GET_LATEST_DATA__ID, &err_flg); if (err_flg == PLP_OK) { dev = (Device *)get_device_by_id(id); if (dev != NULL) { sensor = dynamic_cast(dev); if (sensor != NULL) { reader = sensor->get_device_data(); decode_data_to_busmessage(ret_val, reader); } } } }