⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scope_vert.c

📁 Source code for an Numeric Cmputer
💻 C
📖 第 1 页 / 共 3 页
字号:
    }    chan = &(ctrl_usr->chan[chan_num - 1]);    /* set the new offset */     chan->vert_offset = setting;    /* update the offset display */    if (chan->data_type == HAL_BIT) {	snprintf(buf1, BUFLEN, "----");    } else {	format_signal_value(buf1, BUFLEN, chan->vert_offset);    }    snprintf(buf2, BUFLEN, "Offset\n%s", buf1);    gtk_label_set_text_if(vert->offset_label, buf2);    /* refresh other stuff */        if (chan_num == ctrl_shm->trig_chan) {	refresh_trigger();    }    request_display_refresh(1);    return 0;}void format_signal_value(char *buf, int buflen, float value){    char *units;    int decimals;    char sign, symbols[] = "pnum KMGT";    if (value < 0) {	value = -value;	sign = '-';    } else {	sign = '+';    }    if (value <= 1.0e-24) {	/* pretty damn small, call it zero */	snprintf(buf, buflen, "0.000");	return;    }    if (value <= 1.0e-12) {	/* less than pico units, use scientific notation */	snprintf(buf, buflen, "%c%10.3e", sign, value);	return;    }    if (value >= 1.0e+12) {	/* greater than tera-units, use scientific notation */	snprintf(buf, buflen, "%c%10.3e", sign, value);	return;    }    units = &(symbols[4]);    while (value < 1.0) {	value *= 1000.0;	units--;    }    while (value >= 1000.0) {	value /= 1000.0;	units++;    }    decimals = 3;    if (value >= 9.999) {	decimals--;    }    if (value >= 99.99) {	decimals--;    }    snprintf(buf, buflen, "%c%0.*f%c", sign, decimals, value, *units);}void write_vert_config(FILE *fp){    int n;    scope_vert_t *vert;    scope_chan_t *chan;    vert = &(ctrl_usr->vert);    /* first write disabled channels */    for ( n = 1 ; n <= 16 ; n++ ) {	if ( vert->chan_enabled[n-1] != 0 ) {	    // channel enabled, do it later	    continue;	}	chan = &(ctrl_usr->chan[n-1]);	if ( chan->name == NULL ) {	    // no source for this channel, skip it	    continue;	}	fprintf(fp, "CHAN %d\n", n);	write_chan_config(fp, chan);	fprintf(fp, "CHOFF\n");    }    /* next write enabled channels */    for ( n = 1 ; n <= 16 ; n++ ) {	if ( vert->chan_enabled[n-1] == 0 ) {	    // channel disabled, skip it	    continue;	}	if ( vert->selected == n ) {	    // channel selected, do it last	    continue;	}	chan = &(ctrl_usr->chan[n-1]);	if ( chan->name == NULL ) {	    // no source for this channel, skip it	    continue;	}	fprintf(fp, "CHAN %d\n", n);	write_chan_config(fp, chan);    }    /* write selected channel last */    if ((vert->selected < 1) || (vert->selected > 16)) {	return;    }    chan = &(ctrl_usr->chan[vert->selected-1]);    fprintf(fp, "CHAN %d\n", vert->selected);    write_chan_config(fp, chan);}/************************************************************************                       LOCAL FUNCTIONS                                *************************************************************************/static void init_chan_sel_window(void){    scope_vert_t *vert;    GtkWidget *button;    gint n;    gchar buf[5];    vert = &(ctrl_usr->vert);    for (n = 0; n < 16; n++) {	snprintf(buf, 4, "%d", n + 1);	/* define the button */	button = gtk_toggle_button_new_with_label(buf);	/* put it in the window */	gtk_box_pack_start(GTK_BOX(ctrl_usr->chan_sel_win), button, TRUE,	    TRUE, 0);	gtk_widget_show(button);	/* hook a callback function to it */	gtk_signal_connect(GTK_OBJECT(button), "clicked",	    GTK_SIGNAL_FUNC(chan_sel_button), (gpointer) n + 1);	/* save the button pointer */	vert->chan_sel_buttons[n] = button;    }}static void init_chan_info_window(void){    scope_vert_t *vert;    scope_log_t *log;    vert = &(ctrl_usr->vert);    vert->chan_num_label =	gtk_label_new_in_box("--", ctrl_usr->chan_info_win, FALSE, FALSE, 5);    gtk_label_size_to_fit(GTK_LABEL(vert->chan_num_label), "99");    gtk_vseparator_new_in_box(ctrl_usr->chan_info_win, 3);    /* a button to change the source */    vert->source_name_button = gtk_button_new_with_label("------");    gtk_box_pack_start(GTK_BOX(ctrl_usr->chan_info_win),	vert->source_name_button, FALSE, FALSE, 3);    vert->source_name_label = (GTK_BIN(vert->source_name_button))->child;    gtk_label_set_justify(GTK_LABEL(vert->source_name_label),	GTK_JUSTIFY_LEFT);    gtk_label_size_to_fit(GTK_LABEL(vert->source_name_label),	"--longest possible source name--");    /* activate the source selection dialog if button is clicked */    gtk_signal_connect(GTK_OBJECT(vert->source_name_button), "clicked",	GTK_SIGNAL_FUNC(change_source_button), NULL);    gtk_widget_show(vert->source_name_button);	log=&(ctrl_usr->log);	/* a button to save logs  */	//doesnt really belong here but no room otherwise    log->log_prefs_button = gtk_button_new_with_label("Logging");    gtk_box_pack_start(GTK_BOX(ctrl_usr->chan_info_win),	log->log_prefs_button, FALSE, FALSE, 3);    log->log_prefs_label = (GTK_BIN(log->log_prefs_button))->child;    gtk_label_set_justify(GTK_LABEL(log->log_prefs_label),	GTK_JUSTIFY_RIGHT);    gtk_label_size_to_fit(GTK_LABEL(log->log_prefs_label),	"Logging");    /* activate the source selection dialog if button is clicked */    gtk_signal_connect(GTK_OBJECT(log->log_prefs_button), "clicked",	GTK_SIGNAL_FUNC(log_prefs_button_clicked), NULL);    gtk_widget_show(log->log_prefs_button);	}static void init_vert_info_window(void){    scope_vert_t *vert;    GtkWidget *hbox, *vbox;    GtkWidget *button;    vert = &(ctrl_usr->vert);    /* box for the two sliders */    hbox =	gtk_hbox_new_in_box(TRUE, 0, 0, ctrl_usr->vert_info_win, TRUE, TRUE,	0);    /* box for the scale slider */    vbox = gtk_vbox_new_in_box(FALSE, 0, 0, hbox, TRUE, TRUE, 0);    gtk_label_new_in_box("Gain", vbox, FALSE, FALSE, 0);    vert->scale_adj = gtk_adjustment_new(0, -5, 5, 1, 1, 0);    vert->scale_slider = gtk_vscale_new(GTK_ADJUSTMENT(vert->scale_adj));    gtk_scale_set_digits(GTK_SCALE(vert->scale_slider), 0);    gtk_scale_set_draw_value(GTK_SCALE(vert->scale_slider), FALSE);    gtk_box_pack_start(GTK_BOX(vbox), vert->scale_slider, TRUE, TRUE, 0);    /* connect the slider to a function that re-calcs vertical scale */    gtk_signal_connect(GTK_OBJECT(vert->scale_adj), "value_changed",	GTK_SIGNAL_FUNC(scale_changed), NULL);    gtk_widget_show(vert->scale_slider);    /* box for the position slider */    vbox = gtk_vbox_new_in_box(FALSE, 0, 0, hbox, TRUE, TRUE, 0);    gtk_label_new_in_box("Pos", vbox, FALSE, FALSE, 0);    vert->pos_adj =	gtk_adjustment_new(VERT_POS_RESOLUTION / 2, 0, VERT_POS_RESOLUTION, 1,	1, 0);    vert->pos_slider = gtk_vscale_new(GTK_ADJUSTMENT(vert->pos_adj));    gtk_scale_set_digits(GTK_SCALE(vert->pos_slider), 0);    gtk_scale_set_draw_value(GTK_SCALE(vert->pos_slider), FALSE);    gtk_box_pack_start(GTK_BOX(vbox), vert->pos_slider, TRUE, TRUE, 0);    /* connect the slider to a function that re-calcs vertical pos */    gtk_signal_connect(GTK_OBJECT(vert->pos_adj), "value_changed",	GTK_SIGNAL_FUNC(pos_changed), NULL);    gtk_widget_show(vert->pos_slider);    /* Scale display */    gtk_hseparator_new_in_box(ctrl_usr->vert_info_win, 3);    gtk_label_new_in_box("Scale", ctrl_usr->vert_info_win, FALSE, FALSE, 0);    vert->scale_label =	gtk_label_new_in_box(" ---- ", ctrl_usr->vert_info_win, FALSE, FALSE,	0);    /* Offset control */    vert->offset_button = gtk_button_new_with_label("Offset\n----");    vert->offset_label = (GTK_BIN(vert->offset_button))->child;    gtk_box_pack_start(GTK_BOX(ctrl_usr->vert_info_win),	vert->offset_button, FALSE, FALSE, 0);    gtk_signal_connect(GTK_OBJECT(vert->offset_button), "clicked",	GTK_SIGNAL_FUNC(offset_button), NULL);    gtk_widget_show(vert->offset_button);    /* a button to turn off the channel */    button = gtk_button_new_with_label("Chan Off");    gtk_box_pack_start(GTK_BOX(ctrl_usr->vert_info_win), button, FALSE, FALSE,	0);    /* turn off the channel if button is clicked */    gtk_signal_connect(GTK_OBJECT(button), "clicked",	GTK_SIGNAL_FUNC(channel_off_button), NULL);    gtk_widget_show(button);}static void scale_changed(GtkAdjustment * adj, gpointer gdata){    set_vert_scale(adj->value);}static void pos_changed(GtkAdjustment * adj, gpointer gdata){    set_vert_pos(adj->value / VERT_POS_RESOLUTION);}static void offset_button(GtkWidget * widget, gpointer gdata){    scope_vert_t *vert;    scope_chan_t *chan;    int chan_num;    vert = &(ctrl_usr->vert);    chan_num = vert->selected;    if ((chan_num < 1) || (chan_num > 16)) {	return;    }    chan = &(ctrl_usr->chan[chan_num - 1]);    if (chan->data_type == HAL_BIT) {	/* no offset for bits */	return;    }    if (dialog_set_offset(chan_num)) {	if (chan_num == ctrl_shm->trig_chan) {	    refresh_trigger();	}	channel_changed();	request_display_refresh(1);    }}static gboolean dialog_set_offset(int chan_num){    scope_vert_t *vert;    scope_chan_t *chan;    dialog_generic_t dialog;    gchar *title, msg[BUFLEN], buf[BUFLEN], *cptr;    GtkWidget *label, *button;    float tmp;    vert = &(ctrl_usr->vert);    chan = &(ctrl_usr->chan[chan_num - 1]);    title = "Set Offset";    snprintf(msg, BUFLEN - 1, "Set the vertical offset\n"	"for channel %d.", chan_num);    /* create dialog window, disable resizing */    dialog.retval = 0;    dialog.window = gtk_dialog_new();    dialog.app_data = buf;    /* allow user to grow but not shrink the window */    gtk_window_set_policy(GTK_WINDOW(dialog.window), FALSE, TRUE, FALSE);    /* window should appear in center of screen */    gtk_window_set_position(GTK_WINDOW(dialog.window), GTK_WIN_POS_CENTER);    /* set title */    gtk_window_set_title(GTK_WINDOW(dialog.window), title);    /* display message */    label = gtk_label_new(msg);    gtk_misc_set_padding(GTK_MISC(label), 15, 5);    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog.window)->vbox), label, FALSE,	TRUE, 0);    /* a separator */    gtk_hseparator_new_in_box(GTK_DIALOG(dialog.window)->vbox, 0);    vert->offset_entry = gtk_entry_new();    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog.window)->vbox),	vert->offset_entry, FALSE, TRUE, 0);    snprintf(buf, BUFLEN, "%f", chan->vert_offset);    gtk_entry_set_text(GTK_ENTRY(vert->offset_entry), buf);    gtk_entry_set_max_length(GTK_ENTRY(vert->offset_entry), BUFLEN-1);    /* point at first char */    gtk_entry_set_position(GTK_ENTRY(vert->offset_entry), 0);    /* select all chars, so if the user types the original value goes away */    gtk_entry_select_region(GTK_ENTRY(vert->offset_entry), 0, strlen(buf));    /* make it active so user doesn't have to click on it */    gtk_widget_grab_focus(GTK_WIDGET(vert->offset_entry));    gtk_widget_show(vert->offset_entry);    /* capture entry data to the buffer whenever the user types */    gtk_signal_connect(GTK_OBJECT(vert->offset_entry), "changed",	GTK_SIGNAL_FUNC(offset_changed), buf);    /* set up a callback function when the window is destroyed */    gtk_signal_connect(GTK_OBJECT(dialog.window), "destroy",	GTK_SIGNAL_FUNC(dialog_generic_destroyed), &dialog);    /* make OK and Cancel buttons */    button = gtk_button_new_with_label("OK");    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog.window)->action_area),	button, TRUE, TRUE, 4);    gtk_signal_connect(GTK_OBJECT(button), "clicked",	GTK_SIGNAL_FUNC(dialog_generic_button1), &dialog);    /* hit the "OK" button if the user hits enter */    gtk_signal_connect(GTK_OBJECT(vert->offset_entry), "activate",	GTK_SIGNAL_FUNC(offset_activated), button);    button = gtk_button_new_with_label("Cancel");    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog.window)->action_area),	button, TRUE, TRUE, 4);    gtk_signal_connect(GTK_OBJECT(button), "clicked",	GTK_SIGNAL_FUNC(dialog_generic_button2), &dialog);    /* make window transient and modal */    gtk_window_set_transient_for(GTK_WINDOW(dialog.window),	GTK_WINDOW(ctrl_usr->main_win));    gtk_window_set_modal(GTK_WINDOW(dialog.window), TRUE);    gtk_widget_show_all(dialog.window);    gtk_main();    /* we get here when the user makes a selection, hits Cancel, or closes       the window */    if ((dialog.retval == 0) || (dialog.retval == 2)) {	/* user either closed dialog, or hit cancel */	return FALSE;    }    tmp = strtod(buf, &cptr);    if (cptr == buf) {	return FALSE;    }    set_vert_offset(tmp);    return TRUE;}static void offset_changed(GtkEditable * editable, gchar * buf){    const char *text;    /* user typed something, save it in the buffer */    text = gtk_entry_get_text(GTK_ENTRY(ctrl_usr->vert.offset_entry));    strncpy(buf, text, BUFLEN);}static void offset_activated(GtkEditable * editable, gchar * button){    /* user hit enter, generate a "clicked" event for the OK button */    gtk_button_clicked(GTK_BUTTON(button));}static void log_prefs_button_clicked(GtkWidget * widget, gpointer gdata){    printf("Sorry, logging is not finished yet\n");   }static void chan_sel_button(GtkWidget * widget, gpointer gdata){    int chan_num, n, count;    scope_vert_t *vert;    scope_chan_t *chan;    char *title, *msg;    vert = &(ctrl_usr->vert);    chan_num = (int) gdata;    chan = &(ctrl_usr->chan[chan_num - 1]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -