1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-08-09 07:25:47 +00:00

Avoid unnecessary copy of channel_fsm

This commit is contained in:
Carles Fernandez 2019-04-22 13:03:01 +02:00
parent 35b5ec1112
commit 307373e362
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
8 changed files with 169 additions and 162 deletions

View File

@ -45,6 +45,7 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class galileo_e5a_noncoherentIQ_acquisition_caf_cc; class galileo_e5a_noncoherentIQ_acquisition_caf_cc;
@ -159,98 +160,99 @@ public:
~galileo_e5a_noncoherentIQ_acquisition_caf_cc(); ~galileo_e5a_noncoherentIQ_acquisition_caf_cc();
/*! /*!
* \brief Set acquisition/tracking common Gnss_Synchro object pointer * \brief Set acquisition/tracking common Gnss_Synchro object pointer
* to exchange synchronization data between acquisition and tracking blocks. * to exchange synchronization data between acquisition and tracking blocks.
* \param p_gnss_synchro Satellite information shared by the processing blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks.
*/ */
inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
{ {
d_gnss_synchro = p_gnss_synchro; d_gnss_synchro = p_gnss_synchro;
} }
/*! /*!
* \brief Returns the maximum peak of grid search. * \brief Returns the maximum peak of grid search.
*/ */
inline unsigned int mag() const inline unsigned int mag() const
{ {
return d_mag; return d_mag;
} }
/*! /*!
* \brief Initializes acquisition algorithm. * \brief Initializes acquisition algorithm.
*/ */
void init(); void init();
/*! /*!
* \brief Sets local code for PCPS acquisition algorithm. * \brief Sets local code for PCPS acquisition algorithm.
* \param code - Pointer to the PRN code. * \param code - Pointer to the PRN code.
*/ */
void set_local_code(std::complex<float>* code, std::complex<float>* codeQ); void set_local_code(std::complex<float>* code, std::complex<float>* codeQ);
/*! /*!
* \brief Starts acquisition algorithm, turning from standby mode to * \brief Starts acquisition algorithm, turning from standby mode to
* active mode * active mode
* \param active - bool that activates/deactivates the block. * \param active - bool that activates/deactivates the block.
*/ */
inline void set_active(bool active) inline void set_active(bool active)
{ {
d_active = active; d_active = active;
} }
/*! /*!
* \brief If set to 1, ensures that acquisition starts at the * \brief If set to 1, ensures that acquisition starts at the
* first available sample. * first available sample.
* \param state - int=1 forces start of acquisition * \param state - int=1 forces start of acquisition
*/ */
void set_state(int state); void set_state(int state);
/*! /*!
* \brief Set acquisition channel unique ID * \brief Set acquisition channel unique ID
* \param channel - receiver channel. * \param channel - receiver channel.
*/ */
inline void set_channel(unsigned int channel) inline void set_channel(unsigned int channel)
{ {
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of PCPS algorithm. * \brief Set statistics threshold of PCPS algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,
* Algorithm 1, for a definition of this threshold). * Algorithm 1, for a definition of this threshold).
*/ */
inline void set_threshold(float threshold) inline void set_threshold(float threshold)
{ {
d_threshold = threshold; d_threshold = threshold;
} }
/*! /*!
* \brief Set maximum Doppler grid search * \brief Set maximum Doppler grid search
* \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz].
*/ */
inline void set_doppler_max(unsigned int doppler_max) inline void set_doppler_max(unsigned int doppler_max)
{ {
d_doppler_max = doppler_max; d_doppler_max = doppler_max;
} }
/*! /*!
* \brief Set Doppler steps for the grid search * \brief Set Doppler steps for the grid search
* \param doppler_step - Frequency bin of the search grid [Hz]. * \param doppler_step - Frequency bin of the search grid [Hz].
*/ */
inline void set_doppler_step(unsigned int doppler_step) inline void set_doppler_step(unsigned int doppler_step)
{ {
d_doppler_step = doppler_step; d_doppler_step = doppler_step;
} }
/*! /*!
* \brief Parallel Code Phase Search Acquisition signal processing. * \brief Parallel Code Phase Search Acquisition signal processing.
*/ */
int general_work(int noutput_items, gr_vector_int& ninput_items, int general_work(int noutput_items, gr_vector_int& ninput_items,
gr_vector_const_void_star& input_items, gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items); gr_vector_void_star& output_items);

View File

@ -39,6 +39,7 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class galileo_pcps_8ms_acquisition_cc; class galileo_pcps_8ms_acquisition_cc;
@ -182,14 +183,14 @@ public:
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of PCPS algorithm. * \brief Set statistics threshold of PCPS algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,

View File

@ -63,6 +63,7 @@
#include <volk/volk_complex.h> // for lv_16sc_t #include <volk/volk_complex.h> // for lv_16sc_t
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include <utility>
class Gnss_Synchro; class Gnss_Synchro;
class pcps_acquisition; class pcps_acquisition;
@ -153,10 +154,10 @@ public:
~pcps_acquisition(); ~pcps_acquisition();
/*! /*!
* \brief Set acquisition/tracking common Gnss_Synchro object pointer * \brief Set acquisition/tracking common Gnss_Synchro object pointer
* to exchange synchronization data between acquisition and tracking blocks. * to exchange synchronization data between acquisition and tracking blocks.
* \param p_gnss_synchro Satellite information shared by the processing blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks.
*/ */
inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
{ {
gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler
@ -172,21 +173,21 @@ public:
} }
/*! /*!
* \brief Initializes acquisition algorithm and reserves memory. * \brief Initializes acquisition algorithm and reserves memory.
*/ */
void init(); void init();
/*! /*!
* \brief Sets local code for PCPS acquisition algorithm. * \brief Sets local code for PCPS acquisition algorithm.
* \param code - Pointer to the PRN code. * \param code - Pointer to the PRN code.
*/ */
void set_local_code(std::complex<float>* code); void set_local_code(std::complex<float>* code);
/*! /*!
* \brief Starts acquisition algorithm, turning from standby mode to * \brief Starts acquisition algorithm, turning from standby mode to
* active mode * active mode
* \param active - bool that activates/deactivates the block. * \param active - bool that activates/deactivates the block.
*/ */
inline void set_active(bool active) inline void set_active(bool active)
{ {
gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler
@ -194,35 +195,34 @@ public:
} }
/*! /*!
* \brief If set to 1, ensures that acquisition starts at the * \brief If set to 1, ensures that acquisition starts at the
* first available sample. * first available sample.
* \param state - int=1 forces start of acquisition * \param state - int=1 forces start of acquisition
*/ */
void set_state(int32_t state); void set_state(int32_t state);
/*! /*!
* \brief Set acquisition channel unique ID * \brief Set acquisition channel unique ID
* \param channel - receiver channel. * \param channel - receiver channel.
*/ */
inline void set_channel(uint32_t channel) inline void set_channel(uint32_t channel)
{ {
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of PCPS algorithm. * \brief Set statistics threshold of PCPS algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,
* Algorithm 1, for a definition of this threshold). * Algorithm 1, for a definition of this threshold).
*/ */
inline void set_threshold(float threshold) inline void set_threshold(float threshold)
{ {
gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler
@ -230,9 +230,9 @@ public:
} }
/*! /*!
* \brief Set maximum Doppler grid search * \brief Set maximum Doppler grid search
* \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz].
*/ */
inline void set_doppler_max(uint32_t doppler_max) inline void set_doppler_max(uint32_t doppler_max)
{ {
gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler
@ -240,9 +240,9 @@ public:
} }
/*! /*!
* \brief Set Doppler steps for the grid search * \brief Set Doppler steps for the grid search
* \param doppler_step - Frequency bin of the search grid [Hz]. * \param doppler_step - Frequency bin of the search grid [Hz].
*/ */
inline void set_doppler_step(uint32_t doppler_step) inline void set_doppler_step(uint32_t doppler_step)
{ {
gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler
@ -253,8 +253,8 @@ public:
void set_resampler_latency(uint32_t latency_samples); void set_resampler_latency(uint32_t latency_samples);
/*! /*!
* \brief Parallel Code Phase Search Acquisition signal processing. * \brief Parallel Code Phase Search Acquisition signal processing.
*/ */
int general_work(int noutput_items, gr_vector_int& ninput_items, int general_work(int noutput_items, gr_vector_int& ninput_items,
gr_vector_const_void_star& input_items, gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items); gr_vector_void_star& output_items);

View File

@ -59,6 +59,7 @@
#include <cstdint> #include <cstdint>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class pcps_acquisition_fine_doppler_cc; class pcps_acquisition_fine_doppler_cc;
@ -185,14 +186,14 @@ public:
d_dump_channel = d_channel; d_dump_channel = d_channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of PCPS algorithm. * \brief Set statistics threshold of PCPS algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,

View File

@ -55,6 +55,7 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class pcps_assisted_acquisition_cc; class pcps_assisted_acquisition_cc;
@ -195,13 +196,12 @@ public:
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!

View File

@ -44,6 +44,7 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class pcps_cccwsr_acquisition_cc; class pcps_cccwsr_acquisition_cc;
@ -137,90 +138,90 @@ public:
} }
/*! /*!
* \brief Returns the maximum peak of grid search. * \brief Returns the maximum peak of grid search.
*/ */
inline uint32_t mag() const inline uint32_t mag() const
{ {
return d_mag; return d_mag;
} }
/*! /*!
* \brief Initializes acquisition algorithm. * \brief Initializes acquisition algorithm.
*/ */
void init(); void init();
/*! /*!
* \brief Sets local code for CCCWSR acquisition algorithm. * \brief Sets local code for CCCWSR acquisition algorithm.
* \param data_code - Pointer to the data PRN code. * \param data_code - Pointer to the data PRN code.
* \param pilot_code - Pointer to the pilot PRN code. * \param pilot_code - Pointer to the pilot PRN code.
*/ */
void set_local_code(std::complex<float>* code_data, std::complex<float>* code_pilot); void set_local_code(std::complex<float>* code_data, std::complex<float>* code_pilot);
/*! /*!
* \brief Starts acquisition algorithm, turning from standby mode to * \brief Starts acquisition algorithm, turning from standby mode to
* active mode * active mode
* \param active - bool that activates/deactivates the block. * \param active - bool that activates/deactivates the block.
*/ */
inline void set_active(bool active) inline void set_active(bool active)
{ {
d_active = active; d_active = active;
} }
/*! /*!
* \brief If set to 1, ensures that acquisition starts at the * \brief If set to 1, ensures that acquisition starts at the
* first available sample. * first available sample.
* \param state - int=1 forces start of acquisition * \param state - int=1 forces start of acquisition
*/ */
void set_state(int32_t state); void set_state(int32_t state);
/*! /*!
* \brief Set acquisition channel unique ID * \brief Set acquisition channel unique ID
* \param channel - receiver channel. * \param channel - receiver channel.
*/ */
inline void set_channel(uint32_t channel) inline void set_channel(uint32_t channel)
{ {
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of CCCWSR algorithm. * \brief Set statistics threshold of CCCWSR algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,
* Algorithm 1, for a definition of this threshold). * Algorithm 1, for a definition of this threshold).
*/ */
inline void set_threshold(float threshold) inline void set_threshold(float threshold)
{ {
d_threshold = threshold; d_threshold = threshold;
} }
/*! /*!
* \brief Set maximum Doppler grid search * \brief Set maximum Doppler grid search
* \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz].
*/ */
inline void set_doppler_max(uint32_t doppler_max) inline void set_doppler_max(uint32_t doppler_max)
{ {
d_doppler_max = doppler_max; d_doppler_max = doppler_max;
} }
/*! /*!
* \brief Set Doppler steps for the grid search * \brief Set Doppler steps for the grid search
* \param doppler_step - Frequency bin of the search grid [Hz]. * \param doppler_step - Frequency bin of the search grid [Hz].
*/ */
inline void set_doppler_step(uint32_t doppler_step) inline void set_doppler_step(uint32_t doppler_step)
{ {
d_doppler_step = doppler_step; d_doppler_step = doppler_step;
} }
/*! /*!
* \brief Coherent Channel Combining With Sign Recovery Acquisition signal processing. * \brief Coherent Channel Combining With Sign Recovery Acquisition signal processing.
*/ */
int general_work(int noutput_items, gr_vector_int& ninput_items, int general_work(int noutput_items, gr_vector_int& ninput_items,
gr_vector_const_void_star& input_items, gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items); gr_vector_void_star& output_items);

View File

@ -61,6 +61,7 @@
#include <fstream> #include <fstream>
#include <functional> #include <functional>
#include <string> #include <string>
#include <utility>
class pcps_quicksync_acquisition_cc; class pcps_quicksync_acquisition_cc;
@ -215,14 +216,14 @@ public:
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of PCPS algorithm. * \brief Set statistics threshold of PCPS algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,

View File

@ -58,6 +58,7 @@
#include <gnuradio/gr_complex.h> #include <gnuradio/gr_complex.h>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility>
class pcps_tong_acquisition_cc; class pcps_tong_acquisition_cc;
@ -144,99 +145,99 @@ public:
~pcps_tong_acquisition_cc(); ~pcps_tong_acquisition_cc();
/*! /*!
* \brief Set acquisition/tracking common Gnss_Synchro object pointer * \brief Set acquisition/tracking common Gnss_Synchro object pointer
* to exchange synchronization data between acquisition and tracking blocks. * to exchange synchronization data between acquisition and tracking blocks.
* \param p_gnss_synchro Satellite information shared by the processing blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks.
*/ */
inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
{ {
d_gnss_synchro = p_gnss_synchro; d_gnss_synchro = p_gnss_synchro;
} }
/*! /*!
* \brief Returns the maximum peak of grid search. * \brief Returns the maximum peak of grid search.
*/ */
inline uint32_t mag() const inline uint32_t mag() const
{ {
return d_mag; return d_mag;
} }
/*! /*!
* \brief Initializes acquisition algorithm. * \brief Initializes acquisition algorithm.
*/ */
void init(); void init();
/*! /*!
* \brief Sets local code for TONG acquisition algorithm. * \brief Sets local code for TONG acquisition algorithm.
* \param code - Pointer to the PRN code. * \param code - Pointer to the PRN code.
*/ */
void set_local_code(std::complex<float>* code); void set_local_code(std::complex<float>* code);
/*! /*!
* \brief Starts acquisition algorithm, turning from standby mode to * \brief Starts acquisition algorithm, turning from standby mode to
* active mode * active mode
* \param active - bool that activates/deactivates the block. * \param active - bool that activates/deactivates the block.
*/ */
inline void set_active(bool active) inline void set_active(bool active)
{ {
d_active = active; d_active = active;
} }
/*! /*!
* \brief If set to 1, ensures that acquisition starts at the * \brief If set to 1, ensures that acquisition starts at the
* first available sample. * first available sample.
* \param state - int=1 forces start of acquisition * \param state - int=1 forces start of acquisition
*/ */
void set_state(int32_t state); void set_state(int32_t state);
/*! /*!
* \brief Set acquisition channel unique ID * \brief Set acquisition channel unique ID
* \param channel - receiver channel. * \param channel - receiver channel.
*/ */
inline void set_channel(uint32_t channel) inline void set_channel(uint32_t channel)
{ {
d_channel = channel; d_channel = channel;
} }
/*! /*!
* \brief Set channel fsm associated to this acquisition instance * \brief Set channel fsm associated to this acquisition instance
*/ */
inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
{ {
d_channel_fsm = channel_fsm; d_channel_fsm = std::move(channel_fsm);
} }
/*! /*!
* \brief Set statistics threshold of TONG algorithm. * \brief Set statistics threshold of TONG algorithm.
* \param threshold - Threshold for signal detection (check \ref Navitec2012, * \param threshold - Threshold for signal detection (check \ref Navitec2012,
* Algorithm 1, for a definition of this threshold). * Algorithm 1, for a definition of this threshold).
*/ */
inline void set_threshold(float threshold) inline void set_threshold(float threshold)
{ {
d_threshold = threshold; d_threshold = threshold;
} }
/*! /*!
* \brief Set maximum Doppler grid search * \brief Set maximum Doppler grid search
* \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz].
*/ */
inline void set_doppler_max(uint32_t doppler_max) inline void set_doppler_max(uint32_t doppler_max)
{ {
d_doppler_max = doppler_max; d_doppler_max = doppler_max;
} }
/*! /*!
* \brief Set Doppler steps for the grid search * \brief Set Doppler steps for the grid search
* \param doppler_step - Frequency bin of the search grid [Hz]. * \param doppler_step - Frequency bin of the search grid [Hz].
*/ */
inline void set_doppler_step(uint32_t doppler_step) inline void set_doppler_step(uint32_t doppler_step)
{ {
d_doppler_step = doppler_step; d_doppler_step = doppler_step;
} }
/*! /*!
* \brief Parallel Code Phase Search Acquisition signal processing. * \brief Parallel Code Phase Search Acquisition signal processing.
*/ */
int general_work(int noutput_items, gr_vector_int& ninput_items, int general_work(int noutput_items, gr_vector_int& ninput_items,
gr_vector_const_void_star& input_items, gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items); gr_vector_void_star& output_items);