📄 update_ranges.c
字号:
/* * Copyright (C) 2000-2004 Damien Douxchamps <ddouxchamps@users.sf.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include "coriander.h"extern char* feature_menu_table_list[NUM_FEATURES]; extern char* feature_menu_items_list[NUM_FEATURES];voidUpdateRange(int feature){ int index; char *stemp; dc1394bool_t range_is_active, abs_is_on; stemp=(char*)malloc(STRING_SIZE*sizeof(char)); // select the current menuitem: if ((!camera->feature_set.feature[feature-FEATURE_MIN].is_on)&& // off (camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable)) { index=0; } else { if ((!camera->feature_set.feature[feature-FEATURE_MIN].auto_active)&& // man (camera->feature_set.feature[feature-FEATURE_MIN].manual_capable)&& (!(camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable&& // abs control not on camera->feature_set.feature[feature-FEATURE_MIN].abs_control))){ index=1*(camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable>0); } else { if ((camera->feature_set.feature[feature-FEATURE_MIN].auto_active)&& // auto (camera->feature_set.feature[feature-FEATURE_MIN].auto_capable)&& (!(camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable&& // abs control not on camera->feature_set.feature[feature-FEATURE_MIN].abs_control))){ index=1*(camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable)+ 1*(camera->feature_set.feature[feature-FEATURE_MIN].manual_capable); } else { if (!(camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable&& // abs control not on camera->feature_set.feature[feature-FEATURE_MIN].abs_control)) // single index=1*(camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable)+ 1*(camera->feature_set.feature[feature-FEATURE_MIN].manual_capable)+ 1*(camera->feature_set.feature[feature-FEATURE_MIN].auto_capable); else { index=1*(camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable)+ // absolute 1*(camera->feature_set.feature[feature-FEATURE_MIN].manual_capable)+ 1*(camera->feature_set.feature[feature-FEATURE_MIN].auto_capable)+ 1*(camera->feature_set.feature[feature-FEATURE_MIN].one_push); } } } } // sets the active menu item: sprintf(stemp,"feature_%d_menu",feature); gtk_option_menu_set_history (GTK_OPTION_MENU (lookup_widget(main_window,stemp)), index); range_is_active=((!(camera->feature_set.feature[feature-FEATURE_MIN].auto_capable&& // auto not on camera->feature_set.feature[feature-FEATURE_MIN].auto_active))&& (!(camera->feature_set.feature[feature-FEATURE_MIN].one_push&& // one-push auto not active camera->feature_set.feature[feature-FEATURE_MIN].one_push_active))&& (!(camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable&& // abs control not on camera->feature_set.feature[feature-FEATURE_MIN].abs_control))&& (!(camera->feature_set.feature[feature-FEATURE_MIN].on_off_capable&& // feature is on !camera->feature_set.feature[feature-FEATURE_MIN].is_on))); switch(feature) { case FEATURE_WHITE_BALANCE: sprintf(stemp,"feature_%d_bu_scale",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), range_is_active); sprintf(stemp,"feature_%d_rv_scale",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), range_is_active); break; case FEATURE_TEMPERATURE: // the only changeable range is the target one, the other is just an indicator. sprintf(stemp,"feature_%d_target_scale",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), range_is_active); sprintf(stemp,"feature_%d_current_scale",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp),FALSE);break; default: sprintf(stemp,"feature_%d_scale",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), range_is_active); break; } // all features: set absolute range sensitivity: abs_is_on=((camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable&& // abs control is on camera->feature_set.feature[feature-FEATURE_MIN].abs_control) && camera->feature_set.feature[feature-FEATURE_MIN].is_on); if (camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable) { sprintf(stemp,"feature_%d_abs_entry",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), abs_is_on); sprintf(stemp,"feature_%d_abs_label",feature); gtk_widget_set_sensitive(lookup_widget(main_window, stemp), abs_is_on); } // grab&set range value if readable: UpdateRangeValue(main_window,feature); free(stemp);}voidUpdateRangeValue(GtkWidget* widget, int feature){ // NOTE: range values are the only value the camera changes by itself. Contrary to other items // (like auto/man or power), this item can thus change without the user's action. It is // therefor mendatory to read the CAMERA value and not the value present in "feature_set". // Moreover, we must WRITE the value read in the "feature_set" 'value' field. int err, value, valueBU, valueRV, valuegoal, valuecurrent; int stable, prec_value, prec_valuegoal, prec_valueBU, prec_valuecurrent, prec_valueRV; char *stemp; GtkAdjustment* adj; stemp=(char*)malloc(STRING_SIZE*sizeof(char)); stable=0; err=0; prec_value=-1e7;// out of range data prec_valuegoal=-1e7; prec_valuecurrent=-1e7; prec_valueBU=-1e7; prec_valueRV=-1e7; // grab&set range value if readable: if (camera->feature_set.feature[feature-FEATURE_MIN].readout_capable) { switch(feature) { case FEATURE_WHITE_BALANCE: // while(!stable) { err=dc1394_get_white_balance(camera->camera_info.handle,camera->camera_info.id,&valueBU,&valueRV); /* if (((valueBU==prec_valueBU)&&(valueRV==prec_valueRV))||(err<0)) stable=1; else { prec_valueBU=valueBU; prec_valueRV=valueRV; usleep(DELAY);// wait 1/20 sec //fprintf(stderr,"values: %d %d\n",valueBU,valueRV); } }*/ if (err<0) MainError("Could not get white balance value"); else { sprintf(stemp,"feature_%d_bu_scale",feature); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(widget, stemp))); adj->value=valueBU; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); sprintf(stemp,"feature_%d_rv_scale",feature); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(widget, stemp))); adj->value=valueRV; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); //fprintf(stderr,"white balance updated\n"); } break; case FEATURE_TEMPERATURE: //while(!stable) { err=dc1394_get_temperature(camera->camera_info.handle,camera->camera_info.id,&valuegoal,&valuecurrent); /*if (((valuegoal==prec_valuegoal)&&(valuecurrent==prec_valuecurrent))||(err<0)) stable=1; else { prec_valuegoal=valuegoal; prec_valuecurrent=valuecurrent; usleep(DELAY);// wait 1/20 sec } }*/ if (err<0) MainError("Could not get temperature value"); else { sprintf(stemp,"feature_%d_target_scale",feature); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(widget,stemp))); adj->value=valuegoal; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); sprintf(stemp,"feature_%d_current_scale",feature); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(widget, stemp))); adj->value=valuecurrent; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); } break; default: //while(!stable) { err=dc1394_get_feature_value(camera->camera_info.handle,camera->camera_info.id,feature,&value); /*if ((value==prec_value)||(err<0)) stable=1; else { prec_value=value; usleep(DELAY);// wait 1/20 sec } }*/ if (err<0) MainError("Could not get feature value"); else { sprintf(stemp,"feature_%d_scale",feature); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(widget, stemp))); adj->value=value; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); } break; } if (camera->feature_set.feature[feature-FEATURE_MIN].absolute_capable) { GetAbsValue(feature); } } free(stemp);}voidUpdateFormat7BppRange(void){ GtkAdjustment* adj; Format7ModeInfo_t *info; info=&camera->format7_info.mode[camera->format7_info.edit_mode-MODE_FORMAT7_MIN]; if (dc1394_query_format7_byte_per_packet(camera->camera_info.handle,camera->camera_info.id, camera->format7_info.edit_mode, &info->bpp)==DC1394_SUCCESS) { if (dc1394_query_format7_packet_para(camera->camera_info.handle,camera->camera_info.id, camera->format7_info.edit_mode, &info->min_bpp,&info->max_bpp)==DC1394_SUCCESS) { //if (info->bpp==0) // fprintf(stderr,"BPP is zero in %s at line %d\n",__FUNCTION__,__LINE__); adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(main_window, "format7_packet_size"))); adj->upper=info->max_bpp; adj->lower=info->min_bpp; adj->value=info->bpp; adj->step_increment=1; adj->page_increment=(info->max_bpp-info->min_bpp)/16; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); } else MainError("Can't get bpp info from camera"); } else MainError("Can't get bpp info from camera");}voidUpdateFormat7Ranges(void){ GtkAdjustment *adj; Format7ModeInfo_t *info; info=&camera->format7_info.mode[camera->format7_info.edit_mode-MODE_FORMAT7_MIN]; // define the adjustments for the 4 format7 controls. Note that (pos_x+size_x)<=max_size_x which yields some inter-dependencies // define adjustement for X-position adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(main_window, "format7_hposition_scale"))); adj->value=info->pos_x; adj->upper=info->max_size_x-info->size_x; adj->lower=0; adj->step_increment=info->unit_pos_x; adj->page_increment=adj->step_increment*4; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); // define adjustement for Y-position adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(main_window, "format7_vposition_scale"))); adj->value=info->pos_y; adj->upper=info->max_size_y-info->size_y; adj->lower=0; adj->step_increment=info->unit_pos_y; adj->page_increment=adj->step_increment*4; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); // define adjustement for X-size adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(main_window, "format7_hsize_scale"))); adj->value=info->size_x; adj->upper=info->max_size_x-info->pos_x; adj->lower=info->unit_size_x; adj->step_increment=info->unit_size_x; adj->page_increment=adj->step_increment*4; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed"); // define adjustement for Y-size adj=gtk_range_get_adjustment(GTK_RANGE (lookup_widget(main_window, "format7_vsize_scale"))); adj->value=info->size_y; adj->upper=info->max_size_y-info->pos_y; adj->lower=info->unit_size_y; adj->step_increment=info->unit_size_y; adj->page_increment=adj->step_increment*4; gtk_signal_emit_by_name(GTK_OBJECT (adj), "changed");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -