summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/display_text.c (follow)
Commit message (Expand)AuthorAge
* some changes to use of display_text.Teruaki Kawashima2010-02-22
* Fix a bug in lib display_text.h, which inserts a unwanted blank lineJohannes Schwarz2009-07-15
* use lib display text to display help messages (FS#10099).Teruaki Kawashima2009-07-14
* reduce size of the instance of struct style_text in lib/display.h (thanks to ...Johannes Schwarz2009-07-02
* FS#10099: new lib, which displays formatted text on every target; also suppor...Johannes Schwarz2009-06-28
href='#n71'>71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2005 Jonas Haggqvist
 *
 * 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 "plugin.h"

static struct plugin_api* rb;
static int files, dirs;
static int lasttick;
static bool abort;
#ifdef HAVE_LCD_BITMAP
static int fontwidth, fontheight;
#endif

#if CONFIG_KEYPAD == PLAYER_PAD 
#define STATS_STOP BUTTON_STOP
#else
#define STATS_STOP BUTTON_OFF
#endif

void update_screen(void)
{
    char buf[15];
#ifdef HAVE_LCD_BITMAP
    rb->lcd_clear_display();
    rb->lcd_putsxy(0,0,"Files:");
    rb->lcd_putsxy(0,fontheight,"Dirs:");
    rb->snprintf(buf, sizeof(buf), "%d", files);
    rb->lcd_putsxy(fontwidth,0,buf);
    rb->snprintf(buf, sizeof(buf), "%d", dirs);
    rb->lcd_putsxy(fontwidth,fontheight,buf);
    rb->lcd_update();
#else
    rb->snprintf(buf, sizeof(buf), "Files:%5d", files);
    rb->lcd_puts(0,0,buf);
    rb->snprintf(buf, sizeof(buf), "Dirs: %5d", dirs);
    rb->lcd_puts(0,1,buf);
#endif
}

void traversedir(char* location, char* name)
{
    int button;
    struct dirent *entry;
    DIR* dir;
    char fullpath[MAX_PATH];

    rb->snprintf(fullpath, sizeof(fullpath), "%s/%s", location, name);
    dir = rb->opendir(fullpath);
    if (dir) {
        entry = rb->readdir(dir);
        while (entry) {
            if (abort == true)
                break;
            /* Skip .. and . */
            if (rb->strcmp(entry->d_name, ".") && rb->strcmp(entry->d_name, ".."))
            {
                if (entry->attribute & ATTR_DIRECTORY) {
                    traversedir(fullpath, entry->d_name);
                    dirs += 1;
                }
                else
                    /* Might want to only count .mp3, .ogg etc. */
                    files++;
            }
            if (*rb->current_tick - lasttick > (HZ/2)) {
                update_screen();
                lasttick = *rb->current_tick;
                button = rb->button_get(false);
                if (button == STATS_STOP) {
                    abort = true;
                    break;
                }
            }

            entry = rb->readdir(dir);
        }
        rb->closedir(dir);
    }
}

enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
    int button;
    TEST_PLUGIN_API(api);

    (void)parameter;

    rb = api;
    files = 0;
    dirs = 0;
    abort = false;

#ifdef HAVE_LCD_BITMAP
    rb->lcd_getstringsize("Files: ", &fontwidth, &fontheight);
#endif
    rb->splash(HZ, true, "Counting..");
    update_screen();
    lasttick = *rb->current_tick;

    traversedir("", "");
    if (abort == true) {
        rb->splash(HZ, true, "Aborted");
        return PLUGIN_OK;
    }
    rb->splash(HZ, true, "Done");
    update_screen();
    button = rb->button_get(true);
    while (1) {
        switch (button) {
            case STATS_STOP:
                return PLUGIN_OK;
                break;
            default:
                if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
                    return PLUGIN_USB_CONNECTED;
                }
                break;
        }
        return PLUGIN_OK;
    }
}