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

Revision 1143, 38.8 KB checked in by msl, 2 years ago (diff)

ixus120_sd940

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