/** * AF microadjustment functions: get_afma, set_afma */ #include "dryos.h" #include "property.h" #include "menu.h" #include "bmp.h" #include "lens.h" #include "afma.h" // camera-specific, in platform dir #ifdef CONFIG_AFMA_EXTENDED #define AFMA_MAX 100 #else #define AFMA_MAX 20 #endif // we have to wait until the AFMA change is operated into Canon firmware static int afma_ack = 0; static void afma_wait_ack() { for (int i = 0; i < 50; i++) { msleep(10); if (afma_ack) break; } } PROP_HANDLER(PROP_AFMA) { ASSERT(len == sizeof(afma_buf)); memcpy(afma_buf, buf, sizeof(afma_buf)); afma_ack = 1; } int get_afma(int mode) { if (mode == AFMA_MODE_AUTODETECT) mode = AFMA_MODE; #ifdef CONFIG_AFMA_WIDE_TELE if (mode == AFMA_MODE_PER_LENS) return (AFMA_PER_LENS_WIDE + AFMA_PER_LENS_TELE) / 2; else if (mode == AFMA_MODE_PER_LENS_WIDE) return AFMA_PER_LENS_WIDE; else if (mode == AFMA_MODE_PER_LENS_TELE) return AFMA_PER_LENS_TELE; #else if (mode == AFMA_MODE_PER_LENS) return AFMA_PER_LENS; #endif else if (mode == AFMA_MODE_ALL_LENSES) return AFMA_ALL_LENSES; return 0; } void set_afma(int value, int mode) { if (ml_shutdown_requested) return; value = COERCE(value, -AFMA_MAX, AFMA_MAX); if (mode == AFMA_MODE_AUTODETECT) mode = AFMA_MODE; if (mode == AFMA_MODE_DISABLED) {} // do nothing #ifdef CONFIG_AFMA_WIDE_TELE else if (mode == AFMA_MODE_PER_LENS) AFMA_PER_LENS_WIDE = AFMA_PER_LENS_TELE = value; else if (mode == AFMA_MODE_PER_LENS_WIDE) AFMA_PER_LENS_WIDE = value; else if (mode == AFMA_MODE_PER_LENS_TELE) AFMA_PER_LENS_TELE = value; #else else if (mode == AFMA_MODE_PER_LENS) AFMA_PER_LENS = value; #endif else if (mode == AFMA_MODE_ALL_LENSES) AFMA_ALL_LENSES = value; else return; // bad arguments AFMA_MODE = mode & 0xFF; afma_ack = 0; prop_request_change(PROP_AFMA, afma_buf, sizeof(afma_buf)); afma_wait_ack(); } void set_afma_mode(int mode) { AFMA_MODE = COERCE(mode, 0, 2); afma_ack = 0; prop_request_change(PROP_AFMA, afma_buf, sizeof(afma_buf)); afma_wait_ack(); } int get_afma_mode() { return AFMA_MODE; } int get_afma_max() { return AFMA_MAX; } int get_config_afma_wide_tele() { #ifdef CONFIG_AFMA_WIDE_TELE return 1; #else return 0; #endif }