Giter VIP home page Giter VIP logo

mikaelnousiainen / rs41ng Goto Github PK

View Code? Open in Web Editor NEW
116.0 13.0 31.0 2.83 MB

Custom firmware for Vaisala RS41 and Graw DFM-17 radiosondes with support for amateur radio use. Ideal for tracking high-altitude balloons. Supported modes include APRS, Horus 4FSK mode, CATS, morse code (CW) and additional digital modes like WSPR and FT8 via Si5351.

License: GNU General Public License v2.0

CMake 0.17% C 91.81% C++ 7.98% Dockerfile 0.01% Shell 0.03%
4fsk amateur-radio aprs balloon gps gps-tracker high-altitude-balloon horus radio radiosonde

rs41ng's Introduction

RS41ng - Amateur radio firmware for Vaisala RS41 and Graw DFM-17 radiosondes

NEW: Experimental support for Graw DFM-17 radiosondes added! Please test and report any issues! Using a DFM-17 as a primary flight tracker is NOT recommended yet!

NOTE: DFM-17 radiosondes require a GPS lock (and clear visibility to the sky) to calibrate its internal oscillator. DFM-17 transmissions, especially APRS, may not decode correctly because of incorrect timing before the internal oscillator has been calibrated.

NOTE: While this firmware has been tested (on RS41) with great success on a number of high-altitude balloon flights, it is still a work in progress and some features might not work as expected yet! In particular, the time sync (scheduling) features and use of an external Si5351 as a transmitter need more testing.

What is RS41ng?

RS41ng is a custom, amateur radio-oriented firmware for Vaisala RS41 and Graw DFM-17 radiosondes. These radiosonde models have very similar hardware, so that it is relatively easy to support both with the same codebase. It is unlikely that RS41ng could support any other radiosonde hardware for now.

Some code is based on an earlier RS41 firmware project called RS41HUP, but most of it has been rewritten from scratch. The Horus 4FSK code has been adapted from the darksidelemm fork of RS41HUP.

Asking questions, filing feature requests and reporting issues

  • Please use GitHub discussions for asking questions and for sharing info about your radiosonde-based projects
    • For example, questions about firmware configuration and connecting of external chips to the sonde belong here
  • Please use GitHub issues to file new feature requests or issues that you have already identified with the firmware

What are radiosondes and how can I get one?

Radiosondes, especially the RS41 and DFM-17, are used extensively for atmospheric sounding by the meteorological institutes in various countries and thus easily available to be collected once they land, an activity called radiosonde hunting: see YouTube presentation about Tracking and Chasing Weather Balloons by Andreas Spiess or Chasing Radiosonde Weather Balloons used in Meteorology for Fun by Mark VK5QI for more details!

You can track radiosondes without any additional equipment either via SondeHub or radiosondy.info that both use an existing network of receiver stations. Alternatively, you can set up your own radiosonde receiver station.

For your own receiver station, you will need:

  1. A cheap software-defined radio USB dongle, such as an RTL-SDR
  2. An antenna suitable for receiving the 400 MHz radiosonde band transmissions. Antennas for the 70 cm amateur radio band usually work fine!
  3. Radiosonde tracker software: common choices are RS41 Tracker for Windows and radiosonde_auto_rx for Linux / Raspberry Pi.

What can I do with the RS41 and DFM-17 radiosondes?

The Vaisala RS41 and Graw DFM-17 radiosondes both use off-the-shelf 32-bit STM32F100-series microcontrollers, which can be reprogrammed using an ST-LINK v2 programmer or a smaller ST-LINK v2 USB dongle.

There is detailed information about the hardware of these radiosonde models on the following pages:

The radiosondes can be reprogrammed to transmit different kinds of RF modulations (morse code, APRS and different FSK modulations) on the 70 cm (~433 MHz) amateur radio band. The radiosonde contain Ublox GPS chips, so it can be used as a tracker device, e.g. for high-altitude balloons.

The RS41ng firmware is just one example of what can be achieved with the hardware of these radiosondes!

What are high-altitude balloon flights?

High-altitude balloon flights arranged by hobbyists are fun technical experiments. The flight goals are usually related to aerial photography, testing of radio tracker and transmitter hardware and different kinds of measurements with on-board sensors.

The following websites contain more information about planning and launching a high-altitude balloon flight:

Why does the RS41ng firmware exist?

The motivation to develop this firmware is to provide a clean, customizable and modular codebase for developing radiosonde-based experiments.

See the feature list below.

Features

The main features the RS41ng firmware are:

  • Support for multiple transmission modes:
    • Standard 1200-baud APRS
      • Option to transmit APRS weather reports using readings from an external BMP280/BME280 sensor (only RS41 supports custom sensors)
    • Horus 4FSK v1 and v2 modes that has improved performance compared to APRS or RTTY
      • There is an option to use continuous transmit mode (for either V1 or V2 mode), which helps with receiver frequency synchronization and improves reception.
      • In order to use Horus 4FSK mode on a flight, you will need to request a new Horus 4FSK payload ID in GitHub according to the instructions at: https://github.com/projecthorus/horusdemodlib/wiki#how-do-i-transmit-it
    • Morse code (CW)
    • "Pip" mode, which transmits a short beep generated using CW to indicate presence of the transmitter
    • RS41 only: JT65/JT9/JT4/FT8/WSPR/FSQ digital modes on HF/VHF amateur radio bands using an external Si5351 clock generator connected to the external I²C bus
  • Support for transmitting multiple modes consecutively with custom, rotating comment messages (see config.c)
  • Support for GPS-based scheduling is available for transmission modes that require specific timing for transmissions
  • Enhanced support for the internal Si4032 radio transmitter via PWM-based tone generation
  • Extensibility to allow easy addition of new transmission modes and new sensors

Features available on RS41 hardware only:

  • Support for custom sensors via the external I²C bus
  • Support for counting pulses on expansion header pin 2 (I2C2_SDA (PB11) / UART3 RX) for use with sensors like Geiger counters
  • GPS NMEA data output via the external serial port pin 3 (see below). This disables use of I²C devices as the serial port pins are shared with the I²C bus pins.
    • This allows using the RS41 sonde GPS data in external tracker hardware, such as Raspberry Pi or other microcontrollers.

Notes for DFM-17:

  • DFM-17 radiosondes require a GPS lock (and clear visibility to the sky) to calibrate its internal oscillator. This is necessary, because the internal oscillator is not particularly accurate. DFM-17 transmissions, especially APRS, may not decode correctly because of incorrect timing before the internal oscillator has been calibrated.
    • The RS41 radiosonde hardware uses an external oscillator, which is more stable, so RS41 does not suffer from the same issue.

Transmission modes

On the internal Si4032 (RS41) and Si4063 (DFM-17) transmitters:

  • APRS (1200 baud)
  • Horus 4FSK v1 and v2 (100 baud)
  • Morse code (CW)
  • "Pip" - a short beep to indicate presence of the transmitter

On an external Si5351 clock generator connected to the external I²C bus of the RS41 radiosonde:

  • Horus 4FSK v1 and v2 (50 baud, because the Si5351 frequency changes are slow)
  • JT65/JT9/JT4/FT8/WSPR/FSQ mode beacon transmissions using the JTEncode library. I've decoded FT8, WSPR and FSQ modes successfully.
    • GPS-based scheduling is available for modes that require specific timing for transmissions
  • Morse code (CW)
  • "Pip"

Notes about APRS

  • Bell 202 frequencies are generated via hardware PWM, but the symbol timing is created in a loop with delay
  • There is also code available to use DMA transfers for symbol timing to achieve greater accuracy, but the timings are not working correctly

Notes about Horus 4FSK

Notes about CATS (DFM-17 only)

  • CATS is a modern packet radio standard designed for communication and telemetry. Due to its increased efficiency over APRS, it allows for fast beacon times (1 Hz or more) without congesting the network.
  • To receive CATS, you can either use an I-Gate board on a Raspberry Pi, or just a standard RTL-SDR dongle.
    • See here for the I-Gate board software.
    • See here for the SDR software.
  • In either case, CATS packets that are received get forwarded to FELINET, and relayed to APRS-IS. This means your CATS packets will show up on aprs.fi
    • If you're relying on APRS gating, be sure to set an SSID below 100 or the APRS network may reject it.
  • For more information, be sure to check the standard.

External sensors (RS41 only)

It is possible to connect external sensors to the I²C bus of the RS41 radiosonde.

The following sensors are currently supported:

Sensor driver code contributions are welcome!

Planned features

  • Configurable transmission frequencies and schedules based on location / altitude
  • Support for more I²C sensors
  • RTTY on both Si4032/Si4063 (70 cm, non-standard shift) and Si5351 (HF + 2m) with configurable shift
  • Investigate possibility to implement 1200 bps Bell 202 modulation (and possibly also 300 bps Bell 103 modulation) for APRS using Si5351, this requires special handling to make Si5351 change frequency quickly

Configuring the firmware

  1. Configure your amateur radio call sign, transmission schedule (time sync), transmit frequencies and transmission mode parameters in config.h
    • Select the desired radiosonde type in the beginning of the file by removing the // comment from either the #define RS41 or #define DFM17 lines.
    • Customize at least the following settings:
      • CALLSIGN
      • For RS41, the settings beginning with RADIO_SI4032_ to select transmit power and the modes to transmit
      • For DFM-17, the settings beginning with RADIO_SI4063_ to select transmit power and the modes to transmit
      • HORUS_V2_PAYLOAD_ID if you transmit Horus 4FSK
      • APRS_COMMENT if you transmit APRS
  2. Set up transmitted message templates in config.c, depending on the modes you use. You can customize the APRS and CW messages in more detail here.

Power consumption and power-saving features

Power consumption notes (at 3V supply voltage) for RS41 by Mark VK5QI:

  • GPS in full power acquisition mode: 110-120 mA (TX off), 160-170 mA (TX on)
  • GPS locked (5 sats), full power: 96 - 126 mA (TX off), 170 mA (TX on)
  • GPS locked, powersave mode, state 1: ~96 - 110 mA (TX off), ?
  • GPS locked, powersave mode, state 2: 60 - 90mA (TX off), 130 mA (TX on)

The variations seem to be the GPS powering up every second to do its fixes.

Time sync settings

The time sync feature is a simple way to activate the transmissions every N seconds, delayed by the TIME_SYNC_OFFSET_SECONDS setting.

Please note that the time sync requires a stable GPS signal (good visibility to the sky) to work correctly!

Time-slotted modes

For time-slotted modes like FT8 and WSPR, there default configuration file (config.h) already contains useful defaults.

FT8 example

The default FT8 configuration is:

#define FT8_TIME_SYNC_SECONDS 15
#define FT8_TIME_SYNC_OFFSET_SECONDS 1

The above means that transmissions should start every 15 seconds (counting from the beginning of each hour), but delayed by 1 second. As an example, transmissions after 12:00:00 (hh:mm:ss) would happen at 12:00:01, 12:00:16, 12:00:31; 12:00:46, 12:01:01 and so on.

The offset of 1 second is just to make sure the transmission starts strictly after the 15-second periods and never before.

If the offset was 5 seconds, transmissions would happen at 12:00:05, 12:00:20, 12:00:35, 12:00:50 and 12:01:05.

In order to transmit only in even or odd time slots of FT8, you could use:

// Transmit every 30 seconds, even time slot
#define FT8_TIME_SYNC_SECONDS 30
#define FT8_TIME_SYNC_OFFSET_SECONDS 1
// Transmit every 30 seconds, odd time slot
#define FT8_TIME_SYNC_SECONDS 30
#define FT8_TIME_SYNC_OFFSET_SECONDS 16

The latter (odd time slot) example would transmit at 12:00:16, 12:00:46, 12:01:16, 12:01:46 and so on.

WSPR example

For WSPR, the transmissions happen every 120 seconds, so the configuration has to be:

#define WSPR_TIME_SYNC_SECONDS 120
#define WSPR_TIME_SYNC_OFFSET_SECONDS 1

The above means that transmissions should start every 120 seconds (counting from the beginning of each hour), but delayed by 1 second. As an example, transmissions after 12:00:00 (hh:mm:ss) would happen at 12:00:01, 12:02:01, 12:04:01 and so on.

The offset of 1 second is just to make sure the transmission starts strictly after the 120-second periods and never before.

Manually configuring time slots for multiple payloads transmitting at different times

Sometimes it is necessary to set transmission time slots when using multiple payloads/transmitters on the same frequency. The time slots guarantee that the transmissions from different payloads will not happen simultaneously.

The time sync settings can be used to configure this type of time slots.

In this example, we configure 3 payloads to transmit every 120 seconds, so that each payload is scheduled to transmit evenly across the 120-second period, every 40 seconds (120 / 3 = 40).

First, the TIME_SYNC_SECONDS setting of the particular mode has to be set to the full interval where all payloads are expected to have their transmissions finished. This setting has to be the same for every payload. Do also remember to take into account transmission length too (depending on the mode).

Next, the TIME_SYNC_OFFSET_SECONDS needs to be set independently for each payload. The first payload would have an offset of 0, the second an offset of 40 and the third and offset of 80.

As an example, transmissions after 12:00:00 (hh:mm:ss) would happen at:

  • Payload 1: 12:00:00
  • Payload 2: 12:00:40
  • Payload 3: 12:01:20
  • Payload 1: 12:02:00
  • Payload 2: 12:02:40
  • Payload 3: 12:03:20
  • ...

The configuration with 3 payloads using Horus 4FSK V2 mode would be the following.

Payload 1:

#define HORUS_V2_TIME_SYNC_SECONDS 120 // everything happens at 120 seconds interval
#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 0 // the first payload will transmit at 0 seconds within the 120 second interval

Payload 2:

#define HORUS_V2_TIME_SYNC_SECONDS 120 // everything happens at 120 seconds interval
#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 40 // the second payload will transmit at 40 seconds within the 120 second interval

Payload 3:

#define HORUS_V2_TIME_SYNC_SECONDS 120 // everything happens at 120 seconds interval
#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 80 // the third payload will transmit at 80 seconds within the 120 second interval

Building the firmware

The easiest and the recommended method to build the firmware is using Docker.

If you have a Linux environment -- Windows Subsystem for Linux (WSL) or macOS might work too -- and you feel adventurous, you can try to build using the Linux-based instructions.

Building the firmware with Docker

Using Docker to build the firmware is usually the easiest option, because it provides a stable Fedora Linux-based build environment on any platform. It should work on Windows and Mac operating systems too.

The Docker environment can also help address issues with the build process.

  1. Install Docker if not already installed
  2. Set the current directory to the RS41ng source directory
  3. Build the RS41ng compiler Docker image using the following command. It is necessary to build the Docker image only once.
    docker build -t rs41ng_compiler .
    
  4. Build the firmware using the following command. If you need to rebuild the firmware, simply run the command again. On Linux/macOS, run:
    docker run --rm -it -v $(pwd):/usr/local/src/RS41ng rs41ng_compiler
    
    On Windows, run:
    docker run --rm -it -v %cd%:/usr/local/src/RS41ng rs41ng_compiler
    
  5. The firmware will be stored in file build/src/RS41ng.elf

Now you can flash the firmware using instructions below (skip the build instructions for Linux).

Building the firmware in a Linux environment

Software requirements:

  • GNU GCC toolchain for cross-compiling the firmware for the ARM Cortex-M3 architecture (arm-none-eabi-gcc)
    • Pick the latest toolchain version available for your operating system.
  • CMake version 3.6 or higher for building the firmware
  • OpenOCD version 0.10.0 or higher for flashing the firmware

On a Red Hat/Fedora Linux installation, the following packages can be installed:

dnf install arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++ arm-none-eabi-binutils-cs arm-none-eabi-newlib cmake openocd

Steps to build the firmware on Linux

  1. Install the required software dependencies listed above
  2. Build the firmware using the following commands
    mkdir build
    cd build
    cmake ..
    make
    
  3. The firmware will be stored in file build/src/RS41ng.elf

Prepare the radiosonde for flashing the firmware

Hardware requirements:

Follow the instructions below for the radiosonde model you have.

Vaisala RS41 programming connector

The pinout of the RS41 programming connector (by DF8OE and VK5QI) is the following:

______________________|           |______________________
|                                                       |
|   9           7           5           3           1   |
|                                                       |
|   10          8           6           4           2   |
|_______________________________________________________|

(View from the bottom of the sonde, pay attention to the gap in the connector)
  • 1 - GND
  • 2 - I2C2_SDA (PB11) / UART3 RX
    • This is the external I²C port data pin for Si5351 and sensors
    • This pin can be used as input for the pulse counter.
  • 3 - I2C2_SCL (PB10) / UART3 TX
    • This is the external I²C port clock pin for Si5351 and sensors
    • This pin can alternatively be used to output GPS NMEA data to external tracker hardware (e.g. Raspberry Pi or other microcontrollers)
  • 4 - +VDD_MCU / PB1 * (10k + cap + 10k)
  • 5 - MCU switched 3.3V out to external device / Vcc (Boost out) 5.0V
    • This pin powers the device via 3.3V voltage from an ST-LINK programmer dongle
    • This pin can be used to supply power to external devices, e.g. Si5351, BMP280 or other sensors
  • 6 - +U_Battery / VBAT 3.3V
  • 7 - RST
  • 8 - SWCLK (PA14)
  • 9 - SWDIO (PA13)
  • 10 - GND

Connect the RS41 radiosonde to the programmer

  1. If your ST-LINK v2 programmer is capable of providing a voltage of 3.3V (as some third-party clones are), remove the batteries from the sonde. Otherwise, leave the batteries in and power on the sonde.
  2. Connect an ST-LINK v2 programmer dongle to the sonde via the following pins:
    • SWDIO -> Pin 9 (SWDIO)
    • SWCLK -> Pin 8 (SWCLK)
    • GND -> Pin 1 (GND)
    • 3.3V -> Pin 5 (MCU switch 3.3V) (only required when using the programmer to power the sonde)

Graw DFM-17 programming connector

The DFM-17 programming connector is an unpopulated group of pads on the circuit board between the sensor boom connector and the main STM32 microcontroller.

The pinout of the DFM-17 programming connector is the following:

_____
|   |
| S |       _____________________
| e |       |                   |
| n |       |   1           2   |
| s |       |                   |
| o |       |   3           4   |             ________________________
| r |       |                   |             |
|   |       |   5           6   |             | STM32 microcontroller
| b |       |                   |             |
| o |       |   7           8   |             |
| o |       |                   |             |
| m |       |   9          10   |             |
|   |       |                   |             |
|   |       |____________________             |
|   |
|___|

(The sensor boom connector is on the left and the main microcontroller unit on the right side)
  • 1 - VTRef
    • This pin powers the device via 3.3V voltage from an ST-LINK programmer dongle
  • 2 - SWDIO / TMS
  • 3 - GND
  • 4 - SWCLK / TCK
  • 5 - GND
  • 6 - SWO EXT TRACECTL / TDO
  • 7 - KEY
  • 8 - NC EXT / TDI
  • 9 - GNDDetect
  • 10 - nRESET

Connect the DFM-17 radiosonde to the programmer

  1. Since the DFM-17 programming connector is just an unpopulated group of pads on the circuit board, you will need to either solder wires directly to the pads or alternatively solder a 0.05" (1.27mm) 5-by-2 pin header to the pads. There are suitable ribbon cables with 5x2 0.05" connectors available for this type of pin header.
  2. Connect an ST-LINK v2 programmer dongle to the sonde via the following pins:
    • SWDIO -> Pin 2 (SWDIO)
    • SWCLK -> Pin 4 (SWCLK)
    • RST -> Pin 10 (RST)
    • GND -> Pin 5 (GND)
    • 3.3V -> Pin 1 (VTRef) (only required when using the programmer to power the sonde)
  3. If your ST-LINK v2 programmer is capable of providing a voltage of 3.3V (as some third-party clones are), remove the batteries from the sonde. Otherwise, leave the batteries in and power on the sonde.

Flashing the radiosonde with the firmware (both RS41 and DFM-17)

  1. Unlock the flash protection - needed only before reprogramming the sonde for the first time
    • openocd -f ./openocd_rs41.cfg -c "init; halt; flash protect 0 0 63 off; exit"
    • NOTE: If the above command fails with an error about erasing sectors, try replacing the number 63 with either 31 or the number the error message suggests:
      • openocd -f ./openocd_rs41.cfg -c "init; halt; flash protect 0 0 31 off; exit"
  2. Flash the firmware
    • openocd -f ./openocd_rs41.cfg -c "program build/src/RS41ng.elf verify reset exit"
  3. Power cycle the sonde to start running the new firmware

Developing / debugging the firmware

It is possible to receive log messages from the firmware program and to perform debugging of the firmware using GNU GDB.

Also, please note that Red Hat/Fedora do not provide GDB for ARM architectures, so you will need to manually download and install GDB from ARM GNU GCC toolchain. Pick the latest version available for your operating system.

Semihosting allows the firmware to send log messages via special system calls to OpenOCD, so that you can get real-time feedback and debug output from the application.

Semihosting has to be disabled when the RS41 radiosonde is not connected to the STM32 programmer dongle, otherwise the firmware will not run.

Steps to start firmware debugging and semihosting

  1. Connect the RS41 radiosonde to a computer via the STM32 ST-LINK programmer dongle
  2. Enable semihosting and logging in config.h by uncommenting the following lines
    #define SEMIHOSTING_ENABLE
    #define LOGGING_ENABLE
    
  3. Start OpenOCD and leave it running in the background
    openocd -f ./openocd_rs41.cfg
    
  4. Start ARM GDB
    arm-none-eabi-gdb
    
  5. Connect GDB to OpenOCD for flashing and debugging (assumes you are in the build directory with Makefiles from CMake ready for build)
    target remote localhost:3333
    monitor arm semihosting enable
    make
    load src/RS41ng.elf
    monitor reset halt
    continue # this command runs the firmware
    
  6. OpenOCD will output log messages from the firmware and GDB can be used to interrupt and inspect the firmware program.

To load debugging symbols for settings breakpoints and to perform more detailed inspection, use command file src/RS41ng.elf.

Si4032 Bell FSK modulation hack for APRS

Notes by Mikael OH3BHX:

The idea behind the APRS / Bell 202 modulation implementation is based on RS41HUP project and its "ancestors" and I'm describing it here, since it has not been documented elsewhere.

The Si4032 chip seems to support only a very specific type of FSK, where one can define two frequencies (on a 625 Hz granularity) that can be toggled by a register change. Because of the granularity, this mechanism cannot be directly used to generate Bell 202 tones.

The way Bell 202 AFSK is implemented for Si4032 is kind of a hack, where the code toggles these two frequencies at a rate of 1200 and 2200 Hz, which produces the two Bell 202 tones even though the actual frequencies are something else.

Additionally, the timing of 1200/2200 Hz was done in RS41HUP by using experimentally determined delays and by disabling all interrupts, so they won't interfere with the timings.

I have attempted to implement Bell 202 frequency generation using hardware DMA and PWM, but have failed to generate correct symbol rate that other APRS equipment are able to decode. I have tried to decode the DMA-based modulation with some tools intended for debugging APRS and while some bytes are decoded correctly every once in a while, the timings are mostly off for some unknown reason.

Currently, the Bell 202 modulation implementation uses hardware PWM to generate the individual tone frequencies, but the symbol timing is created in a loop with delay that was chosen carefully via experiments.

Debugging APRS

Here are some tools and command-line examples to receive and debug APRS messages using an SDR receiver. There are examples for using both rx_tools and rtl-sdr tools to interface with the SDR receiver. The example commands assume you are using an RTL-SDR dongle, but rx_fm (from rx_tools) supports other types of devices too, as it's based on SoapySDR.

Dire Wolf

Dire Wolf can decode APRS (and lots of other digital modes) from audio streams.

rx_tools:

rx_fm -f 432500000 -M fm -s 250000 -r 48000 -g 22 -d driver=rtlsdr - | direwolf -n 1 -D 1 -r 48000 -b 16 -

rtl-sdr:

rtl_fm -f 432500000 -M fm -s 250k -r 48000 -g 22 - | direwolf -n 1 -D 1 -r 48000 -b 16 -

SigPlay

SigPlay is a set of tools for DSP and signal processing. SigPlay also includes a command-line tool to decode and print out raw data from Bell 202 encoding, which is really useful, as it allows you to see the bytes that actually get transmitted -- even if the packet is not a valid APRS packet!

rx_tools:

rx_fm -f 432500000 -M fm -s 250000 -r 48000 -g 22 -d driver=rtlsdr - | ./aprs -

rtl-sdr:

rtl_fm -f 432500000 -M fm -s 250k -r 48000 -g 22 - | ./aprs -

Authors

Additional documentation

Vaisala RS41 hardware documentation

Vaisala RS41 hardware datasheets

Graw DFM-17 hardware documentation

Graw DFM-17 hardware datasheets

Alternative RS41 firmware projects (only for RS41!)

rs41ng's People

Contributors

argilo avatar kd2eat avatar manodasilva avatar mikaelnousiainen avatar mrarm avatar penfold42 avatar rpratt20 avatar scd31 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rs41ng's Issues

Mod RS41ng Firmware for Serial Port Configuration

Request to mod the RS41ng firmware to use the serial port on the RS41 and DFM17 to set and permanently save the operating parameters (Callsign, Mode, Rate, Freq.) instead of having to use a config file and then have to rebuild the firmware and re-flash the unit. If so, it would make the re-purposing of these units much simpler for people who are not computer programming experts since they could easily use a windows computer to flash the supplied .bin or .hex file into the re-purposed unit and then use Putty to connect to the serial port to set the config without having to know how to build the firmware. Thanks, Joe WJ2B

APRS

Hi. What part of the program should be modified so that in APRS.FI when I click on the probe, show the temperature, humidity and pressure on the balloon that appears on the station? He currently does not show me anything. Figure as LW7EEA-13

out of ram and rom

Hi, even with reducing / removing the APRS comments I can not find a setting which allows 4fsk on the RS41 radiochip and wspr on the SI5351 radiochip.

Still running 156 rom short and 32 ram short.

Is there any way to reduce the memory used to get this combination working ?

Thanks,
Ben

Power OFF Function Not Working for both RS41 and DFM17

When the #define ALLOW_POWER_OFF field in the config.h file is set to "true", the power OFF function is not working in both the RS41 and DFM17. I have held down the Power Button while the sonde is not transmitting but the sonde does not turn off. Only way to power OFF is to remove the batteries. Thanks, Joe WJ2B

Change default transmit power and add comments

From VK5QI:

Might be worth changing the default SI4032 transmit power in the RS41ng config...

The default of 7 (20 dBm) results in considerably reduced battery life (~12 hours)

25mW is more than enough

Maybe add in a comment that if being used purely for APRS to increase the power, but for horus binary 25mW is more than enough.

Callsign specified isn't transmitted with Horus V2

Hi!

First of all, I'd like to thank you for all the hard work! I've been playing around with your code, and we plan to use it with a ham weather balloon we're launching next month :)

I'm currently having issues with the Horus V2 mode: no matter what callsign I specify in config.h, my RS-41 always transmits 4FSKTEST-V2 as payload ID. I've looked everywhere in the source files, but I cant' seem to find where it should be specified...

Cheers,
Manoel

Will not decode on Kenwood TM-D710

I can get my FT-2DR to decode packets from the RS41ng, but not my Kenwood TM-D710. It was speculated that there could be a pre-emphasis/de-emphasis issue and could explain why one receiver works, while the other does not.

Has pre/de-emphasis been accounted for?

Building docker compiler

I am building on an old Dell 64 bit running Ubuntu 20.04 Jammy jellyfish. Have attemped 2 times with errors :

randy@randy-Inspiron-N4010:~/RS41ng-main$ docker build -t rs41ng_compiler .
[+] Building 2775.4s (5/8) docker:default
[+] Building 3055.4s (6/8) docker:default
=> [internal] load build definition from Dockerfile 1.9s
=> => transferring dockerfile: 312B 0.4s
=> [internal] load .dockerignore 1.6s
=> => transferring context: 2B 0.1s
=> [internal] load metadata for docker.io/library/fedora:36 3.2s
=> [1/4] FROM docker.io/library/fedora:36@sha256:64cd00a0e2b92d527c0a 1112.2s
=> => resolve docker.io/library/fedora:36@sha256:64cd00a0e2b92d527c0a095 0.4s
=> => sha256:64cd00a0e2b92d527c0a0954162a73e85f160e3a53c3832 975B / 975B 0.0s
=> => sha256:c3928ce4e65d6d1e66fc1e2c9b1cc163d31bc63a96117d9 529B / 529B 0.0s
=> => sha256:1d81a0524f7d02b7673be0eb1201ab507468b736188 1.99kB / 1.99kB 0.0s
=> => sha256:c7bef7d09442a4c4deef8e8120027e7fa3f163 60.07MB / 60.07MB 1104.5s
=> => extracting sha256:c7bef7d09442a4c4deef8e8120027e7fa3f163c7b5a0afed 4.8s
=> [internal] load build context 0.9s
=> => transferring context: 634B 0.0s
=> ERROR [2/4] RUN dnf install -y gcc-c++ arm-none-eabi-gcc- 1935.6s

[2/4] RUN dnf install -y gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++ arm-none-eabi-binutils-cs arm-none-eabi-newlib cmake:
1833.1 Fedora 36 - x86_64 47 kB/s | 83 MB 30:19
1884.1 Fedora 36 openh264 (From Cisco) - x86_64 1.2 kB/s | 2.5 kB 00:02
1934.7 Fedora Modular 36 - x86_64 0.0 B/s | 0 B 00:49
1934.7 Errors during downloading metadata for repository 'fedora-modular':
1934.7 - Status code: 404 for https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/36/Modular/x86_64/os/repodata/repomd.xml (IP: 18.160.94.44)
1934.7 - Status code: 404 for http://dl.fedoraproject.org/pub/fedora/linux/releases/36/Modular/x86_64/os/repodata/repomd.xml (IP: 38.145.60.24)
1934.7 - Status code: 404 for https://dl.fedoraproject.org/pub/fedora/linux/releases/36/Modular/x86_64/os/repodata/repomd.xml (IP: 38.145.60.24)
1934.7 - Status code: 404 for http://mirror.rnet.missouri.edu/fedora/linux/releases/36/Modular/x86_64/os/repodata/repomd.xml (IP: 128.206.116.77)
1934.7 - Curl error (28): Timeout was reached for http://ftp.tudelft.nl/download.fedora.redhat.com/linux/releases/36/Modular/x86_64/os/repodata/repomd.xml [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
1934.8 Error: Failed to download metadata for repo 'fedora-modular': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried


Dockerfile:3

2 |
3 | >>> RUN dnf install -y
4 | >>> gcc-c++
5 | >>> arm-none-eabi-gcc-cs
6 | >>> arm-none-eabi-gcc-cs-c++
7 | >>> arm-none-eabi-binutils-cs
8 | >>> arm-none-eabi-newlib
9 | >>> cmake
10 |

ERROR: failed to solve: process "/bin/sh -c dnf install -y gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++ arm-none-eabi-binutils-cs arm-none-eabi-newlib cmake" did not complete successfully: exit code: 1

What do I try?

Thank you.
Randy

compilation fails even with libbsd-dev installed on ubuntu jammy

I am finding that compilation fails even with libbsd-dev installed on ubuntu jammy
Issue is with the strlcpy vs strncpy

-- The C compiler identification is GNU 11.3.0
-- The CXX compiler identification is GNU 11.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mitch/RS41ng/build
[ 1%] Building C object src/CMakeFiles/RS41ng.elf.dir/bmp280_handler.c.o
[ 2%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs.c.o
[ 3%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_position.c.o
[ 4%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_weather.c.o
[ 5%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/ax25/ax25.c.o
[ 6%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/bell/bell.c.o
[ 8%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_common.c.o
[ 9%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_l2.c.o
[ 10%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v1.c.o
[ 11%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v2.c.o
[ 12%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/crc14.c.o
[ 13%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/mfsk/mfsk.c.o
[ 14%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/morse/morse.c.o
[ 16%] Building C object src/CMakeFiles/RS41ng.elf.dir/config.c.o
[ 17%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/bmp280/bmp280.c.o
[ 18%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/pulse_counter/pulse_counter.c.o
[ 19%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/si4032/si4032.c.o
[ 20%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/ubxg6010/ubxg6010.c.o
[ 21%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/startup/startup_stm32f10x_md_vl.c.o
[ 22%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/system_stm32f10x.c.o
[ 24%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/datatimer.c.o
[ 25%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/delay.c.o
[ 26%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/i2c.c.o
[ 27%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/pwm.c.o
[ 28%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/spi.c.o
[ 29%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/misc.c.o
[ 31%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_adc.c.o
[ 32%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_dma.c.o
[ 33%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_exti.c.o
[ 34%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_flash.c.o
[ 35%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_gpio.c.o
[ 36%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_i2c.c.o
[ 37%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_pwr.c.o
[ 39%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_rcc.c.o
[ 40%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_spi.c.o
[ 41%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_tim.c.o
[ 42%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_usart.c.o
[ 43%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/system.c.o
[ 44%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_ext.c.o
[ 45%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_gps.c.o
[ 47%] Building C object src/CMakeFiles/RS41ng.elf.dir/locator.c.o
[ 48%] Building C object src/CMakeFiles/RS41ng.elf.dir/log.c.o
[ 49%] Building C object src/CMakeFiles/RS41ng.elf.dir/main.c.o
[ 50%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio.c.o
[ 51%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_position.c.o
[ 52%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_weather.c.o
[ 54%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_cw.c.o
[ 55%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_fsq.c.o
[ 56%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v1.c.o
[ 57%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v2.c.o
[ 58%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_jtencode.c.o
[ 59%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_wspr.c.o
[ 60%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si4032.c.o
[ 62%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si5351.c.o
[ 63%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/semihosting.c.o
[ 64%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/syscalls.c.o
[ 65%] Building C object src/CMakeFiles/RS41ng.elf.dir/telemetry.c.o
[ 66%] Building C object src/CMakeFiles/RS41ng.elf.dir/template.c.o
[ 67%] Building C object src/CMakeFiles/RS41ng.elf.dir/utils.c.o
[ 68%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/jtencode.cpp.o
[ 70%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/JTEncode.cpp.o
[ 71%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/encode_rs_int.cpp.o
[ 72%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/init_rs_int.cpp.o
/home/mitch/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)':
/home/mitch/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
33 | if(symsize < 0 || symsize > 8*sizeof(data_t)){
| ~~~~~~~~^~~~~~~~~~~~~~~~~~
[ 73%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351/si5351.cpp.o
[ 74%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351fast/si5351mcu.cpp.o
[ 75%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_handler.cpp.o
[ 77%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o
[ 78%] Linking CXX executable RS41ng.elf
Building /home/mitch/RS41ng/build/RS41ng.hex
Building /home/mitch/RS41ng/build/RS41ng.bin
text data bss dec hex filename
55340 1512 5152 62004 f234 RS41ng.elf
[ 78%] Built target RS41ng.elf
[ 79%] Building C object tests/CMakeFiles/RS41ng_top.dir/bell_test.c.o
/home/mitch/RS41ng/tests/bell_test.c: In function ‘main2’:
/home/mitch/RS41ng/tests/bell_test.c:16:34: warning: format argument 1 unused before used argument 4 in ‘$’-style format [-Wformat=]
16 | snprintf(test, sizeof(test), "%3$s %4$s %2$s\n", "1fd", gg, "3aa", "4ab");
| ^~~~~~~~~~~~~~~~~~
In file included from /home/mitch/RS41ng/src/gps.h:6,
from /home/mitch/RS41ng/src/codecs/aprs/aprs_position.h:7,
from /home/mitch/RS41ng/tests/bell_test.c:5:
/home/mitch/RS41ng/src/config.h:189:22: warning: too many arguments for format [-Wformat-extra-args]
189 | #define APRS_COMMENT "RS41ng radiosonde firmware test"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/mitch/RS41ng/src/config.h:189:22: note: in definition of macro ‘APRS_COMMENT’
189 | #define APRS_COMMENT "RS41ng radiosonde firmware test"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[ 80%] Building C object tests/CMakeFiles/RS41ng_top.dir/morse_test.c.o
[ 81%] Building C object tests/CMakeFiles/RS41ng_top.dir/template_test.c.o
[ 82%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/aprs/aprs.c.o
[ 83%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/aprs/aprs_position.c.o
[ 85%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/aprs/aprs_weather.c.o
[ 86%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/ax25/ax25.c.o
[ 87%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/bell/bell.c.o
[ 88%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/horus/horus_common.c.o
[ 89%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/horus/horus_l2.c.o
[ 90%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/horus/horus_packet_v1.c.o
[ 91%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/horus/horus_packet_v2.c.o
[ 93%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/jtencode/lib/crc14.c.o
[ 94%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/codecs/mfsk/mfsk.c.o
[ 95%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/codecs/morse/morse.c.o
[ 96%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/config.c.o
[ 97%] Building C object tests/CMakeFiles/RS41ng_top.dir/
/src/template.c.o
/home/mitch/RS41ng/src/template.c: In function ‘template_replace’:
/home/mitch/RS41ng/src/template.c:16:5: warning: implicit declaration of function ‘strlcpy’; did you mean ‘strncpy’? [-Wimplicit-function-declaration]
16 | strlcpy(replacement, CALLSIGN, sizeof(replacement));
| ^~~~~~~
| strncpy
[ 98%] Building C object tests/CMakeFiles/RS41ng_top.dir//src/utils.c.o
[100%] Linking C executable RS41ng_top
/usr/bin/ld: CMakeFiles/RS41ng_top.dir/template_test.c.o: in function main': template_test.c:(.text+0x7b): undefined reference to strlcpy'
/usr/bin/ld: CMakeFiles/RS41ng_top.dir/
/src/template.c.o: in function template_replace': template.c:(.text+0x68): undefined reference to strlcpy'
/usr/bin/ld: template.c:(.text+0x84): undefined reference to strlcpy' /usr/bin/ld: template.c:(.text+0xc7): undefined reference to strlcpy'
/usr/bin/ld: template.c:(.text+0xe3): undefined reference to strlcpy' /usr/bin/ld: CMakeFiles/RS41ng_top.dir/__/src/template.c.o:template.c:(.text+0x126): more undefined references to strlcpy' follow
collect2: error: ld returned 1 exit status
make[2]: *** [tests/CMakeFiles/RS41ng_top.dir/build.make:369: tests/RS41ng_top] Error 1
make[1]: *** [CMakeFiles/Makefile2:169: tests/CMakeFiles/RS41ng_top.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

config.h should have APRSCALLSIGN in quotes ?

Hi, I found out that #define APRS_CALLSIGN PE2BZ does not work, it actually requires "PE2BZ" which might be obvious for most of us, but took me some "debugging" (reading the error message)

Add flash instructions for genuine ST-Link/V2 Flasher

I ran into some issues today trying to flash a RS41 with a genuine ST-Link/V2 programmer instead of the 3rd-party clones I have used before. When trying to flash using openOCD i got the following errors:

Error: target voltage may be too low for reliable debugging
Error: init mode failed (unable to connect to the target)

I found conflicting information online, about whether or not to connect the voltage supply pin (MCU switch 3.3V/Pin5) to the programmer, so I chose not to connect it. After connecting this pin I had no further issues.

As far as I understand (please correct me if I'm wrong) the corresponding pin on the ST-Links 20-pin header (MCU_VDD/Pin1 and Pin2) does not power the Radiosonde (so batteries or another power supply is still needed for flashing) but is needed to "ensure signal compatibility between the boards" (see User Manual Page 12). I don't know if this was obvious to other people, but it took me some time to figure out.
Maybe consider adding this info to the README (for example like below)?
Also might be a good idea to try to reproduce this issue, as I don't know if my programmer is behaving nominally.

Best regards.


Connect the RS41 radiosonde to the programmer

With 3rd Party ST-LINK Dongle:
  1. If your ST-LINK v2 programmer is capable of providing a voltage of 3.3V (as some third-party clones are),
    remove the batteries from the sonde. Otherwise, leave the batteries in and power on the sonde.
  2. Connect an ST-LINK v2 programmer dongle to the sonde via the following pins:
    • SWDIO -> Pin 9 (SWDIO)
    • SWCLK -> Pin 8 (SWCLK)
    • GND -> Pin 1 (GND)
    • 3.3V -> Pin 5 (MCU switch 3.3V) (only required when using the programmer to power the sonde)
With genuine ST-LINK Dongle:
  1. The programmer is not able to provide the sonde with power so you will need to leave the batteries in/provide another power source.
  2. Connect the Radiosonde to the 20-pin Connector of the programmer.
    • SWDIO -> Pin 9 (SWDIO)
    • SWCLK -> Pin 8 (SWCLK)
    • GND -> Pin 1 (GND)
    • MCU_VDD -> Pin 5 (MCU switch 3.3V) (only required when using the programmer to power the sonde)

ax25.c compile error

The last modification to the file src/codecs/ax25.c is broken.
Line 92 has a missing open parentheses (and a useless final semicolon):

header->destination_ssid = (uint8_t) destination_ssid >= 'A' ? destination_ssid - 7 : destination_ssid);;

and should be (probably) corrected to:

header->destination_ssid = (uint8_t)(destination_ssid >= 'A' ? destination_ssid - 7 : destination_ssid);

Warning during compilation

During compilation i get this error

In file included from /usr/local/src/RS41ng/src/telemetry.h:7, from /usr/local/src/RS41ng/src/codecs/horus/horus_packet_v1.h:6, from /usr/local/src/RS41ng/src/radio_payload_horus_v1.c:3: /usr/local/src/RS41ng/src/radio_payload_horus_v1.c: In function 'radio_horus_v1_encode': /usr/local/src/RS41ng/src/config.h:307:29: warning: unsigned conversion from 'int' to 'uint8_t' {aka 'unsigned char'} changes value from 'XXX' to '62' [-Woverflow] 307 | #define HORUS_V1_PAYLOAD_ID XXX

XXX Iis my Horus ID from Mark Jessop

However, when i flash the RS41, everything seems to be ok except i still have 4FSK-TEST V2 as payload.....

Erik

Errors building firmware @wsl in windows10

Hi!
Get this errors
root@DESKTOP-4VNP1BN:/RS41ng/build# cmake .. -- The C compiler identification is GNU 10.2.1 -- The CXX compiler identification is GNU 10.2.1 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /RS41ng/build root@DESKTOP-4VNP1BN:/RS41ng/build# make Scanning dependencies of target RS41ng.elf [ 1%] Building C object src/CMakeFiles/RS41ng.elf.dir/bmp280_handler.c.o [ 2%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs.c.o [ 3%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_position.c.o [ 4%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_weather.c.o [ 5%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/ax25/ax25.c.o [ 6%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/bell/bell.c.o [ 7%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_common.c.o [ 8%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_l2.c.o [ 10%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v1.c.o [ 11%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v2.c.o [ 12%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/crc14.c.o [ 13%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/mfsk/mfsk.c.o [ 14%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/morse/morse.c.o [ 15%] Building C object src/CMakeFiles/RS41ng.elf.dir/config.c.o [ 16%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/bmp280/bmp280.c.o [ 17%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/pulse_counter/pulse_counter.c.o [ 19%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/si4032/si4032.c.o [ 20%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/ubxg6010/ubxg6010.c.o [ 21%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/startup/startup_stm32f10x_md_vl.c.o [ 22%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/system_stm32f10x.c.o [ 23%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/datatimer.c.o [ 24%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/delay.c.o [ 25%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/i2c.c.o [ 26%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/pwm.c.o [ 28%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/spi.c.o [ 29%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/misc.c.o [ 30%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_adc.c.o [ 31%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_dma.c.o [ 32%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_exti.c.o [ 33%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_flash.c.o [ 34%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_gpio.c.o [ 35%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_i2c.c.o [ 37%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_pwr.c.o [ 38%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_rcc.c.o [ 39%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_spi.c.o [ 40%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_tim.c.o [ 41%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_usart.c.o [ 42%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/system.c.o [ 43%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_ext.c.o [ 44%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_gps.c.o [ 46%] Building C object src/CMakeFiles/RS41ng.elf.dir/locator.c.o [ 47%] Building C object src/CMakeFiles/RS41ng.elf.dir/log.c.o [ 48%] Building C object src/CMakeFiles/RS41ng.elf.dir/main.c.o [ 49%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio.c.o [ 50%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_position.c.o [ 51%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_weather.c.o [ 52%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_cw.c.o [ 53%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_fsq.c.o [ 55%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v1.c.o [ 56%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v2.c.o [ 57%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_jtencode.c.o [ 58%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_wspr.c.o [ 59%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si4032.c.o [ 60%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si5351.c.o [ 61%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/semihosting.c.o [ 62%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/syscalls.c.o [ 64%] Building C object src/CMakeFiles/RS41ng.elf.dir/telemetry.c.o [ 65%] Building C object src/CMakeFiles/RS41ng.elf.dir/template.c.o [ 66%] Building C object src/CMakeFiles/RS41ng.elf.dir/utils.c.o [ 67%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/jtencode.cpp.o [ 68%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/JTEncode.cpp.o [ 69%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/encode_rs_int.cpp.o [ 70%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/init_rs_int.cpp.o /RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)': /RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare] if(symsize < 0 || symsize > 8*sizeof(data_t)){ ~~~~~~~~^~~~~~~~~~~~~~~~~~ [ 71%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/radsens/radsens.cpp.o [ 73%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351/si5351.cpp.o [ 74%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351fast/si5351mcu.cpp.o [ 75%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/radsens_handler.cpp.o [ 76%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_handler.cpp.o [ 77%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o [ 78%] Linking CXX executable RS41ng.elf Building /RS41ng/build/RS41ng.hex Building /RS41ng/build/RS41ng.bin text data bss dec hex filename 50607 1120 5184 56911 de4f RS41ng.elf [ 78%] Built target RS41ng.elf Scanning dependencies of target RS41ng_top [ 79%] Building C object tests/CMakeFiles/RS41ng_top.dir/bell_test.c.o [ 80%] Building C object tests/CMakeFiles/RS41ng_top.dir/morse_test.c.o [ 82%] Building C object tests/CMakeFiles/RS41ng_top.dir/template_test.c.o [ 83%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/aprs/aprs.c.o [ 84%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/aprs/aprs_position.c.o [ 85%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/aprs/aprs_weather.c.o [ 86%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/ax25/ax25.c.o [ 87%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/bell/bell.c.o [ 88%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/horus/horus_common.c.o [ 89%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/horus/horus_l2.c.o [ 91%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/horus/horus_packet_v1.c.o [ 92%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/horus/horus_packet_v2.c.o [ 93%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/jtencode/lib/crc14.c.o [ 94%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/mfsk/mfsk.c.o [ 95%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/codecs/morse/morse.c.o [ 96%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/config.c.o [ 97%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/template.c.o /RS41ng/src/template.c: In function ‘template_replace’: /RS41ng/src/template.c:16:5: warning: implicit declaration of function ‘strlcpy’; did you mean ‘strncpy’? [-Wimplicit-function-declaration] 16 | strlcpy(replacement, CALLSIGN, sizeof(replacement)); | ^~~~~~~ | strncpy [ 98%] Building C object tests/CMakeFiles/RS41ng_top.dir/__/src/utils.c.o [100%] Linking C executable RS41ng_top /usr/bin/ld: CMakeFiles/RS41ng_top.dir/template_test.c.o: in function main':
template_test.c:(.text+0x62): undefined reference to strlcpy' /usr/bin/ld: CMakeFiles/RS41ng_top.dir/__/src/template.c.o: in function template_replace':
template.c:(.text+0x52): undefined reference to strlcpy' /usr/bin/ld: template.c:(.text+0x6e): undefined reference to strlcpy'
/usr/bin/ld: template.c:(.text+0xb1): undefined reference to strlcpy' /usr/bin/ld: template.c:(.text+0xcd): undefined reference to strlcpy'
/usr/bin/ld: CMakeFiles/RS41ng_top.dir/__/src/template.c.o:template.c:(.text+0x110): more undefined references to strlcpy' follow collect2: error: ld returned 1 exit status make[2]: *** [tests/CMakeFiles/RS41ng_top.dir/build.make:358: tests/RS41ng_top] Error 1 make[1]: *** [CMakeFiles/Makefile2:189: tests/CMakeFiles/RS41ng_top.dir/all] Error 2 make: *** [Makefile:103: all] Error 2

Any help?
73

Flashing instructions are unclear

The flashing instructions in the readme are:

  1. Remove batteries from the sonde
  2. Connect an ST-LINK v2 programmer dongle [...]
  3. Unlock the flash protection [...]

These instructions didn't work for me. Instead I had to put the batteries in the sonde and press the power button to switch it on before unlocking & flashing would work. The ST-LINK v2 does not appear to supply power to the target device (but it could be that I connected it incorrectly).

If the instructions need updating, I'd be happy to open a pull request.

APRS Longitude not showing

My longitude is 150 00'00" and does not show up on my FT3D is that because $lon is up to 6 characters and my longitude has more characters?

make fails , ubuntu 18.04

Hi, today I wanted to try the SI5351 as addon. Did apt update and upgrade on the Ubuntu 18.04 system. Removed the RS41ng directory and pulled a fresh one. Edited the config.h

cmake gives no errors. Make however starts showin something I completely don't understand.

Up to 72 percent no problems, then a warning, then a lot of "problems" are reported, at least I guess they are problems, and make failed with error 2

Any idea what's going on here ? Thanks!

[ 72%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/init_rs_int.cpp.o /home/pe2bz/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)': /home/pe2bz/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if(symsize < 0 || symsize > 8*sizeof(data_t)){ ~~~~~~~~^~~~~~~~~~~ [ 73%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351/si5351.cpp.o [ 75%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351fast/si5351mcu.cpp.o [ 76%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_handler.cpp.o [ 77%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o [ 78%] Linking CXX executable RS41ng.elf /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_arm.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_globals.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(del_op.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(new_op.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_personality.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(new_handler.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_exception.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_terminate.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_unex_handler.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(class_type_info.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_call.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_term_handler.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(del_ops.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(pure.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(tinfo.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(eh_catch.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/thumb/v7-m/libstdc++_nano.a(si_class_type_info.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: RS41ng.elf section .text' will not fit in region rom' /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: RS41ng.elf section .co_stack' will not fit in region ram' /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: region ram overflowed with stack /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: region rom' overflowed by 5300 bytes
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: region ram' overflowed by 32 bytes collect2: error: ld returned 1 exit status src/CMakeFiles/RS41ng.elf.dir/build.make:1758: recipe for target 'src/RS41ng.elf' failed make[2]: *** [src/RS41ng.elf] Error 1 CMakeFiles/Makefile2:86: recipe for target 'src/CMakeFiles/RS41ng.elf.dir/all' failed make[1]: *** [src/CMakeFiles/RS41ng.elf.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2

Firmware for the new STM32L412KB based RS41

The latest recoverd sonde (from the german Bundeswehr) contains the STM32L412KB chip and is a device with Ultra-low-power with FPU Arm Cortex-M4 MCU 80 MHz with 128 Kbytes of Flash memory. Looks the same (bottom one on the picture)
The current firmware RS41ng is written for the STM32F100. And that is an M3 MCU.
Hence you cannot flash it with the current firmware.

Is there already a process to port the current firmware for the new sondes ?

My knowledge is not enough to port the current firmware so I am keen to find out if someone is already on to it.
If needed i could donate one of the new sondes.

Erik

Scherm­afbeelding 2024-05-17 om 00 33 09

Building the firmware

Hi, I'm trying to modify my probe. I managed to edit the code with my frequencies and other parameters. I can't figure out how the program compiles to get the . HEX. I'm working from windows, what would the process be like? I downloaded Doker but I don't get it. Could you put together a tutorial or explain the steps to compile from Windows? Thanks a lot. Alejandro LW7EEA

Pulse Counter 'driver'

To enable support for things like radiation sensors, it would be handy to have a 'driver' which counts pulses on one of the IO pins available on the 10-way connector.

The example radiation sensor I have on hand is this one: http://www.radiation-watch.org/

Thoughts on this:

  • Use an external rising edge interrupt on a GPIO. Not entirely sure which ones are available - it would be nice to be able to do I2C sensors and pulse counting working in parallel, but this might not be possible.
  • On each pulse, increment a uint16. This will of course wrap at 65535, but that's fine.
  • Send down the uint16 in the downlink. We have 2 bytes free at the end of the current default Horus Binary v2 frame, so it could slot in there.
  • Users can figure out the counts-per-minute from the downlinked data (probably easier than trying to do it on the payload)

This will need the addition of the stm_lib ext interrupt driver: stm32f10x_exti.c/h
I've found a copy of this here: https://github.com/NordicPlayground/mbed/tree/master/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_DISCO_F100RB

Some info on using it here: https://scienceprog.com/interrupt-based-button-read-on-stm32f103zet6-board/

GPS power saving

Please add GPS power saving as used in RS41HUP (UBLOX_POWERSAVE). The batteries last much longer needed for floating HAB's.

HORUS and APRS with custom time schedule

Hi!
I trying setup for two modes. HORUS and APRS with custom time schedule. APRS 300 seconds (5 minute) and HORUS 60 seconds (1 minute). I use APRS_TIME_SYNC_SECONDS 300 and HORUS_V2_TIME_SYNC_SECONDS 60 in Config.h, but APRS send packet every 300 seconds and HORUS send packet 60 seconds after APRS packet. If it possible set time for APRS send every 300 seconds and HORUS every 60 second, if yes, how??
Thanks in advance.
Mario.

Sensor data problem

hello again, hope not to disturb. I loaded the last update and I found that it does not recognize the sensor, the probe takes 15 seconds to start, it takes 35 seconds, and it does not throw the sensor data. Could something have happened in the code? I was able to visualize with the weather station logo but with zero values. Sorry for so many questions, and there is very little to work. Thank you

Radiosonde not detected by RTL-SDR

Hi, i have RTL-SDR and SDR++ application to see the responce from the radiosonde, i have programmed RS41ng firmware into my radiosonde and i tried to tune my sdr++ to below frequency, but no luck
// Transmit frequencies for the Si4032 transmitter modes
#define RADIO_SI4032_TX_FREQUENCY_CW 432500000
#define RADIO_SI4032_TX_FREQUENCY_PIP 432500000
#define RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000

My SDR is not detecting any signal in the programmed frequency range, can anybody help me on this.

how to make a pull request

Hi Mikael, have some new code for you about this rotating HORUS_V2 2nd Frequency. I did a local commit. but i wonder how to make a pull request to this project? Do you have to add my user anywhere? I never made a pull-request before sorry.

got some errors not know how to interpret this

wolfgang@Wolf-Deb-Laptop:~/RS41ng$ git push
Username for 'https://github.com': whallmann
Password for 'https://[email protected]':
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mikaelnousiainen/RS41ng.git/'

Docker build: Some errors on Windows

Hi,
There are a few errors that occur when trying to build the firmware via docker on Windows. Maybe you can add these information to the documentation:

On Windows, the path must be specified directly, so the $(pwd) command wont work:
docker run --rm -it -v PATH_TO_FILE:/usr/local/src/RS41ng rs41ng_compiler should be the correct one

Now you will probably get an error like this:
line 1: $':\r': command not found

This is because Windows creates new lines via unix and not via dos like Linux.

This problem can be easily solved on Windows using Notepad++:

At first open Notepad++

1. menu: Search -> Find in Files...
2. directory = set to your RS41ng source directory
4. find what = \r\n
5. replace with = \n
6. search mode = extended
7. press "Replace in Files

More information on how to convert the files to unix

This should solve the problem. Please note that you may have to rebuild the Docker image.

Looking for some explanation about the "TIME_SYNC"

Hi, I am trying to make RS41ng running 12 payloads, with different ID's on the same frequency (intended for a scouting competition)

I don't have enabled continous for either V1 or V2 4fsk, all other modes are disabled.

// Use Horus payload ID 256 for Horus V2 tests (4FSKTEST-V2) #define HORUS_V2_PAYLOAD_ID 379 #define HORUS_V2_BAUD_RATE_SI4032 100 #define HORUS_V2_BAUD_RATE_SI5351 100 #define HORUS_V2_PREAMBLE_LENGTH 16 #define HORUS_V2_IDLE_PREAMBLE_LENGTH 32 #define HORUS_V2_TONE_SPACING_HZ_SI5351 270 #define HORUS_V2_TIME_SYNC_SECONDS 10 // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS$ #define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 60 // Delay transmission for an N second offset after the scheduled time.

With these settings I expected the sonde to only transmit every 10 seconds AND again after the 60 seconds offset.

I added another tracker with the V2_TIME_SYNC_SECONDS set to 5 but both trackers, with GPS lock, appear to transmit continuously.

Can you shine a light on my question and maybe explain where I am going wrong ? Thanks.

CATS not transmitting from DFM-17

I spent a few hours this afternoon attempting to try the new cats option. I programmed a sequence of APRS, Hv2, cats with 30 second repeating cycle. APRS and HV2 both transmitted and decoded. I could not identify a cats transmission at all. I tried the cats-sdr-software, an ht set to the frequency and an sdr# but no signal at all transmitted from the DFM. I used the GitHub cats settings other than call sign and comment text and the not balloon reporting option. The cats sdr receiving station did appear on APRS.fi along with the APRS icon from the DFM APRS transmission received through APRS.

DFM17 APRS packets do not format correctly

The address fields and the routing fields in the packet header are transmitted in a mixed order.
Expect:
[sender callsign]>[to callsign],[WIDE1-1],[WIDE2-2],:

TRANSMITTED ORDER:
[WIDE2]>[WIDE1-1],1:

Looks as sender callsign is replaced with part of second route. To callsign replaced with first route. Both sender and destination data are missing but the routing fields are missing from the packet.
I don't see routing declared in ax25 header file so memory pointers likely address incorrect area.

Error 2 when docker compiling

It looks like when make tries to create a .elf file it has some unknown problems

[ 98%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o
/usr/local/src/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)':
/usr/local/src/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
   33 |   if(symsize < 0 || symsize > 8*sizeof(data_t)){
      |                     ~~~~~~~~^~~~~~~~~~~~~~~~~~
[100%] Linking CXX executable RS41ng.elf
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/main.c.o: in function `main':
/usr/local/src/RS41ng/src/main.c:74: multiple definition of `main'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:767: first defined here
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: in function `main':
/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp:757: multiple definition of `main'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:767: first defined here
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp:738: multiple definition of `info_language_dialect_default'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:754: first defined here
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp:718: multiple definition of `info_arch'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:733: first defined here
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp:717: multiple definition of `info_platform'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:732: first defined here
/usr/lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdCXX/CMakeCXXCompilerId.cpp:388: multiple definition of `info_compiler'; CMakeFiles/RS41ng.elf.dir/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c.o:/usr/local/src/RS41ng/src/build/CMakeFiles/3.21.5/CompilerIdC/CMakeCCompilerId.c:403: first defined here
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/RS41ng.elf.dir/build.make:1153: src/RS41ng.elf] Error 1
make[1]: *** [CMakeFiles/Makefile2:117: src/CMakeFiles/RS41ng.elf.dir/all] Error 2
make: *** [Makefile:91: all] Error 2```

What to expect if BMP280 is enabled but not connected ?

Hi, today I did build the firmware on Ubuntu, .bin and .hex files are written, after re powering the sonde the red led stays on.

I have not yet attached the BMP280 but it's enabled in the config.

Does the software check and halt if no BMP280 is connected ?

Thanks,
Ben

Failure to build under docker and fedora workstation

Using either the docker or fedora build enviroments I get the following error

npc@fedora build]$ cmake ..

-- The C compiler identification is GNU 12.2.1
-- The CXX compiler identification is GNU 12.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/npc/RS41ng/build
[npc@fedora build]$ make
[ 1%] Building C object src/CMakeFiles/RS41ng.elf.dir/bmp280_handler.c.o
[ 2%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs.c.o
[ 3%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_position.c.o
[ 4%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs_weather.c.o
[ 5%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/ax25/ax25.c.o
[ 6%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/bell/bell.c.o
[ 8%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_common.c.o
[ 9%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_l2.c.o
[ 10%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v1.c.o
[ 11%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v2.c.o
[ 12%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/crc14.c.o
[ 13%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/mfsk/mfsk.c.o
[ 14%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/morse/morse.c.o
[ 16%] Building C object src/CMakeFiles/RS41ng.elf.dir/config.c.o
[ 17%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/bmp280/bmp280.c.o
[ 18%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/pulse_counter/pulse_counter.c.o
[ 19%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/si4032/si4032.c.o
[ 20%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/ubxg6010/ubxg6010.c.o
[ 21%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/startup/startup_stm32f10x_md_vl.c.o
[ 22%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/system_stm32f10x.c.o
[ 24%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/datatimer.c.o
[ 25%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/delay.c.o
[ 26%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/i2c.c.o
[ 27%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/pwm.c.o
[ 28%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/spi.c.o
[ 29%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/misc.c.o
[ 31%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_adc.c.o
[ 32%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_dma.c.o
[ 33%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_exti.c.o
[ 34%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_flash.c.o
[ 35%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_gpio.c.o
[ 36%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_i2c.c.o
[ 37%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_pwr.c.o
[ 39%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_rcc.c.o
[ 40%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_spi.c.o
[ 41%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_tim.c.o
[ 42%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_usart.c.o
[ 43%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/system.c.o
[ 44%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_ext.c.o
[ 45%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_gps.c.o
[ 47%] Building C object src/CMakeFiles/RS41ng.elf.dir/locator.c.o
[ 48%] Building C object src/CMakeFiles/RS41ng.elf.dir/log.c.o
[ 49%] Building C object src/CMakeFiles/RS41ng.elf.dir/main.c.o
[ 50%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio.c.o
[ 51%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_position.c.o
[ 52%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs_weather.c.o
[ 54%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_cw.c.o
[ 55%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_fsq.c.o
[ 56%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v1.c.o
[ 57%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v2.c.o
[ 58%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_jtencode.c.o
[ 59%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_wspr.c.o
[ 60%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si4032.c.o
[ 62%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si5351.c.o
[ 63%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/semihosting.c.o
[ 64%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/syscalls.c.o
[ 65%] Building C object src/CMakeFiles/RS41ng.elf.dir/telemetry.c.o
[ 66%] Building C object src/CMakeFiles/RS41ng.elf.dir/template.c.o
[ 67%] Building C object src/CMakeFiles/RS41ng.elf.dir/utils.c.o
[ 68%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/jtencode.cpp.o
[ 70%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/JTEncode.cpp.o
[ 71%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/encode_rs_int.cpp.o
[ 72%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/init_rs_int.cpp.o
/home/npc/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)':
/home/npc/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
33 | if(symsize < 0 || symsize > 8*sizeof(data_t)){
| ~~~~~~~~^~~~~~~~~~~~~~~~~~
[ 73%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351/si5351.cpp.o
[ 74%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351fast/si5351mcu.cpp.o
[ 75%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_handler.cpp.o
[ 77%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o
[ 78%] Linking CXX executable RS41ng.elf
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libstdc++_nano.a(eh_globals.o): in function _GLOBAL__sub_I___cxa_get_globals_fast&apos;: eh_globals.cc:(.text.startup._GLOBAL__sub_I___cxa_get_globals_fast+0xc): undefined reference to __dso_handle'
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: RS41ng.elf: hidden symbol `__dso_handle' isn't defined
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/RS41ng.elf.dir/build.make:1153: src/RS41ng.elf] Error 1
make[1]: *** [CMakeFiles/Makefile2:117: src/CMakeFiles/RS41ng.elf.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
[npc@fedora build]$

APRS_Destination & APRS_Relays ??

With the arrival of my first RS-41, I finally have a test platform to start learning about your wonderful software! Thanks in advance for making this available.

Everything worked great on my first attempt to reflash the RS-41 and both the 4FSK (via the Horus-GUI) and APRS (via Direwolf) are decoding perfectly.

My questions are:

  1. is APRS_DESTINATION set to "APZ41N" for a particular reason? Would you prefer that we leave it set to that value?

  2. I thought that for high-altitude transmitters like balloons, using digi paths such as WIDE1-1,WIDE2-1 was highly discouraged. Would it be ok for me to change that line to:
    #define APRS_RELAYS ""

... or would that cause some problem?

Thanks VERY much for help on these questions when time permits.

-Scott, K4KDR

No GPS Fix when Time Sync enabled

Hi! Whenever I enable GPS Time Sync for any transmission, the packets indefinitely come with latitude, longitude, and altitude equal to 0. The same config, same radiosonde, but without time sync enabled, returns proper coordinates. The value of the sync is irrelevant, happens on any value, such as 10s, 15s, etc. Why is this happening? Is there an easy and quick fix for this? Thanks in advance!

Compile error: strlcpy not found

I get an error when trying to compile. I have installed libbsd-dev and that helped with a previous error that <bsd/string.h> could not be found. It was my understanding that <bsd/string.h> contained the function strlcpy but it isn't working in template.c

[ 97%] Building C object tests/CMakeFiles/Project.dir/__/src/template.c.o
/home/reid/RS41ng/src/template.c: In function ‘template_replace’:
/home/reid/RS41ng/src/template.c:16:5: warning: implicit declaration of function ‘strlcpy’; did you mean ‘strncpy’? [-Wimplicit-function-declaration]
     strlcpy(replacement, CALLSIGN, sizeof(replacement));
     ^~~~~~~
     strncpy
[ 98%] Building C object tests/CMakeFiles/Project.dir/__/src/utils.c.o
[100%] Linking C executable Project
CMakeFiles/Project.dir/template_test.c.o: In function `main':
template_test.c:(.text+0x74): undefined reference to `strlcpy'
CMakeFiles/Project.dir/__/src/template.c.o: In function `template_replace':
template.c:(.text+0x61): undefined reference to `strlcpy'
template.c:(.text+0x7d): undefined reference to `strlcpy'
template.c:(.text+0xc0): undefined reference to `strlcpy'
template.c:(.text+0xdc): undefined reference to `strlcpy'
CMakeFiles/Project.dir/__/src/template.c.o:template.c:(.text+0x11f): more undefined references to `strlcpy' follow
collect2: error: ld returned 1 exit status
tests/CMakeFiles/Project.dir/build.make:510: recipe for target 'tests/Project' failed
make[2]: *** [tests/Project] Error 1
CMakeFiles/Makefile2:173: recipe for target 'tests/CMakeFiles/Project.dir/all' failed
make[1]: *** [tests/CMakeFiles/Project.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2```

No ST-Link detected

I soldered the connector to the DFM-17 and attached the ST-Link V2 USB. The board lights up with all 3 LEDs, but the STM32-STM Link Utility can't find the Target. What next?

BMP 280

Would you be so kind as to upload a .hex file so that I can test if my board works? the probe starts at 38 seconds and begins transmissions. but i am not getting the readings from the bmp280 sensor. he told me that pull up resistors are going. the bmp280 board has built-in 10k ones. but I can't get the data. I can't find the connection diagram of the RS41 with the BMP280. I assumed that it goes SDA / SDA, SCL / SCL, GND and + V (I don't know which pin of the probe)

region `rom' overflowed by 4 bytes

Hello,

While building RS41ng I run in region from" overflowed by 4 bytes error message while linking.
Platform is Ubuntu 20.04.2 LTS.

Any hint how to solve?

➜  build git:(master) cmake ..
CMake Warning (dev) in CMakeLists.txt:
  No project() command is present.  The top-level CMakeLists.txt file must
  contain a literal, direct call to the project() command.  Add a line of
  code such as

    project(ProjectName)

  near the top of the file, but after cmake_minimum_required().

  CMake is pretending there is a "project(Project)" command on the first
  line.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/fkemps/RS41ng/build
➜  build git:(master) make
Scanning dependencies of target RS41ng.elf
[  1%] Building C object src/CMakeFiles/RS41ng.elf.dir/bmp280_handler.c.o
[  2%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/aprs/aprs.c.o
[  4%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/ax25/ax25.c.o
[  5%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/bell/bell.c.o
[  6%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_l2.c.o
[  8%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/horus/horus_packet_v1.c.o
[  9%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/crc14.c.o
[ 10%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/mfsk/mfsk.c.o
[ 12%] Building C object src/CMakeFiles/RS41ng.elf.dir/codecs/morse/morse.c.o
[ 13%] Building C object src/CMakeFiles/RS41ng.elf.dir/config.c.o
[ 15%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/bmp280/bmp280.c.o
[ 16%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/si4032/si4032.c.o
[ 17%] Building C object src/CMakeFiles/RS41ng.elf.dir/drivers/ubxg6010/ubxg6010.c.o
[ 19%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/startup/startup_stm32f10x_md_vl.c.o
[ 20%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/cmsis_boot/system_stm32f10x.c.o
[ 21%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/datatimer.c.o
[ 23%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/delay.c.o
[ 24%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/i2c.c.o
[ 26%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/pwm.c.o
[ 27%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/spi.c.o
[ 28%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/misc.c.o
[ 30%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_adc.c.o
[ 31%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_dma.c.o
[ 32%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_flash.c.o
[ 34%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_gpio.c.o
[ 35%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_i2c.c.o
[ 36%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_pwr.c.o
[ 38%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_rcc.c.o
[ 39%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_spi.c.o
[ 41%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_tim.c.o
[ 42%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/stm_lib/src/stm32f10x_usart.c.o
[ 43%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/system.c.o
[ 45%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_ext.c.o
[ 46%] Building C object src/CMakeFiles/RS41ng.elf.dir/hal/usart_gps.c.o
[ 47%] Building C object src/CMakeFiles/RS41ng.elf.dir/locator.c.o
[ 49%] Building C object src/CMakeFiles/RS41ng.elf.dir/log.c.o
[ 50%] Building C object src/CMakeFiles/RS41ng.elf.dir/main.c.o
[ 52%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio.c.o
[ 53%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_aprs.c.o
[ 54%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_cw.c.o
[ 56%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_fsq.c.o
[ 57%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_horus_v1.c.o
[ 58%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_jtencode.c.o
[ 60%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_payload_wspr.c.o
[ 61%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si4032.c.o
[ 63%] Building C object src/CMakeFiles/RS41ng.elf.dir/radio_si5351.c.o
[ 64%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/semihosting.c.o
[ 65%] Building C object src/CMakeFiles/RS41ng.elf.dir/syscalls/syscalls.c.o
[ 67%] Building C object src/CMakeFiles/RS41ng.elf.dir/telemetry.c.o
[ 68%] Building C object src/CMakeFiles/RS41ng.elf.dir/template.c.o
[ 69%] Building C object src/CMakeFiles/RS41ng.elf.dir/utils.c.o
[ 71%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/jtencode.cpp.o
[ 72%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/JTEncode.cpp.o
[ 73%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/encode_rs_int.cpp.o
[ 75%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/codecs/jtencode/lib/init_rs_int.cpp.o
/home/fkemps/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp: In member function 'void* JTEncode::init_rs_int(int, int, int, int, int, int)':
/home/fkemps/RS41ng/src/codecs/jtencode/lib/init_rs_int.cpp:33:29: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
   33 |   if(symsize < 0 || symsize > 8*sizeof(data_t)){
      |                     ~~~~~~~~^~~~~~~~~~~~~~~~~~
[ 76%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/drivers/si5351/si5351.cpp.o
[ 78%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_handler.cpp.o
[ 79%] Building CXX object src/CMakeFiles/RS41ng.elf.dir/si5351_test.cpp.o
[ 80%] Linking CXX executable RS41ng.elf
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: RS41ng.elf section `.ARM.exidx' will not fit in region `rom'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: region `rom' overflowed by 4 bytes
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/RS41ng.elf.dir/build.make:939: src/RS41ng.elf] Error 1
make[1]: *** [CMakeFiles/Makefile2:143: src/CMakeFiles/RS41ng.elf.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

Cant debug anymore - Memory limit in RS41?

Problem: if i try to use the debug system, the file size increases over a limit of 64 kb. Is there any chance to get it lower? How do you @mikaelnousiainen debug this?

Details:
If i try to enable

#define SEMIHOSTING_ENABLE
#define LOGGING_ENABLE

the make command shows this infos:

[ 32%] Linking CXX executable RS41ng.elf
Building /home/wolfgang/RS41ng_workspace/build/RS41ng.hex 
Building /home/wolfgang/RS41ng_workspace/build/RS41ng.bin
   text	   data	    bss	    dec	    hex	filename
  65148	   1432	   5192	  71772	  1185c	RS41ng.elf
[ 78%] Built target RS41ng.elf
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.540079
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x0800281c msp: 0x200019e0
** Programming Started **
auto erase enabled
Info : device id = 0x10016420
Info : flash size = 64kbytes
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000003a msp: 0x200019e0
Warn : no flash bank found for address 8010000
wrote 65536 bytes from file build/src/RS41ng.elf in 2.187044s (29.263 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x200019e0
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x200019e0
Error: checksum mismatch - attempting binary compare
diff 0 address 0x08010000. Was 0xff instead of 0x00
diff 1 address 0x08010001. Was 0xff instead of 0x00
diff 2 address 0x08010002. Was 0xff instead of 0x10
diff 3 address 0x08010003. Was 0xff instead of 0x27

the linker shows more then 64 k so this maybe the Limit - so i cant flash to unit

BTW: without SEMIHOST Switch the Linker shows:

   text	   data	    bss	    dec	    hex	filename
  60148	   1432	   5192	  66772	  104d4	RS41ng.elf

Feature Request- 'Pips' between transmissions

RS41HUP had a useful feature where you could transmit short 'pips' (50ms of carrier) at regular intervals between telemetry transmissions.
This acts as a channel marker of sorts, helping listeners tune their receivers in, while not using too much power.

I would suggest adding it in as a 'mode' which the user can include inamongst other transmissions.

e.g.

#define RADIO_POST_TRANSMIT_DELAY_MS 2000


#define RADIO_SI4032_TX_HORUS_V2 true
#define RADIO_SI4032_TX_HORUS_V2_COUNT 1
#define RADIO_SI4032_TX_PIP true
#define RADIO_SI4032_TX_PIP_COUNT 5

Would result in a Horus v2 transmission, then 6 pips every 2 seconds thereafter

macOS arm-none-eabi build error

I'm trying to build the code on macOS; everything works well until I get to this point :

[ 78%] Linking CXX executable RS41ng.elf
/opt/local/lib/gcc/arm-none-eabi/12.1.0/../../../../arm-none-eabi/bin/ld : arm-none-eabi/bin/ld : Error: unable to disambiguate: -search_paths_first  (did you mean --search_paths_first ?)

make[2]: *** [src/RS41ng.elf] Error 1
make[1]: *** [src/CMakeFiles/RS41ng.elf.dir/all] Error 2
make: *** [all] Error 2

I had to specify my TOOLCHAIN_PATH in src/CMakeLists.txt to be /opt/local/bin before running cmake .. because the arm-none-eabi-gcc toolchain is apparently installed there on macOS.

How could I fix this issue ?

Edit : I installed the toolchain with MacPorts, which compiled it on my machine

Can you try if FT8 still is working ?

Hi, I can compile a version which transmits wspr , Horus V2 and FT8 on HF (si5351) but the FT8 signal however is undecodable.

Instead of a normal FT8 transmission there appears an FT8 signal which starts at the right moment, sounds normal, but got interrupted, restarts, got interrupted, restarts and ends by the usual timing

image

The first transmission is the FT8 transmission, followed by the 4FSK transmission. As you can see the FT8 is "interrupted"

The same problem happened with another user with another computer, other RS41 and si5351 too.

I would like to test this mode on a balloon flight :-)

Thanks,

Ben

Run command create $(pwd) invalid characters in Docker Desktop for Windows

The READ.md file instruction Build command worked fine. But the run command generated this error. I tried different direct formats for pwd but could not seem to get it to work. Running Windows 10 with Docker Desktop for Windows. Any idea what syntax is creating this error?

O:\My Documents\Balloon\Sonde\RS41ng Reprogramming\RS41ng-main>docker run --rm -it -v $(pwd):/usr/local/src/RS41ng rs41ng_compiler
docker: Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.