4 * Created on: Mar 3, 2011
12 #include <plp/retval.h>
14 #include <plp/Data.hh>
15 #include <plp/Device.hh>
16 #include <plp/SensorDevice.hh>
17 #include <plp/DeviceConfig.hh>
19 #include "DeviceManagerServer.hh"
20 #include "../src/plp/devicebus/DeviceBusMessageId.hh"
22 using namespace plpdevicebus;
24 static void *device_data_reader_thread(void *thread_args_pointer) {
25 list<Device *> *_dev_lst;
26 list<Device *>::iterator list_iter;
32 read_int_sec = DeviceConfig::get_read_interval_seconds();
35 _dev_lst = (list<Device *> *)thread_args_pointer;
37 for (list_iter = _dev_lst->begin(); list_iter != _dev_lst->end(); list_iter++) {
38 device = (Device *)*list_iter;
39 sensor = dynamic_cast<SensorDevice *>(device);
41 data = sensor->get_data();
51 DeviceManagerServer::DeviceManagerServer(list<Device *> dev_lst_param) {
52 //DeviceConfig::set_base_dir_name(storage_dir_param);
53 //_dev_lst = Factory::get_device_list();
54 _dev_lst = dev_lst_param;
55 /* In some toolchains the size is not unsigned int instead of long
56 unsigned int, and that can cause warnings/errors without typecasting
58 log_info("device count: %lu\n", (long unsigned int)_dev_lst.size());
60 pthread_create(&_lstnr_thrd,
62 device_data_reader_thread,
66 DeviceManagerServer::~DeviceManagerServer() {
69 void decode_device_to_busmessage(const BusMessage *ret_val,
77 if ((ret_val != NULL) &&
80 key << RSP__DEVICE_LIST__ID << indx;
81 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_id());
84 key << RSP__DEVICE_LIST__NAME << indx;
85 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_name());
88 key << RSP__DEVICE_LIST__TYPE << indx;
89 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_type());
92 key << RSP__DEVICE_LIST__LF_STATE << indx;
93 ((BusMessage *)ret_val)->add_int_parameter(key.str(), device->get_lifecycle_state());
94 sensor = dynamic_cast<SensorDevice *>(device);
97 key << RSP__DEVICE_LIST__DATA << indx;
98 data = sensor->get_data();
100 data_str = data->to_string();
101 log_debug("returning data: %s\n", data_str.c_str());
102 ((BusMessage *)ret_val)->add_string_parameter(key.str(), data_str);
109 void DeviceManagerServer::get_device_list(const BusMessage *ret_val) {
110 list<Device *>::iterator list_iter;
115 ((BusMessage *)ret_val)->add_int_parameter(RSP__DEVICE_LIST__DEVICE_COUNT, _dev_lst.size());
116 for (list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) {
117 device = (Device *)*list_iter;
118 decode_device_to_busmessage(ret_val,
125 const Device *DeviceManagerServer::get_device_by_id(string id_param) {
128 list<Device *>::iterator list_iter;
131 for(list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) {
132 device = (Device *)*list_iter;
133 if (device != NULL) {
134 if (device->get_id().compare(id_param) == 0) {
143 static void add_data_values_to_bus_message(const BusMessage *msg_rsp_param,
145 string key_name_base_param) {
148 val_str = data->to_string();
149 ((BusMessage *)msg_rsp_param)->add_string_parameter(key_name_base_param, val_str);
152 void decode_latest_data_to_busmessage(const BusMessage *ret_val,
153 const DataReader *reader) {
157 data = ((DataReader *)reader)->get_latest_data();
159 add_data_values_to_bus_message(ret_val,
161 RSP__LATEST_DATA_VALUE);
162 //((BusMessage *)ret_val)->printout();
165 dr = ((DataReader *)reader)->get_daily_summary(MIN);
167 if (dr->get_count() > 0) {
168 data = dr->get_first();;
169 add_data_values_to_bus_message(ret_val,
171 RSP__MIN_DATA_VALUE);
176 dr = ((DataReader *)reader)->get_daily_summary(MAX);
178 if (dr->get_count() > 0) {
179 data = dr->get_first();
180 add_data_values_to_bus_message(ret_val,
182 RSP__MAX_DATA_VALUE);
189 void decode_first_and_last_data_to_busmessage(const BusMessage *ret_val,
193 data = dr->get_first();
195 add_data_values_to_bus_message(ret_val,
197 RSP__FIRST_DATA_VALUE);
198 //((BusMessage *)ret_val)->printout();
201 data = dr->get_last();
203 add_data_values_to_bus_message(ret_val,
205 RSP__LATEST_DATA_VALUE);
206 //((BusMessage *)ret_val)->printout();
211 void decode_data_range_to_busmessage(const BusMessage *ret_val,
218 count = dr->get_count();
219 ((BusMessage *)ret_val)->add_int_parameter(RSP__COUNT, count);
220 for (ii = 0; ii < count; ii++) {
224 key << RSP__DATA_VALUE << ii;
225 add_data_values_to_bus_message(ret_val,
233 void DeviceManagerServer::get_latest_data(BusMessage *msg_req_param,
234 const BusMessage *ret_val) {
238 SensorDevice *sensor;
240 const DataReader *reader;
242 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
243 if (err_flg == PLP_OK) {
244 dev = (Device *)get_device_by_id(id);
246 sensor = dynamic_cast<SensorDevice *>(dev);
247 if (sensor != NULL) {
248 reader = sensor->get_datareader();
249 decode_latest_data_to_busmessage(ret_val, reader);
255 void DeviceManagerServer::get_data_range(BusMessage *msg_req_param,
256 const BusMessage *ret_val) {
260 SensorDevice *sensor;
262 const DataReader *reader;
265 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
266 if (err_flg == PLP_OK) {
267 dev = (Device *)get_device_by_id(id);
269 sensor = dynamic_cast<SensorDevice *>(dev);
270 if (sensor != NULL) {
271 reader = sensor->get_datareader();
272 if (reader != NULL) {
273 dr = ((DataReader *)reader)->get_data_range();
275 decode_first_and_last_data_to_busmessage(ret_val, dr);
284 void DeviceManagerServer::get_data_between_dates(BusMessage *msg_req_param,
285 const BusMessage *ret_val) {
289 SensorDevice *sensor;
291 const DataReader *reader;
293 string startdate_str;
298 log_debug("started\n");
299 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
300 if (err_flg == PLP_OK)
301 startdate_str = msg_req_param->get_string_parameter(REQ__DATE1, &err_flg);
302 if (err_flg == PLP_OK)
303 enddate_str = msg_req_param->get_string_parameter(REQ__DATE2, &err_flg);
304 log_debug("id: %s, sdate: %s, edate: %s\n", id.c_str(), startdate_str.c_str(), enddate_str.c_str());
305 if (err_flg == PLP_OK) {
306 sdate = Date::parse_date_str(startdate_str);
307 edate = Date::parse_date_str(enddate_str);
308 log_debug("id: %s, sdate: %s, edate: %s\n", id.c_str(), startdate_str.c_str(), enddate_str.c_str());
309 dev = (Device *)get_device_by_id(id);
311 sensor = dynamic_cast<SensorDevice *>(dev);
312 if (sensor != NULL) {
313 reader = sensor->get_datareader();
314 if (reader != NULL) {
315 dr = ((DataReader *)reader)->get_data(&sdate, &edate);
316 log_debug("dr.size: %d\n", dr->get_count());
318 decode_data_range_to_busmessage(ret_val, dr);
326 log_error("Invalid request parameters.\n");