It should always work with 1 button press to take the photo. However, the "mirror up" event may not always be detected correctly.
Here's some code to detect it:
1) enable cache hacks and add dm-spy.o to Makefile
2) patch debug.c as follows
--- a/src/debug.c Mon Oct 22 17:19:17 2012 +0300
+++ b/src/debug.c Mon Oct 22 18:50:17 2012 +0300
@@ -554,6 +554,10 @@
void run_test()
{
+ msleep(2000);
+ debug_intercept();
+ msleep(10000);
+ debug_intercept();
}
void run_in_separate_task(void (*priv)(void), int delta)
@@ -3583,7 +3587,7 @@
void spy_event(struct event * event)
{
- if (get_draw_event())
+ if (1)
{
static int kev = 0;
kev++;
@@ -3595,14 +3599,14 @@
event->obj ? ((int)event->obj & 0xf0000000 ? (int)event->obj : *(int*)(event->obj + 4)) : 0,
event->obj ? ((int)event->obj & 0xf0000000 ? (int)event->obj : *(int*)(event->obj + 8)) : 0,
event->arg);
- /* console_printf("Ev%d[%d]: p=%8x *o=%8x/%8x/%8x a=%8x\n",
+ DryosDebugMsg(0, 0, "Ev%d[%d]: p=%8x *o=%8x/%8x/%8x a=%8x\n",
kev,
event->type,
event->param,
event->obj ? ((int)event->obj & 0xf0000000 ? event->obj : *(uint32_t*)(event->obj)) : 0,
event->obj ? ((int)event->obj & 0xf0000000 ? event->obj : *(uint32_t*)(event->obj + 4)) : 0,
event->obj ? ((int)event->obj & 0xf0000000 ? event->obj : *(uint32_t*)(event->obj + 8)) : 0,
- event->arg);*/
+ event->arg);
}
}
3) enable MLU from Canon menu, run "don't click me", then, after logging message, press shutter once. Mirror should go up. Wait until the debug log gets saved.
4) In dm.log, you should see something about mirror, and some events containing something similar to 0x80xx1. This condition should match the event code you find:
((MEM(event->obj) & 0xFFFFF00F) == 0x80001) // OK on 5D3, 5D2, 550D, 600D, 500D, maybe others
On 500D, the "release" method seems to work perfect.
Edit: the latest code contains a fix for 5D2 with manual lenses, maybe it fixes some problems on the other cameras too.