mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-trx.git
				synced 2025-11-03 21:53:18 +00:00 
			
		
		
		
	osmo-trx.cpp: Move trx start and stop to helper functions
Make main() smaller, and make it easier to replace cmdline parameters in following commits. Change-Id: I10eaaafe38ace2b7bb095a0ad1db70d6c06ee03b
This commit is contained in:
		@@ -108,6 +108,10 @@ static void *tall_trx_ctx;
 | 
				
			|||||||
static struct trx_ctx *g_trx_ctx;
 | 
					static struct trx_ctx *g_trx_ctx;
 | 
				
			||||||
static struct ctrl_handle *g_ctrlh;
 | 
					static struct ctrl_handle *g_ctrlh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static RadioDevice *usrp;
 | 
				
			||||||
 | 
					static RadioInterface *radio;
 | 
				
			||||||
 | 
					static Transceiver *transceiver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Setup configuration values
 | 
					/* Setup configuration values
 | 
				
			||||||
 *     Don't query the existence of the Log.Level because it's a
 | 
					 *     Don't query the existence of the Log.Level because it's a
 | 
				
			||||||
 *     mandatory value. That is, if it doesn't exist, the configuration
 | 
					 *     mandatory value. That is, if it doesn't exist, the configuration
 | 
				
			||||||
@@ -227,33 +231,30 @@ RadioInterface *makeRadioInterface(struct trx_config *config,
 | 
				
			|||||||
 *     and decoding schemes. Also included are the socket interfaces for
 | 
					 *     and decoding schemes. Also included are the socket interfaces for
 | 
				
			||||||
 *     connecting to the upper layer stack.
 | 
					 *     connecting to the upper layer stack.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
Transceiver *makeTransceiver(struct trx_config *config, RadioInterface *radio)
 | 
					int makeTransceiver(struct trx_config *config, RadioInterface *radio)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Transceiver *trx;
 | 
					 | 
				
			||||||
	VectorFIFO *fifo;
 | 
						VectorFIFO *fifo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	trx = new Transceiver(config->port, config->local_addr.c_str(),
 | 
						transceiver = new Transceiver(config->port, config->local_addr.c_str(),
 | 
				
			||||||
			      config->remote_addr.c_str(), config->tx_sps,
 | 
								      config->remote_addr.c_str(), config->tx_sps,
 | 
				
			||||||
			      config->rx_sps, config->chans, GSM::Time(3,0),
 | 
								      config->rx_sps, config->chans, GSM::Time(3,0),
 | 
				
			||||||
			      radio, config->rssi_offset);
 | 
								      radio, config->rssi_offset);
 | 
				
			||||||
	if (!trx->init(config->filler, config->rtsc,
 | 
						if (!transceiver->init(config->filler, config->rtsc,
 | 
				
			||||||
		       config->rach_delay, config->edge)) {
 | 
							       config->rach_delay, config->edge)) {
 | 
				
			||||||
		LOG(ALERT) << "Failed to initialize transceiver";
 | 
							LOG(ALERT) << "Failed to initialize transceiver";
 | 
				
			||||||
		delete trx;
 | 
							return -1;
 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (size_t i = 0; i < config->chans; i++) {
 | 
						for (size_t i = 0; i < config->chans; i++) {
 | 
				
			||||||
		fifo = radio->receiveFIFO(i);
 | 
							fifo = radio->receiveFIFO(i);
 | 
				
			||||||
		if (fifo && trx->receiveFIFO(fifo, i))
 | 
							if (fifo && transceiver->receiveFIFO(fifo, i))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		LOG(ALERT) << "Could not attach FIFO to channel " << i;
 | 
							LOG(ALERT) << "Could not attach FIFO to channel " << i;
 | 
				
			||||||
		delete trx;
 | 
							return -1;
 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return trx;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sig_handler(int signo)
 | 
					static void sig_handler(int signo)
 | 
				
			||||||
@@ -501,13 +502,61 @@ static int set_sched_rr(int prio)
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					static void trx_stop()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::cout << "Shutting down transceiver..." << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete transceiver;
 | 
				
			||||||
 | 
						delete radio;
 | 
				
			||||||
 | 
						delete usrp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int trx_start(struct trx_config *config)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int type, chans, ref;
 | 
						int type, chans, ref;
 | 
				
			||||||
	RadioDevice *usrp;
 | 
					 | 
				
			||||||
	RadioInterface *radio = NULL;
 | 
					 | 
				
			||||||
	Transceiver *trx = NULL;
 | 
					 | 
				
			||||||
	RadioDevice::InterfaceType iface = RadioDevice::NORMAL;
 | 
						RadioDevice::InterfaceType iface = RadioDevice::NORMAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create the low level device object */
 | 
				
			||||||
 | 
						if (config->mcbts)
 | 
				
			||||||
 | 
							iface = RadioDevice::MULTI_ARFCN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (config->extref)
 | 
				
			||||||
 | 
							ref = RadioDevice::REF_EXTERNAL;
 | 
				
			||||||
 | 
						else if (config->gpsref)
 | 
				
			||||||
 | 
							ref = RadioDevice::REF_GPS;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							ref = RadioDevice::REF_INTERNAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						usrp = RadioDevice::make(config->tx_sps, config->rx_sps, iface,
 | 
				
			||||||
 | 
									 config->chans, config->offset, config->tx_paths, config->rx_paths);
 | 
				
			||||||
 | 
						type = usrp->open(config->dev_args, ref, config->swap_channels);
 | 
				
			||||||
 | 
						if (type < 0) {
 | 
				
			||||||
 | 
							LOG(ALERT) << "Failed to create radio device" << std::endl;
 | 
				
			||||||
 | 
							goto shutdown;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Setup the appropriate device interface */
 | 
				
			||||||
 | 
						radio = makeRadioInterface(config, usrp, type);
 | 
				
			||||||
 | 
						if (!radio)
 | 
				
			||||||
 | 
							goto shutdown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create the transceiver core */
 | 
				
			||||||
 | 
						if(makeTransceiver(config, radio) < 0)
 | 
				
			||||||
 | 
							goto shutdown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						chans = transceiver->numChans();
 | 
				
			||||||
 | 
						std::cout << "-- Transceiver active with "
 | 
				
			||||||
 | 
							  << chans << " channel(s)" << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shutdown:
 | 
				
			||||||
 | 
						trx_stop();
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
	struct trx_config config;
 | 
						struct trx_config config;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -589,48 +638,13 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	srandom(time(NULL));
 | 
						srandom(time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Create the low level device object */
 | 
						if(trx_start(&config) < 0)
 | 
				
			||||||
	if (config.mcbts)
 | 
							return EXIT_FAILURE;
 | 
				
			||||||
		iface = RadioDevice::MULTI_ARFCN;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (config.extref)
 | 
					 | 
				
			||||||
		ref = RadioDevice::REF_EXTERNAL;
 | 
					 | 
				
			||||||
	else if (config.gpsref)
 | 
					 | 
				
			||||||
		ref = RadioDevice::REF_GPS;
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		ref = RadioDevice::REF_INTERNAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	usrp = RadioDevice::make(config.tx_sps, config.rx_sps, iface,
 | 
					 | 
				
			||||||
				 config.chans, config.offset, config.tx_paths, config.rx_paths);
 | 
					 | 
				
			||||||
	type = usrp->open(config.dev_args, ref, config.swap_channels);
 | 
					 | 
				
			||||||
	if (type < 0) {
 | 
					 | 
				
			||||||
		LOG(ALERT) << "Failed to create radio device" << std::endl;
 | 
					 | 
				
			||||||
		goto shutdown;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Setup the appropriate device interface */
 | 
					 | 
				
			||||||
	radio = makeRadioInterface(&config, usrp, type);
 | 
					 | 
				
			||||||
	if (!radio)
 | 
					 | 
				
			||||||
		goto shutdown;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Create the transceiver core */
 | 
					 | 
				
			||||||
	trx = makeTransceiver(&config, radio);
 | 
					 | 
				
			||||||
	if (!trx)
 | 
					 | 
				
			||||||
		goto shutdown;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	chans = trx->numChans();
 | 
					 | 
				
			||||||
	std::cout << "-- Transceiver active with "
 | 
					 | 
				
			||||||
		  << chans << " channel(s)" << std::endl;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (!gshutdown)
 | 
						while (!gshutdown)
 | 
				
			||||||
		osmo_select_main(0);
 | 
							osmo_select_main(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
shutdown:
 | 
						trx_stop();
 | 
				
			||||||
	std::cout << "Shutting down transceiver..." << std::endl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete trx;
 | 
					 | 
				
			||||||
	delete radio;
 | 
					 | 
				
			||||||
	delete usrp;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user