Skip to content

3 ‐ User guide

gfo974 edited this page Jun 14, 2024 · 12 revisions

Prerequisites

Item Notes
Segger J-Link Required for initial programming boards with combined u-boot + softdevice + application image.
Laptop PC Windows 10, Linux or MacOS with a Bluetooth adapter
Python3 distribution Must be installed for using pylinkit package.
Using a VM May cause reliability and speed issues with the pylinkit package.
Nordic Command Line Tools Installed on Linux PC. See Nordic Semiconductor website for more information.
4.2V Battery For operational usage after programming.
Software distribution The following files are required for first-time programming:
- pylinkit-vX.Y.Z.zip
If running a firmware upgrade over BLE, you will require the following file:
- LinkIt_XXXX_board-vX.Y.Z.img
If you are running a firmware upgrade over USB (DFU mode), you will require the following:
- LinkIt_XXXX_board_dfu-vX.Y.Z.zip
Note that XXXX is the model and can be one of: horizon, CORE, SB, UW. The same CORE/SB/UW software may be used for V1, V2, and V3 LinkIt hardware platforms. The horizon build must be used for Horizon V4 hardware.
USB serial cable A 3.3V FTDI USB serial cable is recommended to obtain debug trace output.
Horizon board V4.1
LinkIt board V1, V2 or V3
Magnet Required to control the reed switch labelled SW3 on the PCB.

Programming

Update

On Horizon board

  1. Power the device then press and hold both SW1 (RESET) and SW2 (BOOT) simultaneously then continue to step 2 for LinkIt board

On LinkIt

  1. Power the device then press and hold SW1 (RESET) and connect DBG pin and GND pin simultaneously
  2. Release SW1 (RESET)
  3. Confirm the STATUS LED turns green and the following USB device is visible

Bus 003 Device 023: ID 1915:521f Nordic Semiconductor ASA

  1. Run the following command to program the application image over DFU

nrfutil dfu usb-serial -p /dev/ttyACM0 -pkg LinkIt_XXXX_dfu-vX.Y.Z.zip [linux]

nrfutil dfu usb-serial -p COMx -pkg LinkIt_XXXX_dfu-vX.Y.Z.zip [windows]

A progress bar will indicate when the application image has transferred. The device will now automatically boot into the new application image.

Update from Horizon to Linkit firmware (or Linkit to Horizon)

If you have previously programmed a Horizon or Linkit device, the QSPI memory may not be fully erased using the -nrf52 --eraseall command alone.

Instead, running the qspi.ini script (refer to the command below) will perform a complete erase of this memory space and should resolve any residual issues caused by running different firmware versions in the past.

The extension has been changed from .ini to .txt to be uploaded. qspi.txt

Here is an example of programming Horizon firmware onto a board that was previously running Linkit firmware (and vice versa).

nrfjprog -f nrf52 --eraseall nrfjprog --qspiini qspi.ini --qspieraseall (optional if unit has been used with other firmware releases such as LinkIt CORE)

nrfjprog -f nrf52 --program s140_nrf52_6.1.1_softdevice.hex --sectorerase

nrfjprog -f nrf52 --program horizon_bootloader_v1.3rc_d4a24118.hex --sectoranduicrerase

nrfjprog -f nrf52 --reset

OTA update

You will first require a firmware update image file LinkIt_horizon_board-vX.Y.Z.img. To execute a firmware update over BLE, run the command pylinkit --device xx:xx:xx:xx:xx:xx --fw LinkIt_horizon_board-vX.Y.Z.img

The firmware image files since v0.17 are approx. 400KB and the process can take 4-5 minutes over the BLE link

Note that once the firmware file has been received, it is necessary to perform a device reset for the firmware update to take effect. Refer to Reset the hardware section.

Argos ID

To use the Argos communication feature of the board, you need to contact CLS and request an ID. Additionally, you must create an account. We no longer ship boards with pre-configured IDs as per guidance from CLS.

Please follow these steps:

1. Visit [CLS Argos Login](https://argos-system.cls.fr/argos-cwi2/login.html) and register by clicking "Become a User" to create an account where you can order IDs.
2. If you already have an account from previous testing, log in, click on the account button, and then select "SUA / Request IDs."

For any assistance or further information, please contact CLS directly

Starting

Starting process

Reed switch and LED status output

The following table outlines the system states and expected STATUS LED output.

System State User Action To Initiate STATUS LED
Powered Off Off Off
Boot State Hold magnet over reed switch * WHITE - while running u-boot and during firmware update
* FLASHING WHITE - application boot state entered
* Transitions to Pre-Operational State after 2 seconds
Pre-Operational State None, this state is entered immediately after Boot State
A magnet may be used with the reed switch to select options:
1. Go operational - wait for SOLID GREEN LED and then remove the magnet
2. Go to configuration - wait for SOLID BLUE LED then remove the magnet
3. Power off - wait for RAPID FLASHING WHITE
* FLASHING GREEN 5 seconds - entering operational with battery nominal
* FLASHING YELLOW 5 seconds - entering operational with battery low
* WHITE - magnet is engaged with reed switch
The system will transition to Operational State
Operational State None, this state is entered 5 seconds after Pre-Operational State
A magnet may be used with the reed switch to select options:
1. Go operational - wait for SOLID GREEN LED and then remove the magnet
2. Go to configuration - wait for SOLID BLUE LED then remove the magnet
3. Power off - wait for RAPID FLASHING WHITE
If the LED_MODE parameter is set accordingly then additional LED indications are:
* FLASHING CYAN GNSS powered
* SOLID GREEN GNSS fix acquired
SOLID RED GNSS fix failed
* SOLID MAGENTA - Argos TX active, includes TCXO warm-up time
Error State None, this state is entered 15 seconds after Idle State or immediately if an error occurs during Boot State FLASHING RED 5 seconds
Configuration State Hold magnet over reed switch for 3 seconds or select from Menu State
A magnet may be used with the reed switch to select options:
1. Go operational - wait for SOLID GREEN LED and then remove the magnet
2. Go to configuration - wait for SOLID BLUE LED then remove the magnet
3. Power off - wait for RAPID FLASHING WHITE
FLASHING BLUE - no BLE connection present
A magnet may be used with the reed switch to select options:
1. Go operational - wait for SOLID GREEN LED and then remove the magnet
2. Go to configuration - wait for SOLID BLUE LED then remove the magnet
3. youPower off - wait for RAPID FLASHING WHITE
SOLID BLUE - BLE connection present

ℹ️ Note that in the event of an Error State, the user can intervene by immediately holding a magnet for 3 seconds over the reed switch to enter Configuration State. It is then recommended to execute the factory reset command from pylinkitto attempt to clear the cause of the error.

ℹ️ A typical cause of the Error State is following a firmware update where the parameters or log file format has changed and the existing file is no longer compatible. It is necessary to perform a factory reset after the firmware update has been completed when this happens.

Charging

The Horizon Linkit Core can charge the battery via three hardware options and can also operate without charging the battery:

  • The USB battery charger (BQ24230)
  • The wireless charger (STWLC68)
  • The solar charger (SPV1050) => ⚠️ A strap is required to connect VSTORE to VBAT on Linkit.
  • Direct connection on VBAT without charging the battery (Primary)

To select one of these options, it is necessary to solder/desolder resistors on the Linkit PCB.

R1 R2 R3 R4
Solar No Yes No Yes
Wireless Yes No Yes No
USB Yes No Yes No
Primary No No No Yes

Note: The Horizon board can only be charged via USB.

The underwater device is equipped with the wireless charger, below the charging procedure

Charging process

ℹ️ Note: If the device is in dive mode, plugging the board into the wireless charger will disengage the dive mode automatically.

ℹ️ Note: The charger chip (BQ24230) utilizes dynamic power-path management (DPPM), enabling the system to power up while simultaneously and independently charging the battery. However, if the USB power source is inadequate or if the device is drawing significant power, the charging process may not receive sufficient power, resulting in slow or insufficient charging.

Charging with USB:

  1. Plug the battery needing a recharge into the Linkit board.
  2. Plug the board connector end of the battery cable into the Linkit board with the black wire in the “ BAT-” and the red wire into “BAT+” as in the picture below.

There is no + or - polarity marked on the battery cable. You need to remember that the red wire -> “BAT+” and the black wire -> “BAT-”. Connecting the wires incorrectly will invert the polarity and could potentially damage the board.

  1. Plug the micro-USB cable into the Linkit micro-USB port (if charging with USB); plug the other end of the USB cable into a wall charger.

You see the charging status (CHARGED LED turns solid GREEN to indicate the battery is fully charged) and the charging LED (CHARGING LED turns solid RED indicating that the battery is charging).

Charging process

Configuring

Configuration using Pylinkit

If not already installed, install pylinkit from the supplied python package distribution as follows:

sudo python3 setup.py install [linux]

python3 setup.py install [windows]

In order to use pylinkit firstly put your device into configuration mode by holding a magnet over the reed switch for 3 seconds until the STATUS LED starts to flash blue or select CONFIG from the LED menu.

You can run pylinkit --help to get a complete list of all the options available in the tool. If you require debug trace then use the --debug option.

Discover

Run the command pylinkit --scan to search for your devices. The scan procedure expects the phrase Horizon or LinkIt to be part of the device name. All devices shall be reported as follows:

Horizon CORE <NORDIC_32BIT_DECID> e.g., CE:BD:65:D5:4F:D2 Horizon CORE 21223432432432

or

Linkit <ARGOS_DECID> e.g., CE:BD:65:D5:4F:D2 Linkit CORE 21223

Note that since Horizon may be optionally fitted with an external Artic transceiver, then the reported board identifier does not use ARGOS_DECID

ℹ️ When running on MacOS the device address will be a 128-bit UUID e.g., 20007A9B-CFB2-4BEB-BAFB-91F3BC1282BB. Use the UUID as the device address instead on MacOS.

Read configuration

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --parmr params.txt

On a new device (or after a factory reset) the file contents should be as follows:

[PARAM]
ALS_SENSOR_ENABLE = 0
ALS_SENSOR_PERIODIC = 0
ALS_SENSOR_VALUE = nan
ARGOS_AOP_DATE = 07/10/2021 22:41:14
ARGOS_DECID = 0
ARGOS_DUTY_CYCLE = 000000
ARGOS_FREQ = 401.65
ARGOS_HEXID = 0
ARGOS_MODE = LEGACY
ARGOS_NTRY_PER_MESSAGE = 0
ARGOS_POWER = 350
ARGOS_RX_AOP_UPDATE_PERIOD = 90
ARGOS_RX_EN = 1
ARGOS_RX_MAX_WINDOW = 900
ARGOS_TCXO_WARMUP_TIME = 5
ARGOS_TIME_SYNC_BURST_EN = 1
ARGOS_TX_JITTER_EN = 1
ARGOS_TX_REPETITION = 60
AXL_SENSOR_ENABLE = 0
AXL_SENSOR_PERIODIC = 0
AXL_SENSOR_WAKEUP_SAMPLES = 5
AXL_SENSOR_WAKEUP_THRESH = 0.0
BATT_SOC = 100
BATT_VOLTAGE = 5.19
CDT_SENSOR_CONDUCTIVITY_VALUE = nan
CDT_SENSOR_DEPTH_VALUE = nan
CDT_SENSOR_ENABLE = 0
CDT_SENSOR_PERIODIC = 0
CDT_SENSOR_TEMPERATURE_VALUE = nan
CERT_TX_ENABLE = 0
CERT_TX_MODULATION = A2
CERT_TX_PAYLOAD = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
CERT_TX_REPETITION = 60
DEBUG_OUTPUT_MODE = UART
DEVICE_DECID = 2600774695
DEVICE_MODEL = Linkit UW
EXT_LED_MODE = ALWAYS
FW_APP_VERSION = v3.3.16-0-g576e6a34
GNSS_ACQ_TIMEOUT = 120
GNSS_ASSISTNOW_EN = 1
GNSS_ASSISTNOW_OFFLINE_EN = 0
GNSS_COLD_ACQ_TIMEOUT = 530
GNSS_COLD_START_RETRY_PERIOD = 60
GNSS_DELTATIME_ACQ = 10
GNSS_DYN_MODEL = PORTABLE
GNSS_ENABLE = 1
GNSS_FIX_MODE = AUTO
GNSS_HACCFILT_ENABLE = 1
GNSS_HACCFILT_THR = 5
GNSS_HDOPFILT_ENABLE = 1
GNSS_HDOPFILT_THR = 2
GNSS_MIN_NUM_FIXES = 1
GNSS_NBLASTFIX_TOSEND = 16
GNSS_TRIGGER_ON_AXL_WAKEUP = 0
GNSS_TRIGGER_ON_SURFACED = 1
HW_VERSION = LinkIt V2
LAST_FULL_CHARGE_DATE = 01/01/1970 00:00:00
LAST_TX = 01/01/1970 00:00:00
LB_ARGOS_DUTY_CYCLE = 000000
LB_ARGOS_MODE = LEGACY
LB_ARGOS_POWER = 350
LB_ARGOS_TX_REPETITION = 240
LB_EN = 0
LB_GNSS_ACQ_TIMEOUT = 120
LB_GNSS_DELTATIME_ACQ = 60
LB_GNSS_EN = 1
LB_GNSS_HACCFILT_THR = 5
LB_GNSS_HDOPFILT_THR = 2
LB_GNSS_NBLASTFIX_TOSEND = 1
LB_NTRY_PER_MESSAGE = 1
LB_TRESHOLD = 10
LED_MODE = 24HRS
PH_SENSOR_ENABLE = 0
PH_SENSOR_PERIODIC = 0
PH_SENSOR_VALUE = nan
PP_COMP_STEP = 10
PP_LINEAR_MARGIN = 300
PP_MAX_ELEVATION = 90.0
PP_MAX_PASSES = 1000
PP_MIN_DURATION = 30
PP_MIN_ELEVATION = 15.0
PRESSURE_SENSOR_ENABLE = 0
PRESSURE_SENSOR_PERIODIC = 0
PROFILE_NAME = FACTORY
RX_COUNTER = 0
RX_TIME = 0
SEA_TEMP_SENSOR_ENABLE = 0
SEA_TEMP_SENSOR_PERIODIC = 0
SEA_TEMP_SENSOR_VALUE = nan
TX_COUNTER = 0
UNDERWATER_DETECT_SOURCE = SWS
UNDERWATER_DETECT_THRESH = 1.1
UW_DRY_SAMPLING = 15
UW_DRY_TIME_BEFORE_TX = 1
UW_ENABLE = 0
UW_MAX_SAMPLES = 5
UW_MIN_DRY_SAMPLES = 1
UW_PIN_SAMPLE_DELAY = 1
UW_SAMPLE_GAP = 1000
UW_WET_SAMPLING = 15
WCHG_STATUS = UNDETECTED
ZONE_ACTIVATION_DATE = 01/01/2020 00:00:00
ZONE_ARGOS_DEPTH_PILE = 1
ZONE_ARGOS_DUTY_CYCLE = FFFFFF
ZONE_ARGOS_MODE = LEGACY
ZONE_ARGOS_NTRY_PER_MESSAGE = 0
ZONE_ARGOS_POWER = 350
ZONE_ARGOS_REPETITION_SECONDS = 240
ZONE_CENTER_LATITUDE = -48.8752
ZONE_CENTER_LONGITUDE = -123.392
ZONE_ENABLE_ACTIVATION_DATE = 1
ZONE_ENABLE_OUT_OF_ZONE_DETECTION_MODE = 0
ZONE_GNSS_ACQ_TIMEOUT = 240
ZONE_GNSS_DELTATIME_ACQ = 60
ZONE_GNSS_HACCFILT_THR = 5
ZONE_GNSS_HDOPFILT_THR = 2
ZONE_RADIUS = 1000
ZONE_TYPE = CIRCLE

ℹ️ Note that parameters are saved in alphabetical order.

Write configuration

Create a new parameters file using the above file format as a template. We recommend to remove any unwanted settings to keep the file as small as possible:

[PARAM]
XXXX = YYYYY

Refer to the section Parameter Reference for more information on the parameter values and ranges.

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --parmw <your params file> to update configuration file.

It is normally a good idea to read back your configuration again afterwards using --parmr.

ℹ️ To receive proper altitude reports over the SHORT-MSG format in Argos transmissions, ensure that GNSS_FIX_MODE is set to 3D

Program a prepass prediction JSON file

Download the most recent pass prediction file from the Argos web service to your local hard disk. Then run the following command to send the AOP data pylinkit --device xx:xx:xx:xx:xx:xx --paspw <your prepass prediction JSON file>

You can confirm if the AOP has been updated by checking the ARGOS_AOP_DATE parameter after performing a --parmr command.

Calibrating

Argos Calibration

All Linkit boards purchased from CLS/Arribada have undergone Argos power calibration to ensure the accurate delivery of power across the 350mW, 500mW, and 750mW configurations.

The MCP47X6 DAC device manages the power supplied to the power amplifier used for Argos communication.

A dedicated Python script is utilized to calibrate the board using either a VNA or spectrogram. If needed, you can inquire about the Python script on the Linkit Forum.

Starting process

Sensors calibration

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --scalw {cdt,ph,rtd,mcp47x6} --command x [--value xxx]

The command and value options are device-specific as follows:

Device Command Value Comments
CDT 0 N/A Reset existing calibration
1 Reference impedance in Ohms Runs gain factor calibration
2 CA coefficient value Store CA value
3 CB coefficient value Store CB value
4 CC coefficient value Store CC value
5 N/A Save calibration
PH 0 N/A Reset existing calibration
1 N/A Run pH 7 calibration
2 N/A Run pH 1 calibration
3 N/A Run pH 14 calibration
RTD 0 N/A Reset existing calibration
1 N/A Run 0C calibration
MCP47X6 0 N/A Reset existing calibration
(DAC) 1 N/A Save calibration to file
{ 3, 5, 40, 50, 200, 350, 500, 750, 1000, 1500 } 0 - 4095 Set DAC value for specified power level in mW

⚠️ if the device is not present then an error code 5 response will occur when attempting to perform any calibration command

Data

Dump log file

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --dumpd file.csv --dumpd_type {system,gnss,als,ph,rtd,cdt,axl,pressure}

The retrieved records are saved in CSV format. The first row shall indicate the column names.

Erase log file

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --erase {all,sensor,system,gnss,als,ph,rtd,cdt,axl,pressure}

Use the all option to erase all log files. The option sensor is the same as gnss and is provided for script compatibility reasons

Live position

Thanks to the Argos web service, you gain access to a comprehensive map featuring all your devices. This platform offers various search criteria, diverse map renderings, and additional satellite tools such as sea surface temperature, phytoplankton distribution, sea level anomalies, and surface currents, among others.

Starting process

Application

Underwater detection

Underwater detection can be accomplished using either the saltwater switch (SWS) or a pressure sensor. Refer to the configuration setting UNDERWATER_DETECTION_SOURCE.

In the case the pressure sensor is used, an additional parameter UNDERWATER_DETECTION_THRESH must be used to set the surfaced/submerged threshold level in units of Bar. The default threshold is 1.1 Bar.

Note that when the submerged state is detected, any ongoing GNSS or Argos activity is deferred and will not be rescheduled until the unit surfaces once more.

The following pressure sensor models are supported and can be fitted on U10 or via an external J7 connector:

  • MS5803-14BA
  • MS5837-30BA

Dive mode

In order to prevent spurious reed switch transitions when underwater it is possible to enable the dive mode feature. When enabled dive mode is enabled it shall operate as follows:

  • Dive mode begins in a dive mode idle state upon going operational i.e., normal reed switch behaviour.
  • If UW_DIVE_MODE_ENABLE is set then the dive mode service waits for the first UW detection event, otherwise it remains in its idle state and ignores any UW detection events.
  • Upon receiving its first UW detection the dive mode service start pending state is entered and a timer is initiated as defined by the UW_DIVE_MODE_START_TIME in seconds.
  • When the UW_DIVE_MODE_START_TIME period elapses the dive mode engaged state is entered.
  • When dive mode is in the engaged state, the reed switch input is disabled thus preventing any spurious activity on the reed switch from interfering with the system’s operation.
  • When the unit is returned to the charging dock this shall trigger an interrupt from the wireless charging chip
  • Upon detecting this interrupt dive mode shall enter a disengaged state.
  • When in the disengaged state, normal reed switch behaviour shall resume.

Note that dive mode can not be reengaged once it is in the disengaged state until the system reenters operational state once more (i.e., either following a power off or following a configuration state).

The system log shall include entries when dive mode enters any of the following states:

  • start pending (i.e., upon receiving the first UW detection event)
  • engaged (i.e., upon the start timer expiring)
  • disengaged (i.e., upon being docked with the wireless charger)

GNSS Scheduling

By default the GNSS is enabled and periodically scheduled.

When the GNSS is enabled, it will always attempt a cold start fix shortly after entering the operational state and continue to attempt cold start fixes periodically until an initial acquisition is found.

Periodic GNSS scheduling can be disabled by setting GNSS_DELTATIME_ACQ to 0. This, however, does not disable the cold start fix logic which can only be stopped if the GNSS is disabled.

Independently, it is possible to configure the GNSS to trigger on an underwater detection surfaced event using the GNSS_TRIGGER_ON_SURFACED parameter. This can be useful in situations where, for example, no periodic scheduling is required and only the present location when surfaced is important.

Additionally, it is possible to configure the GNSS to trigger an accelerometer movement event using the GNSS_TRIGGER_ON_AXL_WAKEUP.

Others

Debug trace

Debug trace is available on the J4 debug header at 460800-8-N-1-NoFlow (refer to board layout diagram for location of DBG and GND pins). From a Linux terminal, you can run the following commands to see debug trace output:

sudo stty -F /dev/ttyUSB0 460800

sudo cat /dev/ttyUSB0

Under Windows, we recommend using PuTTY.

The application boot-up sequence will typically show the following trace output:

01/01/1970 00:00:00 [TRACE] Timer...
app_timer: RTC: initialized.
app_timer: RTC: initialized.
01/01/1970 00:00:00 [TRACE] RGB LED...
01/01/1970 00:00:00 [TRACE] External LED...
01/01/1970 00:00:00 [TRACE] Reed switch...
01/01/1970 00:00:00 [TRACE] BLE...
01/01/1970 00:00:00 [TRACE] IS25 flash...
01/01/1970 00:00:00 [TRACE] PMU Reset Cause = Hard Reset
01/01/1970 00:00:00 [TRACE] STWLC68...
01/01/1970 00:00:00 [TRACE] Scheduler...
01/01/1970 00:00:00 [TRACE] Battery monitor...
01/01/1970 00:00:00 [TRACE] Enter ADC calibration...
01/01/1970 00:00:00 [TRACE] ADC calibration complete...
01/01/1970 00:00:00 [TRACE] Reed gesture...
01/01/1970 00:00:00 [TRACE] LFS filesystem...
01/01/1970 00:00:00 [TRACE] Mount LFS filesystem...
01/01/1970 00:00:00 [TRACE] LFS System Log...
01/01/1970 00:00:00 [TRACE] LFS (GPS) Sensor Log...
01/01/1970 00:00:00 [TRACE] ALS Sensor Log...
01/01/1970 00:00:00 [TRACE] PH Sensor Log...
01/01/1970 00:00:00 [TRACE] RTD Sensor Log...
01/01/1970 00:00:00 [TRACE] CDT Sensor Log...
01/01/1970 00:00:00 [TRACE] PRESSURE Sensor Log...
01/01/1970 00:00:00 [TRACE] AXL Sensor Log...
01/01/1970 00:00:00 [TRACE] Configuration store...
01/01/1970 00:00:00 [TRACE] RAM access...
01/01/1970 00:00:00 [TRACE] DTE handler...
01/01/1970 00:00:00 [TRACE] OTA updater...
01/01/1970 00:00:00 [TRACE] SWS...
01/01/1970 00:00:00 [TRACE] ServiceManager::add: service=SaltwaterDetector added id=0
01/01/1970 00:00:00 [TRACE] Artic R2...
01/01/1970 00:00:00 [TRACE] Checking for MCP4716...
01/01/1970 00:00:00 [WARN] Calibration:: file MCP47X6.CAL missing or corrupted
01/01/1970 00:00:00 [TRACE] MCP47X6::power_down: Shutdown DAC
01/01/1970 00:00:00 [TRACE] MCP4716 found
01/01/1970 00:00:00 [TRACE] ArticSat::detect_dsp_present
01/01/1970 00:00:00 [TRACE] ArticSat::ARTIC_STATE_CHANGE: stopped -> starting
01/01/1970 00:00:00 [TRACE] ArticSat::ARTIC_STATE_CHANGE: starting -> powering_on
01/01/1970 00:00:00 [TRACE] ArticSat::ARTIC_STATE_CHANGE: powering_on -> reset_assert
01/01/1970 00:00:01 [TRACE] ArticSat::ARTIC_STATE_CHANGE: reset_assert -> reset_deassert
01/01/1970 00:00:01 [TRACE] ArticSat::ARTIC_STATE_CHANGE: reset_deassert -> dsp_reset
01/01/1970 00:00:01 [TRACE] DSP_STATUS=55
01/01/1970 00:00:01 [TRACE] ArticSat::ARTIC_STATE_CHANGE: dsp_reset -> send_firmware_image
01/01/1970 00:00:01 [TRACE] ArticSat::ARTIC_STATE_CHANGE: idle -> stopped
01/01/1970 00:00:01 [TRACE] ServiceManager::add: service=ARGOSTX added id=1
01/01/1970 00:00:01 [TRACE] ServiceManager::add: service=ARGOSRX added id=2
01/01/1970 00:00:01 [TRACE] GPS M8Q ...
01/01/1970 00:00:01 [TRACE] ServiceManager::add: service=GNSS added id=3
01/01/1970 00:00:01 [TRACE] MS58xx...
01/01/1970 00:00:01 [TRACE] MS58xxLL::MS58xxLL(i2cbus=0, i2caddr=0x77, variant=MS5803_14BA)
01/01/1970 00:00:01 [TRACE] MS58xxLL::read_coeffs: PROM size = 8 words
01/01/1970 00:00:01 [TRACE] MS58xx: not detected on i2cbus=0 i2caddr=0x77
01/01/1970 00:00:01 [TRACE] MS58xxLL::MS58xxLL(i2cbus=0, i2caddr=0x76, variant=MS5837_30BA)
01/01/1970 00:00:01 [TRACE] MS58xxLL::read_coeffs: PROM size = 7 words
01/01/1970 00:00:01 [TRACE] MS58xx: not detected on i2cbus=0 i2caddr=0x76
01/01/1970 00:00:01 [TRACE] MS58xxLL::MS58xxLL(i2cbus=1, i2caddr=0x77,variant=MS5803_14BA)
01/01/1970 00:00:01 [TRACE] MS58xxLL::read_coeffs: PROM size = 8 words
01/01/1970 00:00:01 [TRACE] MS58xx: not detected on i2cbus=1 i2caddr=0x77
01/01/1970 00:00:01 [TRACE] MS58xxLL::MS58xxLL(i2cbus=1, i2caddr=0x76, variant=MS5837_30BA)
01/01/1970 00:00:01 [TRACE] MS58xxLL::read_coeffs: PROM size = 7 words
01/01/1970 00:00:01 [TRACE] MS58xx: not detected on i2cbus=1 i2caddr=0x76
01/01/1970 00:00:01 [TRACE] AD5933...
01/01/1970 00:00:01 [TRACE] AD5933LL::AD5933LL(0, 0x0d)
01/01/1970 00:00:01 [TRACE] AD5933LL::powerdown
01/01/1970 00:00:01 [TRACE] AD5933: not detected on i2cbus=0 i2caddr=0x0d
01/01/1970 00:00:01 [TRACE] AD5933LL::AD5933LL(1, 0x0d)
01/01/1970 00:00:01 [TRACE] AD5933LL::powerdown
01/01/1970 00:00:01 [TRACE] AD5933: not detected on i2cbus=1 i2caddr=0x0d
01/01/1970 00:00:01 [TRACE] LTR303...
01/01/1970 00:00:01 [TRACE] LTR303: not detected
01/01/1970 00:00:01 [TRACE] OEM PH...
01/01/1970 00:00:01 [TRACE] OEM PH: not detected
01/01/1970 00:00:01 [TRACE] OEM RTD...
01/01/1970 00:00:01 [TRACE] OEM RTD: not detected
01/01/1970 00:00:01 [TRACE] BMX160...
01/01/1970 00:00:01 [TRACE] BMX160LL::init
01/01/1970 00:00:01 [ERROR] BMX160 initialization failure
01/01/1970 00:00:01 [TRACE] BMX160: not detected
01/01/1970 00:00:01 [TRACE] Memory monitor...
01/01/1970 00:00:01 [TRACE] ServiceManager::add: service=MEMORY added id=4
01/01/1970 00:00:01 [TRACE] Entering main SM...
01/01/1970 00:00:01 [INFO] entry: BootState
01/01/1970 00:00:01 [TRACE] LEDOff: entry
01/01/1970 00:00:01 [TRACE] LEDBoot: entry
01/01/1970 00:00:01 [TRACE] ConfigurationStoreLFS::deserialize_config
01/01/1970 00:00:01 [TRACE] ConfigurationStoreLFS::deserialize_prepass
01/01/1970 00:00:01 [INFO] Firmware Version: v3.3.16-0-g576e6a34
01/01/1970 00:00:01 [INFO] Logger Console has 0 entries
01/01/1970 00:00:01 [INFO] Logger system.log has 809 entries
01/01/1970 00:00:01 [INFO] Logger sensor.log has 5 entries
01/01/1970 00:00:01 [INFO] Logger ALS has 0 entries
01/01/1970 00:00:01 [INFO] Logger PH has 0 entries
01/01/1970 00:00:02 [INFO] Logger RTD has 0 entries
01/01/1970 00:00:02 [INFO] Logger CDT has 0 entries
01/01/1970 00:00:02 [INFO] Logger PRESSURE has 0 entries
01/01/1970 00:00:02 [INFO] Logger AXL has 0 entries
01/01/1970 00:00:02 [INFO] configuration_store: is_valid=1
01/01/1970 00:00:02 [INFO] reset cause: Hard Reset
01/01/1970 00:00:04 [TRACE] GenTracker::kick_watchdog: calling PMU::kick_watchdog
01/01/1970 00:00:04 [INFO] exit: BootState

ℹ️ Note that since the real-time clock on the device is powered off, it always starts up from 1st January 1970. The RTC date and time will get automatically set upon the first successful GPS fix.

To assist with debugging certain issues that may arise during operational state, it is possible to attach a serial terminal over BLE using a the Nordic UART Service (NUS). This feature requires the configuration option DEBUG_OUTPUT_MODE to be set to BLE. You can use a phone application like "Serial Bluetooth Terminal" to access to the log.

Note that this will re-direct debug trace from UART to the NUS only when in the operational state.

Factory reset

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --factw

⚠️ This will erase any log files and restore all configuration files back to their default (params) and any prepass data is also erased from the device.

Note that the following parameters shall be unaffected by a factory reset:

  • DEVICE_MODEL
  • ARGOS_DECID
  • ARGOS_HEXID
  • Calibration data shall be preserved across factory resets

Reset the counters

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --rstvw {counter}

where the counter can be one of tx_counter, rx_counter or rx_time.

Reset the hardware

Run the command pylinkit --device xx:xx:xx:xx:xx:xx --rstbw

AssistNow offline

The u-blox AssistNow offline feature allows up to 5 weeks of Almanac data to be stored and retrieved in order to speed up GNSS acquisitions. This is especially useful in situations where the ephemeris information is stale (e.g., more than 45 minutes since the last fix).

To use this feature, firstly the AssistNow Autonomous mode must be disabled by setting GNSS_ASSISTNOW_EN to 0. Then enable AssistNow Offline by setting GNSS_ASSISTNOW_OFFLINE_EN 1.

Finally upload an mgaoffline.ubx Almanac file using pylinkit as follows:

pylinkit --device xx:xx:xx:xx:xx:xx --ano mgaoffline.ubx

ℹ️ Note that the almanac data is stored on the main filesystem and therefore does not require a u-blox chip with its own flash memory. The almanac file is only used after the initial GNSS acquisition i.e., when the RTC has been set. This is because it is necessary to first know the current time (UTC) in order to determine which almanac data should be sent to the u-blox device

GUI

This feature is provisional and under development but supports some basic features: pylinkit --gui

Fault conditions

The firmware handles fault conditions as follows:

Fault Type Mitigation Effect
Hard Fault Hard Fault Handler Soft reset.
Stack Corruption Stack Smashing Detector Soft reset.
Software or CPU Lock-up Watchdog Timer (WDT) After 10 minutes of inactivity, the WDT will reset the system if the software or CPU has frozen.

External LED output

An external LED output (refer to J7 connector function EXT_LED_GNSS) can be used as follows:

System State LED Notes
Power On (Boot Success) FLASHING 5 times Always irrespective of EXT_LED_MODE
Power Off RAPID FLASHING 10 times Always irrespective of EXT_LED_MODE
Operational GNSS Acquiring SOLID During the duration of the GNSS acquiring, in accordance with EXT_LED_MODE setting in the configuration
Operational GNSS Fix Off
Operational GNSS No Fix Off

External connector (J7) GPIO

The Horizon J7 expansion connector GPIO pins are assigned as follows:

Pin Name Direction Function Notes
EXT2_GPIO1 Output SAT_PWR_EN For use with Satellite expansion boards
EXT2_GPIO2 Output SAT_RST For use with Satellite expansion boards
EXT2_GPIO3 N/A N/A Spare
EXT2_GPIO4 Bi-directional SDA I2C bus #0
EXT2_GPIO5 Output SCLK I2C bus #0
EXT2_GPIO6 Output EXT_LED_GNSS GNSS status

Note that if the Artic Transceiver board is fitted to J7 then I2C bus #0 is disabled in software.