projects

Geo Acq

Go/Wails application for acquiring, visualizing, and saving NMEA sentences from shipboard instruments.

Published on June 4, 2026

Status: Prototype in development

Repository: GitHub

Overview

Geo Acq is an acquisition application developed in Go to decode NMEA sentences from shipboard instruments, display them during acquisition, and save them locally.

The project targets very practical field use cases: monitoring navigation data (GPS) or measurements, such as an echo sounder, during an operation, quickly checking that an RS-232 serial or UDP stream is being received correctly, preserving raw sentences, and preparing usable extraction after the session.

There is currently a CLI version and a graphical version built with Wails. This interface provides a modern desktop front end for the Go acquisition engine while keeping the technical base simple: TOML configuration, serial or network acquisition, SQLite storage, and command-line tools for complementary processing. The application can also simulate some instruments for testing or when the hardware is not available.

In the 1990s, we had already developed acquisition software for a thermosalinograph (TSG + GPS), written first in C and then in C++, designed for deployment on merchant vessels to collect continuous sea surface temperature and salinity measurements along commercial shipping routes. Several variants were also produced, for example for dissolved CO2 measurements as part of the ECOA project.

That TSG program was later rewritten in LabVIEW by a colleague in Noumea under the name SODA, and the application is still used on merchant vessels in the IRD network.

With Geo Acq, the idea is to bring these proven acquisition techniques into a modern environment: a safer compiled language, a graphical interface that is easier to distribute, readable configuration, and directly usable local storage. Other approaches could produce a similar result, such as Python with PySide6, Go with Fyne, Rust with Tauri, or a more monitoring-oriented stack with Node-RED and a local database. The Go + Wails choice provides a good balance between a standalone executable, low-level serial port access, and a lightweight desktop interface.

Wails Graphical Interface

The GUI version is a desktop prototype built with Wails, combining a Go backend and a lightweight web frontend. It provides an interface for loading a configuration, starting a session, and monitoring instruments without working only in a terminal.

The current interface provides:

  • a control bar with configuration file selection, loading, editing, port refresh, and session start/stop controls
  • a Configuration tab with mission metadata and the general configuration state
  • a Device panels tab, displayed by default, with one card for each configured instrument
  • a Terminal raw frames tab for diagnosing received sentences in real time
  • an Available inputs tab for checking detected serial ports
Geo-acq, main acquisition view

Geo-acq: data acquisition view with GPS and simulated echo sounder.

Each instrument panel displays the logical instrument name, transport, port, status, number of received sentences, expected NMEA sentences, and available decoded values. Latitudes and longitudes are shown in a form that is readable for the operator.

Acquisition Flow

A session can combine real instruments and simulators. Each instrument is configured with one mode:

  • ready: opens the configured real transport, either serial or UDP
  • simulate: generates sentences through the built-in simulator for that instrument
  • disabled: ignores the instrument when the session starts

At startup, the application loads the configuration, opens the active transports, reads complete sentences, timestamps each sentence on reception, attempts NMEA decoding, updates the interface panels, and writes data to local databases when saving is enabled.

Geo-acq, configuration mode

Geo-acq: configuration file selection view.

This behavior makes it possible to test a configuration before a field campaign, work with a real GPS and a simulated echo sounder, or replay a demonstration chain without having all the hardware available.

Geo-acq, TOML file editing mode

Geo-acq: editing view for the .toml configuration file.

Instruments And Sentences

The project focuses on instruments that produce NMEA sentences, especially:

  • GPS
  • echo sounder
  • radar or other NMEA-compatible sources

Decoding already supports several common sentences, including position, speed, course, satellite, and depth data. Undecoded sentences remain visible in the raw terminal and can be preserved in the database.

Geo-acq, terminal mode

Geo-acq: terminal view showing GPS and echo sounder NMEA sentences.

This separation is important: even as application-level decoding evolves, raw observations remain available for verification, reprocessing, or later analysis.

Storage And Export

Persistence is based on SQLite, with two possible levels:

  • a raw database, <mission>-raw.sqlite, centered on received NMEA sentences
  • a decoded database, <mission>-data.sqlite, organized by supported sentence types

The raw database preserves the mission, acquisition session, UTC reception timestamp, instrument name, transport used, sentence type, and NMEA payload. The decoded database stores useful fields in typed columns to make later use easier.

Raw-frame table view

View of the raw-frame table

RMC data table view

View of the RMC table

A geo-export tool complements the main application. It exports a raw or decoded database to TSV or CSV, with optional selection of a specific mission or session.

$ bin/geo-export.exe -h
Export geo-acq SQLite data to TSV or CSV.

Usage: geo-export [-cCfhprT] [-m name] [-o file] [-s id] <input.sqlite>
 -c, --compact      write compact processed output
 -C, --csv          write CSV output
 -f, --full         write full output
 -h, --help         display help
 -m, --mission=name
                    optional mission filter
 -o, --output=file  output file
 -p, --processed    export processed SQLite input
 -r, --raw          export raw SQLite input
 -s, --session-id=id
                    optional session id
 -T, --tsv          write TSV output

Example data extraction:

$ bin/geo-export.exe -c examples/dev-data.sqlite
wrote 12 rows to examples/dev-data.tsv
$ cat examples/dev-data.tsv
# datetime_utc  latitude        longitude       speed_knots     depth_meters
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.6
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.6
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.5
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.5
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.4
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.8
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.8
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.7
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.5
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.5
2026-05-04T01:55:40Z    48.1173000      11.5166667      0.000   15.9

Key Technical Points

The project relies on the following architecture:

  • main backend in Go
  • desktop interface with Wails
  • Vite frontend in JavaScript
  • configuration through TOML files
  • RS-232 serial and UDP transports
  • built-in GPS and echo sounder simulators
  • local raw and decoded SQLite storage
  • separate export tool for producing tabular files
  • build tasks with Taskfile and Makefile

The Wails version uses runtime events to propagate acquisition state and new sentences to the user interface. Instrument panels and the terminal are therefore updated live during the session.

Current State

Geo Acq is a project draft, but it already provides a functional base for experimenting with a robust and operational acquisition chain that can be deployed on a lightweight platform such as a Raspberry Pi 5 with an integrated touchscreen and battery power.

The current limitations are known:

  • configuration editing is still done in a raw TOML editor
  • panels do not yet expose structured forms by instrument
  • decoded values remain generic, without sensor-specific operational widgets
  • there is not yet a session history browser in the interface
  • a real-time navigation window still needs to be implemented
  • circular buffering still needs to be added for reduced data display, including outlier removal

Intended Audience

I mainly imagine Geo Acq as a field tool: the kind of application you start to check that a GPS, an echo sounder, or a serial link is talking correctly, keep a clean record of the received sentences, and leave with usable data after the test or field campaign.

  • acquisition technicians
  • developers of shipboard tools or test benches
  • teams that need to quickly check a serial or UDP stream
  • users who need to preserve raw sentences before scientific processing