diff --git a/inc/aegis.h b/inc/aegis.h index be2b604..250ccb6 100644 --- a/inc/aegis.h +++ b/inc/aegis.h @@ -240,7 +240,6 @@ BATT_STATUS; extern void BMStartup( void ); extern void BMUpdateBattery( void ); extern void BMReadBattery( void ); -extern void BMGetCells( uint32_t *v1, uint32_t *v2 ); extern void BMUpdateStatus( void ); extern BATT_STATUS BMGetStatus( void ); @@ -279,6 +278,13 @@ extern int IsUSBPlugged( void ); #define BOX_IDLE (0x1<right - r->left + 1 ) * ( r->bottom - r->top + 1 ); + + begin_send_data(); + while ( nbPix-- ) { - send_data_word( drawing_color ); + send_bytes( &drawing_color, sizeof( drawing_color ), 2 ); } + + end_send_data(); } static void StartBacklightDriver( void ) @@ -278,10 +283,11 @@ static void CLS( void ) static uint16_t color_rgb_to_565( uint32_t rgb ) { - return ( rgb >> 19 &0xF ) << 11 - | ( rgb >> 10 & 0x1F ) << 5 - | ( rgb >> 3 & 0xF ) - ; + return (( rgb >> 10 ) << 13 ) + | (( rgb >> 19 ) << 8 ) + | (( rgb << 24 ) >> 24 ) + | (( rgb << 16 ) >> 29 ) + ; } static void SetColor( uint32_t rgb ) @@ -352,9 +358,6 @@ static int draw_char( const uint16_t c, int x, int y ) const uint8_t *bitmap = chardesc->bitmap; - uint16_t fg = ( fgcolor << 8 ) | ( fgcolor >> 8 ); - uint16_t bg = ( bgcolor << 8 ) | ( bgcolor >> 8 ); - begin_send_data(); uint8_t bits; @@ -363,7 +366,7 @@ static int draw_char( const uint16_t c, int x, int y ) for ( int i = 0 ; i < cw ; ++i ) { if ( !( i & 0x7 ) ) bits = *bitmap++; - send_bytes( bits >> 7 ? &fg : &bg, sizeof( uint16_t ), 2 ); + send_bytes( bits >> 7 ? &fgcolor : &bgcolor, sizeof( uint16_t ), 2 ); bits <<= 1; } } @@ -405,7 +408,7 @@ void rainbow( void ) r = 32 * c / 80; b = ( 32 * ( c + l ) / 240 ) ^ 0x1F; - uint32_t c = b << 11 | g << 5 | r; + uint16_t c = b << 11 | g << 5 | r; send_data_word( c ); } } diff --git a/src/battery.c b/src/battery.c index ddabafc..5182d6a 100644 --- a/src/battery.c +++ b/src/battery.c @@ -8,9 +8,9 @@ typedef struct battery_s { - uint32_t vcell1; - uint32_t vcell2; - uint32_t vtotal; + uint16_t vcell1; + uint16_t vcell2; + uint16_t vtotal; BATT_STATUS status; uint8_t cell1_low :1; uint8_t cell2_low :1; @@ -69,13 +69,9 @@ void BMReadBattery( void ) battery.vcell1 = vbat1; battery.vcell2 = vbat2; battery.vtotal = vbat1 + vbat2; -} - -void BMGetCells( uint32_t *v1, uint32_t *v2 ) -{ - *v1 = battery.vcell1; - *v2 = battery.vcell2; + VOISet( VOI_VCELL1, &battery.vcell1 ); + VOISet( VOI_VCELL2, &battery.vcell2 ); } @@ -99,6 +95,8 @@ void BMUpdateStatus( void ) PF4 = 1; } + VOISet( VOI_BATT_STATUS, &battery.status ); + if ( battery.status != old ) { EMSendEvent1P( EVENT_HARDWARE, EV_H_BATT_STATUS, battery.status ); diff --git a/src/box.c b/src/box.c index 383599a..7e80514 100644 --- a/src/box.c +++ b/src/box.c @@ -96,8 +96,6 @@ void BXCheckActivity( void ) //------------------------------------------------------------------------------ static void GoToSleep( void ) { - // Quick and dirty. :) - DMShutdown(); DisableSPI0(); @@ -131,6 +129,7 @@ static void GoToSleep( void ) CLK_PowerDown(); SYS_LockReg(); + // Why bother restarting all devices ? ResetChip( 0 ); } diff --git a/src/display.c b/src/display.c index af31947..0663ffd 100644 --- a/src/display.c +++ b/src/display.c @@ -78,8 +78,12 @@ void DMEvent( Event_t *ev ) switch ( ev->p1 ) { case DISPLAY_ON: - DELAYED_EVENT( 1, EVENT_DISPLAY, EV_D_BRIGHTNESS, 25, 0 ); + { + uint8_t b; + VOIGet( VOI_BRIGHTNESS, &b ); + DELAYED_EVENT( 1, EVENT_DISPLAY, EV_D_BRIGHTNESS, b, 0 ); break; + } } break; } diff --git a/src/events.c b/src/events.c index f0a676c..b87feee 100644 --- a/src/events.c +++ b/src/events.c @@ -96,7 +96,6 @@ int EMGetNextEvent( Event_t *ev ) //============================================================================== static void EMKeyEvent( Event_t *ev ); -static void EMDisplayEvent( Event_t *ev ); static void EMHardwareEvent( Event_t *ev ); @@ -112,7 +111,7 @@ void EMHandleEvents() Event_t ev; EMGetNextEvent( &ev ); - PrintEvent( &ev ); +// PrintEvent( &ev ); switch ( ev.type ) { diff --git a/src/main.c b/src/main.c index ccedc71..fdb691f 100644 --- a/src/main.c +++ b/src/main.c @@ -86,6 +86,9 @@ int main( void ) StartupDevices(); StartupBox(); + uint8_t b = 25; + VOISet( VOI_BRIGHTNESS, &b ); + while ( 1 ) { SMRefresh(); diff --git a/src/screens.c b/src/screens.c index ef95d73..6d2a414 100644 --- a/src/screens.c +++ b/src/screens.c @@ -153,6 +153,7 @@ void SMRefresh( void ) { if ( screen.s->pf_draw() ) { + screen.opening_tick = t; screen.last_refresh = t; } } diff --git a/src/screens/screen_idle.c b/src/screens/screen_idle.c index cf59aa5..9663352 100644 --- a/src/screens/screen_idle.c +++ b/src/screens/screen_idle.c @@ -20,7 +20,10 @@ extern int ScrIdleDraw( void ) extern void ScrIdleClose( void ) { - DMSetBrightness( 25 ); + uint8_t b; + + VOIGet( VOI_BRIGHTNESS, &b ); + DMSetBrightness( b ); } extern int ScrIdleEvent( Event_t *ev ) diff --git a/src/screens/screen_main.c b/src/screens/screen_main.c index cefbf0f..e7d06bc 100644 --- a/src/screens/screen_main.c +++ b/src/screens/screen_main.c @@ -4,14 +4,76 @@ // Main screen //============================================================================== #include "aegis.h" +#include "screens.h" +//------------------------------------------------------------------------------ +// Screen elements ids +//------------------------------------------------------------------------------ +typedef enum eids_e +{ + VCELL1, + VCELL2, + BSTATUS, + EMAX +} +EID; + + +//------------------------------------------------------------------------------ +// Drawing functions predeclarations +//------------------------------------------------------------------------------ +void draw_voltage( SCREEN_ELEM *e ); +void draw_battstatus( SCREEN_ELEM *e ); + + +//------------------------------------------------------------------------------ +// Screen elements +//------------------------------------------------------------------------------ +SCREEN_ELEM elements[] = +{ + [VCELL1] = + { + .fct = draw_voltage, + .voi = VOI_VCELL1, + .rect = { 0, 10, 79, 19 } + }, + [VCELL2] = + { + .fct = draw_voltage, + .voi = VOI_VCELL1, + .rect = { 33, 10, 79, 19 } + }, + [BSTATUS] = + { + .fct = draw_battstatus, + .voi = VOI_BATT_STATUS, + .rect = { 66, 10, 79, 19 } + } +}; + +#define NUM_ELEMS (sizeof(elements)/sizeof(SCREEN_ELEM)) + + +//------------------------------------------------------------------------------ +// Screen functions +//------------------------------------------------------------------------------ + +static uint8_t draw_step; +static uint8_t draw_elem; + extern void ScrMainInit( void ) { display->SetFont( &simple_font ); display->SetColor( 0x00FF00 ); display->SetBgColor( 0x000000 ); + + for ( int e = 0 ; e < NUM_ELEMS ; ++e ) + elements[e].draw = 1; + + draw_step = 0; + draw_elem = 0; } extern int ScrMainDraw( void ) @@ -22,37 +84,16 @@ extern int ScrMainDraw( void ) extern int ScrMainRefresh( void ) { - static uint32_t last_r_batt = 0; - - uint32_t t = GetSysTick(); + SCREEN_ELEM *e = &elements[draw_elem]; + e->fct( e ); - if ( t - last_r_batt > 1000 ) + if ( ++draw_elem >= NUM_ELEMS ) { - last_r_batt = t; - - rect_t r = { 0, 10, 79, 19 }; - - char buf[16]; - uint32_t vbat1, vbat2; - - BMGetCells( &vbat1, &vbat2 ); - - FormatNumber( buf, vbat1, 4, 3, 3 ); - display->Print( buf, &r, 0 ); - - FormatNumber( buf, vbat2, 4, 3, 3 ); - r.left = 33; - display->Print( buf, &r, 0 ); - - BATT_STATUS bs = BMGetStatus(); - if ( bs != BATT_UNK ) - { - r.left = 66; - display->Print( bs == BATT_OK ? "OK" : "LO" , &r, 0 ); - } + draw_elem = 0; + draw_step = 1; } - return 1; + return draw_step; } extern void ScrMainClose( void ) @@ -63,3 +104,36 @@ extern int ScrMainEvent( Event_t *ev ) { return 0; } + + +//------------------------------------------------------------------------------ +// Drawing functions +//------------------------------------------------------------------------------ + +void draw_voltage( SCREEN_ELEM *e ) +{ + char buf[6]; + static uint16_t volts; + uint8_t changed; + + changed = VOIGetChanged( e->voi, &volts, VOI_USCREEN ); + if ( changed || e->draw ) + { + FormatNumber( buf, volts, 4, 3, 3 ); + display->Print( buf, &e->rect, 0 ); + } +} + +void draw_battstatus( SCREEN_ELEM *e ) +{ + static uint8_t bs; + uint8_t changed; + + changed = VOIGetChanged( e->voi, &bs , VOI_USCREEN ); + if ( changed || e->draw ) + { + if ( bs != BATT_UNK ) + display->Print( bs == BATT_OK ? "OK" : "LO" , &e->rect, 0 ); + } +} +