source: trunk/platform/generic/shooting.c @ 759

Revision 759, 35.9 KB checked in by fudgey, 4 years ago (diff)

Fixed continuous mode Tv bracketing during Tv override.

http://chdk.kernreaktor.org/mantis/view.php?id=249
http://chdk.setepontos.com/index.php/topic,3319.0.html

  • Property svn:eol-style set to native
Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "math.h"
6#include "stdlib.h"
7#include "conf.h"
8
9#define USE_FILE_COUNTER_FOR_EXP_COUNTING
10
11#define SS_SIZE (sizeof(shutter_speeds_table)/sizeof(shutter_speeds_table[0]))
12#define SSID_MIN (shutter_speeds_table[0].id)
13#define SSID_MAX (shutter_speeds_table[SS_SIZE-1].id)
14
15#define AS_SIZE (sizeof(aperture_sizes_table)/sizeof(aperture_sizes_table[0]))
16#define ASID_MIN (aperture_sizes_table[0].id)
17#define ASID_MAX (aperture_sizes_table[AS_SIZE-1].id)
18
19#define AV96_MIN (aperture_sizes_table[0].prop_id)
20#define AV96_MAX (aperture_sizes_table[AS_SIZE-1].prop_id)
21
22#define ISO_SIZE (sizeof(iso_table)/sizeof(iso_table[0]))
23#define ISO_MIN (iso_table[0].id)
24#define ISO_MAX (iso_table[ISO_SIZE-1].id)
25#define ISO_MIN_VALUE (iso_table[1-iso_table[0].id].prop_id)
26
27/*define PROPCASE_CONT_MODE_SHOOT_COUNT                 218*/
28static short iso_market_base=0;
29//static short iso_base=0;
30static short sv96_base=0;
31static short svm96_base=0;
32static short sv96_base_tmp=0;
33//static short override_iso=0;
34static const double sqrt2=1.4142135623731;//square root from 2
35static const double log_2=0.6931471805599;//natural logarithm of 2
36static const double k=12.5;//K is the reflected-light meter calibration constant
37static const short koef[] = {0, 1,10,100,1000};
38static const float shutter_koef[] = {0, 0.00001, 0.0001,0.001,0.01,0.1,1,10,100,1000};
39static const char * expo_shift[] = { "Off", "1/3Ev","2/3Ev", "1Ev", "1 1/3Ev", "1 2/3Ev", "2Ev", "2 1/3Ev", "2 2/3Ev", "3Ev", "3 1/3Ev", "3 2/3Ev", "4Ev"};
40const char* tv_override[]={
41#ifdef CAM_EXT_TV_RANGE
42    // add very long time exposures as approximately powers of 2, adding 15 exposures
43    "2048","1625","1290","1024","812","645","512","406","322","256","203","161","128","101","80",
44#endif
45    "64","50.8", "40.3", "32", "25.4","20","16", "12.7", "10","8", "6.3","5","4","3.2", "2.5","2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640","1/800", "1/1000", "1/1250", "1/1600","1/2000","1/2500","1/3200","1/4000", "1/5000", "1/6400", "1/8000", "1/10000", "1/12500", "1/16000", "1/20000", "1/25000", "1/32000", "1/40000", "1/50000", "1/64000","1/80000", "1/100k"};
46const int tv_override_amount = sizeof(tv_override)/sizeof(tv_override[0]);
47
48#if CAM_EXT_TV_RANGE
49const int tv_override_zero_shift = 18+15;
50#else
51const int tv_override_zero_shift = 18;
52#endif
53static const char * expo_type[] = { "+/-", "-","+"};
54
55static PHOTO_PARAM photo_param_put_off;
56
57static EXPO_BRACKETING_VALUES bracketing;
58
59//***********************
60/*
61
62static char debug_str[60];
63
64void debug_char(char * deb_str)
65{
66 short debug_str_length=strlen(debug_str);
67 if     (debug_str_length>50) strcpy(debug_str, "");
68 sprintf(debug_str+debug_str_length, "%s", deb_str);
69}
70
71void debug_init()
72{
73 strcpy(debug_str, "");
74}
75
76
77void debug_int(int deb_str)
78{
79 short debug_str_length=strlen(debug_str);
80 if     (debug_str_length>50) strcpy(debug_str, "");
81 sprintf(debug_str+debug_str_length, "%d", deb_str);
82}
83
84
85void debug(char * deb_str, int deb_int)
86{
87 short debug_str_length=strlen(debug_str);
88 if     (debug_str_length>50) strcpy(debug_str, "");
89 sprintf(debug_str+debug_str_length, "%s", deb_str);
90 sprintf(debug_str+strlen(debug_str), "%d", deb_int);
91}
92
93char * get_debug()
94{
95 return debug_str;
96}
97*/
98//***********************
99
100int shooting_get_user_tv_id()
101{
102#if CAM_HAS_USER_TV_MODES
103    short tvv;
104    long i;
105    _GetPropertyCase(PROPCASE_USER_TV, &tvv, sizeof(tvv));
106    for (i=0;i<SS_SIZE;i++){
107        if (shutter_speeds_table[i].prop_id == tvv)
108            return shutter_speeds_table[i].id;
109    }
110#endif       
111    return 0;
112}
113
114short shooting_get_is_mode()
115{
116    short ism = 0;
117    _GetPropertyCase(PROPCASE_IS_MODE, &ism, sizeof(ism));
118    return ism;
119}
120
121
122const ShutterSpeed *shooting_get_tv_line()
123{
124    short tvv;
125    long i;
126    _GetPropertyCase(PROPCASE_USER_TV, &tvv, sizeof(tvv));
127    for (i=0;i<SS_SIZE;i++){
128           if (shutter_speeds_table[i].prop_id == tvv)
129            return &shutter_speeds_table[i];
130    }
131    return 0;
132}
133
134void shooting_set_user_tv_by_id(int v)
135{
136#if CAM_HAS_USER_TV_MODES
137if ((mode_get()&MODE_MASK) != MODE_PLAY){
138    long i;
139//    if ((v<SSID_MIN) || (v>SSID_MAX))
140//      return;
141 for (i=0;i<SS_SIZE;i++){
142        if (shutter_speeds_table[i].id == v){
143            short vv = shutter_speeds_table[i].prop_id;
144            _SetPropertyCase(PROPCASE_USER_TV, &vv, sizeof(vv));
145            //_SetPropertyCase(PROPCASE_TV, &vv, sizeof(vv));
146            return;
147         }
148 }
149}
150#endif
151}
152void shooting_set_prop(int id, int v)
153{
154   short vv = v;
155   _SetPropertyCase(id, &vv, sizeof(vv));
156   return;
157}
158
159int shooting_get_prop(int id)
160{
161    short vv;
162    _GetPropertyCase(id, &vv, sizeof(vv));
163    return vv;
164}
165
166short shooting_get_canon_iso_mode()
167{
168    short isom;
169    _GetPropertyCase(PROPCASE_ISO_MODE, &isom, sizeof(isom));
170     return isom;
171}
172
173
174int shooting_get_iso_mode()
175{
176    short isov;
177    long i;
178    _GetPropertyCase(PROPCASE_ISO_MODE, &isov, sizeof(isov));
179    for (i=0;i<ISO_SIZE;i++){
180                        if (iso_table[i].prop_id == isov)
181                         return iso_table[i].id;
182    }
183    return 0;
184}
185
186void shooting_set_user_tv_by_id_rel(int v)
187{
188#if CAM_HAS_USER_TV_MODES
189if ((mode_get()&MODE_MASK) != MODE_PLAY){
190    int cv = shooting_get_user_tv_id();
191    shooting_set_user_tv_by_id(cv+v);
192}
193#endif   
194}
195
196int shooting_get_user_av_id()
197{
198#if CAM_HAS_IRIS_DIAPHRAGM
199    short avv;
200    long i;
201    _GetPropertyCase(PROPCASE_USER_AV, &avv, sizeof(avv));
202    for (i=0;i<AS_SIZE;i++){
203                        if (aperture_sizes_table[i].prop_id == avv)
204                         return aperture_sizes_table[i].id;
205    }
206#endif   
207    return 0;
208}
209
210short shooting_get_real_aperture() {
211//#if !CAM_HAS_IRIS_DIAPHRAGM
212//    return shooting_get_min_real_aperture();
213//#else
214//I hope that GetCurrentAvValue is correct for ixus70_sd1000 ixus700_sd500 now
215    return shooting_get_aperture_from_av96(_GetCurrentAvValue());
216//#endif
217}
218
219short shooting_get_aperture_from_av96(short av96) {
220        if (av96) return (short)((pow(sqrt2, ((double)av96)/96.0))*100.0);
221        else return -1;
222}
223
224short shooting_get_min_real_aperture() {
225         short av96;
226        _GetPropertyCase(PROPCASE_MIN_AV, &av96, sizeof(av96));
227        if (av96) return shooting_get_aperture_from_av96(av96);
228        else return shooting_get_real_aperture();
229}
230
231short shooting_get_iso_from_sv96(short sv96)
232{
233    return (short)(pow(2, (((double) sv96+168.0)/96.0)));
234}
235
236short shooting_get_iso_real()
237{
238    short sv;
239    _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
240    if (sv == 0) {
241     return 0;
242    }
243    return shooting_get_iso_from_sv96(sv);
244}
245
246short shooting_get_svm96()
247{
248    short  sv;
249     _GetPropertyCase(PROPCASE_SV_MARKET, &sv, sizeof(sv));
250     return sv;
251}
252
253short shooting_get_sv96()
254{
255    short  sv;
256     _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
257     return sv;
258}
259
260short shooting_get_base_sv96()
261{
262   short dsv,sv;
263   if (shooting_get_canon_iso_mode()<50) {     
264       _GetPropertyCase(PROPCASE_DELTA_SV, &dsv, sizeof(dsv));
265       _GetPropertyCase(PROPCASE_SV, &sv, sizeof(sv));
266       sv96_base=(sv-dsv);
267   }
268   return sv96_base;
269}
270
271short shooting_get_sv96_from_iso(short iso)
272{
273  if  (iso>0)
274    return (short)(log(pow(2.0,(-7.0/4.0))*(double)(iso))*96.0/(log_2));
275  return 0; 
276}
277
278short shooting_get_svm96_from_iso(short iso)
279{
280   if  (iso>0) return (short)(log((double)(iso)*32.0/100.0)*96.0/(log_2));
281   return 0;   
282
283
284short shooting_get_iso_market_from_svm96(short svm96)
285{
286        if (svm96>0 )
287                return (short)((double)pow(2, (((double)svm96)/96.0))*100.0/32.0);
288        return 0;       
289}
290
291short shooting_get_iso_market_base()
292{
293//if ((iso_market_base==0) && (shooting_get_iso_mode() <= 0)) {
294//       iso_market_base=(short)shooting_get_iso_market_from_svm96(shooting_get_svm96());
295// }
296 //return iso_market_base;
297  if (iso_market_base==0) {
298      if (ISO_MIN_VALUE==50) iso_market_base=50;
299      else iso_market_base=100;
300     }
301  return iso_market_base;       
302}
303
304short shooting_get_svm96_base()
305{
306        if (svm96_base==0) svm96_base=shooting_get_svm96_from_iso(shooting_get_iso_market_base());
307        return svm96_base;
308}
309
310short shooting_get_iso_base()
311{
312        sv96_base=shooting_get_base_sv96();
313        if (sv96_base!=0) return shooting_get_iso_from_sv96(sv96_base);
314        else return 0;
315}
316
317// AUTOISO:EXIF
318short shooting_get_iso_market()
319{
320    //double koef;
321    short iso_mode=shooting_get_canon_iso_mode();
322    if ((iso_mode < 50) || (conf.iso_override_koef && conf.iso_override_value) || (conf.iso_bracket_koef && conf.iso_bracket_value))
323     {
324      short iso_b=shooting_get_iso_base();
325      if (iso_b) return (short)((shooting_get_iso_market_base()*shooting_get_iso_real())/iso_b);
326     }
327    return iso_mode;
328}
329
330void shooting_set_sv96(short sv96, short is_now){
331  short dsv96=0, iso_mode=shooting_get_canon_iso_mode();       
332if ((mode_get()&MODE_MASK) != MODE_PLAY){
333  if (is_now)  {
334    if (iso_mode<50) dsv96 =sv96-shooting_get_base_sv96();
335    else if (sv96_base) dsv96=sv96-sv96_base;
336        else if (sv96_base_tmp) dsv96=sv96-sv96_base_tmp; 
337        else
338         {
339         sv96_base_tmp= (short)((shooting_get_svm96_base()*shooting_get_sv96())/shooting_get_svm96());   
340         dsv96=sv96-sv96_base_tmp;
341         }       
342    while ((shooting_is_flash_ready()!=1) || (focus_busy));
343    short svm96_base =shooting_get_svm96_base();
344    if (iso_mode>=50) shooting_set_iso_mode(0);
345    _SetPropertyCase(PROPCASE_SV_MARKET, &svm96_base, sizeof(svm96_base));
346    _SetPropertyCase(PROPCASE_SV, &sv96, sizeof(sv96));
347    _SetPropertyCase(PROPCASE_DELTA_SV, &dsv96, sizeof(dsv96));
348  }
349  else   photo_param_put_off.sv96=sv96;
350}
351}
352
353/*void shooting_set_iso_real_delta_from_base(int diso)
354{
355 return;
356 int iso=(int)((short)shooting_get_iso_base()+diso);
357 
358 if (iso>0) {
359    shooting_set_sv96((short)(shooting_get_sv96_from_iso(iso)));
360  }
361}*/
362
363void shooting_set_iso_real(short iso, short is_now)
364{
365if ((mode_get()&MODE_MASK) != MODE_PLAY){
366        if (iso>0) shooting_set_sv96(shooting_get_sv96_from_iso(iso), is_now);
367}
368}
369
370short shooting_get_bv96()
371{
372    short bv = 0;
373    _GetPropertyCase(PROPCASE_BV, &bv, sizeof(bv));
374    return bv;
375}
376
377short shooting_get_canon_overexposure_value()
378{
379    short bv = 0;
380    _GetPropertyCase(PROPCASE_OVEREXPOSURE, &bv, sizeof(bv));
381    return bv;
382}
383
384
385short shooting_get_flash_mode()
386{
387    short fm = 0;
388    _GetPropertyCase(PROPCASE_FLASH_MODE, &fm, sizeof(fm));
389    return fm;
390}
391
392int shooting_get_luminance()// http://en.wikipedia.org/wiki/APEX_system
393{
394    short bv = shooting_get_bv96();
395    int b=(int)(100*k*pow(2.0,((double)(bv-168)/96.0)));
396    return b;
397}
398
399/*void shooting_set_iso_market(int isom)
400{
401        if (isom>0) {
402   shooting_set_sv96(shooting_get_sv96_from_iso((int)(((double)isom*(double)shooting_get_iso_base())/(double)shooting_get_iso_market_base())));
403  }
404}*/
405
406int shooting_get_exif_subject_dist()
407{
408    int sd = 0;
409    _GetPropertyCase(PROPCASE_SUBJECT_DIST1, &sd, sizeof(sd));
410    return sd;
411}
412
413int shooting_get_lens_to_focal_plane_width()
414{
415        return (int)(lens_get_focus_pos()-lens_get_focus_pos_from_lense());
416}
417
418int shooting_get_hyperfocal_distance_()
419{
420  int av=shooting_get_real_aperture();
421  int fl=get_focal_length(lens_get_zoom_point());       
422  if ((av>0) && (fl>0)) return (fl*fl)/(10*circle_of_confusion*av);
423  else return (-1);
424}
425
426int shooting_get_hyperfocal_distance()
427{
428 int h=shooting_get_hyperfocal_distance_();
429 if ((h>0) && (conf.dof_dist_from_lens))
430   return (h-shooting_get_lens_to_focal_plane_width());
431 else return h;
432}
433
434int shooting_get_hyperfocal_distance_f(int av, int fl)
435{
436  if ((av>0) && (fl>0) && (circle_of_confusion>0)) return (fl*fl)/(10*circle_of_confusion*av);
437  else return (-1);
438}
439
440int shooting_get_canon_subject_distance()
441{
442        if (conf.dof_use_exif_subj_dist) return shooting_get_exif_subject_dist();
443        else return lens_get_focus_pos();
444}
445
446int shooting_get_subject_distance_()
447{
448   if (!conf.dof_subj_dist_as_near_limit) return shooting_get_canon_subject_distance();
449   else {
450        int h, v, m;
451                int fl=get_focal_length(lens_get_zoom_point());
452        int near=shooting_get_canon_subject_distance();
453        int v1=(fl*fl);
454        int av_min=shooting_get_min_real_aperture();
455        int c_of_c=circle_of_confusion*10;
456        if ((av_min!=0) && (c_of_c!=0) && (v1)) {
457                    h=v1/(c_of_c*av_min);
458            if ((near>0) && (near<MAX_DIST)) {
459                  v=(h-near);
460                  m=h*near;
461                  if ((v>0) && (m>0)) return m/v; 
462             }
463        }
464        return (-1);
465    }
466}
467
468int shooting_get_subject_distance()
469{
470 int h=shooting_get_subject_distance_();
471 if ((h>0) && (conf.dof_dist_from_lens))
472   return (h-shooting_get_lens_to_focal_plane_width());
473 else return h;
474}
475
476int shooting_get_near_limit_of_acceptable_sharpness_()
477{
478        int s=shooting_get_canon_subject_distance();   
479        if (conf.dof_subj_dist_as_near_limit) return s;
480    else {
481      int h = shooting_get_hyperfocal_distance_();     
482      int m = h*s;
483      int v = h+s;
484      if ((m>0) && (v>0)) return (m/v);
485      else return (-1);
486    }
487}
488
489int shooting_get_near_limit_of_acceptable_sharpness()
490{
491 int h=shooting_get_near_limit_of_acceptable_sharpness_();
492 if ((h>0) && (conf.dof_dist_from_lens))
493   return (h-shooting_get_lens_to_focal_plane_width());
494 else return h;
495}
496
497int shooting_get_near_limit_f(int s, int a, int fl)
498{
499      int h = shooting_get_hyperfocal_distance_f(a, fl);       
500      int m = h*s;
501      int v = h+s;
502      if ((m>0) && (v>0)) return (m/v);
503      else return (-1);
504}
505
506int shooting_get_far_limit_of_acceptable_sharpness_()
507{
508        int s=shooting_get_subject_distance_(), h=shooting_get_hyperfocal_distance_(); 
509    int v = h-s;
510    int m = h*s;
511    if ((m>0) && (v>0)) return (m/v);
512    else return (-1);
513}
514
515int shooting_get_far_limit_of_acceptable_sharpness()
516{
517 int h=shooting_get_far_limit_of_acceptable_sharpness_();
518 if ((h>0) && (conf.dof_dist_from_lens))
519   return (h-shooting_get_lens_to_focal_plane_width());
520 else return h;
521}
522
523int shooting_get_depth_of_field()
524{
525  int far=shooting_get_far_limit_of_acceptable_sharpness_(), near=shooting_get_near_limit_of_acceptable_sharpness_();
526  if ((far>0) && (near>0)) return far-near;
527  else return (-1);
528}
529
530short shooting_get_tv96_from_shutter_speed(float t)
531{
532  if (t>0) return (short) (96.0*log(1.0/t)/log_2); 
533  else return (-10000);
534}
535
536float shooting_get_shutter_speed_from_tv96(short tv)
537{
538  return  pow(2,(float)((-1)*tv)/96.0 ); 
539}
540
541short shooting_get_tv96()
542{
543    short tv96;
544    _GetPropertyCase(PROPCASE_TV, &tv96, sizeof(tv96));
545    return tv96;
546}
547
548short shooting_get_user_tv96()
549{
550#if CAM_HAS_USER_TV_MODES
551    short tv;
552    _GetPropertyCase(PROPCASE_USER_TV, &tv, sizeof(tv));
553    return tv;
554#else       
555    return 0;
556#endif   
557}
558
559void shooting_set_user_tv96(short v)
560{
561#if CAM_HAS_USER_TV_MODES
562if ((mode_get()&MODE_MASK) != MODE_PLAY){
563long i;
564//    if ((v<SSID_MIN) || (v>SSID_MAX))
565//      return;
566 for (i=0;i<SS_SIZE;i++){
567        if (shutter_speeds_table[i].prop_id == v){
568                _SetPropertyCase(PROPCASE_USER_TV, &v, sizeof(v));
569                //_SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
570            return;
571          }
572  }
573}
574#endif 
575}
576
577void shooting_set_tv96(short v, short is_now)
578{
579 long i;
580//    if ((v<SSID_MIN) || (v>SSID_MAX))
581//      return;
582if ((mode_get()&MODE_MASK) != MODE_PLAY){
583 for (i=0;i<SS_SIZE;i++){
584        if (shutter_speeds_table[i].prop_id == v){
585       shooting_set_tv96_direct(v, is_now);
586       return;
587     }
588  }
589}
590}
591
592void shooting_set_tv96_direct(short v, short is_now)
593{
594if ((mode_get()&MODE_MASK) != MODE_PLAY){
595        if(is_now) {
596           _SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
597        }
598        else photo_param_put_off.tv96=v;
599}
600}
601
602
603void shooting_set_shutter_speed(float t, short is_now)
604{
605        if (t>0) shooting_set_tv96_direct((short) 96.0*log(1/t)/log_2, is_now); 
606}
607
608void shooting_set_shutter_speed_ubasic(int t, short is_now)
609{
610if ((mode_get()&MODE_MASK) != MODE_PLAY){
611        if (t>0) shooting_set_tv96_direct((short) (96.0*log(100000.0/(double)t)/log_2), is_now); 
612}
613}
614
615short shooting_get_av96()
616{
617    short av;
618    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
619    return av;
620}
621
622short shooting_get_aperture_sizes_table_size()
623{
624    return AS_SIZE;
625}
626
627
628short shooting_get_aperture_sizes_table_prop_id(short i)
629{
630    return aperture_sizes_table[i].prop_id;
631}
632
633short shooting_get_max_aperture_sizes_table_prop_id()
634{
635    return AV96_MAX;
636}
637
638
639
640short shooting_get_av_prop_id()
641{
642    short av;
643    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
644    return av;
645}
646
647
648
649short shooting_get_user_av96()
650{
651#if CAM_HAS_IRIS_DIAPHRAGM
652    short av;
653    _GetPropertyCase(PROPCASE_USER_AV, &av, sizeof(av));
654    return av;
655#else     
656    return 0;
657#endif
658}
659
660
661void shooting_set_av96(short v, short is_now)
662{
663#if CAM_HAS_IRIS_DIAPHRAGM     
664if ((mode_get()&MODE_MASK) != MODE_PLAY){
665 long i;
666//    if ((v<ASID_MIN) || (v>ASID_MAX))
667//      return;
668 for (i=0;i<AS_SIZE;i++){
669        if (aperture_sizes_table[i].prop_id == v){
670           shooting_set_av96_direct(v, is_now);
671           return;
672        }
673  }
674}
675#endif 
676}
677
678void shooting_set_nd_filter_state(short v, short is_now)
679{
680#if CAM_HAS_ND_FILTER
681if ((mode_get()&MODE_MASK) != MODE_PLAY){
682        if (is_now) {
683         if (v==1) _PutInNdFilter();
684         else if (v==2) _PutOutNdFilter();
685        }
686        else photo_param_put_off.nd_filter=v;
687}
688#endif 
689}
690
691
692
693void shooting_set_av96_direct(short v, short is_now)
694
695#if CAM_HAS_IRIS_DIAPHRAGM
696if ((mode_get()&MODE_MASK) != MODE_PLAY){
697 if(is_now) {
698   _SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
699 }
700 else photo_param_put_off.av96=v;
701}
702#endif
703}
704
705
706void shooting_set_user_av96(short v)
707{
708#if CAM_HAS_IRIS_DIAPHRAGM
709    long i;
710if ((mode_get()&MODE_MASK) != MODE_PLAY){
711//    if ((v<ASID_MIN) || (v>ASID_MAX))
712//      return;
713
714 for (i=0;i<AS_SIZE;i++){
715        if (aperture_sizes_table[i].prop_id == v){
716                  _SetPropertyCase(PROPCASE_USER_AV, &v, sizeof(v));
717                  //_SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
718            return;
719        }
720 }
721}
722#endif             
723}
724
725short shooting_get_drive_mode()
726{
727    short m;
728    _GetPropertyCase(PROPCASE_DRIVE_MODE, &m, sizeof(m));
729    return m;
730}
731
732short shooting_can_focus()
733{
734#if !CAM_CAN_SD_OVER_NOT_IN_MF && CAM_CAN_SD_OVERRIDE
735 int m=mode_get()&MODE_SHOOTING_MASK;
736 int mode_video=((m==MODE_VIDEO_STD) ||
737                            (m==MODE_VIDEO_SPEED) || 
738                            (m==MODE_VIDEO_COMPACT) ||
739                            (m==MODE_VIDEO_MY_COLORS) ||
740                            (m==MODE_VIDEO_TIME_LAPSE) ||
741                            (m==MODE_VIDEO_COLOR_ACCENT));
742  return (shooting_get_focus_mode() || mode_video);
743#elif !CAM_CAN_SD_OVERRIDE
744 int m=mode_get()&MODE_SHOOTING_MASK;
745 int mode_video=((m==MODE_VIDEO_STD) ||
746                            (m==MODE_VIDEO_SPEED) || 
747                            (m==MODE_VIDEO_COMPACT) ||
748                            (m==MODE_VIDEO_MY_COLORS) ||
749                (m==MODE_VIDEO_TIME_LAPSE) ||
750                            (m==MODE_VIDEO_COLOR_ACCENT));
751  return mode_video;
752#elif defined (CAMERA_ixus800_sd700)                                               
753 int m=mode_get()&MODE_SHOOTING_MASK;
754  return (shooting_get_zoom()<8) && (m!=MODE_AUTO) && (m!=MODE_SCN_WATER);
755#else
756  return 1; 
757#endif                   
758}
759
760short shooting_get_common_focus_mode()
761{
762#if !CAM_HAS_MANUAL_FOCUS && CAM_CAN_SD_OVERRIDE
763  return shooting_get_subject_distance_override_koef();
764#elif !CAM_CAN_SD_OVERRIDE
765  return 0;
766#else
767  return shooting_get_focus_mode();
768#endif                   
769}
770
771short shooting_get_focus_mode()
772{
773  short m;
774  _GetPropertyCase(PROPCASE_FOCUS_MODE, &m, sizeof(m));
775  return m;
776}
777
778
779/*
780short shooting_get_continuous_mode_shoot_count()
781{
782    short c;
783    _GetPropertyCase(PROPCASE_CONT_MODE_SHOOT_COUNT, &c, sizeof(c));
784    return c;
785}
786*/
787
788
789void shooting_set_user_av_by_id(int v)
790{
791#if CAM_HAS_IRIS_DIAPHRAGM
792long i;
793if ((mode_get()&MODE_MASK) != MODE_PLAY){
794//    if ((v<ASID_MIN) || (v>ASID_MAX))
795//      return;
796  for (i=0;i<AS_SIZE;i++){
797                if (aperture_sizes_table[i].id == v){
798            short vv = aperture_sizes_table[i].prop_id;
799            _SetPropertyCase(PROPCASE_USER_AV, &vv, sizeof(vv));
800            //_SetPropertyCase(PROPCASE_AV, &vv, sizeof(vv));
801            return;
802                }
803  }
804}
805#endif       
806}
807
808void shooting_set_user_av_by_id_rel(int v)
809{
810#if CAM_HAS_IRIS_DIAPHRAGM
811if ((mode_get()&MODE_MASK) != MODE_PLAY){
812    int cv = shooting_get_user_av_id();
813    shooting_set_user_av_by_id(cv+v);
814}
815#endif   
816}
817
818
819int shooting_get_day_seconds()
820{
821    unsigned long t;
822    struct tm *ttm;
823    t = time(NULL);
824    ttm = localtime(&t);
825    return ttm->tm_hour * 3600 + ttm->tm_min * 60 + ttm->tm_sec;
826}
827
828int shooting_get_tick_count()
829{
830    return (int)get_tick_count();
831}
832
833void shooting_set_iso_mode(int v)
834{
835 long i;
836 for (i=0;i<ISO_SIZE;i++){
837        if (iso_table[i].id == v){
838            short vv = iso_table[i].prop_id;
839            _SetPropertyCase(PROPCASE_ISO_MODE, &vv, sizeof(vv));
840            return;
841        }
842  }
843}
844
845int shooting_in_progress()
846{
847    int t = 0;
848    _GetPropertyCase(PROPCASE_SHOOTING, &t, sizeof(&t));
849    return t != 0;
850}
851
852int shooting_is_flash()
853{
854 int t = 0;     
855 _GetPropertyCase(PROPCASE_IS_FLASH_READY, &t,sizeof(&t));
856 return t;
857}
858
859int shooting_is_flash_ready()
860{
861   int t = 0;
862/* well, I'm not sure what's exactly is happening here
863 * but it works for a610-100e
864 */
865   // _GetPropertyCase(204, &t, 4);
866   // if (t == 3){
867   _GetPropertyCase(PROPCASE_FLASH_MODE, &t, sizeof(&t));
868   if ((t != 2) && (shooting_in_progress()))
869     if (shooting_is_flash()) return _IsStrobeChargeCompleted();
870   return 1;
871}
872
873long get_file_counter()
874{
875#ifndef PARAM_FILE_COUNTER
876#       error Please define PARAM_FILE_COUNTER in platform`s shooting.c!
877#endif
878    long v = 0;
879    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
880    return v;
881}
882
883long get_exposure_counter()
884{
885#if defined(USE_FILE_COUNTER_FOR_EXP_COUNTING) || !defined(PARAM_EXPOSURE_COUNTER)
886    long v = 0;
887    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
888    v = ((v>>4)&0x3FFF);
889    return v;
890#else
891    long v = 0;
892    get_parameter_data(PARAM_EXPOSURE_COUNTER, &v, 4);
893    return v;
894#endif
895}
896
897short shooting_get_ev_correction1()
898{
899    short evc1 = 0;
900    _GetPropertyCase(PROPCASE_EV_CORRECTION_1, &evc1, sizeof(evc1));
901    return evc1;
902}
903
904int shooting_get_zoom() {
905    return lens_get_zoom_point();
906}
907
908void shooting_set_zoom(int v) {
909    int dist;
910if ((mode_get()&MODE_MASK) != MODE_PLAY)
911        {
912    dist = shooting_get_focus();
913    lens_set_zoom_point(v);
914    shooting_set_focus(dist, SET_NOW);
915  }
916}
917
918void shooting_set_zoom_rel(int v) {
919    int cv = shooting_get_zoom();
920if ((mode_get()&MODE_MASK) != MODE_PLAY){
921    shooting_set_zoom(cv+v);
922}
923}
924
925void shooting_set_zoom_speed(int v) {
926if ((mode_get()&MODE_MASK) != MODE_PLAY){
927    lens_set_zoom_speed(v);
928}
929}
930
931int shooting_get_focus() {
932        return shooting_get_subject_distance();
933}
934
935void shooting_set_focus(int v, short is_now) {
936        int s=v;
937if ((mode_get()&MODE_MASK) != MODE_PLAY){
938        if ((is_now) && shooting_can_focus()) {
939          if (conf.dof_dist_from_lens) s+=shooting_get_lens_to_focal_plane_width();
940          if ((!conf.dof_subj_dist_as_near_limit) && (s>0)) lens_set_focus_pos((s<MAX_DIST)?s:MAX_DIST);
941          else {
942        int near=shooting_get_near_limit_f(s,shooting_get_min_real_aperture(),get_focal_length(lens_get_zoom_point()));
943        if (near>0) lens_set_focus_pos((near<MAX_DIST)?near:MAX_DIST);
944          }
945        }
946        else photo_param_put_off.subj_dist=v;
947}
948}
949
950void shooting_set_autoiso(int iso_mode) {
951        short max_iso;
952        switch (iso_mode) {
953                case -1: // ISO HI
954                        max_iso = conf.autoiso_max_iso_hi*10;
955                        break;
956                case 0: // ISO AUTO
957                        max_iso = conf.autoiso_max_iso_auto*10;
958                        break;
959                default:
960                        return;
961        }
962        int m=mode_get()&MODE_SHOOTING_MASK;
963        if (m==MODE_M || m==MODE_TV || m==MODE_STITCH) return; //Only operate outside of M and Tv
964        static const short shutter[]={0, 8, 15, 30, 60, 125, 250, 500, 1000};
965        float current_shutter = shooting_get_shutter_speed_from_tv96(shooting_get_tv96());
966       
967        short current_iso=shooting_get_iso_real();
968               
969        short min_shutter = shutter[conf.autoiso_shutter];
970        if (min_shutter == 0)
971                {
972                        short IS_factor = (shooting_get_is_mode()<=1)?conf.autoiso_is_factor:1;
973                        min_shutter = get_focal_length(lens_get_zoom_point())*conf.autoiso_user_factor / (IS_factor*1000);
974                //min_shutter is NOT 1/Xs but optimized for the calculation.
975                }
976
977        short target_iso = current_iso * min_shutter * current_shutter;
978        short min_iso = conf.autoiso_min_iso*10;
979       
980        if (target_iso > max_iso)
981                { target_iso = max_iso; }
982        else if (target_iso < min_iso)
983                { target_iso = min_iso; }
984       
985        float target_shutter = current_shutter *  current_iso / target_iso;
986       
987        shooting_set_shutter_speed(target_shutter, SET_NOW);
988       
989    shooting_set_iso_real(target_iso, SET_NOW);
990       
991}
992
993void shooting_video_bitrate_change(int v){
994 int m[]={1,2,3,4,5,6,7,8,10,12};  // m[v]/4 = bitrate*1x
995 if (v>=(sizeof(m)/sizeof(m[0]))) v=(sizeof(m)/sizeof(m[0]))-1;
996#if CAM_CHDK_HAS_EXT_VIDEO_MENU
997 change_video_tables(m[v],4);
998#endif
999}
1000
1001float shooting_get_shutter_speed_override_value()
1002{
1003  return (float)conf.tv_override_value*shutter_koef[conf.tv_override_koef]; 
1004}
1005
1006const char * shooting_get_tv_bracket_value()
1007{
1008  return expo_shift[conf.tv_bracket_value];
1009}
1010
1011const char * shooting_get_tv_override_value()
1012{
1013  return tv_override[conf.tv_override_value];
1014}
1015
1016
1017const char * shooting_get_bracket_type()
1018{
1019  return expo_type[conf.bracket_type]; 
1020}
1021
1022
1023short shooting_get_iso_override_value()
1024{
1025  return conf.iso_override_value*koef[conf.iso_override_koef]; 
1026}
1027
1028short shooting_get_iso_bracket_value()
1029{
1030  return conf.iso_bracket_value*koef[conf.iso_bracket_koef]; 
1031}
1032
1033
1034
1035short shooting_get_av96_override_value()
1036{
1037  if (conf.av_override_value<=AS_SIZE)  return (short) aperture_sizes_table[conf.av_override_value-1].prop_id;
1038  else return (short) (AV96_MAX+32*(conf.av_override_value-AS_SIZE));
1039}
1040
1041const char * shooting_get_av_bracket_value()
1042{
1043  return expo_shift[conf.av_bracket_value]; 
1044}
1045
1046
1047int shooting_get_subject_distance_override_value()
1048{
1049  return conf.subj_dist_override_value;
1050}
1051
1052int shooting_get_subject_distance_bracket_value()
1053{
1054  return conf.subj_dist_bracket_value*koef[conf.subj_dist_bracket_koef];
1055}
1056
1057int shooting_get_subject_distance_override_koef()
1058{
1059  static const short koef[] = {0, 1,10,100,1000};
1060  return koef[(conf.subj_dist_override_koef)];
1061
1062}
1063
1064void shooting_tv_bracketing(){
1065  short value, is_odd;
1066  int m=mode_get()&MODE_SHOOTING_MASK;
1067  if (bracketing.shoot_counter==0) { // first shoot
1068    bracketing.shoot_counter=1;
1069    // if Tv override is enabled... (this was adapted from function shooting_expo_param_override() )
1070    if ( ((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1) ) {
1071      // ...use Tv override value as seed for bracketing:
1072      if (conf.tv_enum_type)
1073        bracketing.tv96 = 32*(conf.tv_override_value-18);
1074      else
1075        bracketing.tv96 = shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value());
1076    }
1077    // Tv override is disabled, use camera's opinion of Tv for bracketing seed value.
1078    else {
1079      #if defined (CAMERA_tx1) // M mode is actually automatic on the tx1.
1080      bracketing.tv96=shooting_get_tv96();
1081      #else
1082      if (!(m==MODE_M || m==MODE_TV)) bracketing.tv96=shooting_get_tv96();
1083      else bracketing.tv96=shooting_get_user_tv96();
1084      #endif
1085    }
1086    bracketing.tv96_step=32*conf.tv_bracket_value;
1087  }
1088  // other shoots
1089   bracketing.shoot_counter++;   
1090   is_odd=(bracketing.shoot_counter&1);
1091   if ((!is_odd) || (conf.bracket_type>0)) bracketing.dtv96+=bracketing.tv96_step;
1092   if (((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1))  value=bracketing.tv96-bracketing.dtv96;
1093   else value=bracketing.tv96+bracketing.dtv96;
1094   shooting_set_tv96_direct(value, SET_NOW);
1095}
1096
1097void shooting_av_bracketing(){
1098 short value, is_odd;
1099 int m=mode_get()&MODE_SHOOTING_MASK;
1100 if (bracketing.shoot_counter==0) { // first shoot
1101    bracketing.shoot_counter=1;
1102    //short av_override_value=shooting_get_av96_override_value;
1103    //if (av_override_value) bracketing.av96=av_override_value;
1104    if (!(m==MODE_M || m==MODE_AV)) bracketing.av96=shooting_get_av96();
1105        else bracketing.av96=shooting_get_user_av96();
1106    bracketing.av96_step=32*conf.av_bracket_value;
1107  }
1108  // other shoots
1109   bracketing.shoot_counter++;   
1110   is_odd=(bracketing.shoot_counter&1);
1111   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && ((bracketing.av96-bracketing.dav96)<AV96_MIN)))
1112       bracketing.dav96+=bracketing.av96_step;
1113   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && ((bracketing.av96-bracketing.dav96)>=AV96_MIN))
1114     {
1115     value=bracketing.av96-bracketing.dav96;
1116     shooting_set_av96_direct(value, SET_NOW);
1117     }
1118   else if (((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)  || (((!is_odd) && (conf.bracket_type==0)) && ((bracketing.av96-bracketing.dav96)<AV96_MIN)))
1119     {
1120     value=bracketing.av96+bracketing.dav96;
1121     shooting_set_av96_direct(value, SET_NOW);
1122     }
1123}
1124
1125
1126void shooting_iso_bracketing(){
1127 short value=0, is_odd;
1128 if (bracketing.shoot_counter==0) { // first shoot
1129    bracketing.shoot_counter=1;
1130    bracketing.iso=shooting_get_iso_real();
1131    bracketing.iso_step=shooting_get_iso_bracket_value();
1132    }
1133  // other shoots
1134   bracketing.shoot_counter++;   
1135   is_odd=(bracketing.shoot_counter&1);
1136   
1137   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1138    {
1139           bracketing.diso+=bracketing.iso_step;
1140    }
1141   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.iso>bracketing.diso))
1142     {
1143     value=bracketing.iso-bracketing.diso;
1144     shooting_set_iso_real(value, SET_NOW);
1145     }
1146   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1147     {
1148     value=bracketing.iso+bracketing.diso;
1149     shooting_set_iso_real(value, SET_NOW);
1150     }
1151}
1152
1153void shooting_subject_distance_bracketing(){
1154 short value=0, is_odd;
1155 if (bracketing.shoot_counter==0) { // first shoot
1156    bracketing.shoot_counter=1;
1157    bracketing.subj_dist=shooting_get_focus();
1158    bracketing.subj_dist_step=shooting_get_subject_distance_bracket_value();
1159 }
1160  // other shoots
1161   bracketing.shoot_counter++;   
1162   is_odd=(bracketing.shoot_counter&1);
1163   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1164   {
1165           bracketing.dsubj_dist+=bracketing.subj_dist_step;
1166   }
1167   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.subj_dist>bracketing.dsubj_dist))
1168     {
1169     value=bracketing.subj_dist-bracketing.dsubj_dist;
1170     shooting_set_focus(value, SET_NOW);
1171     }
1172   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1173     {
1174     value=bracketing.subj_dist+bracketing.dsubj_dist;
1175     shooting_set_focus(value, SET_NOW);
1176    }
1177}
1178
1179
1180void shooting_bracketing(void){
1181 
1182  short drive_mode=shooting_get_drive_mode();
1183  if (shooting_get_drive_mode()!=0)  {
1184     int m=mode_get()&MODE_SHOOTING_MASK;
1185     if (m!=MODE_STITCH) {
1186       if (state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) {
1187           bracketing.shoot_counter=0;
1188           bracketing.av96=0;
1189           bracketing.dav96=0;
1190           bracketing.tv96=0;
1191           bracketing.dtv96=0;
1192           bracketing.sv96=0;
1193           bracketing.dsv96=0;
1194           bracketing.iso=0;
1195           bracketing.diso=0;
1196           bracketing.subj_dist=0;
1197           bracketing.dsubj_dist=0;
1198           bracketing.type=0;
1199       }
1200           if (conf.tv_bracket_value && !(conf.override_disable==1 && conf.override_disable_all))  shooting_tv_bracketing();
1201              else if (conf.av_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) shooting_av_bracketing();
1202              else if ((conf.iso_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.iso_bracket_koef)) {
1203                          shooting_iso_bracketing();
1204               }
1205              else if ((conf.subj_dist_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing();           else if ((conf.subj_dist_bracket_value) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing();
1206      }
1207   }
1208}
1209
1210#if CAM_REAR_CURTAIN
1211  void shooting_set_flash_sync_curtain(int curtain){
1212   _SetPropertyCase(PROPCASE_FLASH_SYNC_CURTAIN, &curtain, sizeof(curtain));
1213  }
1214#endif
1215
1216// forces manual flash. if set, flash will ALWAYS be triggered (manual)
1217        void shooting_set_flash_video_override(int flash, int power){
1218                int mode = 1;
1219                if ((conf.flash_manual_override && conf.flash_video_override && (movie_status > 1)) || (conf.flash_manual_override && !conf.flash_video_override)) {
1220                                                _SetPropertyCase(PROPCASE_FLASH_ADJUST_MODE, &mode, sizeof(mode));
1221                                                _SetPropertyCase(PROPCASE_FLASH_FIRE, &flash, sizeof(flash));
1222                                                _SetPropertyCase(PROPCASE_FLASH_MANUAL_OUTPUT, &power, sizeof(power));
1223                                        }
1224  }
1225
1226// TODO sd990 hack for overrides
1227// caller must save regs
1228int captseq_hack_override_active() {
1229 if (state_kbd_script_run)
1230        if ( photo_param_put_off.tv96 || photo_param_put_off.sv96 )
1231                return 1;
1232 if(conf.override_disable==1)
1233        return 0;
1234 if(conf.iso_override_value && conf.iso_override_koef)
1235        return 1;
1236 if((conf.tv_enum_type || conf.tv_override_value) && conf.tv_override_koef)
1237        return 1;
1238 return 0;
1239}
1240
1241void __attribute__((naked,noinline)) shooting_expo_param_override(void){
1242 asm volatile("STMFD   SP!, {R0-R12,LR}\n");
1243
1244 //if (conf.tv_override) shooting_set_tv96_direct(-384-32*conf.tv_override);
1245 //short drive_mode=shooting_get_drive_mode();
1246/*if(drive_mode!=last_drive_mode)
1247 {
1248  if (last_drive_mode==0) shoot_counter=0;
1249  last_drive_mode=drive_mode;
1250 }*/
1251 //int m=mode_get()&MODE_SHOOTING_MASK;
1252 if ((state_kbd_script_run) && (photo_param_put_off.tv96)) {
1253  shooting_set_tv96_direct(photo_param_put_off.tv96, SET_NOW); 
1254  photo_param_put_off.tv96=0;
1255 }
1256   else if (((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1))
1257   {
1258   if (conf.tv_enum_type)
1259//     shooting_set_tv96_direct(32*(conf.tv_override_value-18),SET_NOW);
1260     shooting_set_tv96_direct(32*(conf.tv_override_value-(tv_override_zero_shift)),SET_NOW);
1261   else   
1262    shooting_set_tv96_direct(shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value()), SET_NOW);
1263   }
1264 if ((state_kbd_script_run) && (photo_param_put_off.sv96)) {
1265  shooting_set_sv96(photo_param_put_off.sv96, SET_NOW);
1266  photo_param_put_off.sv96=0;
1267  }
1268else if ((conf.iso_override_value) && (conf.iso_override_koef) && !(conf.override_disable==1))
1269  shooting_set_iso_real(shooting_get_iso_override_value(), SET_NOW);
1270 else if (conf.autoiso_enable && shooting_get_flash_mode()/*NOT FOR FLASH AUTO MODE*/ && !(conf.override_disable==1 && conf.override_disable_all))
1271  shooting_set_autoiso(shooting_get_iso_mode());
1272 if ((state_kbd_script_run) && (photo_param_put_off.av96)) {
1273  shooting_set_av96_direct(photo_param_put_off.av96, SET_NOW);
1274  photo_param_put_off.av96=0;
1275  }
1276 else if (conf.av_override_value && !(conf.override_disable==1))
1277 shooting_set_av96_direct(shooting_get_av96_override_value(), SET_NOW);
1278 if ((state_kbd_script_run) && (photo_param_put_off.subj_dist)) {
1279  shooting_set_focus(photo_param_put_off.subj_dist, SET_NOW);
1280  photo_param_put_off.subj_dist=0; 
1281  }
1282  else if ((conf.subj_dist_override_value) && (conf.subj_dist_override_koef) && !(conf.override_disable==1))
1283   shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1284#if CAM_HAS_ND_FILTER
1285 if ((state_kbd_script_run) && (photo_param_put_off.nd_filter)) {
1286   shooting_set_nd_filter_state(photo_param_put_off.nd_filter, SET_NOW);
1287   photo_param_put_off.nd_filter=0; 
1288  }
1289 else if (conf.nd_filter_state && !(conf.override_disable==1))
1290   shooting_set_nd_filter_state(conf.nd_filter_state, SET_NOW);
1291#endif 
1292
1293#if CAM_REAR_CURTAIN
1294  shooting_set_flash_sync_curtain(conf.flash_sync_curtain);
1295#endif
1296
1297
1298  shooting_set_flash_video_override(conf.flash_manual_override,conf.flash_video_override_power);
1299
1300 asm volatile("LDMFD   SP!, {R0-R12,PC}\n");
1301}
1302
1303void unlock_optical_zoom(void){
1304
1305#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
1306 if (conf.unlock_optical_zoom_for_video) _UnsetZoomForMovie();
1307#endif
1308
1309#if CAM_EV_IN_VIDEO
1310 set_ev_video_avail(0);
1311#endif
1312
1313}
1314
1315
1316#if CAM_EV_IN_VIDEO
1317
1318int ev_video_avail;
1319int ev_video;
1320int save_tv_video;
1321int tv_min_video;
1322
1323int get_ev_video_avail(void){
1324 return ev_video_avail;
1325}
1326
1327void set_ev_video_avail(int x){
1328 if (ev_video_avail==x) return;
1329 ev_video_avail=x;
1330 if (x) {
1331  ev_video=0;
1332  _ExpCtrlTool_StopContiAE(0,0);
1333  _GetPropertyCase(PROPCASE_TV,&save_tv_video,2);
1334  if ((mode_get()&MODE_SHOOTING_MASK)==MODE_VIDEO_SPEED) tv_min_video=577;  // 1/60
1335   else tv_min_video=480; //1/30
1336 }
1337 else _ExpCtrlTool_StartContiAE(0,0);
1338}
1339
1340int get_ev_video(void){
1341 return ev_video;
1342}
1343
1344void set_ev_video(int x){
1345 short ev, tv;
1346 if ((x<-4)||(x>4)) return;
1347 ev=48*x;
1348 tv=save_tv_video-ev;
1349 if (tv>=tv_min_video) {
1350  ev_video=x;
1351  _SetAE_ShutterSpeed(&tv);
1352 }
1353}
1354
1355#endif
Note: See TracBrowser for help on using the repository browser.