⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wps-display.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 3 页
字号:
    if (refresh_mode == WPS_REFRESH_ALL)    {        for (i=0; i<MAX_LINES; i++)        {            curr_subline[i] = SUBLINE_RESET;        }    }#ifdef HAVE_LCD_CHARCELLS    for (i=0; i<8; i++) {       if (wps_progress_pat[i]==0)           wps_progress_pat[i]=lcd_get_locked_pattern();    }#endif    if (!id3)    {        lcd_stop_scroll();        return false;    }    ff_rewind_count = ffwd_offset;    for (i = 0; i < MAX_LINES; i++)    {        new_subline_refresh = false;        only_one_subline = false;        /* if time to advance to next sub-line  */        if (TIME_AFTER(current_tick,  subline_expire_time[i] - 1) ||           (curr_subline[i] == SUBLINE_RESET))         {            /* search all sublines until the next subline with time > 0               is found or we get back to the subline we started with */            if (curr_subline[i] == SUBLINE_RESET)                search_start = 0;            else                search_start = curr_subline[i];            for (search=0; search<MAX_SUBLINES; search++)             {                curr_subline[i]++;                /* wrap around if beyond last defined subline or MAX_SUBLINES */                if ((!format_lines[i][curr_subline[i]]) ||                    (curr_subline[i] == MAX_SUBLINES))                {                    if (curr_subline[i] == 1)                        only_one_subline = true;                    curr_subline[i] = 0;                }                /* if back where we started after search or                   only one subline is defined on the line */                if (((search > 0) && (curr_subline[i] == search_start)) ||                    only_one_subline)                {                    /* no other subline with a time > 0 exists */                    subline_expire_time[i] = current_tick  + 100 * HZ;                    break;                }                else                {                    /* get initial time multiplier and                        line type flags for this subline */                    format_display(buf, sizeof(buf), id3,                                    format_lines[i][curr_subline[i]],                                    &time_mult[i][curr_subline[i]],                                   &line_type[i][curr_subline[i]]);                                       /* only use this subline if subline time > 0 */                    if (time_mult[i][curr_subline[i]] > 0)                    {                        new_subline_refresh = true;                        subline_expire_time[i] = current_tick  +                             BASE_SUBLINE_TIME * time_mult[i][curr_subline[i]];                         break;                    }                }            }        }                update_line = false;        if ( !format_lines[i][curr_subline[i]] )            break;        if ((line_type[i][curr_subline[i]] & refresh_mode) ||             (refresh_mode == WPS_REFRESH_ALL) ||            new_subline_refresh)        {            flags = 0;            format_display(buf, sizeof(buf), id3,                           format_lines[i][curr_subline[i]],                           &time_mult[i][curr_subline[i]],                           &flags);            line_type[i][curr_subline[i]] = flags;#ifdef HAVE_LCD_BITMAP            /* progress */            if (flags & refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) {                int percent=                    id3->length?                    (id3->elapsed + ff_rewind_count) * 100 / id3->length:0;                slidebar(0, i*h + offset + 1, LCD_WIDTH, 6,                          percent, Grow_Right);                update_line = true;            }            if (flags & refresh_mode & WPS_REFRESH_PEAK_METER) {                /* peak meter */                int peak_meter_y;                update_line = true;                peak_meter_y = i * h + offset;                /* The user might decide to have the peak meter in the last                    line so that it is only displayed if no status bar is                    visible. If so we neither want do draw nor enable the                   peak meter. */                if (peak_meter_y + h <= LCD_HEIGHT) {                    /* found a line with a peak meter -> remember that we must                       enable it later */                    enable_pm = true;                    peak_meter_draw(0, peak_meter_y, LCD_WIDTH,                                    MIN(h, LCD_HEIGHT - peak_meter_y));                }            }#else            /* progress */            if (flags & refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) {                if (full_line_progressbar)                    draw_player_fullbar(buf, sizeof(buf),                                        id3, ff_rewind_count);                else                    draw_player_progress(id3, ff_rewind_count);            }#endif            if (flags & WPS_REFRESH_SCROLL) {                /* scroll line */                if ((refresh_mode & WPS_REFRESH_SCROLL) ||                    new_subline_refresh) {                    lcd_puts_scroll(0, i, buf);                    update_line = true;                }            }            else if (flags & (WPS_REFRESH_DYNAMIC | WPS_REFRESH_STATIC))            {                /* dynamic / static line */                if ((refresh_mode & (WPS_REFRESH_DYNAMIC|WPS_REFRESH_STATIC)) ||                    new_subline_refresh)                {                    update_line = true;                    lcd_puts(0, i, buf);                }            }        }#ifdef HAVE_LCD_BITMAP        if (update_line) {            lcd_update_rect(0, i*h + offset, LCD_WIDTH, h);        }#endif    }#ifdef HAVE_LCD_BITMAP    /* Now we know wether the peak meter is used.        So we can enable / disable the peak meter thread */    peak_meter_enabled = enable_pm;#endif#ifndef SIMULATOR    if (global_settings.caption_backlight && id3) {        /* turn on backlight n seconds before track ends, and turn it off n           seconds into the new track. n == backlight_timeout, or 5s */        int n =             backlight_timeout_value[global_settings.backlight_timeout] * 1000;        if ( n < 1000 )            n = 5000; /* use 5s if backlight is always on or off */         if ((id3->elapsed < 1000) ||            ((id3->length - id3->elapsed) < (unsigned)n))            backlight_on();    }#endif    return true;}bool wps_display(struct mp3entry* id3){    lcd_clear_display();    if (!id3 && !(mpeg_status() & MPEG_STATUS_PLAY))    {#ifdef HAVE_LCD_CHARCELLS        lcd_puts(0, 0, str(LANG_END_PLAYLIST_PLAYER));#else        lcd_puts(0, 2, str(LANG_END_PLAYLIST_RECORDER));        lcd_update();#endif        global_settings.resume_index = -1;        status_set_playmode(STATUS_STOP);        status_draw(true);        sleep(HZ);        return true;    }    else    {        if (!wps_loaded) {            if ( !format_buffer[0] ) {#ifdef HAVE_LCD_BITMAP                wps_format("%s%?it<%?in<%in. |>%it|%fn>\n"                           "%s%?ia<%ia|%?d2<%d2|(root)>>\n"                           "%s%?id<%id|%?d1<%d1|(root)>> %?iy<(%iy)|>\n"                           "\n"                           "%pc/%pt [%pp:%pe]\n"                           "%fbkBit %?fv<avg|> %?iv<(id3v%iv)|(no id3)>\n"                           "%pb\n"                           "%pm\n");#else                wps_format("%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d2> - %?id<%id|%d1>\n"                           "%pc%?ps<*|/>%pt\n");#endif            }        }    }    yield();    wps_refresh(id3, 0, WPS_REFRESH_ALL);    status_draw(true);    lcd_update();    return false;}#ifdef HAVE_LCD_CHARCELLSstatic bool draw_player_progress(struct mp3entry* id3, int ff_rewwind_count){    char player_progressbar[7];    char binline[36];    int songpos = 0;    int i,j;    if (!id3)        return false;    memset(binline, 1, sizeof binline);    memset(player_progressbar, 1, sizeof player_progressbar);    if(id3->elapsed >= id3->length)        songpos = 0;    else    {        if(wps_time_countup == false)            songpos = ((id3->elapsed - ff_rewwind_count) * 36) / id3->length;        else            songpos = ((id3->elapsed + ff_rewwind_count) * 36) / id3->length;    }    for (i=0; i < songpos; i++)        binline[i] = 0;    for (i=0; i<=6; i++) {        for (j=0;j<5;j++) {            player_progressbar[i] <<= 1;            player_progressbar[i] += binline[i*5+j];        }    }    lcd_define_pattern(wps_progress_pat[0], player_progressbar);    return true;}static void draw_player_fullbar(char* buf, int buf_size,                                struct mp3entry* id3, int ff_rewwind_count){    int i,j,lcd_char_pos;    char player_progressbar[7];    char binline[36];    char numbers[12][4][3]={{{1,1,1},{1,0,1},{1,0,1},{1,1,1}},/*0*/                            {{0,1,0},{1,1,0},{0,1,0},{0,1,0}},/*1*/                            {{1,1,1},{0,0,1},{0,1,0},{1,1,1}},/*2*/                            {{1,1,1},{0,0,1},{0,1,1},{1,1,1}},/*3*/                            {{1,0,0},{1,1,0},{1,1,1},{0,1,0}},/*4*/                            {{1,1,1},{1,1,0},{0,0,1},{1,1,0}},/*5*/                            {{1,1,1},{1,0,0},{1,1,1},{1,1,1}},/*6*/                            {{1,1,1},{0,0,1},{0,1,0},{1,0,0}},/*7*/                            {{1,1,1},{1,1,1},{1,0,1},{1,1,1}},/*8*/                            {{1,1,1},{1,1,1},{0,0,1},{1,1,1}},/*9*/                            {{0,0,0},{0,1,0},{0,0,0},{0,1,0}},/*:*/                            {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}};/*<blank>*/    int songpos = 0;    int digits[6];    int time;    char timestr[7];        for (i=0; i < buf_size; i++)        buf[i] = ' ';               if(id3->elapsed >= id3->length)        songpos = 55;    else {        if(wps_time_countup == false)            songpos = ((id3->elapsed - ff_rewwind_count) * 55) / id3->length;        else            songpos = ((id3->elapsed + ff_rewwind_count) * 55) / id3->length;    }    time=(id3->elapsed + ff_rewind_count);       memset(timestr, 0, sizeof(timestr));    format_time(timestr, sizeof(timestr), time);    for(lcd_char_pos=0; lcd_char_pos<6; lcd_char_pos++) {        digits[lcd_char_pos] = map_fullbar_char(timestr[lcd_char_pos]);    }    /* build the progressbar-icons */    for (lcd_char_pos=0; lcd_char_pos<6; lcd_char_pos++) {        memset(binline, 0, sizeof binline);        memset(player_progressbar, 0, sizeof player_progressbar);        /* make the character (progressbar & digit)*/        for (i=0; i<7; i++) {            for (j=0;j<5;j++) {                /* make the progressbar */                if (lcd_char_pos==(songpos/5)) {                    /* partial */                    if ((j<(songpos%5))&&(i>4))                        binline[i*5+j] = 1;                    else                        binline[i*5+j] = 0;                }                else {                    if (lcd_char_pos<(songpos/5)) {                        /* full character */                        if (i>4)                            binline[i*5+j] = 1;                    }                }                /* insert the digit */                if ((j<3)&&(i<4)) {                    if (numbers[digits[lcd_char_pos]][i][j]==1)                        binline[i*5+j] = 1;                }            }        }                 for (i=0; i<=6; i++) {            for (j=0;j<5;j++) {                player_progressbar[i] <<= 1;                player_progressbar[i] += binline[i*5+j];            }        }               lcd_define_pattern(wps_progress_pat[lcd_char_pos+1],player_progressbar);        buf[lcd_char_pos]=wps_progress_pat[lcd_char_pos+1];           }    /* make rest of the progressbar if necessary */    if (songpos/5>5) {           /* set the characters positions that use the full 5 pixel wide bar */        for (lcd_char_pos=6; lcd_char_pos < (songpos/5); lcd_char_pos++)            buf[lcd_char_pos] = 0x86; /* '_' */        /* build the partial bar character for the tail character position */        memset(binline, 0, sizeof binline);        memset(player_progressbar, 0, sizeof player_progressbar);        for (i=5; i<7; i++) {            for (j=0;j<5;j++) {                if (j<(songpos%5)) {                    binline[i*5+j] = 1;                }            }        }               for (i=0; i<7; i++) {            for (j=0;j<5;j++) {                player_progressbar[i] <<= 1;                player_progressbar[i] += binline[i*5+j];            }        }               lcd_define_pattern(wps_progress_pat[7],player_progressbar);                   buf[songpos/5]=wps_progress_pat[7];    }}static char map_fullbar_char(char ascii_val){    if (ascii_val >= '0' && ascii_val <= '9') {        return(ascii_val - '0');    }    else if (ascii_val == ':') {        return(10);    }    else        return(11); /* anything besides a number or ':' is mapped to <blank> */}#endif/* ----------------------------------------------------------------- * vim: et sw=4 ts=8 sts=4 tw=78 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -