From 46c9893607ecd32f8d9e2e6b7c3afa38bfc7e324 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 13 Aug 2026 22:16:05 +0200 Subject: erster import --- .clang-format | 45 +++++++++++++++++++++++++++++ .clang-tidy | 19 ++++++++++++ .gitignore | 2 ++ compile_flags.txt | 10 +++++++ config.mk | 2 ++ makefile | 15 ++++++++++ src/main.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 179 insertions(+) create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .gitignore create mode 100644 compile_flags.txt create mode 100644 config.mk create mode 100644 makefile create mode 100644 src/main.cpp diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..ff96bb5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,45 @@ +--- +AccessModifierOffset: -4 +AlignConsecutiveAssignments: 'true' +AlignConsecutiveDeclarations: 'true' +AlignEscapedNewlines: Left +AlignTrailingComments: 'true' +AlwaysBreakAfterReturnType: TopLevelDefinitions +BreakBeforeBraces: Stroustrup +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeComma +ColumnLimit: '0' +CompactNamespaces: 'false' +Cpp11BracedListStyle: 'false' +FixNamespaceComments: 'true' +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^.*(precomp|pch|stdafx)' + Priority: -1 + - Regex: '^<.*>' + Priority: 1 + - Regex: '^".*"' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: 'false' +IndentPPDirectives: AfterHash +IndentWidth: '4' +IndentWrappedFunctionNames: 'false' +KeepEmptyLinesAtTheStartOfBlocks: 'false' +PointerAlignment: Left +SortIncludes: 'true' +SpaceAfterCStyleCast: 'true' +SpaceAfterTemplateKeyword: 'false' +SpaceBeforeAssignmentOperators: 'true' +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: 'false' +SpaceInEmptyParentheses: 'false' +SpacesInAngles: 'false' +SpacesInCStyleCastParentheses: 'false' +SpacesInConditionalStatement: 'true' +SpacesInParentheses: 'false' +Standard: Auto +TabWidth: '4' +UseTab: ForIndentation +... diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..0bceb5b --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,19 @@ +--- +Checks: "*, + -abseil-*, + -altera-*, + -android-*, + -fuchsia-*, + -google-*, + -llvm*, + -modernize-use-trailing-return-type, + -zircon-*, + -readability-else-after-return, + -readability-static-accessed-through-instance, + -readability-avoid-const-params-in-decls, + -cppcoreguidelines-non-private-member-variables-in-classes, + -misc-non-private-member-variables-in-classes, +" +WarningsAsErrors: '' +HeaderFilterRegex: '' +FormatStyle: none diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd42ee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..3ea2c1a --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,10 @@ +-Wall +-Werror +-Wextra +-Wconversion +-Wdouble-promotion +-pedantic +-std=c++17 +-Iinclude +-I../minmea/include +-I/usr/local/include diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29f8ca1 --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +CPPFLAGS=-Wall -Werror -pedantic -std=c++17 -O2 -Iinclude -I../minmea/include -I/usr/local/include -DNDEBUG +LDFLAGS=-L../minmea/lib -lminmea -L/usr/local/lib -lpthread diff --git a/makefile b/makefile new file mode 100644 index 0000000..3f481bc --- /dev/null +++ b/makefile @@ -0,0 +1,15 @@ +include config.mk + +bin/app: obj/main.o | bin + c++ $(LDFLAGS) $^ -o $@ + +obj/%.o: src/%.cpp | obj + c++ $(CPPFLAGS) -c $< -o $@ + +clean: + rm -rf bin obj + +bin obj: + mkdir $@ + +.PHONY: all clean diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e699c6a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +#include "minmea.h" + +using namespace std; + +// constexpr auto PORT = "/dev/cuaU0"; +constexpr auto PORT = "/dev/ugen0.14"; +constexpr auto BAUDRATE = 9600; + +namespace { + +auto +read_line(asio::serial_port& com) +{ + for ( string result;; ) { + char chr = 0; + + asio::read(com, asio::buffer(&chr, 1)); + switch ( chr ) { + case '\r': + break; + case '\n': + return result; + default: + result += chr; + } + } +} + +string +get_gps_timestamp(const minmea_time& time, const minmea_date& date) +{ + tm tm_utc{}; + ::minmea_getdatetime(&tm_utc, &date, &time); + + auto timestamp = ::timegm(&tm_utc); + + tm tm_local{}; + (void) ::localtime_r(×tamp, &tm_local); + + static const auto buffer_size = 100; + array buffer{}; + + (void) ::strftime(buffer.data(), buffer.size(), "%Y-%m-%d %H:%M:%S", &tm_local); + + return buffer.data(); +} + +} // namespace + +int +main() +{ + try { + asio::io_context io_context{}; + asio::serial_port com(io_context, PORT); + com.set_option(asio::serial_port::baud_rate(BAUDRATE)); + + for ( ;; ) { + const auto line = read_line(com); + const auto nmea_id = ::minmea_sentence_id(line.c_str(), true); + + if ( nmea_id != MINMEA_SENTENCE_RMC ) { + continue; + } + + minmea_sentence_rmc frame{}; + if ( !::minmea_parse_rmc(&frame, line.c_str()) || !frame.valid ) { + continue; + } + + auto timestamp = get_gps_timestamp(frame.time, frame.date); + + cout << timestamp << ": $RMC floating point degree coordinates and speed: (" + << ::minmea_tocoord(&frame.latitude) << "," << ::minmea_tocoord(&frame.longitude) << ") " + << ::minmea_tofloat(&frame.speed) << '\n'; + } + } + catch ( exception& e ) { + cerr << "io-error: " << e.what() << '\n'; + } +} -- cgit v1.3