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
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
2015-01-08 18:49:59 +00:00
* Copyright ( C ) 2010 - 2015 ( 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
* along with GNSS - SDR . If not , see < http : //www.gnu.org/licenses/>.
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# include "control_thread.h"
2014-01-12 20:07:38 +00:00
# include <unistd.h>
2014-03-16 19:58:29 +00:00
# include <iostream>
2014-01-12 20:07:38 +00:00
# include <map>
# include <string>
2013-03-15 18:05:37 +00:00
# include <boost/lexical_cast.hpp>
2014-12-21 21:46:57 +00:00
# include <boost/chrono.hpp>
2014-01-12 20:07:38 +00:00
# include <gnuradio/message.h>
# include <gflags/gflags.h>
# include <glog/logging.h>
2013-03-15 18:05:37 +00:00
# include "gps_ephemeris.h"
# include "gps_iono.h"
# include "gps_utc_model.h"
# include "gps_almanac.h"
2013-08-27 14:32:44 +00:00
# include "galileo_ephemeris.h"
# include "galileo_iono.h"
# include "galileo_utc_model.h"
# include "galileo_almanac.h"
2013-03-15 18:05:37 +00:00
# include "concurrent_queue.h"
# include "concurrent_map.h"
2011-10-01 18:45:20 +00:00
# include "gnss_flowgraph.h"
# include "file_configuration.h"
# include "control_message_factory.h"
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 ;
2014-11-12 22:05:53 +00:00
DEFINE_string ( config_file , std : : string ( GNSSSDR_INSTALL_DIR " /share/gnss-sdr/conf/default.conf " ) ,
2014-11-05 22:26:31 +00:00
" File containing the configuration parameters " ) ;
2011-10-01 18:45:20 +00:00
ControlThread : : ControlThread ( )
{
2014-04-03 21:59:14 +00:00
configuration_ = std : : make_shared < FileConfiguration > ( FLAGS_config_file ) ;
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
2016-04-12 13:28:58 +00:00
// if (save_assistance_to_XML() == true) {}
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
2011-10-01 18:45:20 +00:00
flowgraph_ - > connect ( ) ;
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 ;
}
2012-03-16 12:04:36 +00:00
// start the keyboard_listener thread
keyboard_thread_ = boost : : thread ( & ControlThread : : keyboard_listener , this ) ;
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 ;
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 ) ) ;
2014-12-21 21:46:57 +00:00
# endif
# ifndef OLD_BOOST
keyboard_thread_ . try_join_until ( boost : : chrono : : steady_clock : : now ( ) + boost : : chrono : : milliseconds ( 50 ) ) ;
# 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
2013-07-04 13:47:40 +00:00
void ControlThread : : set_control_queue ( boost : : shared_ptr < gr : : msg_queue > 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 ) ;
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 ) ;
std : : cout < < " SUPL: Try read GPS ephemeris from XML file " < < eph_xml_filename < < std : : endl ;
if ( supl_client_ephemeris_ . load_ephemeris_xml ( eph_xml_filename ) = = true )
{
std : : map < int , Gps_Ephemeris > : : iterator gps_eph_iter ;
for ( gps_eph_iter = supl_client_ephemeris_ . gps_ephemeris_map . begin ( ) ;
gps_eph_iter ! = supl_client_ephemeris_ . gps_ephemeris_map . end ( ) ;
gps_eph_iter + + )
{
std : : cout < < " SUPL: Read XML Ephemeris for GPS SV " < < gps_eph_iter - > first < < 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 ;
}
else
{
std : : cout < < " ERROR: SUPL client error reading XML " < < std : : endl ;
std : : cout < < " Disabling SUPL assistance... " < < std : : endl ;
}
// Only look for {utc, iono, ref time, ref location} if SUPL is enabled
bool enable_gps_supl_assistance = configuration_ - > property ( " GNSS-SDR.SUPL_gps_enabled " , false ) ;
if ( enable_gps_supl_assistance = = true )
{
// Try to read UTC model from XML
if ( supl_client_acquisition_ . load_utc_xml ( utc_xml_filename ) = = true )
{
LOG ( INFO ) < < " SUPL: Read XML UTC model " ;
std : : shared_ptr < Gps_Utc_Model > tmp_obj = std : : make_shared < Gps_Utc_Model > ( supl_client_acquisition_ . gps_utc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
else
{
LOG ( INFO ) < < " SUPL: couldn't read UTC model XML " ;
}
2013-11-17 10:48:27 +00:00
2016-04-13 14:19:15 +00:00
// Try to read Iono model from XML
if ( supl_client_acquisition_ . load_iono_xml ( iono_xml_filename ) = = true )
{
LOG ( INFO ) < < " SUPL: Read XML IONO model " ;
std : : shared_ptr < Gps_Iono > tmp_obj = std : : make_shared < Gps_Iono > ( supl_client_acquisition_ . gps_iono ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
else
{
LOG ( INFO ) < < " SUPL: couldn't read IONO model XML " ;
}
// 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 " ;
std : : shared_ptr < Gps_Ref_Time > tmp_obj = std : : make_shared < Gps_Ref_Time > ( supl_client_acquisition_ . gps_time ) ;
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 " ;
std : : shared_ptr < Gps_Ref_Location > tmp_obj = std : : make_shared < Gps_Ref_Location > ( supl_client_acquisition_ . gps_ref_loc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
}
else
{
LOG ( INFO ) < < " SUPL: couldn't read Ref Location XML " ;
}
}
return ret ;
}
//todo: The save assistance function needs to be moved to the PVT block because now the global maps are deprecated, and PVT is the only block that have all the information
2016-04-12 13:28:58 +00:00
//bool ControlThread::save_assistance_to_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);
// 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);
//
// LOG(INFO) << "SUPL: Try to save GPS ephemeris to XML file " << eph_xml_filename;
// std::map<int, Gps_Ephemeris> eph_copy = global_gps_ephemeris_map.get_map_copy();
// if (supl_client_ephemeris_.save_ephemeris_map_xml(eph_xml_filename, eph_copy) == true)
// {
// LOG(INFO) << "SUPL: Successfully saved ephemeris XML file";
// ret = true;
// }
// else
// {
// LOG(INFO) << "SUPL: Error while trying to save ephemeris XML file. Maybe an empty map?";
// ret = false;
// }
// // Only try to save {utc, iono, ref time, ref location} if SUPL is enabled
// bool enable_gps_supl_assistance = configuration_->property("GNSS-SDR.SUPL_gps_enabled", false);
// if (enable_gps_supl_assistance == true)
// {
// // try to save utc model xml file
// std::map<int, Gps_Utc_Model> utc_copy = global_gps_utc_model_map.get_map_copy();
// if (supl_client_acquisition_.save_utc_map_xml(utc_xml_filename, utc_copy) == true)
// {
// LOG(INFO) << "SUPL: Successfully saved UTC Model XML file";
// //ret = true;
// }
// else
// {
// LOG(INFO) << "SUPL: Error while trying to save utc XML file";
// //ret = false;
// }
// // try to save iono model xml file
// std::map<int, Gps_Iono> iono_copy = global_gps_iono_map.get_map_copy();
// if (supl_client_acquisition_.save_iono_map_xml(iono_xml_filename, iono_copy) == true)
// {
// LOG(INFO) << "SUPL: Successfully saved IONO Model XML file";
// //ret = true;
// }
// else
// {
// LOG(INFO) << "SUPL: Error while trying to save iono XML file";
// //ret = false;
// }
// // try to save ref time xml file
// std::map<int, Gps_Ref_Time> ref_time_copy = global_gps_ref_time_map.get_map_copy();
// if (supl_client_acquisition_.save_ref_time_map_xml(ref_time_xml_filename, ref_time_copy) == true)
// {
// LOG(INFO) << "SUPL: Successfully saved Ref Time XML file";
// //ret = true;
// }
// else
// {
// LOG(INFO) << "SUPL: Error while trying to save ref time XML file";
// //ref = false;
// }
// // try to save ref location xml file
// std::map<int, Gps_Ref_Location> ref_location_copy = global_gps_ref_location_map.get_map_copy();
// if (supl_client_acquisition_.save_ref_location_map_xml(ref_location_xml_filename, ref_location_copy) == true)
// {
// LOG(INFO) << "SUPL: Successfully saved Ref Location XML file";
// //ref = true;
// }
// else
// {
// LOG(INFO) << "SUPL: Error while trying to save ref location XML file";
// //ret = false;
// }
// }
// return ret;
//}
2014-04-28 14:27:47 +00:00
2013-11-17 10:48:27 +00:00
2011-10-01 18:45:20 +00:00
void ControlThread : : init ( )
{
2013-11-17 10:48:27 +00:00
// Instantiates a control queue, a GNSS flowgraph, and a control message factory
control_queue_ = gr : : msg_queue : : make ( 0 ) ;
2014-04-03 21:59:14 +00:00
flowgraph_ = std : : make_shared < GNSSFlowgraph > ( configuration_ , control_queue_ ) ;
control_message_factory_ = std : : make_shared < ControlMessageFactory > ( ) ;
2013-11-17 10:48:27 +00:00
stop_ = false ;
processed_control_messages_ = 0 ;
applied_actions_ = 0 ;
//######### GNSS Assistance #################################
// GNSS Assistance configuration
bool enable_gps_supl_assistance = configuration_ - > property ( " GNSS-SDR.SUPL_gps_enabled " , false ) ;
if ( enable_gps_supl_assistance = = true )
//SUPL SERVER TEST. Not operational yet!
{
std : : cout < < " SUPL RRLP GPS assistance enabled! " < < std : : endl ;
std : : string default_acq_server = " supl.nokia.com " ;
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
{
supl_lac = boost : : lexical_cast < int > ( configuration_ - > property ( " GNSS-SDR.SUPL_LAC " , default_lac ) ) ;
}
catch ( boost : : bad_lexical_cast & )
{
supl_lac = 0x59e2 ;
}
try
{
supl_ci = boost : : lexical_cast < int > ( configuration_ - > property ( " GNSS-SDR.SUPL_CI " , default_ci ) ) ;
}
catch ( boost : : bad_lexical_cast & )
{
supl_ci = 0x31b0 ;
}
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-04-12 13:28:58 +00:00
//if (read_assistance_from_XML()) {}
2013-11-17 10:48:27 +00:00
}
else
{
// Request ephemeris from SUPL server
int error ;
supl_client_ephemeris_ . request = 1 ;
std : : cout < < " SUPL: Try to read GPS ephemeris from SUPL server.. " < < std : : endl ;
error = supl_client_ephemeris_ . get_assistance ( supl_mcc , supl_mns , supl_lac , supl_ci ) ;
if ( error = = 0 )
{
std : : map < int , Gps_Ephemeris > : : iterator gps_eph_iter ;
for ( gps_eph_iter = supl_client_ephemeris_ . gps_ephemeris_map . begin ( ) ;
gps_eph_iter ! = supl_client_ephemeris_ . gps_ephemeris_map . end ( ) ;
gps_eph_iter + + )
{
std : : cout < < " SUPL: Received Ephemeris for GPS SV " < < gps_eph_iter - > first < < std : : endl ;
2016-04-13 14:19:15 +00:00
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 ) ) ;
2013-11-17 10:48:27 +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 ;
std : : cout < < " Please check internet connection and SUPL server configuration " < < error < < std : : endl ;
2016-04-12 13:28:58 +00:00
//std::cout << "Trying to read ephemeris from XML file" << std::endl;
//if (read_assistance_from_XML() == false)
// {
// std::cout << "ERROR: Could not read Ephemeris file: Disabling SUPL assistance.." << std::endl;
// }
2013-11-17 10:48:27 +00:00
}
// Request almanac , IONO and UTC Model
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 )
{
std : : map < int , Gps_Almanac > : : iterator gps_alm_iter ;
for ( gps_alm_iter = supl_client_ephemeris_ . gps_almanac_map . begin ( ) ;
gps_alm_iter ! = supl_client_ephemeris_ . gps_almanac_map . end ( ) ;
gps_alm_iter + + )
{
std : : cout < < " SUPL: Received Almanac for GPS SV " < < gps_alm_iter - > first < < std : : endl ;
2016-04-13 14:19:15 +00:00
std : : shared_ptr < Gps_Almanac > tmp_obj = std : : make_shared < Gps_Almanac > ( gps_alm_iter - > second ) ;
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-04-13 14:19:15 +00:00
std : : shared_ptr < Gps_Iono > tmp_obj = std : : make_shared < Gps_Iono > ( supl_client_ephemeris_ . gps_iono ) ;
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 )
2014-05-13 12:58:03 +00:00
{
2013-11-17 10:48:27 +00:00
std : : cout < < " SUPL: Received GPS UTC Model " < < std : : endl ;
2016-04-13 14:19:15 +00:00
std : : shared_ptr < Gps_Utc_Model > tmp_obj = std : : make_shared < Gps_Utc_Model > ( supl_client_ephemeris_ . gps_utc ) ;
flowgraph_ - > send_telemetry_msg ( pmt : : make_any ( tmp_obj ) ) ;
2013-11-17 10:48:27 +00:00
}
}
else
{
std : : cout < < " ERROR: SUPL client for Almanac returned " < < error < < std : : endl ;
std : : cout < < " Please check internet connection and SUPL server configuration " < < error < < std : : endl ;
std : : cout < < " Disabling SUPL assistance.. " < < std : : endl ;
}
// Request acquisition assistance
supl_client_acquisition_ . request = 2 ;
std : : cout < < " SUPL: Try read Acquisition assistance from SUPL server.. " < < std : : endl ;
error = supl_client_acquisition_ . get_assistance ( supl_mcc , supl_mns , supl_lac , supl_ci ) ;
if ( error = = 0 )
{
std : : map < int , Gps_Acq_Assist > : : iterator gps_acq_iter ;
for ( gps_acq_iter = supl_client_acquisition_ . gps_acq_map . begin ( ) ;
gps_acq_iter ! = supl_client_acquisition_ . gps_acq_map . end ( ) ;
gps_acq_iter + + )
{
std : : cout < < " SUPL: Received Acquisition assistance for GPS SV " < < gps_acq_iter - > first < < 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-04-13 14:19:15 +00:00
std : : shared_ptr < Gps_Ref_Location > tmp_obj = std : : make_shared < Gps_Ref_Location > ( supl_client_acquisition_ . gps_ref_loc ) ;
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-04-13 14:19:15 +00:00
std : : shared_ptr < Gps_Ref_Time > tmp_obj = std : : make_shared < Gps_Ref_Time > ( supl_client_acquisition_ . gps_time ) ;
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 ;
std : : cout < < " Please check internet connection and SUPL server configuration " < < error < < std : : endl ;
std : : cout < < " Disabling SUPL assistance.. " < < std : : endl ;
}
}
}
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 " ;
2013-07-04 13:47:40 +00:00
boost : : shared_ptr < gr : : message > 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 )
{
2011-12-28 21:36:45 +00:00
case 0 :
DLOG ( INFO ) < < " Received action STOP " ;
stop_ = true ;
applied_actions_ + + ;
break ;
default :
DLOG ( INFO ) < < " Unrecognized action. " ;
2013-03-15 18:05:37 +00:00
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 ;
while ( stop_ = = false )
{
global_gps_acq_assist_queue . wait_and_pop ( gps_acq ) ;
2015-12-30 13:43:32 +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
< < " [Hz] " < < std : : endl ;
// insert new acq record to the global ephemeris map
if ( global_gps_acq_assist_map . read ( gps_acq . i_satellite_PRN , gps_acq_old ) )
{
std : : cout < < " Acquisition assistance record updated " < < std : : endl ;
global_gps_acq_assist_map . write ( gps_acq . i_satellite_PRN , gps_acq ) ;
2013-03-20 18:19:26 +00:00
2013-11-17 10:48:27 +00:00
}
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
}
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 ' ;
2015-12-30 13:43:32 +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 ;
}
}
2012-03-16 12:04:36 +00:00
}