2022-09-25 20:46:03 +08:00

115 lines
3.2 KiB
C

#include "arm11/atp.h"
#include "arm11/acf.h"
#include "arm11/drivers/hid.h"
#include "drivers/gfx.h"
//---------------------------------------------------
// basic print helper
/*
static void set_screen_color( acf_callerdata_t data, acf_position_t tx, acf_position_t ty, acf_color_t b )
{
if( b == 0 ) return;
int *draw_data = data;
u16 *frame = consoleGet()->frameBuffer;
int x = tx + draw_data[0];
int y = ty + draw_data[1];
if( 0 <= x && x < draw_data[2] && 0 <= y && y < draw_data[3] ){
frame[ x*draw_data[3] + (draw_data[3]-1-y) ] = (u16)draw_data[4];
}
}
static const char *acf_draw(int x, int y, int width, int height, int maxwidth, u16 color, const char* text)
{
uint8_t draw_data[sizeof(int)*5];
int *draw_data_int = (int*)&draw_data;
draw_data_int[0] = x;
draw_data_int[1] = y;
draw_data_int[2] = width;
draw_data_int[3] = height;
draw_data_int[4] = color;
const char *retval = text;
acf_canvas_t canvas = acf_get_canvas(maxwidth, text, NULL, NULL, &retval);
if( !canvas ) return retval;
acf_recycle( acf_use_canvas(canvas, set_screen_color, draw_data) );
return retval;
}
*/
extern const char *acf_draw(int x, int y, int width, int height, int maxwidth, u16 color, const char* text)
//---------------------------------------------------
#define CONTAINER_LEFTTOP_X 20u
#define CONTAINER_LEFTTOP_Y 15u
#define CONTAINER_RECT_WIDTH 282u
#define CONTAINER_MAX_LINES 13u
#define WINDOW_WIDTH 320u
#define WINDOW_HEIGHT 240u
#define FONT_HEIGHT 15u
#define screen_clean
// wait key pressed, if power key is pressed, return 0
static uint32_t waitKey()
{
uint32_t ek, down;
do{
GFX_waitForVBlank0();
hidScanInput();
ek = hidGetExtraKeys(0);
if( ek & (KEY_POWER_HELD | KEY_POWER) )
return 0;
down = hidKeysDown();
}while ( down == 0 );
return down;
}
static void paint_one_line( atp_lineinfo_t provider, acf_callerdata_t data, int idx, int row )
{
atp_text_t text;
atp_color_t color = ATP_COLOR_WHITE;
atp_error_t err = provider( data, idx, &text, NULL, &color );
if( !err ){
acf_draw(
CONTAINER_LEFTTOP_X,
CONTAINER_LEFTTOP_Y + row*FONT_HEIGHT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
CONTAINER_RECT_WIDTH,
consoleGetRGB565Color(color > ATP_COLOR_WHITE ? ATP_COLOR_WHITE : color),
text
);
}
}
static void container_paint( atp_lineinfo_t provider, atp_callerdata_t data, atp_counter_t nlines, int top )
{
int end = top + CONTAINER_MAX_LINES;
if( end > nlines ) end = nlines;
for( int n = top; n < end; ++n ){
paint_one_line( provider, data, n, n-top );
}
}
atp_error_t atp_show( atp_counter_t cnt, atp_lineinfo_t provider, atp_callerdata_t data )
{
int idx_top = 0;
while( 1 ){
screen_clean();
container_paint( provider, data, cnt, idx_top );
u32 kDown = waitKey();
if( kDown == 0 ) return ATP_POWER_OFF;
if( kDown == KEY_B || kDown == KEY_A )
return ATP_SUCCESS;
}
}