static void chdk_testing(chdk_heap *h) { // If defined the heap memory is allocated; but not used for CHDK. // It is filled with a guard value which is checked here // Any corruption is reported, otherwise 'OK' is displayed on screen (along with the heap memory start address). // check heap allocated memory for corruption unsigned long* p = (unsigned long*)h->start; unsigned long *f = 0, *l = 0; long cnt = 0; while (p < (unsigned long*)h->end) { if (p[0] != 0xDEADBEEF) { l = p; if (f == 0) f = p; cnt++; } p++; } char osd_buf[40]; if (cnt != 0) { sprintf(osd_buf, "s:%8x e:%8x", h->start, h->end); draw_txt_string(2, 12, osd_buf, conf.osd_color); sprintf(osd_buf, "f:%8x l:%8x c:%d", f, l, cnt); } else { sprintf(osd_buf, "OK 0x%x", h->start); } draw_txt_string(2, 13, osd_buf, conf.osd_color); // end of check }
//------------------------------------------------------------------- static void gui_debug_draw_values(const coord y, void* addr) { int i; if (!(addr<=(void*)MAXRAMADDR || addr>=(void*)ROMBASEADDR)) { addr = &dummy; }; sprintf(buf, "0x%08X (%10u)", *((unsigned int*)addr), *((unsigned int*)addr)); draw_txt_string(10, y, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); sprintf(buf, "0x%04X (%5hu)", *((unsigned short*)addr), *((unsigned short*)addr)); draw_txt_string(10, y+1, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); sprintf(buf, "0x%02X (%3hu)", *((unsigned char*)addr), *((unsigned char*)addr)); draw_txt_string(10, y+2, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); //sprintf(buf, "0x%lf", *((double*)addr)); //draw_txt_string(10, y+3, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); for (i=0; i<30; ++i) { if (*((char*)(addr+i))) buf[i]=*((char*)(addr+i)); else break; } while (i<30) { buf[i++]=' '; } buf[i]=0; draw_txt_string(10, y+4, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); }
static void gui_mem_info(char *typ, cam_meminfo *meminfo, int showidx) { char txt[50]; sprintf(txt,"%-5s: %08x-%08x: %d",typ,meminfo->start_address, meminfo->end_address, meminfo->total_size); draw_txt_string(0, 5+showidx, txt, MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); sprintf(txt,"alloc: now=%d(%d) max=%d", meminfo->allocated_size, meminfo->allocated_count, meminfo->allocated_peak); draw_txt_string(0, 6+showidx, txt, MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); sprintf(txt,"free: now=%d(%d) max=%d", meminfo->free_size, meminfo->free_block_count, meminfo->free_block_max_size); draw_txt_string(0, 7+showidx, txt, MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); }
void gui_module_draw() { int idx, showidx; if (modinspect_redraw) { draw_filled_rect(0, 0, camera_screen.width-1, camera_screen.height-1, MAKE_COLOR(SCREEN_COLOR, SCREEN_COLOR)); draw_txt_string(5, 0, "*** Module Inspector ***", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(0, 2, "Idx Name Addr Size", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); showidx=0; for ( idx=0; idx<20; idx++) { struct flat_hdr* flat = module_get_adr(idx); if (flat==0) continue; char namebuf[12]; memcpy(namebuf,flat->modulename,11); namebuf[11]=0; char txt[50]; sprintf(txt,"%02d: %-12s %08x - %d bytes", idx, namebuf, (unsigned)flat, flat->reloc_start); draw_txt_string(0, 3+showidx, txt, MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); showidx++; } // sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), core_get_free_memory(), MEMISOSIZE, &_start, &_end); // sprintf(buf,"MEM %08x-%08x - %d free",&_start, &_end,core_get_free_memory()); // sprintf(buf,"--- %-12s %08x - %d","CHDK",&_start, MEMISOSIZE ); draw_txt_string(1, 4+showidx, "SET-redraw, DISP-unload_all, MENU-exit", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); cam_meminfo meminfo; // Display Canon heap memory info // amount of data displayed may vary depending on GetMemInfo implementation memset(&meminfo,0,sizeof(meminfo)); GetMemInfo(&meminfo); gui_mem_info("MEM", &meminfo, showidx); showidx += 3; // Display EXMEM memory info (only if enabled) memset(&meminfo,0,sizeof(meminfo)); if (GetExMemInfo(&meminfo)) { gui_mem_info("EXMEM", &meminfo, showidx); } } modinspect_redraw = 0; }
//------------------------------------------------------------------- static void gui_read_draw_clock() { static struct tm *ttm; ttm = get_localtime(); sprintf(buffer, "%2u:%02u", ttm->tm_hour, ttm->tm_min); draw_txt_string((camera_screen.width-camera_screen.ts_button_border)/FONT_WIDTH-2-1-1-9-2-5, 0, buffer, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); }
//------------------------------------------------------------------- static void gui_bench_draw_results(int pos, int value) { if (value!=-1) { if (value) sprintf(buf, "%7d Kb/s ", value/1024); else sprintf(buf, lang_str(LANG_BENCH_CALCULATING)); draw_txt_string(18, pos, buf, MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); } }
// Open a sub-menu void gui_activate_sub_menu(CMenu *sub_menu) { // push current menu on stack gui_menu_stack[gui_menu_stack_ptr].menu = curr_menu; gui_menu_stack[gui_menu_stack_ptr].curpos = gui_menu_curr_item; gui_menu_stack[gui_menu_stack_ptr].toppos = gui_menu_top_item; // Select first item in menu, (or none) if (conf.menu_select_first_entry) { gui_menu_set_curr_menu(sub_menu, 0, 0); if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK)==MENUITEM_TEXT || (curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK)==MENUITEM_SEPARATOR) { //++gui_menu_top_item; ++gui_menu_curr_item; } } else gui_menu_set_curr_menu(sub_menu, 0, -1); gui_menu_stack_ptr++; // FIXME check on stack overrun; if (gui_menu_stack_ptr > MENUSTACK_MAXDEPTH) { draw_txt_string(0, 0, "E1", MAKE_COLOR(COLOR_RED, COLOR_YELLOW)); gui_menu_stack_ptr = 0; } // Set active Tv override menu entry if present extern void set_tv_override_menu(CMenu *menu); set_tv_override_menu(curr_menu); // Force full redraw gui_menu_erase_and_redraw(); }
//------------------------------------------------------------------- void gui_bench_draw() { switch (bench_to_draw) { case 1: draw_filled_rect(0, 0, camera_screen.width-1, camera_screen.height-1, MAKE_COLOR(SCREEN_COLOR, SCREEN_COLOR)); draw_txt_string(1, 0, lang_str(LANG_BENCH_TITLE), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(1, 2, lang_str(LANG_BENCH_SCREEN), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 3, lang_str(LANG_BENCH_WRITE), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 4, lang_str(LANG_BENCH_READ), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(1, 6, lang_str(LANG_BENCH_MEMORY), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 7, lang_str(LANG_BENCH_WRITE), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 8, lang_str(LANG_BENCH_READ), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(1, 10, lang_str(LANG_BENCH_FLASH_CARD), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 11, lang_str(LANG_BENCH_WRITE_RAW), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 12, lang_str(LANG_BENCH_WRITE_MEM), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 13, lang_str(LANG_BENCH_WRITE_64K), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(3, 14, lang_str(LANG_BENCH_READ_64K), MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); /* no break here */ case 2: gui_bench_draw_results_screen(3, bench.screen_output_bps, camera_screen.buffer_size); gui_bench_draw_results_screen(4, bench.screen_input_bps, camera_screen.width * vid_get_viewport_height() * 3); gui_bench_draw_results(7, bench.memory_write_bps); gui_bench_draw_results(8, bench.memory_read_bps); gui_bench_draw_results(11, bench.disk_write_raw_bps); gui_bench_draw_results(12, bench.disk_write_mem_bps); gui_bench_draw_results(13, bench.disk_write_buf_bps); gui_bench_draw_results(14, bench.disk_read_buf_bps); bench_to_draw = 0; break; default: bench_to_draw = 0; break; } }
//------------------------------------------------------------------- void gui_debug_draw() { switch (debug_to_draw) { case 1: draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(SCREEN_COLOR, SCREEN_COLOR)); draw_txt_string(1, 0, "Address:", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(22, 0, "Incr:", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(39,0, "Auto:", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(1, 1, "Values:", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 2, "DWORD :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 3, "WORD :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 4, "BYTE :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 5, "DOUBLE :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 6, "STRING :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(1, 7, "Dereferencing:", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 8, "DWORD :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 9, "WORD :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 10, "BYTE :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 11, "DOUBLE :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); draw_txt_string(2, 12, "STRING :", MAKE_COLOR(SCREEN_COLOR, COLOR_WHITE)); debug_to_draw = 2; break; case 2: sprintf(buf, "0x%08X", addr); draw_txt_string(10, 0, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); sprintf(buf, "0x%08X", step); draw_txt_string(28, 0, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); sprintf(buf,"%0d",debug_cont_update); draw_txt_string(44, 0, buf, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); gui_debug_draw_values(2, addr); gui_debug_draw_values(8, *((void**)addr)); conf.mem_view_addr_init = (long)addr; if (debug_cont_update==0) debug_to_draw = 0; break; default: debug_to_draw = 0; break; } }
static void gui_osd_draw_movie_time_left() { static int card_used, init_space, elapsed, avg_use, time_left; static long init_time; static int record_running = 0; static int init = 0; static unsigned int skipcalls = 1; unsigned int hour=0, min=0, sec=0; twoColors col = user_color(conf.osd_color); if ((conf.show_movie_time > 0) && (camera_info.state.mode_video || is_video_recording()) && !camera_info.state.mode_play) { #if CAM_CHDK_HAS_EXT_VIDEO_MENU if (camera_info.state.mode_video || is_video_recording()) { // if manual adjust, show the field item to be adjusted // if any value overriden, show the override value #if !CAM_VIDEO_QUALITY_ONLY if ((conf.video_mode == 0 && conf.fast_movie_quality_control==1) || conf.video_bitrate != VIDEO_DEFAULT_BITRATE) { // gui_print_osd_state_string_chr("Bitrate: ",video_bitrate_strings[conf.video_bitrate]); sprintf(osd_buf, "Bit:%5s",gui_video_bitrate_enum(0,0)); draw_osd_string(conf.mode_video_pos, 0, 2*FONT_HEIGHT, osd_buf, col, conf.mode_video_scale); } #endif if ((conf.video_mode == 1 && conf.fast_movie_quality_control==1) || conf.video_quality != VIDEO_DEFAULT_QUALITY) { // gui_print_osd_state_string_int("Quality: ",conf.video_quality); sprintf(osd_buf, "Qual:%2i",conf.video_quality); draw_osd_string(conf.mode_video_pos, 0, 3*FONT_HEIGHT, osd_buf, col, conf.mode_video_scale); } // everything else is for when recording if (!is_video_recording()) { record_running = 0; init = 0; return; } } #endif if (movie_reset == 1) { init = 0; movie_reset = 0; } if (is_video_recording()) record_running = 1; else { record_running = 0; init = 0; } if (record_running == 1 && init == 0) { init = 1; init_space = GetFreeCardSpaceKb(); init_time = get_tick_count(); } if (init == 1) { card_used = init_space - GetFreeCardSpaceKb(); elapsed = (int) ( get_tick_count() - init_time ) / 1000; avg_use = card_used / elapsed; // running average Kb/sec time_left = (GetFreeCardSpaceKb() / avg_use); hour = time_left / 3600; min = (time_left % 3600) / 60; sec = (time_left % 3600) % 60; if (elapsed < 1) { sprintf(osd_buf, "Calc..."); draw_osd_string(conf.mode_video_pos, 0, 0, osd_buf, col, conf.mode_video_scale); } if (--skipcalls ==0) { if (elapsed > 1) { int time_yofst = 0; if (conf.show_movie_time == 3) { // Both lines displayed so offset time value below bit rate time_yofst = FONT_HEIGHT; } if (conf.show_movie_time & 2) { sprintf(osd_buf, "%04d KB/s", avg_use); draw_osd_string(conf.mode_video_pos, 0, 0, osd_buf, col, conf.mode_video_scale); } if (conf.show_movie_time & 1) { sprintf(osd_buf, "-%02d:%02d:%02d", hour, min, sec); draw_osd_string(conf.mode_video_pos, 0, time_yofst, osd_buf, col, conf.mode_video_scale); } #if CAM_CHDK_HAS_EXT_VIDEO_TIME if( (int)conf.ext_video_time == 1 ) { draw_txt_string(0, 13, lang_str(LANG_WARN_VIDEO_EXT_TIME), user_color(conf.osd_color_warn)); } #endif } skipcalls = conf.show_movie_refresh*5; } } } }
void core_spytask() { int cnt = 1; int i=0; // Init camera_info bits that can't be done statically camera_info_init(); spytask_can_start=0; #ifdef OPT_EXMEM_MALLOC extern void exmem_malloc_init(void); exmem_malloc_init(); #endif #ifdef CAM_CHDK_PTP extern void init_chdk_ptp_task(); init_chdk_ptp_task(); #endif while((i++<400) && !spytask_can_start) msleep(10); started(); msleep(50); finished(); #if !CAM_DRYOS drv_self_unhide(); #endif conf_restore(); extern void gui_init(); gui_init(); #if CAM_CONSOLE_LOG_ENABLED extern void cam_console_init(); cam_console_init(); #endif mkdir("A/CHDK"); mkdir("A/CHDK/FONTS"); mkdir("A/CHDK/SYMBOLS"); mkdir("A/CHDK/SCRIPTS"); mkdir("A/CHDK/LANG"); mkdir("A/CHDK/BOOKS"); mkdir("A/CHDK/MODULES"); mkdir("A/CHDK/MODULES/CFG"); mkdir("A/CHDK/GRIDS"); mkdir("A/CHDK/CURVES"); mkdir("A/CHDK/DATA"); mkdir("A/CHDK/LOGS"); mkdir("A/CHDK/EDGE"); // Calculate the value of get_tick_count() when the clock ticks over to the next second // Used to calculate the SubSecondTime value when saving DNG files. long t1, t2; t2 = time(0); do { t1 = t2; camera_info.tick_count_offset = get_tick_count(); t2 = time(0); msleep(10); } while (t1 != t2); camera_info.tick_count_offset = camera_info.tick_count_offset % 1000; // remote autostart if (conf.script_startup==1) { script_autostart(); } else if (conf.script_startup==2) { conf.script_startup=0; conf_save(); script_autostart(); } shooting_init(); while (1) { if ( memdmptick && (get_tick_count() >= memdmptick) ) { memdmptick = 0; dump_memory(); } // Change ALT mode if the KBD task has flagged a state change gui_activate_alt_mode(); #ifdef CAM_LOAD_CUSTOM_COLORS // Color palette function extern void load_chdk_palette(); load_chdk_palette(); #endif if (raw_data_available) { raw_process(); extern void hook_raw_save_complete(); hook_raw_save_complete(); raw_data_available = 0; #ifdef CAM_HAS_GPS if( (int)conf.gps_waypoint_save == 1 ) wegpunkt(); #endif continue; } if ((camera_info.state.state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) || recreview_hold) { if (((cnt++) & 3) == 0) gui_redraw(); } if (camera_info.state.state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) { if (conf.show_histo) histogram_process(); #ifdef OPT_EDGEOVERLAY if(((gui_get_mode()==GUI_MODE_NONE) || (gui_get_mode()==GUI_MODE_ALT)) && conf.edge_overlay_thresh && conf.edge_overlay_enable) { // We need to skip first tick because stability static int skip_counter=1; if (skip_counter>0) { skip_counter--; } else { libedgeovr->edge_overlay(); } } #endif } if ((camera_info.state.state_shooting_progress == SHOOTING_PROGRESS_PROCESSING) && (!shooting_in_progress())) { camera_info.state.state_shooting_progress = SHOOTING_PROGRESS_DONE; } i = 0; #ifdef DEBUG_PRINT_TO_LCD sprintf(osd_buf, "%d", cnt ); // modify cnt to what you want to display draw_txt_string(1, i++, osd_buf, conf.osd_color); #endif if (camera_info.perf.md_af_tuning) { sprintf(osd_buf, "MD last %-4d min %-4d max %-4d avg %-4d", camera_info.perf.af_led.last, camera_info.perf.af_led.min, camera_info.perf.af_led.max, (camera_info.perf.af_led.count>0)?camera_info.perf.af_led.sum/camera_info.perf.af_led.count:0); draw_txt_string(1, i++, osd_buf, conf.osd_color); } // Process async module unload requests module_tick_unloader(); msleep(20); chdk_started_flag=1; } }
//------------------------------------------------------------------- static void gui_read_draw_batt() { sprintf(buffer, "Batt:%3d%%", get_batt_perc()); draw_txt_string((camera_screen.width-camera_screen.ts_button_border)/FONT_WIDTH-2-1-1-9, 0, buffer, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); }
//------------------------------------------------------------------- void gui_read_draw(int enforce_redraw) { if (conf.reader_autoscroll && !pause && get_tick_count()-last_time >= conf.reader_autoscroll_delay*1000 && (conf.reader_pos+read_on_screen)<read_file_size) { conf.reader_pos += read_on_screen; read_to_draw = 1; } if (read_to_draw) { int n, i, ii, ll, new_word=1; xx=x; yy=y; lseek(read_file, conf.reader_pos, SEEK_SET); read_on_screen=0; while (yy<=y+h-rbf_font_height()) { n=read(read_file, buffer, READ_BUFFER_SIZE); if (n==0) { read_goto_next_line(); if (yy < y+h) draw_filled_rect(x, yy, x+w-1, y+h-1, MAKE_COLOR(BG_COLOR(conf.reader_color), BG_COLOR(conf.reader_color))); break; } i=0; while (i<n && yy<=y+h-rbf_font_height()) { switch (buffer[i]) { case '\r': new_word = 1; break; case '\n': read_goto_next_line(); new_word = 1; break; case '\t': buffer[i] = ' '; // no break here default: if (conf.reader_wrap_by_words) { if (buffer[i] == ' ') { new_word = 1; if (xx==x) //ignore leading spaces break; } else if (new_word) { new_word = 0; for (ii=i, ll=0; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } if (ii==n) { memcpy(buffer, buffer+i, n-i); n=ii=n-i; read_on_screen+=i; i=0; n+=read(read_file, buffer+n, READ_BUFFER_SIZE-n); for (; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } } if (xx+ll>=x+w && ll<w) { read_goto_next_line(); continue; } } } if (!read_fit_next_char(buffer[i])) { read_goto_next_line(); continue; } xx+=rbf_draw_char(xx, yy, buffer[i], conf.reader_color); break; } ++i; if (xx >= x+w) { xx = x; yy += rbf_font_height(); } } read_on_screen+=i; } sprintf(buffer, "(%3d%%) %d/%d ", (read_file_size)?(conf.reader_pos*100/read_file_size):0, conf.reader_pos, read_file_size); buffer[camera_screen.width/FONT_WIDTH]=0; draw_txt_string((camera_screen.ts_button_border/FONT_WIDTH), 0, buffer, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); //title infoline // scrollbar if (read_file_size) { i=h-1 -1; // full height n=i*read_on_screen/read_file_size; // bar height if (n<20) n=20; i=(i-n)*conf.reader_pos/read_file_size; // top pos draw_filled_rect(x+w+6+2, y+1, x+w+6+6, y+1+i, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); draw_filled_rect(x+w+6+2, y+i+n, x+w+6+6, y+h-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); draw_filled_rect(x+w+6+2, y+1+i, x+w+6+6, y+i+n, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE)); } else { draw_filled_rect((x+w)*FONT_WIDTH+2, y*FONT_HEIGHT+1, (x+w)*FONT_WIDTH+6, (y+h)*FONT_HEIGHT-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); } read_to_draw = 0; last_time = get_tick_count(); } gui_read_draw_batt(); gui_read_draw_clock(); }
void core_spytask() { int cnt = 1; int i=0; #ifdef CAM_HAS_GPS int gps_delay_timer = 200 ; int gps_state = -1 ; #endif #if (OPT_DISABLE_CAM_ERROR) extern void DisableCamError(); int dce_cnt=0; int dce_prevmode=0; int dce_nowmode; #endif parse_version(&chdk_version, BUILD_NUMBER, BUILD_SVNREV); // Init camera_info bits that can't be done statically camera_info_init(); spytask_can_start=0; extern void aram_malloc_init(void); aram_malloc_init(); extern void exmem_malloc_init(void); exmem_malloc_init(); #ifdef CAM_CHDK_PTP extern void init_chdk_ptp_task(); init_chdk_ptp_task(); #endif while((i++<400) && !spytask_can_start) msleep(10); started(); msleep(50); finished(); #if !CAM_DRYOS drv_self_unhide(); #endif conf_restore(); extern void gui_init(); gui_init(); #if CAM_CONSOLE_LOG_ENABLED extern void cam_console_init(); cam_console_init(); #endif static char *chdk_dirs[] = { "A/CHDK", "A/CHDK/FONTS", "A/CHDK/SYMBOLS", "A/CHDK/SCRIPTS", "A/CHDK/LANG", "A/CHDK/BOOKS", "A/CHDK/MODULES", "A/CHDK/MODULES/CFG", "A/CHDK/GRIDS", "A/CHDK/CURVES", "A/CHDK/DATA", "A/CHDK/LOGS", "A/CHDK/EDGE", }; for (i = 0; i < sizeof(chdk_dirs) / sizeof(char*); i++) mkdir_if_not_exist(chdk_dirs[i]); no_modules_flag = stat("A/CHDK/MODULES/FSELECT.FLT",0) ? 1 : 0 ; // Calculate the value of get_tick_count() when the clock ticks over to the next second // Used to calculate the SubSecondTime value when saving DNG files. long t1, t2; t2 = time(0); do { t1 = t2; camera_info.tick_count_offset = get_tick_count(); t2 = time(0); msleep(10); } while (t1 != t2); camera_info.tick_count_offset = camera_info.tick_count_offset % 1000; // remote autostart if (conf.script_startup==SCRIPT_AUTOSTART_ALWAYS) { script_autostart(); } else if (conf.script_startup==SCRIPT_AUTOSTART_ONCE) { conf.script_startup=SCRIPT_AUTOSTART_NONE; conf_save(); script_autostart(); } shooting_init(); while (1) { // Set up camera mode & state variables mode_get(); // update HDMI power override based on mode and remote settings #ifdef CAM_REMOTE_HDMI_POWER_OVERRIDE extern void update_hdmi_power_override(void); update_hdmi_power_override(); #endif extern void set_palette(); set_palette(); #if (OPT_DISABLE_CAM_ERROR) dce_nowmode = camera_info.state.mode_play; if (dce_prevmode==dce_nowmode) { //no mode change dce_cnt++; // overflow is not a concern here } else { //mode has changed dce_cnt=0; } if (dce_cnt==100) { // 1..2s past play <-> rec mode change DisableCamError(); } dce_prevmode=dce_nowmode; #endif if ( memdmptick && (get_tick_count() >= memdmptick) ) { memdmptick = 0; dump_memory(); } #ifdef CAM_HAS_GPS if ( --gps_delay_timer == 0 ) { gps_delay_timer = 50 ; if ( gps_state != (int)conf.gps_on_off ) { gps_state = (int)conf.gps_on_off ; init_gps_startup(!gps_state) ; } } #endif // Change ALT mode if the KBD task has flagged a state change gui_activate_alt_mode(); #ifdef CAM_LOAD_CUSTOM_COLORS // Color palette function extern void load_chdk_palette(); load_chdk_palette(); #endif if (raw_data_available) { raw_process(); extern void hook_raw_save_complete(); hook_raw_save_complete(); raw_data_available = 0; #ifdef CAM_HAS_GPS if (((int)conf.gps_on_off == 1) && ((int)conf.gps_waypoint_save == 1)) gps_waypoint(); #endif #if defined(CAM_CALC_BLACK_LEVEL) // Reset to default in case used by non-RAW process code (e.g. raw merge) camera_sensor.black_level = CAM_BLACK_LEVEL; #endif continue; } if ((camera_info.state.state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) || recreview_hold) { if (((cnt++) & 3) == 0) gui_redraw(); } if (camera_info.state.state_shooting_progress != SHOOTING_PROGRESS_PROCESSING) { if (conf.show_histo) libhisto->histogram_process(); if ((camera_info.state.gui_mode_none || camera_info.state.gui_mode_alt) && conf.edge_overlay_thresh && conf.edge_overlay_enable) { // We need to skip first tick because stability if (chdk_started_flag) { libedgeovr->edge_overlay(); } } } if ((camera_info.state.state_shooting_progress == SHOOTING_PROGRESS_PROCESSING) && (!shooting_in_progress())) { camera_info.state.state_shooting_progress = SHOOTING_PROGRESS_DONE; } i = 0; #ifdef DEBUG_PRINT_TO_LCD sprintf(osd_buf, "%d", cnt ); // modify cnt to what you want to display draw_txt_string(1, i++, osd_buf, user_color(conf.osd_color)); #endif #if defined(OPT_FILEIO_STATS) sprintf(osd_buf, "%3d %3d %3d %3d %3d %3d %3d %4d", camera_info.fileio_stats.fileio_semaphore_errors, camera_info.fileio_stats.close_badfile_count, camera_info.fileio_stats.write_badfile_count, camera_info.fileio_stats.open_count, camera_info.fileio_stats.close_count, camera_info.fileio_stats.open_fail_count, camera_info.fileio_stats.close_fail_count, camera_info.fileio_stats.max_semaphore_timeout); draw_txt_string(1, i++, osd_buf,user_color( conf.osd_color)); #endif if (camera_info.perf.md_af_tuning) { sprintf(osd_buf, "MD last %-4d min %-4d max %-4d avg %-4d", camera_info.perf.af_led.last, camera_info.perf.af_led.min, camera_info.perf.af_led.max, (camera_info.perf.af_led.count>0)?camera_info.perf.af_led.sum/camera_info.perf.af_led.count:0); draw_txt_string(1, i++, osd_buf, user_color(conf.osd_color)); } // Process async module unload requests module_tick_unloader(); msleep(20); chdk_started_flag=1; } }