2#include "wgs84point.hpp"
3#include <boost/date_time/gregorian/gregorian.hpp>
4#include <boost/date_time/posix_time/posix_time.hpp>
5#include <boost/format.hpp>
16using namespace vanetza::units;
23void print_latitude(std::ostream& os,
const Wgs84Point& point)
25 double degrees = point.lat.value();
26 double minutes = std::modf(std::abs(degrees), °rees) * 60.0;
27 os << boost::format(
"%02d%07.4f") % degrees % minutes;
28 os <<
"," << (point.lat.value() >= 0.0 ?
"N" :
"S");
36void print_longitude(std::ostream& os,
const Wgs84Point& point)
38 double degrees = point.lon.value();
39 double minutes = std::modf(std::abs(degrees), °rees) * 60.0;
40 os << boost::format(
"%02d%07.4f") % degrees % minutes;
41 os <<
"," << (point.lon.value() >= 0.0 ?
"E" :
"W");
50 friend std::ostream& operator<<(std::ostream& os,
const latitude& lat)
52 print_latitude(os, lat.point);
62 friend std::ostream& operator<<(std::ostream& os,
const longitude& lon)
64 print_longitude(os, lon.point);
73detail::latitude latitude(
const Wgs84Point& p) {
return detail::latitude(p); }
74detail::longitude longitude(
const Wgs84Point& p) {
return detail::longitude(p); }
81std::string finish(std::stringstream& smsg)
83 std::string msg = smsg.str();
84 unsigned sum = checksum(++msg.begin(), msg.end());
85 msg += boost::str(boost::format(
"*%02X") %
static_cast<unsigned>(sum));
89std::string gprmc(
const time& ptime,
const Wgs84Point& wgs84,
90 NauticalVelocity ground_speed, TrueNorth heading)
96 const double magnetic_angle = 1.0;
97 const char magnetic_direction =
'E';
99 std::stringstream smsg;
100 smsg << std::uppercase << std::fixed;
101 auto* tfacet =
new boost::posix_time::time_facet(
"%H%M%S");
102 auto* dfacet =
new boost::gregorian::date_facet(
"%d%m%y");
103 smsg.imbue(std::locale(smsg.getloc(), tfacet));
104 smsg.imbue(std::locale(smsg.getloc(), dfacet));
107 smsg << ptime <<
",";
108 smsg << static_cast<char>(RMCStatus::Valid) <<
",";
109 smsg << latitude(wgs84) <<
"," << longitude(wgs84) <<
",";
110 smsg << std::setprecision(1) << ground_speed.value() <<
",";
111 smsg << std::setprecision(1) << std::fmod(heading.value(), 360.0) <<
",";
112 smsg << ptime.date() <<
",";
113 smsg << std::setprecision(1) << magnetic_angle <<
"," << magnetic_direction <<
",";
114 smsg << static_cast<char>(FAAMode::Autonomous);
119std::string gpgga(
const time& ptime,
const Wgs84Point& wgs84, Quality quality, Length hdop)
121 const unsigned satellites = 6;
122 const double height = 0.0;
123 const double separation = 0.0;
125 std::stringstream smsg;
126 smsg << std::uppercase << std::fixed;
127 auto* facet =
new boost::posix_time::time_facet(
"%H%M%s");
128 smsg.imbue(std::locale(smsg.getloc(), facet));
131 smsg << ptime <<
",";
132 smsg << latitude(wgs84) <<
"," << longitude(wgs84) <<
",";
133 smsg << static_cast<std::underlying_type<Quality>::type>(quality) <<
",";
134 smsg << std::setw(2) << std::setfill(
'0') << satellites <<
",";
135 smsg << std::setprecision(1) << hdop.value() <<
",";
136 smsg << std::setprecision(1) << height <<
",M,";
137 smsg << std::setprecision(1) << separation <<
",M,";
143uint8_t checksum(std::string::const_iterator begin, std::string::const_iterator end)
145 assert(begin <= end);
147 for (; begin != end; ++begin) {