source: trunk/platform/sx200is/main.c @ 839

Revision 839, 3.2 KB checked in by reyalp, 4 years ago (diff)

sx200 modemap fix from ADamb in http://chdk.setepontos.com/index.php/topic,3994.msg43290.html#msg43290

  • 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
6
7extern long link_bss_start;
8extern long link_bss_end;
9extern void boot();
10
11
12void startup()
13{
14        long *bss = &link_bss_start;
15        long *ptr;
16       
17        // sanity check
18        if ((long)&link_bss_end > (MEMISOSTART + MEMISOSIZE)){
19                started();
20                shutdown();
21        }
22
23        // initialize .bss senment
24        while (bss<&link_bss_end)
25                *bss++ = 0;
26
27        boot();
28}
29
30
31static struct {
32        int hackmode;
33        int canonmode;
34} modemap[] = {
35        { MODE_AUTO,               32768  },
36        { MODE_P,                  32772  },
37        { MODE_TV,                 32771  },
38        { MODE_AV,                 32770  },
39        { MODE_M,                  32769  },
40        { MODE_EASY,               33311  },
41        { MODE_PORTRAIT,           32781  },
42        { MODE_NIGHT_SNAPSHOT,     32779  },
43        { MODE_LANDSCAPE,          32780  },
44        { MODE_VIDEO_COLOR_ACCENT, 2599   },
45        { MODE_VIDEO_COLOR_SWAP,   2600   },
46        { MODE_VIDEO_STD,          2601   },
47        { MODE_KIDS_PETS,          32784  },
48        { MODE_INDOOR,             32785  },
49
50        { MODE_SCN_SUNSET,         16402  },
51        { MODE_SCN_NIGHT,          16398  },
52        { MODE_SCN_FIREWORK,       16406  },
53        { MODE_SCN_BEACH,          16405  },
54        { MODE_SCN_AQUARIUM,       16408  },
55        { MODE_SCN_FOLIAGE,        16403  },
56        { MODE_SCN_SNOW,           16404  },
57        { MODE_SCN_ISO_3200,       16413  },
58        { MODE_SCN_COLOR_ACCENT,   16923  },
59        { MODE_SCN_COLOR_SWAP,     16924  },
60        { MODE_SCN_STITCH,         16906  }
61
62};
63#define MODESCNT (sizeof(modemap)/sizeof(modemap[0]))
64
65//zoom position is get_parameter_data(87)
66static const struct {
67        int zp, fl;
68} fl_tbl[] = {
69  {   0,   5000},
70  {  16,   6800},
71  {  32,   9100},
72  {  62,  16200},
73  {  78,  22300},
74  { 102,  35900},
75  { 125,  60000},
76};
77#define NUM_FL (sizeof(fl_tbl)/sizeof(fl_tbl[0]))
78
79
80// Focal length range is 5.0 - 60,0 mm, 27.3 - 327.4 in 35-mm equivalent.
81// So, CF_EFL = 27.3/5.0*10000=54600 or327.4/60*10000=54566.6
82// diff = 54600 - 54566.6 = 33.3, split it 33.3 / 2 = 16.6
83// add to base 54566.6 + 16.6 = 54583.2
84// divide by 10 to avoid overflow in get_effective_focal_length()
85#define CF_EFL  5458
86const int zoom_points = 126;
87
88int get_effective_focal_length(int zp) {
89        return (CF_EFL*get_focal_length(zp))/1000;
90}
91
92int get_focal_length(int zp) {
93        int i;
94
95        if (zp<fl_tbl[0].zp)
96                return fl_tbl[0].fl;
97        else if (zp>fl_tbl[NUM_FL-1].zp)
98                return fl_tbl[NUM_FL-1].fl;
99        else
100                for (i=1; i<NUM_FL; ++i) {
101                        if (zp==fl_tbl[i-1].zp)
102                                return fl_tbl[i-1].fl;
103                        else if (zp==fl_tbl[i].zp)
104                                return fl_tbl[i].fl;
105                        else if (zp<fl_tbl[i].zp)
106                                return fl_tbl[i-1].fl+(zp-fl_tbl[i-1].zp)*(fl_tbl[i].fl-fl_tbl[i-1].fl)/(fl_tbl[i].zp-fl_tbl[i-1].zp);
107                }
108        return fl_tbl[NUM_FL-1].fl;
109}
110
111int get_zoom_x(int zp) {
112        return get_focal_length(zp)*10/fl_tbl[0].fl;
113}
114
115
116int mode_get() {
117    int mode, i, t=0xFF;
118    mode  = (playrec_mode==2 || playrec_mode==4 || playrec_mode==5)?MODE_REC:MODE_PLAY;
119
120    _GetPropertyCase(PROPCASE_SHOOTING_MODE, &t, 4);
121    for (i=0; i<MODESCNT; ++i) {
122        if (modemap[i].canonmode == t) {
123            return (mode | (modemap[i].hackmode & MODE_SHOOTING_MASK));
124        }
125    }
126    return (mode);
127}
128
129long get_vbatt_min()
130{
131        return 3280;  // min observed was 3.408, then it died
132}
133
134long get_vbatt_max()
135{
136        return 4057;  // fresh from change (actual was 4.127)
137}
138
Note: See TracBrowser for help on using the repository browser.