mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-04 16:01:14 -05:00
CRLF problem
This commit is contained in:
parent
69be1d59ee
commit
1ace1f58d0
@ -1,325 +1,325 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include "devicelimesdr.h"
|
||||
|
||||
bool DeviceLimeSDR::setNCOFrequency(lms_device_t *device, bool dir_tx, std::size_t chan, bool enable, float frequency)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
bool positive;
|
||||
float_type freqs[LMS_NCO_VAL_COUNT];
|
||||
float_type phos[LMS_NCO_VAL_COUNT];
|
||||
|
||||
if (LMS_GetNCOFrequency(device, dir_tx, chan, freqs, phos) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot get NCO frequencies and phases\n");
|
||||
}
|
||||
|
||||
if (frequency < 0)
|
||||
{
|
||||
positive = false;
|
||||
frequency = -frequency;
|
||||
}
|
||||
else
|
||||
{
|
||||
positive = true;
|
||||
}
|
||||
|
||||
freqs[0] = frequency;
|
||||
|
||||
if (LMS_SetNCOFrequency(device, dir_tx, chan, freqs, 0.0f) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot set frequency to %f\n", frequency);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LMS_SetNCOIndex(device, dir_tx, chan, 0, !positive) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot set conversion direction %sfreq\n", positive ? "+" : "-");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LMS_SetNCOIndex(device, dir_tx, chan, LMS_NCO_VAL_COUNT, true) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot disable NCO\n");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: NCO disabled\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRFELNA_dB(lms_device_t *device, std::size_t chan, int value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value > 30) {
|
||||
value = 30;
|
||||
}
|
||||
|
||||
int val = value - 30;
|
||||
|
||||
int g_lna_rfe = 0;
|
||||
if (val >= 0) g_lna_rfe = 15;
|
||||
else if (val >= -1) g_lna_rfe = 14;
|
||||
else if (val >= -2) g_lna_rfe = 13;
|
||||
else if (val >= -3) g_lna_rfe = 12;
|
||||
else if (val >= -4) g_lna_rfe = 11;
|
||||
else if (val >= -5) g_lna_rfe = 10;
|
||||
else if (val >= -6) g_lna_rfe = 9;
|
||||
else if (val >= -9) g_lna_rfe = 8;
|
||||
else if (val >= -12) g_lna_rfe = 7;
|
||||
else if (val >= -15) g_lna_rfe = 6;
|
||||
else if (val >= -18) g_lna_rfe = 5;
|
||||
else if (val >= -21) g_lna_rfe = 4;
|
||||
else if (val >= -24) g_lna_rfe = 3;
|
||||
else if (val >= -27) g_lna_rfe = 2;
|
||||
else g_lna_rfe = 1;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_LNA_RFE), g_lna_rfe) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set LNA gain to %d (%d)\n", value, g_lna_rfe);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRFETIA_dB(lms_device_t *device, std::size_t chan, int value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFETIA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value > 3) {
|
||||
value = 3;
|
||||
} else if (value < 1) {
|
||||
value = 1;
|
||||
}
|
||||
|
||||
int g_tia_rfe = value;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_TIA_RFE), g_tia_rfe) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set TIA gain to %d (%d)\n", value, g_tia_rfe);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRBBPGA_dB(lms_device_t *device, std::size_t chan, float value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
int g_pga_rbb = (int)(value + 12.5);
|
||||
if (g_pga_rbb > 0x1f) g_pga_rbb = 0x1f;
|
||||
if (g_pga_rbb < 0) g_pga_rbb = 0;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_PGA_RBB), g_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set G_PGA_RBB to %d\n", g_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
int rcc_ctl_pga_rbb = (430.0*pow(0.65, (g_pga_rbb/10.0))-110.35)/20.4516 + 16;
|
||||
|
||||
int c_ctl_pga_rbb = 0;
|
||||
if (0 <= g_pga_rbb && g_pga_rbb < 8) c_ctl_pga_rbb = 3;
|
||||
if (8 <= g_pga_rbb && g_pga_rbb < 13) c_ctl_pga_rbb = 2;
|
||||
if (13 <= g_pga_rbb && g_pga_rbb < 21) c_ctl_pga_rbb = 1;
|
||||
if (21 <= g_pga_rbb) c_ctl_pga_rbb = 0;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(RCC_CTL_PGA_RBB), rcc_ctl_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set RCC_CTL_PGA_RBB to %d\n", rcc_ctl_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set C_CTL_PGA_RBB to %d\n", c_ctl_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::setRxAntennaPath(lms_device_t *device, std::size_t chan, int path)
|
||||
{
|
||||
// if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot set channel to #%lu\n", chan);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// int sel_path_rfe = 0;
|
||||
// switch ((PathRFE) path)
|
||||
// {
|
||||
// case PATH_RFE_NONE: sel_path_rfe = 0; break;
|
||||
// case PATH_RFE_LNAH: sel_path_rfe = 1; break;
|
||||
// case PATH_RFE_LNAL: sel_path_rfe = 2; break;
|
||||
// case PATH_RFE_LNAW: sel_path_rfe = 3; break;
|
||||
// case PATH_RFE_LB1: sel_path_rfe = 3; break;
|
||||
// case PATH_RFE_LB2: sel_path_rfe = 2; break;
|
||||
// }
|
||||
//
|
||||
// int pd_lna_rfe = 1;
|
||||
// switch ((PathRFE) path)
|
||||
// {
|
||||
// case PATH_RFE_LNAH:
|
||||
// case PATH_RFE_LNAL:
|
||||
// case PATH_RFE_LNAW: pd_lna_rfe = 0; break;
|
||||
// default: break;
|
||||
// }
|
||||
//
|
||||
// int pd_rloopb_1_rfe = (path == (int) PATH_RFE_LB1) ? 0 : 1;
|
||||
// int pd_rloopb_2_rfe = (path == (int) PATH_RFE_LB2) ? 0 : 1;
|
||||
// int en_inshsw_l_rfe = (path == (int) PATH_RFE_LNAL ) ? 0 : 1;
|
||||
// int en_inshsw_w_rfe = (path == (int) PATH_RFE_LNAW) ? 0 : 1;
|
||||
// int en_inshsw_lb1_rfe = (path == (int) PATH_RFE_LB1) ? 0 : 1;
|
||||
// int en_inshsw_lb2_rfe = (path == (int) PATH_RFE_LB2) ? 0 : 1;
|
||||
//
|
||||
// int ret = 0;
|
||||
//
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_LNA_RFE), pd_lna_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_RLOOPB_1_RFE), pd_rloopb_1_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_RLOOPB_2_RFE), pd_rloopb_2_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_LB1_RFE), en_inshsw_lb1_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_LB2_RFE), en_inshsw_lb2_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_L_RFE), en_inshsw_l_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_W_RFE), en_inshsw_w_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(SEL_PATH_RFE), sel_path_rfe);
|
||||
//
|
||||
// if (ret < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot set channel #%lu to %d\n", chan, path);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// //enable/disable the loopback path
|
||||
// const bool loopback = (path == (int) PATH_RFE_LB1) or (path == (int) PATH_RFE_LB2);
|
||||
//
|
||||
// if (LMS_WriteParam(device, LMS7param(EN_LOOPB_TXPAD_TRF), loopback ? 1 : 0) < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot %sset loopback on channel #%lu\n", loopback ? "" : "re", chan);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// //update external band-selection to match
|
||||
// //this->UpdateExternalBandSelect();
|
||||
//
|
||||
// return true;
|
||||
|
||||
switch ((PathRxRFE) path)
|
||||
{
|
||||
case PATH_RFE_LNAH:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAH\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LNAL:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAL\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LNAW:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 3) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAW\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LB1:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to Loopback TX1\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LB2:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to Loopback TX2\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_RX_NONE:
|
||||
default:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 0) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to none\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::setTxAntennaPath(lms_device_t *device, std::size_t chan, int path)
|
||||
{
|
||||
switch ((PathTxRFE) path)
|
||||
{
|
||||
case PATH_RFE_TXRF1:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to TXRF1\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_TXRF2:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to TXRF2\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_TX_NONE:
|
||||
default:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 0) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to none\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include "devicelimesdr.h"
|
||||
|
||||
bool DeviceLimeSDR::setNCOFrequency(lms_device_t *device, bool dir_tx, std::size_t chan, bool enable, float frequency)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
bool positive;
|
||||
float_type freqs[LMS_NCO_VAL_COUNT];
|
||||
float_type phos[LMS_NCO_VAL_COUNT];
|
||||
|
||||
if (LMS_GetNCOFrequency(device, dir_tx, chan, freqs, phos) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot get NCO frequencies and phases\n");
|
||||
}
|
||||
|
||||
if (frequency < 0)
|
||||
{
|
||||
positive = false;
|
||||
frequency = -frequency;
|
||||
}
|
||||
else
|
||||
{
|
||||
positive = true;
|
||||
}
|
||||
|
||||
freqs[0] = frequency;
|
||||
|
||||
if (LMS_SetNCOFrequency(device, dir_tx, chan, freqs, 0.0f) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot set frequency to %f\n", frequency);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LMS_SetNCOIndex(device, dir_tx, chan, 0, !positive) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot set conversion direction %sfreq\n", positive ? "+" : "-");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LMS_SetNCOIndex(device, dir_tx, chan, LMS_NCO_VAL_COUNT, true) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: cannot disable NCO\n");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setNCOFrequency: NCO disabled\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRFELNA_dB(lms_device_t *device, std::size_t chan, int value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value > 30) {
|
||||
value = 30;
|
||||
}
|
||||
|
||||
int val = value - 30;
|
||||
|
||||
int g_lna_rfe = 0;
|
||||
if (val >= 0) g_lna_rfe = 15;
|
||||
else if (val >= -1) g_lna_rfe = 14;
|
||||
else if (val >= -2) g_lna_rfe = 13;
|
||||
else if (val >= -3) g_lna_rfe = 12;
|
||||
else if (val >= -4) g_lna_rfe = 11;
|
||||
else if (val >= -5) g_lna_rfe = 10;
|
||||
else if (val >= -6) g_lna_rfe = 9;
|
||||
else if (val >= -9) g_lna_rfe = 8;
|
||||
else if (val >= -12) g_lna_rfe = 7;
|
||||
else if (val >= -15) g_lna_rfe = 6;
|
||||
else if (val >= -18) g_lna_rfe = 5;
|
||||
else if (val >= -21) g_lna_rfe = 4;
|
||||
else if (val >= -24) g_lna_rfe = 3;
|
||||
else if (val >= -27) g_lna_rfe = 2;
|
||||
else g_lna_rfe = 1;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_LNA_RFE), g_lna_rfe) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set LNA gain to %d (%d)\n", value, g_lna_rfe);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRFETIA_dB(lms_device_t *device, std::size_t chan, int value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFETIA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value > 3) {
|
||||
value = 3;
|
||||
} else if (value < 1) {
|
||||
value = 1;
|
||||
}
|
||||
|
||||
int g_tia_rfe = value;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_TIA_RFE), g_tia_rfe) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRFELNA_dB: cannot set TIA gain to %d (%d)\n", value, g_tia_rfe);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::SetRBBPGA_dB(lms_device_t *device, std::size_t chan, float value)
|
||||
{
|
||||
if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set channel to #%lu\n", chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
int g_pga_rbb = (int)(value + 12.5);
|
||||
if (g_pga_rbb > 0x1f) g_pga_rbb = 0x1f;
|
||||
if (g_pga_rbb < 0) g_pga_rbb = 0;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(G_PGA_RBB), g_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set G_PGA_RBB to %d\n", g_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
int rcc_ctl_pga_rbb = (430.0*pow(0.65, (g_pga_rbb/10.0))-110.35)/20.4516 + 16;
|
||||
|
||||
int c_ctl_pga_rbb = 0;
|
||||
if (0 <= g_pga_rbb && g_pga_rbb < 8) c_ctl_pga_rbb = 3;
|
||||
if (8 <= g_pga_rbb && g_pga_rbb < 13) c_ctl_pga_rbb = 2;
|
||||
if (13 <= g_pga_rbb && g_pga_rbb < 21) c_ctl_pga_rbb = 1;
|
||||
if (21 <= g_pga_rbb) c_ctl_pga_rbb = 0;
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(RCC_CTL_PGA_RBB), rcc_ctl_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set RCC_CTL_PGA_RBB to %d\n", rcc_ctl_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LMS_WriteParam(device, LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::SetRBBPGA_dB: cannot set C_CTL_PGA_RBB to %d\n", c_ctl_pga_rbb);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::setRxAntennaPath(lms_device_t *device, std::size_t chan, int path)
|
||||
{
|
||||
// if (LMS_WriteParam(device, LMS7param(MAC), chan+1) < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot set channel to #%lu\n", chan);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// int sel_path_rfe = 0;
|
||||
// switch ((PathRFE) path)
|
||||
// {
|
||||
// case PATH_RFE_NONE: sel_path_rfe = 0; break;
|
||||
// case PATH_RFE_LNAH: sel_path_rfe = 1; break;
|
||||
// case PATH_RFE_LNAL: sel_path_rfe = 2; break;
|
||||
// case PATH_RFE_LNAW: sel_path_rfe = 3; break;
|
||||
// case PATH_RFE_LB1: sel_path_rfe = 3; break;
|
||||
// case PATH_RFE_LB2: sel_path_rfe = 2; break;
|
||||
// }
|
||||
//
|
||||
// int pd_lna_rfe = 1;
|
||||
// switch ((PathRFE) path)
|
||||
// {
|
||||
// case PATH_RFE_LNAH:
|
||||
// case PATH_RFE_LNAL:
|
||||
// case PATH_RFE_LNAW: pd_lna_rfe = 0; break;
|
||||
// default: break;
|
||||
// }
|
||||
//
|
||||
// int pd_rloopb_1_rfe = (path == (int) PATH_RFE_LB1) ? 0 : 1;
|
||||
// int pd_rloopb_2_rfe = (path == (int) PATH_RFE_LB2) ? 0 : 1;
|
||||
// int en_inshsw_l_rfe = (path == (int) PATH_RFE_LNAL ) ? 0 : 1;
|
||||
// int en_inshsw_w_rfe = (path == (int) PATH_RFE_LNAW) ? 0 : 1;
|
||||
// int en_inshsw_lb1_rfe = (path == (int) PATH_RFE_LB1) ? 0 : 1;
|
||||
// int en_inshsw_lb2_rfe = (path == (int) PATH_RFE_LB2) ? 0 : 1;
|
||||
//
|
||||
// int ret = 0;
|
||||
//
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_LNA_RFE), pd_lna_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_RLOOPB_1_RFE), pd_rloopb_1_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(PD_RLOOPB_2_RFE), pd_rloopb_2_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_LB1_RFE), en_inshsw_lb1_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_LB2_RFE), en_inshsw_lb2_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_L_RFE), en_inshsw_l_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(EN_INSHSW_W_RFE), en_inshsw_w_rfe);
|
||||
// ret += LMS_WriteParam(device, LMS7param(SEL_PATH_RFE), sel_path_rfe);
|
||||
//
|
||||
// if (ret < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot set channel #%lu to %d\n", chan, path);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// //enable/disable the loopback path
|
||||
// const bool loopback = (path == (int) PATH_RFE_LB1) or (path == (int) PATH_RFE_LB2);
|
||||
//
|
||||
// if (LMS_WriteParam(device, LMS7param(EN_LOOPB_TXPAD_TRF), loopback ? 1 : 0) < 0)
|
||||
// {
|
||||
// fprintf(stderr, "DeviceLimeSDR::setAntennaPath: cannot %sset loopback on channel #%lu\n", loopback ? "" : "re", chan);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// //update external band-selection to match
|
||||
// //this->UpdateExternalBandSelect();
|
||||
//
|
||||
// return true;
|
||||
|
||||
switch ((PathRxRFE) path)
|
||||
{
|
||||
case PATH_RFE_LNAH:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAH\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LNAL:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAL\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LNAW:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 3) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to LNAW\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LB1:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to Loopback TX1\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_LB2:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to Loopback TX2\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_RX_NONE:
|
||||
default:
|
||||
if (LMS_SetAntenna(device, LMS_CH_RX, chan, 0) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setRxAntennaPath: cannot set to none\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeviceLimeSDR::setTxAntennaPath(lms_device_t *device, std::size_t chan, int path)
|
||||
{
|
||||
switch ((PathTxRFE) path)
|
||||
{
|
||||
case PATH_RFE_TXRF1:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 1) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to TXRF1\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_TXRF2:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 2) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to TXRF2\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case PATH_RFE_TX_NONE:
|
||||
default:
|
||||
if (LMS_SetAntenna(device, LMS_CH_TX, chan, 0) < 0)
|
||||
{
|
||||
fprintf(stderr, "DeviceLimeSDR::setTxAntennaPath: cannot set to none\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1,56 +1,56 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef DEVICES_LIMESDR_DEVICELIMESDR_H_
|
||||
#define DEVICES_LIMESDR_DEVICELIMESDR_H_
|
||||
|
||||
#include "lime/LimeSuite.h"
|
||||
|
||||
class DeviceLimeSDR
|
||||
{
|
||||
public:
|
||||
enum PathRxRFE
|
||||
{
|
||||
PATH_RFE_RX_NONE = 0,
|
||||
PATH_RFE_LNAH,
|
||||
PATH_RFE_LNAL,
|
||||
PATH_RFE_LNAW,
|
||||
PATH_RFE_LB1,
|
||||
PATH_RFE_LB2
|
||||
};
|
||||
|
||||
enum PathTxRFE
|
||||
{
|
||||
PATH_RFE_TX_NONE = 0,
|
||||
PATH_RFE_TXRF1,
|
||||
PATH_RFE_TXRF2,
|
||||
};
|
||||
|
||||
/** set NCO frequency with positive or negative frequency (deals with up/down convert). Enables or disables NCO */
|
||||
static bool setNCOFrequency(lms_device_t *device, bool dir_tx, std::size_t chan, bool enable, float frequency);
|
||||
/** set LNA gain Range: [1-30] (dB) **/
|
||||
static bool SetRFELNA_dB(lms_device_t *device, std::size_t chan, int value);
|
||||
/** set TIA gain Range: [1-3] **/
|
||||
static bool SetRFETIA_dB(lms_device_t *device, std::size_t chan, int value);
|
||||
/** set PGA gain Range: [0-32] (dB) **/
|
||||
static bool SetRBBPGA_dB(lms_device_t *device, std::size_t chan, float value);
|
||||
/** Set Rx antenna path **/
|
||||
static bool setRxAntennaPath(lms_device_t *device, std::size_t chan, int path);
|
||||
/** Set Tx antenna path **/
|
||||
static bool setTxAntennaPath(lms_device_t *device, std::size_t chan, int path);
|
||||
};
|
||||
|
||||
#endif /* DEVICES_LIMESDR_DEVICELIMESDR_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef DEVICES_LIMESDR_DEVICELIMESDR_H_
|
||||
#define DEVICES_LIMESDR_DEVICELIMESDR_H_
|
||||
|
||||
#include "lime/LimeSuite.h"
|
||||
|
||||
class DeviceLimeSDR
|
||||
{
|
||||
public:
|
||||
enum PathRxRFE
|
||||
{
|
||||
PATH_RFE_RX_NONE = 0,
|
||||
PATH_RFE_LNAH,
|
||||
PATH_RFE_LNAL,
|
||||
PATH_RFE_LNAW,
|
||||
PATH_RFE_LB1,
|
||||
PATH_RFE_LB2
|
||||
};
|
||||
|
||||
enum PathTxRFE
|
||||
{
|
||||
PATH_RFE_TX_NONE = 0,
|
||||
PATH_RFE_TXRF1,
|
||||
PATH_RFE_TXRF2,
|
||||
};
|
||||
|
||||
/** set NCO frequency with positive or negative frequency (deals with up/down convert). Enables or disables NCO */
|
||||
static bool setNCOFrequency(lms_device_t *device, bool dir_tx, std::size_t chan, bool enable, float frequency);
|
||||
/** set LNA gain Range: [1-30] (dB) **/
|
||||
static bool SetRFELNA_dB(lms_device_t *device, std::size_t chan, int value);
|
||||
/** set TIA gain Range: [1-3] **/
|
||||
static bool SetRFETIA_dB(lms_device_t *device, std::size_t chan, int value);
|
||||
/** set PGA gain Range: [0-32] (dB) **/
|
||||
static bool SetRBBPGA_dB(lms_device_t *device, std::size_t chan, float value);
|
||||
/** Set Rx antenna path **/
|
||||
static bool setRxAntennaPath(lms_device_t *device, std::size_t chan, int path);
|
||||
/** Set Tx antenna path **/
|
||||
static bool setTxAntennaPath(lms_device_t *device, std::size_t chan, int path);
|
||||
};
|
||||
|
||||
#endif /* DEVICES_LIMESDR_DEVICELIMESDR_H_ */
|
||||
|
@ -1,70 +1,70 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_
|
||||
#define DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_
|
||||
|
||||
#include "lime/LimeSuite.h"
|
||||
|
||||
/**
|
||||
* This structure refers to one physical device shared among parties (logical devices represented by
|
||||
* the DeviceSinkAPI or DeviceSourceAPI).
|
||||
* It allows storing information on the common resources in one place and is shared among participants.
|
||||
* There is only one copy that is constructed by the first participant and destroyed by the last.
|
||||
* A participant knows it is the first or last by checking the lists of buddies (Rx + Tx).
|
||||
*/
|
||||
struct DeviceLimeSDRParams
|
||||
{
|
||||
lms_device_t *m_dev; //!< device handle
|
||||
uint32_t m_nbRxChannels; //!< number of Rx channels (normally 2, we'll see if we really use it...)
|
||||
uint32_t m_nbTxChannels; //!< number of Tx channels (normally 2, we'll see if we really use it...)
|
||||
lms_range_t m_lpfRangeRx; //!< Low pass filter range information (Rx side)
|
||||
lms_range_t m_lpfRangeTx; //!< Low pass filter range information (Tx side)
|
||||
lms_range_t m_loRangeRx; //!< LO range for Rx
|
||||
lms_range_t m_loRangeTx; //!< LO range for Tx
|
||||
lms_range_t m_srRangeRx; //!< ADC sample rate range
|
||||
lms_range_t m_srRangeTx; //!< DAC sample rate range
|
||||
float m_sampleRate; //!< ADC/DAC sample rate
|
||||
int m_log2OvSRRx; //!< log2 of Rx oversampling (0..5)
|
||||
int m_log2OvSRTx; //!< log2 of Tx oversampling (0..5)
|
||||
float m_rxFrequency; //!< Rx frequency
|
||||
float m_txFrequency; //!< Tx frequency
|
||||
|
||||
DeviceLimeSDRParams() :
|
||||
m_dev(0),
|
||||
m_nbRxChannels(0),
|
||||
m_nbTxChannels(0),
|
||||
m_sampleRate(1e6),
|
||||
m_log2OvSRRx(0),
|
||||
m_log2OvSRTx(0),
|
||||
m_rxFrequency(1e6),
|
||||
m_txFrequency(1e6)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens and initialize the device and obtain information (# channels, ranges, ...)
|
||||
*/
|
||||
bool open(lms_info_str_t deviceStr);
|
||||
void close();
|
||||
lms_device_t *getDevice() { return m_dev; }
|
||||
|
||||
~DeviceLimeSDRParams()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_
|
||||
#define DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_
|
||||
|
||||
#include "lime/LimeSuite.h"
|
||||
|
||||
/**
|
||||
* This structure refers to one physical device shared among parties (logical devices represented by
|
||||
* the DeviceSinkAPI or DeviceSourceAPI).
|
||||
* It allows storing information on the common resources in one place and is shared among participants.
|
||||
* There is only one copy that is constructed by the first participant and destroyed by the last.
|
||||
* A participant knows it is the first or last by checking the lists of buddies (Rx + Tx).
|
||||
*/
|
||||
struct DeviceLimeSDRParams
|
||||
{
|
||||
lms_device_t *m_dev; //!< device handle
|
||||
uint32_t m_nbRxChannels; //!< number of Rx channels (normally 2, we'll see if we really use it...)
|
||||
uint32_t m_nbTxChannels; //!< number of Tx channels (normally 2, we'll see if we really use it...)
|
||||
lms_range_t m_lpfRangeRx; //!< Low pass filter range information (Rx side)
|
||||
lms_range_t m_lpfRangeTx; //!< Low pass filter range information (Tx side)
|
||||
lms_range_t m_loRangeRx; //!< LO range for Rx
|
||||
lms_range_t m_loRangeTx; //!< LO range for Tx
|
||||
lms_range_t m_srRangeRx; //!< ADC sample rate range
|
||||
lms_range_t m_srRangeTx; //!< DAC sample rate range
|
||||
float m_sampleRate; //!< ADC/DAC sample rate
|
||||
int m_log2OvSRRx; //!< log2 of Rx oversampling (0..5)
|
||||
int m_log2OvSRTx; //!< log2 of Tx oversampling (0..5)
|
||||
float m_rxFrequency; //!< Rx frequency
|
||||
float m_txFrequency; //!< Tx frequency
|
||||
|
||||
DeviceLimeSDRParams() :
|
||||
m_dev(0),
|
||||
m_nbRxChannels(0),
|
||||
m_nbTxChannels(0),
|
||||
m_sampleRate(1e6),
|
||||
m_log2OvSRRx(0),
|
||||
m_log2OvSRTx(0),
|
||||
m_rxFrequency(1e6),
|
||||
m_txFrequency(1e6)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens and initialize the device and obtain information (# channels, ranges, ...)
|
||||
*/
|
||||
bool open(lms_info_str_t deviceStr);
|
||||
void close();
|
||||
lms_device_t *getDevice() { return m_dev; }
|
||||
|
||||
~DeviceLimeSDRParams()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* DEVICES_LIMESDR_DEVICELIMESDRPARAM_H_ */
|
||||
|
@ -1,25 +1,25 @@
|
||||
#--------------------------------------------------------
|
||||
#
|
||||
# Pro file for Android and Windows builds with Qt Creator
|
||||
#
|
||||
#--------------------------------------------------------
|
||||
|
||||
QT += core
|
||||
|
||||
TEMPLATE = lib
|
||||
TARGET = libsqlite3
|
||||
|
||||
CONFIG(MINGW32):LIBSQLITE3SRC = "."
|
||||
CONFIG(MINGW64):LIBSQLITE3SRC = "."
|
||||
|
||||
CONFIG(MINGW32):INCLUDEPATH += "src"
|
||||
CONFIG(MINGW64):INCLUDEPATH += "src"
|
||||
|
||||
SOURCES = $$LIBSQLITE3SRC/src/sqlite3.c
|
||||
|
||||
HEADERS = $$LIBSQLITE3SRC/src/sqlite3.h\
|
||||
$$LIBSQLITE3SRC/src/sqlite3ext.h
|
||||
|
||||
CONFIG(ANDROID):CONFIG += mobility
|
||||
CONFIG(ANDROID):MOBILITY =
|
||||
|
||||
#--------------------------------------------------------
|
||||
#
|
||||
# Pro file for Android and Windows builds with Qt Creator
|
||||
#
|
||||
#--------------------------------------------------------
|
||||
|
||||
QT += core
|
||||
|
||||
TEMPLATE = lib
|
||||
TARGET = libsqlite3
|
||||
|
||||
CONFIG(MINGW32):LIBSQLITE3SRC = "."
|
||||
CONFIG(MINGW64):LIBSQLITE3SRC = "."
|
||||
|
||||
CONFIG(MINGW32):INCLUDEPATH += "src"
|
||||
CONFIG(MINGW64):INCLUDEPATH += "src"
|
||||
|
||||
SOURCES = $$LIBSQLITE3SRC/src/sqlite3.c
|
||||
|
||||
HEADERS = $$LIBSQLITE3SRC/src/sqlite3.h\
|
||||
$$LIBSQLITE3SRC/src/sqlite3ext.h
|
||||
|
||||
CONFIG(ANDROID):CONFIG += mobility
|
||||
CONFIG(ANDROID):MOBILITY =
|
||||
|
||||
|
@ -1,183 +1,183 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_CHANALYZERNG_H
|
||||
#define INCLUDE_CHANALYZERNG_H
|
||||
|
||||
#include <dsp/basebandsamplesink.h>
|
||||
#include <QMutex>
|
||||
#include <vector>
|
||||
|
||||
#include "dsp/interpolator.h"
|
||||
#include "dsp/ncof.h"
|
||||
#include "dsp/fftfilt.h"
|
||||
#include "audio/audiofifo.h"
|
||||
#include "util/message.h"
|
||||
|
||||
#define ssbFftLen 1024
|
||||
|
||||
class ChannelAnalyzerNG : public BasebandSampleSink {
|
||||
public:
|
||||
ChannelAnalyzerNG(BasebandSampleSink* m_sampleSink);
|
||||
virtual ~ChannelAnalyzerNG();
|
||||
|
||||
void configure(MessageQueue* messageQueue,
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb);
|
||||
|
||||
int getInputSampleRate() const { return m_running.m_inputSampleRate; }
|
||||
int getChannelSampleRate() const { return m_running.m_channelSampleRate; }
|
||||
double getMagSq() const { return m_magsq; }
|
||||
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
|
||||
virtual void start();
|
||||
virtual void stop();
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
|
||||
private:
|
||||
class MsgConfigureChannelAnalyzer : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
int getChannelSampleRate() const { return m_channelSampleRate; }
|
||||
Real getBandwidth() const { return m_Bandwidth; }
|
||||
Real getLoCutoff() const { return m_LowCutoff; }
|
||||
int getSpanLog2() const { return m_spanLog2; }
|
||||
bool getSSB() const { return m_ssb; }
|
||||
|
||||
static MsgConfigureChannelAnalyzer* create(
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb)
|
||||
{
|
||||
return new MsgConfigureChannelAnalyzer(channelSampleRate, Bandwidth, LowCutoff, spanLog2, ssb);
|
||||
}
|
||||
|
||||
private:
|
||||
int m_channelSampleRate;
|
||||
Real m_Bandwidth;
|
||||
Real m_LowCutoff;
|
||||
int m_spanLog2;
|
||||
bool m_ssb;
|
||||
|
||||
MsgConfigureChannelAnalyzer(
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb) :
|
||||
Message(),
|
||||
m_channelSampleRate(channelSampleRate),
|
||||
m_Bandwidth(Bandwidth),
|
||||
m_LowCutoff(LowCutoff),
|
||||
m_spanLog2(spanLog2),
|
||||
m_ssb(ssb)
|
||||
{ }
|
||||
};
|
||||
|
||||
struct Config
|
||||
{
|
||||
int m_frequency;
|
||||
int m_inputSampleRate;
|
||||
int m_channelSampleRate;
|
||||
Real m_Bandwidth;
|
||||
Real m_LowCutoff;
|
||||
int m_spanLog2;
|
||||
bool m_ssb;
|
||||
|
||||
Config() :
|
||||
m_frequency(0),
|
||||
m_inputSampleRate(96000),
|
||||
m_channelSampleRate(96000),
|
||||
m_Bandwidth(5000),
|
||||
m_LowCutoff(300),
|
||||
m_spanLog2(3),
|
||||
m_ssb(false)
|
||||
{}
|
||||
};
|
||||
|
||||
Config m_config;
|
||||
Config m_running;
|
||||
|
||||
int m_undersampleCount;
|
||||
fftfilt::cmplx m_sum;
|
||||
bool m_usb;
|
||||
double m_magsq;
|
||||
bool m_useInterpolator;
|
||||
|
||||
NCOF m_nco;
|
||||
Interpolator m_interpolator;
|
||||
Real m_interpolatorDistance;
|
||||
Real m_interpolatorDistanceRemain;
|
||||
|
||||
fftfilt* SSBFilter;
|
||||
fftfilt* DSBFilter;
|
||||
|
||||
BasebandSampleSink* m_sampleSink;
|
||||
SampleVector m_sampleBuffer;
|
||||
QMutex m_settingsMutex;
|
||||
|
||||
void apply(bool force = false);
|
||||
|
||||
void processOneSample(Complex& c, fftfilt::cmplx *sideband)
|
||||
{
|
||||
int n_out;
|
||||
int decim = 1<<m_running.m_spanLog2;
|
||||
|
||||
if (m_running.m_ssb)
|
||||
{
|
||||
n_out = SSBFilter->runSSB(c, &sideband, m_usb);
|
||||
}
|
||||
else
|
||||
{
|
||||
n_out = DSBFilter->runDSB(c, &sideband);
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_out; i++)
|
||||
{
|
||||
// Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display
|
||||
// smart decimation with bit gain using float arithmetic (23 bits significand)
|
||||
|
||||
m_sum += sideband[i];
|
||||
|
||||
if (!(m_undersampleCount++ & (decim - 1))) // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
|
||||
{
|
||||
m_sum /= decim;
|
||||
m_magsq = (m_sum.real() * m_sum.real() + m_sum.imag() * m_sum.imag())/ (1<<30);
|
||||
|
||||
if (m_running.m_ssb & !m_usb)
|
||||
{ // invert spectrum for LSB
|
||||
//m_sampleBuffer.push_back(Sample(m_sum.imag() * 32768.0, m_sum.real() * 32768.0));
|
||||
m_sampleBuffer.push_back(Sample(m_sum.imag(), m_sum.real()));
|
||||
}
|
||||
else
|
||||
{
|
||||
//m_sampleBuffer.push_back(Sample(m_sum.real() * 32768.0, m_sum.imag() * 32768.0));
|
||||
m_sampleBuffer.push_back(Sample(m_sum.real(), m_sum.imag()));
|
||||
}
|
||||
|
||||
m_sum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif // INCLUDE_CHANALYZERNG_H
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDE_CHANALYZERNG_H
|
||||
#define INCLUDE_CHANALYZERNG_H
|
||||
|
||||
#include <dsp/basebandsamplesink.h>
|
||||
#include <QMutex>
|
||||
#include <vector>
|
||||
|
||||
#include "dsp/interpolator.h"
|
||||
#include "dsp/ncof.h"
|
||||
#include "dsp/fftfilt.h"
|
||||
#include "audio/audiofifo.h"
|
||||
#include "util/message.h"
|
||||
|
||||
#define ssbFftLen 1024
|
||||
|
||||
class ChannelAnalyzerNG : public BasebandSampleSink {
|
||||
public:
|
||||
ChannelAnalyzerNG(BasebandSampleSink* m_sampleSink);
|
||||
virtual ~ChannelAnalyzerNG();
|
||||
|
||||
void configure(MessageQueue* messageQueue,
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb);
|
||||
|
||||
int getInputSampleRate() const { return m_running.m_inputSampleRate; }
|
||||
int getChannelSampleRate() const { return m_running.m_channelSampleRate; }
|
||||
double getMagSq() const { return m_magsq; }
|
||||
|
||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
|
||||
virtual void start();
|
||||
virtual void stop();
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
|
||||
private:
|
||||
class MsgConfigureChannelAnalyzer : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
|
||||
public:
|
||||
int getChannelSampleRate() const { return m_channelSampleRate; }
|
||||
Real getBandwidth() const { return m_Bandwidth; }
|
||||
Real getLoCutoff() const { return m_LowCutoff; }
|
||||
int getSpanLog2() const { return m_spanLog2; }
|
||||
bool getSSB() const { return m_ssb; }
|
||||
|
||||
static MsgConfigureChannelAnalyzer* create(
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb)
|
||||
{
|
||||
return new MsgConfigureChannelAnalyzer(channelSampleRate, Bandwidth, LowCutoff, spanLog2, ssb);
|
||||
}
|
||||
|
||||
private:
|
||||
int m_channelSampleRate;
|
||||
Real m_Bandwidth;
|
||||
Real m_LowCutoff;
|
||||
int m_spanLog2;
|
||||
bool m_ssb;
|
||||
|
||||
MsgConfigureChannelAnalyzer(
|
||||
int channelSampleRate,
|
||||
Real Bandwidth,
|
||||
Real LowCutoff,
|
||||
int spanLog2,
|
||||
bool ssb) :
|
||||
Message(),
|
||||
m_channelSampleRate(channelSampleRate),
|
||||
m_Bandwidth(Bandwidth),
|
||||
m_LowCutoff(LowCutoff),
|
||||
m_spanLog2(spanLog2),
|
||||
m_ssb(ssb)
|
||||
{ }
|
||||
};
|
||||
|
||||
struct Config
|
||||
{
|
||||
int m_frequency;
|
||||
int m_inputSampleRate;
|
||||
int m_channelSampleRate;
|
||||
Real m_Bandwidth;
|
||||
Real m_LowCutoff;
|
||||
int m_spanLog2;
|
||||
bool m_ssb;
|
||||
|
||||
Config() :
|
||||
m_frequency(0),
|
||||
m_inputSampleRate(96000),
|
||||
m_channelSampleRate(96000),
|
||||
m_Bandwidth(5000),
|
||||
m_LowCutoff(300),
|
||||
m_spanLog2(3),
|
||||
m_ssb(false)
|
||||
{}
|
||||
};
|
||||
|
||||
Config m_config;
|
||||
Config m_running;
|
||||
|
||||
int m_undersampleCount;
|
||||
fftfilt::cmplx m_sum;
|
||||
bool m_usb;
|
||||
double m_magsq;
|
||||
bool m_useInterpolator;
|
||||
|
||||
NCOF m_nco;
|
||||
Interpolator m_interpolator;
|
||||
Real m_interpolatorDistance;
|
||||
Real m_interpolatorDistanceRemain;
|
||||
|
||||
fftfilt* SSBFilter;
|
||||
fftfilt* DSBFilter;
|
||||
|
||||
BasebandSampleSink* m_sampleSink;
|
||||
SampleVector m_sampleBuffer;
|
||||
QMutex m_settingsMutex;
|
||||
|
||||
void apply(bool force = false);
|
||||
|
||||
void processOneSample(Complex& c, fftfilt::cmplx *sideband)
|
||||
{
|
||||
int n_out;
|
||||
int decim = 1<<m_running.m_spanLog2;
|
||||
|
||||
if (m_running.m_ssb)
|
||||
{
|
||||
n_out = SSBFilter->runSSB(c, &sideband, m_usb);
|
||||
}
|
||||
else
|
||||
{
|
||||
n_out = DSBFilter->runDSB(c, &sideband);
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_out; i++)
|
||||
{
|
||||
// Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display
|
||||
// smart decimation with bit gain using float arithmetic (23 bits significand)
|
||||
|
||||
m_sum += sideband[i];
|
||||
|
||||
if (!(m_undersampleCount++ & (decim - 1))) // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
|
||||
{
|
||||
m_sum /= decim;
|
||||
m_magsq = (m_sum.real() * m_sum.real() + m_sum.imag() * m_sum.imag())/ (1<<30);
|
||||
|
||||
if (m_running.m_ssb & !m_usb)
|
||||
{ // invert spectrum for LSB
|
||||
//m_sampleBuffer.push_back(Sample(m_sum.imag() * 32768.0, m_sum.real() * 32768.0));
|
||||
m_sampleBuffer.push_back(Sample(m_sum.imag(), m_sum.real()));
|
||||
}
|
||||
else
|
||||
{
|
||||
//m_sampleBuffer.push_back(Sample(m_sum.real() * 32768.0, m_sum.imag() * 32768.0));
|
||||
m_sampleBuffer.push_back(Sample(m_sum.real(), m_sum.imag()));
|
||||
}
|
||||
|
||||
m_sum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif // INCLUDE_CHANALYZERNG_H
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,62 +1,62 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PLUGINS_SAMPLESOURCE_LIMESDROUTPUT_LIMESDROUTPUTSETTINGS_H_
|
||||
#define PLUGINS_SAMPLESOURCE_LIMESDROUTPUT_LIMESDROUTPUTSETTINGS_H_
|
||||
|
||||
#include <QByteArray>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* These are the settings individual to each hardware channel or software Tx chain
|
||||
* Plus the settings to be saved in the presets
|
||||
*/
|
||||
struct LimeSDROutputSettings
|
||||
{
|
||||
typedef enum {
|
||||
FC_POS_INFRA = 0,
|
||||
FC_POS_SUPRA,
|
||||
FC_POS_CENTER
|
||||
} fcPos_t;
|
||||
|
||||
enum PathRFE
|
||||
{
|
||||
PATH_RFE_NONE = 0,
|
||||
PATH_RFE_TXRF1,
|
||||
PATH_RFE_TXEF2
|
||||
};
|
||||
|
||||
// global settings to be saved
|
||||
uint64_t m_centerFrequency;
|
||||
int m_devSampleRate;
|
||||
uint32_t m_log2HardInterp;
|
||||
// channel settings
|
||||
uint32_t m_log2SoftInterp;
|
||||
float m_lpfBW; //!< LMS amalog lowpass filter bandwidth (Hz)
|
||||
bool m_lpfFIREnable; //!< Enable LMS digital lowpass FIR filters
|
||||
float m_lpfFIRBW; //!< LMS digital lowpass FIR filters bandwidth (Hz)
|
||||
uint32_t m_gain; //!< Optimally distributed gain (dB)
|
||||
bool m_ncoEnable; //!< Enable TSP NCO and mixing
|
||||
int m_ncoFrequency; //!< Actual NCO frequency (the resulting frequency with mixing is displayed)
|
||||
PathRFE m_antennaPath;
|
||||
|
||||
LimeSDROutputSettings();
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
};
|
||||
|
||||
#endif /* PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PLUGINS_SAMPLESOURCE_LIMESDROUTPUT_LIMESDROUTPUTSETTINGS_H_
|
||||
#define PLUGINS_SAMPLESOURCE_LIMESDROUTPUT_LIMESDROUTPUTSETTINGS_H_
|
||||
|
||||
#include <QByteArray>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* These are the settings individual to each hardware channel or software Tx chain
|
||||
* Plus the settings to be saved in the presets
|
||||
*/
|
||||
struct LimeSDROutputSettings
|
||||
{
|
||||
typedef enum {
|
||||
FC_POS_INFRA = 0,
|
||||
FC_POS_SUPRA,
|
||||
FC_POS_CENTER
|
||||
} fcPos_t;
|
||||
|
||||
enum PathRFE
|
||||
{
|
||||
PATH_RFE_NONE = 0,
|
||||
PATH_RFE_TXRF1,
|
||||
PATH_RFE_TXEF2
|
||||
};
|
||||
|
||||
// global settings to be saved
|
||||
uint64_t m_centerFrequency;
|
||||
int m_devSampleRate;
|
||||
uint32_t m_log2HardInterp;
|
||||
// channel settings
|
||||
uint32_t m_log2SoftInterp;
|
||||
float m_lpfBW; //!< LMS amalog lowpass filter bandwidth (Hz)
|
||||
bool m_lpfFIREnable; //!< Enable LMS digital lowpass FIR filters
|
||||
float m_lpfFIRBW; //!< LMS digital lowpass FIR filters bandwidth (Hz)
|
||||
uint32_t m_gain; //!< Optimally distributed gain (dB)
|
||||
bool m_ncoEnable; //!< Enable TSP NCO and mixing
|
||||
int m_ncoFrequency; //!< Actual NCO frequency (the resulting frequency with mixing is displayed)
|
||||
PathRFE m_antennaPath;
|
||||
|
||||
LimeSDROutputSettings();
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
};
|
||||
|
||||
#endif /* PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_ */
|
||||
|
@ -1,43 +1,43 @@
|
||||
#--------------------------------------------------------
|
||||
#
|
||||
# Pro file for Android and Windows builds with Qt Creator
|
||||
#
|
||||
#--------------------------------------------------------
|
||||
|
||||
TEMPLATE = lib
|
||||
CONFIG += plugin
|
||||
|
||||
QT += core gui widgets multimedia network
|
||||
|
||||
TARGET = inputfcdproplus
|
||||
|
||||
DEFINES += USE_SSE2=1
|
||||
QMAKE_CXXFLAGS += -msse2
|
||||
DEFINES += USE_SSE4_1=1
|
||||
QMAKE_CXXFLAGS += -msse4.1
|
||||
|
||||
INCLUDEPATH += $$PWD
|
||||
INCLUDEPATH += ../../../sdrbase
|
||||
INCLUDEPATH += ../../../fcdhid
|
||||
INCLUDEPATH += ../../../fcdlib
|
||||
|
||||
CONFIG(Release):build_subdir = release
|
||||
CONFIG(Debug):build_subdir = debug
|
||||
|
||||
SOURCES = fcdproplusgui.cpp\
|
||||
fcdproplusinputqt.cpp\
|
||||
fcdproplusplugin.cpp\
|
||||
fcdproplussettings.cpp\
|
||||
fcdproplusreader.cpp
|
||||
|
||||
HEADERS = fcdproplusgui.h\
|
||||
fcdproplusinputqt.h\
|
||||
fcdproplusplugin.h\
|
||||
fcdproplussettings.h\
|
||||
fcdproplusreader.h
|
||||
|
||||
FORMS += fcdproplusgui.ui
|
||||
|
||||
LIBS += -L../../../fcdlib/$${build_subdir} -lfcdlib
|
||||
LIBS += -L../../../fcdhid/$${build_subdir} -lfcdhid
|
||||
LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
|
||||
#--------------------------------------------------------
|
||||
#
|
||||
# Pro file for Android and Windows builds with Qt Creator
|
||||
#
|
||||
#--------------------------------------------------------
|
||||
|
||||
TEMPLATE = lib
|
||||
CONFIG += plugin
|
||||
|
||||
QT += core gui widgets multimedia network
|
||||
|
||||
TARGET = inputfcdproplus
|
||||
|
||||
DEFINES += USE_SSE2=1
|
||||
QMAKE_CXXFLAGS += -msse2
|
||||
DEFINES += USE_SSE4_1=1
|
||||
QMAKE_CXXFLAGS += -msse4.1
|
||||
|
||||
INCLUDEPATH += $$PWD
|
||||
INCLUDEPATH += ../../../sdrbase
|
||||
INCLUDEPATH += ../../../fcdhid
|
||||
INCLUDEPATH += ../../../fcdlib
|
||||
|
||||
CONFIG(Release):build_subdir = release
|
||||
CONFIG(Debug):build_subdir = debug
|
||||
|
||||
SOURCES = fcdproplusgui.cpp\
|
||||
fcdproplusinputqt.cpp\
|
||||
fcdproplusplugin.cpp\
|
||||
fcdproplussettings.cpp\
|
||||
fcdproplusreader.cpp
|
||||
|
||||
HEADERS = fcdproplusgui.h\
|
||||
fcdproplusinputqt.h\
|
||||
fcdproplusplugin.h\
|
||||
fcdproplussettings.h\
|
||||
fcdproplusreader.h
|
||||
|
||||
FORMS += fcdproplusgui.ui
|
||||
|
||||
LIBS += -L../../../fcdlib/$${build_subdir} -lfcdlib
|
||||
LIBS += -L../../../fcdhid/$${build_subdir} -lfcdhid
|
||||
LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
|
||||
|
@ -1,76 +1,76 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_
|
||||
#define PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_
|
||||
|
||||
#include <QByteArray>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* These are the settings individual to each hardware channel or software Rx chain
|
||||
* Plus the settings to be saved in the presets
|
||||
*/
|
||||
struct LimeSDRInputSettings
|
||||
{
|
||||
typedef enum {
|
||||
FC_POS_INFRA = 0,
|
||||
FC_POS_SUPRA,
|
||||
FC_POS_CENTER
|
||||
} fcPos_t;
|
||||
|
||||
enum PathRFE
|
||||
{
|
||||
PATH_RFE_NONE = 0,
|
||||
PATH_RFE_LNAH,
|
||||
PATH_RFE_LNAL,
|
||||
PATH_RFE_LNAW,
|
||||
PATH_RFE_LB1,
|
||||
PATH_RFE_LB2
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
GAIN_AUTO,
|
||||
GAIN_MANUAL
|
||||
} GainMode;
|
||||
|
||||
// global settings to be saved
|
||||
uint64_t m_centerFrequency;
|
||||
int m_devSampleRate;
|
||||
uint32_t m_log2HardDecim;
|
||||
// channel settings
|
||||
bool m_dcBlock;
|
||||
bool m_iqCorrection;
|
||||
uint32_t m_log2SoftDecim;
|
||||
float m_lpfBW; //!< LMS amalog lowpass filter bandwidth (Hz)
|
||||
bool m_lpfFIREnable; //!< Enable LMS digital lowpass FIR filters
|
||||
float m_lpfFIRBW; //!< LMS digital lowpass FIR filters bandwidth (Hz)
|
||||
uint32_t m_gain; //!< Optimally distributed gain (dB)
|
||||
bool m_ncoEnable; //!< Enable TSP NCO and mixing
|
||||
int m_ncoFrequency; //!< Actual NCO frequency (the resulting frequency with mixing is displayed)
|
||||
PathRFE m_antennaPath;
|
||||
GainMode m_gainMode; //!< Gain mode: auto or manual
|
||||
uint32_t m_lnaGain; //!< Manual LAN gain
|
||||
uint32_t m_tiaGain; //!< Manual TIA gain
|
||||
uint32_t m_pgaGain; //!< Manual PGA gain
|
||||
|
||||
LimeSDRInputSettings();
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
};
|
||||
|
||||
#endif /* PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_
|
||||
#define PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_
|
||||
|
||||
#include <QByteArray>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* These are the settings individual to each hardware channel or software Rx chain
|
||||
* Plus the settings to be saved in the presets
|
||||
*/
|
||||
struct LimeSDRInputSettings
|
||||
{
|
||||
typedef enum {
|
||||
FC_POS_INFRA = 0,
|
||||
FC_POS_SUPRA,
|
||||
FC_POS_CENTER
|
||||
} fcPos_t;
|
||||
|
||||
enum PathRFE
|
||||
{
|
||||
PATH_RFE_NONE = 0,
|
||||
PATH_RFE_LNAH,
|
||||
PATH_RFE_LNAL,
|
||||
PATH_RFE_LNAW,
|
||||
PATH_RFE_LB1,
|
||||
PATH_RFE_LB2
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
GAIN_AUTO,
|
||||
GAIN_MANUAL
|
||||
} GainMode;
|
||||
|
||||
// global settings to be saved
|
||||
uint64_t m_centerFrequency;
|
||||
int m_devSampleRate;
|
||||
uint32_t m_log2HardDecim;
|
||||
// channel settings
|
||||
bool m_dcBlock;
|
||||
bool m_iqCorrection;
|
||||
uint32_t m_log2SoftDecim;
|
||||
float m_lpfBW; //!< LMS amalog lowpass filter bandwidth (Hz)
|
||||
bool m_lpfFIREnable; //!< Enable LMS digital lowpass FIR filters
|
||||
float m_lpfFIRBW; //!< LMS digital lowpass FIR filters bandwidth (Hz)
|
||||
uint32_t m_gain; //!< Optimally distributed gain (dB)
|
||||
bool m_ncoEnable; //!< Enable TSP NCO and mixing
|
||||
int m_ncoFrequency; //!< Actual NCO frequency (the resulting frequency with mixing is displayed)
|
||||
PathRFE m_antennaPath;
|
||||
GainMode m_gainMode; //!< Gain mode: auto or manual
|
||||
uint32_t m_lnaGain; //!< Manual LAN gain
|
||||
uint32_t m_tiaGain; //!< Manual TIA gain
|
||||
uint32_t m_pgaGain; //!< Manual PGA gain
|
||||
|
||||
LimeSDRInputSettings();
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
};
|
||||
|
||||
#endif /* PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTSETTINGS_H_ */
|
||||
|
@ -1,69 +1,69 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef SDRBASE_AUDIO_AUDIOINPUT_H_
|
||||
#define SDRBASE_AUDIO_AUDIOINPUT_H_
|
||||
|
||||
#include <QMutex>
|
||||
#include <QIODevice>
|
||||
#include <QAudioFormat>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include "util/export.h"
|
||||
|
||||
class QAudioInput;
|
||||
class AudioFifo;
|
||||
class AudioOutputPipe;
|
||||
|
||||
|
||||
class SDRANGEL_API AudioInput : public QIODevice {
|
||||
public:
|
||||
AudioInput();
|
||||
virtual ~AudioInput();
|
||||
|
||||
bool start(int device, int rate);
|
||||
void stop();
|
||||
|
||||
void addFifo(AudioFifo* audioFifo);
|
||||
void removeFifo(AudioFifo* audioFifo);
|
||||
|
||||
uint getRate() const { return m_audioFormat.sampleRate(); }
|
||||
void setOnExit(bool onExit) { m_onExit = onExit; }
|
||||
void setVolume(float volume) { m_volume = volume; }
|
||||
|
||||
private:
|
||||
QMutex m_mutex;
|
||||
QAudioInput* m_audioInput;
|
||||
uint m_audioUsageCount;
|
||||
bool m_onExit;
|
||||
float m_volume;
|
||||
|
||||
typedef std::list<AudioFifo*> AudioFifos;
|
||||
AudioFifos m_audioFifos;
|
||||
std::vector<qint32> m_mixBuffer;
|
||||
|
||||
QAudioFormat m_audioFormat;
|
||||
|
||||
//virtual bool open(OpenMode mode);
|
||||
virtual qint64 readData(char* data, qint64 maxLen);
|
||||
virtual qint64 writeData(const char* data, qint64 len);
|
||||
|
||||
friend class AudioOutputPipe;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* SDRBASE_AUDIO_AUDIOINPUT_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef SDRBASE_AUDIO_AUDIOINPUT_H_
|
||||
#define SDRBASE_AUDIO_AUDIOINPUT_H_
|
||||
|
||||
#include <QMutex>
|
||||
#include <QIODevice>
|
||||
#include <QAudioFormat>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include "util/export.h"
|
||||
|
||||
class QAudioInput;
|
||||
class AudioFifo;
|
||||
class AudioOutputPipe;
|
||||
|
||||
|
||||
class SDRANGEL_API AudioInput : public QIODevice {
|
||||
public:
|
||||
AudioInput();
|
||||
virtual ~AudioInput();
|
||||
|
||||
bool start(int device, int rate);
|
||||
void stop();
|
||||
|
||||
void addFifo(AudioFifo* audioFifo);
|
||||
void removeFifo(AudioFifo* audioFifo);
|
||||
|
||||
uint getRate() const { return m_audioFormat.sampleRate(); }
|
||||
void setOnExit(bool onExit) { m_onExit = onExit; }
|
||||
void setVolume(float volume) { m_volume = volume; }
|
||||
|
||||
private:
|
||||
QMutex m_mutex;
|
||||
QAudioInput* m_audioInput;
|
||||
uint m_audioUsageCount;
|
||||
bool m_onExit;
|
||||
float m_volume;
|
||||
|
||||
typedef std::list<AudioFifo*> AudioFifos;
|
||||
AudioFifos m_audioFifos;
|
||||
std::vector<qint32> m_mixBuffer;
|
||||
|
||||
QAudioFormat m_audioFormat;
|
||||
|
||||
//virtual bool open(OpenMode mode);
|
||||
virtual qint64 readData(char* data, qint64 maxLen);
|
||||
virtual qint64 writeData(const char* data, qint64 len);
|
||||
|
||||
friend class AudioOutputPipe;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* SDRBASE_AUDIO_AUDIOINPUT_H_ */
|
||||
|
@ -1,58 +1,58 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dsp/basebandsamplesource.h"
|
||||
#include "util/message.h"
|
||||
|
||||
BasebandSampleSource::BasebandSampleSource() :
|
||||
m_sampleFifo(48000) // arbitrary, will be adjusted to match device sink FIFO size
|
||||
{
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
connect(&m_sampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToFifo(int)));
|
||||
}
|
||||
|
||||
BasebandSampleSource::~BasebandSampleSource()
|
||||
{
|
||||
}
|
||||
|
||||
void BasebandSampleSource::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BasebandSampleSource::handleWriteToFifo(int nbSamples)
|
||||
{
|
||||
SampleVector::iterator writeAt;
|
||||
m_sampleFifo.getWriteIterator(writeAt);
|
||||
pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly
|
||||
|
||||
for (int i = 0; i < nbSamples; i++)
|
||||
{
|
||||
pull((*writeAt));
|
||||
m_sampleFifo.bumpIndex(writeAt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dsp/basebandsamplesource.h"
|
||||
#include "util/message.h"
|
||||
|
||||
BasebandSampleSource::BasebandSampleSource() :
|
||||
m_sampleFifo(48000) // arbitrary, will be adjusted to match device sink FIFO size
|
||||
{
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
connect(&m_sampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToFifo(int)));
|
||||
}
|
||||
|
||||
BasebandSampleSource::~BasebandSampleSource()
|
||||
{
|
||||
}
|
||||
|
||||
void BasebandSampleSource::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BasebandSampleSource::handleWriteToFifo(int nbSamples)
|
||||
{
|
||||
SampleVector::iterator writeAt;
|
||||
m_sampleFifo.getWriteIterator(writeAt);
|
||||
pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly
|
||||
|
||||
for (int i = 0; i < nbSamples; i++)
|
||||
{
|
||||
pull((*writeAt));
|
||||
m_sampleFifo.bumpIndex(writeAt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,71 +1,71 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
||||
#define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
||||
|
||||
#include <QObject>
|
||||
#include "dsp/dsptypes.h"
|
||||
#include "dsp/samplesourcefifo.h"
|
||||
#include "util/export.h"
|
||||
#include "util/messagequeue.h"
|
||||
|
||||
class Message;
|
||||
|
||||
class SDRANGEL_API BasebandSampleSource : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
BasebandSampleSource();
|
||||
virtual ~BasebandSampleSource();
|
||||
|
||||
virtual void start() = 0;
|
||||
virtual void stop() = 0;
|
||||
virtual void pull(Sample& sample) = 0;
|
||||
virtual void pullAudio(int nbSamples __attribute__((unused))) {}
|
||||
|
||||
/** direct feeding of sample source FIFO */
|
||||
void feed(SampleSourceFifo* sampleFifo, int nbSamples)
|
||||
{
|
||||
SampleVector::iterator writeAt;
|
||||
sampleFifo->getWriteIterator(writeAt);
|
||||
pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly
|
||||
|
||||
for (int i = 0; i < nbSamples; i++)
|
||||
{
|
||||
pull((*writeAt));
|
||||
sampleFifo->bumpIndex(writeAt);
|
||||
}
|
||||
}
|
||||
|
||||
SampleSourceFifo& getSampleSourceFifo() { return m_sampleFifo; }
|
||||
|
||||
virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed
|
||||
|
||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
||||
MessageQueue *getOutputMessageQueue() { return &m_outputMessageQueue; } //!< Get the queue for asynchronous outbound communication
|
||||
|
||||
protected:
|
||||
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
||||
MessageQueue m_outputMessageQueue; //!< Queue for asynchronous outbound communication
|
||||
SampleSourceFifo m_sampleFifo; //!< Internal FIFO for multi-channel processing
|
||||
|
||||
protected slots:
|
||||
void handleInputMessages();
|
||||
void handleWriteToFifo(int nbSamples);
|
||||
};
|
||||
|
||||
#endif /* SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_ */
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
||||
#define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
||||
|
||||
#include <QObject>
|
||||
#include "dsp/dsptypes.h"
|
||||
#include "dsp/samplesourcefifo.h"
|
||||
#include "util/export.h"
|
||||
#include "util/messagequeue.h"
|
||||
|
||||
class Message;
|
||||
|
||||
class SDRANGEL_API BasebandSampleSource : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
BasebandSampleSource();
|
||||
virtual ~BasebandSampleSource();
|
||||
|
||||
virtual void start() = 0;
|
||||
virtual void stop() = 0;
|
||||
virtual void pull(Sample& sample) = 0;
|
||||
virtual void pullAudio(int nbSamples __attribute__((unused))) {}
|
||||
|
||||
/** direct feeding of sample source FIFO */
|
||||
void feed(SampleSourceFifo* sampleFifo, int nbSamples)
|
||||
{
|
||||
SampleVector::iterator writeAt;
|
||||
sampleFifo->getWriteIterator(writeAt);
|
||||
pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly
|
||||
|
||||
for (int i = 0; i < nbSamples; i++)
|
||||
{
|
||||
pull((*writeAt));
|
||||
sampleFifo->bumpIndex(writeAt);
|
||||
}
|
||||
}
|
||||
|
||||
SampleSourceFifo& getSampleSourceFifo() { return m_sampleFifo; }
|
||||
|
||||
virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed
|
||||
|
||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
||||
MessageQueue *getOutputMessageQueue() { return &m_outputMessageQueue; } //!< Get the queue for asynchronous outbound communication
|
||||
|
||||
protected:
|
||||
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
||||
MessageQueue m_outputMessageQueue; //!< Queue for asynchronous outbound communication
|
||||
SampleSourceFifo m_sampleFifo; //!< Internal FIFO for multi-channel processing
|
||||
|
||||
protected slots:
|
||||
void handleInputMessages();
|
||||
void handleWriteToFifo(int nbSamples);
|
||||
};
|
||||
|
||||
#endif /* SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_ */
|
||||
|
@ -1,45 +1,45 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dsp/devicesamplesink.h"
|
||||
|
||||
DeviceSampleSink::DeviceSampleSink() :
|
||||
m_sampleSourceFifo(1<<19)
|
||||
{
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
}
|
||||
|
||||
DeviceSampleSink::~DeviceSampleSink()
|
||||
{
|
||||
}
|
||||
|
||||
void DeviceSampleSink::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2016 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dsp/devicesamplesink.h"
|
||||
|
||||
DeviceSampleSink::DeviceSampleSink() :
|
||||
m_sampleSourceFifo(1<<19)
|
||||
{
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
}
|
||||
|
||||
DeviceSampleSink::~DeviceSampleSink()
|
||||
{
|
||||
}
|
||||
|
||||
void DeviceSampleSink::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
delete message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,441 +1,441 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CWKeyerGUI</class>
|
||||
<widget class="QWidget" name="CWKeyerGUI">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>375</width>
|
||||
<height>60</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Sans Serif</family>
|
||||
<pointsize>8</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>CW Keyer</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" columnstretch="1,0,0">
|
||||
<property name="margin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item row="3" column="0" colspan="3">
|
||||
<layout class="QHBoxLayout" name="controlBtns">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="cwSpeedLabel">
|
||||
<property name="text">
|
||||
<string>WPM</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDial" name="cwSpeed">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>CW speed (WPM)</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>26</number>
|
||||
</property>
|
||||
<property name="pageStep">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>13</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="cwSpeedText">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>CW speed display (WPM)</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>13</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playDots">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send dots</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playDashes">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send dashes</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>-</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>106</red>
|
||||
<green>104</green>
|
||||
<blue>100</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>DejaVu Serif</family>
|
||||
<pointsize>9</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send text written above</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>T</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playLoopCW">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Play text in a loop</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/playloop.png</normaloff>:/playloop.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playStop">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Play / stop text coding</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/play.png</normaloff>
|
||||
<normalon>:/stop.png</normalon>:/play.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="3">
|
||||
<layout class="QHBoxLayout" name="cwTextLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="cwTextEdit">
|
||||
<property name="toolTip">
|
||||
<string>CW text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="cwTextClear">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Clear CW text</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/clear.png</normaloff>:/clear.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>ButtonSwitch</class>
|
||||
<extends>QToolButton</extends>
|
||||
<header>gui/buttonswitch.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>playLoopCW</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../resources/res.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CWKeyerGUI</class>
|
||||
<widget class="QWidget" name="CWKeyerGUI">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>375</width>
|
||||
<height>60</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Sans Serif</family>
|
||||
<pointsize>8</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>CW Keyer</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" columnstretch="1,0,0">
|
||||
<property name="margin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item row="3" column="0" colspan="3">
|
||||
<layout class="QHBoxLayout" name="controlBtns">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="cwSpeedLabel">
|
||||
<property name="text">
|
||||
<string>WPM</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDial" name="cwSpeed">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>CW speed (WPM)</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>26</number>
|
||||
</property>
|
||||
<property name="pageStep">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>13</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="cwSpeedText">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>CW speed display (WPM)</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>13</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playDots">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send dots</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playDashes">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send dashes</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>-</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>106</red>
|
||||
<green>104</green>
|
||||
<blue>100</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>DejaVu Serif</family>
|
||||
<pointsize>9</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Send text written above</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>T</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playLoopCW">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Play text in a loop</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/playloop.png</normaloff>:/playloop.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playStop">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Play / stop text coding</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/play.png</normaloff>
|
||||
<normalon>:/stop.png</normalon>:/play.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="3">
|
||||
<layout class="QHBoxLayout" name="cwTextLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="cwTextEdit">
|
||||
<property name="toolTip">
|
||||
<string>CW text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="cwTextClear">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Clear CW text</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources/res.qrc">
|
||||
<normaloff>:/clear.png</normaloff>:/clear.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>ButtonSwitch</class>
|
||||
<extends>QToolButton</extends>
|
||||
<header>gui/buttonswitch.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>playLoopCW</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../resources/res.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
@ -1,122 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MyPositionDialog</class>
|
||||
<widget class="QDialog" name="MyPositionDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>324</width>
|
||||
<height>127</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Sans Serif</family>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>My Station Position</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="latitudeLabel">
|
||||
<property name="text">
|
||||
<string>Latitude</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="longitudeLabel">
|
||||
<property name="text">
|
||||
<string>Longitude</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="longitudeSpinBox">
|
||||
<property name="decimals">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-180.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>180.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QDoubleSpinBox" name="latitudeSpinBox">
|
||||
<property name="decimals">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-90.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>90.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>buttonBox</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>MyPositionDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>257</x>
|
||||
<y>194</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>203</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>MyPositionDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>314</x>
|
||||
<y>194</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>203</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MyPositionDialog</class>
|
||||
<widget class="QDialog" name="MyPositionDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>324</width>
|
||||
<height>127</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Sans Serif</family>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>My Station Position</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="latitudeLabel">
|
||||
<property name="text">
|
||||
<string>Latitude</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="longitudeLabel">
|
||||
<property name="text">
|
||||
<string>Longitude</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="longitudeSpinBox">
|
||||
<property name="decimals">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-180.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>180.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QDoubleSpinBox" name="latitudeSpinBox">
|
||||
<property name="decimals">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-90.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>90.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>buttonBox</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>MyPositionDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>257</x>
|
||||
<y>194</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>203</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>MyPositionDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>314</x>
|
||||
<y>194</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>203</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
|
@ -1,83 +1,83 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// Same as ValueDial but handles optionally positive and negative numbers with //
|
||||
// sign display. //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
#include "gui/colormapper.h"
|
||||
#include "util/export.h"
|
||||
|
||||
class SDRANGEL_API ValueDialZ : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ValueDialZ(bool positiveOnly = true, QWidget* parent = NULL, ColorMapper colorMapper = ColorMapper(ColorMapper::Normal));
|
||||
|
||||
void setValue(qint64 value);
|
||||
void setValueRange(bool positiveOnly, uint numDigits, qint64 min, qint64 max);
|
||||
void setFont(const QFont& font);
|
||||
void setBold(bool bold);
|
||||
void setColorMapper(ColorMapper colorMapper);
|
||||
qint64 getValue() const { return m_value; }
|
||||
qint64 getValueNew() const { return m_valueNew; }
|
||||
|
||||
signals:
|
||||
void changed(qint64 value);
|
||||
|
||||
private:
|
||||
QLinearGradient m_background;
|
||||
int m_numDigits;
|
||||
int m_numDecimalPoints;
|
||||
int m_digitWidth;
|
||||
int m_digitHeight;
|
||||
int m_hightlightedDigit;
|
||||
int m_cursor;
|
||||
bool m_cursorState;
|
||||
qint64 m_value;
|
||||
qint64 m_valueMax;
|
||||
qint64 m_valueMin;
|
||||
bool m_positiveOnly;
|
||||
QString m_text;
|
||||
|
||||
qint64 m_valueNew;
|
||||
QString m_textNew;
|
||||
int m_animationState;
|
||||
QTimer m_animationTimer;
|
||||
QTimer m_blinkTimer;
|
||||
|
||||
ColorMapper m_colorMapper;
|
||||
|
||||
quint64 findExponent(int digit);
|
||||
QChar digitNeigh(QChar c, bool dir);
|
||||
QString formatText(qint64 value);
|
||||
|
||||
void paintEvent(QPaintEvent*);
|
||||
|
||||
void mousePressEvent(QMouseEvent*);
|
||||
void mouseMoveEvent(QMouseEvent*);
|
||||
void wheelEvent(QWheelEvent*);
|
||||
void leaveEvent(QEvent*);
|
||||
void keyPressEvent(QKeyEvent*);
|
||||
void focusInEvent(QFocusEvent*);
|
||||
void focusOutEvent(QFocusEvent*);
|
||||
|
||||
private slots:
|
||||
void animate();
|
||||
void blink();
|
||||
};
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (C) 2017 F4EXB //
|
||||
// written by Edouard Griffiths //
|
||||
// //
|
||||
// Same as ValueDial but handles optionally positive and negative numbers with //
|
||||
// sign display. //
|
||||
// //
|
||||
// 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 as version 3 of the License, or //
|
||||
// //
|
||||
// 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 V3 for more details. //
|
||||
// //
|
||||
// You should have received a copy of the GNU General Public License //
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
#include "gui/colormapper.h"
|
||||
#include "util/export.h"
|
||||
|
||||
class SDRANGEL_API ValueDialZ : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ValueDialZ(bool positiveOnly = true, QWidget* parent = NULL, ColorMapper colorMapper = ColorMapper(ColorMapper::Normal));
|
||||
|
||||
void setValue(qint64 value);
|
||||
void setValueRange(bool positiveOnly, uint numDigits, qint64 min, qint64 max);
|
||||
void setFont(const QFont& font);
|
||||
void setBold(bool bold);
|
||||
void setColorMapper(ColorMapper colorMapper);
|
||||
qint64 getValue() const { return m_value; }
|
||||
qint64 getValueNew() const { return m_valueNew; }
|
||||
|
||||
signals:
|
||||
void changed(qint64 value);
|
||||
|
||||
private:
|
||||
QLinearGradient m_background;
|
||||
int m_numDigits;
|
||||
int m_numDecimalPoints;
|
||||
int m_digitWidth;
|
||||
int m_digitHeight;
|
||||
int m_hightlightedDigit;
|
||||
int m_cursor;
|
||||
bool m_cursorState;
|
||||
qint64 m_value;
|
||||
qint64 m_valueMax;
|
||||
qint64 m_valueMin;
|
||||
bool m_positiveOnly;
|
||||
QString m_text;
|
||||
|
||||
qint64 m_valueNew;
|
||||
QString m_textNew;
|
||||
int m_animationState;
|
||||
QTimer m_animationTimer;
|
||||
QTimer m_blinkTimer;
|
||||
|
||||
ColorMapper m_colorMapper;
|
||||
|
||||
quint64 findExponent(int digit);
|
||||
QChar digitNeigh(QChar c, bool dir);
|
||||
QString formatText(qint64 value);
|
||||
|
||||
void paintEvent(QPaintEvent*);
|
||||
|
||||
void mousePressEvent(QMouseEvent*);
|
||||
void mouseMoveEvent(QMouseEvent*);
|
||||
void wheelEvent(QWheelEvent*);
|
||||
void leaveEvent(QEvent*);
|
||||
void keyPressEvent(QKeyEvent*);
|
||||
void focusInEvent(QFocusEvent*);
|
||||
void focusOutEvent(QFocusEvent*);
|
||||
|
||||
private slots:
|
||||
void animate();
|
||||
void blink();
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user