/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { (void)parameter; int ret; rb->lcd_setfont(FONT_SYSFIXED); #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); #endif #ifdef HAVE_LCD_COLOR rb->lcd_set_background(LCD_BLACK); rb->lcd_set_foreground(LCD_WHITE); #endif /* Turn off backlight timeout */ backlight_ignore_timeout(); rb->srand( *rb->current_tick ); configfile_load(CFG_FILE, config, 1, 0); chopper_load(true); ret = chopGameLoop(); configfile_save(CFG_FILE, config, 1, 0); rb->lcd_setfont(FONT_UI); /* Turn on backlight timeout (revert to settings) */ backlight_use_settings(); return ret; }
enum plugin_status plugin_start(const void* parameter) { (void)parameter; #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); #endif /* Turn off backlight timeout */ backlight_ignore_timeout(); #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256) rb->lcd_set_mode(LCD_MODE_PAL256); #endif return main(); }
enum plugin_status plugin_start (const void *parameter) { (void) parameter; rb->srand (*rb->current_tick); /* Load HighScore if any */ highscore_load(SCORE_FILE, highscores, NUM_SCORES); #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); #endif #ifdef HAVE_LCD_BITMAP rb->lcd_setfont (FONT_SYSFIXED); #else if (!pgfx_init(4, 2)) { rb->splash(HZ*2, "Old LCD :("); return PLUGIN_OK; } #endif /* Turn off backlight timeout */ backlight_ignore_timeout(); load_game(); resume_file = resume; while(!rockblox_loop()) { if(!resume) { int position = highscore_update(rockblox_status.score, rockblox_status.level, "", highscores, NUM_SCORES); if (position != -1) { if (position == 0) rb->splash(HZ*2, "New High Score"); highscore_show(position, highscores, NUM_SCORES, true); } } } #ifndef HAVE_LCD_BITMAP pgfx_release(); #endif /* Save user's HighScore */ highscore_save(SCORE_FILE, highscores, NUM_SCORES); backlight_use_settings(); return PLUGIN_OK; }
enum plugin_status plugin_start(const void* parameter) { int ret; (void)parameter; /* Turn off backlight timeout */ backlight_ignore_timeout(); ret = plugin_main(); /* Turn on backlight timeout (revert to settings) */ backlight_use_settings(); return ret; }
/* plugin entry point */ enum plugin_status plugin_start(const void* parameter) { #if (CONFIG_PLATFORM & PLATFORM_NATIVE) char str[32]; int cpu_freq; #endif /* standard stuff */ (void)parameter; #ifdef HAVE_TOUCHSCREEN rb->touchscreen_set_mode(rb->global_settings->touch_mode); #endif log_init(); #if (CONFIG_PLATFORM & PLATFORM_NATIVE) cpu_freq = *rb->cpu_frequency; /* remember CPU frequency */ #endif backlight_ignore_timeout(); time_main_update(); rb->sleep(HZ); #if defined(HAVE_LCD_COLOR) && (MEMORYSIZE > 2) time_main_yuv(); #endif #if LCD_DEPTH < 4 time_greyscale(); #endif #ifdef HAVE_REMOTE_LCD time_remote_update(); #endif #if (CONFIG_PLATFORM & PLATFORM_NATIVE) if (*rb->cpu_frequency != cpu_freq) rb->snprintf(str, sizeof(str), "CPU clock changed!"); else rb->snprintf(str, sizeof(str), "CPU: %d MHz", (cpu_freq + 500000) / 1000000); log_text(str); #endif backlight_use_settings(); /* wait until user closes plugin */ plugin_quit(); return PLUGIN_OK; }
static int rockblox_loop (void) { int button; #if defined(ROCKBLOX_OFF_PRE) || defined(ROCKBLOX_DROP_PRE) int lastbutton = BUTTON_NONE; #endif long next_down_tick = *rb->current_tick + level_speed(rockblox_status.level); if (rockblox_menu()) { return 1; } resume = false; resume_file = false; while (1) { #ifdef HAS_BUTTON_HOLD if (rb->button_hold ()) { /* Turn on backlight timeout (revert to settings) */ backlight_use_settings(); rb->splash(0, "Paused"); while (rb->button_hold ()) rb->sleep(HZ/10); /* Turn off backlight timeout */ backlight_ignore_timeout(); /* get rid of the splash text */ rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT); show_details (); #ifdef HIGH_SCORE_Y show_highscores (); #endif draw_next_block (); refresh_board (); } #endif button = rb->button_get_w_tmo (MAX(next_down_tick - *rb->current_tick, 1)); switch (button) { #ifdef ROCKBLOX_RC_OFF case ROCKBLOX_RC_OFF: #endif case ROCKBLOX_OFF: #ifdef ROCKBLOX_OFF_PRE if (lastbutton != ROCKBLOX_OFF_PRE) break; #endif resume = true; return 0; break; #if defined(ROCKBLOX_ROTATE) case ROCKBLOX_ROTATE: #endif case ROCKBLOX_ROTATE_CCW: case ROCKBLOX_ROTATE_CCW | BUTTON_REPEAT: #ifdef HAVE_SCROLLWHEEL /* if the wheel is disabled, add an event to the stack. */ if(wheel_enabled == false) wheel_events++; /* if it's enabled, go ahead and rotate.. */ if(wheel_enabled) #endif #ifdef ROCKBLOX_ROTATE_CCW2 /* fallback */ case ROCKBLOX_ROTATE_CCW2: #endif move_block (0, 0, (rockblox_status.co + 1) % figures[rockblox_status.cf].max_or); break; case ROCKBLOX_ROTATE_CW: case ROCKBLOX_ROTATE_CW | BUTTON_REPEAT: #ifdef HAVE_SCROLLWHEEL if(wheel_enabled == false) wheel_events++; if(wheel_enabled) #endif #ifdef ROCKBLOX_ROTATE_CW2 /* fallback */ case ROCKBLOX_ROTATE_CW2: #endif move_block (0, 0, (rockblox_status.co + figures[rockblox_status.cf].max_or - 1) % figures[rockblox_status.cf].max_or); break; case ROCKBLOX_DOWN: case ROCKBLOX_DOWN | BUTTON_REPEAT: move_block (0, 1, rockblox_status.co); break; case ROCKBLOX_RIGHT: case ROCKBLOX_RIGHT | BUTTON_REPEAT: move_block (1, 0, rockblox_status.co); break; case ROCKBLOX_LEFT: case ROCKBLOX_LEFT | BUTTON_REPEAT: move_block (-1, 0, rockblox_status.co); break; case ROCKBLOX_DROP: #ifdef ROCKBLOX_DROP_PRE if (lastbutton != ROCKBLOX_DROP_PRE) break; #endif while (canMoveTo (rockblox_status.cx, rockblox_status.cy + 1, rockblox_status.co)) move_block (0, 1, rockblox_status.co); rockblox_status.dropped = true; break; #ifdef ROCKBLOX_RESTART case ROCKBLOX_RESTART: rb->splash (HZ * 1, "Restarting..."); init_rockblox (false); break; #endif default: if (rb->default_event_handler (button) == SYS_USB_CONNECTED) return PLUGIN_USB_CONNECTED; break; } #if defined(ROCKBLOX_OFF_PRE) || defined(ROCKBLOX_DROP_PRE) if (button != BUTTON_NONE) lastbutton = button; #endif #ifdef HAVE_SCROLLWHEEL /* check if we should enable the scroll wheel, if events * begin to stack up... */ if(wheel_enabled == false) { /* stopped rotating the wheel, reset the count */ if(wheel_events == last_wheel_event) { last_wheel_event = 0; wheel_events = 0; } /* rotated the wheel a while constantly, enable it. */ else if(wheel_events > 3) { wheel_enabled = true; } /* this evens out the last event and the "current" event. * if we get an event next time through button reading, it will * remain ahead of last_event. if we don't, they'll end up equaling * each other.. thus, the scroll count will be reset. */ if(wheel_enabled == false && wheel_events > last_wheel_event) last_wheel_event++; } #endif if (TIME_AFTER(*rb->current_tick, next_down_tick)) { move_down (); next_down_tick += level_speed(rockblox_status.level); if (TIME_AFTER(*rb->current_tick, next_down_tick)) /* restart time "raster" when we had to wait longer than usual * (pause, game restart etc) */ next_down_tick = *rb->current_tick + level_speed(rockblox_status.level); } if (rockblox_status.gameover) { #if LCD_DEPTH >= 2 rb->lcd_set_foreground (LCD_BLACK); #endif show_game_over(); resume = false; return 0; } refresh_board (); } return 0; }
enum plugin_status plugin_start(const void* parameter) { int button; #ifdef MAZE_NEW_PRE int lastbutton = BUTTON_NONE; #endif int quit = 0; struct maze maze; (void)parameter; /* Turn off backlight timeout */ backlight_ignore_timeout(); /* Seed the RNG */ rb->srand(*rb->current_tick); FOR_NB_SCREENS(i) rb->screens[i]->set_viewport(NULL); /* Draw the background */ #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); #if LCD_DEPTH >= 16 rb->lcd_set_foreground(LCD_RGBPACK( 0, 0, 0)); rb->lcd_set_background(LCD_RGBPACK(182, 198, 229)); /* rockbox blue */ #elif LCD_DEPTH == 2 rb->lcd_set_foreground(0); rb->lcd_set_background(LCD_DEFAULT_BG); #endif #endif /* Initialize and draw the maze */ maze_init(&maze); maze_generate(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); while(!quit) { #ifdef __PLUGINLIB_ACTIONS_H__ button = pluginlib_getaction(TIMEOUT_BLOCK, plugin_contexts, ARRAYLEN(plugin_contexts)); #else button = rb->button_get(true); #endif switch(button) { case MAZE_NEW: #ifdef MAZE_NEW_PRE if(lastbutton != MAZE_NEW_PRE) break; #endif maze_init(&maze); maze_generate(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_SOLVE: maze_solve(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_UP: case MAZE_UP_REPEAT: maze_move_player_up(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_RIGHT: case MAZE_RIGHT_REPEAT: maze_move_player_right(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_DOWN: case MAZE_DOWN_REPEAT: maze_move_player_down(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_LEFT: case MAZE_LEFT_REPEAT: maze_move_player_left(&maze); FOR_NB_SCREENS(i) maze_draw(&maze, rb->screens[i]); break; case MAZE_QUIT: /* quit plugin */ quit=1; break; default: if (rb->default_event_handler(button) == SYS_USB_CONNECTED) { /* quit plugin */ quit=2; } break; } #ifdef MAZE_NEW_PRE if( button != BUTTON_NONE ) lastbutton = button; #endif } /* Turn on backlight timeout (revert to settings) */ backlight_use_settings(); return ((quit == 1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED); }
static void color_to_resistance(void) { backlight_ignore_timeout(); bool quit = false; int button_input = 0; /* The colors of the bands */ enum color first_band = 0; enum color second_band = 0; enum color third_band = 0; enum color fourth_band = 0; int total_resistance_centiunits = 0; char total_resistance_str [35]; rb->splash(HZ/2, "Colour to resistance"); rb->lcd_clear_display(); while(!quit) { first_band = do_first_band_menu(); if(first_band==RES_INVALID) break; second_band = do_second_band_menu(); if(second_band==RES_INVALID) break; third_band = do_third_band_menu(); if(third_band==RES_INVALID) break; fourth_band = do_fourth_band_menu(); if(third_band==RES_INVALID) break; total_resistance_centiunits = calculate_resistance(first_band, second_band, third_band); rb->lcd_clear_display(); lineno = INITIAL_TEXT_Y; #ifndef USE_TEXT_ONLY draw_resistor(first_band, second_band, third_band, fourth_band); #endif draw_resistor_text(first_band, second_band, third_band, fourth_band); if(total_resistance_centiunits % 100 == 0) { /* No decimals */ rb->snprintf(total_resistance_str, sizeof(total_resistance_str), "Resistance: %d %s", total_resistance_centiunits/100, unit_abbrev); } else { rb->snprintf(total_resistance_str, sizeof(total_resistance_str), "Resistance: %d.%2.2d %s", total_resistance_centiunits/100, total_resistance_centiunits%100, unit_abbrev); } display->set_viewport(&text_vp); rb->lcd_puts_scroll(total_resistance_str_x, lineno++, total_resistance_str); rb->lcd_puts_scroll(tolerance_str_x, lineno++, get_tolerance_str(fourth_band)); rb->lcd_update(); button_input = rb->button_get(true); switch(button_input) { case PLA_RIGHT: break; case PLA_EXIT: case PLA_SELECT: default: quit = true; backlight_use_settings(); break; } } display->set_viewport(&text_vp); rb->lcd_stop_scroll(); display->set_viewport(&screen_vp); rb->lcd_clear_display(); return; }
static void resistance_to_color(void) { backlight_ignore_timeout(); int menu_selection; int menu_selection_tol; int button_press; int i; bool quit = false; char kbd_buffer [10]; int kbd_input_int; int temp; int in_resistance_int; int power_ten=0; int first_band_int = 0; int second_band_int = 0; enum color first_band; enum color second_band; enum color multiplier; enum color fourth_band = 0; enum color units_used = 0; char out_str[20]; for(i=0; i<=10; i++) { kbd_buffer[i] = 0; } /* This cleans out the mysterious garbage that appears */ rb->lcd_clear_display(); rb->splash(HZ/2, "Resistance to Colour"); MENUITEM_STRINGLIST(r_to_c_menu, "Select unit to use:", NULL, "Ohms", "Kiloohms (KOhms)", "Megaohms (MOhms)", "Gigaohms (GOhms)"); MENUITEM_STRINGLIST(r_to_c_menu_tol, "Tolerance to display:", NULL, "5%", "10%", "1%", "2%", "20%"); while(!quit) { int ret; ret=menu_selection = rb->do_menu(&r_to_c_menu, &menu_selection, NULL, false); if(ret<0) break; rb->kbd_input(kbd_buffer, sizeof(kbd_buffer)); /* As stated above somewhere, we (I) need to make a calculator-like keypad, that keyboard isn't all that fun to use. */ ret = rb->do_menu(&r_to_c_menu_tol, &menu_selection_tol, NULL, false); if(ret<0) break; switch(menu_selection_tol) { case 0: /* 5% */ fourth_band = RES_GOLD; break; case 1: /* 10% */ fourth_band = RES_SILVER; break; case 2: /* 1% */ fourth_band = RES_BROWN; break; case 3: /* 2% */ fourth_band = RES_RED; break; case 4: /* 20% */ fourth_band = RES_NONE; break; } kbd_input_int = rb->atoi(kbd_buffer); in_resistance_int = kbd_input_int; switch(menu_selection) { case 0: power_ten=0; units_used = RES_BLACK; break; case 1: /* KOhms */ power_ten=3; units_used = RES_ORANGE; break; case 2: /* MOhms */ power_ten=6; units_used = RES_BLUE; break; case 3: /* GOhms */ power_ten=9; units_used = RES_WHITE; break; } temp=kbd_input_int; while(temp>=100) { temp/=10; power_ten++; } first_band_int=temp/10; second_band_int=temp%10; first_band = get_band_rtoc(first_band_int); second_band = get_band_rtoc(second_band_int); multiplier = get_band_rtoc(power_ten); if( first_band == RES_INVALID || second_band == RES_INVALID || multiplier == RES_INVALID) { rb->splashf(HZ, "%d %s can not be represented", in_resistance_int,band_data[units_used].unit); return; } rb->lcd_clear_display(); lineno = INITIAL_TEXT_Y; #ifndef USE_TEXT_ONLY draw_resistor(first_band, second_band, multiplier, fourth_band); #endif draw_resistor_text(first_band, second_band, multiplier, fourth_band); rb->snprintf(out_str, sizeof(out_str), "Input: %d %s", in_resistance_int, band_data[units_used].unit); display->set_viewport(&text_vp); rb->lcd_puts_scroll(r_to_c_out_str_x, lineno++, out_str); rb->lcd_update(); button_press = rb->button_get(true); switch(button_press) { case PLA_SELECT: break; default: quit = true; backlight_use_settings(); break; } } display->set_viewport(&text_vp); rb->lcd_stop_scroll(); display->set_viewport(&screen_vp); rb->lcd_clear_display(); }
static void led_resistance_calc(void) { backlight_ignore_timeout(); int voltage_menu_selection, button_press, j, k, l, foreward_current = 0; int fwd_current_selection = 0; bool quit = false; char kbd_buffer [5]; char fwd_kbd_buffer [5]; int input_voltage, led_voltage = 0; int resistance = 0; int rounded_resistance = 0; int temp; int power_rating_in = 0; int rounded_power_rating = 0; int out_int = 0; char current_out_str [16]; char true_current_out_str [40]; char rounded_resistance_out_str [40]; char power_rating_out_str [40]; int power_ten, first_band_int, second_band_int = 0; enum color first_band; enum color second_band; enum color multiplier; enum color fourth_band = RES_NONE; rb->lcd_clear_display(); MENUITEM_STRINGLIST(voltage_menu, "Select LED voltage:", NULL, "2v (Common red, orange)", "1.5v (IR)", "2.1v (Yellow)", "2.2v (Green)", "3.3v (True green, blue, white, UV)", "4.6v (Blue - 430nm)"); MENUITEM_STRINGLIST(fwd_current_menu, "Select foreward current:", NULL, "20mA - Most common for 5mm and 3mm LEDs - select if unsure.", "Key in other (only if already known)"); while(!quit) { int ret; ret = voltage_menu_selection = rb->do_menu(&voltage_menu, &voltage_menu_selection, NULL, false); if(ret<0) break; ret = fwd_current_selection = rb->do_menu(&fwd_current_menu, &fwd_current_selection, NULL, false); if(ret<0) break; rb->lcd_clear_display(); rb->splash(HZ*2, "(First) Input the supply voltage:"); memset(kbd_buffer,0,sizeof(kbd_buffer)); rb->kbd_input(kbd_buffer, sizeof(kbd_buffer)); input_voltage = rb->atoi(kbd_buffer); if(input_voltage == 0) break; if(input_voltage != (int)input_voltage) { input_voltage *= 10; } else { input_voltage *= 100; } switch(voltage_menu_selection) { case 0: /* 2v */ led_voltage = 200; break; case 1: /* 1.5v */ led_voltage = 150; break; case 2: /* 2.1 */ led_voltage = 210; break; case 3: led_voltage = 220; break; case 4: led_voltage = 330; break; case 5: led_voltage = 460; break; } switch(fwd_current_selection) { case 0: /* 20mA */ foreward_current = 2; /* 20mA * 100 */ break; case 1: rb->lcd_clear_display(); rb->splash(HZ*2, "Input the foreward current, in mA"); memset(fwd_kbd_buffer,0,sizeof(fwd_kbd_buffer)); rb->kbd_input(fwd_kbd_buffer, sizeof(fwd_kbd_buffer)); foreward_current = ((rb->atoi(fwd_kbd_buffer))/10); break; } if(foreward_current == 0) break; rb->lcd_clear_display(); resistance = (input_voltage - led_voltage) / foreward_current; out_int = resistance; int total_common_values = 11; int total_power_values = 9; if(led_voltage > input_voltage) { rb->splash(HZ, "Problem: LED voltage is higher than the source."); break; } for(j = 0; j < total_common_values; j++) { for(k = 1; k < 5; k++) { if( resistance == (common_values[j] * powi(10, k))) { rounded_resistance = (common_values[j] * powi(10, k)); /* perfect match */ break; } else if(resistance >= (common_values[j] * powi(10, k)) && resistance <= (common_values[j+1] * powi(10, k))) { rounded_resistance = (common_values[j+1] * powi(10, k)); /* the higher resistance, to be safe */ break; } else { break; } } } if(rounded_resistance == 0) { rb->splash(HZ, "Problem: Input voltage too high."); break; } power_rating_in = ((input_voltage/100)*(input_voltage/100)*1000 / rounded_resistance); /* in mW */ for(l = 0; l < total_power_values; l++) { if((int)power_rating_in == power_ratings[l]) { rounded_power_rating = (power_ratings[l]); break; } else if(power_rating_in >= power_ratings[l] && power_rating_in <= power_ratings[l+1]) { rounded_power_rating = power_ratings[l+1]; break; } else { break; } } get_power_rating_str(rounded_power_rating); power_ten=0; temp=rounded_resistance; while(temp>=100) { temp/=10; power_ten++; } first_band_int=temp/10; second_band_int=temp%10; first_band = get_band_rtoc(first_band_int); second_band = get_band_rtoc(second_band_int); multiplier = get_band_rtoc(power_ten); rb->lcd_clear_display(); lineno = INITIAL_TEXT_Y; #ifndef USE_TEXT_ONLY draw_resistor(first_band, second_band, multiplier, fourth_band); #endif draw_resistor_text(first_band, second_band, multiplier, fourth_band); rb->snprintf(current_out_str, sizeof(current_out_str), "%d mA", (foreward_current*10)); rb->snprintf(true_current_out_str, sizeof(true_current_out_str), "Input: %dv, %d Ohms @ %s", (input_voltage/100), out_int, current_out_str); rb->snprintf(rounded_resistance_out_str, sizeof(rounded_resistance_out_str), "Rounded/displayed: [%d %s]", rounded_resistance, band_data[multiplier].unit); rb->snprintf(power_rating_out_str, sizeof(power_rating_out_str), "Recommended: %s or greater", get_power_rating_str(rounded_power_rating)); display->set_viewport(&text_vp); rb->lcd_puts_scroll(resistance_val_x, lineno++, true_current_out_str); rb->lcd_puts_scroll(resistance_val_x, lineno++, rounded_resistance_out_str); rb->lcd_puts_scroll(resistance_val_x, lineno++, power_rating_out_str); rb->lcd_update(); button_press = rb->button_get(true); switch(button_press) { case PLA_SELECT: break; default: quit = true; backlight_use_settings(); break; } } display->set_viewport(&text_vp); rb->lcd_stop_scroll(); display->set_viewport(&screen_vp); rb->lcd_clear_display(); }
/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { struct pong pong; int game = 1; int blink_timer = 0; int blink_rate = 20; bool blink = true; /* init the struct with some silly values to start with */ pong.ball.x = 20*RES; pong.ball.y = 20*RES; pong.ball.speedx = SPEEDX; pong.ball.speedy = SPEEDY; pong.player[0].xpos = 0; pong.player[0].e_pad = 0; pong.player[0].w_pad = 7; pong.player[1].xpos = LCD_WIDTH-PAD_WIDTH; pong.player[1].e_pad = 0; pong.player[1].w_pad = 40; /* start every game in demo mode */ pong.player[0].iscpu = pong.player[1].iscpu = true; pong.player[0].score = pong.player[1].score = 0; /* lets start at 0 - 0 ;-) */ /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; /* Turn off backlight timeout */ backlight_ignore_timeout(); /* Clear screen */ rb->lcd_clear_display(); /* go go go */ while(game > 0) { if (game == 2) { /* Game Paused */ rb->splash(0, "PAUSED"); while(game == 2) game = keys(&pong); /* short circuit */ rb->lcd_clear_display(); } if( pong.player[0].iscpu && pong.player[1].iscpu ) { if(blink_timer<blink_rate) { ++blink_timer; } else { blink_timer=0; blink = !blink; } if(blink==true) { blink_demo(); } else { rb->lcd_clear_display(); } } showscore(&pong); pad(&pong, 0); /* draw left pad */ pad(&pong, 1); /* draw right pad */ ball(&pong); /* move and draw ball */ rb->lcd_update(); game = keys(&pong); /* deal with keys */ } /* Turn on backlight timeout (revert to settings) */ backlight_use_settings(); return (game == 0) ? PLUGIN_OK : PLUGIN_USB_CONNECTED; }
/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { rb->lcd_setfont(FONT_SYSFIXED); rb->lcd_clear_display(); if (!parameter) { rb->splash(HZ*3, "Play gameboy ROM file! (.gb/.gbc)"); return PLUGIN_OK; } if(rb->audio_status()) { audio_bufferbase = audio_bufferpointer = rb->plugin_get_buffer(&audio_buffer_free); plugbuf=true; } else { audio_bufferbase = audio_bufferpointer = rb->plugin_get_audio_buffer(&audio_buffer_free); plugbuf=false; } #if MEMORYSIZE <= 8 && (CONFIG_PLATFORM & PLATFORM_NATIVE) /* loaded as an overlay plugin, protect from overwriting ourselves */ if ((unsigned)(plugin_start_addr - (unsigned char *)audio_bufferbase) < audio_buffer_free) audio_buffer_free = plugin_start_addr - (unsigned char *)audio_bufferbase; #endif setoptions(); shut=0; cleanshut=0; #ifdef HAVE_WHEEL_POSITION rb->wheel_send_events(false); #endif #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256) rb->lcd_set_mode(LCD_MODE_PAL256); #endif /* ignore backlight time out */ backlight_ignore_timeout(); gnuboy_main(parameter); #ifdef HAVE_WHEEL_POSITION rb->wheel_send_events(true); #endif #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256) rb->lcd_set_mode(LCD_MODE_RGB565); #endif backlight_use_settings(); if(!rb->audio_status()) rockboy_pcm_close(); if(shut&&!cleanshut) { rb->splash(HZ/2, errormsg); return PLUGIN_ERROR; } rb->splash(HZ/2, "Closing Rockboy"); savesettings(); cleanup(); return PLUGIN_OK; }
/* this is only a demo of what the framework can do */ int main(void) { int time; int x, y, i; int button, scroll_amount; bool black_border = false; static const unsigned char rockbox[] = { /* ........................................... * .####...###...###..#...#.####...###..#...#. * .#...#.#...#.#...#.#..#..#...#.#...#..#.#.. * .####..#...#.#.....###...####..#...#...#... * .#..#..#...#.#...#.#..#..#...#.#...#..#.#.. * .#...#..###...###..#...#.####...###..#...#. * ........................................... * 43 x 7 pixel, 1 bpp */ 0x00, 0x3E, 0x0A, 0x0A, 0x1A, 0x24, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x14, 0x00, 0x3E, 0x08, 0x08, 0x14, 0x22, 0x00, 0x3E, 0x2A, 0x2A, 0x2A, 0x14, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x22, 0x14, 0x08, 0x14, 0x22, 0x00 }; static const unsigned char showing[] = { /* ....................................... * ..####.#...#..###..#...#.#.#...#..####. * .#.....#...#.#...#.#...#.#.##..#.#..... * ..###..#####.#...#.#.#.#.#.#.#.#.#..##. * .....#.#...#.#...#.#.#.#.#.#..##.#...#. * .####..#...#..###...#.#..#.#...#..####. * ....................................... * 39 x 7 pixel, 1 bpp */ 0x00, 0x24, 0x2A, 0x2A, 0x2A, 0x12, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x1E, 0x20, 0x18, 0x20, 0x1E, 0x00, 0x3E, 0x00, 0x3E, 0x04, 0x08, 0x10, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x2A, 0x3A, 0x00 }; static const unsigned char grayscale_grey[] = { /* ....................................................... * ..####.####...###..#...#..####..###...###..#.....#####. * .#.....#...#.#...#.#...#.#.....#...#.#...#.#.....#..... * .#..##.####..#####..#.#...###..#.....#####.#.....####.. * .#...#.#..#..#...#...#.......#.#...#.#...#.#.....#..... * ..####.#...#.#...#...#...####...###..#...#.#####.#####. * ....................................................... * 55 x 7 pixel, 8 bpp */ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110, 120,120, 20, 20, 20, 20,120,222,222,222,222,120,120,120, 24, 24, 24,120,120,226,120,120,120,226,120,120, 28, 28, 28, 28,120,120, 230,230,230,120,120,120, 32, 32, 32,120,120,234,120,120,120,120, 120, 36, 36, 36, 36, 36,120, 130, 20,130,130,130,130,130,222,130,130,130,222,130, 24,130,130, 130, 24,130,226,130,130,130,226,130, 28,130,130,130,130,130,230, 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130, 130, 36,130,130,130,130,130, 140, 20,140,140, 20, 20,140,222,222,222,222,140,140, 24, 24, 24, 24, 24,140,140,226,140,226,140,140,140, 28, 28, 28,140,140,230, 140,140,140,140,140, 32, 32, 32, 32, 32,140,234,140,140,140,140, 140, 36, 36, 36, 36,140,140, 130, 20,130,130,130, 20,130,222,130,130,222,130,130, 24,130,130, 130, 24,130,130,130,226,130,130,130,130,130,130,130, 28,130,230, 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130, 130, 36,130,130,130,130,130, 120,120, 20, 20, 20, 20,120,222,120,120,120,222,120, 24,120,120, 120, 24,120,120,120,226,120,120,120, 28, 28, 28, 28,120,120,120, 230,230,230,120,120, 32,120,120,120, 32,120,234,234,234,234,234, 120, 36, 36, 36, 36, 36,120, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,110,110,110 }; /* Turn off backlight timeout */ backlight_ignore_timeout(); rb->lcd_setfont(FONT_SYSFIXED); /* select default font */ /* get the remainder of the plugin buffer */ gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); /* initialize the greyscale buffer: Archos: 112 pixels wide, 7 rows (56 pixels) high. H1x0: 160 pixels wide, 30 rows (120 pixels) high. */ if (!grey_init(gbuf, gbuf_size, GREY_BUFFERED|GREY_ON_COP, LCD_WIDTH, GFX_HEIGHT, NULL)) { rb->splash(HZ, "Not enough memory."); return PLUGIN_ERROR; } /* place greyscale overlay 1 row down */ grey_set_position(0, 8); rb->lcd_puts(0, 0, "Shades: 129"); rb->lcd_update(); #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(true); #endif grey_show(true); /* switch on greyscale overlay */ time = *rb->current_tick; /* start time measurement */ grey_set_background(150); grey_clear_display(); /* fill everything with grey 150 */ /* draw a dark grey line star background */ grey_set_foreground(80); for (y = 0; y < GFX_HEIGHT; y += 8) /* horizontal part */ { grey_drawline(0, y, (LCD_WIDTH-1), (GFX_HEIGHT-1) - y); /*grey lines */ } for (x = 10; x <= LCD_WIDTH; x += 10) /* vertical part */ { grey_drawline(x, 0, (LCD_WIDTH-1) - x, (GFX_HEIGHT-1)); /*grey lines */ } grey_set_foreground(0); grey_drawrect(0, 0, LCD_WIDTH, GFX_HEIGHT); /* black border */ /* draw grey tones */ for (i = 0; i < GFX_GREYTONE_WIDTH; i++) { x = ((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2) + i; grey_set_foreground(GFX_GREYTONE_STEP * i); /* vertical lines */ grey_vline(x, (GFX_HEIGHT/8), (GFX_HEIGHT-GFX_HEIGHT/8-1)); } grey_set_drawmode(DRMODE_COMPLEMENT); /* invert rectangle (lower half) */ grey_fillrect((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2, (GFX_HEIGHT/2+1), GFX_GREYTONE_WIDTH, (GFX_HEIGHT/2-GFX_HEIGHT/8-1)); /* invert a line */ grey_hline((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2, (LCD_WIDTH+GFX_GREYTONE_WIDTH)/2, (GFX_HEIGHT/2-1)); /* show bitmaps (1 bit and 8 bit) */ /* opaque */ grey_set_drawinfo(DRMODE_SOLID, 255, 100); grey_mono_bitmap(rockbox, MAX((LCD_WIDTH/2-47), ((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2)), (5*GFX_HEIGHT/16-4), 43, 7); /* transparent */ grey_set_drawinfo(DRMODE_FG, 0, 100); grey_mono_bitmap(showing, (LCD_WIDTH/2+4) , (5*GFX_HEIGHT/16-4), 39, 7); /* greyscale */ grey_gray_bitmap(grayscale_grey, ((LCD_WIDTH-55)/2), (11*GFX_HEIGHT/16-4), 55, 7); grey_update(); time = *rb->current_tick - time; /* end time measurement */ rb->lcd_putsf(0, 0, "Shades: 129, %d.%02ds", time / 100, time % 100); grey_deferred_lcd_update(); /* schedule an lcd_update() */ #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(false); #endif /* drawing is now finished, play around with scrolling * until you press OFF or connect USB */ grey_set_background(255); while (true) { scroll_amount = 1; button = rb->button_get(true); exit_on_usb(button); if (button & GREYSCALE_SHIFT) { if (!black_border) { grey_set_background(0); black_border = true; } } else { if (black_border) { grey_set_background(255); black_border = false; } } if (button & BUTTON_REPEAT) scroll_amount = 4; switch (button & ~(GREYSCALE_SHIFT | BUTTON_REPEAT)) { case GREYSCALE_LEFT: grey_scroll_left(scroll_amount); /* scroll left */ grey_update(); break; case GREYSCALE_RIGHT: grey_scroll_right(scroll_amount); /* scroll right */ grey_update(); break; case GREYSCALE_UP: grey_scroll_up(scroll_amount); /* scroll up */ grey_update(); break; case GREYSCALE_DOWN: grey_scroll_down(scroll_amount); /* scroll down */ grey_update(); break; #ifdef GREYSCALE_RC_OFF case GREYSCALE_RC_OFF: #endif case GREYSCALE_OFF: return PLUGIN_OK; } } }