UHSDR/UHSDR-active-devel/mchf-eclipse/drivers/audio/freedv_uhsdr.h
2022-11-08 16:13:55 +01:00

135 lines
4.3 KiB
C

#ifndef __freedv_mchf__
#define __freedv_mchf__
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** mcHF QRP Transceiver **
** K Atanassov - M0NKA 2014 **
** **
**---------------------------------------------------------------------------------**
** **
** File name: **
** Description: **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
#include "uhsdr_types.h"
#include "uhsdr_board.h"
#include "uhsdr_board_config.h"
#include "comp.h"
#if defined(USE_FREEDV_700D)
#define FDV_MAX_IQ_FRAME_LEN_MS 160
#define FREEDV_MODE_UHSDR FREEDV_MODE_700D
#elif defined(USE_FREEDV_1600)
#define FDV_MAX_IQ_FRAME_LEN_MS 40
#define FREEDV_MODE_UHSDR FREEDV_MODE_1600
#endif
// one need to set this to the highest frame length to be intended to use
// FreeDV 700D requires 1280 samples for the 160ms frame, the audio size may be larger depending
// on the algorithm
// TODO: Explicitly list the variables in FreeDV to look at.
#include "rb.h"
typedef struct
{
int16_t real;
int16_t imag;
} COMP_int16_t;
RingBuffer_Declare(fdv_iq_rb, COMP_int16_t)
RingBuffer_Declare(fdv_audio_rb, int16_t)
RingBuffer_Declare(fdv_demod_rb, int16_t)
#define FDV_BUFFER_SIZE (FDV_MAX_IQ_FRAME_LEN_MS*8) // (160ms*8samples per ms)
#define NR_BUFFER_NUM 4
#define NR_BUFFER_SIZE 256 // 4*256*8 -> 8192
typedef struct {
COMP samples[NR_BUFFER_SIZE];
} NR_Buffer;
typedef union
{
fdv_demod_rb_item_t fdv_demod_buff[(FDV_BUFFER_SIZE * 3) + IQ_BLOCK_SIZE];
fdv_iq_rb_item_t fdv_iq_buff[(FDV_BUFFER_SIZE * 2) + IQ_BLOCK_SIZE];
NR_Buffer nr_audio_buff[NR_BUFFER_NUM];
} MultiModeBuffer_t;
#ifdef USE_FREEDV
#ifdef DEBUG_FREEDV
#define FREEDV_TEST_BUFFER_FRAME_COUNT 50
#define FREEDV_TEST_BUFFER_FRAME_SIZE 320
extern const COMP test_buffer[FREEDV_TEST_BUFFER_FRAME_SIZE*FREEDV_TEST_BUFFER_FRAME_COUNT];
#endif
#define FREEDV_TX_MESSAGE " CQ CQ CQ UHSDR " TRX_NAME " SDR with integrated FreeDV codec calling!"
#define FREEDV_TX_DF8OE_MESSAGE " DF8OE JO42jr using UHSDR " TRX_NAME " SDR with integrated FreeDV codec"
typedef struct {
char* name;
char* label;
uint8_t freedv_id;
} freedv_mode_desc_t;
extern freedv_mode_desc_t freedv_modes[];
extern const uint8_t freedv_modes_num;
typedef struct {
#define FDV_SQUELCH_OFF 0
#define FDV_SQUELCH_OFFSET (-100)
#define FDV_SQUELCH_MIN (-99-FDV_SQUELCH_OFFSET) // equals -99 SNR
#define FDV_SQUELCH_MAX (99-FDV_SQUELCH_OFFSET) // equals 99 SNR
#define FDV_SQUELCH_DEFAULT (-2-FDV_SQUELCH_OFFSET) // equals -2 SNR
uint8_t squelch_snr_thresh;
uint8_t mode;
bool mute_if_squelched;
} freedv_conf_t;
extern freedv_conf_t freedv_conf;
void FreeDv_HandleFreeDv(void);
void FreeDV_Init(void);
int32_t FreeDV_SetMode(uint8_t fdv_mode, int32_t firstTime);
void FreeDV_Test(void);
int32_t FreeDV_Iq_Get_FrameLen(void);
int32_t FreeDV_Audio_Get_FrameLen(void);
void FreeDv_DisplayClear(void);
void FreeDv_DisplayPrepare(void);
void FreeDv_DisplayUpdate(void);
int32_t FreeDV_Get_Squelch_SNR(freedv_conf_t* freedv_conf_p);
void FreeDV_Set_Squelch_SNR(freedv_conf_t* freedv_conf_p, int8_t squelch_snr);
int FreeDV_Is_Squelch_Enable(freedv_conf_t* freedv_conf_p);
void FreeDV_Squelch_Update(freedv_conf_t* freedv_conf_p);
#endif
#if defined(USE_FREEDV) || defined(USE_ALTERNATE_NR)
extern MultiModeBuffer_t mmb;
// we allow for one more pointer to a buffer as we have buffers
// why? because our implementation will only fill up the fifo only to N-1 elements
#define FDV_BUFFER_IQ_FIFO_SIZE (FDV_BUFFER_IQ_NUM+1)
#define NR_BUFFER_FIFO_SIZE (NR_BUFFER_NUM+1)
#endif
#endif