Change trx_write_func to add beams definition over multiple tx antennas per beam

Co-authored-by: Laurent Thomas <laurent.thomas@open-cells.com>
This commit is contained in:
Bartosz Podrygajlo
2025-12-17 22:24:12 +01:00
co-authored by Laurent Thomas
parent 6bd3545a78
commit c4b94cff4b
2 changed files with 43 additions and 16 deletions
+21 -3
View File
@@ -491,12 +491,29 @@ struct openair0_device_t {
/*! \brief Called to send samples to the RF target /*! \brief Called to send samples to the RF target
@param device pointer to the device structure specific to the RF hardware target @param device pointer to the device structure specific to the RF hardware target
@param timestamp The timestamp at whicch the first sample MUST be sent @param timestamp The timestamp at whicch the first sample MUST be sent
@param buff Buffer which holds the samples (2 dimensional) @param buff Buffer which holds the samples (3 dimensional)
@param nsamps number of samples to be sent @param nsamps number of samples to be sent
@param number of antennas @param nb_antennas_tx number of antennas
@param num_beams number of beams
@param flags flags must be set to true if timestamp parameter needs to be applied @param flags flags must be set to true if timestamp parameter needs to be applied
*/ */
int (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int antenna_id, int flags); int (*trx_write_beams_func)(openair0_device *device,
openair0_timestamp timestamp,
void ***buff,
int nsamps,
int nb_antennas_tx,
int num_beams,
int flags);
/*! \brief Called to send samples to the RF target
@param device pointer to the device structure specific to the RF hardware target
@param timestamp The timestamp at whicch the first sample MUST be sent
@param buff Buffer which holds the samples (2 dimensional)
@param nsamps number of samples to be sent
@param nb_antennas_tx number of antennas
@param flags flags must be set to true if timestamp parameter needs to be applied
*/
int (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int nb_antennas_tx, int flags);
/*! \brief Called to send samples to the RF target /*! \brief Called to send samples to the RF target
@param device pointer to the device structure specific to the RF hardware target @param device pointer to the device structure specific to the RF hardware target
@@ -629,6 +646,7 @@ typedef struct {
uint64_t timestamp; // Timestamp value of first sample uint64_t timestamp; // Timestamp value of first sample
uint32_t option_value; // Option value uint32_t option_value; // Option value
uint32_t option_flag; // Option flag uint32_t option_flag; // Option flag
uint64_t beam_map;
} samplesBlockHeader_t; } samplesBlockHeader_t;
#ifdef __cplusplus #ifdef __cplusplus
+22 -13
View File
@@ -663,9 +663,10 @@ static int startClient(openair0_device *device)
static int rfsimulator_write_internal(rfsimulator_state_t *t, static int rfsimulator_write_internal(rfsimulator_state_t *t,
openair0_timestamp timestamp, openair0_timestamp timestamp,
void **samplesVoid, void ***samplesVoid,
int nsamps, int nsamps,
int nbAnt, int nbAnt,
uint64_t beam_map,
int flags) int flags)
{ {
mutexlock(t->Sockmutex); mutexlock(t->Sockmutex);
@@ -677,14 +678,14 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t,
if (b->conn_sock >= 0) { if (b->conn_sock >= 0) {
if (!nbAnt) if (!nbAnt)
LOG_E(HW, "rfsimulator sending 0 tx antennas\n"); LOG_E(HW, "rfsimulator sending 0 tx antennas\n");
samplesBlockHeader_t header = {(uint32_t)nsamps, (uint32_t)nbAnt, (uint64_t)timestamp}; samplesBlockHeader_t header = {(uint32_t)nsamps, (uint32_t)nbAnt, (uint64_t)timestamp, 0, 0, beam_map};
fullwrite(b->conn_sock, &header, sizeof(header), t); fullwrite(b->conn_sock, &header, sizeof(header), t);
if (nbAnt == 1) { if (nbAnt == 1) {
fullwrite(b->conn_sock, samplesVoid[0], sampleToByte(nsamps, nbAnt), t); fullwrite(b->conn_sock, samplesVoid[0][0], sampleToByte(nsamps, nbAnt), t);
} else { } else {
sample_t tmpSamples[nsamps][nbAnt]; sample_t tmpSamples[nsamps][nbAnt];
for (int a = 0; a < nbAnt; a++) { for (int a = 0; a < nbAnt; a++) {
sample_t *in = (sample_t *)samplesVoid[a]; sample_t *in = (sample_t *)samplesVoid[0][a];
for (int s = 0; s < nsamps; s++) for (int s = 0; s < nsamps; s++)
tmpSamples[s][a] = in[s]; tmpSamples[s][a] = in[s];
} }
@@ -714,7 +715,7 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t,
nsamps, nsamps,
timestamp, timestamp,
timestamp + nsamps, timestamp + nsamps,
signal_energy(static_cast<int32_t *>(samplesVoid[0]), nsamps)); signal_energy(static_cast<int32_t *>(samplesVoid[0][0]), nsamps));
/* trace only first antenna */ /* trace only first antenna */
T(T_USRP_TX_ANT0, T_INT(timestamp), T_BUFFER(samplesVoid[0], (int)sampleToByte(nsamps, 1))); T(T_USRP_TX_ANT0, T_INT(timestamp), T_BUFFER(samplesVoid[0], (int)sampleToByte(nsamps, 1)));
@@ -722,16 +723,23 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t,
return nsamps; return nsamps;
} }
static int rfsimulator_write(openair0_device *device, static int rfsimulator_write_beams(openair0_device *device,
openair0_timestamp timestamp, openair0_timestamp timestamp,
void **samplesVoid, void ***samplesVoid,
int nsamps, int nsamps,
int nbAnt, int nbAnt,
int flags) int num_beams,
int flags)
{ {
timestamp -= device->openair0_cfg->command_line_sample_advance; timestamp -= device->openair0_cfg->command_line_sample_advance;
rfsimulator_state_t *t = static_cast<rfsimulator_state_t *>(device->priv); rfsimulator_state_t *t = static_cast<rfsimulator_state_t *>(device->priv);
return rfsimulator_write_internal(t, timestamp, samplesVoid, nsamps, nbAnt, flags); return rfsimulator_write_internal(t, timestamp, samplesVoid, nsamps, nbAnt, 1, flags);
}
static int rfsimulator_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags)
{
void **tmp = buff;
return rfsimulator_write_beams(device, timestamp, &tmp, nsamps, cc, 1, flags);
} }
static bool add_client(rfsimulator_state_t *t) static bool add_client(rfsimulator_state_t *t)
@@ -761,7 +769,7 @@ static bool add_client(rfsimulator_state_t *t)
void *samplesVoid[t->tx_num_channels]; void *samplesVoid[t->tx_num_channels];
for (int i = 0; i < t->tx_num_channels; i++) for (int i = 0; i < t->tx_num_channels; i++)
samplesVoid[i] = (void *)&v; samplesVoid[i] = (void *)&v;
samplesBlockHeader_t header = {(uint32_t)1, (uint32_t)t->tx_num_channels, (uint64_t)t->lastWroteTS}; samplesBlockHeader_t header = {1, (uint32_t)t->tx_num_channels, (uint64_t)t->lastWroteTS, 0, 0, 1};
fullwrite(conn_sock, &header, sizeof(header), t); fullwrite(conn_sock, &header, sizeof(header), t);
fullwrite(conn_sock, samplesVoid, sampleToByte(1, t->tx_num_channels), t); fullwrite(conn_sock, samplesVoid, sampleToByte(1, t->tx_num_channels), t);
@@ -1145,6 +1153,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
device->trx_set_freq_func = rfsimulator_set_freq; device->trx_set_freq_func = rfsimulator_set_freq;
device->trx_set_gains_func = rfsimulator_set_gains; device->trx_set_gains_func = rfsimulator_set_gains;
device->trx_write_func = rfsimulator_write; device->trx_write_func = rfsimulator_write;
device->trx_write_beams_func = rfsimulator_write_beams;
device->trx_read_func = rfsimulator_read; device->trx_read_func = rfsimulator_read;
/* let's pretend to be a b2x0 */ /* let's pretend to be a b2x0 */
device->type = RFSIMULATOR; device->type = RFSIMULATOR;