FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:37:05 2017 +0000
Revision:
0:dbad57390bd1
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:dbad57390bd1 1 /*
ram54288 0:dbad57390bd1 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
ram54288 0:dbad57390bd1 3 * SPDX-License-Identifier: Apache-2.0
ram54288 0:dbad57390bd1 4 * Licensed under the Apache License, Version 2.0 (the License); you may
ram54288 0:dbad57390bd1 5 * not use this file except in compliance with the License.
ram54288 0:dbad57390bd1 6 * You may obtain a copy of the License at
ram54288 0:dbad57390bd1 7 *
ram54288 0:dbad57390bd1 8 * http://www.apache.org/licenses/LICENSE-2.0
ram54288 0:dbad57390bd1 9 *
ram54288 0:dbad57390bd1 10 * Unless required by applicable law or agreed to in writing, software
ram54288 0:dbad57390bd1 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
ram54288 0:dbad57390bd1 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ram54288 0:dbad57390bd1 13 * See the License for the specific language governing permissions and
ram54288 0:dbad57390bd1 14 * limitations under the License.
ram54288 0:dbad57390bd1 15 */
ram54288 0:dbad57390bd1 16 #include "mbed-client/m2mreportobserver.h"
ram54288 0:dbad57390bd1 17 #include "mbed-client/m2mconstants.h"
ram54288 0:dbad57390bd1 18 #include "mbed-client/m2mtimer.h"
ram54288 0:dbad57390bd1 19 #include "include/m2mreporthandler.h"
ram54288 0:dbad57390bd1 20 #include "mbed-trace/mbed_trace.h"
ram54288 0:dbad57390bd1 21 #include <string.h>
ram54288 0:dbad57390bd1 22 #include <stdlib.h>
ram54288 0:dbad57390bd1 23
ram54288 0:dbad57390bd1 24 #define TRACE_GROUP "mClt"
ram54288 0:dbad57390bd1 25
ram54288 0:dbad57390bd1 26 M2MReportHandler::M2MReportHandler(M2MReportObserver &observer)
ram54288 0:dbad57390bd1 27 : _observer(observer),
ram54288 0:dbad57390bd1 28 _attribute_state(0),
ram54288 0:dbad57390bd1 29 _notify(false),
ram54288 0:dbad57390bd1 30 _pmin_exceeded(false),
ram54288 0:dbad57390bd1 31 _pmax_exceeded(false),
ram54288 0:dbad57390bd1 32 _pmin_timer(*this),
ram54288 0:dbad57390bd1 33 _pmax_timer(*this),
ram54288 0:dbad57390bd1 34 _pmax(-1.0f),
ram54288 0:dbad57390bd1 35 _pmin(1.0f),
ram54288 0:dbad57390bd1 36 _current_value(0.0f),
ram54288 0:dbad57390bd1 37 _gt(0.0f),
ram54288 0:dbad57390bd1 38 _lt(0.0f),
ram54288 0:dbad57390bd1 39 _st(0.0f),
ram54288 0:dbad57390bd1 40 _high_step(0.0f),
ram54288 0:dbad57390bd1 41 _low_step(0.0f),
ram54288 0:dbad57390bd1 42 _last_value(-1.0f)
ram54288 0:dbad57390bd1 43 {
ram54288 0:dbad57390bd1 44 tr_debug("M2MReportHandler::M2MReportHandler()");
ram54288 0:dbad57390bd1 45 }
ram54288 0:dbad57390bd1 46
ram54288 0:dbad57390bd1 47 M2MReportHandler::~M2MReportHandler()
ram54288 0:dbad57390bd1 48 {
ram54288 0:dbad57390bd1 49 tr_debug("M2MReportHandler::~M2MReportHandler()");
ram54288 0:dbad57390bd1 50 }
ram54288 0:dbad57390bd1 51
ram54288 0:dbad57390bd1 52 void M2MReportHandler::set_under_observation(bool observed)
ram54288 0:dbad57390bd1 53 {
ram54288 0:dbad57390bd1 54 tr_debug("M2MReportHandler::set_under_observation(observed %d)", (int)observed);
ram54288 0:dbad57390bd1 55 stop_timers();
ram54288 0:dbad57390bd1 56 if(observed) {
ram54288 0:dbad57390bd1 57 handle_timers();
ram54288 0:dbad57390bd1 58 }
ram54288 0:dbad57390bd1 59 else {
ram54288 0:dbad57390bd1 60 set_default_values();
ram54288 0:dbad57390bd1 61 }
ram54288 0:dbad57390bd1 62 }
ram54288 0:dbad57390bd1 63
ram54288 0:dbad57390bd1 64 void M2MReportHandler::set_value(float value)
ram54288 0:dbad57390bd1 65 {
ram54288 0:dbad57390bd1 66 tr_debug("M2MReportHandler::set_value() - current %f, last %f", value, _last_value);
ram54288 0:dbad57390bd1 67 _current_value = value;
ram54288 0:dbad57390bd1 68 if(_current_value != _last_value) {
ram54288 0:dbad57390bd1 69 tr_debug("M2MReportHandler::set_value() - UNDER OBSERVATION");
ram54288 0:dbad57390bd1 70 if (check_threshold_values()) {
ram54288 0:dbad57390bd1 71 schedule_report();
ram54288 0:dbad57390bd1 72 }
ram54288 0:dbad57390bd1 73 else {
ram54288 0:dbad57390bd1 74 tr_debug("M2MReportHandler::set_value - value not in range");
ram54288 0:dbad57390bd1 75 _notify = false;
ram54288 0:dbad57390bd1 76 _last_value = _current_value;
ram54288 0:dbad57390bd1 77 if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt ||
ram54288 0:dbad57390bd1 78 (_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt ||
ram54288 0:dbad57390bd1 79 (_attribute_state & M2MReportHandler::St) == M2MReportHandler::St) {
ram54288 0:dbad57390bd1 80 tr_debug("M2MReportHandler::set_value - stop pmin timer");
ram54288 0:dbad57390bd1 81 _pmin_timer.stop_timer();
ram54288 0:dbad57390bd1 82 _pmin_exceeded = true;
ram54288 0:dbad57390bd1 83 }
ram54288 0:dbad57390bd1 84 }
ram54288 0:dbad57390bd1 85 _high_step = _current_value + _st;
ram54288 0:dbad57390bd1 86 _low_step = _current_value - _st;
ram54288 0:dbad57390bd1 87 }
ram54288 0:dbad57390bd1 88 }
ram54288 0:dbad57390bd1 89
ram54288 0:dbad57390bd1 90 void M2MReportHandler::set_notification_trigger(uint16_t obj_instance_id)
ram54288 0:dbad57390bd1 91 {
ram54288 0:dbad57390bd1 92 tr_debug("M2MReportHandler::set_notification_trigger(): %d", obj_instance_id);
ram54288 0:dbad57390bd1 93 // Add to array if not there yet
ram54288 0:dbad57390bd1 94 m2m::Vector<uint16_t>::const_iterator it;
ram54288 0:dbad57390bd1 95 it = _changed_instance_ids.begin();
ram54288 0:dbad57390bd1 96 bool found = false;
ram54288 0:dbad57390bd1 97 for ( ; it != _changed_instance_ids.end(); it++) {
ram54288 0:dbad57390bd1 98 if ((*it) == obj_instance_id) {
ram54288 0:dbad57390bd1 99 found = true;
ram54288 0:dbad57390bd1 100 break;
ram54288 0:dbad57390bd1 101 }
ram54288 0:dbad57390bd1 102 }
ram54288 0:dbad57390bd1 103 if (!found) {
ram54288 0:dbad57390bd1 104 _changed_instance_ids.push_back(obj_instance_id);
ram54288 0:dbad57390bd1 105 }
ram54288 0:dbad57390bd1 106
ram54288 0:dbad57390bd1 107 _current_value = 0.0f;
ram54288 0:dbad57390bd1 108 _last_value = 1.0f;
ram54288 0:dbad57390bd1 109 schedule_report();
ram54288 0:dbad57390bd1 110 }
ram54288 0:dbad57390bd1 111
ram54288 0:dbad57390bd1 112 bool M2MReportHandler::parse_notification_attribute(const char *query,
ram54288 0:dbad57390bd1 113 M2MBase::BaseType type,
ram54288 0:dbad57390bd1 114 M2MResourceInstance::ResourceType resource_type)
ram54288 0:dbad57390bd1 115 {
ram54288 0:dbad57390bd1 116 tr_debug("M2MReportHandler::parse_notification_attribute(Query %s, Base type %d)", query, (int)type);
ram54288 0:dbad57390bd1 117 bool success = false;
ram54288 0:dbad57390bd1 118 const char* sep_pos = strchr(query, '&');
ram54288 0:dbad57390bd1 119 const char* rest = query;
ram54288 0:dbad57390bd1 120 if( sep_pos != NULL ){
ram54288 0:dbad57390bd1 121 char query_options[5][20];
ram54288 0:dbad57390bd1 122 float pmin = _pmin;
ram54288 0:dbad57390bd1 123 float pmax = _pmax;
ram54288 0:dbad57390bd1 124 float lt = _lt;
ram54288 0:dbad57390bd1 125 float gt = _gt;
ram54288 0:dbad57390bd1 126 float st = _st;
ram54288 0:dbad57390bd1 127 float high = _high_step;
ram54288 0:dbad57390bd1 128 float low = _low_step;
ram54288 0:dbad57390bd1 129 uint8_t attr = _attribute_state;
ram54288 0:dbad57390bd1 130
ram54288 0:dbad57390bd1 131 memset(query_options, 0, sizeof(query_options[0][0]) * 5 * 20);
ram54288 0:dbad57390bd1 132 uint8_t num_options = 0;
ram54288 0:dbad57390bd1 133 while( sep_pos != NULL && num_options < 5){
ram54288 0:dbad57390bd1 134 size_t len = (size_t)(sep_pos-rest);
ram54288 0:dbad57390bd1 135 if( len > 19 ){
ram54288 0:dbad57390bd1 136 len = 19;
ram54288 0:dbad57390bd1 137 }
ram54288 0:dbad57390bd1 138 memcpy(query_options[num_options], rest, len);
ram54288 0:dbad57390bd1 139 sep_pos++;
ram54288 0:dbad57390bd1 140 rest = sep_pos;
ram54288 0:dbad57390bd1 141 sep_pos = strchr(rest, '&');
ram54288 0:dbad57390bd1 142 num_options++;
ram54288 0:dbad57390bd1 143 }
ram54288 0:dbad57390bd1 144 if( num_options < 5 && strlen(rest) > 0){
ram54288 0:dbad57390bd1 145 size_t len = (size_t)strlen(rest);
ram54288 0:dbad57390bd1 146 if( len > 19 ){
ram54288 0:dbad57390bd1 147 len = 19;
ram54288 0:dbad57390bd1 148 }
ram54288 0:dbad57390bd1 149 memcpy(query_options[num_options++], rest, len);
ram54288 0:dbad57390bd1 150 }
ram54288 0:dbad57390bd1 151
ram54288 0:dbad57390bd1 152 for (int option = 0; option < num_options; option++) {
ram54288 0:dbad57390bd1 153 success = set_notification_attribute(query_options[option],type, resource_type);
ram54288 0:dbad57390bd1 154 if (!success) {
ram54288 0:dbad57390bd1 155 tr_debug("M2MReportHandler::parse_notification_attribute - break");
ram54288 0:dbad57390bd1 156 break;
ram54288 0:dbad57390bd1 157 }
ram54288 0:dbad57390bd1 158 }
ram54288 0:dbad57390bd1 159
ram54288 0:dbad57390bd1 160 if(success) {
ram54288 0:dbad57390bd1 161 success = check_attribute_validity();
ram54288 0:dbad57390bd1 162 }
ram54288 0:dbad57390bd1 163 else {
ram54288 0:dbad57390bd1 164 tr_debug("M2MReportHandler::parse_notification_attribute - not valid query");
ram54288 0:dbad57390bd1 165 _pmin = pmin;
ram54288 0:dbad57390bd1 166 _pmax = pmax;
ram54288 0:dbad57390bd1 167 _st = st;
ram54288 0:dbad57390bd1 168 _lt = lt;
ram54288 0:dbad57390bd1 169 _gt = gt;
ram54288 0:dbad57390bd1 170 _high_step = high;
ram54288 0:dbad57390bd1 171 _low_step = low;
ram54288 0:dbad57390bd1 172 _attribute_state = attr;
ram54288 0:dbad57390bd1 173 }
ram54288 0:dbad57390bd1 174 }
ram54288 0:dbad57390bd1 175 else {
ram54288 0:dbad57390bd1 176 if(set_notification_attribute(query, type, resource_type)) {
ram54288 0:dbad57390bd1 177 success = check_attribute_validity();
ram54288 0:dbad57390bd1 178 }
ram54288 0:dbad57390bd1 179 }
ram54288 0:dbad57390bd1 180
ram54288 0:dbad57390bd1 181 return success;
ram54288 0:dbad57390bd1 182 }
ram54288 0:dbad57390bd1 183
ram54288 0:dbad57390bd1 184 void M2MReportHandler::timer_expired(M2MTimerObserver::Type type)
ram54288 0:dbad57390bd1 185 {
ram54288 0:dbad57390bd1 186 switch(type) {
ram54288 0:dbad57390bd1 187 case M2MTimerObserver::PMinTimer: {
ram54288 0:dbad57390bd1 188 tr_debug("M2MReportHandler::timer_expired - PMIN");
ram54288 0:dbad57390bd1 189 if (_notify ||
ram54288 0:dbad57390bd1 190 (_pmin > 0 &&
ram54288 0:dbad57390bd1 191 (_attribute_state & M2MReportHandler::Pmax) != M2MReportHandler::Pmax)){
ram54288 0:dbad57390bd1 192 report();
ram54288 0:dbad57390bd1 193 }
ram54288 0:dbad57390bd1 194 else{
ram54288 0:dbad57390bd1 195 _pmin_exceeded = true;
ram54288 0:dbad57390bd1 196 }
ram54288 0:dbad57390bd1 197 }
ram54288 0:dbad57390bd1 198 break;
ram54288 0:dbad57390bd1 199 case M2MTimerObserver::PMaxTimer: {
ram54288 0:dbad57390bd1 200 tr_debug("M2MReportHandler::timer_expired - PMAX");
ram54288 0:dbad57390bd1 201 _pmax_exceeded = true;
ram54288 0:dbad57390bd1 202 if (_pmin_exceeded ||
ram54288 0:dbad57390bd1 203 (_attribute_state & M2MReportHandler::Pmin) != M2MReportHandler::Pmin ) {
ram54288 0:dbad57390bd1 204 report();
ram54288 0:dbad57390bd1 205 }
ram54288 0:dbad57390bd1 206 }
ram54288 0:dbad57390bd1 207 break;
ram54288 0:dbad57390bd1 208 default:
ram54288 0:dbad57390bd1 209 break;
ram54288 0:dbad57390bd1 210 }
ram54288 0:dbad57390bd1 211 }
ram54288 0:dbad57390bd1 212
ram54288 0:dbad57390bd1 213 bool M2MReportHandler::set_notification_attribute(const char* option,
ram54288 0:dbad57390bd1 214 M2MBase::BaseType type,
ram54288 0:dbad57390bd1 215 M2MResourceInstance::ResourceType resource_type)
ram54288 0:dbad57390bd1 216 {
ram54288 0:dbad57390bd1 217 tr_debug("M2MReportHandler::set_notification_attribute()");
ram54288 0:dbad57390bd1 218 bool success = false;
ram54288 0:dbad57390bd1 219 char attribute[20];
ram54288 0:dbad57390bd1 220 char value[20];
ram54288 0:dbad57390bd1 221 memset(&attribute, 0, 20);
ram54288 0:dbad57390bd1 222 memset(&value, 0, 20);
ram54288 0:dbad57390bd1 223
ram54288 0:dbad57390bd1 224 const char* pos = strstr(option, EQUAL);
ram54288 0:dbad57390bd1 225 if( pos != NULL ){
ram54288 0:dbad57390bd1 226 memcpy(attribute, option, (size_t)(pos-option));
ram54288 0:dbad57390bd1 227 pos++;
ram54288 0:dbad57390bd1 228 memcpy(value, pos, strlen(pos));
ram54288 0:dbad57390bd1 229 }else{
ram54288 0:dbad57390bd1 230 memcpy(attribute, option, (size_t)strlen(option) + 1);
ram54288 0:dbad57390bd1 231 }
ram54288 0:dbad57390bd1 232
ram54288 0:dbad57390bd1 233 if (strlen(value)) {
ram54288 0:dbad57390bd1 234 if (strcmp(attribute, PMIN) == 0) {
ram54288 0:dbad57390bd1 235 _pmin = atoi(value);
ram54288 0:dbad57390bd1 236 success = true;
ram54288 0:dbad57390bd1 237 _attribute_state |= M2MReportHandler::Pmin;
ram54288 0:dbad57390bd1 238 tr_debug("M2MReportHandler::set_notification_attribute %s to %d", attribute, _pmin);
ram54288 0:dbad57390bd1 239 }
ram54288 0:dbad57390bd1 240 else if(strcmp(attribute, PMAX) == 0) {
ram54288 0:dbad57390bd1 241 _pmax = atoi(value);
ram54288 0:dbad57390bd1 242 success = true;
ram54288 0:dbad57390bd1 243 _attribute_state |= M2MReportHandler::Pmax;
ram54288 0:dbad57390bd1 244 tr_debug("M2MReportHandler::set_notification_attribute %s to %d", attribute, _pmax);
ram54288 0:dbad57390bd1 245 }
ram54288 0:dbad57390bd1 246 else if(strcmp(attribute, GT) == 0 &&
ram54288 0:dbad57390bd1 247 (M2MBase::Resource == type)){
ram54288 0:dbad57390bd1 248 _gt = atof(value);
ram54288 0:dbad57390bd1 249 success = true;
ram54288 0:dbad57390bd1 250 _attribute_state |= M2MReportHandler::Gt;
ram54288 0:dbad57390bd1 251 tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _gt);
ram54288 0:dbad57390bd1 252 }
ram54288 0:dbad57390bd1 253 else if(strcmp(attribute, LT) == 0 &&
ram54288 0:dbad57390bd1 254 (M2MBase::Resource == type)){
ram54288 0:dbad57390bd1 255 _lt = atof(value);
ram54288 0:dbad57390bd1 256 success = true;
ram54288 0:dbad57390bd1 257 _attribute_state |= M2MReportHandler::Lt;
ram54288 0:dbad57390bd1 258 tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _lt);
ram54288 0:dbad57390bd1 259 }
ram54288 0:dbad57390bd1 260 else if((strcmp(attribute, ST_SIZE) == 0 || (strcmp(attribute, STP) == 0))
ram54288 0:dbad57390bd1 261 && (M2MBase::Resource == type)){
ram54288 0:dbad57390bd1 262 _st = atof(value);
ram54288 0:dbad57390bd1 263 success = true;
ram54288 0:dbad57390bd1 264 _high_step = _current_value + _st;
ram54288 0:dbad57390bd1 265 _low_step = _current_value - _st;
ram54288 0:dbad57390bd1 266 _attribute_state |= M2MReportHandler::St;
ram54288 0:dbad57390bd1 267 tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _st);
ram54288 0:dbad57390bd1 268 }
ram54288 0:dbad57390bd1 269 // Return false if try to set gt,lt or st when the resource type is something else than numerical
ram54288 0:dbad57390bd1 270 if ((resource_type != M2MResourceInstance::INTEGER &&
ram54288 0:dbad57390bd1 271 resource_type != M2MResourceInstance::FLOAT) &&
ram54288 0:dbad57390bd1 272 ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt ||
ram54288 0:dbad57390bd1 273 (_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt ||
ram54288 0:dbad57390bd1 274 (_attribute_state & M2MReportHandler::St) == M2MReportHandler::St)) {
ram54288 0:dbad57390bd1 275 tr_debug("M2MReportHandler::set_notification_attribute - not numerical resource");
ram54288 0:dbad57390bd1 276 success = false;
ram54288 0:dbad57390bd1 277 }
ram54288 0:dbad57390bd1 278 }
ram54288 0:dbad57390bd1 279 return success;
ram54288 0:dbad57390bd1 280 }
ram54288 0:dbad57390bd1 281
ram54288 0:dbad57390bd1 282 void M2MReportHandler::schedule_report()
ram54288 0:dbad57390bd1 283 {
ram54288 0:dbad57390bd1 284 tr_debug("M2MReportHandler::schedule_report()");
ram54288 0:dbad57390bd1 285 _notify = true;
ram54288 0:dbad57390bd1 286 if ((_attribute_state & M2MReportHandler::Pmin) != M2MReportHandler::Pmin ||
ram54288 0:dbad57390bd1 287 _pmin_exceeded) {
ram54288 0:dbad57390bd1 288 report();
ram54288 0:dbad57390bd1 289 }
ram54288 0:dbad57390bd1 290 }
ram54288 0:dbad57390bd1 291
ram54288 0:dbad57390bd1 292 void M2MReportHandler::report()
ram54288 0:dbad57390bd1 293 {
ram54288 0:dbad57390bd1 294 tr_debug("M2MReportHandler::report()");
ram54288 0:dbad57390bd1 295 if(_current_value != _last_value && _notify) {
ram54288 0:dbad57390bd1 296 tr_debug("M2MReportHandler::report()- send with PMIN");
ram54288 0:dbad57390bd1 297 _pmin_exceeded = false;
ram54288 0:dbad57390bd1 298 _pmax_exceeded = false;
ram54288 0:dbad57390bd1 299 _notify = false;
ram54288 0:dbad57390bd1 300 _observer.observation_to_be_sent(_changed_instance_ids);
ram54288 0:dbad57390bd1 301 _changed_instance_ids.clear();
ram54288 0:dbad57390bd1 302 _pmax_timer.stop_timer();
ram54288 0:dbad57390bd1 303 }
ram54288 0:dbad57390bd1 304 else {
ram54288 0:dbad57390bd1 305 if (_pmax_exceeded) {
ram54288 0:dbad57390bd1 306 tr_debug("M2MReportHandler::report()- send with PMAX");
ram54288 0:dbad57390bd1 307 _observer.observation_to_be_sent(_changed_instance_ids, true);
ram54288 0:dbad57390bd1 308 _changed_instance_ids.clear();
ram54288 0:dbad57390bd1 309 }
ram54288 0:dbad57390bd1 310 else {
ram54288 0:dbad57390bd1 311 tr_debug("M2MReportHandler::report()- no need to send");
ram54288 0:dbad57390bd1 312 }
ram54288 0:dbad57390bd1 313 }
ram54288 0:dbad57390bd1 314 handle_timers();
ram54288 0:dbad57390bd1 315 _last_value = _current_value;
ram54288 0:dbad57390bd1 316 }
ram54288 0:dbad57390bd1 317
ram54288 0:dbad57390bd1 318 void M2MReportHandler::handle_timers()
ram54288 0:dbad57390bd1 319 {
ram54288 0:dbad57390bd1 320 tr_debug("M2MReportHandler::handle_timers()");
ram54288 0:dbad57390bd1 321 uint64_t time_interval = 0;
ram54288 0:dbad57390bd1 322 if ((_attribute_state & M2MReportHandler::Pmin) == M2MReportHandler::Pmin) {
ram54288 0:dbad57390bd1 323 if (_pmin == _pmax) {
ram54288 0:dbad57390bd1 324 _pmin_exceeded = true;
ram54288 0:dbad57390bd1 325 } else {
ram54288 0:dbad57390bd1 326 _pmin_exceeded = false;
ram54288 0:dbad57390bd1 327 time_interval = (uint64_t) ((uint64_t)_pmin * 1000);
ram54288 0:dbad57390bd1 328 tr_debug("M2MReportHandler::handle_timers() - Start PMIN interval: %d", (int)time_interval);
ram54288 0:dbad57390bd1 329 _pmin_timer.start_timer(time_interval,
ram54288 0:dbad57390bd1 330 M2MTimerObserver::PMinTimer,
ram54288 0:dbad57390bd1 331 true);
ram54288 0:dbad57390bd1 332 }
ram54288 0:dbad57390bd1 333 }
ram54288 0:dbad57390bd1 334 if ((_attribute_state & M2MReportHandler::Pmax) == M2MReportHandler::Pmax) {
ram54288 0:dbad57390bd1 335 if (_pmax > 0) {
ram54288 0:dbad57390bd1 336 time_interval = (uint64_t) ((uint64_t)_pmax * 1000);
ram54288 0:dbad57390bd1 337 tr_debug("M2MReportHandler::handle_timers() - Start PMAX interval: %d", (int)time_interval);
ram54288 0:dbad57390bd1 338 _pmax_timer.start_timer(time_interval,
ram54288 0:dbad57390bd1 339 M2MTimerObserver::PMaxTimer,
ram54288 0:dbad57390bd1 340 true);
ram54288 0:dbad57390bd1 341 }
ram54288 0:dbad57390bd1 342 }
ram54288 0:dbad57390bd1 343 }
ram54288 0:dbad57390bd1 344
ram54288 0:dbad57390bd1 345 bool M2MReportHandler::check_attribute_validity()
ram54288 0:dbad57390bd1 346 {
ram54288 0:dbad57390bd1 347 bool success = true;
ram54288 0:dbad57390bd1 348 if ((_attribute_state & M2MReportHandler::Pmax) == M2MReportHandler::Pmax &&
ram54288 0:dbad57390bd1 349 ((_pmax >= -1.0) && (_pmin > _pmax))) {
ram54288 0:dbad57390bd1 350 success = false;
ram54288 0:dbad57390bd1 351 }
ram54288 0:dbad57390bd1 352 float low = _lt + 2 * _st;
ram54288 0:dbad57390bd1 353 if ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt &&
ram54288 0:dbad57390bd1 354 (low >= _gt)) {
ram54288 0:dbad57390bd1 355 success = false;
ram54288 0:dbad57390bd1 356 }
ram54288 0:dbad57390bd1 357 return success;
ram54288 0:dbad57390bd1 358 }
ram54288 0:dbad57390bd1 359
ram54288 0:dbad57390bd1 360 void M2MReportHandler::stop_timers()
ram54288 0:dbad57390bd1 361 {
ram54288 0:dbad57390bd1 362 tr_debug("M2MReportHandler::stop_timers()");
ram54288 0:dbad57390bd1 363
ram54288 0:dbad57390bd1 364 _pmin_exceeded = false;
ram54288 0:dbad57390bd1 365 _pmin_timer.stop_timer();
ram54288 0:dbad57390bd1 366
ram54288 0:dbad57390bd1 367 _pmax_exceeded = false;
ram54288 0:dbad57390bd1 368 _pmax_timer.stop_timer();
ram54288 0:dbad57390bd1 369
ram54288 0:dbad57390bd1 370 tr_debug("M2MReportHandler::stop_timers() - out");
ram54288 0:dbad57390bd1 371 }
ram54288 0:dbad57390bd1 372
ram54288 0:dbad57390bd1 373 void M2MReportHandler::set_default_values()
ram54288 0:dbad57390bd1 374 {
ram54288 0:dbad57390bd1 375 tr_debug("M2MReportHandler::set_default_values");
ram54288 0:dbad57390bd1 376 _pmax = -1.0;
ram54288 0:dbad57390bd1 377 _pmin = 1.0;
ram54288 0:dbad57390bd1 378 _gt = 0.0f;
ram54288 0:dbad57390bd1 379 _lt = 0.0f;
ram54288 0:dbad57390bd1 380 _st = 0.0f;
ram54288 0:dbad57390bd1 381 _high_step = 0.0f;
ram54288 0:dbad57390bd1 382 _low_step = 0.0f;
ram54288 0:dbad57390bd1 383 _pmin_exceeded = false;
ram54288 0:dbad57390bd1 384 _pmax_exceeded = false;
ram54288 0:dbad57390bd1 385 _last_value = -1.0f;
ram54288 0:dbad57390bd1 386 _attribute_state = 0;
ram54288 0:dbad57390bd1 387 _changed_instance_ids.clear();
ram54288 0:dbad57390bd1 388 }
ram54288 0:dbad57390bd1 389
ram54288 0:dbad57390bd1 390 bool M2MReportHandler::check_threshold_values()
ram54288 0:dbad57390bd1 391 {
ram54288 0:dbad57390bd1 392 tr_debug("M2MReportHandler::check_threshold_values");
ram54288 0:dbad57390bd1 393 tr_debug("Current value: %f", _current_value);
ram54288 0:dbad57390bd1 394 tr_debug("High step: %f", _high_step);
ram54288 0:dbad57390bd1 395 tr_debug("Low step: %f", _low_step);
ram54288 0:dbad57390bd1 396 tr_debug("Less than: %f", _lt);
ram54288 0:dbad57390bd1 397 tr_debug("Greater than: %f", _gt);
ram54288 0:dbad57390bd1 398 tr_debug("Step: %f", _st);
ram54288 0:dbad57390bd1 399 bool can_send = false;
ram54288 0:dbad57390bd1 400 // Check step condition
ram54288 0:dbad57390bd1 401 if ((_attribute_state & M2MReportHandler::St) == M2MReportHandler::St) {
ram54288 0:dbad57390bd1 402 if ((_current_value >= _high_step ||
ram54288 0:dbad57390bd1 403 _current_value <= _low_step)) {
ram54288 0:dbad57390bd1 404 can_send = true;
ram54288 0:dbad57390bd1 405 }
ram54288 0:dbad57390bd1 406 else {
ram54288 0:dbad57390bd1 407 if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt ||
ram54288 0:dbad57390bd1 408 (_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt ) {
ram54288 0:dbad57390bd1 409 can_send = check_gt_lt_params();
ram54288 0:dbad57390bd1 410 }
ram54288 0:dbad57390bd1 411 else {
ram54288 0:dbad57390bd1 412 can_send = false;
ram54288 0:dbad57390bd1 413 }
ram54288 0:dbad57390bd1 414 }
ram54288 0:dbad57390bd1 415 }
ram54288 0:dbad57390bd1 416 else {
ram54288 0:dbad57390bd1 417 can_send = check_gt_lt_params();
ram54288 0:dbad57390bd1 418 }
ram54288 0:dbad57390bd1 419 tr_debug("M2MReportHandler::check_threshold_values - value in range = %d", (int)can_send);
ram54288 0:dbad57390bd1 420 return can_send;
ram54288 0:dbad57390bd1 421 }
ram54288 0:dbad57390bd1 422
ram54288 0:dbad57390bd1 423 bool M2MReportHandler::check_gt_lt_params()
ram54288 0:dbad57390bd1 424 {
ram54288 0:dbad57390bd1 425 tr_debug("M2MReportHandler::check_gt_lt_params");
ram54288 0:dbad57390bd1 426 bool can_send = false;
ram54288 0:dbad57390bd1 427 // GT & LT set.
ram54288 0:dbad57390bd1 428 if ((_attribute_state & (M2MReportHandler::Lt | M2MReportHandler::Gt))
ram54288 0:dbad57390bd1 429 == (M2MReportHandler::Lt | M2MReportHandler::Gt)) {
ram54288 0:dbad57390bd1 430 if (_current_value > _gt || _current_value < _lt) {
ram54288 0:dbad57390bd1 431 can_send = true;
ram54288 0:dbad57390bd1 432 }
ram54288 0:dbad57390bd1 433 else {
ram54288 0:dbad57390bd1 434 can_send = false;
ram54288 0:dbad57390bd1 435 }
ram54288 0:dbad57390bd1 436 }
ram54288 0:dbad57390bd1 437 // Only LT
ram54288 0:dbad57390bd1 438 else if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt &&
ram54288 0:dbad57390bd1 439 (_attribute_state & M2MReportHandler::Gt) == 0 ) {
ram54288 0:dbad57390bd1 440 if (_current_value < _lt) {
ram54288 0:dbad57390bd1 441 can_send = true;
ram54288 0:dbad57390bd1 442 }
ram54288 0:dbad57390bd1 443 else {
ram54288 0:dbad57390bd1 444 can_send = false;
ram54288 0:dbad57390bd1 445 }
ram54288 0:dbad57390bd1 446 }
ram54288 0:dbad57390bd1 447 // Only GT
ram54288 0:dbad57390bd1 448 else if ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt &&
ram54288 0:dbad57390bd1 449 (_attribute_state & M2MReportHandler::Lt) == 0 ) {
ram54288 0:dbad57390bd1 450 if (_current_value > _gt) {
ram54288 0:dbad57390bd1 451 can_send = true;
ram54288 0:dbad57390bd1 452 }
ram54288 0:dbad57390bd1 453 else {
ram54288 0:dbad57390bd1 454 can_send = false;
ram54288 0:dbad57390bd1 455 }
ram54288 0:dbad57390bd1 456 }
ram54288 0:dbad57390bd1 457 // GT & LT not set.
ram54288 0:dbad57390bd1 458 else {
ram54288 0:dbad57390bd1 459 can_send = true;
ram54288 0:dbad57390bd1 460 }
ram54288 0:dbad57390bd1 461 tr_debug("M2MReportHandler::check_gt_lt_params - value in range = %d", (int)can_send);
ram54288 0:dbad57390bd1 462 return can_send;
ram54288 0:dbad57390bd1 463 }
ram54288 0:dbad57390bd1 464
ram54288 0:dbad57390bd1 465 uint8_t M2MReportHandler::attribute_flags()
ram54288 0:dbad57390bd1 466 {
ram54288 0:dbad57390bd1 467 return _attribute_state;
ram54288 0:dbad57390bd1 468 }