networkprotocolmodules/networkpmutils/utils/src/netpmutils.cpp
author hgs
Tue, 13 Jul 2010 12:25:28 +0100
changeset 48 81c9bee26a45
permissions -rw-r--r--
201025_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     2
// All rights reserved.
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     7
//
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
81c9bee26a45 201025_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    10
//
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    11
// Contributors:
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    12
//
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    13
// Description:
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    14
// System
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    15
// 
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    16
//
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    17
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    18
/**
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    19
 @file
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    20
 @internalTechnology
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    21
 
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    22
*/
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    23
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    24
#include <e32base.h>
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    25
#include <e32math.h>
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    26
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    27
// Component
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    28
#include "netpmutils.h"
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    29
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    30
/**
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    31
Constants used in encoding of uncertainty data
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    32
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    33
@see CSuplStart::Uncertainty()
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    34
@see CSuplStart::UncertaintyAltitude()
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    35
*/
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    36
const TReal KLbsLogOnePointOne = 0.095310179804324860043952123280765;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    37
const TReal KLbsLogOnePointZeroTwoFive = 0.02469261259037150101430767543669;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    38
const TInt  KLbsMaxUncert = 127;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    39
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    40
/**
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    41
 * TODO: update asn1 code to use this version and delete the CSuplMessageBase version?
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    42
Uncertainty()
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    43
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    44
Converts a minumum accuracy value in meters to an uncertainty value K as 
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    45
described in 3GPP 23.032 (Universal Geographical Area Description) section 6.2.
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    46
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    47
r = C((1+x)^K - 1)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    48
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    49
where r = distance in meters
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    50
      C = 10
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    51
      x = 0.1
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    52
      K = uncertainty value
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    53
      
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    54
hence K = ln(r/C + 1) / ln(1.1)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    55
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    56
@param aDistance - distance measurement in meters
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    57
@return uncertainty value K
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    58
*/
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    59
EXPORT_C TInt NetPmUtils::Uncertainty(const TReal32& aDistance)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    60
	{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    61
	TReal uncert;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    62
	Math::Ln(uncert,  (aDistance/10) + 1 );
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    63
	uncert /= KLbsLogOnePointOne;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    64
	if (uncert>KLbsMaxUncert)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    65
		{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    66
		uncert = KLbsMaxUncert;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    67
		}
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    68
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    69
	// round to nearest whole number
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    70
	TReal uncertRounded;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    71
	Math::Round(uncertRounded, uncert, 0);
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    72
	
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    73
	return (TInt)uncertRounded;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    74
	}
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    75
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    76
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    77
/**
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    78
UncertaintyAltitude()
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    79
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    80
Converts a minumum accuracy value in meters to an uncertainty altitude value K as 
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    81
described in 3GPP 23.032 (Universal Geographical Area Description) section 6.4.
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    82
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    83
r = C((1+x)^K - 1)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    84
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    85
where r = distance in meters
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    86
      C = 45
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    87
      x = 0.1
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    88
      K = uncertainty value
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    89
      
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    90
hence K = ln(r/C + 1) / ln(1.1)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    91
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    92
@param aDistance - altitude accuracy in meters
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    93
@return uncertainty altitude value K
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    94
*/
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    95
EXPORT_C TInt NetPmUtils::UncertaintyAltitude(const TReal32& aDistance)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    96
	{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    97
	
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    98
	TReal uncert;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
    99
	Math::Ln(uncert,  (aDistance/45) + 1 );
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   100
	uncert /= KLbsLogOnePointZeroTwoFive;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   101
	if (uncert>KLbsMaxUncert)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   102
		{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   103
		uncert = KLbsMaxUncert;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   104
		}
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   105
	// round to nearest whole number
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   106
	TReal uncertRounded;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   107
	Math::Round(uncertRounded, uncert, 0);
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   108
	
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   109
	return (TInt)uncertRounded;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   110
	}
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   111
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   112
/**
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   113
EncodeAltitude()
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   114
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   115
Converts an value for altiutude to an 15 bit binary coded number N
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   116
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   117
@param aAltitude - altitude in meters
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   118
@return uncertainty altitude value K
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   119
*/
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   120
EXPORT_C TInt NetPmUtils::EncodeAltitude(const TReal32& aAltitude)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   121
	{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   122
	TInt altEncoded = (TInt)aAltitude;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   123
	if (altEncoded>KLbsMaxAltitude)
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   124
		{
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   125
		altEncoded = KLbsMaxAltitude;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   126
		}
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   127
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   128
	return altEncoded;
81c9bee26a45 201025_02
hgs
parents:
diff changeset
   129
	}