sforkowany z mirror/RS41ng
Add 'pip' mode - a short beep to indicate presence of the transmitter
rodzic
edbd5faa1e
commit
0aa49f5a2c
|
@ -1,4 +1,5 @@
|
|||
cmake_minimum_required(VERSION 3.6)
|
||||
project(RS41ng_top)
|
||||
|
||||
SET(CMAKE_SYSTEM_NAME "Generic")
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
|
|
@ -63,6 +63,7 @@ The main features the RS41ng firmware are:
|
|||
* There is an option to use continuous transmit mode (for either V1 or V2 mode), which helps with receiver frequency synchronization and improves reception.
|
||||
* Morse code (CW)
|
||||
* 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
|
||||
* "Pip" mode, which transmits a short beep generated using CW to indicate presence of the transmitter
|
||||
* 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
|
||||
* Support for custom sensors via the external I²C bus
|
||||
|
@ -78,6 +79,7 @@ On the internal Si4032 transmitter:
|
|||
* 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:
|
||||
|
||||
|
@ -85,6 +87,7 @@ On an external Si5351 clock generator connected to the external I²C bus of the
|
|||
* 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
|
||||
|
||||
|
|
11
src/config.c
11
src/config.c
|
@ -52,7 +52,16 @@ volatile bool system_initialized = false;
|
|||
* Maximum length: 64 characters.
|
||||
*/
|
||||
char *cw_message_templates[] = {
|
||||
"$cs TEST $loc6 $altm $tiC",
|
||||
"$cs $loc6 $altm $gs km/h $tiC",
|
||||
NULL
|
||||
};
|
||||
|
||||
/**
|
||||
* "Pip" mode messages. Transmitted as CW, because a single "pip" can be represented as the 'E' character.
|
||||
* Maximum length: 64 characters.
|
||||
*/
|
||||
char *pip_message_templates[] = {
|
||||
"E", // An 'E' character in CW represents a single "pip".
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
20
src/config.h
20
src/config.h
|
@ -59,8 +59,10 @@
|
|||
#define RADIO_SI4032_TX_POWER 7
|
||||
|
||||
// Which modes to transmit using the built-in Si4032 transmitter chip
|
||||
#define RADIO_SI4032_TX_CW true
|
||||
#define RADIO_SI4032_TX_CW false
|
||||
#define RADIO_SI4032_TX_CW_COUNT 1
|
||||
#define RADIO_SI4032_TX_PIP false
|
||||
#define RADIO_SI4032_TX_PIP_COUNT 6
|
||||
#define RADIO_SI4032_TX_APRS true
|
||||
#define RADIO_SI4032_TX_APRS_COUNT 2
|
||||
#define RADIO_SI4032_TX_HORUS_V1 false
|
||||
|
@ -76,6 +78,7 @@
|
|||
|
||||
// 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
|
||||
// Use a frequency offset to place FSK tones slightly above the defined frequency for SSB reception
|
||||
#define RADIO_SI4032_TX_FREQUENCY_HORUS_V1 432501000
|
||||
|
@ -92,6 +95,8 @@
|
|||
// Which modes to transmit using an externally connected Si5351 chip in the I²C bus
|
||||
#define RADIO_SI5351_TX_CW true
|
||||
#define RADIO_SI5351_TX_CW_COUNT 1
|
||||
#define RADIO_SI5351_TX_PIP false
|
||||
#define RADIO_SI5351_TX_PIP_COUNT 6
|
||||
#define RADIO_SI5351_TX_HORUS_V1 false
|
||||
#define RADIO_SI5351_TX_HORUS_V1_COUNT 1
|
||||
#define RADIO_SI5351_TX_HORUS_V2 true
|
||||
|
@ -111,6 +116,7 @@
|
|||
|
||||
// Transmit frequencies for the Si5351 transmitter modes
|
||||
#define RADIO_SI5351_TX_FREQUENCY_CW 3595000UL
|
||||
#define RADIO_SI5351_TX_FREQUENCY_PIP 3595000UL
|
||||
#define RADIO_SI5351_TX_FREQUENCY_HORUS_V1 3608000UL
|
||||
#define RADIO_SI5351_TX_FREQUENCY_HORUS_V2 3608000UL
|
||||
#define RADIO_SI5351_TX_FREQUENCY_JT9 14085000UL // Was: 14078700UL
|
||||
|
@ -212,6 +218,18 @@
|
|||
// Delay transmission for an N second offset after the scheduled time.
|
||||
#define CW_TIME_SYNC_OFFSET_SECONDS 0
|
||||
|
||||
/**
|
||||
* Pip settings (short beep generated using CW to indicate presence of the transmitter)
|
||||
*/
|
||||
|
||||
// Pip speed is defined as CW WPM, range 5 - 40
|
||||
#define PIP_SPEED_WPM 18
|
||||
|
||||
// Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync.
|
||||
#define PIP_TIME_SYNC_SECONDS 0
|
||||
// Delay transmission for an N second offset after the scheduled time.
|
||||
#define PIP_TIME_SYNC_OFFSET_SECONDS 0
|
||||
|
||||
/**
|
||||
* WSPR settings
|
||||
*/
|
||||
|
|
|
@ -23,6 +23,7 @@ extern bool si5351_enabled;
|
|||
extern volatile bool system_initialized;
|
||||
|
||||
extern char *cw_message_templates[];
|
||||
extern char *pip_message_templates[];
|
||||
extern char *aprs_comment_templates[];
|
||||
extern char *fsq_comment_templates[];
|
||||
extern char *ftjt_message_templates[];
|
||||
|
|
33
src/radio.c
33
src/radio.c
|
@ -75,6 +75,19 @@ radio_transmit_entry radio_transmit_schedule[] = {
|
|||
.fsk_encoder_api = &mfsk_fsk_encoder_api,
|
||||
},
|
||||
#else
|
||||
{
|
||||
.enabled = RADIO_SI4032_TX_PIP,
|
||||
.radio_type = RADIO_TYPE_SI4032,
|
||||
.data_mode = RADIO_DATA_MODE_PIP,
|
||||
.transmit_count = RADIO_SI4032_TX_PIP_COUNT,
|
||||
.time_sync_seconds = PIP_TIME_SYNC_SECONDS,
|
||||
.time_sync_seconds_offset = PIP_TIME_SYNC_OFFSET_SECONDS,
|
||||
.frequency = RADIO_SI4032_TX_FREQUENCY_PIP,
|
||||
.tx_power = RADIO_SI4032_TX_POWER,
|
||||
.symbol_rate = MORSE_WPM_TO_SYMBOL_RATE(PIP_SPEED_WPM),
|
||||
.payload_encoder = &radio_cw_payload_encoder,
|
||||
.fsk_encoder_api = &morse_fsk_encoder_api,
|
||||
},
|
||||
{
|
||||
.enabled = RADIO_SI4032_TX_CW,
|
||||
.radio_type = RADIO_TYPE_SI4032,
|
||||
|
@ -132,6 +145,21 @@ radio_transmit_entry radio_transmit_schedule[] = {
|
|||
.fsk_encoder_api = &mfsk_fsk_encoder_api,
|
||||
},
|
||||
#if RADIO_SI5351_ENABLE
|
||||
#if RADIO_SI5351_TX_PIP
|
||||
{
|
||||
.enabled = RADIO_SI5351_TX_PIP,
|
||||
.radio_type = RADIO_TYPE_SI5351,
|
||||
.data_mode = RADIO_DATA_MODE_PIP,
|
||||
.transmit_count = RADIO_SI5351_TX_PIP_COUNT,
|
||||
.time_sync_seconds = PIP_TIME_SYNC_SECONDS,
|
||||
.time_sync_seconds_offset = PIP_TIME_SYNC_OFFSET_SECONDS,
|
||||
.frequency = RADIO_SI5351_TX_FREQUENCY_PIP,
|
||||
.tx_power = RADIO_SI5351_TX_POWER,
|
||||
.symbol_rate = MORSE_WPM_TO_SYMBOL_RATE(PIP_SPEED_WPM),
|
||||
.payload_encoder = &radio_cw_payload_encoder,
|
||||
.fsk_encoder_api = &morse_fsk_encoder_api,
|
||||
},
|
||||
#endif
|
||||
#if RADIO_SI5351_TX_CW
|
||||
{
|
||||
.enabled = RADIO_SI5351_TX_CW,
|
||||
|
@ -389,6 +417,7 @@ static bool radio_start_transmit(radio_transmit_entry *entry)
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
// CW timing is not as critical
|
||||
enable_gps_during_transmit = true;
|
||||
|
||||
|
@ -540,6 +569,7 @@ static bool radio_stop_transmit(radio_transmit_entry *entry)
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
morse_encoder_destroy(&entry->fsk_encoder);
|
||||
break;
|
||||
case RADIO_DATA_MODE_RTTY:
|
||||
|
@ -815,6 +845,9 @@ void radio_init()
|
|||
case RADIO_DATA_MODE_CW:
|
||||
entry->messages = cw_message_templates;
|
||||
break;
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
entry->messages = pip_message_templates;
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
entry->messages = aprs_comment_templates;
|
||||
break;
|
||||
|
|
|
@ -14,6 +14,7 @@ typedef enum _radio_type {
|
|||
|
||||
typedef enum _radio_data_mode {
|
||||
RADIO_DATA_MODE_CW = 1,
|
||||
RADIO_DATA_MODE_PIP,
|
||||
RADIO_DATA_MODE_RTTY,
|
||||
RADIO_DATA_MODE_APRS_1200,
|
||||
RADIO_DATA_MODE_HORUS_V1,
|
||||
|
|
|
@ -45,6 +45,7 @@ bool radio_start_transmit_si4032(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
frequency_offset = 1;
|
||||
modulation_type = SI4032_MODULATION_TYPE_OOK;
|
||||
use_direct_mode = false;
|
||||
|
@ -96,6 +97,7 @@ bool radio_start_transmit_si4032(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
spi_uninit();
|
||||
system_disable_tick();
|
||||
si4032_use_sdi_pin(true);
|
||||
|
@ -127,6 +129,7 @@ static uint32_t radio_next_symbol_si4032(radio_transmit_entry *entry, radio_modu
|
|||
{
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
return 0;
|
||||
case RADIO_DATA_MODE_RTTY:
|
||||
return 0;
|
||||
|
@ -216,7 +219,8 @@ inline void radio_handle_data_timer_si4032()
|
|||
}
|
||||
|
||||
switch (radio_current_transmit_entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW: {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP: {
|
||||
cw_symbol_rate_multiplier--;
|
||||
if (cw_symbol_rate_multiplier > 0) {
|
||||
break;
|
||||
|
@ -274,6 +278,7 @@ bool radio_stop_transmit_si4032(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
si4032_use_sdi_pin(false);
|
||||
data_timer_uninit();
|
||||
spi_init();
|
||||
|
@ -302,6 +307,7 @@ bool radio_stop_transmit_si4032(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
system_enable_tick();
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
|
|
|
@ -22,6 +22,7 @@ bool radio_start_transmit_si5351(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
data_timer_init(entry->symbol_rate * CW_SYMBOL_RATE_MULTIPLIER);
|
||||
set_frequency_early = false;
|
||||
break;
|
||||
|
@ -50,6 +51,7 @@ bool radio_start_transmit_si5351(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
system_disable_tick();
|
||||
shared_state->radio_interrupt_transmit_active = true;
|
||||
// Setting the frequency turns on the output
|
||||
|
@ -70,6 +72,7 @@ bool radio_transmit_symbol_si5351(radio_transmit_entry *entry, radio_module_stat
|
|||
{
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
return false;
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
return false;
|
||||
|
@ -115,7 +118,8 @@ inline void radio_handle_data_timer_si5351()
|
|||
|
||||
// TODO: handle Si5351 errors
|
||||
switch (radio_current_transmit_entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW: {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP: {
|
||||
cw_symbol_rate_multiplier--;
|
||||
if (cw_symbol_rate_multiplier > 0) {
|
||||
break;
|
||||
|
@ -179,6 +183,7 @@ bool radio_stop_transmit_si5351(radio_transmit_entry *entry, radio_module_state
|
|||
{
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
break;
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
// use_fast_si5351 = true;
|
||||
|
@ -195,6 +200,7 @@ bool radio_stop_transmit_si5351(radio_transmit_entry *entry, radio_module_state
|
|||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
data_timer_uninit();
|
||||
system_enable_tick();
|
||||
break;
|
||||
|
|
Ładowanie…
Reference in New Issue