From abab1692b096b916280cecae38d628f277892766 Mon Sep 17 00:00:00 2001 From: eleccoder <9162301+eleccoder@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:42:56 +0100 Subject: [PATCH] Extra program for testing added, separate from demo/example --- CMakeLists.txt | 68 +++++++++++++++++++++++++++---------- README.md | 17 +++++----- src/aprs_pico_beacon_demo.c | 27 ++++----------- src/aprs_pico_tone_test.c | 38 +++++++++++++++++++++ 4 files changed, 104 insertions(+), 46 deletions(-) create mode 100644 src/aprs_pico_tone_test.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cdca73a..a3ca5e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,12 @@ FetchContent_MakeAvailable(ax25_aprs_lib) add_library(ax25_aprs_lib::ax25beacon ALIAS ax25beacon) +# Compiler options + +# Enable on demand only, since warnings from 3rd-party code will flood the console +# set(APRS_PICO_COMPILE_WARN_OPTIONS -Wundef -Wswitch-enum -Wall -Wextra -pedantic) + + # ##### Configure the build of the 'aprs_pico' library ##### set(TARGET_LIB_NAME aprs_pico) @@ -30,18 +36,19 @@ set(TARGET_LIB_NAME aprs_pico) add_library(${TARGET_LIB_NAME} src/aprs_pico.c) +target_compile_options(${TARGET_LIB_NAME} + PRIVATE "${APRS_PICO_COMPILE_WARN_OPTIONS}" +) + +target_include_directories(${TARGET_LIB_NAME} PUBLIC + include +) + set_target_properties(${TARGET_LIB_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" ) -target_include_directories(${TARGET_LIB_NAME} PUBLIC - include -) - -# Enable on demand -#target_compile_options(${TARGET_LIB_NAME} PRIVATE "-Wundef;-Wall") - target_link_libraries(${TARGET_LIB_NAME} ax25_aprs_lib::ax25beacon pico_audio_pwm @@ -49,29 +56,54 @@ target_link_libraries(${TARGET_LIB_NAME} ) -# ##### Configure the build of the example application ##### +# ##### Configure the build of the DEMO applications ##### -set(TARGET_EXAMPLE_EXE_NAME aprs_pico_example) +set(TARGET_DEMO_EXE_NAME aprs_pico_beacon_demo) -add_executable(${TARGET_EXAMPLE_EXE_NAME} - src/aprs_pico_example.c +add_executable(${TARGET_DEMO_EXE_NAME} + src/aprs_pico_beacon_demo.c ) -target_include_directories(${TARGET_EXAMPLE_EXE_NAME} PRIVATE +target_compile_options(${TARGET_DEMO_EXE_NAME} + PRIVATE "${APRS_PICO_COMPILE_WARN_OPTIONS}" +) + +target_include_directories(${TARGET_DEMO_EXE_NAME} PRIVATE include ) -# Configure the console interface -pico_enable_stdio_usb(${TARGET_EXAMPLE_EXE_NAME} 1) # USB -#pico_enable_stdio_uart(${TARGET_EXAMPLE_EXE_NAME} 1) # UART - # Create map/bin/hex file etc. -pico_add_extra_outputs(${TARGET_EXAMPLE_EXE_NAME}) +pico_add_extra_outputs(${TARGET_DEMO_EXE_NAME}) -target_link_libraries(${TARGET_EXAMPLE_EXE_NAME} +target_link_libraries(${TARGET_DEMO_EXE_NAME} ${TARGET_LIB_NAME} ax25_aprs_lib::ax25beacon pico_audio_pwm pico_stdlib ) + +# ##### Configure the build of the TEST application ##### + +set(TARGET_TEST_EXE_NAME aprs_pico_tone_test) + +add_executable(${TARGET_TEST_EXE_NAME} + src/aprs_pico_tone_test.c +) + +target_compile_options(${TARGET_TEST_EXE_NAME} + PRIVATE "${APRS_PICO_COMPILE_WARN_OPTIONS}" +) + +target_include_directories(${TARGET_TEST_EXE_NAME} PRIVATE + include +) + +# Create map/bin/hex file etc. +pico_add_extra_outputs(${TARGET_TEST_EXE_NAME}) + +target_link_libraries(${TARGET_TEST_EXE_NAME} + ${TARGET_LIB_NAME} + pico_audio_pwm + pico_stdlib +) diff --git a/README.md b/README.md index 4b6ce79..0f49294 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ An analog line-out audio signal will be generated by a band-pass filter connecte Image: Line-out signal (see [below](#Hardware)) probed by a DSO. We clearly see the 1200 Hz and 2200 Hz tones of the 1200 Bd 2-AFSK. -Both a static library `libaprs_pico.a` and an example application will be generated by the build. +Both a static library `libaprs_pico.a` and a demo application will be generated by the build. ## Prerequisites @@ -39,7 +39,7 @@ We just need a simple band-pass filter to extract the analog AFSK-signal from th The line-out voltage can be as high as 2.7 Vpp (~1 Vrms) (at full-scale volume setting in the software and high-impedance load). -## Build the library and the example application +## Build the library and the 'beacon' demo application ``` git clone https://github.com/eleccoder/raspi-pico-aprs-tnc.git @@ -48,18 +48,18 @@ cmake -S . -B build cmake --build build ``` -`build/lib/libaprs_pico.a` and `build/aprs_pico_example[.uf2|.elf|.bin]` will be generated. +`build/lib/libaprs_pico.a` and `build/aprs_pico_beacon_demo[.uf2|.elf|.bin|.hex]` will be generated, as well as the testing application `build/aprs_pico_tone_test[.uf2|.elf|.bin|.hex]`. -## Run the example application +## Run the 'beacon' demo application ``` cd build -Flash 'aprs_pico_example[.uf2|.elf|.bin]' to the Pico board as usual +Flash 'aprs_pico_beacon_demo[.uf2|.elf|.bin|.hex]' to the Pico board as usual. ``` The analog AFSK audio signal will be available at the filter's line-out. You can probe it by a scope, listen to it by using an audio amp, or connect it to any RF transceiver to send it on the air (ham radio license required). -## Test the example application using *Dire Wolf* (on LINUX) +## Test the 'beacon' demo application using *Dire Wolf* (on LINUX) We can use the famous [Dire Wolf](https://github.com/wb2osz/direwolf) CLI software to decode the APRS data after sampling our APRS audio signal by means of a soundcard. @@ -94,5 +94,6 @@ arecord -f cd -c 1 -t raw - | direwolf ## Ingredients / Acknowledgements -- For APRS => AX.25 => PCM conversion I'm using [my modified version](https://github.com/eleccoder/ax25-aprs-lib) of [fsphil's ax25beacon](https://github.com/fsphil/ax25beacon) -- For PCM => PWM conversion I'm using the `pico_audio_pwm` library from [pico-extras](https://github.com/raspberrypi/pico-extras) (NOTE: ATTOW, maturity seems to be rather alpha/beta) +- For `APRS => AX.25 => PCM` conversion I'm using [my modified version](https://github.com/eleccoder/ax25-aprs-lib) of [fsphil's ax25beacon](https://github.com/fsphil/ax25beacon) project. +- For `PCM => PWM` conversion I'm using the `pico_audio_pwm` library from [pico-extras](https://github.com/raspberrypi/pico-extras) (NOTE: ATTOW, maturity seems to be rather alpha/beta). +- Basic PWM audio rendering with the Pi Pico has been spotted in the [pico-playground](https://github.com/raspberrypi/pico-playground/tree/master/audio). diff --git a/src/aprs_pico_beacon_demo.c b/src/aprs_pico_beacon_demo.c index 202e4d8..2f7b383 100644 --- a/src/aprs_pico_beacon_demo.c +++ b/src/aprs_pico_beacon_demo.c @@ -13,14 +13,11 @@ * GNU General Public License for more details. * You should have received a copy of the GNU General Public License -* along with this program. If not, see . +* along with this program. If not, see . */ -#include -#include - -#define SINE_WAVE_TEST (0) // For testing & debugging - +#include "aprs_pico.h" +#include "pico/stdlib.h" int main() @@ -29,17 +26,8 @@ int main() audio_buffer_pool_t* audio_buffer_pool = aprs_pico_init(); -#if (SINE_WAVE_TEST == 1) - - const unsigned int FREQ_IN_HZ = 1000u; - const unsigned int SAMPLE_FREQ_IN_HZ = 48000u; - const uint16_t VOLUME = 128u; - - aprs_pico_send_sine_wave(audio_buffer_pool, FREQ_IN_HZ, SAMPLE_FREQ_IN_HZ, VOLUME); - -#else // !SINE_WAVE_TEST - - double alt_in_m = 0.0f; + // Let the altitude run over time + double alt_in_m = 0.0; while (true) // Loop forever { @@ -49,16 +37,15 @@ int main() "DL3TG", // Destination call sign "PATH1", // APRS path #1 "PATH2", // APRS path #2 - "APRS by RPi-Pico - https://github.com/eleccoder/raspi-pico-aprs-tnc", // APRS message + "APRS by RPi-Pico - https://github.com/eleccoder/raspi-pico-aprs-tnc", // Text message 10.0, // Latitude (in deg) 20.0, // Longitude (in deg) alt_in_m, // Altitude (in m) 128u); // Volume (0 ... 256) + // Don't raise too high ... alt_in_m = (alt_in_m < 1000.0) ? alt_in_m + 100.0 : 0.0; } -#endif // SINE_WAVE_TEST, !SINE_WAVE_TEST - return 0; } diff --git a/src/aprs_pico_tone_test.c b/src/aprs_pico_tone_test.c new file mode 100644 index 0000000..9204283 --- /dev/null +++ b/src/aprs_pico_tone_test.c @@ -0,0 +1,38 @@ +/* +* Project 'raspi-pico-aprs-tnc' +* Copyright (C) 2021-2023 Thomas Glau, DL3TG +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ + +#include "aprs_pico.h" +#include "pico/stdlib.h" + + +int main() +{ + // 48 kHz is used as a default by the underlying https://github.com/eleccoder/ax25-aprs-lib library + // The PWM base frequency is expected to be 16 * SAMPLE_FREQ_IN_HZ + const unsigned int SAMPLE_FREQ_IN_HZ = 48000u; + + const unsigned int TONE_FREQ_IN_HZ = 1000u; + const uint16_t VOLUME = 128u; // 0 ... 256 + + stdio_init_all(); + audio_buffer_pool_t* audio_buffer_pool = aprs_pico_init(); + + aprs_pico_send_sine_wave(audio_buffer_pool, TONE_FREQ_IN_HZ, SAMPLE_FREQ_IN_HZ, VOLUME); + + return 0; +}