├── .clang-format ├── .clwb └── .bazelproject ├── .gitattributes ├── .github └── workflows │ ├── codeql.yml │ └── release_build.yml ├── .gitignore ├── BUILD ├── CMakeLists.txt ├── CONTRIBUTING.md ├── Doxyfile ├── LICENSE ├── README.md ├── WORKSPACE ├── docs ├── DoxygenLayout.xml ├── doxy_footer.html ├── doxy_header.html ├── doxy_style.css ├── error.html ├── favicon.ico ├── images │ ├── vehicle_frame_back.svg │ └── vehicle_frame_side.svg ├── include_header.js.template ├── index.dox ├── index.html ├── point_one_logo.png ├── update_versions.py └── versions.html.template ├── examples ├── BUILD ├── CMakeLists.txt ├── WORKSPACE ├── common │ ├── BUILD │ ├── CMakeLists.txt │ ├── print_message.cc │ └── print_message.h ├── external_cmake_project │ ├── CMakeLists.txt │ └── main.cc ├── generate_data │ ├── BUILD │ ├── CMakeLists.txt │ └── generate_data.cc ├── lband_decode │ ├── BUILD │ ├── CMakeLists.txt │ └── lband_decode.cc ├── message_decode │ ├── BUILD │ ├── CMakeLists.txt │ ├── example_data.p1log │ └── message_decode.cc ├── raw_message_decode │ ├── BUILD │ ├── CMakeLists.txt │ └── raw_message_decode.cc ├── request_version │ ├── BUILD │ ├── CMakeLists.txt │ └── request_version.cc ├── tcp_client │ ├── BUILD │ ├── CMakeLists.txt │ └── linux_tcp_client.cc └── udp_client │ ├── BUILD │ ├── CMakeLists.txt │ └── linux_udp_client.cc ├── python ├── .pep8 ├── README.md ├── examples │ ├── analyze_data.py │ ├── binary_message_decode.py │ ├── encode_data.py │ ├── encode_message.py │ ├── extract_imu_data.py │ ├── extract_position_data.py │ ├── extract_satellite_info.py │ ├── extract_vehicle_speed_data.py │ ├── manual_message_decode.py │ ├── manual_tcp_client.py │ ├── message_decode.py │ ├── send_command.py │ ├── send_vehicle_speed.py │ ├── serial_client.py │ ├── tcp_client.py │ └── udp_client.py ├── fusion_engine_client │ ├── __init__.py │ ├── analysis │ │ ├── __init__.py │ │ ├── analyzer.py │ │ ├── attitude.py │ │ └── data_loader.py │ ├── applications │ │ ├── __init__.py │ │ ├── import_utils.py │ │ ├── p1_capture.py │ │ ├── p1_display.py │ │ ├── p1_extract.py │ │ ├── p1_filter.py │ │ ├── p1_lband_extract.py │ │ └── p1_print.py │ ├── messages │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── control.py │ │ ├── core.py │ │ ├── defs.py │ │ ├── device.py │ │ ├── fault_control.py │ │ ├── gnss_corrections.py │ │ ├── measurement_details.py │ │ ├── measurements.py │ │ ├── ros.py │ │ ├── signal_defs.py │ │ ├── solution.py │ │ ├── sta5635.py │ │ └── timestamp.py │ ├── parsers │ │ ├── __init__.py │ │ ├── decoder.py │ │ ├── encoder.py │ │ ├── fast_indexer.py │ │ ├── file_index.py │ │ └── mixed_log_reader.py │ └── utils │ │ ├── __init__.py │ │ ├── argument_parser.py │ │ ├── bin_utils.py │ │ ├── construct_utils.py │ │ ├── enum_utils.py │ │ ├── log.py │ │ ├── numpy_utils.py │ │ ├── print_utils.py │ │ ├── time_range.py │ │ ├── trace.py │ │ └── transport_utils.py ├── requirements.txt ├── setup.py └── tests │ ├── test_config.py │ ├── test_construct_utils.py │ ├── test_data_loader.py │ ├── test_decoder.py │ ├── test_encoder.py │ ├── test_enum_utils.py │ ├── test_file_index.py │ ├── test_message_defs.py │ ├── test_mixed_log_reader.py │ └── test_time_range.py ├── scripts └── tag_release.sh ├── src └── point_one │ ├── fusion_engine │ ├── common │ │ ├── logging.cc │ │ ├── logging.h │ │ ├── portability.h │ │ └── version.h │ ├── messages │ │ ├── configuration.h │ │ ├── control.h │ │ ├── core.h │ │ ├── crc.cc │ │ ├── crc.h │ │ ├── data_version.cc │ │ ├── data_version.h │ │ ├── defs.h │ │ ├── device.h │ │ ├── fault_control.h │ │ ├── gnss_corrections.h │ │ ├── measurements.h │ │ ├── ros.h │ │ ├── signal_defs.h │ │ ├── solution.h │ │ └── sta5635.h │ └── parsers │ │ ├── fusion_engine_framer.cc │ │ └── fusion_engine_framer.h │ └── rtcm │ ├── rtcm_framer.cc │ └── rtcm_framer.h └── wireshark └── p1_fusion_engine_dissector.lua /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | # BasedOnStyle: Google 4 | AccessModifierOffset: -1 5 | AlignAfterOpenBracket: Align 6 | AlignConsecutiveAssignments: false 7 | AlignConsecutiveDeclarations: false 8 | AlignEscapedNewlinesLeft: true 9 | AlignOperands: true 10 | AlignTrailingComments: false # Point One 11 | AllowAllParametersOfDeclarationOnNextLine: true 12 | AllowShortBlocksOnASingleLine: false 13 | AllowShortCaseLabelsOnASingleLine: false 14 | AllowShortFunctionsOnASingleLine: All 15 | AllowShortIfStatementsOnASingleLine: true 16 | AllowShortLoopsOnASingleLine: true 17 | AlwaysBreakAfterDefinitionReturnType: None 18 | AlwaysBreakAfterReturnType: None 19 | AlwaysBreakBeforeMultilineStrings: true 20 | AlwaysBreakTemplateDeclarations: true 21 | BinPackArguments: true 22 | BinPackParameters: true 23 | BraceWrapping: 24 | AfterClass: false 25 | AfterControlStatement: false 26 | AfterEnum: false 27 | AfterFunction: false 28 | AfterNamespace: false 29 | AfterObjCDeclaration: false 30 | AfterStruct: false 31 | AfterUnion: false 32 | BeforeCatch: true # Point One 33 | BeforeElse: true # Point One 34 | IndentBraces: false 35 | BreakBeforeBinaryOperators: None 36 | BreakBeforeBraces: Attach # Point One 37 | BreakBeforeTernaryOperators: true 38 | BreakConstructorInitializersBeforeComma: false 39 | ColumnLimit: 80 40 | CommentPragmas: '^ IWYU pragma:' 41 | CompactNamespaces: false # Point One 42 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 43 | ConstructorInitializerIndentWidth: 4 44 | ContinuationIndentWidth: 4 45 | Cpp11BracedListStyle: true 46 | DerivePointerAlignment: false # Point One 47 | DisableFormat: false 48 | ExperimentalAutoDetectBinPacking: false 49 | FixNamespaceComments: true # Point One 50 | ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] 51 | IncludeBlocks: Preserve # Point One 52 | IncludeCategories: 53 | - Regex: '^<.*\.h>' 54 | Priority: 1 55 | - Regex: '^<.*' 56 | Priority: 2 57 | - Regex: '.*' 58 | Priority: 3 59 | IndentCaseLabels: true 60 | IndentPPDirectives: AfterHash 61 | IndentWidth: 2 62 | IndentWrappedFunctionNames: false 63 | KeepEmptyLinesAtTheStartOfBlocks: false 64 | MacroBlockBegin: '' 65 | MacroBlockEnd: '' 66 | MaxEmptyLinesToKeep: 1 67 | NamespaceIndentation: None 68 | ObjCBlockIndentWidth: 2 69 | ObjCSpaceAfterProperty: false 70 | ObjCSpaceBeforeProtocolList: false 71 | PenaltyBreakBeforeFirstCallParameter: 1 72 | PenaltyBreakComment: 300 73 | PenaltyBreakFirstLessLess: 120 74 | PenaltyBreakString: 1000 75 | PenaltyExcessCharacter: 1000000 76 | PenaltyReturnTypeOnItsOwnLine: 200 77 | PointerAlignment: Left 78 | ReflowComments: false # Point One 79 | SortIncludes: true 80 | SpaceAfterCStyleCast: false 81 | SpaceBeforeAssignmentOperators: true 82 | # clang-format >=8 only 83 | #SpaceBeforeCpp11BracedList: false # Point One 84 | SpaceBeforeParens: ControlStatements 85 | # clang-format >=8 only 86 | #SpaceBeforeRangeBasedForLoopColon: true # Point One 87 | SpaceInEmptyParentheses: false 88 | SpacesBeforeTrailingComments: 1 # Point One 89 | SpacesInAngles: false 90 | SpacesInContainerLiterals: false # Point One 91 | SpacesInCStyleCastParentheses: false 92 | SpacesInParentheses: false 93 | SpacesInSquareBrackets: false 94 | Standard: Cpp11 # Point One 95 | TabWidth: 8 96 | UseTab: Never 97 | ... 98 | -------------------------------------------------------------------------------- /.clwb/.bazelproject: -------------------------------------------------------------------------------- 1 | directories: 2 | # Add the directories you want added as source here 3 | # By default, we've added your entire workspace ('.') 4 | . 5 | -build/ 6 | -examples/bazel-bin 7 | -examples/bazel-examples 8 | -examples/bazel-out 9 | -examples/bazel-testlogs 10 | -docs/html 11 | -python/.pytest_cache 12 | -python/venv* 13 | -wasm/build 14 | -wasm/emsdk 15 | 16 | 17 | # Automatically includes all relevant targets under the 'directories' above 18 | derive_targets_from_directories: true 19 | 20 | targets: 21 | # If source code isn't resolving, add additional targets that compile it here 22 | -//examples/...:all 23 | 24 | additional_languages: 25 | # Uncomment any additional languages you want supported 26 | # dart 27 | # javascript 28 | # python 29 | # typescript 30 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | schedule: 9 | - cron: "39 6 * * 0" 10 | 11 | jobs: 12 | analyze: 13 | name: Analyze 14 | runs-on: ubuntu-latest 15 | permissions: 16 | actions: read 17 | contents: read 18 | security-events: write 19 | 20 | strategy: 21 | fail-fast: false 22 | matrix: 23 | language: [ cpp ] 24 | 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@v3 28 | 29 | - name: Initialize CodeQL 30 | uses: github/codeql-action/init@v2 31 | with: 32 | languages: ${{ matrix.language }} 33 | queries: +security-and-quality 34 | 35 | - name: Autobuild 36 | uses: github/codeql-action/autobuild@v2 37 | 38 | - name: Perform CodeQL Analysis 39 | uses: github/codeql-action/analyze@v2 40 | with: 41 | category: "/language:${{ matrix.language }}" 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated files. 2 | *.pyc 3 | *.html 4 | *.egg-info 5 | 6 | # Bazel output directories. 7 | bazel-* 8 | 9 | # Default cmake build directory. 10 | build/ 11 | 12 | # Python files. 13 | venv*/ 14 | *.pyc 15 | 16 | # IDE project settings. 17 | .clwb/ 18 | .idea/ 19 | .vscode 20 | *.code-workspace 21 | 22 | # P1 binary files. 23 | *.p1bin 24 | *.p1log 25 | *.p1i 26 | 27 | # Doxygen output. 28 | docs/html/ 29 | 30 | Doxyfile.version 31 | docs/include_header.js 32 | docs/versions.html 33 | 34 | # Other output files. 35 | *.csv 36 | *.kml 37 | -------------------------------------------------------------------------------- /BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | 3 | # Default target: include all messages and supporting code. 4 | cc_library( 5 | name = "fusion_engine_client", 6 | deps = [ 7 | ":core", 8 | ":messages", 9 | ":parsers", 10 | ":rtcm", 11 | ], 12 | ) 13 | 14 | # Support for building a shared library if desired. 15 | cc_binary( 16 | name = "libfusion_engine_client.so", 17 | linkshared = True, 18 | deps = [ 19 | ":fusion_engine_client", 20 | ], 21 | ) 22 | 23 | # Core navigation solution support functionality. 24 | cc_library( 25 | name = "core", 26 | deps = [ 27 | ":core_headers", 28 | ":crc", 29 | ], 30 | ) 31 | 32 | ################################################################################ 33 | # Message Definitions 34 | ################################################################################ 35 | 36 | # Message definition headers only (all message types). 37 | cc_library( 38 | name = "messages", 39 | deps = [ 40 | ":core_headers", 41 | ":ros_support", 42 | ], 43 | ) 44 | 45 | # Core navigation solution message definitions. 46 | cc_library( 47 | name = "core_headers", 48 | hdrs = [ 49 | "src/point_one/fusion_engine/messages/configuration.h", 50 | "src/point_one/fusion_engine/messages/control.h", 51 | "src/point_one/fusion_engine/messages/core.h", 52 | "src/point_one/fusion_engine/messages/defs.h", 53 | "src/point_one/fusion_engine/messages/device.h", 54 | "src/point_one/fusion_engine/messages/fault_control.h", 55 | "src/point_one/fusion_engine/messages/gnss_corrections.h", 56 | "src/point_one/fusion_engine/messages/measurements.h", 57 | "src/point_one/fusion_engine/messages/signal_defs.h", 58 | "src/point_one/fusion_engine/messages/solution.h", 59 | ], 60 | deps = [ 61 | ":common", 62 | ":data_version", 63 | ], 64 | ) 65 | 66 | # STA5635 RF front-end message definitions. 67 | cc_library( 68 | name = "sta5635", 69 | hdrs = [ 70 | "src/point_one/fusion_engine/messages/sta5635.h", 71 | ], 72 | deps = [ 73 | ":core_headers", 74 | ], 75 | ) 76 | 77 | # ROS translation message definitions. 78 | cc_library( 79 | name = "ros_support", 80 | hdrs = [ 81 | "src/point_one/fusion_engine/messages/ros.h", 82 | ], 83 | deps = [ 84 | ":core_headers", 85 | ], 86 | ) 87 | 88 | ################################################################################ 89 | # Support Functionality 90 | ################################################################################ 91 | 92 | # Common support code. 93 | cc_library( 94 | name = "common", 95 | srcs = [ 96 | "src/point_one/fusion_engine/common/logging.cc", 97 | ], 98 | hdrs = [ 99 | "src/point_one/fusion_engine/common/logging.h", 100 | "src/point_one/fusion_engine/common/portability.h", 101 | "src/point_one/fusion_engine/common/version.h", 102 | ], 103 | includes = ["src"], 104 | ) 105 | 106 | # Message encode/decode support. 107 | cc_library( 108 | name = "parsers", 109 | srcs = [ 110 | "src/point_one/fusion_engine/parsers/fusion_engine_framer.cc", 111 | ], 112 | hdrs = [ 113 | "src/point_one/fusion_engine/parsers/fusion_engine_framer.h", 114 | ], 115 | deps = [ 116 | ":core_headers", 117 | ":crc", 118 | ], 119 | ) 120 | 121 | # CRC support. 122 | cc_library( 123 | name = "crc", 124 | srcs = [ 125 | "src/point_one/fusion_engine/messages/crc.cc", 126 | ], 127 | hdrs = [ 128 | "src/point_one/fusion_engine/messages/crc.h", 129 | ], 130 | deps = [ 131 | ":core_headers", 132 | ], 133 | ) 134 | 135 | # Data versioning support. 136 | cc_library( 137 | name = "data_version", 138 | srcs = [ 139 | "src/point_one/fusion_engine/messages/data_version.cc", 140 | ], 141 | hdrs = [ 142 | "src/point_one/fusion_engine/messages/data_version.h", 143 | ], 144 | includes = ["src"], 145 | deps = [ 146 | ":common", 147 | ], 148 | ) 149 | 150 | # Message encode/decode support. 151 | cc_library( 152 | name = "rtcm", 153 | srcs = [ 154 | "src/point_one/rtcm/rtcm_framer.cc", 155 | ], 156 | hdrs = [ 157 | "src/point_one/rtcm/rtcm_framer.h", 158 | ], 159 | deps = [ 160 | ":common", 161 | ], 162 | ) 163 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright (C) Point One Navigation - All Rights Reserved 2 | cmake_minimum_required(VERSION 3.12) 3 | 4 | # Set toolchain parameters before calling project(). 5 | set(CMAKE_CXX_STANDARD 11) 6 | set(CMAKE_CXX_STANDARD_REQUIRED True) 7 | 8 | # Define user options. 9 | option(P1_FE_BUILD_EXAMPLES "Build example applications." ON) 10 | 11 | if (NOT DEFINED BUILD_SHARED_LIBS) 12 | option(BUILD_SHARED_LIBS 13 | "Build shared libraries instead of static libraries." 14 | ON) 15 | endif() 16 | 17 | # Define the project and setup the compiler toolchain. This will establish 18 | # default compiler/linker flags. If the user specifies a cross-compilation 19 | # toolchain (-DCMAKE_TOOLCHAIN_FILE=...), it will be applied now. 20 | project(p1_fusion_engine_client VERSION 1.24.1) 21 | 22 | # Set additional compilation flags. 23 | if (MSVC) 24 | add_compile_options(/W4 /WX) 25 | else() 26 | add_compile_options(-Wall -Werror) 27 | endif() 28 | 29 | ################################################################################ 30 | # Library Definitions 31 | ################################################################################ 32 | 33 | # Define the fusion_engine_client library and supporting code. 34 | add_library(fusion_engine_client 35 | src/point_one/fusion_engine/common/logging.cc 36 | src/point_one/fusion_engine/messages/crc.cc 37 | src/point_one/fusion_engine/messages/data_version.cc 38 | src/point_one/fusion_engine/parsers/fusion_engine_framer.cc 39 | src/point_one/rtcm/rtcm_framer.cc) 40 | target_include_directories(fusion_engine_client PUBLIC ${PROJECT_SOURCE_DIR}/src) 41 | if (MSVC) 42 | target_compile_definitions(fusion_engine_client PRIVATE BUILDING_DLL) 43 | endif() 44 | 45 | set_target_properties(fusion_engine_client PROPERTIES 46 | VERSION ${PROJECT_VERSION} 47 | SOVERSION ${PROJECT_VERSION_MAJOR}) 48 | 49 | # Install targets. 50 | install(TARGETS fusion_engine_client 51 | LIBRARY DESTINATION lib) 52 | 53 | install(DIRECTORY src/point_one DESTINATION include 54 | FILES_MATCHING PATTERN "*.h") 55 | 56 | ################################################################################ 57 | # Example Applications (Optional) 58 | ################################################################################ 59 | 60 | if (P1_FE_BUILD_EXAMPLES) 61 | add_subdirectory(examples) 62 | endif() 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Point One Navigation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /WORKSPACE: -------------------------------------------------------------------------------- 1 | workspace(name = "p1_fusion_engine_client") 2 | -------------------------------------------------------------------------------- /docs/doxy_footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
12 | 13 | 14 |