Example #1
0
FD_dialattrib *
create_form_dialattrib( void )
{
    FL_OBJECT *obj;
    FD_dialattrib *fdui = ( FD_dialattrib * ) fl_malloc( sizeof *fdui );

    int old_bw = fl_get_border_width( );
    fl_set_border_width( -1 );

    fdui->vdata = fdui->cdata = NULL;
    fdui->ldata = 0;

    fdui->dialattrib = fl_bgn_form( FL_NO_BOX, 540, 280 );

    fdui->background = obj = fl_add_box( FL_FLAT_BOX, 0, 0, 540, 280, "" );

    fdui->returnsetting = obj = fl_add_menu( FL_PULLDOWN_MENU, 305, 90, 138, 24, "Return Setting" );
    fl_set_object_boxtype( obj, FL_UP_BOX );
    fl_set_object_callback( obj, dial_returnsetting_change, 0 );

    fdui->minval = obj = fl_add_input( FL_FLOAT_INPUT, 195, 45, 92, 24, "Dial Min" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_minmax_change, 0 );

    fdui->maxval = obj = fl_add_input( FL_FLOAT_INPUT, 195, 77, 92, 24, "DialMax" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_minmax_change, 0 );

    fdui->initialval = obj = fl_add_input( FL_FLOAT_INPUT, 195, 109, 92, 24, "Initial Value" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_initialvalue_change, 0 );

    fdui->step = obj = fl_add_input( FL_FLOAT_INPUT, 195, 141, 92, 24, "Dial Step" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_stepchange_cb, 0 );

    fdui->thetai = obj = fl_add_input( FL_FLOAT_INPUT, 195, 173, 92, 24, "Min. Angle" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_thetachange_cb, 0 );

    fdui->thetaf = obj = fl_add_input( FL_FLOAT_INPUT, 195, 205, 92, 24, "Max. Angle" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_callback( obj, dial_thetachange_cb, 1 );

    fdui->dir = obj = fl_add_choice( FL_NORMAL_CHOICE2, 306, 155, 134, 25, "Direction" );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );
    fl_set_object_callback( obj, dir_cb, 0 );

    obj = fl_add_labelframe( FL_ENGRAVED_FRAME, 30, 15, 480, 240, "Dial Attributes" );
    fl_set_object_lcolor( obj, FL_DARKVIOLET );
    fl_set_object_lsize( obj, FL_MEDIUM_SIZE );
    fl_set_object_lstyle( obj, FL_TIMESBOLD_STYLE + FL_EMBOSSED_STYLE );

    fl_end_form( );

    fdui->dialattrib->fdui = fdui;
    fl_set_border_width( old_bw );

    return fdui;
}
Example #2
0
FD_config_dialog *
create_form_config_dialog( void )
{
    FL_OBJECT *obj;
    FD_config_dialog *fdui = fl_malloc( sizeof *fdui );

    fdui->vdata = fdui->cdata = NULL;
    fdui->ldata = 0;

    fdui->config_dialog = fl_bgn_form( FL_NO_BOX, 410, 120 );

    obj = fl_add_box( FL_UP_BOX, 0, 0, 410, 120, "" );

    fdui->cancel_btn = obj = fl_add_button( FL_NORMAL_BUTTON, 80, 75, 100, 30, "Cancel" );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, get_dir_callback, -1 );

    fdui->ok_btn = obj = fl_add_button( FL_RETURN_BUTTON, 225, 75, 100, 30, "OK" );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, get_dir_callback, 0 );

    fdui->dir_input = obj = fl_add_input( FL_NORMAL_INPUT, 80, 30, 300, 30, "Directory" );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fl_end_form( );

    fdui->config_dialog->fdui = fdui;

    return fdui;
}
Example #3
0
void
fl_add_signal_callback( int                 s,
                        FL_SIGNAL_HANDLER   cb,
                        void              * data )
{
    FLI_SIGNAL_REC *sig_rec,
                   *rec = fli_context->signal_rec;

    if ( ! fli_handle_signal )
        fli_handle_signal = handle_signal;

    while ( rec && rec->signum != s )
        rec = rec->next;

    if ( rec )
    {
        rec->callback = cb;
        rec->data = data;
    }
    else
    {
        sig_rec = fl_malloc( sizeof *sig_rec );
        sig_rec->next      = NULL;
        sig_rec->data      = data;
        sig_rec->callback  = cb;
        sig_rec->signum    = s;
        sig_rec->caught    = 0;

        if ( ! sig_direct )
        {
#if defined HAVE_SIGACTION
            struct sigaction sact;

            sact.sa_handler = default_signal_handler;
            sigemptyset( &sact.sa_mask );
            sact.sa_flags = 0;

            if ( sigaction( s, &sact, &sig_rec->old_sigact ) < 0 )
#else
            errno = 0;
            sig_rec->ocallback = signal( s, default_signal_handler );
            if ( sig_rec->ocallback == ( FLI_OSSIG_HANDLER ) - 1L || errno )
#endif
            {
                M_err( "fl_add_signal_callback", "Can't add handler for "
                       "signal %d", s );
                fl_free( sig_rec );
                return;
            }
        }

        if ( fli_context->signal_rec )
            sig_rec->next = fli_context->signal_rec;
        fli_context->signal_rec = sig_rec;
    }
}
Example #4
0
static void
generate_header_info( FL_IMAGE * im )
{
    SPEC *sp = im->io_spec;
    static const char *encoding[ ] = { "RGB", "RLE8", "RLE4" };
    char buf[ 128 ];

    if ( ! ( im->info = fl_malloc( 512 ) ) )
        return;

    sprintf( im->info,"Size=(%d x %d)\n", im->w, im->h );
    sprintf( buf, "BitsPerPixel=%d\nBytesPerLine=%d\n", sp->bpp, sp->bpl );
    strcat( im->info,buf );

    if ( sp->bpp != 24 )
    {
        sprintf( buf,"ColorUsed=%d\n", sp->col_used );
        strcat( im->info,buf );
    }

    sprintf( buf,"Encoding=%s", encoding[ sp->encode ] );
    strcat( im->info,buf );
}
Example #5
0
FD_splash_frm *
create_form_splash_frm( void )
{
    FL_OBJECT *obj;
    FD_splash_frm *fdui = fl_malloc( sizeof *fdui );

    fdui->vdata = fdui->cdata = NULL;
    fdui->ldata = 0;

    fdui->splash_frm = fl_bgn_form( FL_NO_BOX, 390, 280 );

    obj = fl_add_box( FL_FLAT_BOX, 0, 0, 390, 280, "" );

    obj = fl_add_pixmap( FL_NORMAL_PIXMAP, 40, 20, 310, 100, "" );

    obj = fl_add_text( FL_NORMAL_TEXT, 70, 150, 80, 30, "text" );

    fl_end_form( );

    fdui->splash_frm->fdui = fdui;

    return fdui;
}
Example #6
0
void
copy_superspec( FL_OBJECT * target,
                FL_OBJECT * src )
{
    SuperSPEC *t = fl_malloc( sizeof *t ),
              *s = get_superspec( src );
    int i;

    t->mode      = NULL;
    t->content   = NULL;;
    t->shortcut  = NULL;
    t->callback  = NULL;
    t->misc_char = NULL;

    *t = *s;

    t->content = NULL;
    t->shortcut = NULL;
    t->callback = NULL;
    t->mode = NULL;
    t->mval = NULL;

    /* Take care of pointers in the SuperSPEC */

    if ( s->nlines )
    {
        int cnt = s->nlines + 1;

        t->content = s->content ?
                     fl_malloc( cnt * sizeof * t->content) : NULL;

        t->shortcut = s->shortcut ?
                      fl_malloc( cnt * sizeof *t->shortcut ) : NULL;

        t->callback = s->callback ?
                      fl_malloc( cnt * sizeof *t->callback ) : NULL;

        t->mode = s->mode ? fl_malloc( cnt * sizeof *t->mode ) : NULL;

        t->mval = s->mval ?
                  fl_malloc( cnt * sizeof *t->mval ) : NULL;
    }

    for ( i = 1; i <= s->nlines; i++ )
    {
        if ( t->content )
            t->content[ i ] = s->content[ i ] ?
                              fl_strdup( s->content[ i ] ) : NULL;

        if ( t->shortcut )
            t->shortcut[ i ] = s->shortcut[ i ] ?
                               fl_strdup( s->shortcut[ i ] ) : NULL;

        if ( t->callback )
            t->callback[ i ] = s->callback[ i ] ?
                               fl_strdup( s->callback[ i ] ) : NULL;
    }

    if ( t->mode )
        memcpy( t->mode, s->mode, ( s->nlines + 1 ) * sizeof *t->mode );

    if ( t->mval )
        memcpy( t->mval, s->mval, ( s->nlines + 1 ) * sizeof *t->mval );

    if ( t->misc_char )
        t->misc_char = fl_strdup( s->misc_char );

    free_superspec( target );
    target->u_vdata = t;
}
Example #7
0
FD_xyplotattrib *
create_form_xyplotattrib( void )
{
    FL_OBJECT *obj;
    FD_xyplotattrib *fdui = ( FD_xyplotattrib * ) fl_malloc( sizeof *fdui );

    int old_bw = fl_get_border_width( );
    fl_set_border_width( -1 );

    fdui->vdata = fdui->cdata = NULL;
    fdui->ldata = 0;

    fdui->xyplotattrib = fl_bgn_form( FL_NO_BOX, 520, 270 );

    obj = fl_add_box( FL_FLAT_BOX, 0, 0, 520, 270, "" );

    obj = fl_add_labelframe( FL_ENGRAVED_FRAME, 10, 20, 500, 240, "XYPlot Attributes" );
    fl_set_object_lsize( obj, FL_NORMAL_SIZE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->xgrid = obj = fl_add_choice( FL_NORMAL_CHOICE2, 70, 60, 85, 23, "XGrid" );
    fl_set_object_callback( obj, grid_change_cb, 0 );

    fdui->ygrid = obj = fl_add_choice( FL_NORMAL_CHOICE2, 70, 90, 85, 23, "YGrid" );
    fl_set_object_callback( obj, grid_change_cb, 0 );

    fdui->xscale = obj = fl_add_choice( FL_NORMAL_CHOICE2, 70, 170, 85, 23, "XScale" );
    fl_set_object_callback( obj, xscale_change_cb, 0 );

    fdui->yscale = obj = fl_add_choice( FL_NORMAL_CHOICE2, 70, 210, 85, 23, "YScale" );
    fl_set_object_callback( obj, yscale_change_cb, 0 );

    fdui->ymajor = obj = fl_add_counter( FL_NORMAL_COUNTER, 370, 160, 115, 20, "YMajor" );
    fl_set_object_callback( obj, ymajorminor_change_cb, 0 );
    fl_set_counter_precision( obj, 0 );
    fl_set_counter_bounds( obj, -1, 20 );
    fl_set_counter_value( obj, 1 );
    fl_set_counter_step( obj, 1, 2 );

    fdui->yminor = obj = fl_add_counter( FL_NORMAL_COUNTER, 370, 200, 115, 20, "YMinor" );
    fl_set_object_callback( obj, ymajorminor_change_cb, 0 );
    fl_set_counter_precision( obj, 0 );
    fl_set_counter_bounds( obj, 0, 10 );
    fl_set_counter_value( obj, 1 );
    fl_set_counter_step( obj, 1, 2 );

    fdui->xmajor = obj = fl_add_counter( FL_NORMAL_COUNTER, 370, 70, 115, 20, "XMajor" );
    fl_set_object_callback( obj, xmajorminor_change_cb, 0 );
    fl_set_counter_precision( obj, 0 );
    fl_set_counter_bounds( obj, -1, 20 );
    fl_set_counter_value( obj, 1 );
    fl_set_counter_step( obj, 1, 2 );

    fdui->xminor = obj = fl_add_counter( FL_NORMAL_COUNTER, 370, 110, 115, 20, "XMinor" );
    fl_set_object_callback( obj, xmajorminor_change_cb, 0 );
    fl_set_counter_precision( obj, 0 );
    fl_set_counter_bounds( obj, 0, 10 );
    fl_set_counter_value( obj, 1 );
    fl_set_counter_step( obj, 1, 2 );

    fdui->xbase = obj = fl_add_input( FL_FLOAT_INPUT, 160, 170, 39, 23, "xbase" );
    fl_set_object_lalign( obj, FL_ALIGN_RIGHT );
    fl_set_object_callback( obj, xscale_change_cb, 0 );

    fdui->ybase = obj = fl_add_input( FL_FLOAT_INPUT, 158, 210, 39, 23, "ybase" );
    fl_set_object_lalign( obj, FL_ALIGN_RIGHT );
    fl_set_object_callback( obj, yscale_change_cb, 0 );

    fdui->how_return = obj = fl_add_menu( FL_PULLDOWN_MENU, 193, 29, 150, 22, "Return Setting" );
    fl_set_object_boxtype( obj, FL_UP_BOX );
    fl_set_object_callback( obj, xyplot_returnsetting_change, 0 );

    fdui->gridstyle = obj = fl_add_choice( FL_NORMAL_CHOICE2, 70, 120, 85, 23, "Style" );
    fl_set_object_callback( obj, gridstyle_change_cb, 0 );

    fdui->mark_active = obj = fl_add_checkbutton( FL_PUSH_BUTTON, 230, 80, 100, 25, "MarkActive" );
    fl_set_object_callback( obj, markactive_change_cb, 0 );

    fl_end_form( );

    fdui->xyplotattrib->fdui = fdui;
    fl_set_border_width( old_bw );

    return fdui;
}
FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) {

    FL_OBJECT *obj;
    FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui );
    
    // Define form
    fdui->lte_phy_scope_enb = fl_bgn_form( FL_NO_BOX, 800, 600 );

    // This the whole UI box
    obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 600, "" );
    fl_set_object_color( obj, FL_BLACK, FL_BLACK );

    // Received signal
    fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
    fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
    fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
    fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);

    // Time-domain channel response
    fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
    fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
    fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color

    // Frequency-domain channel response
    fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency  Response (RE, dB)" );
    fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
    fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
    fl_set_xyplot_ybounds( fdui->chest_f,30,70);

    // LLR of PUSCH
    fdui->pusch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)" );
    fl_set_object_boxtype( fdui->pusch_llr, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->pusch_llr, FL_BLACK, FL_YELLOW );
    fl_set_object_lcolor( fdui->pusch_llr, FL_WHITE ); // Label color
    fl_set_xyplot_symbolsize( fdui->pusch_llr,2);    

    // I/Q PUSCH comp
    fdui->pusch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 200, "PUSCH I/Q of MF Output" );
    fl_set_object_boxtype( fdui->pusch_comp, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->pusch_comp, FL_BLACK, FL_YELLOW );
    fl_set_object_lcolor( fdui->pusch_comp, FL_WHITE ); // Label color
    fl_set_xyplot_symbolsize( fdui->pusch_comp,2);
    fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
    
    // Throughput on PUSCH
    fdui->pusch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 480, 500, 100, "PUSCH Throughput [frame]/[kbit/s]" );
    fl_set_object_boxtype( fdui->pusch_tput, FL_EMBOSSED_BOX );
    fl_set_object_color( fdui->pusch_tput, FL_BLACK, FL_WHITE );
    fl_set_object_lcolor( fdui->pusch_tput, FL_WHITE ); // Label color

    // Generic eNB Button
    fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 480, 240, 40, "" );
    fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
    fl_set_button(fdui->button_0,0);
    otg_enabled = 0;
    fl_set_object_label(fdui->button_0, "DL Traffic OFF");
    fl_set_object_color(fdui->button_0, FL_RED, FL_RED);  
    fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );

    fl_end_form( );
    fdui->lte_phy_scope_enb->fdui = fdui;

    return fdui;
}
Example #9
0
FD_main_frm *
create_form_main_frm( void )
{
    FL_OBJECT *obj;
    FD_main_frm *fdui = fl_malloc( sizeof *fdui );

    fdui->vdata = fdui->cdata = NULL;
    fdui->ldata = 0;

    fdui->main_frm = fl_bgn_form( FL_NO_BOX, 1010, 710 );

    obj = fl_add_box( FL_FLAT_BOX, 0, 0, 1010, 710, "Main form" );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_MCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    obj = fl_add_box( FL_ROUNDED_BOX, 10, 610, 230, 90, "" );
    fl_set_object_color( obj, FL_DARKER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    obj = fl_add_box( FL_ROUNDED3D_DOWNBOX, 5, 5, 850, 600, "" );
    fl_set_object_color( obj, FL_BLACK, FL_BLACK );

    fdui->sync_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 635, 15, 40, 20, "sync" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->rec_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 720, 15, 40, 20, "rec" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->pwr1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 45, 300, 110, "Power" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->pwr2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 330, 45, 300, 110, "Power" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->rx2_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 345, 10, 80, 40, "RX 2" );
    fl_set_object_color( obj, FL_BLACK, FL_MCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_HUGE_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->noise1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 170, 300, 110, "N0/SNR" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->noise2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 330, 170, 300, 110, "N0/SNR" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch11_sec0_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 10, 325, 140, 110, "CH 11" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch12_sec0_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 145, 325, 140, 110, "CH 12" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch21_sec0_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 10, 455, 140, 110, "CH 21" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch22_sec0_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 145, 455, 140, 110, "CH 22" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch11_sec1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 290, 325, 140, 110, "CH 11" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch12_sec1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 430, 325, 140, 110, "CH 12" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch21_sec1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 290, 455, 140, 110, "CH 21" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch22_sec1_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 430, 455, 140, 110, "CH 22" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->error_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 680, 15, 40, 20, "error" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->gps_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 640, 65, 60, 30, "gps" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->date_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 655, 120, 170, 30, "date: " );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->gps_lat_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 700, 65, 150, 30, "lat: 0" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->gps_lon_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 700, 95, 150, 30, "lon: 0" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->idx_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 685, 150, 110, 20, "Idx: " );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    obj = fl_add_box( FL_ROUNDED_BOX, 485, 610, 140, 90, "" );
    fl_set_object_color( obj, FL_DARKCYAN, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->power_btn = obj = fl_add_button( FL_NORMAL_BUTTON, 130, 620, 100, 70, "PWR" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_MEDIUM_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, power_callback, 0 );

    fdui->buffer_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 760, 15, 90, 20, "Buffer: 100%" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->refresh_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 655, 175, 170, 20, "Refresh interval: 1s" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    obj = fl_add_box( FL_ROUNDED_BOX, 860, 90, 140, 220, "" );
    fl_set_object_color( obj, FL_DARKER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->refresh_dial = obj = fl_add_dial( FL_NORMAL_DIAL, 890, 110, 80, 70, "screen refresh rate" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );
    fl_set_object_callback( obj, refresh_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_CHANGED );
    fl_set_dial_bounds( obj, 0, 5 );
    fl_set_dial_angles( obj, 45, 315 );
    fl_set_dial_value( obj, 1 );
    fl_set_dial_step( obj, 1 );

    obj = fl_add_box( FL_ROUNDED_BOX, 860, 528, 137, 72, "" );
    fl_set_object_color( obj, FL_INDIANRED, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->bler_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 650, 200, 180, 20, "BLER:" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->n_recd_frames_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 650, 225, 180, 20, "Rec'd frms:" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->msg_text = obj = fl_add_text( FL_NORMAL_TEXT, 25, 570, 810, 30, "" );
    fl_set_object_color( obj, FL_BLACK, FL_MCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );

    obj = fl_add_pixmapbutton( FL_NORMAL_BUTTON, 860, 5, 140, 70, "" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_WHITE, FL_YELLOW );
    fl_set_pixmapbutton_file( obj, "Eurecom_Logo.xpm" );

    fdui->rx1_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 35, 10, 80, 40, "RX 1" );
    fl_set_object_color( obj, FL_BLACK, FL_MCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_HUGE_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->alamouti_btn = obj = fl_add_button( FL_PUSH_BUTTON, 505, 655, 100, 20, "2: ALAMOUTI" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, rx_mode_button_callback, 2 );

    fdui->precoding_btn = obj = fl_add_button( FL_PUSH_BUTTON, 505, 675, 100, 20, "6: PRECODING" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, rx_mode_button_callback, 6 );

    fdui->cbmimo_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 665, 40, 70, 20, "cbmimo" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->fix_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 640, 95, 60, 30, "NO" );
    fl_set_object_boxtype( obj, FL_ROUNDED_BOX );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    obj = fl_add_box( FL_ROUNDED_BOX, 800, 610, 200, 90, "" );
    fl_set_object_color( obj, FL_INDIANRED, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->rec_btn = obj = fl_add_button( FL_NORMAL_BUTTON, 820, 620, 160, 70, "Record" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, record_callback, 0 );

    fdui->exit_btn = obj = fl_add_button( FL_NORMAL_BUTTON, 20, 660, 90, 30, "exit" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_TOMATO, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, exit_callback, 0 );

    fdui->config_btn = obj = fl_add_button( FL_NORMAL_BUTTON, 20, 620, 90, 30, "config" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, config_btn_callback, 0 );

    obj = fl_add_button( FL_NORMAL_BUTTON, 870, 180, 40, 30, "+" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, refresh_callback, 1 );

    obj = fl_add_button( FL_NORMAL_BUTTON, 950, 180, 40, 30, "-" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, refresh_callback, -1 );

    fdui->time_domain_btn = obj = fl_add_button( FL_PUSH_BUTTON, 870, 235, 60, 20, "time" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, time_freq_callback, 0 );

    fdui->freq_domain_btn = obj = fl_add_button( FL_PUSH_BUTTON, 930, 235, 60, 20, "freq" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, time_freq_callback, 1 );

    obj = fl_add_text( FL_NORMAL_TEXT, 875, 215, 110, 20, "channel display" );
    fl_set_object_color( obj, FL_DARKER_COL1, FL_MCOL );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    fdui->refresh_timer = obj = fl_add_timer( FL_HIDDEN_TIMER, 810, 720, 10, 10, "timer" );
    fl_set_object_callback( obj, refresh_timer_callback, 0 );

    obj = fl_add_text( FL_NORMAL_TEXT, 875, 260, 110, 20, "N0/SNR" );
    fl_set_object_color( obj, FL_DARKER_COL1, FL_MCOL );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    fdui->n0_btn = obj = fl_add_button( FL_PUSH_BUTTON, 870, 280, 60, 20, "N0" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, noise_snr_callback, 0 );

    fdui->snr_btn = obj = fl_add_button( FL_PUSH_BUTTON, 930, 280, 60, 20, "SNR" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, noise_snr_callback, 1 );

    fdui->rx_mode_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 650, 250, 180, 20, "RX mode:" );
    fl_set_object_color( obj, FL_BLACK, FL_TOP_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );

    fdui->siso_btn = obj = fl_add_button( FL_PUSH_BUTTON, 505, 635, 100, 20, "1: SISO" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, rx_mode_button_callback, 1 );

    obj = fl_add_text( FL_NORMAL_TEXT, 505, 615, 100, 20, "TX mode" );
    fl_set_object_boxtype( obj, FL_NO_BOX );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    fdui->ch11_sec2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 570, 325, 140, 110, "CH 11" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch12_sec2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 710, 325, 140, 110, "CH 12" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch21_sec2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 570, 455, 140, 110, "CH 21" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->ch22_sec2_xyp = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 710, 455, 140, 110, "CH 22" );
    fl_set_object_color( obj, FL_BLACK, FL_RIGHT_BCOL );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );

    fdui->sec0_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 85, 285, 140, 20, "Sector 0" );
    fl_set_object_color( obj, FL_BLACK, FL_BLACK );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_MEDIUM_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    fdui->sec1_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 380, 285, 140, 20, "Sector 1" );
    fl_set_object_color( obj, FL_BLACK, FL_BLACK );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_MEDIUM_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    fdui->sec2_lbl = obj = fl_add_text( FL_NORMAL_TEXT, 650, 285, 140, 20, "Sector 2" );
    fl_set_object_color( obj, FL_BLACK, FL_BLACK );
    fl_set_object_lcolor( obj, FL_RIGHT_BCOL );
    fl_set_object_lsize( obj, FL_MEDIUM_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    obj = fl_add_box( FL_ROUNDED_BOX, 250, 610, 130, 90, "" );
    fl_set_object_color( obj, FL_PALEGREEN, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->terminal_btn1 = obj = fl_add_button( FL_PUSH_BUTTON, 265, 650, 40, 40, "eNb" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, terminal_button_callback, 1 );

    fdui->terminal_btn3 = obj = fl_add_button( FL_PUSH_BUTTON, 320, 650, 40, 40, "UE" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, terminal_button_callback, 3 );

    obj = fl_add_text( FL_NORMAL_TEXT, 260, 620, 110, 20, "terminal type" );
    fl_set_object_color( obj, FL_PALEGREEN, FL_MCOL );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

    obj = fl_add_box( FL_ROUNDED_BOX, 630, 610, 160, 90, "" );
    fl_set_object_color( obj, FL_WHEAT, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    obj = fl_add_button( FL_NORMAL_BUTTON, 645, 660, 90, 30, "Checkpoint" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_callback( obj, checkpoint_callback, 0 );

    obj = fl_add_button( FL_NORMAL_BUTTON, 740, 620, 40, 30, "+" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, checkpoint_callback, 1 );

    obj = fl_add_button( FL_NORMAL_BUTTON, 740, 660, 40, 30, "-" );
    fl_set_object_boxtype( obj, FL_ROUNDED3D_UPBOX );
    fl_set_object_color( obj, FL_LIGHTER_COL1, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_CENTER );
    fl_set_object_lstyle( obj, FL_BOLD_STYLE );
    fl_set_object_callback( obj, checkpoint_callback, -1 );

    fdui->next_cp = obj = fl_add_text( FL_NORMAL_TEXT, 650, 625, 90, 20, "Next CP: 1" );
    fl_set_object_color( obj, FL_WHEAT, FL_MCOL );

    obj = fl_add_box( FL_ROUNDED_BOX, 860, 320, 142, 199, "" );
    fl_set_object_color( obj, FL_PALEGREEN, FL_COL1 );

    fdui->rf_gain_txt = obj = fl_add_input( FL_NORMAL_INPUT, 925, 340, 60, 20, "RF gain" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_callback( obj, input_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fdui->digital_gain_txt = obj = fl_add_input( FL_NORMAL_INPUT, 925, 374, 60, 20, "digital gain" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_callback( obj, input_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fdui->rf_mode_txt = obj = fl_add_input( FL_NORMAL_INPUT, 925, 409, 60, 20, "RF mode" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_callback( obj, input_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    obj = fl_add_box( FL_ROUNDED_BOX, 390, 610, 90, 90, "" );
    fl_set_object_color( obj, FL_DARKCYAN, FL_COL1 );
    fl_set_object_lalign( obj, FL_ALIGN_LEFT | FL_ALIGN_INSIDE );

    fdui->la_btn = obj = fl_add_lightbutton( FL_PUSH_BUTTON, 405, 645, 60, 40, "LA" );
    fl_set_object_callback( obj, link_adpt_callback, 0 );
    fl_set_button( obj, 1 );

    obj = fl_add_text( FL_NORMAL_TEXT, 400, 620, 70, 20, "link adpt." );
    fl_set_object_color( obj, FL_DARKCYAN, FL_MCOL );

    fdui->label_input = obj = fl_add_input( FL_NORMAL_INPUT, 880, 569, 100, 20, "" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_lalign( obj, FL_ALIGN_TOP );
    fl_set_object_callback( obj, label_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fdui->label_button = obj = fl_add_checkbutton( FL_PUSH_BUTTON, 877, 539, 60, 30, "manual label" );
    fl_set_object_callback( obj, label_btn_callback, 0 );

    fdui->freq_txt = obj = fl_add_input( FL_NORMAL_INPUT, 925, 444, 60, 20, "frequency" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_callback( obj, input_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fdui->tcxo_txt = obj = fl_add_input( FL_NORMAL_INPUT, 925, 479, 60, 20, "TCXO" );
    fl_set_object_lsize( obj, FL_TINY_SIZE );
    fl_set_object_callback( obj, input_callback, 0 );
    fl_set_object_return( obj, FL_RETURN_END_CHANGED );

    fl_end_form( );

    fdui->main_frm->fdui = fdui;

    return fdui;
}