Generic SmartRest library

Dependents:   SmartRestUnitTest MbedSmartRest MbedSmartRestStreaming

Committer:
vwochnik
Date:
Wed Apr 16 08:30:49 2014 +0000
Revision:
1:3e7b4c9e0821
Parent:
0:744801d5734d
fix

Who changed what in which revision?

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