#ifndef HALSC_USR_H
#define HALSC_USR_H
#include "scope_shm.h"
typedef struct {
gchar *thread_name;
long thread_period_ns;
long sample_period_ns;
double sample_period;
double disp_scale;
int zoom_setting;
double pos_setting;
long x0;
GtkWidget *disp_area;
GdkGC *disp_context;
GtkWidget *state_label;
GtkWidget *record_button;
GtkWidget *record_label;
GtkWidget *zoom_slider;
GtkObject *zoom_adj;
GtkWidget *pos_slider;
GtkObject *pos_adj;
GtkWidget *scale_label;
GtkWidget *thread_list;
GtkWidget *thread_name_label;
GtkWidget *sample_rate_label;
GtkWidget *sample_period_label;
GtkObject *mult_adj;
GtkWidget *mult_spinbutton;
} scope_horiz_t;
typedef struct {
int data_source_type;
int data_source;
char *name;
hal_type_t data_type;
int data_len;
double vert_offset;
int ac_offset;
int scale_index;
int max_index;
int min_index;
double scale;
double position;
} scope_chan_t;
typedef struct {
int chan_enabled[16];
int data_offset[16];
int selected;
GtkWidget *chan_sel_buttons[16];
GtkWidget *chan_num_label;
GtkWidget *source_name_label;
GtkWidget *source_name_button;
GtkWidget *scale_slider;
GtkObject *scale_adj;
GtkWidget *scale_label;
GtkWidget *pos_slider;
GtkObject *pos_adj;
GtkWidget *offset_button;
GtkWidget *offset_label;
GtkWidget *readout_label;
GtkWidget *offset_entry;
GtkWidget *offset_ac;
GtkWidget *lists[3];
GtkWidget *windows[3];
GtkAdjustment *adjs[3];
} scope_vert_t;
typedef struct {
double position;
double level;
GtkWidget *normal_button;
GtkWidget *auto_button;
GtkWidget *force_button;
GtkWidget *source_button;
GtkWidget *source_label;
GtkWidget *edge_button;
GtkWidget *edge_label;
GtkWidget *level_slider;
GtkObject *level_adj;
GtkWidget *level_label;
GtkWidget *pos_slider;
GtkObject *pos_adj;
} scope_trig_t;
typedef struct {
int width;
int height;
double pixels_per_sample;
double horiz_offset;
int start_sample;
int end_sample;
GtkWidget *drawing;
GtkTooltips *tip;
GdkDrawable *win;
GdkColormap *map;
GdkColor color_bg;
GdkColor color_grid;
GdkColor color_normal[16];
GdkColor color_selected[16];
GdkColor color_baseline;
GdkGC *context;
int selected_part;
} scope_disp_t;
typedef enum { INTERLACED, NOT_INTERLACED } log_order_t;
typedef enum { OVERWRITE, APPEND } log_append_t;
typedef struct {
log_order_t order;
int auto_save;
char *filename, *default_filename;
log_append_t append;
GtkWidget *log_win;
GtkWidget *log_prefs_button;
GtkWidget *log_prefs_label;
} scope_log_t;
typedef enum { STOP = 0, NORMAL, SINGLE, ROLL } scope_run_mode_t;
typedef struct {
scope_data_t *buffer;
scope_data_t *disp_buf;
int samples;
int display_refresh_timer;
scope_run_mode_t run_mode;
scope_run_mode_t old_run_mode;
int pending_restart;
GtkWidget *main_win;
GtkWidget *horiz_info_win;
GtkWidget *chan_sel_win;
GtkWidget *chan_info_win;
GtkWidget *vert_info_win;
GtkWidget *waveform_win;
GtkWidget *run_mode_win;
GtkWidget *trig_info_win;
GtkWidget *trig_mode_win;
GtkWidget *rm_normal_button;
GtkWidget *rm_single_button;
GtkWidget *rm_roll_button;
GtkWidget *rm_stop_button;
scope_chan_t chan[16];
scope_horiz_t horiz;
scope_vert_t vert;
scope_trig_t trig;
scope_disp_t disp;
scope_log_t log;
} scope_usr_control_t;
extern scope_usr_control_t *ctrl_usr;
extern scope_shm_control_t *ctrl_shm;
void init_horiz(void);
void init_vert(void);
void init_trig(void);
void init_display(void);
void handle_watchdog_timeout(void);
void refresh_state_info(void);
void capture_complete(void);
void capture_cont(void);
void start_capture(void);
void request_display_refresh(int delay);
void refresh_display(void);
void refresh_trigger(void);
void invalidate_channel(int chan);
void invalidate_all_channels(void);
void channel_changed(void);
void format_signal_value(char *buf, int buflen, double value);
int read_config_file (char *filename);
void write_config_file (char *filename);
void write_horiz_config(FILE *fp);
void write_vert_config(FILE *fp);
void write_trig_config(FILE *fp);
void write_log_file (char *filename);
void write_sample(FILE *fp, char *label, scope_data_t *dptr, hal_type_t type);
int set_sample_thread(char *name);
int set_rec_len(int setting);
int set_horiz_mult(int setting);
int set_horiz_zoom(int setting);
int set_horiz_pos(double setting);
int set_active_channel(int chan_num);
int set_channel_source(int chan, int type, char *name);
int set_channel_off(int chan_num);
int set_vert_scale(int setting);
void format_scale_value(char *buf, int buflen, double value);
int set_vert_pos(double setting);
int set_vert_offset(double setting, int ac_coupled);
int set_trigger_source(int chan);
int set_trigger_level(double setting);
int set_trigger_pos(double setting);
int set_trigger_polarity(int setting);
int set_trigger_mode(int mode);
int set_run_mode(int mode);
void prepare_scope_restart(void);
void log_popup(int);
#endif