A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Committer:
vwochnik
Date:
Thu Jan 23 14:36:46 2014 +0000
Revision:
0:f76673e7f275
initial commit, only abstraction

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 0:f76673e7f275 1 /*
vwochnik 0:f76673e7f275 2 * FloatValue.cpp
vwochnik 0:f76673e7f275 3 *
vwochnik 0:f76673e7f275 4 * Created on: Nov 1, 2013
vwochnik 0:f76673e7f275 5 * * Authors: Vincent Wochnik <v.wochnik@gmail.com>
vwochnik 0:f76673e7f275 6 *
vwochnik 0:f76673e7f275 7 * Copyright (c) 2013 Cumulocity GmbH
vwochnik 0:f76673e7f275 8 *
vwochnik 0:f76673e7f275 9 * Permission is hereby granted, free of charge, to any person obtaining
vwochnik 0:f76673e7f275 10 * a copy of this software and associated documentation files (the
vwochnik 0:f76673e7f275 11 * "Software"), to deal in the Software without restriction, including
vwochnik 0:f76673e7f275 12 * without limitation the rights to use, copy, modify, merge, publish,
vwochnik 0:f76673e7f275 13 * distribute, sublicense, and/or sell copies of the Software, and to
vwochnik 0:f76673e7f275 14 * permit persons to whom the Software is furnished to do so, subject to
vwochnik 0:f76673e7f275 15 * the following conditions:
vwochnik 0:f76673e7f275 16 *
vwochnik 0:f76673e7f275 17 * The above copyright notice and this permission notice shall be
vwochnik 0:f76673e7f275 18 * included in all copies or substantial portions of the Software.
vwochnik 0:f76673e7f275 19 *
vwochnik 0:f76673e7f275 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
vwochnik 0:f76673e7f275 21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
vwochnik 0:f76673e7f275 22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
vwochnik 0:f76673e7f275 23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
vwochnik 0:f76673e7f275 24 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
vwochnik 0:f76673e7f275 25 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
vwochnik 0:f76673e7f275 26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
vwochnik 0:f76673e7f275 27 */
vwochnik 0:f76673e7f275 28
vwochnik 0:f76673e7f275 29 #include "FloatValue.h"
vwochnik 0:f76673e7f275 30 #include <math.h>
vwochnik 0:f76673e7f275 31
vwochnik 0:f76673e7f275 32 FloatValue::FloatValue(double number, uint8_t digits, bool zflag)
vwochnik 0:f76673e7f275 33 {
vwochnik 0:f76673e7f275 34 _negative = (number < 0.0);
vwochnik 0:f76673e7f275 35 _zflag = zflag;
vwochnik 0:f76673e7f275 36 if (_negative)
vwochnik 0:f76673e7f275 37 _number = -number;
vwochnik 0:f76673e7f275 38 else
vwochnik 0:f76673e7f275 39 _number = number;
vwochnik 0:f76673e7f275 40 _digits = digits;
vwochnik 0:f76673e7f275 41 }
vwochnik 0:f76673e7f275 42
vwochnik 0:f76673e7f275 43 uint8_t FloatValue::valueType() const
vwochnik 0:f76673e7f275 44 {
vwochnik 0:f76673e7f275 45 return VALUE_FLOAT;
vwochnik 0:f76673e7f275 46 }
vwochnik 0:f76673e7f275 47
vwochnik 0:f76673e7f275 48 long FloatValue::integerValue() const
vwochnik 0:f76673e7f275 49 {
vwochnik 0:f76673e7f275 50 return 0L;
vwochnik 0:f76673e7f275 51 }
vwochnik 0:f76673e7f275 52
vwochnik 0:f76673e7f275 53 double FloatValue::floatValue() const
vwochnik 0:f76673e7f275 54 {
vwochnik 0:f76673e7f275 55 return (_negative) ? -_number : _number;
vwochnik 0:f76673e7f275 56 }
vwochnik 0:f76673e7f275 57
vwochnik 0:f76673e7f275 58 const char * FloatValue::characterValue() const
vwochnik 0:f76673e7f275 59 {
vwochnik 0:f76673e7f275 60 return 0;
vwochnik 0:f76673e7f275 61 }
vwochnik 0:f76673e7f275 62
vwochnik 0:f76673e7f275 63 size_t FloatValue::write(AbstractDataSink& sink) const
vwochnik 0:f76673e7f275 64 {
vwochnik 0:f76673e7f275 65 size_t n = 0;
vwochnik 0:f76673e7f275 66
vwochnik 0:f76673e7f275 67 if (isnan(_number)) return sink.write("nan");
vwochnik 0:f76673e7f275 68 if (isinf(_number)) return sink.write("inf");
vwochnik 0:f76673e7f275 69 if (_number > 4294967040.0) return sink.write("ovf");
vwochnik 0:f76673e7f275 70
vwochnik 0:f76673e7f275 71 if (_negative)
vwochnik 0:f76673e7f275 72 sink.write('-');
vwochnik 0:f76673e7f275 73
vwochnik 0:f76673e7f275 74 double number = _number, rounding = 0.5;
vwochnik 0:f76673e7f275 75 for (uint8_t i = 0; i < _digits; ++i)
vwochnik 0:f76673e7f275 76 rounding /= 10.0;
vwochnik 0:f76673e7f275 77 number += rounding;
vwochnik 0:f76673e7f275 78
vwochnik 0:f76673e7f275 79 unsigned long int_part = (unsigned long)number;
vwochnik 0:f76673e7f275 80 double remainder = number - (double)int_part;
vwochnik 0:f76673e7f275 81
vwochnik 0:f76673e7f275 82 if ((_zflag) || (int_part))
vwochnik 0:f76673e7f275 83 n += sink.write(int_part);
vwochnik 0:f76673e7f275 84
vwochnik 0:f76673e7f275 85 if (_digits == 0)
vwochnik 0:f76673e7f275 86 return n;
vwochnik 0:f76673e7f275 87 n += sink.write(".");
vwochnik 0:f76673e7f275 88
vwochnik 0:f76673e7f275 89 uint8_t digits = _digits;
vwochnik 0:f76673e7f275 90 while (digits-- > 0) {
vwochnik 0:f76673e7f275 91 remainder *= 10.0;
vwochnik 0:f76673e7f275 92 unsigned long l = (unsigned long)remainder;
vwochnik 0:f76673e7f275 93 n += sink.write(l);
vwochnik 0:f76673e7f275 94 remainder -= l;
vwochnik 0:f76673e7f275 95 }
vwochnik 0:f76673e7f275 96
vwochnik 0:f76673e7f275 97 return n;
vwochnik 0:f76673e7f275 98 }
vwochnik 0:f76673e7f275 99
vwochnik 0:f76673e7f275 100 size_t FloatValue::length() const
vwochnik 0:f76673e7f275 101 {
vwochnik 0:f76673e7f275 102 if ((isnan(_number)) || (isinf(_number)) ||
vwochnik 0:f76673e7f275 103 (_number > 4294967040.0))
vwochnik 0:f76673e7f275 104 return 3;
vwochnik 0:f76673e7f275 105
vwochnik 0:f76673e7f275 106 size_t l = 0;
vwochnik 0:f76673e7f275 107
vwochnik 0:f76673e7f275 108 if (_negative)
vwochnik 0:f76673e7f275 109 l++;
vwochnik 0:f76673e7f275 110
vwochnik 0:f76673e7f275 111 double number = _number, rounding = 0.5;
vwochnik 0:f76673e7f275 112 for (uint8_t i = 0; i < _digits; ++i)
vwochnik 0:f76673e7f275 113 rounding /= 10.0;
vwochnik 0:f76673e7f275 114 number += rounding;
vwochnik 0:f76673e7f275 115
vwochnik 0:f76673e7f275 116 unsigned long n = (unsigned long)number;
vwochnik 0:f76673e7f275 117 if ((_zflag) || (n)) {
vwochnik 0:f76673e7f275 118 do {
vwochnik 0:f76673e7f275 119 n /= 10;
vwochnik 0:f76673e7f275 120 l++;
vwochnik 0:f76673e7f275 121 } while(n);
vwochnik 0:f76673e7f275 122 }
vwochnik 0:f76673e7f275 123
vwochnik 0:f76673e7f275 124 if (_digits > 0)
vwochnik 0:f76673e7f275 125 l += 1 + _digits;
vwochnik 0:f76673e7f275 126
vwochnik 0:f76673e7f275 127 return l;
vwochnik 0:f76673e7f275 128 }
vwochnik 0:f76673e7f275 129
vwochnik 0:f76673e7f275 130 Value* FloatValue::copy() const
vwochnik 0:f76673e7f275 131 {
vwochnik 0:f76673e7f275 132 double number;
vwochnik 0:f76673e7f275 133
vwochnik 0:f76673e7f275 134 number = (_negative) ? -_number : _number;
vwochnik 0:f76673e7f275 135 return new FloatValue(number, _digits, _zflag);
vwochnik 0:f76673e7f275 136 }
vwochnik 0:f76673e7f275 137