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

Revision 1568, 40.6 KB checked in by reyalp, 16 months ago (diff)

new usb remote system from waterwings http://chdk.setepontos.com/index.php?topic=7127.msg79948#msg79948
draft documentation http://chdk.wikia.com/wiki/User:Waterwingz/USB_Remote_V2
note ixus230 kbd.c not updated

  • 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
60EXPO_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#if defined(CAMERA_sx40hs)
303      else iso_market_base=200;
304#else
305      else iso_market_base=100;
306#endif
307     }
308  return iso_market_base;
309}
310
311short shooting_get_svm96_base()
312{
313        if (svm96_base==0) svm96_base=shooting_get_svm96_from_iso(shooting_get_iso_market_base());
314        return svm96_base;
315}
316
317short shooting_get_iso_base()
318{
319        sv96_base=shooting_get_base_sv96();
320        if (sv96_base!=0) return shooting_get_iso_from_sv96(sv96_base);
321        else return 0;
322}
323
324// AUTOISO:EXIF
325short shooting_get_iso_market()
326{
327    //double koef;
328    short iso_mode=shooting_get_canon_iso_mode();
329    if ((iso_mode < 50) || (conf.iso_override_koef && conf.iso_override_value) || (conf.iso_bracket_koef && conf.iso_bracket_value))
330     {
331      short iso_b=shooting_get_iso_base();
332      if (iso_b) return (short)((shooting_get_iso_market_base()*shooting_get_iso_real())/iso_b);
333     }
334    return iso_mode;
335}
336
337void shooting_set_sv96(short sv96, short is_now){
338  short dsv96=0, iso_mode=shooting_get_canon_iso_mode();
339if ((mode_get()&MODE_MASK) != MODE_PLAY){
340  if (is_now)  {
341    if (iso_mode<50) dsv96 =sv96-shooting_get_base_sv96();
342    else if (sv96_base) dsv96=sv96-sv96_base;
343        else if (sv96_base_tmp) dsv96=sv96-sv96_base_tmp;
344        else
345         {
346         sv96_base_tmp= (short)((shooting_get_svm96_base()*shooting_get_sv96())/shooting_get_svm96());
347         dsv96=sv96-sv96_base_tmp;
348         }
349    while ((shooting_is_flash_ready()!=1) || (focus_busy));
350    short svm96_base =shooting_get_svm96_base();
351    if (iso_mode>=50) shooting_set_iso_mode(0);
352    _SetPropertyCase(PROPCASE_SV_MARKET, &svm96_base, sizeof(svm96_base));
353    _SetPropertyCase(PROPCASE_SV, &sv96, sizeof(sv96));
354    _SetPropertyCase(PROPCASE_DELTA_SV, &dsv96, sizeof(dsv96));
355  }
356  else   photo_param_put_off.sv96=sv96;
357}
358}
359
360/*void shooting_set_iso_real_delta_from_base(int diso)
361{
362 return;
363 int iso=(int)((short)shooting_get_iso_base()+diso);
364
365 if (iso>0) {
366    shooting_set_sv96((short)(shooting_get_sv96_from_iso(iso)));
367  }
368}*/
369
370void shooting_set_iso_real(short iso, short is_now)
371{
372if ((mode_get()&MODE_MASK) != MODE_PLAY){
373        if (iso>0) shooting_set_sv96(shooting_get_sv96_from_iso(iso), is_now);
374}
375}
376
377short shooting_get_bv96()
378{
379    short bv = 0;
380    _GetPropertyCase(PROPCASE_BV, &bv, sizeof(bv));
381    return bv;
382}
383
384short shooting_get_canon_overexposure_value()
385{
386    short bv = 0;
387    _GetPropertyCase(PROPCASE_OVEREXPOSURE, &bv, sizeof(bv));
388    return bv;
389}
390
391
392short shooting_get_flash_mode()
393{
394    short fm = 0;
395    _GetPropertyCase(PROPCASE_FLASH_MODE, &fm, sizeof(fm));
396    return fm;
397}
398
399int shooting_get_luminance()// http://en.wikipedia.org/wiki/APEX_system
400{
401    short bv = shooting_get_bv96();
402    int b=(int)(100*k*pow(2.0,((double)(bv-168)/96.0)));
403    return b;
404}
405
406/*void shooting_set_iso_market(int isom)
407{
408        if (isom>0) {
409   shooting_set_sv96(shooting_get_sv96_from_iso((int)(((double)isom*(double)shooting_get_iso_base())/(double)shooting_get_iso_market_base())));
410  }
411}*/
412
413int shooting_get_exif_subject_dist()
414{
415    int sd = 0;
416    _GetPropertyCase(PROPCASE_SUBJECT_DIST1, &sd, sizeof(sd));
417    return sd;
418}
419
420int shooting_get_lens_to_focal_plane_width()
421{
422        return (int)(lens_get_focus_pos()-lens_get_focus_pos_from_lens());
423}
424
425int shooting_get_hyperfocal_distance_()
426{
427  int av=shooting_get_real_aperture();
428  float fl=get_focal_length(lens_get_zoom_point());
429  if ((av>0) && (fl>0)) return (fl*fl)/(float)(10*circle_of_confusion*av);
430  else return (-1);
431}
432
433int shooting_get_hyperfocal_distance()
434{
435 int h=shooting_get_hyperfocal_distance_();
436 if ((h>0) && (conf.dof_dist_from_lens))
437   return (h-shooting_get_lens_to_focal_plane_width());
438 else return h;
439}
440
441int shooting_get_hyperfocal_distance_f(int av, int fl)
442{
443  if ((av>0) && (fl>0) && (circle_of_confusion>0)) return ((float)fl*(float)fl)/(float)(10*circle_of_confusion*av);
444  else return (-1);
445}
446
447int shooting_get_canon_subject_distance()
448{
449        if (conf.dof_use_exif_subj_dist) return shooting_get_exif_subject_dist();
450        else return lens_get_focus_pos();
451}
452
453int shooting_get_subject_distance_()
454{
455   if (!conf.dof_subj_dist_as_near_limit) return shooting_get_canon_subject_distance();
456   else {
457        float h, v, m;
458                int fl=get_focal_length(lens_get_zoom_point());
459        int near=shooting_get_canon_subject_distance();
460        float v1=(fl*fl);
461        int av_min=shooting_get_min_real_aperture();
462        int c_of_c=circle_of_confusion*10;
463        if ((av_min!=0) && (c_of_c!=0) && (v1)) {
464                    h=v1/(float)(c_of_c*av_min);
465            if ((near>0) && (near<MAX_DIST)) {
466                  v=(h-near);
467                  m=h*(float)near;
468                  if ((v>0) && (m>0)) return m/v;
469             }
470        }
471        return (-1);
472    }
473}
474
475int shooting_get_subject_distance()
476{
477 int h=shooting_get_subject_distance_();
478 if ((h>0) && (conf.dof_dist_from_lens))
479   return (h-shooting_get_lens_to_focal_plane_width());
480 else return h;
481}
482
483int shooting_get_near_limit_of_acceptable_sharpness_()
484{
485        int s=shooting_get_canon_subject_distance();
486        if (conf.dof_subj_dist_as_near_limit) return s;
487    else {
488      int h = shooting_get_hyperfocal_distance_();
489      float m = (float)h*(float)s;
490      int v = h+s;
491      if ((m>0) && (v>0)) return (m/v);
492      else return (-1);
493    }
494}
495
496int shooting_get_near_limit_of_acceptable_sharpness()
497{
498 int h=shooting_get_near_limit_of_acceptable_sharpness_();
499 if ((h>0) && (conf.dof_dist_from_lens))
500   return (h-shooting_get_lens_to_focal_plane_width());
501 else return h;
502}
503
504int shooting_get_near_limit_f(int s, int a, int fl)
505{
506      int h = shooting_get_hyperfocal_distance_f(a, fl);
507      float m = (float)h*(float)s;
508      int v = h+s;
509      if ((m>0) && (v>0)) return (m/v);
510      else return (-1);
511}
512
513int shooting_get_far_limit_of_acceptable_sharpness_()
514{
515        int s=shooting_get_subject_distance_(), h=shooting_get_hyperfocal_distance_();
516    int v = h-s;
517    float m = (float)h*(float)s;
518    if ((m>0) && (v>0)) return (m/v);
519    else return (-1);
520}
521
522int shooting_get_far_limit_of_acceptable_sharpness()
523{
524 int h=shooting_get_far_limit_of_acceptable_sharpness_();
525 if ((h>0) && (conf.dof_dist_from_lens))
526   return (h-shooting_get_lens_to_focal_plane_width());
527 else return h;
528}
529
530int shooting_get_depth_of_field()
531{
532  int far=shooting_get_far_limit_of_acceptable_sharpness_(), near=shooting_get_near_limit_of_acceptable_sharpness_();
533  if ((far>0) && (near>0)) return far-near;
534  else return (-1);
535}
536
537short shooting_get_tv96_from_shutter_speed(float t)
538{
539  if (t>0) return (short) (96.0*log(1.0/t)/log_2);
540  else return (-10000);
541}
542
543float shooting_get_shutter_speed_from_tv96(short tv)
544{
545  return  pow(2,(float)((-1)*tv)/96.0 );
546}
547
548short shooting_get_tv96()
549{
550    short tv96;
551    _GetPropertyCase(PROPCASE_TV, &tv96, sizeof(tv96));
552    return tv96;
553}
554
555short shooting_get_user_tv96()
556{
557#if CAM_HAS_USER_TV_MODES
558    short tv;
559    _GetPropertyCase(PROPCASE_USER_TV, &tv, sizeof(tv));
560    return tv;
561#else
562    return 0;
563#endif
564}
565
566void shooting_set_user_tv96(short v)
567{
568#if CAM_HAS_USER_TV_MODES
569if ((mode_get()&MODE_MASK) != MODE_PLAY){
570long i;
571//    if ((v<SSID_MIN) || (v>SSID_MAX))
572//      return;
573 for (i=0;i<SS_SIZE;i++){
574        if (shutter_speeds_table[i].prop_id == v){
575                _SetPropertyCase(PROPCASE_USER_TV, &v, sizeof(v));
576                //_SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
577            return;
578          }
579  }
580}
581#endif
582}
583
584void shooting_set_tv96(short v, short is_now)
585{
586 long i;
587//    if ((v<SSID_MIN) || (v>SSID_MAX))
588//      return;
589if ((mode_get()&MODE_MASK) != MODE_PLAY){
590 for (i=0;i<SS_SIZE;i++){
591        if (shutter_speeds_table[i].prop_id == v){
592       shooting_set_tv96_direct(v, is_now);
593       return;
594     }
595  }
596}
597}
598
599void shooting_set_tv96_direct(short v, short is_now)
600{
601if ((mode_get()&MODE_MASK) != MODE_PLAY){
602        if(is_now) {
603           _SetPropertyCase(PROPCASE_TV, &v, sizeof(v));
604#ifdef PROPCASE_TV2
605       _SetPropertyCase(PROPCASE_TV2, &v, sizeof(v));   // Save override to property that will update JPEG header & Canon OSD
606#endif
607        }
608        else photo_param_put_off.tv96=v;
609}
610}
611
612
613void shooting_set_shutter_speed(float t, short is_now)
614{
615        if (t>0) shooting_set_tv96_direct((short) 96.0*log(1/t)/log_2, is_now);
616}
617
618void shooting_set_shutter_speed_ubasic(int t, short is_now)
619{
620if ((mode_get()&MODE_MASK) != MODE_PLAY){
621        if (t>0) shooting_set_tv96_direct((short) (96.0*log(100000.0/(double)t)/log_2), is_now);
622}
623}
624
625short shooting_get_av96()
626{
627    short av;
628    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
629    return av;
630}
631
632short shooting_get_aperture_sizes_table_size()
633{
634    return AS_SIZE;
635}
636
637
638short shooting_get_aperture_sizes_table_prop_id(short i)
639{
640    return aperture_sizes_table[i].prop_id;
641}
642
643short shooting_get_max_aperture_sizes_table_prop_id()
644{
645    return AV96_MAX;
646}
647
648
649
650short shooting_get_av_prop_id()
651{
652    short av;
653    _GetPropertyCase(PROPCASE_AV, &av, sizeof(av));
654    return av;
655}
656
657
658
659short shooting_get_user_av96()
660{
661#if CAM_HAS_IRIS_DIAPHRAGM
662    short av;
663    _GetPropertyCase(PROPCASE_USER_AV, &av, sizeof(av));
664    return av;
665#else
666    return 0;
667#endif
668}
669
670
671void shooting_set_av96(short v, short is_now)
672{
673#if CAM_HAS_IRIS_DIAPHRAGM
674if ((mode_get()&MODE_MASK) != MODE_PLAY){
675 long i;
676//    if ((v<ASID_MIN) || (v>ASID_MAX))
677//      return;
678 for (i=0;i<AS_SIZE;i++){
679        if (aperture_sizes_table[i].prop_id == v){
680           shooting_set_av96_direct(v, is_now);
681           return;
682        }
683  }
684}
685#endif
686}
687
688void shooting_set_nd_filter_state(short v, short is_now)
689{
690#if CAM_HAS_ND_FILTER
691if ((mode_get()&MODE_MASK) != MODE_PLAY){
692        if (is_now) {
693         if (v==1) _PutInNdFilter();
694         else if (v==2) _PutOutNdFilter();
695        }
696        else photo_param_put_off.nd_filter=v;
697}
698#endif
699}
700
701
702
703void shooting_set_av96_direct(short v, short is_now)
704{
705#if CAM_HAS_IRIS_DIAPHRAGM
706if ((mode_get()&MODE_MASK) != MODE_PLAY){
707 if(is_now) {
708   _SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
709#ifdef PROPCASE_AV2
710   _SetPropertyCase(PROPCASE_AV2, &v, sizeof(v));   // Save override to property that will update JPEG header & Canon OSD
711#endif
712 }
713 else photo_param_put_off.av96=v;
714}
715#endif
716}
717
718
719void shooting_set_user_av96(short v)
720{
721#if CAM_HAS_IRIS_DIAPHRAGM
722    long i;
723if ((mode_get()&MODE_MASK) != MODE_PLAY){
724//    if ((v<ASID_MIN) || (v>ASID_MAX))
725//      return;
726
727 for (i=0;i<AS_SIZE;i++){
728        if (aperture_sizes_table[i].prop_id == v){
729                  _SetPropertyCase(PROPCASE_USER_AV, &v, sizeof(v));
730                  //_SetPropertyCase(PROPCASE_AV, &v, sizeof(v));
731            return;
732        }
733 }
734}
735#endif
736}
737
738short shooting_get_drive_mode()
739{
740    short m;
741// these cameras do not set PROPCASE_DRIVE_MODE when in custom timer mode
742// SX 200 IS 0,1,2,3,4=Off, 2 Second, Custom, Face Detection
743#if defined (CAM_DRIVE_MODE_FROM_TIMER_MODE)
744   short n;
745   _GetPropertyCase(PROPCASE_TIMER_MODE, &n, sizeof(n));
746   // note we return this only in custom mode.
747   // Other cameras would return 3 if any timer mode is set (?) even if it doesn't do multiple exposures
748   // note that face detect does multiple exposure
749   if(n==3){
750      return n;
751   }
752#endif
753
754    _GetPropertyCase(PROPCASE_DRIVE_MODE, &m, sizeof(m));
755    return m;
756}
757
758short shooting_can_focus()
759{
760 int m=mode_get()&MODE_SHOOTING_MASK;
761#if !CAM_CAN_SD_OVER_NOT_IN_MF && CAM_CAN_SD_OVERRIDE
762 #if CAM_CAN_SD_OVER_IN_AF_LOCK
763  if (shooting_get_prop(PROPCASE_AF_LOCK))
764    return 1;
765 #endif
766  return (shooting_get_focus_mode() || MODE_IS_VIDEO(m));
767#elif !CAM_CAN_SD_OVERRIDE
768  return MODE_IS_VIDEO(m);
769#elif defined (CAMERA_ixus800_sd700)
770// TODO whats the reason for this ?!?
771  return (shooting_get_zoom()<8) && (m!=MODE_AUTO) && (m!=MODE_SCN_UNDERWATER);
772#else
773  return 1;
774#endif
775}
776
777short shooting_get_common_focus_mode()
778{
779#if !CAM_HAS_MANUAL_FOCUS && CAM_CAN_SD_OVERRIDE
780  return shooting_get_subject_distance_override_koef();
781#elif !CAM_CAN_SD_OVERRIDE
782  return 0;
783#else
784  return shooting_get_focus_mode();
785#endif
786}
787
788short shooting_get_focus_mode()
789{
790  short m;
791  _GetPropertyCase(PROPCASE_FOCUS_MODE, &m, sizeof(m));
792  return m;
793}
794
795
796/*
797short shooting_get_continuous_mode_shoot_count()
798{
799    short c;
800    _GetPropertyCase(PROPCASE_CONT_MODE_SHOOT_COUNT, &c, sizeof(c));
801    return c;
802}
803*/
804
805
806void shooting_set_user_av_by_id(int v)
807{
808#if CAM_HAS_IRIS_DIAPHRAGM
809long i;
810if ((mode_get()&MODE_MASK) != MODE_PLAY){
811//    if ((v<ASID_MIN) || (v>ASID_MAX))
812//      return;
813  for (i=0;i<AS_SIZE;i++){
814                if (aperture_sizes_table[i].id == v){
815            short vv = aperture_sizes_table[i].prop_id;
816            _SetPropertyCase(PROPCASE_USER_AV, &vv, sizeof(vv));
817            //_SetPropertyCase(PROPCASE_AV, &vv, sizeof(vv));
818            return;
819                }
820  }
821}
822#endif
823}
824
825void shooting_set_user_av_by_id_rel(int v)
826{
827#if CAM_HAS_IRIS_DIAPHRAGM
828if ((mode_get()&MODE_MASK) != MODE_PLAY){
829    int cv = shooting_get_user_av_id();
830    shooting_set_user_av_by_id(cv+v);
831}
832#endif
833}
834
835
836int shooting_get_day_seconds()
837{
838    unsigned long t;
839    struct tm *ttm;
840    t = time(NULL);
841    ttm = localtime(&t);
842    return ttm->tm_hour * 3600 + ttm->tm_min * 60 + ttm->tm_sec;
843}
844
845int shooting_get_tick_count()
846{
847    return (int)get_tick_count();
848}
849
850void shooting_set_iso_mode(int v)
851{
852 long i;
853 for (i=0;i<ISO_SIZE;i++){
854        if (iso_table[i].id == v){
855            short vv = iso_table[i].prop_id;
856            _SetPropertyCase(PROPCASE_ISO_MODE, &vv, sizeof(vv));
857            return;
858        }
859  }
860}
861
862int shooting_in_progress()
863{
864    int t = 0;
865    _GetPropertyCase(PROPCASE_SHOOTING, &t, sizeof(&t));
866    return t != 0;
867}
868
869int shooting_is_flash()
870{
871 int t = 0;
872 _GetPropertyCase(PROPCASE_IS_FLASH_READY, &t,sizeof(&t));
873 return t;
874}
875
876int shooting_is_flash_ready()
877{
878   int t = 0;
879/* well, I'm not sure what's exactly is happening here
880 * but it works for a610-100e
881 */
882   // _GetPropertyCase(204, &t, 4);
883   // if (t == 3){
884   _GetPropertyCase(PROPCASE_FLASH_MODE, &t, sizeof(&t));
885   if ((t != 2) && (shooting_in_progress()))
886     if (shooting_is_flash()) return _IsStrobeChargeCompleted();
887   return 1;
888}
889
890long get_file_counter()
891{
892#ifndef PARAM_FILE_COUNTER
893#       error Please define PARAM_FILE_COUNTER in platform`s shooting.c!
894#endif
895    long v = 0;
896    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
897    return v;
898}
899
900long get_exposure_counter()
901{
902#if defined(USE_FILE_COUNTER_FOR_EXP_COUNTING) || !defined(PARAM_EXPOSURE_COUNTER)
903    long v = 0;
904    get_parameter_data(PARAM_FILE_COUNTER, &v, 4);
905    v = ((v>>4)&0x3FFF);
906    return v;
907#else
908    long v = 0;
909    get_parameter_data(PARAM_EXPOSURE_COUNTER, &v, 4);
910    return v;
911#endif
912}
913
914short shooting_get_ev_correction1()
915{
916    short evc1 = 0;
917    _GetPropertyCase(PROPCASE_EV_CORRECTION_1, &evc1, sizeof(evc1));
918    return evc1;
919}
920
921#if CAM_QUALITY_OVERRIDE
922void shooting_set_image_quality(int imq)
923{
924  if (imq != 3){
925    _SetPropertyCase(PROPCASE_QUALITY, &imq, sizeof(imq));
926  }
927}
928#endif
929
930int shooting_get_zoom() {
931    return lens_get_zoom_point();
932}
933
934void shooting_set_zoom(int v) {
935    int dist;
936if ((mode_get()&MODE_MASK) != MODE_PLAY)
937        {
938    dist = shooting_get_focus();
939    lens_set_zoom_point(v);
940    shooting_set_focus(dist, SET_NOW);
941  }
942}
943
944void shooting_set_zoom_rel(int v) {
945    int cv = shooting_get_zoom();
946if ((mode_get()&MODE_MASK) != MODE_PLAY){
947    shooting_set_zoom(cv+v);
948}
949}
950
951void shooting_set_zoom_speed(int v) {
952if ((mode_get()&MODE_MASK) != MODE_PLAY){
953    lens_set_zoom_speed(v);
954}
955}
956
957int shooting_get_focus() {
958        return shooting_get_subject_distance();
959}
960
961void shooting_set_focus(int v, short is_now) {
962        int s=v;
963if ((mode_get()&MODE_MASK) != MODE_PLAY){
964        if ((is_now) && shooting_can_focus()) {
965          if (conf.dof_dist_from_lens) s+=shooting_get_lens_to_focal_plane_width();
966          if ((!conf.dof_subj_dist_as_near_limit) && (s>0)) lens_set_focus_pos((s<MAX_DIST)?s:MAX_DIST);
967          else {
968        int near=shooting_get_near_limit_f(s,shooting_get_min_real_aperture(),get_focal_length(lens_get_zoom_point()));
969        if (near>0) lens_set_focus_pos((near<MAX_DIST)?near:MAX_DIST);
970          }
971        }
972        else photo_param_put_off.subj_dist=v;
973}
974}
975
976void shooting_set_autoiso(int iso_mode) {
977        short max_iso;
978        switch (iso_mode) {
979                case -1: // ISO HI
980                        max_iso = conf.autoiso_max_iso_hi*10;
981                        break;
982                case 0: // ISO AUTO
983                        max_iso = conf.autoiso_max_iso_auto*10;
984                        break;
985                default:
986                        return;
987        }
988        int m=mode_get()&MODE_SHOOTING_MASK;
989        // TODO also long shutter ?
990        if (m==MODE_M || m==MODE_TV || m==MODE_STITCH) return; //Only operate outside of M and Tv
991        static const short shutter[]={0, 8, 15, 30, 60, 125, 250, 500, 1000};
992        float current_shutter = shooting_get_shutter_speed_from_tv96(shooting_get_tv96());
993
994        short current_iso=shooting_get_iso_real();
995
996        short min_shutter = shutter[conf.autoiso_shutter];
997        if (min_shutter == 0)
998                {
999                        short IS_factor = (shooting_get_is_mode()<=1)?conf.autoiso_is_factor:1;
1000                        min_shutter = get_focal_length(lens_get_zoom_point())*conf.autoiso_user_factor / (IS_factor*1000);
1001                //min_shutter is NOT 1/Xs but optimized for the calculation.
1002                }
1003
1004        short target_iso = current_iso * min_shutter * current_shutter;
1005        short min_iso = conf.autoiso_min_iso*10;
1006
1007        if (target_iso > max_iso)
1008                { target_iso = max_iso; }
1009        else if (target_iso < min_iso)
1010                { target_iso = min_iso; }
1011
1012        float target_shutter = current_shutter *  current_iso / target_iso;
1013
1014        shooting_set_shutter_speed(target_shutter, SET_NOW);
1015
1016    shooting_set_iso_real(target_iso, SET_NOW);
1017
1018}
1019
1020void shooting_video_bitrate_change(int v){
1021 int m[]={1,2,3,4,5,6,7,8,10,12};  // m[v]/4 = bitrate*1x
1022 if (v>=(sizeof(m)/sizeof(m[0]))) v=(sizeof(m)/sizeof(m[0]))-1;
1023#if CAM_CHDK_HAS_EXT_VIDEO_MENU
1024 change_video_tables(m[v],4);
1025#endif
1026}
1027
1028float shooting_get_shutter_speed_override_value()
1029{
1030  return (float)conf.tv_override_value*shutter_koef[conf.tv_override_koef];
1031}
1032
1033const char * shooting_get_tv_bracket_value()
1034{
1035  return expo_shift[conf.tv_bracket_value];
1036}
1037
1038const char * shooting_get_tv_override_value()
1039{
1040  return tv_override[conf.tv_override_value];
1041}
1042
1043
1044const char * shooting_get_bracket_type()
1045{
1046  return expo_type[conf.bracket_type];
1047}
1048
1049
1050short shooting_get_iso_override_value()
1051{
1052  return conf.iso_override_value*koef[conf.iso_override_koef];
1053}
1054
1055short shooting_get_iso_bracket_value()
1056{
1057  return conf.iso_bracket_value*koef[conf.iso_bracket_koef];
1058}
1059
1060
1061
1062short shooting_get_av96_override_value()
1063{
1064  if (conf.av_override_value<=AS_SIZE)  return (short) aperture_sizes_table[conf.av_override_value-1].prop_id;
1065  else return (short) (AV96_MAX+32*(conf.av_override_value-AS_SIZE));
1066}
1067
1068const char * shooting_get_av_bracket_value()
1069{
1070  return expo_shift[conf.av_bracket_value];
1071}
1072
1073
1074int shooting_get_subject_distance_override_value()
1075{
1076  return conf.subj_dist_override_value;
1077}
1078
1079int shooting_get_subject_distance_bracket_value()
1080{
1081  return conf.subj_dist_bracket_value*koef[conf.subj_dist_bracket_koef];
1082}
1083
1084int shooting_get_subject_distance_override_koef()
1085{
1086  static const short koef[] = {0, 1,10,100,1000};
1087  return koef[(conf.subj_dist_override_koef)];
1088
1089}
1090
1091void shooting_tv_bracketing(int when){
1092  short value, is_odd;
1093  int m=mode_get()&MODE_SHOOTING_MASK;
1094  if (bracketing.shoot_counter==0) { // first shoot
1095    bracketing.shoot_counter=1;
1096    // if Tv override is enabled... (this was adapted from function shooting_expo_param_override() )
1097    if ( ((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1) ) {
1098      // ...use Tv override value as seed for bracketing:
1099      if (conf.tv_enum_type)
1100        bracketing.tv96 = 32*(conf.tv_override_value-tv_override_zero_shift);
1101      else
1102        bracketing.tv96 = shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value());
1103    }
1104    // Tv override is disabled, use camera's opinion of Tv for bracketing seed value.
1105    else {
1106      if (!(m==MODE_M || m==MODE_TV || m==MODE_LONG_SHUTTER)) bracketing.tv96=shooting_get_tv96();
1107      else bracketing.tv96=shooting_get_user_tv96();
1108    }
1109    bracketing.tv96_step=32*conf.tv_bracket_value;
1110  }
1111  // other shoots
1112   bracketing.shoot_counter++;
1113   is_odd=(bracketing.shoot_counter&1);
1114   if ((!is_odd) || (conf.bracket_type>0)) bracketing.dtv96+=bracketing.tv96_step;
1115   if (((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1))  value=bracketing.tv96-bracketing.dtv96;
1116   else value=bracketing.tv96+bracketing.dtv96;
1117   
1118   shooting_set_tv96_direct(value, when);
1119
1120}
1121
1122void shooting_av_bracketing(int when){
1123    short value,is_odd;
1124
1125    int m = mode_get()&MODE_SHOOTING_MASK;
1126
1127    if (bracketing.shoot_counter == 0) { // first shoot
1128        bracketing.shoot_counter = 1;
1129        //short av_override_value=shooting_get_av96_override_value;
1130        //if (av_override_value) bracketing.av96=av_override_value;
1131        if (!(m==MODE_M || m==MODE_AV))
1132            bracketing.av96 = shooting_get_av96();
1133        else
1134            bracketing.av96 = shooting_get_user_av96();
1135        bracketing.av96_step = 32*conf.av_bracket_value;
1136    }
1137    // other shoots
1138    bracketing.shoot_counter++;
1139    is_odd = (bracketing.shoot_counter&1);
1140    value = bracketing.av96;
1141
1142    if ( !is_odd || (conf.bracket_type > 0) ||
1143         ( is_odd && (conf.bracket_type == 0) && ((bracketing.av96 - bracketing.dav96) < AV96_MIN) ))
1144    {
1145       bracketing.dav96 += bracketing.av96_step;
1146    }
1147
1148    if (((!is_odd && (conf.bracket_type == 0)) || (conf.bracket_type == 1)) && ((bracketing.av96 - bracketing.dav96) >= AV96_MIN))
1149    {
1150        value -= bracketing.dav96;
1151    }
1152    else if ((is_odd && (conf.bracket_type == 0))
1153                || (conf.bracket_type == 2)
1154                || ((!is_odd && (conf.bracket_type == 0)) && ((bracketing.av96 - bracketing.dav96) < AV96_MIN)))
1155    {
1156        value += bracketing.dav96;
1157    }
1158
1159    if (value != bracketing.av96)
1160    {
1161        shooting_set_av96_direct(value, when);
1162#ifdef CAM_AV_OVERRIDE_IRIS_FIX
1163        extern int _MoveIrisWithAv(short*);
1164        _MoveIrisWithAv(&value);
1165#endif
1166    }
1167}
1168
1169
1170void shooting_iso_bracketing(int when){
1171 short value=0, is_odd;
1172 if (bracketing.shoot_counter==0) { // first shoot
1173    bracketing.shoot_counter=1;
1174    bracketing.iso=shooting_get_iso_real();
1175    bracketing.iso_step=shooting_get_iso_bracket_value();
1176    }
1177  // other shoots
1178   bracketing.shoot_counter++;
1179   is_odd=(bracketing.shoot_counter&1);
1180
1181   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1182    {
1183           bracketing.diso+=bracketing.iso_step;
1184    }
1185   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.iso>bracketing.diso))
1186     {
1187     value=bracketing.iso-bracketing.diso;
1188     shooting_set_iso_real(value, when);
1189     }
1190   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.iso<=bracketing.diso)))
1191     {
1192     value=bracketing.iso+bracketing.diso;
1193     shooting_set_iso_real(value, when);
1194     }
1195}
1196
1197void shooting_subject_distance_bracketing(int when){
1198 short value=0, is_odd;
1199 if (bracketing.shoot_counter==0) { // first shoot
1200    bracketing.shoot_counter=1;
1201    bracketing.subj_dist=shooting_get_focus();
1202    bracketing.subj_dist_step=shooting_get_subject_distance_bracket_value();
1203 }
1204  // other shoots
1205   bracketing.shoot_counter++;
1206   is_odd=(bracketing.shoot_counter&1);
1207   if (((!is_odd) || (conf.bracket_type>0)) || (((is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1208   {
1209           bracketing.dsubj_dist+=bracketing.subj_dist_step;
1210   }
1211   if ((((!is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==1)) && (bracketing.subj_dist>bracketing.dsubj_dist))
1212     {
1213     value=bracketing.subj_dist-bracketing.dsubj_dist;
1214     shooting_set_focus(value, when);
1215     }
1216   else if ((((is_odd) && (conf.bracket_type==0)) || (conf.bracket_type==2)) || (((!is_odd) && (conf.bracket_type==0)) && (bracketing.subj_dist<=bracketing.dsubj_dist)))
1217     {
1218     value=bracketing.subj_dist+bracketing.dsubj_dist;
1219     shooting_set_focus(value, when);
1220    }
1221}
1222
1223void bracketing_reset()
1224{
1225           bracketing.shoot_counter=0;
1226           bracketing.av96=0;
1227           bracketing.dav96=0;
1228           bracketing.tv96=0;
1229           bracketing.dtv96=0;
1230           bracketing.sv96=0;
1231           bracketing.dsv96=0;
1232           bracketing.iso=0;
1233           bracketing.diso=0;
1234           bracketing.subj_dist=0;
1235           bracketing.dsubj_dist=0;
1236           bracketing.type=0;
1237}
1238
1239void bracketing_step(int when)
1240{
1241   if (conf.tv_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) shooting_tv_bracketing(when);
1242   else if (conf.av_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) shooting_av_bracketing(when);
1243                else if ((conf.iso_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.iso_bracket_koef)) shooting_iso_bracketing(when);
1244                         else if ((conf.subj_dist_bracket_value && !(conf.override_disable==1 && conf.override_disable_all)) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing(when);           
1245                                  else if ((conf.subj_dist_bracket_value) && (conf.subj_dist_bracket_koef)) shooting_subject_distance_bracketing(when) ;
1246}
1247
1248void shooting_bracketing(void)
1249
1250        short drive_mode=shooting_get_drive_mode();
1251        if (shooting_get_drive_mode()!=0) 
1252        {
1253                int m=mode_get()&MODE_SHOOTING_MASK;
1254                if (m!=MODE_STITCH && m!=MODE_SCN_BEST_IMAGE)
1255                {
1256                   if (state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) bracketing_reset() ;
1257                   bracketing_step(SET_NOW) ;
1258                }
1259        }
1260
1261}
1262
1263
1264#if CAM_REAR_CURTAIN
1265  void shooting_set_flash_sync_curtain(int curtain){
1266   _SetPropertyCase(PROPCASE_FLASH_SYNC_CURTAIN, &curtain, sizeof(curtain));
1267  }
1268#endif
1269
1270// forces manual flash. if set, flash will ALWAYS be triggered (manual)
1271        void shooting_set_flash_video_override(int flash, int power){
1272                int mode = 1;
1273                if ((conf.flash_manual_override && conf.flash_video_override && (movie_status > 1)) || (conf.flash_manual_override && !conf.flash_video_override)) {
1274                                                _SetPropertyCase(PROPCASE_FLASH_ADJUST_MODE, &mode, sizeof(mode));
1275                                                _SetPropertyCase(PROPCASE_FLASH_FIRE, &flash, sizeof(flash));
1276                                                _SetPropertyCase(PROPCASE_FLASH_MANUAL_OUTPUT, &power, sizeof(power));
1277                                        }
1278  }
1279
1280// TODO sd990 hack for overrides
1281// caller must save regs
1282int captseq_hack_override_active() {
1283 if (state_kbd_script_run)
1284        if ( photo_param_put_off.tv96 || photo_param_put_off.sv96 )
1285                return 1;
1286 if(conf.override_disable==1)
1287        return 0;
1288 if(conf.iso_override_value && conf.iso_override_koef)
1289        return 1;
1290 if((conf.tv_enum_type || conf.tv_override_value) && conf.tv_override_koef)
1291        return 1;
1292 return 0;
1293}
1294
1295extern int usb_remote_active ;
1296
1297void __attribute__((naked,noinline)) shooting_expo_param_override(void){
1298 asm volatile("STMFD   SP!, {R0-R12,LR}\n");
1299
1300 //if (conf.tv_override) shooting_set_tv96_direct(-384-32*conf.tv_override);
1301 //short drive_mode=shooting_get_drive_mode();
1302/*if(drive_mode!=last_drive_mode)
1303 {
1304  if (last_drive_mode==0) shoot_counter=0;
1305  last_drive_mode=drive_mode;
1306 }*/
1307 //int m=mode_get()&MODE_SHOOTING_MASK;
1308 
1309 if ( ((state_kbd_script_run) || (usb_remote_active)) && photo_param_put_off.tv96 ) {
1310  shooting_set_tv96_direct(photo_param_put_off.tv96, SET_NOW);
1311  photo_param_put_off.tv96=0;
1312 }
1313   else if (((conf.tv_enum_type) || (conf.tv_override_value)) && (conf.tv_override_koef) && !(conf.override_disable==1))
1314   {
1315           if (conf.tv_enum_type)
1316                        shooting_set_tv96_direct(32*(conf.tv_override_value-(tv_override_zero_shift)),SET_NOW);
1317           else
1318                        shooting_set_tv96_direct(shooting_get_tv96_from_shutter_speed(shooting_get_shutter_speed_override_value()), SET_NOW);
1319   }
1320   
1321 if (((state_kbd_script_run) || (usb_remote_active)) && (photo_param_put_off.sv96)) {
1322  shooting_set_sv96(photo_param_put_off.sv96, SET_NOW);
1323  photo_param_put_off.sv96=0;
1324  }
1325        else if ((conf.iso_override_value) && (conf.iso_override_koef) && !(conf.override_disable==1))
1326                shooting_set_iso_real(shooting_get_iso_override_value(), SET_NOW);
1327                else if (conf.autoiso_enable && shooting_get_flash_mode()/*NOT FOR FLASH AUTO MODE*/ && !(conf.override_disable==1 && conf.override_disable_all))
1328                shooting_set_autoiso(shooting_get_iso_mode());
1329               
1330 if (((state_kbd_script_run) || (usb_remote_active)) && (photo_param_put_off.av96)) {
1331  shooting_set_av96_direct(photo_param_put_off.av96, SET_NOW);
1332  photo_param_put_off.av96=0;
1333  }
1334 else if (conf.av_override_value && !(conf.override_disable==1))
1335 shooting_set_av96_direct(shooting_get_av96_override_value(), SET_NOW);
1336 
1337 if (((state_kbd_script_run) || (usb_remote_active)) && (photo_param_put_off.subj_dist)) {
1338  shooting_set_focus(photo_param_put_off.subj_dist, SET_NOW);
1339  photo_param_put_off.subj_dist=0;
1340  }
1341  else if ((conf.subj_dist_override_value) && (conf.subj_dist_override_koef) && !(conf.override_disable==1))
1342   shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1343   
1344#if CAM_HAS_ND_FILTER
1345 if ((state_kbd_script_run) && (photo_param_put_off.nd_filter)) {
1346   shooting_set_nd_filter_state(photo_param_put_off.nd_filter, SET_NOW);
1347   photo_param_put_off.nd_filter=0;
1348  }
1349 else if (conf.nd_filter_state && !(conf.override_disable==1))
1350   shooting_set_nd_filter_state(conf.nd_filter_state, SET_NOW);
1351#endif
1352
1353#if CAM_REAR_CURTAIN
1354  shooting_set_flash_sync_curtain(conf.flash_sync_curtain);
1355#endif
1356
1357
1358  shooting_set_flash_video_override(conf.flash_manual_override,conf.flash_video_override_power);
1359#if CAM_QUALITY_OVERRIDE
1360 // this doesn't really need to be set in the override hook.
1361 // should only need to be set once if the users doesn't change back, but doing it here ensures it is set
1362 shooting_set_image_quality(conf.fast_image_quality);
1363#endif
1364
1365 asm volatile("LDMFD   SP!, {R0-R12,PC}\n");
1366}
1367void unlock_optical_zoom(void){
1368
1369#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
1370 if (conf.unlock_optical_zoom_for_video) _UnsetZoomForMovie();
1371#endif
1372
1373#if CAM_EV_IN_VIDEO
1374 set_ev_video_avail(0);
1375#endif
1376
1377}
1378
1379
1380#if CAM_EV_IN_VIDEO
1381
1382int ev_video_avail;
1383int ev_video;
1384int save_tv_video;
1385int tv_min_video;
1386
1387int get_ev_video_avail(void){
1388 return ev_video_avail;
1389}
1390
1391void set_ev_video_avail(int x){
1392 if (ev_video_avail==x) return;
1393 ev_video_avail=x;
1394 if (x) {
1395  ev_video=0;
1396  _ExpCtrlTool_StopContiAE(0,0);
1397  _GetPropertyCase(PROPCASE_TV,&save_tv_video,2);
1398  if ((mode_get()&MODE_SHOOTING_MASK)==MODE_VIDEO_SPEED) tv_min_video=577;  // 1/60
1399   else tv_min_video=480; //1/30
1400 }
1401 else _ExpCtrlTool_StartContiAE(0,0);
1402}
1403
1404int get_ev_video(void){
1405 return ev_video;
1406}
1407
1408void set_ev_video(int x){
1409 short ev, tv;
1410 if ((x<-4)||(x>4)) return;
1411 ev=48*x;
1412 tv=save_tv_video-ev;
1413 if (tv>=tv_min_video) {
1414  ev_video=x;
1415  _SetAE_ShutterSpeed(&tv);
1416 }
1417}
1418
1419#endif
1420
1421int shooting_mode_canon2chdk(int canonmode) {
1422        int i;
1423        for (i=0; i < MODESCNT; i++) {
1424                if (modemap[i].canonmode == canonmode)
1425                        return modemap[i].hackmode;
1426        }
1427        return 0;
1428}
1429
1430int shooting_mode_chdk2canon(int hackmode) {
1431        int i;
1432        for (i=0; i < MODESCNT; i++) {
1433                if (modemap[i].hackmode == hackmode)
1434                        return modemap[i].canonmode;
1435        }
1436        return -1; // 0 is a valid mode on old cameras!
1437}
1438
1439int shooting_set_mode_chdk(int mode) {
1440        int canonmode = shooting_mode_chdk2canon(mode);
1441        if (canonmode == -1 || !rec_mode_active())
1442                return 0;
1443        _SetCurrentCaptureModeType(canonmode);
1444        // TODO since mode seems to be fully set when this returns,
1445        // we could check if it worked
1446        return 1;
1447}
1448
1449int shooting_set_mode_canon(int canonmode) {
1450        if(canonmode == -1 || !rec_mode_active())
1451                return 0;
1452        _SetCurrentCaptureModeType(canonmode);
1453        return 1;
1454}
1455
1456// override in platform/<cam>/main.c if playrec_mode is not found or different
1457int __attribute__((weak)) rec_mode_active(void) {
1458    return (playrec_mode==2 || playrec_mode==4 || playrec_mode==5);
1459}
1460
1461// Converted from MODE_IS_VIDEO macro (philmoz July 2011)
1462int mode_is_video(int m)
1463{
1464    m = m & MODE_SHOOTING_MASK;
1465    return (m==MODE_VIDEO_STD ||
1466            m==MODE_VIDEO_SPEED ||
1467            m==MODE_VIDEO_COMPACT ||
1468            m==MODE_VIDEO_MY_COLORS ||
1469            m==MODE_VIDEO_COLOR_ACCENT ||
1470            m==MODE_VIDEO_COLOR_SWAP ||
1471            m==MODE_VIDEO_MINIATURE ||
1472            m==MODE_VIDEO_TIME_LAPSE ||
1473            m==MODE_VIDEO_PORTRAIT ||
1474            m==MODE_VIDEO_NIGHT ||
1475            m==MODE_VIDEO_INDOOR ||
1476            m==MODE_VIDEO_FOLIAGE ||
1477            m==MODE_VIDEO_SNOW  ||
1478            m==MODE_VIDEO_BEACH ||
1479            m==MODE_VIDEO_AQUARIUM ||
1480            m==MODE_VIDEO_SUPER_MACRO ||
1481            m==MODE_VIDEO_STITCH ||
1482            m==MODE_VIDEO_MANUAL ||
1483            m==MODE_VIDEO_MINIATURE ||
1484            m==MODE_VIDEO_IFRAME_MOVIE
1485// not clear if this should be considered a video mode ?
1486/*            m==MODE_VIDEO_MOVIE_DIGEST*/
1487            );
1488}
1489
1490// currently nothing needs to override this, so not weak
1491int /*__attribute__((weak))*/ mode_get(void) {
1492    int mode, t=0xFF;
1493
1494    mode = (rec_mode_active())?MODE_REC:MODE_PLAY;
1495
1496#ifdef CAM_SWIVEL_SCREEN
1497    mode |= (screen_opened())?MODE_SCREEN_OPENED:0;
1498    mode |= (screen_rotated())?MODE_SCREEN_ROTATED:0;
1499#endif
1500
1501    _GetPropertyCase(PROPCASE_SHOOTING_MODE, &t, 4);
1502        mode |= shooting_mode_canon2chdk(t);
1503
1504    return (mode);
1505}
1506
1507// Only needed on VxWorks
1508#if CAM_DRAW_EXPOSITION
1509
1510// compare PROPCASE_TV with shutter_speeds_table
1511char* shooting_get_tv_str() {
1512    short int tvv;
1513    long i;
1514    _GetPropertyCase(PROPCASE_TV, &tvv, sizeof(tvv));
1515    for(i=0; i<SS_SIZE; i++) {
1516        if(shutter_speeds_table[i].prop_id >= tvv)
1517            return (char*)shutter_speeds_table[i].name;
1518    }
1519    return (void*)"?";
1520}
1521
1522// compare PROPCASE_AV with aperture_sizes_table
1523char* shooting_get_av_str() {
1524    short int avv;
1525    long i;
1526    _GetPropertyCase(PROPCASE_AV, &avv, sizeof(avv));
1527    for(i=0; i<AS_SIZE; i++) {
1528        if(aperture_sizes_table[i].prop_id == avv)
1529            return (char*)aperture_sizes_table[i].name;
1530    }
1531    return (char*) "?";
1532}
1533
1534#endif
1535
1536/*
1537char* shooting_get_iso_str() {
1538    short int isov;
1539    long i;
1540    _GetPropertyCase(PROPCASE_ISO_MODE, &isov, sizeof(isov));
1541    for(i=0; i<ISO_SIZE; i++) {
1542        if(iso_table[i].prop_id == isov)
1543            return (char*)iso_table[i].name;
1544    }
1545    return (char*) "?";
1546}
1547*/
Note: See TracBrowser for help on using the repository browser.