implement modifying channel model algo while running, complete function freeing a model
This commit is contained in:
@@ -508,7 +508,7 @@ int process_command(char *buf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rt= CMDSTATUS_FOUND;
|
rt= CMDSTATUS_FOUND;
|
||||||
} else if (strncasecmp(cmd,"get",3) == 0 || strncasecmp(cmd,"set",3) == 0) {
|
} else if (strcasecmp(cmd,"get") == 0 || strcasecmp(cmd,"set") == 0) {
|
||||||
rt= setgetvar(i,cmd[0],cmdb);
|
rt= setgetvar(i,cmd[0],cmdb);
|
||||||
} else {
|
} else {
|
||||||
for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++) {
|
for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++) {
|
||||||
@@ -516,7 +516,7 @@ int process_command(char *buf) {
|
|||||||
if (telnetparams.CmdParsers[i].cmd[k].qptr != NULL) {
|
if (telnetparams.CmdParsers[i].cmd[k].qptr != NULL) {
|
||||||
notifiedFIFO_elt_t *msg =newNotifiedFIFO_elt(sizeof(telnetsrv_qmsg_t),0,NULL,NULL);
|
notifiedFIFO_elt_t *msg =newNotifiedFIFO_elt(sizeof(telnetsrv_qmsg_t),0,NULL,NULL);
|
||||||
telnetsrv_qmsg_t *cmddata=NotifiedFifoData(msg);
|
telnetsrv_qmsg_t *cmddata=NotifiedFifoData(msg);
|
||||||
cmddata->cmdfunc=telnetparams.CmdParsers[i].cmd[k].cmdfunc;
|
cmddata->cmdfunc=(qcmdfunc_t)telnetparams.CmdParsers[i].cmd[k].cmdfunc;
|
||||||
cmddata->prnt=client_printf;
|
cmddata->prnt=client_printf;
|
||||||
cmddata->debug=telnetparams.telnetdbg;
|
cmddata->debug=telnetparams.telnetdbg;
|
||||||
cmddata->cmdbuff=strdup(cmdb);
|
cmddata->cmdbuff=strdup(cmdb);
|
||||||
@@ -684,12 +684,12 @@ void run_telnetsrv(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void poll_telnetcmdq(void *qid) {
|
void poll_telnetcmdq(void *qid, void *arg) {
|
||||||
notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid);
|
notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid);
|
||||||
|
|
||||||
if (msg != NULL) {
|
if (msg != NULL) {
|
||||||
telnetsrv_qmsg_t *msgdata=NotifiedFifoData(msg);
|
telnetsrv_qmsg_t *msgdata=NotifiedFifoData(msg);
|
||||||
msgdata->cmdfunc(msgdata->cmdbuff,msgdata->debug,msgdata->prnt);
|
msgdata->cmdfunc(msgdata->cmdbuff,msgdata->debug,msgdata->prnt,arg);
|
||||||
free(msgdata->cmdbuff);
|
free(msgdata->cmdbuff);
|
||||||
delNotifiedFIFO_elt(msg);
|
delNotifiedFIFO_elt(msg);
|
||||||
}
|
}
|
||||||
@@ -826,8 +826,10 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
|
|||||||
}
|
}
|
||||||
|
|
||||||
int telnetsrv_getfarray(loader_shlibfunc_t **farray) {
|
int telnetsrv_getfarray(loader_shlibfunc_t **farray) {
|
||||||
*farray=malloc(sizeof(loader_shlibfunc_t));
|
*farray=malloc(sizeof(loader_shlibfunc_t)*2);
|
||||||
(*farray)[0].fname=TELNET_ADDCMD_FNAME;
|
(*farray)[0].fname=TELNET_ADDCMD_FNAME;
|
||||||
(*farray)[0].fptr=(int (*)(void) )add_telnetcmd;
|
(*farray)[0].fptr=(int (*)(void) )add_telnetcmd;
|
||||||
return 1;
|
(*farray)[1].fname=TELNET_POLLCMDQ_FNAME;
|
||||||
|
(*farray)[1].fptr=(int (*)(void) )poll_telnetcmdq;
|
||||||
|
return ( 2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@
|
|||||||
/* to add a set of new command to the telnet server shell */
|
/* to add a set of new command to the telnet server shell */
|
||||||
typedef void(*telnet_printfunc_t)(const char* format, ...);
|
typedef void(*telnet_printfunc_t)(const char* format, ...);
|
||||||
typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt);
|
typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt);
|
||||||
|
typedef int(*qcmdfunc_t)(char*, int, telnet_printfunc_t prnt,void *arg);
|
||||||
|
|
||||||
#define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue
|
#define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue
|
||||||
typedef struct cmddef {
|
typedef struct cmddef {
|
||||||
@@ -67,7 +68,7 @@ typedef struct cmddef {
|
|||||||
/* structure used to send a command via a message queue to enable */
|
/* structure used to send a command via a message queue to enable */
|
||||||
/* executing a command in a thread different from the telnet server thread */
|
/* executing a command in a thread different from the telnet server thread */
|
||||||
typedef struct telnetsrv_qmsg {
|
typedef struct telnetsrv_qmsg {
|
||||||
cmdfunc_t cmdfunc;
|
qcmdfunc_t cmdfunc;
|
||||||
telnet_printfunc_t prnt;
|
telnet_printfunc_t prnt;
|
||||||
int debug;
|
int debug;
|
||||||
char *cmdbuff;
|
char *cmdbuff;
|
||||||
@@ -144,7 +145,7 @@ VT escape sequence definition, for smarter display....
|
|||||||
#define TELNET_ADDCMD_FNAME "add_telnetcmd"
|
#define TELNET_ADDCMD_FNAME "add_telnetcmd"
|
||||||
#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq"
|
#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq"
|
||||||
typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *);
|
typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *);
|
||||||
typedef void(*poll_telnetcmdq_func_t)(void *qid);
|
typedef void(*poll_telnetcmdq_func_t)(void *qid,void *arg);
|
||||||
#ifdef TELNETSERVERCODE
|
#ifdef TELNETSERVERCODE
|
||||||
int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd);
|
int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd);
|
||||||
void set_sched(pthread_t tid, int pid,int priority);
|
void set_sched(pthread_t tid, int pid,int priority);
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
uint8_t nb_taps,
|
uint8_t nb_taps,
|
||||||
uint8_t channel_length,
|
uint8_t channel_length,
|
||||||
double *amps,
|
double *amps,
|
||||||
double *delays,
|
double *delays,
|
||||||
struct complex **R_sqrt,
|
struct complex **R_sqrt,
|
||||||
double Td,
|
double Td,
|
||||||
double sampling_rate,
|
double sampling_rate,
|
||||||
@@ -93,6 +93,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
|
|
||||||
if (delays==NULL) {
|
if (delays==NULL) {
|
||||||
chan_desc->delays = (double *) malloc(nb_taps*sizeof(double));
|
chan_desc->delays = (double *) malloc(nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_DELAY ;
|
||||||
delta_tau = Td/nb_taps;
|
delta_tau = Td/nb_taps;
|
||||||
|
|
||||||
for (i=0; i<nb_taps; i++)
|
for (i=0; i<nb_taps; i++)
|
||||||
@@ -134,10 +135,9 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
|
|
||||||
if (R_sqrt == NULL) {
|
if (R_sqrt == NULL) {
|
||||||
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
|
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_NTAPS ;
|
||||||
for (i = 0; i<nb_taps; i++) {
|
for (i = 0; i<nb_taps; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
|
||||||
|
|
||||||
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
||||||
chan_desc->R_sqrt[i][j].x = 1.0;
|
chan_desc->R_sqrt[i][j].x = 1.0;
|
||||||
chan_desc->R_sqrt[i][j].y = 0.0;
|
chan_desc->R_sqrt[i][j].y = 0.0;
|
||||||
@@ -145,7 +145,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
|
chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
|
||||||
|
|
||||||
for (i = 0; i<nb_taps; i++) {
|
for (i = 0; i<nb_taps; i++) {
|
||||||
//chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
|
//chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
|
||||||
//chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
|
//chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
|
||||||
@@ -175,7 +175,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
|
double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
|
||||||
double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27};
|
double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27};
|
||||||
|
|
||||||
double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
|
double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
|
||||||
double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
|
double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
|
||||||
|
|
||||||
double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
|
double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
|
||||||
@@ -282,10 +282,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
SCM_t channel_model,
|
SCM_t channel_model,
|
||||||
double sampling_rate,
|
double sampling_rate,
|
||||||
double channel_bandwidth,
|
double channel_bandwidth,
|
||||||
double forgetting_factor,
|
double forgetting_factor,
|
||||||
int32_t channel_offset,
|
int32_t channel_offset,
|
||||||
double path_loss_dB) {
|
double path_loss_dB) {
|
||||||
channel_desc_t *chan_desc = (channel_desc_t *)malloc(sizeof(channel_desc_t));
|
channel_desc_t *chan_desc = (channel_desc_t *)calloc(1,sizeof(channel_desc_t));
|
||||||
for(int i=0; i<max_chan;i++) {
|
for(int i=0; i<max_chan;i++) {
|
||||||
if (defined_channels[i] == NULL) {
|
if (defined_channels[i] == NULL) {
|
||||||
defined_channels[i]=chan_desc;
|
defined_channels[i]=chan_desc;
|
||||||
@@ -330,7 +330,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -368,9 +368,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
for (i = 0; i<6; i++)
|
for (i = 0; i<6; i++)
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
|
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
|
||||||
} else {
|
} else {
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
||||||
chan_desc->R_sqrt[i][j].x = 1.0;
|
chan_desc->R_sqrt[i][j].x = 1.0;
|
||||||
chan_desc->R_sqrt[i][j].y = 0.0;
|
chan_desc->R_sqrt[i][j].y = 0.0;
|
||||||
@@ -389,7 +390,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -427,6 +428,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
for (i = 0; i<6; i++)
|
for (i = 0; i<6; i++)
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
|
chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
|
||||||
} else {
|
} else {
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
@@ -447,7 +449,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -466,7 +468,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
|
|
||||||
for (i = 0; i<nb_tx*nb_rx; i++)
|
for (i = 0; i<nb_tx*nb_rx; i++)
|
||||||
chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
|
chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
|
||||||
|
|
||||||
for (i = 0; i<nb_tx*nb_rx; i++)
|
for (i = 0; i<nb_tx*nb_rx; i++)
|
||||||
chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
|
chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
|
||||||
|
|
||||||
@@ -480,7 +482,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
||||||
} else {
|
} else {
|
||||||
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
@@ -501,7 +503,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -547,7 +549,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
|
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EPA_high:
|
case EPA_high:
|
||||||
chan_desc->nb_taps = 7;
|
chan_desc->nb_taps = 7;
|
||||||
@@ -555,7 +557,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -609,7 +611,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -663,7 +665,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*eva_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*eva_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -696,8 +698,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
||||||
} else {
|
} else {
|
||||||
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
|
||||||
@@ -717,7 +719,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*etu_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*etu_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -750,7 +752,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
|
||||||
} else {
|
} else {
|
||||||
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex **));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
@@ -771,7 +773,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
|
||||||
sum_amps = 0;
|
sum_amps = 0;
|
||||||
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ;
|
||||||
for (i = 0; i<chan_desc->nb_taps; i++) {
|
for (i = 0; i<chan_desc->nb_taps; i++) {
|
||||||
chan_desc->amps[i] = pow(10,.1*mbsfn_amps_dB[i]);
|
chan_desc->amps[i] = pow(10,.1*mbsfn_amps_dB[i]);
|
||||||
sum_amps += chan_desc->amps[i];
|
sum_amps += chan_desc->amps[i];
|
||||||
@@ -798,7 +800,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->a[i] = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex *));
|
chan_desc->R_sqrt = (struct complex **) malloc(6*sizeof(struct complex *));
|
||||||
|
chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6;
|
||||||
for (i = 0; i<6; i++) {
|
for (i = 0; i<6; i++) {
|
||||||
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
chan_desc->R_sqrt[i] = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
|
||||||
|
|
||||||
@@ -1309,11 +1311,37 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
chan_desc->nb_paths = 10;
|
chan_desc->nb_paths = 10;
|
||||||
return(chan_desc);
|
return(chan_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_channel_desc_scm(channel_desc_t *ch) {
|
void free_channel_desc_scm(channel_desc_t *ch) {
|
||||||
// Must be made cleanly, a lot of leaks...
|
// Must be made cleanly, a lot of leaks...
|
||||||
defined_channels[ch->chan_idx]=NULL;
|
defined_channels[ch->chan_idx]=NULL;
|
||||||
free(ch);
|
if(ch->free_flags&CHANMODEL_FREE_AMPS)
|
||||||
|
free(ch->amps);
|
||||||
|
for (int i = 0; i<ch->nb_tx*ch->nb_rx; i++) {
|
||||||
|
free(ch->ch[i]);
|
||||||
|
free(ch->chF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i<ch->nb_taps; i++) {
|
||||||
|
free(ch->a[i]);
|
||||||
|
}
|
||||||
|
if(ch->free_flags&CHANMODEL_FREE_DELAY)
|
||||||
|
free(ch->delays);
|
||||||
|
if(ch->free_flags&CHANMODEL_FREE_RSQRT_6)
|
||||||
|
for (int i = 0; i<6; i++)
|
||||||
|
free(ch->R_sqrt[i]);
|
||||||
|
if(ch->free_flags&CHANMODEL_FREE_RSQRT_NTAPS)
|
||||||
|
for (int i = 0; i<ch->nb_taps;i++)
|
||||||
|
free(ch->R_sqrt[i]);
|
||||||
|
free(ch->R_sqrt);
|
||||||
|
free(ch->ch);
|
||||||
|
free(ch->chF);
|
||||||
|
free(ch->a);
|
||||||
|
free(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_channeldesc_owner(channel_desc_t *cdesc, uint32_t module_id) {
|
||||||
|
cdesc->module_id=module_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
|
int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
|
||||||
@@ -1454,7 +1482,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
|
|||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
double N_RB2sampling_rate(uint16_t N_RB) {
|
double N_RB2sampling_rate(uint16_t N_RB) {
|
||||||
double sampling_rate;
|
double sampling_rate;
|
||||||
|
|
||||||
@@ -1522,6 +1550,10 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt
|
|||||||
|
|
||||||
|
|
||||||
static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
|
static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
|
||||||
|
char *module_id_str[]=MODULEID_STR_INIT;
|
||||||
|
if (cd->module_id != 0) {
|
||||||
|
prnt("model owner: %s\n",module_id_str[cd->module_id]);
|
||||||
|
}
|
||||||
prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate);
|
prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate);
|
||||||
prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n",
|
prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n",
|
||||||
cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No"));
|
cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No"));
|
||||||
@@ -1617,10 +1649,10 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
|||||||
return CMDSTATUS_FOUND;
|
return CMDSTATUS_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
int modelid_fromname(char *modelname) {
|
int modelid_fromname(char *modelname) {
|
||||||
int modelid=map_str_to_int(channelmod_names,modelname);
|
int modelid=map_str_to_int(channelmod_names,modelname);
|
||||||
AssertFatal(modelid>0,
|
if (modelid < 0)
|
||||||
"random_channel.c: Error channel model %s unknown\n",modelname);
|
LOG_E(OCM,"random_channel.c: Error channel model %s unknown\n",modelname);
|
||||||
return modelid;
|
return modelid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,16 @@ The present clause specifies several numerical functions for testing of digital
|
|||||||
|
|
||||||
#define NB_SAMPLES_CHANNEL_OFFSET 4
|
#define NB_SAMPLES_CHANNEL_OFFSET 4
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UNSPECIFIED_MODID=0,
|
||||||
|
RFSIMU_MODULEID=1
|
||||||
|
} channelmod_moduleid_t;
|
||||||
|
#define MODULEID_STR_INIT {"","rfsimulator"}
|
||||||
|
|
||||||
|
#define CHANMODEL_FREE_DELAY 1<<0
|
||||||
|
#define CHANMODEL_FREE_RSQRT_6 1<<1
|
||||||
|
#define CHANMODEL_FREE_RSQRT_NTAPS 1<<2
|
||||||
|
#define CHANMODEL_FREE_AMPS 1<<3
|
||||||
typedef struct {
|
typedef struct {
|
||||||
///Number of tx antennas
|
///Number of tx antennas
|
||||||
uint8_t nb_tx;
|
uint8_t nb_tx;
|
||||||
@@ -96,6 +106,10 @@ typedef struct {
|
|||||||
unsigned int chan_idx;
|
unsigned int chan_idx;
|
||||||
/// id of the channel modeling algorithm
|
/// id of the channel modeling algorithm
|
||||||
int modelid;
|
int modelid;
|
||||||
|
/// identifies channel descriptor owner (the module which created this descriptor)
|
||||||
|
channelmod_moduleid_t module_id;
|
||||||
|
/// flags to properly trigger memory free
|
||||||
|
unsigned int free_flags;
|
||||||
} channel_desc_t;
|
} channel_desc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -278,9 +292,18 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
double forgetting_factor,
|
double forgetting_factor,
|
||||||
int32_t channel_offset,
|
int32_t channel_offset,
|
||||||
double path_loss_dB);
|
double path_loss_dB);
|
||||||
|
/**
|
||||||
|
\brief free memory allocated for a model descriptor
|
||||||
|
\param ch points to the model, which cannot be used after calling this fuction
|
||||||
|
*/
|
||||||
|
void free_channel_desc_scm(channel_desc_t *ch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief This set the ownerid of a model descriptor, can be later used to check what module created a channel model
|
||||||
|
\param cdesc points to the model descriptor
|
||||||
|
\param module_id identifies the channel model. should be define as a macro in simu.h
|
||||||
|
*/
|
||||||
|
void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_id);
|
||||||
/** \fn void random_channel(channel_desc_t *desc)
|
/** \fn void random_channel(channel_desc_t *desc)
|
||||||
\brief This routine generates a random channel response (time domain) according to a tapped delay line model.
|
\brief This routine generates a random channel response (time domain) according to a tapped delay line model.
|
||||||
\param desc Pointer to the channel descriptor
|
\param desc Pointer to the channel descriptor
|
||||||
|
|||||||
@@ -89,9 +89,9 @@ extern RAN_CONTEXT_t RC;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg);
|
||||||
static telnetshell_cmddef_t rfsimu_cmdarray[] = {
|
static telnetshell_cmddef_t rfsimu_cmdarray[] = {
|
||||||
{"setmodel","<model name>",rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ},
|
{"setmodel","<model name>",(cmdfunc_t)rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ},
|
||||||
{"","",NULL},
|
{"","",NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -185,6 +185,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
|
|||||||
bridge->chan_forgetfact, // forgetting_factor
|
bridge->chan_forgetfact, // forgetting_factor
|
||||||
bridge->chan_offset, // maybe used for TA
|
bridge->chan_offset, // maybe used for TA
|
||||||
bridge->chan_pathloss); // path_loss in dB
|
bridge->chan_pathloss); // path_loss in dB
|
||||||
|
set_channeldesc_owner(ptr->channel_model, RFSIMU_MODULEID);
|
||||||
random_channel(ptr->channel_model,false);
|
random_channel(ptr->channel_model,false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -311,25 +312,38 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
|
|||||||
rfsimulator->typeStamp = UE_MAGICDL_FDD;
|
rfsimulator->typeStamp = UE_MAGICDL_FDD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg) {
|
||||||
char *modelname=NULL;
|
char *modelname=NULL;
|
||||||
int s = sscanf(buff,"%ms\n",&modelname);
|
int s = sscanf(buff,"%ms\n",&modelname);
|
||||||
int channelmod=modelid_fromname(modelname);
|
if (s == 1) {
|
||||||
for (int i=0; i<FD_SETSIZE; i++) {
|
int channelmod=modelid_fromname(modelname);
|
||||||
/* if(rfsimulator->buf[i].conn_sock > 0) {
|
if (channelmod<0)
|
||||||
channel_desc_t *cm = rfsimulator->buf[i].channel_model;
|
prnt("ERROR: model %s unknown\n",modelname);
|
||||||
|
else {
|
||||||
rfsimulator->buf[i].channel_model=new_channel_desc_scm(cm->nb_tx,cm->nb_rx,
|
rfsimulator_state_t *t = (rfsimulator_state_t *)arg;
|
||||||
channelmod,
|
for (int i=0; i<FD_SETSIZE; i++) {
|
||||||
cm->sampling_rate,
|
buffer_t *b=&t->buf[i];
|
||||||
cm->channel_bandwidth,
|
if (b->conn_sock >= 0 ) {
|
||||||
cm->forgetting_factor, // forgetting_factor
|
channel_desc_t *newmodel=new_channel_desc_scm(t->tx_num_channels,t->rx_num_channels,
|
||||||
cm->channel_offset, // maybe used for TA
|
channelmod,
|
||||||
cm-> path_loss_dB); // path_loss in dB
|
t->sample_rate,
|
||||||
free_channel_desc_scm(cm);
|
t->tx_bw,
|
||||||
random_channel(ptr->channel_model,false);
|
t->chan_forgetfact, // forgetting_factor
|
||||||
} */
|
t->chan_offset, // maybe used for TA
|
||||||
|
t->chan_pathloss); // path_loss in dB
|
||||||
|
set_channeldesc_owner(newmodel, RFSIMU_MODULEID);
|
||||||
|
random_channel(newmodel,false);
|
||||||
|
channel_desc_t *oldmodel=b->channel_model;
|
||||||
|
b->channel_model=newmodel;
|
||||||
|
free_channel_desc_scm(oldmodel);
|
||||||
|
prnt("New model %s applied to channel connected to sock %d\n",modelname,i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
prnt("ERROR: no model specified\n");
|
||||||
}
|
}
|
||||||
|
free(modelname);
|
||||||
return CMDSTATUS_FOUND;
|
return CMDSTATUS_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -683,7 +697,8 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
|
|||||||
// it seems legacy behavior is: never in UL, each frame in DL
|
// it seems legacy behavior is: never in UL, each frame in DL
|
||||||
if (reGenerateChannel)
|
if (reGenerateChannel)
|
||||||
random_channel(ptr->channel_model,0);
|
random_channel(ptr->channel_model,0);
|
||||||
t->poll_telnetcmdq(t->telnetcmd_qid);
|
if (t->poll_telnetcmdq)
|
||||||
|
t->poll_telnetcmdq(t->telnetcmd_qid,t);
|
||||||
for (int a=0; a<nbAnt; a++) {
|
for (int a=0; a<nbAnt; a++) {
|
||||||
if ( ptr->channel_model != NULL ) // apply a channel model
|
if ( ptr->channel_model != NULL ) // apply a channel model
|
||||||
rxAddInput( ptr->circularBuf, (struct complex16 *) samplesVoid[a],
|
rxAddInput( ptr->circularBuf, (struct complex16 *) samplesVoid[a],
|
||||||
|
|||||||
Reference in New Issue
Block a user