refactoring tui
This commit is contained in:
parent
ec1d3bd4b9
commit
a740c97db6
1 changed files with 140 additions and 129 deletions
269
src/ui_text.c
269
src/ui_text.c
|
@ -111,6 +111,62 @@ static short lcd_pixels_buffer[ LCD_WIDTH ][ LCD_HEIGHT ];
|
||||||
/****************************/
|
/****************************/
|
||||||
/* functions implementation */
|
/* functions implementation */
|
||||||
/****************************/
|
/****************************/
|
||||||
|
/* TODO: not specific to tui */
|
||||||
|
static inline void press_button( int b )
|
||||||
|
{
|
||||||
|
// Check not already pressed (may be important: avoids a useless do_kbd_int)
|
||||||
|
if ( buttons[ b ].pressed == 1 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
buttons[ b ].pressed = 1;
|
||||||
|
|
||||||
|
int code = buttons[ b ].code;
|
||||||
|
if ( code == 0x8000 ) {
|
||||||
|
for ( int i = 0; i < 9; i++ )
|
||||||
|
saturn.keybuf.rows[ i ] |= 0x8000;
|
||||||
|
do_kbd_int();
|
||||||
|
} else {
|
||||||
|
int r = code >> 4;
|
||||||
|
int c = 1 << ( code & 0xf );
|
||||||
|
if ( ( saturn.keybuf.rows[ r ] & c ) == 0 ) {
|
||||||
|
if ( saturn.kbd_ien )
|
||||||
|
do_kbd_int();
|
||||||
|
if ( ( saturn.keybuf.rows[ r ] & c ) )
|
||||||
|
fprintf( stderr, "bug\n" );
|
||||||
|
|
||||||
|
saturn.keybuf.rows[ r ] |= c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
|
static inline void release_button( int b )
|
||||||
|
{
|
||||||
|
// Check not already released (not critical)
|
||||||
|
if ( buttons[ b ].pressed == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
buttons[ b ].pressed = 0;
|
||||||
|
|
||||||
|
int code = buttons[ b ].code;
|
||||||
|
if ( code == 0x8000 ) {
|
||||||
|
for ( int i = 0; i < 9; i++ )
|
||||||
|
saturn.keybuf.rows[ i ] &= ~0x8000;
|
||||||
|
} else {
|
||||||
|
int r = code >> 4;
|
||||||
|
int c = 1 << ( code & 0xf );
|
||||||
|
saturn.keybuf.rows[ r ] &= ~c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
|
static inline void release_all_buttons( void )
|
||||||
|
{
|
||||||
|
for ( int b = FIRST_BUTTON; b <= LAST_BUTTON; b++ )
|
||||||
|
if ( buttons[ b ].pressed )
|
||||||
|
release_button( b );
|
||||||
|
}
|
||||||
|
|
||||||
static inline void tranlate_nibble_into_lcd_pixels_buffer( int nibble, int initial_column, int row )
|
static inline void tranlate_nibble_into_lcd_pixels_buffer( int nibble, int initial_column, int row )
|
||||||
{
|
{
|
||||||
for ( int x = 0; x < 4; x++ ) {
|
for ( int x = 0; x < 4; x++ ) {
|
||||||
|
@ -153,134 +209,7 @@ static inline void ncurses_draw_lcd_pixels_buffer( void )
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ncurses_init_ui( void )
|
static inline int ncurses_get_event( void )
|
||||||
{
|
|
||||||
setlocale( LC_ALL, "" );
|
|
||||||
initscr(); /* initialize the curses library */
|
|
||||||
keypad( stdscr, TRUE ); /* enable keyboard mapping */
|
|
||||||
nodelay( stdscr, TRUE );
|
|
||||||
curs_set( 0 );
|
|
||||||
cbreak(); /* take input chars one at a time, no wait for \n */
|
|
||||||
noecho();
|
|
||||||
nonl(); /* tell curses not to do NL->CR/NL on output */
|
|
||||||
|
|
||||||
if ( !mono && has_colors() ) {
|
|
||||||
start_color();
|
|
||||||
|
|
||||||
if ( gray ) {
|
|
||||||
init_color( LCD_COLOR_BG, 205, 205, 205 );
|
|
||||||
init_color( LCD_COLOR_FG, 20, 20, 20 );
|
|
||||||
} else {
|
|
||||||
init_color( LCD_COLOR_BG, 202, 221, 92 );
|
|
||||||
init_color( LCD_COLOR_FG, 0, 0, 128 );
|
|
||||||
}
|
|
||||||
|
|
||||||
init_pair( LCD_PIXEL_OFF, LCD_COLOR_BG, LCD_COLOR_BG );
|
|
||||||
init_pair( LCD_PIXEL_ON, LCD_COLOR_FG, LCD_COLOR_FG );
|
|
||||||
}
|
|
||||||
|
|
||||||
mvaddch( 0, 0, ACS_ULCORNER );
|
|
||||||
mvaddch( LCD_BOTTOM, 0, ACS_LLCORNER );
|
|
||||||
mvaddch( 0, LCD_RIGHT, ACS_URCORNER );
|
|
||||||
mvaddch( LCD_BOTTOM, LCD_RIGHT, ACS_LRCORNER );
|
|
||||||
mvhline( 0, 1, ACS_HLINE, LCD_RIGHT - 1 );
|
|
||||||
mvhline( LCD_BOTTOM, 1, ACS_HLINE, LCD_RIGHT - 1 );
|
|
||||||
mvvline( 1, 0, ACS_VLINE, LCD_BOTTOM - 1 );
|
|
||||||
mvvline( 1, LCD_RIGHT, ACS_VLINE, LCD_BOTTOM - 1 );
|
|
||||||
|
|
||||||
mvprintw( 0, 2, "[ | | | | | ]" ); /* annunciators */
|
|
||||||
|
|
||||||
mvprintw( LCD_BOTTOM, 2, "[ wire: %s ]-[ IR: %s ]", wire_name, ir_name );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void draw_nibble( int col, int row, int val )
|
|
||||||
{
|
|
||||||
int c = ( col * 4 ), // c: start in pixels,
|
|
||||||
r = row; // r: start in pixels
|
|
||||||
|
|
||||||
if ( row <= display.lines )
|
|
||||||
c -= 2 * display.offset;
|
|
||||||
|
|
||||||
val &= 0x0f;
|
|
||||||
|
|
||||||
tranlate_nibble_into_lcd_pixels_buffer( val, c, r );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void draw_row( long addr, int row )
|
|
||||||
{
|
|
||||||
int v;
|
|
||||||
int line_length = NIBBLES_PER_ROW;
|
|
||||||
|
|
||||||
if ( ( display.offset > 3 ) && ( row <= display.lines ) )
|
|
||||||
line_length += 2;
|
|
||||||
|
|
||||||
for ( int i = 0; i < line_length; i++ ) {
|
|
||||||
v = read_nibble( addr + i );
|
|
||||||
if ( v == lcd_nibbles_buffer[ row ][ i ] )
|
|
||||||
break;
|
|
||||||
|
|
||||||
lcd_nibbles_buffer[ row ][ i ] = v;
|
|
||||||
draw_nibble( i, row, v );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void press_button( int b )
|
|
||||||
{
|
|
||||||
// Check not already pressed (may be important: avoids a useless do_kbd_int)
|
|
||||||
if ( buttons[ b ].pressed == 1 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
buttons[ b ].pressed = 1;
|
|
||||||
|
|
||||||
int code = buttons[ b ].code;
|
|
||||||
if ( code == 0x8000 ) {
|
|
||||||
for ( int i = 0; i < 9; i++ )
|
|
||||||
saturn.keybuf.rows[ i ] |= 0x8000;
|
|
||||||
do_kbd_int();
|
|
||||||
} else {
|
|
||||||
int r = code >> 4;
|
|
||||||
int c = 1 << ( code & 0xf );
|
|
||||||
if ( ( saturn.keybuf.rows[ r ] & c ) == 0 ) {
|
|
||||||
if ( saturn.kbd_ien )
|
|
||||||
do_kbd_int();
|
|
||||||
if ( ( saturn.keybuf.rows[ r ] & c ) )
|
|
||||||
fprintf( stderr, "bug\n" );
|
|
||||||
|
|
||||||
saturn.keybuf.rows[ r ] |= c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void release_button( int b )
|
|
||||||
{
|
|
||||||
// Check not already released (not critical)
|
|
||||||
if ( buttons[ b ].pressed == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
buttons[ b ].pressed = 0;
|
|
||||||
|
|
||||||
int code = buttons[ b ].code;
|
|
||||||
if ( code == 0x8000 ) {
|
|
||||||
for ( int i = 0; i < 9; i++ )
|
|
||||||
saturn.keybuf.rows[ i ] &= ~0x8000;
|
|
||||||
} else {
|
|
||||||
int r = code >> 4;
|
|
||||||
int c = 1 << ( code & 0xf );
|
|
||||||
saturn.keybuf.rows[ r ] &= ~c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void release_all_buttons( void )
|
|
||||||
{
|
|
||||||
for ( int b = FIRST_BUTTON; b <= LAST_BUTTON; b++ )
|
|
||||||
if ( buttons[ b ].pressed )
|
|
||||||
release_button( b );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********/
|
|
||||||
/* public */
|
|
||||||
/**********/
|
|
||||||
int text_get_event( void )
|
|
||||||
{
|
{
|
||||||
int hpkey = -1;
|
int hpkey = -1;
|
||||||
uint32_t k;
|
uint32_t k;
|
||||||
|
@ -288,7 +217,7 @@ int text_get_event( void )
|
||||||
/* Start fresh and mark all keys as released */
|
/* Start fresh and mark all keys as released */
|
||||||
release_all_buttons();
|
release_all_buttons();
|
||||||
|
|
||||||
/* Iterate over all currently pressed keys and mark it as pressed */
|
/* Iterate over all currently pressed keys and mark them as pressed */
|
||||||
while ( ( k = getch() ) ) {
|
while ( ( k = getch() ) ) {
|
||||||
if ( k == ( uint32_t )ERR )
|
if ( k == ( uint32_t )ERR )
|
||||||
break;
|
break;
|
||||||
|
@ -492,8 +421,87 @@ int text_get_event( void )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ncurses_init_ui( void )
|
||||||
|
{
|
||||||
|
setlocale( LC_ALL, "" );
|
||||||
|
initscr(); /* initialize the curses library */
|
||||||
|
keypad( stdscr, TRUE ); /* enable keyboard mapping */
|
||||||
|
nodelay( stdscr, TRUE );
|
||||||
|
curs_set( 0 );
|
||||||
|
cbreak(); /* take input chars one at a time, no wait for \n */
|
||||||
|
noecho();
|
||||||
|
nonl(); /* tell curses not to do NL->CR/NL on output */
|
||||||
|
|
||||||
|
if ( !mono && has_colors() ) {
|
||||||
|
start_color();
|
||||||
|
|
||||||
|
if ( gray ) {
|
||||||
|
init_color( LCD_COLOR_BG, 205, 205, 205 );
|
||||||
|
init_color( LCD_COLOR_FG, 20, 20, 20 );
|
||||||
|
} else {
|
||||||
|
init_color( LCD_COLOR_BG, 202, 221, 92 );
|
||||||
|
init_color( LCD_COLOR_FG, 0, 0, 128 );
|
||||||
|
}
|
||||||
|
|
||||||
|
init_pair( LCD_PIXEL_OFF, LCD_COLOR_BG, LCD_COLOR_BG );
|
||||||
|
init_pair( LCD_PIXEL_ON, LCD_COLOR_FG, LCD_COLOR_FG );
|
||||||
|
}
|
||||||
|
|
||||||
|
mvaddch( 0, 0, ACS_ULCORNER );
|
||||||
|
mvaddch( LCD_BOTTOM, 0, ACS_LLCORNER );
|
||||||
|
mvaddch( 0, LCD_RIGHT, ACS_URCORNER );
|
||||||
|
mvaddch( LCD_BOTTOM, LCD_RIGHT, ACS_LRCORNER );
|
||||||
|
mvhline( 0, 1, ACS_HLINE, LCD_RIGHT - 1 );
|
||||||
|
mvhline( LCD_BOTTOM, 1, ACS_HLINE, LCD_RIGHT - 1 );
|
||||||
|
mvvline( 1, 0, ACS_VLINE, LCD_BOTTOM - 1 );
|
||||||
|
mvvline( 1, LCD_RIGHT, ACS_VLINE, LCD_BOTTOM - 1 );
|
||||||
|
|
||||||
|
mvprintw( 0, 2, "[ | | | | | ]" ); /* annunciators */
|
||||||
|
|
||||||
|
mvprintw( LCD_BOTTOM, 2, "[ wire: %s ]-[ IR: %s ]", wire_name, ir_name );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
|
static inline void draw_nibble( int col, int row, int val )
|
||||||
|
{
|
||||||
|
int c = ( col * 4 ), // c: start in pixels,
|
||||||
|
r = row; // r: start in pixels
|
||||||
|
|
||||||
|
if ( row <= display.lines )
|
||||||
|
c -= 2 * display.offset;
|
||||||
|
|
||||||
|
val &= 0x0f;
|
||||||
|
|
||||||
|
tranlate_nibble_into_lcd_pixels_buffer( val, c, r );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
|
static inline void draw_row( long addr, int row )
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
int line_length = NIBBLES_PER_ROW;
|
||||||
|
|
||||||
|
if ( ( display.offset > 3 ) && ( row <= display.lines ) )
|
||||||
|
line_length += 2;
|
||||||
|
|
||||||
|
for ( int i = 0; i < line_length; i++ ) {
|
||||||
|
v = read_nibble( addr + i );
|
||||||
|
if ( v == lcd_nibbles_buffer[ row ][ i ] )
|
||||||
|
break;
|
||||||
|
|
||||||
|
lcd_nibbles_buffer[ row ][ i ] = v;
|
||||||
|
draw_nibble( i, row, v );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********/
|
||||||
|
/* public */
|
||||||
|
/**********/
|
||||||
|
int text_get_event( void ) { return ncurses_get_event(); }
|
||||||
|
|
||||||
void text_adjust_contrast() { text_update_LCD(); }
|
void text_adjust_contrast() { text_update_LCD(); }
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
void text_init_LCD( void )
|
void text_init_LCD( void )
|
||||||
{
|
{
|
||||||
init_display();
|
init_display();
|
||||||
|
@ -502,6 +510,7 @@ void text_init_LCD( void )
|
||||||
memset( lcd_pixels_buffer, 0xf0, sizeof( lcd_pixels_buffer ) );
|
memset( lcd_pixels_buffer, 0xf0, sizeof( lcd_pixels_buffer ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
void text_update_LCD( void )
|
void text_update_LCD( void )
|
||||||
{
|
{
|
||||||
if ( display.on ) {
|
if ( display.on ) {
|
||||||
|
@ -542,6 +551,7 @@ void text_update_LCD( void )
|
||||||
|
|
||||||
void text_refresh_LCD( void ) {}
|
void text_refresh_LCD( void ) {}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
void text_disp_draw_nibble( word_20 addr, word_4 val )
|
void text_disp_draw_nibble( word_20 addr, word_4 val )
|
||||||
{
|
{
|
||||||
long offset;
|
long offset;
|
||||||
|
@ -572,6 +582,7 @@ void text_disp_draw_nibble( word_20 addr, word_4 val )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: not specific to tui */
|
||||||
void text_menu_draw_nibble( word_20 addr, word_4 val )
|
void text_menu_draw_nibble( word_20 addr, word_4 val )
|
||||||
{
|
{
|
||||||
long offset;
|
long offset;
|
||||||
|
|
Loading…
Add table
Reference in a new issue