forked from len0rd/rockbox
		
	git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2989 a1c6a512-1295-4272-9138-f99709370657
		
			
				
	
	
		
			258 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************
 | |
|  *             __________               __   ___.
 | |
|  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
|  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
|  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
|  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
|  *                     \/            \/     \/    \/            \/
 | |
|  * $Id$
 | |
|  *
 | |
|  * Copyright (C) 2002 by Linus Nielsen Feltzing
 | |
|  *
 | |
|  * All files in this archive are subject to the GNU General Public License.
 | |
|  * See the file COPYING in the source tree root for full license agreement.
 | |
|  *
 | |
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
|  * KIND, either express or implied.
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| #include "lcd.h"
 | |
| #include "debug.h"
 | |
| #include "kernel.h"
 | |
| #include "power.h"
 | |
| #include "thread.h"
 | |
| #include "settings.h"
 | |
| #include "status.h"
 | |
| #include "mpeg.h"
 | |
| #include "wps.h"
 | |
| #ifdef HAVE_RTC
 | |
| #include "rtc.h"
 | |
| #endif
 | |
| #ifdef HAVE_LCD_BITMAP
 | |
| #include "icons.h"
 | |
| #endif
 | |
| #include "powermgmt.h"
 | |
| 
 | |
| static enum playmode current_mode = STATUS_STOP;
 | |
| 
 | |
| long switch_tick;
 | |
| int  battery_charge_step = 0;
 | |
| #ifdef HAVE_LCD_BITMAP
 | |
| bool plug_state;
 | |
| bool battery_state;
 | |
| #endif
 | |
| 
 | |
| void status_init(void)
 | |
| {
 | |
|     status_set_playmode(STATUS_STOP);
 | |
| }
 | |
| 
 | |
| void status_set_playmode(enum playmode mode)
 | |
| {
 | |
|     current_mode = mode;
 | |
|     status_draw();
 | |
| }
 | |
| 
 | |
| #if defined(HAVE_LCD_CHARCELLS)
 | |
| static bool record = false;
 | |
| static bool audio = false;
 | |
| static bool param = false;
 | |
| static bool usb = false;
 | |
| 
 | |
| void status_set_record(bool b)
 | |
| {
 | |
|     record = b;
 | |
| }
 | |
| 
 | |
| void status_set_audio(bool b)
 | |
| {
 | |
|     audio = b;
 | |
| }
 | |
| 
 | |
| void status_set_param(bool b)
 | |
| {
 | |
|     param = b;
 | |
| }
 | |
| 
 | |
| void status_set_usb(bool b)
 | |
| {
 | |
|     usb = b;
 | |
| }
 | |
| 
 | |
| #endif /* HAVE_LCD_CHARCELLS */
 | |
| 
 | |
| void status_draw(void)
 | |
| {
 | |
|     int battlevel = battery_level();
 | |
|     int volume = mpeg_val2phys(SOUND_VOLUME, global_settings.volume);
 | |
| #if defined(HAVE_LCD_BITMAP) && defined(HAVE_RTC)
 | |
|     int hour, minute;
 | |
| #endif
 | |
| 
 | |
|     if ( !global_settings.statusbar )
 | |
|         return;
 | |
| 
 | |
| #if defined(HAVE_LCD_CHARCELLS)
 | |
|     lcd_icon(ICON_VOLUME, true);
 | |
|     if(volume > 10)
 | |
|         lcd_icon(ICON_VOLUME_1, true);
 | |
|     else
 | |
|         lcd_icon(ICON_VOLUME_1, false);
 | |
|     if(volume > 30)
 | |
|         lcd_icon(ICON_VOLUME_2, true);
 | |
|     else
 | |
|         lcd_icon(ICON_VOLUME_2, false);
 | |
|     if(volume > 50)
 | |
|         lcd_icon(ICON_VOLUME_3, true);
 | |
|     else
 | |
|         lcd_icon(ICON_VOLUME_3, false);
 | |
|     if(volume > 70)
 | |
|         lcd_icon(ICON_VOLUME_4, true);
 | |
|     else
 | |
|         lcd_icon(ICON_VOLUME_4, false);
 | |
|     if(volume > 90)
 | |
|         lcd_icon(ICON_VOLUME_5, true);
 | |
|     else
 | |
|         lcd_icon(ICON_VOLUME_5, false);
 | |
| 
 | |
|     switch(current_mode)
 | |
|     {
 | |
|         case STATUS_PLAY:
 | |
|             lcd_icon(ICON_PLAY, true);
 | |
|             lcd_icon(ICON_PAUSE, false);
 | |
|             break;
 | |
|     
 | |
|         case STATUS_STOP:
 | |
|             lcd_icon(ICON_PLAY, false);
 | |
|             lcd_icon(ICON_PAUSE, false);
 | |
|             break;
 | |
|     
 | |
|         case STATUS_PAUSE:
 | |
|             lcd_icon(ICON_PLAY, false);
 | |
|             lcd_icon(ICON_PAUSE, true);
 | |
|             break;
 | |
| 
 | |
|         default:
 | |
|             break;
 | |
|     }
 | |
|     if(charger_inserted())
 | |
|     {
 | |
|         global_settings.runtime = 0;
 | |
|         if(TIME_AFTER(current_tick, switch_tick))
 | |
|         {
 | |
|             lcd_icon(ICON_BATTERY, true);
 | |
|             lcd_icon(ICON_BATTERY_1, false);
 | |
|             lcd_icon(ICON_BATTERY_2, false);
 | |
|             lcd_icon(ICON_BATTERY_3, false);
 | |
|             switch(battery_charge_step)
 | |
|             {
 | |
|                 case 0:
 | |
|                     battery_charge_step++;
 | |
|                     break;
 | |
|                 case 1:
 | |
|                     lcd_icon(ICON_BATTERY_1, true);
 | |
|                     battery_charge_step++;
 | |
|                     break;
 | |
|                 case 2:
 | |
|                     lcd_icon(ICON_BATTERY_1, true);
 | |
|                     lcd_icon(ICON_BATTERY_2, true);
 | |
|                     battery_charge_step++;
 | |
|                     break;
 | |
|                 case 3:
 | |
|                     lcd_icon(ICON_BATTERY_1, true);
 | |
|                     lcd_icon(ICON_BATTERY_2, true);
 | |
|                     lcd_icon(ICON_BATTERY_3, true);
 | |
|                     battery_charge_step = 0;
 | |
|                     break;
 | |
|                 default:
 | |
|                     battery_charge_step = 0;
 | |
|                     break;
 | |
|             }
 | |
|            switch_tick = current_tick + (HZ/2);
 | |
|        }
 | |
|     } else {
 | |
|         lcd_icon(ICON_BATTERY, true);
 | |
|         if(battlevel > 25)
 | |
|             lcd_icon(ICON_BATTERY_1, true);
 | |
|         else
 | |
|             lcd_icon(ICON_BATTERY_1, false);
 | |
|         if(battlevel > 50)
 | |
|             lcd_icon(ICON_BATTERY_2, true);
 | |
|         else
 | |
|             lcd_icon(ICON_BATTERY_2, false);
 | |
|         if(battlevel > 75)
 | |
|             lcd_icon(ICON_BATTERY_3, true);
 | |
|         else
 | |
|             lcd_icon(ICON_BATTERY_3, false);
 | |
|     }
 | |
| 
 | |
|     lcd_icon(ICON_REPEAT, global_settings.repeat_mode != REPEAT_OFF);
 | |
|     lcd_icon(ICON_1, global_settings.repeat_mode == REPEAT_ONE);
 | |
|     
 | |
|     lcd_icon(ICON_RECORD, record);
 | |
|     lcd_icon(ICON_AUDIO, audio);
 | |
|     lcd_icon(ICON_PARAM, param);
 | |
|     lcd_icon(ICON_USB, usb);
 | |
| 
 | |
| #endif
 | |
| #ifdef HAVE_LCD_BITMAP
 | |
|     if (global_settings.statusbar) {
 | |
|         statusbar_wipe();
 | |
| #ifdef HAVE_CHARGE_CTRL
 | |
|         if(charger_inserted()) {
 | |
|             battery_state = true;
 | |
|             plug_state = true;
 | |
|             if (charge_state > 0) /* charge || top off || trickle */
 | |
|                 global_settings.runtime = 0;
 | |
|             if ((charge_state == 1) || (charge_state == 2 )) { /* animate battery if charging or top-off charging*/
 | |
|                 battlevel = battery_charge_step * 34; /* 34 for a better look */
 | |
|                 battlevel = battlevel > 100 ? 100 : battlevel;
 | |
|                 if(TIME_AFTER(current_tick, switch_tick)) {
 | |
|                     battery_charge_step=(battery_charge_step+1)%4;
 | |
|                     switch_tick = current_tick + HZ;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             plug_state=false;
 | |
|             if(battery_level_safe())
 | |
|                 battery_state = true;
 | |
|             else /* blink battery if level is low */
 | |
|                 if(TIME_AFTER(current_tick, switch_tick)) {
 | |
|                     switch_tick = current_tick+HZ;
 | |
|                     battery_state =! battery_state;
 | |
|                 }
 | |
|         }
 | |
|                 
 | |
|         if (battery_state)
 | |
|             statusbar_icon_battery(battlevel, plug_state);
 | |
| #else
 | |
|         statusbar_icon_battery(battlevel, false);
 | |
| #endif
 | |
|         statusbar_icon_volume(volume);
 | |
|         statusbar_icon_play_state(current_mode + Icon_Play);
 | |
|         switch (global_settings.repeat_mode) {
 | |
|             case REPEAT_ONE:
 | |
|                 statusbar_icon_play_mode(Icon_RepeatOne);
 | |
|                 break;
 | |
| 
 | |
|             case REPEAT_ALL:
 | |
|                 statusbar_icon_play_mode(Icon_Repeat);
 | |
|                 break;
 | |
|         }
 | |
|         if(global_settings.playlist_shuffle)
 | |
|             statusbar_icon_shuffle();
 | |
|         if (keys_locked)
 | |
|             statusbar_icon_lock();
 | |
| #ifdef HAVE_RTC
 | |
|         hour = rtc_read(3);
 | |
|         hour = ((hour & 0x30) >> 4) * 10 + (hour & 0x0f);
 | |
|         minute = rtc_read(2);
 | |
|         minute = ((minute & 0x70) >> 4) * 10 + (minute & 0x0f);
 | |
|         statusbar_time(hour, minute);
 | |
| #endif
 | |
| 
 | |
|         lcd_update_rect(0, 0, LCD_WIDTH, STATUSBAR_HEIGHT);
 | |
|     }
 | |
| #endif
 | |
| }
 |