static void middle_drag(int dx) { scope_disp_t *disp = &(ctrl_usr->disp); scope_horiz_t *horiz = &(ctrl_usr->horiz); double dt = (dx / disp->pixels_per_sample) / ctrl_shm->rec_len; set_horiz_pos(horiz->pos_setting + 5 * dt); refresh_display(); }
static void change_zoom(int dir, int x) { scope_horiz_t *horiz = &(ctrl_usr->horiz); scope_disp_t *disp = &(ctrl_usr->disp); double old_pixels_per_sample, pixels_per_div, pixels_per_sec, new_pixels_per_sample, old_fraction, new_fraction; old_pixels_per_sample = disp->pixels_per_sample; set_horiz_zoom(horiz->zoom_setting + dir); /* calculate horizontal params that depend on width */ pixels_per_div = disp->width * 0.1; pixels_per_sec = pixels_per_div / horiz->disp_scale; disp->pixels_per_sample = new_pixels_per_sample = pixels_per_sec * horiz->sample_period; // how many samples away from the center of the window is this // pixel? old_fraction = (x - disp->width / 2) / old_pixels_per_sample / ctrl_shm->rec_len; // and new? new_fraction = (x - disp->width / 2) / new_pixels_per_sample / ctrl_shm->rec_len; // displace by the difference set_horiz_pos( horiz->pos_setting - new_fraction + old_fraction ); }
static char *hpos_cmd(void * arg) { double *argp; int rv; argp = (double *)(arg); rv = set_horiz_pos(*argp); if ( rv < 0 ) { return "could not set horizontal position"; } return NULL; }