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

Revision 515, 32.6 KB checked in by reyalp, 5 years ago (diff)

set svn:eol-style and fix files that had mixed line endings. See http://chdk.setepontos.com/index.php/topic,2145.15.html

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