kopia lustrzana https://github.com/eleccoder/raspi-pico-aprs-tnc
Proper single shot/loop mode
rodzic
a41768fd53
commit
113778cbf5
|
@ -27,12 +27,18 @@
|
|||
|
||||
|
||||
// WARNING: ATTOW, the pico audio PWM lib worked only @ 22050 Hz sampling frequency and 48 MHz system clock
|
||||
// This is documented here https://github.com/raspberrypi/pico-extras
|
||||
// This is documented here: https://github.com/raspberrypi/pico-extras
|
||||
#define PICO_EXTRA_AUDIO_PWM_LIB_FIXED_SAMPLE_FREQ_IN_HZ (22050)
|
||||
#define SEND_LOOP_DEBUG (0) // For test & debug
|
||||
#define SINE_WAVE_TEST (0) // For test & debug
|
||||
|
||||
|
||||
typedef struct AudioCallBackUserData
|
||||
{
|
||||
uint aprs_sample_freq_in_hz;
|
||||
bool is_loop;
|
||||
|
||||
} AudioCallBackUserData_t;
|
||||
|
||||
|
||||
audio_buffer_pool_t* init_audio(uint sample_freq_in_hz, uint16_t audio_buffer_format)
|
||||
{
|
||||
|
@ -65,7 +71,7 @@ audio_buffer_pool_t* init_audio(uint sample_freq_in_hz, uint16_t audio_buffer_fo
|
|||
static void init(uint sample_freq_in_hz)
|
||||
{
|
||||
// WARNING: ATTOW, the pico audio PWM lib worked only @ 22050 Hz sampling frequency and 48 MHz system clock
|
||||
// This is documented here https://github.com/raspberrypi/pico-extras
|
||||
// This is documented here: https://github.com/raspberrypi/pico-extras
|
||||
|
||||
if (sample_freq_in_hz == PICO_EXTRA_AUDIO_PWM_LIB_FIXED_SAMPLE_FREQ_IN_HZ)
|
||||
{
|
||||
|
@ -89,15 +95,18 @@ static void init(uint sample_freq_in_hz)
|
|||
}
|
||||
|
||||
|
||||
static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pcm_data, uint num_samples)
|
||||
static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pcm_data,
|
||||
uint num_samples, bool is_loop_forever)
|
||||
{
|
||||
uint pos = 0u;
|
||||
const uint8_t volume = 128u;
|
||||
|
||||
while (true)
|
||||
bool is_keep_going = true;
|
||||
|
||||
while (is_keep_going)
|
||||
{
|
||||
audio_buffer_t* buffer = take_audio_buffer(audio_pool, true);
|
||||
int16_t* samples = (int16_t*)buffer->buffer->bytes;
|
||||
audio_buffer_t* buffer = take_audio_buffer(audio_pool, true);
|
||||
int16_t* samples = (int16_t*)buffer->buffer->bytes;
|
||||
|
||||
for (uint i = 0u; i < buffer->max_sample_count; i++)
|
||||
{
|
||||
|
@ -106,7 +115,15 @@ static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pc
|
|||
|
||||
if (pos == num_samples)
|
||||
{
|
||||
pos = 0u;
|
||||
if (is_loop_forever)
|
||||
{
|
||||
pos = 0u;
|
||||
}
|
||||
else
|
||||
{
|
||||
is_keep_going = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -138,49 +155,40 @@ static void send1kHz(uint sample_freq_in_hz)
|
|||
|
||||
audio_buffer_pool_t* audio_pool = init_audio(sample_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
|
||||
|
||||
while (true)
|
||||
{
|
||||
fill_audio_buffer(audio_pool, sine_wave_table, num_samples);
|
||||
}
|
||||
fill_audio_buffer(audio_pool, sine_wave_table, num_samples, true);
|
||||
|
||||
free(sine_wave_table);
|
||||
}
|
||||
|
||||
|
||||
static void sendAPRS_audioCallback(void* user_data, int16_t* pcm_data, size_t num_samples)
|
||||
static void sendAPRS_audioCallback(void* callback_user_data, int16_t* pcm_data, size_t num_samples)
|
||||
{
|
||||
const uint aprs_sampl_freq_in_hz = *((const uint*)user_data);
|
||||
const AudioCallBackUserData_t user_data = *((const AudioCallBackUserData_t*)callback_user_data);
|
||||
|
||||
audio_buffer_pool_t* audio_pool = init_audio(aprs_sampl_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
|
||||
audio_buffer_pool_t* audio_pool = init_audio(user_data.aprs_sample_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
|
||||
|
||||
#if (SEND_LOOP_DEBUG == 1)
|
||||
while (true)
|
||||
{
|
||||
#endif // SEND_LOOP_DEBUG
|
||||
|
||||
fill_audio_buffer(audio_pool, pcm_data, num_samples);
|
||||
|
||||
#if (SEND_LOOP_DEBUG == 1)
|
||||
}
|
||||
#endif // SEND_LOOP_DEBUG
|
||||
fill_audio_buffer(audio_pool, pcm_data, num_samples, user_data.is_loop);
|
||||
}
|
||||
|
||||
|
||||
static void sendAPRS(const char* call_sign_src,
|
||||
const char* call_sign_dst,
|
||||
const char* aprs_path_1,
|
||||
const char* aprs_path_2,
|
||||
const char* aprs_message,
|
||||
static void sendAPRS(const char* call_sign_src,
|
||||
const char* call_sign_dst,
|
||||
const char* aprs_path_1,
|
||||
const char* aprs_path_2,
|
||||
const char* aprs_message,
|
||||
const double latitude_in_deg,
|
||||
const double longitude_in_deg,
|
||||
const double altitude_in_m)
|
||||
const double altitude_in_m,
|
||||
const bool is_loop)
|
||||
{
|
||||
// Known from the 'ax25beacon' library
|
||||
static const uint APRS_SAMPL_FREQ_IN_HZ = 48000u;
|
||||
static AudioCallBackUserData_t callback_user_data;
|
||||
|
||||
init(APRS_SAMPL_FREQ_IN_HZ);
|
||||
callback_user_data.aprs_sample_freq_in_hz = 48000u; // Known from the 'ax25beacon' library
|
||||
callback_user_data.is_loop = is_loop;
|
||||
|
||||
ax25_beacon((void*)&APRS_SAMPL_FREQ_IN_HZ, // User data
|
||||
init(callback_user_data.aprs_sample_freq_in_hz);
|
||||
|
||||
ax25_beacon((void*)&callback_user_data,
|
||||
sendAPRS_audioCallback,
|
||||
call_sign_src,
|
||||
call_sign_dst,
|
||||
|
@ -210,8 +218,8 @@ int main()
|
|||
"Test message",
|
||||
10.0, // Lat in deg
|
||||
20.0, // Long in deg
|
||||
100.0 // Alt in m
|
||||
);
|
||||
100.0, // Alt in m
|
||||
false); // Loop forever
|
||||
|
||||
#endif // SINE_WAVE_TEST, !SINE_WAVE_TEST
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue