2011-10-01 18:45:20 +00:00
/*!
* \ file control_thread . cc
2011-12-27 21:21:12 +00:00
* \ brief This class implements the receiver control plane
2011-10-01 18:45:20 +00:00
* \ author Carlos Aviles , 2010. carlos . avilesr ( at ) googlemail . com
*
2011-12-27 21:21:12 +00:00
* GNSS Receiver Control Plane : connects the flowgraph , starts running it ,
* and while it does not stop , reads the control messages generated by the blocks ,
* process them , and apply the corresponding actions .
2011-10-01 18:45:20 +00:00
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
2018-05-13 20:49:11 +00:00
* Copyright ( C ) 2010 - 2018 ( see AUTHORS file for a list of contributors )
2011-10-01 18:45:20 +00:00
*
* GNSS - SDR is a software defined Global Navigation
* Satellite Systems receiver
*
* This file is part of GNSS - SDR .
*
* GNSS - SDR 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 , either version 3 of the License , or
2014-12-21 21:46:57 +00:00
* ( at your option ) any later version .
2011-10-01 18:45:20 +00:00
*
* GNSS - SDR 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 for more details .
*
* You should have received a copy of the GNU General Public License
2018-05-13 20:49:11 +00:00
* along with GNSS - SDR . If not , see < https : //www.gnu.org/licenses/>.
2011-10-01 18:45:20 +00:00
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# include "control_thread.h"
2018-02-26 02:15:53 +00:00
# include "concurrent_queue.h"
# include "concurrent_map.h"
# include "control_message_factory.h"
# include "file_configuration.h"
# include "gnss_flowgraph.h"
# include "gnss_sdr_flags.h"
# include "galileo_ephemeris.h"
# include "galileo_iono.h"
# include "galileo_utc_model.h"
# include "galileo_almanac.h"
# include "gps_ephemeris.h"
# include "gps_iono.h"
# include "gps_utc_model.h"
# include "gps_almanac.h"
2018-10-20 17:30:32 +00:00
# include "glonass_gnav_ephemeris.h"
# include "glonass_gnav_utc_model.h"
2018-02-26 02:15:53 +00:00
# include <boost/lexical_cast.hpp>
# include <boost/chrono.hpp>
# include <glog/logging.h>
# include <gnuradio/message.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
2016-10-03 11:43:20 +00:00
# include <cmath>
2014-03-16 19:58:29 +00:00
# include <iostream>
2016-10-03 11:43:20 +00:00
# include <limits>
2014-01-12 20:07:38 +00:00
# include <map>
# include <string>
2018-02-26 02:15:53 +00:00
2014-01-12 20:07:38 +00:00
2013-03-20 18:19:26 +00:00
extern concurrent_map < Gps_Acq_Assist > global_gps_acq_assist_map ;
extern concurrent_queue < Gps_Acq_Assist > global_gps_acq_assist_queue ;
2013-08-27 14:32:44 +00:00
2011-10-01 18:45:20 +00:00
using google : : LogMessage ;
ControlThread : : ControlThread ( )
{
2018-03-03 01:03:39 +00:00
if ( ! FLAGS_c . compare ( " - " ) )
2018-02-18 11:23:55 +00:00
{
2018-03-03 01:03:39 +00:00
configuration_ = std : : make_shared < FileConfiguration > ( FLAGS_config_file ) ;
2018-02-18 11:23:55 +00:00
}
else
{
configuration_ = std : : make_shared < FileConfiguration > ( FLAGS_c ) ;
}
2015-05-13 21:26:44 +00:00
delete_configuration_ = false ;
2011-10-01 18:45:20 +00:00
init ( ) ;
}
2012-11-01 16:39:06 +00:00
2014-04-03 21:59:14 +00:00
ControlThread : : ControlThread ( std : : shared_ptr < ConfigurationInterface > configuration )
2011-10-01 18:45:20 +00:00
{
configuration_ = configuration ;
2015-05-13 21:26:44 +00:00
delete_configuration_ = false ;
2011-10-01 18:45:20 +00:00
init ( ) ;
}
2012-11-01 16:39:06 +00:00
2011-10-01 18:45:20 +00:00
ControlThread : : ~ ControlThread ( )
{
2013-11-17 10:48:27 +00:00
// save navigation data to files
2018-03-03 01:03:39 +00:00
// if (save_assistance_to_XML() == true) {}
if ( msqid ! = - 1 ) msgctl ( msqid , IPC_RMID , NULL ) ;
2011-10-01 18:45:20 +00:00
}
2012-11-01 16:39:06 +00:00
2011-12-28 03:05:37 +00:00
/*
* Runs the control thread that manages the receiver control plane
*
* This is the main loop that reads and process the control messages
* 1 - Connect the GNSS receiver flowgraph
* 2 - Start the GNSS receiver flowgraph
* while ( flowgraph_ - > running ( ) & & ! stop ) _ {
* 3 - Read control messages and process them }
*/
2011-10-01 18:45:20 +00:00
void ControlThread : : run ( )
{
2012-11-01 16:39:06 +00:00
// Connect the flowgraph
2018-05-01 21:32:52 +00:00
try
{
flowgraph_ - > connect ( ) ;
}
2018-05-15 16:31:34 +00:00
catch ( const std : : exception & e )
2018-05-01 21:32:52 +00:00
{
LOG ( ERROR ) < < e . what ( ) ;
return ;
}
2011-10-01 18:45:20 +00:00
if ( flowgraph_ - > connected ( ) )
2011-12-28 21:36:45 +00:00
{
2014-03-16 19:58:29 +00:00
LOG ( INFO ) < < " Flowgraph connected " ;
2011-12-28 21:36:45 +00:00
}
2011-10-01 18:45:20 +00:00
else
2011-12-28 21:36:45 +00:00
{
2014-03-16 19:58:29 +00:00
LOG ( ERROR ) < < " Unable to connect flowgraph " ;
2011-12-28 21:36:45 +00:00
return ;
}
2012-11-01 16:39:06 +00:00
// Start the flowgraph
2011-10-01 18:45:20 +00:00
flowgraph_ - > start ( ) ;
if ( flowgraph_ - > running ( ) )
2011-12-28 21:36:45 +00:00
{
2014-03-16 19:58:29 +00:00
LOG ( INFO ) < < " Flowgraph started " ;
2011-12-28 21:36:45 +00:00
}
2011-10-01 18:45:20 +00:00
else
2011-12-28 21:36:45 +00:00
{
2014-03-16 19:58:29 +00:00
LOG ( ERROR ) < < " Unable to start flowgraph " ;
2011-12-28 21:36:45 +00:00
return ;
}
2016-05-03 10:34:38 +00:00
//launch GNSS assistance process AFTER the flowgraph is running because the GNURadio asynchronous queues must be already running to transport msgs
assist_GNSS ( ) ;
2012-03-16 12:04:36 +00:00
// start the keyboard_listener thread
keyboard_thread_ = boost : : thread ( & ControlThread : : keyboard_listener , this ) ;
2016-10-01 15:32:38 +00:00
sysv_queue_thread_ = boost : : thread ( & ControlThread : : sysv_queue_listener , this ) ;
2012-03-16 12:04:36 +00:00
2018-03-20 17:06:20 +00:00
bool enable_FPGA = configuration_ - > property ( " Channel.enable_FPGA " , false ) ;
if ( enable_FPGA = = true )
2018-05-01 21:32:52 +00:00
{
flowgraph_ - > start_acquisition_helper ( ) ;
}
2018-03-20 17:06:20 +00:00
2011-10-01 18:45:20 +00:00
// Main loop to read and process the control messages
while ( flowgraph_ - > running ( ) & & ! stop_ )
2011-12-28 21:36:45 +00:00
{
//TODO re-enable the blocking read messages functions and fork the process
read_control_messages ( ) ;
if ( control_messages_ ! = 0 ) process_control_messages ( ) ;
}
2013-11-17 10:48:27 +00:00
std : : cout < < " Stopping GNSS-SDR, please wait! " < < std : : endl ;
2013-03-20 18:19:26 +00:00
flowgraph_ - > stop ( ) ;
2015-12-30 13:43:32 +00:00
stop_ = true ;
2018-04-23 05:41:13 +00:00
flowgraph_ - > disconnect ( ) ;
2013-08-27 14:32:44 +00:00
2015-12-30 13:43:32 +00:00
//Join keyboard thread
# ifdef OLD_BOOST
2012-11-02 11:14:23 +00:00
keyboard_thread_ . timed_join ( boost : : posix_time : : seconds ( 1 ) ) ;
2016-10-01 15:32:38 +00:00
sysv_queue_thread_ . timed_join ( boost : : posix_time : : seconds ( 1 ) ) ;
2014-12-21 21:46:57 +00:00
# endif
# ifndef OLD_BOOST
2016-04-18 12:38:25 +00:00
keyboard_thread_ . try_join_until ( boost : : chrono : : steady_clock : : now ( ) + boost : : chrono : : milliseconds ( 1000 ) ) ;
2016-10-01 15:32:38 +00:00
sysv_queue_thread_ . try_join_until ( boost : : chrono : : steady_clock : : now ( ) + boost : : chrono : : milliseconds ( 1000 ) ) ;
2014-12-21 21:46:57 +00:00
# endif
2013-03-20 18:19:26 +00:00
2014-03-16 19:58:29 +00:00
LOG ( INFO ) < < " Flowgraph stopped " ;
2011-10-01 18:45:20 +00:00
}
2012-11-01 16:39:06 +00:00
2017-12-21 12:05:21 +00:00
void ControlThread : : set_control_queue ( gr : : msg_queue : : sptr control_queue )
2011-10-01 18:45:20 +00:00
{
if ( flowgraph_ - > running ( ) )
2011-12-28 21:36:45 +00:00
{
2014-03-16 19:58:29 +00:00
LOG ( WARNING ) < < " Unable to set control queue while flowgraph is running " ;
2011-12-28 21:36:45 +00:00
return ;
}
2011-10-01 18:45:20 +00:00
control_queue_ = control_queue ;
}
2011-12-27 21:21:12 +00:00
2014-04-28 14:27:47 +00:00
/*
* Returns true if reading was successful
*/
2016-04-13 14:19:15 +00:00
bool ControlThread : : read_assistance_from_XML ( )
{
// return variable (true == succeeded)
bool ret = false ;
// getting names from the config file, if available
std : : string eph_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ephemeris_xml " , eph_default_xml_filename ) ;
std : : string utc_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_utc_model.xml " , utc_default_xml_filename ) ;
std : : string iono_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_iono_xml " , iono_default_xml_filename ) ;
2018-10-18 13:46:48 +00:00
std : : string gal_iono_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gal_iono_xml " , gal_iono_default_xml_filename ) ;
2016-04-13 14:19:15 +00:00
std : : string ref_time_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ref_time_xml " , ref_time_default_xml_filename ) ;
std : : string ref_location_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ref_location_xml " , ref_location_default_xml_filename ) ;
2018-10-17 17:17:37 +00:00
std : : string eph_gal_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gal_ephemeris_xml " , eph_gal_default_xml_filename ) ;
std : : string eph_cnav_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_cnav_ephemeris_xml " , eph_cnav_default_xml_filename ) ;
2018-10-18 13:46:48 +00:00
std : : string gal_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gal_utc_model.xml " , gal_utc_default_xml_filename ) ;
2018-10-19 12:48:41 +00:00
std : : string cnav_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_cnav_utc_model.xml " , cnav_utc_default_xml_filename ) ;
2018-10-20 17:30:32 +00:00
std : : string eph_glo_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_glo_ephemeris_xml " , eph_glo_gnav_default_xml_filename ) ;
std : : string glo_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_glo_utc_model.xml " , glo_utc_default_xml_filename ) ;
2018-10-18 07:29:21 +00:00
2018-10-21 11:58:29 +00:00
if ( configuration_ - > property ( " GNSS-SDR.AGNSS_XML_enabled " , false ) = = true )
{
eph_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_ephemeris_xml " , eph_default_xml_filename ) ;
utc_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_utc_model.xml " , utc_default_xml_filename ) ;
iono_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_iono_xml " , iono_default_xml_filename ) ;
gal_iono_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gal_iono_xml " , gal_iono_default_xml_filename ) ;
ref_time_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_ref_time_xml " , ref_time_default_xml_filename ) ;
ref_location_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_ref_location_xml " , ref_location_default_xml_filename ) ;
eph_gal_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gal_ephemeris_xml " , eph_gal_default_xml_filename ) ;
eph_cnav_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gps_cnav_ephemeris_xml " , eph_cnav_default_xml_filename ) ;
gal_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_gal_utc_model.xml " , gal_utc_default_xml_filename ) ;
cnav_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_cnav_utc_model.xml " , cnav_utc_default_xml_filename ) ;
eph_glo_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_glo_ephemeris_xml " , eph_glo_gnav_default_xml_filename ) ;
glo_utc_xml_filename = configuration_ - > property ( " GNSS-SDR.AGNSS_glo_utc_model.xml " , glo_utc_default_xml_filename ) ;
}
2018-10-20 12:46:55 +00:00
std : : cout < < " Trying to read GNSS ephemeris from XML file(s)... " < < std : : endl ;
2018-10-18 07:29:21 +00:00
2018-10-20 12:46:55 +00:00
if ( configuration_ - > property ( " Channels_1C.count " , 0 ) > 0 )
2016-04-13 14:19:15 +00:00
{
2018-10-20 12:46:55 +00:00
if ( supl_client_ephemeris_ . load_ephemeris_xml ( eph_xml_filename ) = = true )
2016-04-13 14:19:15 +00:00
{
2018-10-20 12:46:55 +00:00
std : : map < int , Gps_Ephemeris > : : const_iterator gps_eph_iter ;
for ( gps_eph_iter = supl_client_ephemeris_ . gps_ephemeris_map . cbegin ( ) ;
gps_eph_iter ! = supl_client_ephemeris_ . gps_ephemeris_map . cend ( ) ;
gps_eph_iter + + )
{
std : : cout < < " From XML file: Read NAV ephemeris for satellite " < < Gnss_Satellite ( " GPS " , gps_eph_iter - > second . i_satellite_PRN ) < < std : : endl ;
std : : shared_ptr < Gps_Ephemeris > tmp_obj = std : : make_shared < Gps_Ephemeris > ( gps_eph_iter - > second ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
ret = true ;
2016-04-13 14:19:15 +00:00
}
2018-10-17 18:39:06 +00:00
2018-10-20 12:46:55 +00:00
if ( supl_client_acquisition_ . load_utc_xml ( utc_xml_filename ) = = true )
2018-10-17 16:22:04 +00:00
{
2018-10-20 12:46:55 +00:00
std : : shared_ptr < Gps_Utc_Model > tmp_obj = std : : make_shared < Gps_Utc_Model > ( supl_client_acquisition_ . gps_utc ) ;
2018-10-17 16:22:04 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2018-10-20 12:46:55 +00:00
std : : cout < < " From XML file: Read GPS UTC parameters. " < < std : : endl ;
ret = true ;
2018-10-17 16:22:04 +00:00
}
2018-10-17 18:39:06 +00:00
2018-10-20 12:46:55 +00:00
if ( supl_client_acquisition_ . load_iono_xml ( iono_xml_filename ) = = true )
2018-10-17 17:17:37 +00:00
{
2018-10-20 12:46:55 +00:00
std : : shared_ptr < Gps_Iono > tmp_obj = std : : make_shared < Gps_Iono > ( supl_client_acquisition_ . gps_iono ) ;
2018-10-17 17:17:37 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2018-10-20 12:46:55 +00:00
std : : cout < < " From XML file: Read GPS iono parameters. " < < std : : endl ;
ret = true ;
2018-10-17 17:17:37 +00:00
}
}
2018-10-18 13:46:48 +00:00
2018-10-20 12:46:55 +00:00
if ( ( configuration_ - > property ( " Channels_1B.count " , 0 ) > 0 ) or ( configuration_ - > property ( " Channels_5X.count " , 0 ) > 0 ) )
2018-10-18 13:46:48 +00:00
{
2018-10-20 12:46:55 +00:00
if ( supl_client_ephemeris_ . load_gal_ephemeris_xml ( eph_gal_xml_filename ) = = true )
{
std : : map < int , Galileo_Ephemeris > : : const_iterator gal_eph_iter ;
for ( gal_eph_iter = supl_client_ephemeris_ . gal_ephemeris_map . cbegin ( ) ;
gal_eph_iter ! = supl_client_ephemeris_ . gal_ephemeris_map . cend ( ) ;
gal_eph_iter + + )
{
std : : cout < < " From XML file: Read ephemeris for satellite " < < Gnss_Satellite ( " Galileo " , gal_eph_iter - > second . i_satellite_PRN ) < < std : : endl ;
std : : shared_ptr < Galileo_Ephemeris > tmp_obj = std : : make_shared < Galileo_Ephemeris > ( gal_eph_iter - > second ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
ret = true ;
}
2018-10-18 13:46:48 +00:00
2018-10-20 12:46:55 +00:00
if ( supl_client_acquisition_ . load_gal_iono_xml ( gal_iono_xml_filename ) = = true )
{
std : : shared_ptr < Galileo_Iono > tmp_obj = std : : make_shared < Galileo_Iono > ( supl_client_acquisition_ . gal_iono ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
std : : cout < < " From XML file: Read Galileo iono parameters. " < < std : : endl ;
ret = true ;
}
2018-10-18 13:46:48 +00:00
2018-10-20 12:46:55 +00:00
if ( supl_client_acquisition_ . load_gal_utc_xml ( gal_utc_xml_filename ) = = true )
{
std : : shared_ptr < Galileo_Utc_Model > tmp_obj = std : : make_shared < Galileo_Utc_Model > ( supl_client_acquisition_ . gal_utc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
std : : cout < < " From XML file: Read Galileo UTC parameters. " < < std : : endl ;
ret = true ;
}
2018-10-18 13:46:48 +00:00
}
2018-10-20 12:46:55 +00:00
if ( ( configuration_ - > property ( " Channels_2S.count " , 0 ) > 0 ) or ( configuration_ - > property ( " Channels_L5.count " , 0 ) > 0 ) )
2018-10-18 13:46:48 +00:00
{
2018-10-20 12:46:55 +00:00
if ( supl_client_ephemeris_ . load_cnav_ephemeris_xml ( eph_cnav_xml_filename ) = = true )
{
std : : map < int , Gps_CNAV_Ephemeris > : : const_iterator gps_cnav_eph_iter ;
for ( gps_cnav_eph_iter = supl_client_ephemeris_ . gps_cnav_ephemeris_map . cbegin ( ) ;
gps_cnav_eph_iter ! = supl_client_ephemeris_ . gps_cnav_ephemeris_map . cend ( ) ;
gps_cnav_eph_iter + + )
{
std : : cout < < " From XML file: Read CNAV ephemeris for satellite " < < Gnss_Satellite ( " GPS " , gps_cnav_eph_iter - > second . i_satellite_PRN ) < < std : : endl ;
std : : shared_ptr < Gps_CNAV_Ephemeris > tmp_obj = std : : make_shared < Gps_CNAV_Ephemeris > ( gps_cnav_eph_iter - > second ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
ret = true ;
}
2018-10-18 13:46:48 +00:00
2018-10-20 12:46:55 +00:00
if ( supl_client_acquisition_ . load_cnav_utc_xml ( cnav_utc_xml_filename ) = = true )
{
std : : shared_ptr < Gps_CNAV_Utc_Model > tmp_obj = std : : make_shared < Gps_CNAV_Utc_Model > ( supl_client_acquisition_ . gps_cnav_utc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
std : : cout < < " From XML file: Read GPS CNAV UTC parameters. " < < std : : endl ;
ret = true ;
}
2018-10-19 12:48:41 +00:00
}
2018-10-20 17:30:32 +00:00
if ( ( configuration_ - > property ( " Channels_1G.count " , 0 ) > 0 ) or ( configuration_ - > property ( " Channels_2G.count " , 0 ) > 0 ) )
{
if ( supl_client_ephemeris_ . load_gnav_ephemeris_xml ( eph_glo_xml_filename ) = = true )
{
std : : map < int , Glonass_Gnav_Ephemeris > : : const_iterator glo_gnav_eph_iter ;
for ( glo_gnav_eph_iter = supl_client_ephemeris_ . glonass_gnav_ephemeris_map . cbegin ( ) ;
glo_gnav_eph_iter ! = supl_client_ephemeris_ . glonass_gnav_ephemeris_map . cend ( ) ;
glo_gnav_eph_iter + + )
{
std : : cout < < " From XML file: Read GLONASS GNAV ephemeris for satellite " < < Gnss_Satellite ( " GLONASS " , glo_gnav_eph_iter - > second . i_satellite_PRN ) < < std : : endl ;
std : : shared_ptr < Glonass_Gnav_Ephemeris > tmp_obj = std : : make_shared < Glonass_Gnav_Ephemeris > ( glo_gnav_eph_iter - > second ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
ret = true ;
}
if ( supl_client_acquisition_ . load_glo_utc_xml ( glo_utc_xml_filename ) = = true )
{
std : : shared_ptr < Glonass_Gnav_Utc_Model > tmp_obj = std : : make_shared < Glonass_Gnav_Utc_Model > ( supl_client_acquisition_ . glo_gnav_utc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
std : : cout < < " From XML file: Read GLONASS UTC parameters. " < < std : : endl ;
ret = true ;
}
}
2018-10-17 18:39:06 +00:00
if ( ret = = false )
2016-04-13 14:19:15 +00:00
{
2018-10-21 11:58:29 +00:00
std : : cout < < " Error reading XML files " < < std : : endl ;
std : : cout < < " Disabling GNSS assistance... " < < std : : endl ;
2016-04-13 14:19:15 +00:00
}
2018-10-18 13:46:48 +00:00
// Only look for {ref time, ref location} if SUPL is enabled
2016-04-13 14:19:15 +00:00
bool enable_gps_supl_assistance = configuration_ - > property ( " GNSS-SDR.SUPL_gps_enabled " , false ) ;
if ( enable_gps_supl_assistance = = true )
{
// Try to read Ref Time from XML
if ( supl_client_acquisition_ . load_ref_time_xml ( ref_time_xml_filename ) = = true )
{
LOG ( INFO ) < < " SUPL: Read XML Ref Time " ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Ref_Time > tmp_obj = std : : make_shared < Gps_Ref_Time > ( supl_client_acquisition_ . gps_time ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
else
{
LOG ( INFO ) < < " SUPL: couldn't read Ref Time XML " ;
}
2013-11-17 10:48:27 +00:00
2016-04-13 14:19:15 +00:00
// Try to read Ref Location from XML
if ( supl_client_acquisition_ . load_ref_location_xml ( ref_location_xml_filename ) = = true )
{
LOG ( INFO ) < < " SUPL: Read XML Ref Location " ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Ref_Location > tmp_obj = std : : make_shared < Gps_Ref_Location > ( supl_client_acquisition_ . gps_ref_loc ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
else
{
LOG ( INFO ) < < " SUPL: couldn't read Ref Location XML " ;
}
}
return ret ;
}
2018-05-01 21:32:52 +00:00
2016-05-03 10:34:38 +00:00
void ControlThread : : assist_GNSS ( )
2011-10-01 18:45:20 +00:00
{
2013-11-17 10:48:27 +00:00
//######### GNSS Assistance #################################
// GNSS Assistance configuration
bool enable_gps_supl_assistance = configuration_ - > property ( " GNSS-SDR.SUPL_gps_enabled " , false ) ;
2018-10-21 11:58:29 +00:00
bool enable_xml_agnss_enabled = configuration_ - > property ( " GNSS-SDR.AGNSS_XML_enabled " , false ) ;
if ( ( enable_gps_supl_assistance = = true ) and ( enable_xml_agnss_enabled = = false ) )
2013-11-17 10:48:27 +00:00
{
std : : cout < < " SUPL RRLP GPS assistance enabled! " < < std : : endl ;
2018-10-21 11:58:29 +00:00
std : : string default_acq_server = " supl.google.com " ;
2013-11-17 10:48:27 +00:00
std : : string default_eph_server = " supl.google.com " ;
supl_client_ephemeris_ . server_name = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ephemeris_server " , default_acq_server ) ;
supl_client_acquisition_ . server_name = configuration_ - > property ( " GNSS-SDR.SUPL_gps_acquisition_server " , default_eph_server ) ;
supl_client_ephemeris_ . server_port = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ephemeris_port " , 7275 ) ;
supl_client_acquisition_ . server_port = configuration_ - > property ( " GNSS-SDR.SUPL_gps_acquisition_port " , 7275 ) ;
supl_mcc = configuration_ - > property ( " GNSS-SDR.SUPL_MCC " , 244 ) ;
supl_mns = configuration_ - > property ( " GNSS-SDR.SUPL_MNS " , 5 ) ;
std : : string default_lac = " 0x59e2 " ;
std : : string default_ci = " 0x31b0 " ;
try
2018-03-03 01:03:39 +00:00
{
2013-11-17 10:48:27 +00:00
supl_lac = boost : : lexical_cast < int > ( configuration_ - > property ( " GNSS-SDR.SUPL_LAC " , default_lac ) ) ;
2018-03-03 01:03:39 +00:00
}
catch ( boost : : bad_lexical_cast & )
{
2013-11-17 10:48:27 +00:00
supl_lac = 0x59e2 ;
2018-03-03 01:03:39 +00:00
}
2013-11-17 10:48:27 +00:00
try
2018-03-03 01:03:39 +00:00
{
2013-11-17 10:48:27 +00:00
supl_ci = boost : : lexical_cast < int > ( configuration_ - > property ( " GNSS-SDR.SUPL_CI " , default_ci ) ) ;
2018-03-03 01:03:39 +00:00
}
catch ( boost : : bad_lexical_cast & )
{
2013-11-17 10:48:27 +00:00
supl_ci = 0x31b0 ;
2018-03-03 01:03:39 +00:00
}
2013-11-17 10:48:27 +00:00
bool SUPL_read_gps_assistance_xml = configuration_ - > property ( " GNSS-SDR.SUPL_read_gps_assistance_xml " , false ) ;
if ( SUPL_read_gps_assistance_xml = = true )
{
// read assistance from file
2016-05-04 17:15:18 +00:00
if ( read_assistance_from_XML ( ) )
{
2018-10-18 07:29:21 +00:00
std : : cout < < " GNSS assistance data loaded from local XML file(s). " < < std : : endl ;
2016-05-04 17:15:18 +00:00
}
2013-11-17 10:48:27 +00:00
}
else
{
// Request ephemeris from SUPL server
int error ;
supl_client_ephemeris_ . request = 1 ;
2016-05-04 17:15:18 +00:00
std : : cout < < " SUPL: Try to read GPS ephemeris from SUPL server... " < < std : : endl ;
2013-11-17 10:48:27 +00:00
error = supl_client_ephemeris_ . get_assistance ( supl_mcc , supl_mns , supl_lac , supl_ci ) ;
if ( error = = 0 )
{
2018-03-03 01:03:39 +00:00
std : : map < int , Gps_Ephemeris > : : const_iterator gps_eph_iter ;
for ( gps_eph_iter = supl_client_ephemeris_ . gps_ephemeris_map . cbegin ( ) ;
gps_eph_iter ! = supl_client_ephemeris_ . gps_ephemeris_map . cend ( ) ;
gps_eph_iter + + )
2013-11-17 10:48:27 +00:00
{
2018-10-21 11:58:29 +00:00
std : : cout < < " SUPL: Received Ephemeris for GPS satellite " < < Gnss_Satellite ( " GPS " , gps_eph_iter - > second . i_satellite_PRN ) < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Ephemeris > tmp_obj = std : : make_shared < Gps_Ephemeris > ( gps_eph_iter - > second ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2013-11-17 10:48:27 +00:00
}
2018-10-21 11:58:29 +00:00
// Save ephemeris to XML file
2014-04-28 14:27:47 +00:00
std : : string eph_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_ephemeris_xml " , eph_default_xml_filename ) ;
if ( supl_client_ephemeris_ . save_ephemeris_map_xml ( eph_xml_filename , supl_client_ephemeris_ . gps_ephemeris_map ) = = true )
2013-11-17 10:48:27 +00:00
{
std : : cout < < " SUPL: XML Ephemeris file created " < < std : : endl ;
}
2014-04-28 14:27:47 +00:00
else
{
std : : cout < < " SUPL: Failed to create XML Ephemeris file " < < std : : endl ;
}
2013-11-17 10:48:27 +00:00
}
else
{
std : : cout < < " ERROR: SUPL client for Ephemeris returned " < < error < < std : : endl ;
2018-10-21 11:58:29 +00:00
std : : cout < < " Please check internet connection and SUPL server configuration " < < std : : endl ;
2016-05-03 10:34:38 +00:00
std : : cout < < " Trying to read ephemeris from XML file " < < std : : endl ;
if ( read_assistance_from_XML ( ) = = false )
{
2016-05-04 17:15:18 +00:00
std : : cout < < " ERROR: Could not read Ephemeris file: Disabling SUPL assistance. " < < std : : endl ;
2016-05-03 10:34:38 +00:00
}
2013-11-17 10:48:27 +00:00
}
2018-10-21 11:58:29 +00:00
// Request almanac, IONO and UTC Model data
2013-11-17 10:48:27 +00:00
supl_client_ephemeris_ . request = 0 ;
std : : cout < < " SUPL: Try read Almanac, Iono, Utc Model, Ref Time and Ref Location from SUPL server... " < < std : : endl ;
error = supl_client_ephemeris_ . get_assistance ( supl_mcc , supl_mns , supl_lac , supl_ci ) ;
if ( error = = 0 )
{
2018-03-03 01:03:39 +00:00
std : : map < int , Gps_Almanac > : : const_iterator gps_alm_iter ;
for ( gps_alm_iter = supl_client_ephemeris_ . gps_almanac_map . cbegin ( ) ;
gps_alm_iter ! = supl_client_ephemeris_ . gps_almanac_map . cend ( ) ;
gps_alm_iter + + )
2013-11-17 10:48:27 +00:00
{
2018-10-21 11:58:29 +00:00
std : : cout < < " SUPL: Received Almanac for GPS satellite " < < Gnss_Satellite ( " GPS " , gps_alm_iter - > second . i_satellite_PRN ) < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Almanac > tmp_obj = std : : make_shared < Gps_Almanac > ( gps_alm_iter - > second ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2013-11-17 10:48:27 +00:00
}
if ( supl_client_ephemeris_ . gps_iono . valid = = true )
{
std : : cout < < " SUPL: Received GPS Iono " < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Iono > tmp_obj = std : : make_shared < Gps_Iono > ( supl_client_ephemeris_ . gps_iono ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2013-11-17 10:48:27 +00:00
}
if ( supl_client_ephemeris_ . gps_utc . valid = = true )
2016-05-04 17:15:18 +00:00
{
2013-11-17 10:48:27 +00:00
std : : cout < < " SUPL: Received GPS UTC Model " < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Utc_Model > tmp_obj = std : : make_shared < Gps_Utc_Model > ( supl_client_ephemeris_ . gps_utc ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2013-11-17 10:48:27 +00:00
}
2018-10-21 11:58:29 +00:00
// Save iono and UTC model data to xml file
std : : string iono_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_iono_xml " , iono_default_xml_filename ) ;
if ( supl_client_ephemeris_ . save_iono_xml ( iono_xml_filename , supl_client_ephemeris_ . gps_iono ) = = true )
{
std : : cout < < " SUPL: Iono data file created " < < std : : endl ;
}
else
{
std : : cout < < " SUPL: Failed to create Iono data file " < < std : : endl ;
}
std : : string utc_xml_filename = configuration_ - > property ( " GNSS-SDR.SUPL_gps_utc_model.xml " , utc_default_xml_filename ) ;
if ( supl_client_ephemeris_ . save_utc_xml ( utc_xml_filename , supl_client_ephemeris_ . gps_utc ) = = true )
{
std : : cout < < " SUPL: UTC model file created " < < std : : endl ;
}
else
{
std : : cout < < " SUPL: Failed to create XML UTC model file " < < std : : endl ;
}
2013-11-17 10:48:27 +00:00
}
else
{
std : : cout < < " ERROR: SUPL client for Almanac returned " < < error < < std : : endl ;
2018-10-21 11:58:29 +00:00
std : : cout < < " Please check internet connection and SUPL server configuration " < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : cout < < " Disabling SUPL assistance. " < < std : : endl ;
2013-11-17 10:48:27 +00:00
}
// Request acquisition assistance
supl_client_acquisition_ . request = 2 ;
2016-05-04 17:15:18 +00:00
std : : cout < < " SUPL: Try read Acquisition assistance from SUPL server... " < < std : : endl ;
2013-11-17 10:48:27 +00:00
error = supl_client_acquisition_ . get_assistance ( supl_mcc , supl_mns , supl_lac , supl_ci ) ;
if ( error = = 0 )
{
2017-08-17 09:03:02 +00:00
std : : map < int , Gps_Acq_Assist > : : const_iterator gps_acq_iter ;
2018-03-03 01:03:39 +00:00
for ( gps_acq_iter = supl_client_acquisition_ . gps_acq_map . cbegin ( ) ;
gps_acq_iter ! = supl_client_acquisition_ . gps_acq_map . cend ( ) ;
gps_acq_iter + + )
2013-11-17 10:48:27 +00:00
{
2018-10-21 11:58:29 +00:00
std : : cout < < " SUPL: Received Acquisition assistance for GPS satellite " < < Gnss_Satellite ( " GPS " , gps_acq_iter - > second . i_satellite_PRN ) < < std : : endl ;
2014-05-13 12:58:03 +00:00
global_gps_acq_assist_map . write ( gps_acq_iter - > second . i_satellite_PRN , gps_acq_iter - > second ) ;
2013-11-17 10:48:27 +00:00
}
2014-04-25 19:48:52 +00:00
if ( supl_client_acquisition_ . gps_ref_loc . valid = = true )
{
std : : cout < < " SUPL: Received Ref Location (Acquisition Assistance) " < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Ref_Location > tmp_obj = std : : make_shared < Gps_Ref_Location > ( supl_client_acquisition_ . gps_ref_loc ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2014-04-25 19:48:52 +00:00
}
if ( supl_client_acquisition_ . gps_time . valid = = true )
{
std : : cout < < " SUPL: Received Ref Time (Acquisition Assistance) " < < std : : endl ;
2016-05-04 17:15:18 +00:00
std : : shared_ptr < Gps_Ref_Time > tmp_obj = std : : make_shared < Gps_Ref_Time > ( supl_client_acquisition_ . gps_time ) ;
2016-04-13 14:19:15 +00:00
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2014-04-25 19:48:52 +00:00
}
2013-11-17 10:48:27 +00:00
}
else
{
std : : cout < < " ERROR: SUPL client for Acquisition assistance returned " < < error < < std : : endl ;
2018-10-21 11:58:29 +00:00
std : : cout < < " Please check internet connection and SUPL server configuration " < < std : : endl ;
2013-11-17 10:48:27 +00:00
std : : cout < < " Disabling SUPL assistance.. " < < std : : endl ;
}
}
}
2018-10-21 11:58:29 +00:00
if ( ( enable_gps_supl_assistance = = false ) and ( enable_xml_agnss_enabled = = true ) )
{
// read assistance from file
if ( read_assistance_from_XML ( ) )
{
std : : cout < < " GNSS assistance data loaded from local XML file(s). " < < std : : endl ;
}
}
2011-10-01 18:45:20 +00:00
}
2016-05-04 17:15:18 +00:00
2016-05-03 10:34:38 +00:00
void ControlThread : : init ( )
{
// Instantiates a control queue, a GNSS flowgraph, and a control message factory
control_queue_ = gr : : msg_queue : : make ( 0 ) ;
2017-10-19 18:52:32 +00:00
try
2018-03-03 01:03:39 +00:00
{
2017-10-19 18:52:32 +00:00
flowgraph_ = std : : make_shared < GNSSFlowgraph > ( configuration_ , control_queue_ ) ;
2018-03-03 01:03:39 +00:00
}
catch ( const boost : : bad_lexical_cast & e )
{
2017-10-19 18:52:32 +00:00
std : : cout < < " Caught bad lexical cast with error " < < e . what ( ) < < std : : endl ;
2018-03-03 01:03:39 +00:00
}
2016-05-03 10:34:38 +00:00
control_message_factory_ = std : : make_shared < ControlMessageFactory > ( ) ;
stop_ = false ;
processed_control_messages_ = 0 ;
applied_actions_ = 0 ;
2016-05-08 06:21:25 +00:00
supl_mcc = 0 ;
supl_mns = 0 ;
supl_lac = 0 ;
supl_ci = 0 ;
2016-10-03 15:43:06 +00:00
msqid = - 1 ;
2016-05-03 10:34:38 +00:00
}
2011-10-01 18:45:20 +00:00
2013-11-17 10:48:27 +00:00
2011-10-01 18:45:20 +00:00
void ControlThread : : read_control_messages ( )
{
DLOG ( INFO ) < < " Reading control messages from queue " ;
2017-12-21 12:05:21 +00:00
gr : : message : : sptr queue_message = control_queue_ - > delete_head ( ) ;
2011-10-01 18:45:20 +00:00
if ( queue_message ! = 0 )
2011-12-28 21:36:45 +00:00
{
2013-11-17 10:48:27 +00:00
control_messages_ = control_message_factory_ - > GetControlMessages ( queue_message ) ;
2011-12-28 21:36:45 +00:00
}
2011-10-01 18:45:20 +00:00
else
2011-12-28 21:36:45 +00:00
{
2015-01-12 20:03:50 +00:00
control_messages_ - > clear ( ) ;
2011-12-28 21:36:45 +00:00
}
2011-10-01 18:45:20 +00:00
}
2012-11-01 16:39:06 +00:00
2011-10-01 18:45:20 +00:00
// Apply the corresponding control actions
// TODO: May be it is better to move the apply_action state machine to the control_thread
void ControlThread : : process_control_messages ( )
{
for ( unsigned int i = 0 ; i < control_messages_ - > size ( ) ; i + + )
{
2011-12-28 21:36:45 +00:00
if ( stop_ ) break ;
if ( control_messages_ - > at ( i ) - > who = = 200 )
{
apply_action ( control_messages_ - > at ( i ) - > what ) ;
}
else
{
2013-11-17 10:48:27 +00:00
flowgraph_ - > apply_action ( control_messages_ - > at ( i ) - > who , control_messages_ - > at ( i ) - > what ) ;
2011-12-28 21:36:45 +00:00
}
processed_control_messages_ + + ;
2011-10-01 18:45:20 +00:00
}
control_messages_ - > clear ( ) ;
DLOG ( INFO ) < < " Processed all control messages " ;
}
2012-11-01 16:39:06 +00:00
2011-10-01 18:45:20 +00:00
void ControlThread : : apply_action ( unsigned int what )
{
switch ( what )
2018-03-03 01:03:39 +00:00
{
case 0 :
DLOG ( INFO ) < < " Received action STOP " ;
stop_ = true ;
applied_actions_ + + ;
break ;
default :
DLOG ( INFO ) < < " Unrecognized action. " ;
break ;
}
2011-10-01 18:45:20 +00:00
}
2013-11-17 10:48:27 +00:00
2013-03-20 18:19:26 +00:00
void ControlThread : : gps_acq_assist_data_collector ( )
{
2013-11-17 10:48:27 +00:00
// ############ 1.bis READ EPHEMERIS/UTC_MODE/IONO QUEUE ####################
Gps_Acq_Assist gps_acq ;
Gps_Acq_Assist gps_acq_old ;
2018-03-03 01:03:39 +00:00
while ( stop_ = = false )
2013-11-17 10:48:27 +00:00
{
global_gps_acq_assist_queue . wait_and_pop ( gps_acq ) ;
2018-03-03 01:03:39 +00:00
if ( gps_acq . i_satellite_PRN = = 0 ) break ;
2013-11-17 10:48:27 +00:00
// DEBUG MESSAGE
std : : cout < < " Acquisition assistance record has arrived from SAT ID "
< < gps_acq . i_satellite_PRN
< < " with Doppler "
< < gps_acq . d_Doppler0
2018-03-03 01:03:39 +00:00
< < " [Hz] " < < std : : endl ;
2013-11-17 10:48:27 +00:00
// insert new acq record to the global ephemeris map
2018-03-03 01:03:39 +00:00
if ( global_gps_acq_assist_map . read ( gps_acq . i_satellite_PRN , gps_acq_old ) )
2013-11-17 10:48:27 +00:00
{
std : : cout < < " Acquisition assistance record updated " < < std : : endl ;
global_gps_acq_assist_map . write ( gps_acq . i_satellite_PRN , gps_acq ) ;
}
else
{
// insert new acq record
2014-03-16 23:25:52 +00:00
LOG ( INFO ) < < " New acq assist record inserted " ;
2013-11-17 10:48:27 +00:00
global_gps_acq_assist_map . write ( gps_acq . i_satellite_PRN , gps_acq ) ;
}
}
2013-03-20 18:19:26 +00:00
}
2016-10-16 08:00:39 +00:00
2016-10-01 15:32:38 +00:00
void ControlThread : : sysv_queue_listener ( )
{
2018-03-03 01:03:39 +00:00
typedef struct
{
long mtype ; // required by SysV queue messaging
2016-10-16 08:00:39 +00:00
double stop_message ;
} stop_msgbuf ;
2016-10-01 15:32:38 +00:00
bool read_queue = true ;
2016-10-16 08:00:39 +00:00
stop_msgbuf msg ;
double received_message = 0.0 ;
int msgrcv_size = sizeof ( msg . stop_message ) ;
2016-10-03 15:43:06 +00:00
2016-10-01 15:32:38 +00:00
key_t key = 1102 ;
2016-10-03 11:43:20 +00:00
2018-03-03 01:03:39 +00:00
if ( ( msqid = msgget ( key , 0644 | IPC_CREAT ) ) = = - 1 )
2016-10-03 11:43:20 +00:00
{
2016-10-16 08:00:39 +00:00
perror ( " GNSS-SDR cannot create SysV message queues " ) ;
2016-10-13 10:02:55 +00:00
exit ( 1 ) ;
2016-10-03 11:43:20 +00:00
}
2016-10-01 16:43:58 +00:00
2018-03-03 01:03:39 +00:00
while ( read_queue & & ! stop_ )
2016-10-01 15:32:38 +00:00
{
if ( msgrcv ( msqid , & msg , msgrcv_size , 1 , 0 ) ! = - 1 )
{
2016-10-16 08:00:39 +00:00
received_message = msg . stop_message ;
2018-03-03 01:03:39 +00:00
if ( ( std : : abs ( received_message - ( - 200.0 ) ) < 10 * std : : numeric_limits < double > : : epsilon ( ) ) )
2016-10-01 15:32:38 +00:00
{
std : : cout < < " Quit order received, stopping GNSS-SDR !! " < < std : : endl ;
std : : unique_ptr < ControlMessageFactory > cmf ( new ControlMessageFactory ( ) ) ;
if ( control_queue_ ! = gr : : msg_queue : : sptr ( ) )
{
control_queue_ - > handle ( cmf - > GetQueueMessage ( 200 , 0 ) ) ;
}
read_queue = false ;
}
}
}
}
2013-11-17 10:48:27 +00:00
2012-03-16 12:04:36 +00:00
void ControlThread : : keyboard_listener ( )
{
2012-11-01 16:39:06 +00:00
bool read_keys = true ;
2015-05-24 18:41:30 +00:00
char c = ' 0 ' ;
2018-03-03 01:03:39 +00:00
while ( read_keys & & ! stop_ )
2012-11-01 16:39:06 +00:00
{
2015-05-13 21:26:44 +00:00
std : : cin . get ( c ) ;
2015-05-24 18:41:30 +00:00
if ( c = = ' q ' )
2012-11-01 16:39:06 +00:00
{
std : : cout < < " Quit keystroke order received, stopping GNSS-SDR !! " < < std : : endl ;
2014-04-03 21:59:14 +00:00
std : : unique_ptr < ControlMessageFactory > cmf ( new ControlMessageFactory ( ) ) ;
2013-07-04 13:47:40 +00:00
if ( control_queue_ ! = gr : : msg_queue : : sptr ( ) )
2012-11-01 16:39:06 +00:00
{
control_queue_ - > handle ( cmf - > GetQueueMessage ( 200 , 0 ) ) ;
}
read_keys = false ;
}
2016-04-18 12:38:25 +00:00
usleep ( 500000 ) ;
2012-11-01 16:39:06 +00:00
}
2012-03-16 12:04:36 +00:00
}