//------------------------------------------------------------------------------ // dsElevation() -- format#1: convert string to elevation (to nearest foot) //------------------------------------------------------------------------------ float Record::dsElevation(const char* const p) { if (p == 0) return 0.0f; if (*p == '\0') return 0.0f; if (*p == '-') return static_cast<float>(-dsAtofn(p+1, 4)); else return static_cast<float>(dsAtofn(p, 5)); }
//------------------------------------------------------------------------------ // dsMagVariance() -- convert string to magnetic variation //------------------------------------------------------------------------------ float Record::dsMagVariance(const char* const p) { double mv = 0.0; if (p != 0) { double d = dsAtofn(p+1, 3); double m = dsAtofn(p+4, 2); double f = dsAtofn(p+6, 1); double v = d + (m + f / 10.0f) / 60.0f; mv = ( (*p == 'E') ? v : -v ); } return static_cast<float>(mv); }
//------------------------------------------------------------------------------ // dsLongitude() -- convert string to longitude //------------------------------------------------------------------------------ double Record::dsLongitude(const char* const p) { double lon = 0.0; if (p != 0) { char h = *p; double d = dsAtofn(p+1, 3); double m = dsAtofn(p+4, 2); double s = dsAtofn(p+6, 2); double f = dsAtofn(p+8, 2); double v = d + m / 60.0 + (s + f / 100.0) / 3600.0; lon = (h == 'E' ? v : -v); } return lon; }
//------------------------------------------------------------------------------ // dsLatitude() -- convert string to latitude //------------------------------------------------------------------------------ double Record::dsLatitude(const char* const p) { double lat = 0.0f; if (p != 0) { char h = *p; double d = dsAtofn(p+1, 2); double m = dsAtofn(p+3, 2); double s = dsAtofn(p+5, 2); double f = dsAtofn(p+7, 2); double v = d + m / 60.0 + (s + f / 100.0) / 3600.0; lat = (h == 'N' ? v : -v); } return lat; }
// range: returns the value of the Range field. inline float Navaid::range() const { double rng = 0.0; const char* p = makePointer(NA_RANGE_POS); if (*p != 'U') { rng = dsAtofn(p, NA_RANGE_LEN); } return static_cast<float>(rng); }
//------------------------------------------------------------------------------ // dsMagHeading() -- magnetic heading //------------------------------------------------------------------------------ float Record::dsMagHeading(const char* const p) { char ct; double mh = 0.0; if (p != 0) { mh = dsAtofn(p,3); // units ct = *(p+3); // tenths if (ct != '/') mh += static_cast<float>(ct - '0')/10.0f; } return static_cast<float>(mh); }
//------------------------------------------------------------------------------ // dsSlaveVariance() -- convert string to slave magnetic variation //------------------------------------------------------------------------------ float Record::dsSlaveVariance(const char* const p) { double sv = 0.0; if (p != 0) { if (*p != ' ') { double v = dsAtofn(p+1, 3); sv = ( (*p == 'E') ? v : -v ); } } return static_cast<float>(sv); }
//------------------------------------------------------------------------------ // dsElevation1() -- format#2: convert string to elevation (to tenths // of feet) //------------------------------------------------------------------------------ float Record::dsElevation1(const char* const p) { double e, et; char ct; if (p == 0) return 0.0f; if (*p == '\0') return 0.0f; e = 0.0; if (*p == '-') e = dsAtofn(p+1, 4); else e = dsAtofn(p, 5); et = 0.0; ct = *(p+5); if (ct != ' ') et = ct - '0'; if (*p == '-') return static_cast<float>(-(e + et/10.0)); else return static_cast<float>(e + et/10.0); }
// power: returns the value of the Power field. inline float Navaid::power() const { const char* p = makePointer(NA_POWER_POS); double w = dsAtofn(p, NA_POWER_LEN); if (w != 0.0) return static_cast<float>(w); if (*p == 'U') return 2000.0f; return 50.0f; }