kopia lustrzana https://github.com/lucckb/libpsk
Pulse mutex fixes
rodzic
31ac1d913a
commit
04359c6a81
|
@ -22,8 +22,8 @@ class ham_digi
|
||||||
ham_digi& operator=(const ham_digi&) = delete;
|
ham_digi& operator=(const ham_digi&) = delete;
|
||||||
static constexpr auto TX_QUELEN = 512;
|
static constexpr auto TX_QUELEN = 512;
|
||||||
static constexpr auto DEF_FREQ = 1000;
|
static constexpr auto DEF_FREQ = 1000;
|
||||||
static constexpr auto SYS_CALLBACK_ID = -1;
|
|
||||||
public:
|
public:
|
||||||
|
static constexpr auto SYS_CALLBACK_ID = -1;
|
||||||
/* Modulation structure */
|
/* Modulation structure */
|
||||||
enum class modulation : short
|
enum class modulation : short
|
||||||
{
|
{
|
||||||
|
@ -48,7 +48,7 @@ public:
|
||||||
*/
|
*/
|
||||||
typedef std::function <void( int chn, const event &ev )> handler_t;
|
typedef std::function <void( int chn, const event &ev )> handler_t;
|
||||||
/* Constructor with handler */
|
/* Constructor with handler */
|
||||||
ham_digi( handler_t handler, trx_device_base *hw_device );
|
ham_digi( handler_t handler );
|
||||||
/* Activate transmission */
|
/* Activate transmission */
|
||||||
int enable( bool en );
|
int enable( bool en );
|
||||||
/* Switch to TX RX */
|
/* Switch to TX RX */
|
||||||
|
@ -58,6 +58,11 @@ public:
|
||||||
/* New RX channel */
|
/* New RX channel */
|
||||||
int rx_channel_add(); /* Extra channel ADD */
|
int rx_channel_add(); /* Extra channel ADD */
|
||||||
int rx_channel_remove( int chn_id ); /* Extra channel remove */
|
int rx_channel_remove( int chn_id ); /* Extra channel remove */
|
||||||
|
/* Wait to finish */
|
||||||
|
int join()
|
||||||
|
{
|
||||||
|
return m_iodev->join();
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
class tx_proxy
|
class tx_proxy
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,8 +64,9 @@ private:
|
||||||
private:
|
private:
|
||||||
const char *m_dev_name; //Device name
|
const char *m_dev_name; //Device name
|
||||||
std::unique_ptr< std::thread > m_thread; //TX thread
|
std::unique_ptr< std::thread > m_thread; //TX thread
|
||||||
std::mutex m_thrmutex; //Thread mutex
|
std::mutex m_codec_mutex; //Thread mutex
|
||||||
std::mutex m_sectrum_mutex; //Spectrum mutex
|
std::mutex m_sectrum_mutex; //Spectrum mutex
|
||||||
|
std::mutex m_pulse_mutex;
|
||||||
volatile bool m_thread_running {}; //Thread
|
volatile bool m_thread_running {}; //Thread
|
||||||
volatile int m_thread_status {}; //Thread error status
|
volatile int m_thread_status {}; //Thread error status
|
||||||
pa_simple *m_pa_ctx {nullptr}; //PA CTX
|
pa_simple *m_pa_ctx {nullptr}; //PA CTX
|
||||||
|
|
|
@ -107,9 +107,11 @@ void trx_device_base::adc_process( const sample_type *buf, size_t len )
|
||||||
{
|
{
|
||||||
//True if all samples completed
|
//True if all samples completed
|
||||||
if( m_spectrum.copy_samples( buf, len ) )
|
if( m_spectrum.copy_samples( buf, len ) )
|
||||||
|
{
|
||||||
m_spectrum_tmr = 0;
|
m_spectrum_tmr = 0;
|
||||||
//Inform that user can calculate the FFT
|
//Inform that user can calculate the FFT
|
||||||
callback_notify( event::type::spectrum );
|
callback_notify( event::type::spectrum );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,11 @@
|
||||||
*/
|
*/
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
#include "ham/ham_digi.hpp"
|
#include "ham/ham_digi.hpp"
|
||||||
|
#ifndef COMPILED_UNDER_ISIX
|
||||||
#include "port/pulse/pulse_device.hpp"
|
#include "port/pulse/pulse_device.hpp"
|
||||||
|
#else
|
||||||
|
#error not implemented yet
|
||||||
|
#endif
|
||||||
#include "psk/decoder.hpp"
|
#include "psk/decoder.hpp"
|
||||||
#include "psk/modulator.hpp"
|
#include "psk/modulator.hpp"
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
@ -14,11 +18,23 @@
|
||||||
|
|
||||||
namespace ham {
|
namespace ham {
|
||||||
namespace psk {
|
namespace psk {
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
#ifndef COMPILED_UNDER_ISIX
|
||||||
|
inline trx_device_base* create_default_device( ham_digi::handler_t h )
|
||||||
|
{
|
||||||
|
static const int sys_idx = ham_digi::SYS_CALLBACK_ID;
|
||||||
|
return new pulse_device( std::bind(h, sys_idx, std::placeholders::_1) );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
}
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
//Default ham digi constructor
|
//Default ham digi constructor
|
||||||
ham_digi::ham_digi( handler_t handler, trx_device_base *hw_device )
|
ham_digi::ham_digi( handler_t handler )
|
||||||
: m_iodev( hw_device ), m_callback( handler )
|
: m_iodev( create_default_device( handler ) )
|
||||||
|
, m_callback( handler )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
@ -47,16 +63,15 @@ int ham_digi::set_tx( bool tx )
|
||||||
{
|
{
|
||||||
return err_no_modulation;
|
return err_no_modulation;
|
||||||
}
|
}
|
||||||
|
/* Not working yet */
|
||||||
|
//if( m_iodev->get_tx_codec()->is_transmitting() )
|
||||||
|
//{
|
||||||
|
// return err_tx_busy;
|
||||||
|
//}
|
||||||
if( tx && m_iodev->get_mode()==trx_device_base::mode::on )
|
if( tx && m_iodev->get_mode()==trx_device_base::mode::on )
|
||||||
{
|
{
|
||||||
if( m_iodev->get_tx_codec()->is_transmitting() )
|
|
||||||
{
|
m_iodev->set_mode( trx_device_base::mode::transmit );
|
||||||
return err_tx_busy;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_iodev->set_mode( trx_device_base::mode::transmit );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@ int pulse_device::setup_sound_hardware( trx_device_base::mode m )
|
||||||
//Hardware SETUP state
|
//Hardware SETUP state
|
||||||
if( m == trx_device_base::mode::on && get_mode()!=trx_device_base::mode::on )
|
if( m == trx_device_base::mode::on && get_mode()!=trx_device_base::mode::on )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( get_mode()==trx_device_base::mode::transmit )
|
if( get_mode()==trx_device_base::mode::transmit )
|
||||||
{
|
{
|
||||||
const int ret = disable_hw_tx();
|
const int ret = disable_hw_tx();
|
||||||
|
@ -60,7 +61,7 @@ int pulse_device::setup_sound_hardware( trx_device_base::mode m )
|
||||||
m_thread.reset( new std::thread( &pulse_device::hardware_sound_thread, this ) );
|
m_thread.reset( new std::thread( &pulse_device::hardware_sound_thread, this ) );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return trx_device_base::INVALID;
|
return 0;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
//Hardware sound thread func
|
//Hardware sound thread func
|
||||||
|
@ -69,10 +70,9 @@ void pulse_device::hardware_sound_thread()
|
||||||
int errcode = 0;
|
int errcode = 0;
|
||||||
for(; m_thread_running && !errcode ;)
|
for(; m_thread_running && !errcode ;)
|
||||||
{
|
{
|
||||||
m_thrmutex.lock();
|
|
||||||
if ( get_mode()==trx_device_base::mode::on ) errcode = receive_thread();
|
if ( get_mode()==trx_device_base::mode::on ) errcode = receive_thread();
|
||||||
else if( get_mode()==trx_device_base::mode::transmit ) errcode = transmit_thread();
|
else if( get_mode()==trx_device_base::mode::transmit ) errcode = transmit_thread();
|
||||||
m_thrmutex.unlock();
|
|
||||||
}
|
}
|
||||||
if( get_mode()==trx_device_base::mode::on )
|
if( get_mode()==trx_device_base::mode::on )
|
||||||
{
|
{
|
||||||
|
@ -94,12 +94,18 @@ void pulse_device::hardware_sound_thread()
|
||||||
int pulse_device::receive_thread()
|
int pulse_device::receive_thread()
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
/* Record some data ... */
|
|
||||||
if (pa_simple_read(m_pa_ctx, &m_audio_buf[0], audio_buf_len*sizeof(short), &error) < 0)
|
|
||||||
{
|
{
|
||||||
return error;
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
|
/* Record some data ... */
|
||||||
|
if (pa_simple_read(m_pa_ctx, &m_audio_buf[0], audio_buf_len*sizeof(short), &error) < 0)
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_codec_mutex );
|
||||||
|
adc_process( &m_audio_buf[0], audio_buf_len );
|
||||||
}
|
}
|
||||||
adc_process( &m_audio_buf[0], audio_buf_len );
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
@ -107,10 +113,18 @@ int pulse_device::receive_thread()
|
||||||
int pulse_device::transmit_thread()
|
int pulse_device::transmit_thread()
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
if ( !dac_process( &m_audio_buf[0], audio_buf_len ) )
|
bool status;
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_codec_mutex );
|
||||||
|
status = dac_process( &m_audio_buf[0], audio_buf_len );
|
||||||
|
}
|
||||||
|
if( !status )
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
if (pa_simple_write(m_pa_ctx,&m_audio_buf[0], audio_buf_len*sizeof(short), &error) < 0)
|
if (pa_simple_write(m_pa_ctx,&m_audio_buf[0], audio_buf_len*sizeof(short), &error) < 0)
|
||||||
|
{
|
||||||
return error;
|
return error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -118,7 +132,6 @@ int pulse_device::transmit_thread()
|
||||||
return error;
|
return error;
|
||||||
if( (error = enable_hw_rx()) )
|
if( (error = enable_hw_rx()) )
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -126,6 +139,7 @@ int pulse_device::transmit_thread()
|
||||||
//Enable hardware receive
|
//Enable hardware receive
|
||||||
int pulse_device::enable_hw_rx()
|
int pulse_device::enable_hw_rx()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
/* Pulse receive config */
|
/* Pulse receive config */
|
||||||
const pa_sample_spec pconfig
|
const pa_sample_spec pconfig
|
||||||
{
|
{
|
||||||
|
@ -144,6 +158,7 @@ int pulse_device::enable_hw_rx()
|
||||||
//Disable hardware receive
|
//Disable hardware receive
|
||||||
int pulse_device::disable_hw_rx()
|
int pulse_device::disable_hw_rx()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
pa_simple_free(m_pa_ctx);
|
pa_simple_free(m_pa_ctx);
|
||||||
m_pa_ctx = nullptr;
|
m_pa_ctx = nullptr;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -152,6 +167,7 @@ int pulse_device::disable_hw_rx()
|
||||||
//Enable hardware trasmit
|
//Enable hardware trasmit
|
||||||
int pulse_device::enable_hw_tx()
|
int pulse_device::enable_hw_tx()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
/* Pulse receive config */
|
/* Pulse receive config */
|
||||||
const pa_sample_spec pconfig
|
const pa_sample_spec pconfig
|
||||||
{
|
{
|
||||||
|
@ -171,6 +187,7 @@ int pulse_device::enable_hw_tx()
|
||||||
//Disable hardware tramsmit
|
//Disable hardware tramsmit
|
||||||
int pulse_device::disable_hw_tx()
|
int pulse_device::disable_hw_tx()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( m_pulse_mutex );
|
||||||
int error = 0;
|
int error = 0;
|
||||||
/* Make sure that every single sample was played */
|
/* Make sure that every single sample was played */
|
||||||
if (pa_simple_drain(m_pa_ctx, &error) < 0)
|
if (pa_simple_drain(m_pa_ctx, &error) < 0)
|
||||||
|
@ -186,7 +203,7 @@ int pulse_device::disable_hw_tx()
|
||||||
void pulse_device::lock( int id )
|
void pulse_device::lock( int id )
|
||||||
{
|
{
|
||||||
if( id == trx_device_base::lock_object )
|
if( id == trx_device_base::lock_object )
|
||||||
m_thrmutex.lock();
|
m_codec_mutex.lock();
|
||||||
else if( id == trx_device_base::lock_spectrum )
|
else if( id == trx_device_base::lock_spectrum )
|
||||||
m_sectrum_mutex.lock();
|
m_sectrum_mutex.lock();
|
||||||
}
|
}
|
||||||
|
@ -194,7 +211,7 @@ void pulse_device::lock( int id )
|
||||||
void pulse_device::unlock( int id )
|
void pulse_device::unlock( int id )
|
||||||
{
|
{
|
||||||
if( id == trx_device_base::lock_object )
|
if( id == trx_device_base::lock_object )
|
||||||
m_thrmutex.unlock();
|
m_codec_mutex.unlock();
|
||||||
else if( id == trx_device_base::lock_spectrum )
|
else if( id == trx_device_base::lock_spectrum )
|
||||||
m_sectrum_mutex.unlock();
|
m_sectrum_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
@ -202,7 +219,7 @@ void pulse_device::unlock( int id )
|
||||||
bool pulse_device::try_lock( int id )
|
bool pulse_device::try_lock( int id )
|
||||||
{
|
{
|
||||||
if( id == trx_device_base::lock_object )
|
if( id == trx_device_base::lock_object )
|
||||||
return m_thrmutex.try_lock();
|
return m_codec_mutex.try_lock();
|
||||||
else if( id == trx_device_base::lock_spectrum )
|
else if( id == trx_device_base::lock_spectrum )
|
||||||
return m_sectrum_mutex.try_lock();
|
return m_sectrum_mutex.try_lock();
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -508,7 +508,7 @@ int encoder_main( const char *filename )
|
||||||
|
|
||||||
/* *************************** MAIN LOOP ********************************** */
|
/* *************************** MAIN LOOP ********************************** */
|
||||||
|
|
||||||
#if 0 /* Disabled for real pulse testing */
|
#if 0 /* Disabled for real pulse testing */
|
||||||
int main(int argc, const char * const *argv )
|
int main(int argc, const char * const *argv )
|
||||||
{
|
{
|
||||||
if(argc < 2)
|
if(argc < 2)
|
||||||
|
@ -547,10 +547,11 @@ int main(int argc, const char * const *argv )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void decoder_callback( const ham::psk::event &ev )
|
void decoder_callback( int idx, const ham::psk::event &ev )
|
||||||
{
|
{
|
||||||
using namespace ham::psk;
|
using namespace ham::psk;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
cout << idx << " ";
|
||||||
switch( ev.evt )
|
switch( ev.evt )
|
||||||
{
|
{
|
||||||
case event::type::rx_char:
|
case event::type::rx_char:
|
||||||
|
@ -568,13 +569,16 @@ void decoder_callback( const ham::psk::event &ev )
|
||||||
case event::type::tx_end:
|
case event::type::tx_end:
|
||||||
cout << "TRANSMIT FINISHED" << endl;
|
cout << "TRANSMIT FINISHED" << endl;
|
||||||
break;
|
break;
|
||||||
|
case event::type::spectrum:
|
||||||
|
cout << "SPECTRUM AVAIL " << endl;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cout << "Unknown evt" << endl;
|
cout << "Unknown evt " << int( ev.evt ) << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
int main(int /*argc*/, const char * const */*argv*/ )
|
int main(int /*argc*/, const char * const */*argv*/ )
|
||||||
{
|
{
|
||||||
namespace psk = ham::psk;
|
namespace psk = ham::psk;
|
||||||
|
@ -598,6 +602,28 @@ int main(int /*argc*/, const char * const */*argv*/ )
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
int main(int /*argc*/, const char * const */*argv*/ )
|
||||||
|
{
|
||||||
|
namespace psk = ham::psk;
|
||||||
|
psk::ham_digi ham_digi( decoder_callback );
|
||||||
|
std:: cout << ham_digi.set_modulation( psk::ham_digi::modulation::psk ) << std::endl;
|
||||||
|
ham_digi.rx()->set_frequency( 2125 );
|
||||||
|
ham_digi.rx()->set_afc_limit( 100 );
|
||||||
|
ham_digi.rx()->set_mode( psk::mod_psk_config(psk::mod_psk_config::mode::qpsku, psk::mod_psk_config::baud::b31) );
|
||||||
|
ham_digi.tx()->set_mode( psk::mod_psk_config(psk::mod_psk_config::mode::qpsku, psk::mod_psk_config::baud::b31));
|
||||||
|
ham_digi.tx()->set_freqency( 2125 );
|
||||||
|
const char txt[] = "Ala ma kota a KOT ma ale teraz bedzie nieco dluzszy tekst a im tekst dluzszy tym lepszy";
|
||||||
|
for(size_t i=0;i<sizeof txt -1; i++)
|
||||||
|
ham_digi.tx()->put_tx( txt[i] );
|
||||||
|
std::cout << ham_digi.enable( true ) << std::endl;
|
||||||
|
::sleep(2);
|
||||||
|
std::cout << "TRANSMIT " << std::endl;
|
||||||
|
std::cout << ham_digi.set_tx( true ) << std::endl;
|
||||||
|
std::cout << ham_digi.join() << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#else /*ARM defined test only */
|
#else /*ARM defined test only */
|
||||||
|
|
||||||
void decoder_callback( int event, int param, int param2 )
|
void decoder_callback( int event, int param, int param2 )
|
||||||
|
|
Ładowanie…
Reference in New Issue