00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef __JAUS_SCALED_INTEGERS_H
00043 #define __JAUS_SCALED_INTEGERS_H
00044
00045 #include "jaus/core/types.h"
00046
00047 namespace JAUS
00048 {
00055 class JAUS_CORE_DLL ScaledInteger
00056 {
00057 public:
00064 enum Type
00065 {
00066 Byte = 10,
00067 Short,
00068 UShort,
00069 Int,
00070 UInt,
00071 Long,
00072 ULong
00073 };
00091 inline static int Write(Packet& packet,
00092 const LongFloat real,
00093 const LongFloat upper,
00094 const LongFloat lower,
00095 const Type type,
00096 const unsigned int pos = UINT_MAX)
00097 {
00098
00099
00100
00101 switch( type )
00102 {
00103 case ScaledInteger::Byte:
00104 {
00105 return packet.Write(ScaledInteger::ToScaledByte(real, upper, lower), pos);
00106 }
00107 break;
00108 case ScaledInteger::UShort:
00109 {
00110 return packet.Write(ScaledInteger::ToScaledUShort(real, upper, lower), pos);
00111 }
00112 break;
00113 case ScaledInteger::Short:
00114 {
00115 return packet.Write(ScaledInteger::ToScaledShort(real, upper, lower), pos);
00116 }
00117 break;
00118 case ScaledInteger::Int:
00119 {
00120 return packet.Write(ScaledInteger::ToScaledInt(real, upper, lower), pos);
00121 }
00122 break;
00123 case ScaledInteger::UInt:
00124 {
00125 return packet.Write(ScaledInteger::ToScaledUInt(real, upper, lower), pos);
00126 }
00127 break;
00128 case ScaledInteger::Long:
00129 {
00130 return packet.Write(ScaledInteger::ToScaledLong(real, upper, lower), pos);
00131 }
00132 break;
00133 case ScaledInteger::ULong:
00134 {
00135 return packet.Write(ScaledInteger::ToScaledULong(real, upper, lower), pos);
00136 }
00137 break;
00138 default:
00139 return FAILURE;
00140 break;
00141 }
00142 }
00161 inline static int Read(const Packet& packet,
00162 LongFloat& val,
00163 const LongFloat upper,
00164 const LongFloat lower,
00165 const ScaledInteger::Type type,
00166 const unsigned int pos = UINT_MAX)
00167 {
00168 int read = 0;
00169 switch(type)
00170 {
00171 case ScaledInteger::Byte:
00172 {
00173 JAUS::Byte scaled;
00174 read = packet.Read(scaled, pos);
00175 if(read > 0)
00176 {
00177 val = ScaledInteger::ToDouble(scaled, upper, lower);
00178 }
00179 }
00180 break;
00181 case ScaledInteger::Short:
00182 {
00183 JAUS::Short scaled;
00184 read = packet.Read(scaled, pos);
00185 if(read > 0)
00186 {
00187 val = ScaledInteger::ToDouble(scaled, upper, lower);
00188 }
00189 }
00190 break;
00191 case ScaledInteger::UShort:
00192 {
00193 JAUS::UShort scaled;
00194 read = packet.Read(scaled, pos);
00195 if(read > 0)
00196 {
00197 val = ScaledInteger::ToDouble(scaled, upper, lower);
00198 }
00199 }
00200 break;
00201 case ScaledInteger::Int:
00202 {
00203 JAUS::Int scaled;
00204 read = packet.Read(scaled, pos);
00205 if(read > 0)
00206 {
00207 val = ScaledInteger::ToDouble(scaled, upper, lower);
00208 }
00209 }
00210 break;
00211 case ScaledInteger::UInt:
00212 {
00213 JAUS::UInt scaled;
00214 read = packet.Read(scaled, pos);
00215 if(read > 0)
00216 {
00217 val = ScaledInteger::ToDouble(scaled, upper, lower);
00218 }
00219 }
00220 break;
00221 case ScaledInteger::Long:
00222 {
00223 JAUS::Long scaled;
00224 read = packet.Read(scaled, pos);
00225 if(read > 0)
00226 {
00227 val = ScaledInteger::ToDouble(scaled, upper, lower);
00228 }
00229 }
00230 break;
00231 case ScaledInteger::ULong:
00232 {
00233 JAUS::ULong scaled;
00234 read = packet.Read(scaled, pos);
00235 if(read > 0)
00236 {
00237 val = ScaledInteger::ToDouble(scaled, upper, lower);
00238 }
00239 }
00240 break;
00241 default:
00242 read = 0;
00243 break;
00244 };
00245
00246 return read;
00247 }
00260 inline static double ToDouble(const JAUS::Byte scaled, const double upper, const double lower)
00261 {
00262 return scaled * (upper - lower) / ByteRange + lower;
00263 }
00276 inline static float ToFloat(const JAUS::Byte scaled, const double upper, const double lower)
00277 {
00278 return (float)(scaled * (upper - lower) / ByteRange + lower);
00279 }
00291 inline static JAUS::Byte ToScaledByte(const double real, const double upper, const double lower)
00292 {
00293 return (JAUS::Byte)((real - lower) / ((upper - lower) / ByteRange));
00294 }
00306 inline static JAUS::Byte ToScaledByte(const float real, const float upper, const float lower)
00307 {
00308 return (JAUS::Byte)((real - lower) / ((upper - lower) / ByteRange));
00309 }
00322 inline static double ToDouble(const JAUS::Short scaled, const double upper, const double lower)
00323 {
00324 return scaled * ((upper - lower) / Int16Range) + (upper + lower) / 2.0;
00325 }
00338 inline static float ToFloat(const JAUS::Short scaled, const double upper, const double lower)
00339 {
00340 return (float)(scaled * ((upper - lower) / Int16Range) + (upper + lower) / 2.0);
00341 }
00353 inline static JAUS::Short ToScaledShort(const double real, const double upper, const double lower)
00354 {
00355 return (JAUS::Short)((real - (upper + lower) / 2.0) * (Int16Range / (upper - lower)));
00356 }
00368 inline static JAUS::Short ToScaledShort(const float real, const float upper, const float lower)
00369 {
00370 return (JAUS::Short)((real - (upper + lower) / 2.0) * (Int16Range / (upper - lower)));
00371 }
00384 inline static double ToDouble(const JAUS::UShort scaled, const double upper, const double lower)
00385 {
00386 return scaled * (upper - lower) / UInt16Range + lower;
00387 }
00400 inline static float ToFloat(const JAUS::UShort scaled, const double upper, const double lower)
00401 {
00402 return (float)(scaled * (upper - lower) / UInt16Range + lower);
00403 }
00415 inline static JAUS::UShort ToScaledUShort(const double real, const double upper, const double lower)
00416 {
00417 return (JAUS::UShort)((real - lower) / ((upper - lower) / UInt16Range));
00418 }
00430 inline static JAUS::UShort ToScaledUShort(const float real, const float upper, const float lower)
00431 {
00432 return (JAUS::UShort)((real - lower) / ((upper - lower) / UInt16Range));
00433 }
00446 inline static double ToDouble(const JAUS::Int scaled, double upper, double lower)
00447 {
00448 return scaled * ((upper - lower) / Int32Range) + (upper + lower) / 2.0;
00449 }
00462 inline static float ToFloat(const JAUS::Int scaled, const float upper, const float lower)
00463 {
00464 return (float)(scaled * ((upper - lower) / Int32Range) + (upper + lower) / 2.0);
00465 }
00477 inline static JAUS::Int ToScaledInt(const double real, double upper, double lower)
00478 {
00479 return (JAUS::Int)((real - (upper + lower) / 2.0) * (Int32Range / (upper - lower)));
00480 }
00492 inline static JAUS::Int ToScaledInt(const float real, const float upper, const float lower)
00493 {
00494 return (JAUS::Int)((real - (upper + lower) / 2.0) * (Int32Range / (upper - lower)));
00495 }
00508 inline static double ToDouble(const JAUS::UInt scaled, double upper, double lower)
00509 {
00510 return scaled * (upper - lower) / UInt32Range + lower;
00511 }
00524 inline static float ToFloat(const JAUS::UInt scaled, const float upper, const float lower)
00525 {
00526 return (float)(scaled * (upper - lower) / UInt32Range + lower);
00527 }
00539 inline static JAUS::UInt ToScaledUInt(const double real, double upper, double lower)
00540 {
00541 return (JAUS::UInt)((real - lower) / ((upper - lower) / UInt32Range));
00542 }
00554 inline static JAUS::UInt ToScaledUInt(const float real, const float upper, const float lower)
00555 {
00556 return (JAUS::UInt)((real - lower) / ((upper - lower) / UInt32Range));
00557 }
00570 inline static double ToDouble(const JAUS::Long scaled, double upper, double lower)
00571 {
00572 return scaled / 2.0 * ((upper - lower) / Int64HalfRange) + (upper + lower) / 2.0;
00573 }
00586 inline static float ToFloat(const JAUS::Long scaled, const float upper, const float lower)
00587 {
00588 return (float)(scaled / 2.0 * ((upper - lower) / Int64HalfRange) + (upper + lower) / 2.0);
00589 }
00601 inline static JAUS::Long ToScaledLong(const double real, double upper, double lower)
00602 {
00603 return (JAUS::Long)((real - (upper + lower) / 2.0) * 2 * (Int64HalfRange / (upper - lower)));
00604 }
00616 inline static JAUS::Long ToScaledLong(const float real, const float upper, const float lower)
00617 {
00618 return (JAUS::Long)((real - (upper + lower) / 2.0) * 2 * (Int64HalfRange / (upper - lower)));
00619 }
00632 inline static double ToDouble(const JAUS::ULong scaled, double upper, double lower)
00633 {
00634 return scaled * (upper - lower) / UInt64HalfRange + lower;
00635 }
00648 inline static float ToFloat(const JAUS::ULong scaled, const float upper, const float lower)
00649 {
00650 return (float)(scaled * (upper - lower) / UInt64HalfRange + lower);
00651 }
00663 inline static JAUS::ULong ToScaledULong(const double real, double upper, double lower)
00664 {
00665 return (JAUS::ULong)((real - lower) / ((upper - lower) / UInt64HalfRange));
00666 }
00678 inline static JAUS::ULong ToScaledULong(const float real, const float upper, const float lower)
00679 {
00680 return (JAUS::ULong)((real - lower) / ((upper - lower) / UInt64HalfRange));
00681 }
00682 private:
00683 static double ByteRange;
00684 static double UInt64HalfRange;
00685 static double Int64HalfRange;
00686 static double UInt32Range;
00687 static double Int32Range;
00688 static double UInt16Range;
00689 static double Int16Range;
00690 static double Epsilon;
00691 };
00692 }
00693
00694
00695 #endif
00696