4 * Created on: Mar 3, 2011
11 #include <plp/retval.h>
13 #include <plp/Data.hh>
14 #include <plp/Device.hh>
15 #include <plp/SensorDevice.hh>
16 #include <plp/DeviceConfig.hh>
18 #include "DeviceManagerServer.hh"
19 #include "../src/plp/devicebus/DeviceBusMessageId.hh"
21 using namespace plpdevicebus;
23 static void *device_data_reader_thread(void *thread_args_pointer) {
24 list<Device *> *_dev_lst;
25 list<Device *>::iterator list_iter;
31 read_int_sec = DeviceConfig::get_read_interval_seconds();
34 _dev_lst = (list<Device *> *)thread_args_pointer;
36 for (list_iter = _dev_lst->begin(); list_iter != _dev_lst->end(); list_iter++) {
37 device = (Device *)*list_iter;
38 sensor = dynamic_cast<SensorDevice *>(device);
40 data = sensor->get_data();
50 DeviceManagerServer::DeviceManagerServer(list<Device *> dev_lst_param) {
51 //DeviceConfig::set_base_dir_name(storage_dir_param);
52 //_dev_lst = Factory::get_device_list();
53 _dev_lst = dev_lst_param;
54 /* In some toolchains the size is not unsigned int instead of long
55 unsigned int, and that can cause warnings/errors without typecasting
57 log_info("device count: %lu\n", (long unsigned int)_dev_lst.size());
59 pthread_create(&_lstnr_thrd,
61 device_data_reader_thread,
65 DeviceManagerServer::~DeviceManagerServer() {
68 void decode_device_to_busmessage(const BusMessage *ret_val,
76 if ((ret_val != NULL) &&
79 key << RSP__DEVICE_LIST__ID << indx;
80 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_id());
83 key << RSP__DEVICE_LIST__NAME << indx;
84 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_name());
87 key << RSP__DEVICE_LIST__TYPE << indx;
88 ((BusMessage *)ret_val)->add_string_parameter(key.str(), device->get_type());
91 key << RSP__DEVICE_LIST__LF_STATE << indx;
92 ((BusMessage *)ret_val)->add_int_parameter(key.str(), device->get_lifecycle_state());
93 sensor = dynamic_cast<SensorDevice *>(device);
96 key << RSP__DEVICE_LIST__DATA << indx;
97 data = sensor->get_data();
99 data_str = data->to_string();
100 log_debug("returning data: %s\n", data_str.c_str());
101 ((BusMessage *)ret_val)->add_string_parameter(key.str(), data_str);
108 void DeviceManagerServer::get_device_list(const BusMessage *ret_val) {
109 list<Device *>::iterator list_iter;
114 ((BusMessage *)ret_val)->add_int_parameter(RSP__DEVICE_LIST__DEVICE_COUNT, _dev_lst.size());
115 for (list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) {
116 device = (Device *)*list_iter;
117 decode_device_to_busmessage(ret_val,
124 const Device *DeviceManagerServer::get_device_by_id(string id_param) {
127 list<Device *>::iterator list_iter;
130 for(list_iter = _dev_lst.begin(); list_iter != _dev_lst.end(); list_iter++) {
131 device = (Device *)*list_iter;
132 if (device != NULL) {
133 if (device->get_id().compare(id_param) == 0) {
142 static void add_data_values_to_bus_message(const BusMessage *msg_rsp_param,
144 string key_name_base_param) {
147 val_str = data->to_string();
148 ((BusMessage *)msg_rsp_param)->add_string_parameter(key_name_base_param, val_str);
151 void decode_latest_data_to_busmessage(const BusMessage *ret_val,
152 const DataReader *reader) {
156 data = ((DataReader *)reader)->get_latest_data();
158 add_data_values_to_bus_message(ret_val,
160 RSP__LATEST_DATA_VALUE);
161 //((BusMessage *)ret_val)->printout();
164 dr = ((DataReader *)reader)->get_daily_summary(MIN);
166 if (dr->get_count() > 0) {
167 data = dr->get_first();;
168 add_data_values_to_bus_message(ret_val,
170 RSP__MIN_DATA_VALUE);
175 dr = ((DataReader *)reader)->get_daily_summary(MAX);
177 if (dr->get_count() > 0) {
178 data = dr->get_first();
179 add_data_values_to_bus_message(ret_val,
181 RSP__MAX_DATA_VALUE);
188 void decode_first_and_last_data_to_busmessage(const BusMessage *ret_val,
192 data = dr->get_first();
194 add_data_values_to_bus_message(ret_val,
196 RSP__FIRST_DATA_VALUE);
197 //((BusMessage *)ret_val)->printout();
200 data = dr->get_last();
202 add_data_values_to_bus_message(ret_val,
204 RSP__LATEST_DATA_VALUE);
205 //((BusMessage *)ret_val)->printout();
210 void decode_data_range_to_busmessage(const BusMessage *ret_val,
217 count = dr->get_count();
218 ((BusMessage *)ret_val)->add_int_parameter(RSP__COUNT, count);
219 for (ii = 0; ii < count; ii++) {
223 key << RSP__DATA_VALUE << ii;
224 add_data_values_to_bus_message(ret_val,
232 void DeviceManagerServer::get_latest_data(BusMessage *msg_req_param,
233 const BusMessage *ret_val) {
237 SensorDevice *sensor;
239 const DataReader *reader;
241 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
242 if (err_flg == PLP_OK) {
243 dev = (Device *)get_device_by_id(id);
245 sensor = dynamic_cast<SensorDevice *>(dev);
246 if (sensor != NULL) {
247 reader = sensor->get_datareader();
248 decode_latest_data_to_busmessage(ret_val, reader);
254 void DeviceManagerServer::get_data_range(BusMessage *msg_req_param,
255 const BusMessage *ret_val) {
259 SensorDevice *sensor;
261 const DataReader *reader;
264 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
265 if (err_flg == PLP_OK) {
266 dev = (Device *)get_device_by_id(id);
268 sensor = dynamic_cast<SensorDevice *>(dev);
269 if (sensor != NULL) {
270 reader = sensor->get_datareader();
271 if (reader != NULL) {
272 dr = ((DataReader *)reader)->get_data_range();
274 decode_first_and_last_data_to_busmessage(ret_val, dr);
283 void DeviceManagerServer::get_data_between_dates(BusMessage *msg_req_param,
284 const BusMessage *ret_val) {
288 SensorDevice *sensor;
290 const DataReader *reader;
292 string startdate_str;
297 log_debug("started\n");
298 id = msg_req_param->get_string_parameter(REQ__DEVICE_ID, &err_flg);
299 if (err_flg == PLP_OK)
300 startdate_str = msg_req_param->get_string_parameter(REQ__DATE1, &err_flg);
301 if (err_flg == PLP_OK)
302 enddate_str = msg_req_param->get_string_parameter(REQ__DATE2, &err_flg);
303 log_debug("id: %s, sdate: %s, edate: %s\n", id.c_str(), startdate_str.c_str(), enddate_str.c_str());
304 if (err_flg == PLP_OK) {
305 sdate = Date::parse_date_str(startdate_str);
306 edate = Date::parse_date_str(enddate_str);
307 log_debug("id: %s, sdate: %s, edate: %s\n", id.c_str(), startdate_str.c_str(), enddate_str.c_str());
308 dev = (Device *)get_device_by_id(id);
310 sensor = dynamic_cast<SensorDevice *>(dev);
311 if (sensor != NULL) {
312 reader = sensor->get_datareader();
313 if (reader != NULL) {
314 dr = ((DataReader *)reader)->get_data(&sdate, &edate);
315 log_debug("dr.size: %d\n", dr->get_count());
317 decode_data_range_to_busmessage(ret_val, dr);
325 log_error("Invalid request parameters.\n");