Commit f18d59c9 authored by Cedric Roux's avatar Cedric Roux

- add channel estimation plot

- add on/off command line options
parent 1f4f0305
...@@ -3,6 +3,10 @@ ID = ENB_INPUT_SIGNAL ...@@ -3,6 +3,10 @@ ID = ENB_INPUT_SIGNAL
DESC = eNodeB received signal in the time domain for a duration of 1ms DESC = eNodeB received signal in the time domain for a duration of 1ms
GROUP = PHY:GRAPHIC:HEAVY GROUP = PHY:GRAPHIC:HEAVY
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata
ID = ENB_UL_CHANNEL_ESTIMATE
DESC = eNodeB channel estimation in the time domain
GROUP = PHY:GRAPHIC:HEAVY
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
#legacy logs #legacy logs
ID = LEGACY_MAC_INFO ID = LEGACY_MAC_INFO
......
CC=gcc CC=gcc
CFLAGS=-Wall -g -pthread CFLAGS=-Wall -g -pthread
CFLAGS += -O3 -ffast-math -fomit-frame-pointer
LIBS=-lX11 -lm LIBS=-lX11 -lm
#comment those two lines to NOT use shared memory #comment those two lines to NOT use shared memory
......
...@@ -9,6 +9,7 @@ typedef struct { ...@@ -9,6 +9,7 @@ typedef struct {
char *desc; char *desc;
char **groups; char **groups;
int size; int size;
int id;
} id; } id;
typedef struct { typedef struct {
...@@ -116,7 +117,7 @@ int string_cmp(const void *_p1, const void *_p2) ...@@ -116,7 +117,7 @@ int string_cmp(const void *_p1, const void *_p2)
return strcmp(*p1, *p2); return strcmp(*p1, *p2);
} }
id *add_id(database *r, char *idname) id *add_id(database *r, char *idname, int i)
{ {
if (bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp) != NULL) if (bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp) != NULL)
{ printf("ERROR: ID '%s' declared more than once\n", idname); exit(1); } { printf("ERROR: ID '%s' declared more than once\n", idname); exit(1); }
...@@ -129,6 +130,7 @@ id *add_id(database *r, char *idname) ...@@ -129,6 +130,7 @@ id *add_id(database *r, char *idname)
r->i[r->isize].desc = NULL; r->i[r->isize].desc = NULL;
r->i[r->isize].groups = NULL; r->i[r->isize].groups = NULL;
r->i[r->isize].size = 0; r->i[r->isize].size = 0;
r->i[r->isize].id = i;
r->isize++; r->isize++;
qsort(r->i, r->isize, sizeof(id), id_cmp); qsort(r->i, r->isize, sizeof(id), id_cmp);
return (id*)bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp); return (id*)bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp);
...@@ -221,6 +223,7 @@ void *parse_database(char *filename) ...@@ -221,6 +223,7 @@ void *parse_database(char *filename)
database *r; database *r;
char *name, *value; char *name, *value;
id *last_id = NULL; id *last_id = NULL;
int i;
r = calloc(1, sizeof(*r)); if (r == NULL) abort(); r = calloc(1, sizeof(*r)); if (r == NULL) abort();
memset(&p, 0, sizeof(p)); memset(&p, 0, sizeof(p));
...@@ -229,11 +232,13 @@ void *parse_database(char *filename) ...@@ -229,11 +232,13 @@ void *parse_database(char *filename)
in = fopen(filename, "r"); if (in == NULL) { perror(filename); abort(); } in = fopen(filename, "r"); if (in == NULL) { perror(filename); abort(); }
i = 0;
while (1) { while (1) {
get_line(&p, in, &name, &value); get_line(&p, in, &name, &value);
if (name == NULL) break; if (name == NULL) break;
//printf("%s %s\n", name, value); //printf("%s %s\n", name, value);
if (!strcmp(name, "ID")) last_id = add_id(r, value); if (!strcmp(name, "ID")) { last_id = add_id(r, value, i); i++; }
if (!strcmp(name, "GROUP")) add_groups(r, last_id, value); if (!strcmp(name, "GROUP")) add_groups(r, last_id, value);
if (!strcmp(name, "DESC")) add_desc(last_id, value); if (!strcmp(name, "DESC")) add_desc(last_id, value);
} }
...@@ -280,3 +285,27 @@ void list_groups(void *_d) ...@@ -280,3 +285,27 @@ void list_groups(void *_d)
int i; int i;
for (i = 0; i < d->gsize; i++) printf("%s\n", d->g[i].name); for (i = 0; i < d->gsize; i++) printf("%s\n", d->g[i].name);
} }
static void onoff_id(database *d, char *name, int *a, int onoff)
{
id *i;
i = bsearch(&(id){name:name}, d->i, d->isize, sizeof(id), id_cmp);
if (i == NULL) return;
a[i->id] = onoff;
printf("turning %s %s\n", name, onoff ? "ON" : "OFF");
}
static void onoff_group(database *d, char *name, int *a, int onoff)
{
group *g;
int i;
g = bsearch(&(group){name:name}, d->g, d->gsize, sizeof(group), group_cmp);
if (g == NULL) return;
for (i = 0; i < g->size; i++) onoff_id(d, g->ids[i], a, onoff);
}
void on_off(void *d, char *item, int *a, int onoff)
{
onoff_group(d, item, a, onoff);
onoff_id(d, item, a, onoff);
}
#ifndef _TRACER_DEFS_H_ #ifndef _TRACER_DEFS_H_
#define _TRACER_DEFS_H_ #define _TRACER_DEFS_H_
void *make_plot(int width, int height, int bufsize); void *make_plot(int width, int height, int bufsize, char *title);
void plot_set(void *plot, float *data, int len, int pos); void plot_set(void *plot, float *data, int len, int pos);
void iq_plot_set(void *plot, short *data, int len, int pos); void iq_plot_set(void *plot, short *data, int len, int pos);
...@@ -10,5 +10,6 @@ void *parse_database(char *filename); ...@@ -10,5 +10,6 @@ void *parse_database(char *filename);
void dump_database(void *database); void dump_database(void *database);
void list_ids(void *database); void list_ids(void *database);
void list_groups(void *database); void list_groups(void *database);
void on_off(void *d, char *item, int *a, int onoff);
#endif /* _TRACER_DEFS_H_ */ #endif /* _TRACER_DEFS_H_ */
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "../T_defs.h" #include "../T_defs.h"
void *ul_plot; void *ul_plot;
void *chest_plot;
#ifdef T_USE_SHARED_MEMORY #ifdef T_USE_SHARED_MEMORY
...@@ -209,11 +210,30 @@ void get_message(int s) ...@@ -209,11 +210,30 @@ void get_message(int s)
GET(s, &antenna, sizeof(int)); GET(s, &antenna, sizeof(int));
GET(s, &size, sizeof(int)); GET(s, &size, sizeof(int));
GET(s, buf, size); GET(s, buf, size);
#if 0
printf("got T_ENB_INPUT_SIGNAL eNB %d frame %d subframe %d antenna %d size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", printf("got T_ENB_INPUT_SIGNAL eNB %d frame %d subframe %d antenna %d size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
eNB, frame, subframe, antenna, size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]); eNB, frame, subframe, antenna, size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);
#endif
if (size != 4 * 7680) if (size != 4 * 7680)
{printf("bad T_ENB_INPUT_SIGNAL, only 7680 samples allowed\n");abort();} {printf("bad T_ENB_INPUT_SIGNAL, only 7680 samples allowed\n");abort();}
iq_plot_set(ul_plot, (short*)buf, 7680, subframe*7680); if (ul_plot) iq_plot_set(ul_plot, (short*)buf, 7680, subframe*7680);
break;
}
case T_ENB_UL_CHANNEL_ESTIMATE: {
unsigned char buf[T_BUFFER_MAX];
int size;
int eNB, UE, frame, subframe, antenna;
GET(s, &eNB, sizeof(int));
GET(s, &UE, sizeof(int));
GET(s, &frame, sizeof(int));
GET(s, &subframe, sizeof(int));
GET(s, &antenna, sizeof(int));
GET(s, &size, sizeof(int));
GET(s, buf, size);
if (size != 512*4)
{printf("bad T_ENB_UL_CHANNEL_ESTIMATE, only 512 samples allowed\n");
abort();}
if (chest_plot) iq_plot_set(chest_plot, (short*)buf, 512, 0);
break; break;
} }
case T_buf_test: { case T_buf_test: {
...@@ -265,6 +285,11 @@ void usage(void) ...@@ -265,6 +285,11 @@ void usage(void)
" -li print IDs in the database\n" " -li print IDs in the database\n"
" -lg print GROUPs in the database\n" " -lg print GROUPs in the database\n"
" -dump dump the database\n" " -dump dump the database\n"
" -x run with XFORMS (revisited)\n"
" -on <GROUP or ID> turn log ON for given GROUP or ID\n"
" -off <GROUP or ID> turn log OFF for given GROUP or ID\n"
"note: you may pass several -on and -off, they will be processed in order\n"
" by default, all is off\n"
); );
exit(1); exit(1);
} }
...@@ -280,6 +305,16 @@ int main(int n, char **v) ...@@ -280,6 +305,16 @@ int main(int n, char **v)
int do_list_ids = 0; int do_list_ids = 0;
int do_list_groups = 0; int do_list_groups = 0;
int do_dump_database = 0; int do_dump_database = 0;
int do_xforms = 0;
char **on_off_name;
int *on_off_action;
int on_off_n = 0;
int is_on[T_NUMBER_OF_IDS];
memset(is_on, 0, sizeof(is_on));
on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort();
on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort();
for (i = 1; i < n; i++) { for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
...@@ -288,6 +323,12 @@ int main(int n, char **v) ...@@ -288,6 +323,12 @@ int main(int n, char **v)
if (!strcmp(v[i], "-li")) { do_list_ids = 1; continue; } if (!strcmp(v[i], "-li")) { do_list_ids = 1; continue; }
if (!strcmp(v[i], "-lg")) { do_list_groups = 1; continue; } if (!strcmp(v[i], "-lg")) { do_list_groups = 1; continue; }
if (!strcmp(v[i], "-dump")) { do_dump_database = 1; continue; } if (!strcmp(v[i], "-dump")) { do_dump_database = 1; continue; }
if (!strcmp(v[i], "-x")) { do_xforms = 1; continue; }
if (!strcmp(v[i], "-on")) { if (i > n-2) usage();
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=1; continue; }
if (!strcmp(v[i], "-off")) { if (i > n-2) usage();
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=0; continue; }
printf("ERROR: unknown option %s\n", v[i]);
usage(); usage();
} }
...@@ -303,7 +344,13 @@ int main(int n, char **v) ...@@ -303,7 +344,13 @@ int main(int n, char **v)
if (do_list_groups) { list_groups(database); return 0; } if (do_list_groups) { list_groups(database); return 0; }
if (do_dump_database) { dump_database(database); return 0; } if (do_dump_database) { dump_database(database); return 0; }
ul_plot = make_plot(512, 100, 7680*2*10); if (do_xforms) {
ul_plot = make_plot(512, 100, 7680*2*10, "UL Input Signal");
chest_plot = make_plot(512, 100, 512*2, "UL Channel Estimate UE 0");
}
for (i = 0; i < on_off_n; i++)
on_off(database, on_off_name[i], is_on, on_off_action[i]);
#ifdef T_USE_SHARED_MEMORY #ifdef T_USE_SHARED_MEMORY
init_shm(); init_shm();
...@@ -312,9 +359,11 @@ int main(int n, char **v) ...@@ -312,9 +359,11 @@ int main(int n, char **v)
/* send the first message - activate all traces */ /* send the first message - activate all traces */
t = 0; t = 0;
if (write(s, &t, 1) != 1) abort(); if (write(s, &t, 1) != 1) abort();
l = T_NUMBER_OF_IDS; l = 0;
for (i = 0; i < T_NUMBER_OF_IDS; i++) if (is_on[i]) l++;
if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); if (write(s, &l, sizeof(int)) != sizeof(int)) abort();
for (l = 0; l < T_NUMBER_OF_IDS; l++) for (l = 0; l < T_NUMBER_OF_IDS; l++)
if (is_on[l])
if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); if (write(s, &l, sizeof(int)) != sizeof(int)) abort();
/* read messages */ /* read messages */
......
...@@ -44,15 +44,15 @@ static void *plot_thread(void *_p) ...@@ -44,15 +44,15 @@ static void *plot_thread(void *_p)
{ {
int i; int i;
for (i = 0; i < 512*150; i++) for (i = 0; i < p->bufsize/2; i++)
p->buf[i] = 10*log10(1.0+(float)(p->iqbuf[2*i]*p->iqbuf[2*i]+ p->buf[i] = 10*log10(1.0+(float)(p->iqbuf[2*i]*p->iqbuf[2*i]+
p->iqbuf[2*i+1]*p->iqbuf[2*i+1])); p->iqbuf[2*i+1]*p->iqbuf[2*i+1]));
} }
s = p->buf; s = p->buf;
for (i = 0; i < 512; i++) { for (i = 0; i < 512; i++) {
v = 0; v = 0;
for (j = 0; j < 150; j++, s++) v += *s; for (j = 0; j < p->bufsize/2/512; j++, s++) v += *s;
v /= 150; v /= p->bufsize/2/512;
XDrawLine(p->d, p->p, DefaultGC(p->d, DefaultScreen(p->d)), i, 100, i, 100-v); XDrawLine(p->d, p->p, DefaultGC(p->d, DefaultScreen(p->d)), i, 100, i, 100-v);
} }
...@@ -79,7 +79,7 @@ static void new_thread(void *(*f)(void *), void *data) ...@@ -79,7 +79,7 @@ static void new_thread(void *(*f)(void *), void *data)
{ fprintf(stderr, "pthread_attr_destroy err\n"); exit(1); } { fprintf(stderr, "pthread_attr_destroy err\n"); exit(1); }
} }
void *make_plot(int width, int height, int bufsize) void *make_plot(int width, int height, int bufsize, char *title)
{ {
plot *p; plot *p;
Display *d; Display *d;
...@@ -92,6 +92,8 @@ void *make_plot(int width, int height, int bufsize) ...@@ -92,6 +92,8 @@ void *make_plot(int width, int height, int bufsize)
XSelectInput(d, w, ExposureMask); XSelectInput(d, w, ExposureMask);
XMapWindow(d, w); XMapWindow(d, w);
XStoreName(d, w, title);
pm = XCreatePixmap(d, w, width, height, DefaultDepth(d, DefaultScreen(d))); pm = XCreatePixmap(d, w, width, height, DefaultDepth(d, DefaultScreen(d)));
p = malloc(sizeof(*p)); if (p == NULL) abort(); p = malloc(sizeof(*p)); if (p == NULL) abort();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment