Thank you very much for your support.Maybe the light meter could work as a laser sensor?Or perhaps it could detect a lasers interference with something like the auto-focus.Perhaps this means of high speed triggering, with no external switching, may have advantages over others where it may be just a few cycles of the processor to activate.But in any case I think it would be a lot of fun and worth while to try it.
@Sergei / @0xAF:I am experiencing random camera lock-ups, that I cannot fix myself, and would like to hear your opinion on this. As far as I know, the symptoms when this happens are:* Just after a shot has been taken, all buttons stop responding, and the display does not show our overlay.* Camera can take another photograph, however (but it does not get to the CF card)* Finally, the display goes off, and the camera is completely locked (it cannot even be turned off).In 400plus, we always overlay something on the display, so my first suspect was the overlay code; I commented out that part, and it seems to work (but you can never be sure with random bugs). This would confirm that the source of the problem is in the overlay code.Now, how can it be possible that we always overlay something, but I see nothing in the display? So, my next suspect is the pointer to the display that we receive: if we received a wrong pointer, we would be writing somewhere else in the memory, and that could explain the lock-up.I tried to log the value that we receive in that parameter, and it seems to be constant (I could not reproduce the issue and see what value we received when it happens, however); there is also that weird constant value that we add to the pointer.And this is all I know about this issue... I have been banging my head against the code for weeks, but I cannot find anything else. Do you have any ideas, please?Many thanks!Edu.
void *hack_invert_olc_screen1(char *dst, char *src, int size) { display_overlay(src); if ( settings.invert_olc && (FLAG_GUI_MODE == GUIMODE_OLC)) { while (size--) { *dst++ = olc_colors_map[settings.invert_olc] - (*src++); } return dst; } return memcpy(dst, src, size);}void *hack_invert_olc_screen2(char *dst, char *src, int size) { if ( settings.invert_olc && (FLAG_GUI_MODE == GUIMODE_ACTIVESWEEP_OLC)) { while (size--) { *dst++ = olc_colors_map[settings.invert_olc] - (*src++); } return dst; } return memcpy(dst, src, size);}
May thanks to both 0xAF and Sergei for your help; I will try your advice and report back.
Sorry Edu, I was out of reach in the weekend, I cannot promise my free time soon... I will do my best, though!
TransferScreen = my_TransferScreen;
int my_TransferScreen(int r0, int r1, int r2, int r3, int a, int b, int c, int d) { display_overlay((uint8_t*)(r3 + 0x78)); return TransferNormalScreen(r0, r1, r2, r3, a, b, c, d);}
void display_overlay(uint8_t *vram_address) { char buffer[LP_MAX_WORD]; if (FLAG_GUI_MODE == GUIMODE_OLC && AE_IS_CREATIVE(DPData.ae)) { int current_cmode = get_current_cmode(); if (status.msm_active) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 35, 96, "[***]"); else if (status.cmode_active && current_cmode != CMODE_NONE) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 16, 96, "%s", cmodes_config.names[current_cmode]); if (status.fexp && DPData.tv_val != TV_VAL_BULB) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 138, 32, "#"); if (settings.autoiso_enable && (DPData.ae != AE_MODE_M || DPData.tv_val != TV_VAL_BULB)) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 237, 14, "%s", AUTOISO_AUTO); if (DPData.wb == WB_MODE_COLORTEMP) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 50, 138, "%d", DPData.color_temp); if (DPData.ae_bkt) { ec_print(buffer, DPData.ae_bkt); bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_GRAY), 224, 96, "%s", buffer); }#ifdef RELEASE bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_BLUE), 148, 0, LP_WORD(L_P_400PLUS));#else bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_BLACK, COLOR_RED ), 20, 0, LP_WORD(L_A_WARNING));#endif if (*display_message) { if(timestamp() < message_timeout) bmp_printf(vram_address, FONT(FONT_SMALL, COLOR_WHITE, COLOR_BLACK), 16, 228, display_message); else *display_message = '\0'; } }}
Well, guess what? Yes, I hear the accusing beep now and then, but one hundred photographs later the camera hasn't failed once. So, adding some innocent code inside display_overlay seems to fix the issue, but I haven't the slightest idea of why...
Started by gdharmraj General Chat
Started by Foldesa General Discussion and Assistance
Started by krillik General Chat
Started by searchlight DSLR Hack development
Started by koy1 DSLR Hack development