Index: apps/plugins/mandelbrot.c =================================================================== --- apps/plugins/mandelbrot.c (revision 24079) +++ apps/plugins/mandelbrot.c (working copy) @@ -292,7 +292,7 @@ #define MANDELBROT_ZOOM_IN BUTTON_RIGHT #define MANDELBROT_ZOOM_OUT BUTTON_LEFT #define MANDELBROT_MAXITER_INC BUTTON_VOL_UP -#define MANDELBROT_MAXITER_DEV BUTTON_VOL_DOWN +#define MANDELBROT_MAXITER_DEC BUTTON_VOL_DOWN #define MANDELBROT_RESET BUTTON_MENU #elif CONFIG_KEYPAD == ONDAVX747_PAD || CONFIG_KEYPAD == MROBE500_PAD @@ -367,6 +367,8 @@ #define MYXLCD(fn) xlcd_ ## fn #endif +#define BUTTON_YIELD_TIMEOUT (HZ / 4) + /* Fixed point format s5.26: sign, 5 bits integer part, 26 bits fractional part */ static long x_min; static long x_max; @@ -612,9 +614,41 @@ recalc_parameters(); } -void calc_mandelbrot_low_prec(void) +long check_button(void) { - long start_tick, last_yield; + long button; + + button = rb->button_get(false); + if (button == BUTTON_NONE) + return BUTTON_NONE; + switch (button) + { + case MANDELBROT_QUIT: + case MANDELBROT_UP: + case MANDELBROT_DOWN: + case MANDELBROT_LEFT: + case MANDELBROT_RIGHT: + case MANDELBROT_ZOOM_IN: + case MANDELBROT_ZOOM_OUT: + case MANDELBROT_MAXITER_INC: + case MANDELBROT_MAXITER_DEC: + case MANDELBROT_RESET: +#ifdef MANDELBROT_ZOOM_IN2 + case MANDELBROT_ZOOM_IN2: +#endif +#ifdef MANDELBROT_ZOOM_IN_PRE + case MANDELBROT_ZOOM_IN_PRE: +#endif + return button; + break; + default: + return BUTTON_NONE; + break; + } +} + +long calc_mandelbrot_low_prec(void) +{ #ifndef USEGSLIB long next_update = *rb->current_tick; int last_px = px_min; @@ -623,9 +657,10 @@ long a32, b32; short x, x2, y, y2, a, b; int p_x, p_y; + unsigned long last_yield = *rb->current_tick; + unsigned long last_button_yield = *rb->current_tick; + long button; - start_tick = last_yield = *rb->current_tick; - for (p_x = 0, a32 = x_min; p_x < px_max; p_x++, a32 += x_step) { if (p_x < px_min) continue; @@ -659,6 +694,13 @@ rb->yield(); last_yield = *rb->current_tick; } + + if (TIME_AFTER(*rb->current_tick, last_button_yield)) + { + if ((button = check_button()) != BUTTON_NONE) + return button; + last_button_yield = *rb->current_tick + BUTTON_YIELD_TIMEOUT; + } } #ifdef USEGSLIB grey_ub_gray_bitmap_part(imgbuffer, 0, py_min, 1, @@ -675,11 +717,12 @@ } #endif } + + return BUTTON_NONE; } -void calc_mandelbrot_high_prec(void) +long calc_mandelbrot_high_prec(void) { - long start_tick, last_yield; #ifndef USEGSLIB long next_update = *rb->current_tick; int last_px = px_min; @@ -687,9 +730,11 @@ unsigned n_iter; long x, x2, y, y2, a, b; int p_x, p_y; + unsigned long last_yield = *rb->current_tick; + unsigned long last_button_yield = *rb->current_tick; + long button; MULS32_INIT(); - start_tick = last_yield = *rb->current_tick; for (p_x = 0, a = x_min; p_x < px_max; p_x++, a += x_step) { if (p_x < px_min) @@ -722,13 +767,20 @@ rb->yield(); last_yield = *rb->current_tick; } + + if (TIME_AFTER(*rb->current_tick, last_button_yield)) + { + if ((button = check_button()) != BUTTON_NONE) + return button; + last_button_yield = *rb->current_tick + BUTTON_YIELD_TIMEOUT; + } } #ifdef USEGSLIB grey_ub_gray_bitmap_part(imgbuffer, 0, py_min, 1, p_x, py_min, 1, py_max - py_min); #else rb->lcd_bitmap_part(imgbuffer, 0, py_min, 1, - p_x, py_min, 1, py_max-py_min); + p_x, py_min, 1, py_max - py_min); if ((p_x == px_max - 1) || TIME_AFTER(*rb->current_tick, next_update)) { next_update = *rb->current_tick + UPDATE_FREQ; @@ -738,6 +790,8 @@ } #endif } + + return BUTTON_NONE; } void cleanup(void *parameter) @@ -754,8 +808,8 @@ enum plugin_status plugin_start(const void* parameter) { - int button; - int lastbutton = BUTTON_NONE; + long button; + long lastbutton = BUTTON_NONE; int redraw = REDRAW_FULL; (void)parameter; @@ -782,6 +836,8 @@ /* main loop */ while (true) { + button = BUTTON_NONE; + if (redraw > REDRAW_NONE) { #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(true); @@ -792,21 +848,29 @@ } if (step_log2 <= -10) /* select precision */ - calc_mandelbrot_high_prec(); + button = calc_mandelbrot_high_prec(); else - calc_mandelbrot_low_prec(); + button = calc_mandelbrot_low_prec(); #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(false); #endif - px_min = 0; - px_max = LCD_WIDTH; - py_min = 0; - py_max = LCD_HEIGHT; - redraw = REDRAW_NONE; + if (button == BUTTON_NONE) + { + px_min = 0; + px_max = LCD_WIDTH; + py_min = 0; + py_max = LCD_HEIGHT; + redraw = REDRAW_NONE; + } + else + { + redraw = REDRAW_FULL; + } } - button = rb->button_get(true); + if (button == BUTTON_NONE) + button = rb->button_get(true); switch (button) { #ifdef MANDELBROT_RC_QUIT case MANDELBROT_RC_QUIT: @@ -852,8 +916,11 @@ y_max += y_delta; MYXLCD(scroll_down)(LCD_HEIGHT/8); MYLCD_UPDATE(); - py_max = (LCD_HEIGHT/8); - redraw = REDRAW_PARTIAL; + if (redraw != REDRAW_FULL) + { + py_max = (LCD_HEIGHT/8); + redraw = REDRAW_PARTIAL; + } break; case MANDELBROT_DOWN: @@ -861,8 +928,11 @@ y_max -= y_delta; MYXLCD(scroll_up)(LCD_HEIGHT/8); MYLCD_UPDATE(); - py_min = (LCD_HEIGHT-LCD_HEIGHT/8); - redraw = REDRAW_PARTIAL; + if (redraw != REDRAW_FULL) + { + py_min = (LCD_HEIGHT-LCD_HEIGHT/8); + redraw = REDRAW_PARTIAL; + } break; case MANDELBROT_LEFT: @@ -870,8 +940,11 @@ x_max -= x_delta; MYXLCD(scroll_right)(LCD_WIDTH/8); MYLCD_UPDATE(); - px_max = (LCD_WIDTH/8); - redraw = REDRAW_PARTIAL; + if (redraw != REDRAW_FULL) + { + px_max = (LCD_WIDTH/8); + redraw = REDRAW_PARTIAL; + } break; case MANDELBROT_RIGHT: @@ -879,8 +952,11 @@ x_max += x_delta; MYXLCD(scroll_left)(LCD_WIDTH/8); MYLCD_UPDATE(); - px_min = (LCD_WIDTH-LCD_WIDTH/8); - redraw = REDRAW_PARTIAL; + if (redraw != REDRAW_FULL) + { + px_min = (LCD_WIDTH-LCD_WIDTH/8); + redraw = REDRAW_PARTIAL; + } break; case MANDELBROT_MAXITER_DEC: