From cbaa8be3ea2446da9c63a0c843c06afedbeba2d8 Mon Sep 17 00:00:00 2001 From: Vojtech Bocek Date: Wed, 30 Jan 2013 19:06:26 +0100 Subject: [PATCH] Add progress dots to USB tab, update rom_info.txt --- Android.mk | 3 ++- multirom.c | 2 ++ multirom_ui.c | 11 ++++++++ progressdots.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ progressdots.h | 24 ++++++++++++++++++ rom_info.txt | 2 +- 6 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 progressdots.c create mode 100644 progressdots.h diff --git a/Android.mk b/Android.mk index da7aa00..d00549f 100644 --- a/Android.mk +++ b/Android.mk @@ -14,7 +14,8 @@ LOCAL_SRC_FILES:= \ listview.c \ checkbox.c \ button.c \ - pong.c + pong.c \ + progressdots.c LOCAL_MODULE:= multirom LOCAL_MODULE_TAGS := eng diff --git a/multirom.c b/multirom.c index abf725a..297bacb 100644 --- a/multirom.c +++ b/multirom.c @@ -1761,8 +1761,10 @@ void *multirom_usb_refresh_thread_work(void *status) if(stat("/dev/block", &info) >= 0 && info.st_ctime > last_change) { multirom_update_partitions((struct multirom_status*)status); + if(usb_refresh_handler) (*usb_refresh_handler)(); + last_change = info.st_ctime; } timer = 500; diff --git a/multirom_ui.c b/multirom_ui.c index 95a25c5..d5bdb51 100644 --- a/multirom_ui.c +++ b/multirom_ui.c @@ -16,6 +16,7 @@ #include "checkbox.h" #include "version.h" #include "pong.h" +#include "progressdots.h" #define HEADER_HEIGHT 75 #define TAB_BTN_WIDTH 165 @@ -394,6 +395,7 @@ typedef struct fb_text *title_text; fb_text *usb_text; button *boot_btn; + progdots *usb_prog; } tab_roms; void *multirom_ui_tab_rom_init(int tab_type) @@ -475,6 +477,9 @@ void multirom_ui_tab_rom_destroy(void *data) fb_rm_text(t->rom_name); + if(t->usb_prog) + progdots_destroy(t->usb_prog); + free(t); } @@ -600,9 +605,15 @@ void multirom_ui_tab_rom_set_empty(void *data, int empty) int y = center_y(HEADER_HEIGHT, t->list->h, SIZE_NORMAL); t->usb_text = fb_add_text(x, y, WHITE, SIZE_NORMAL, txt); list_add(t->usb_text, &t->ui_elements); + + x = (fb_width/2) - (PROGDOTS_W/2); + t->usb_prog = progdots_create(x, y+100); } else if(!empty && t->usb_text) { + progdots_destroy(t->usb_prog); + t->usb_prog = NULL; + list_rm(t->usb_text, &t->ui_elements, &fb_remove_item); t->usb_text = NULL; } diff --git a/progressdots.c b/progressdots.c new file mode 100644 index 0000000..c7bb293 --- /dev/null +++ b/progressdots.c @@ -0,0 +1,68 @@ +#include +#include "progressdots.h" + +// ms +#define SWITCH_SPEED 800 +#define THREAD_SLEEP 50 + +static void *progdots_thread(void *data) +{ + progdots *p = (progdots*)data; + int timer = SWITCH_SPEED; + + while(p->run) + { + if(timer <= THREAD_SLEEP) + { + if(++p->active_dot >= PROGDOTS_CNT) + p->active_dot = 0; + + progdots_set_active(p, p->active_dot); + fb_draw(); + + timer = SWITCH_SPEED; + } + else timer -= THREAD_SLEEP; + + usleep(THREAD_SLEEP*1000); + } + return NULL; +} + +progdots *progdots_create(int x, int y) +{ + progdots *p = malloc(sizeof(progdots)); + memset(p, 0, sizeof(progdots)); + p->x = x; + p->y = y; + p->run = 1; + + int i; + for(i = 0; i < PROGDOTS_CNT; ++i) + { + p->dots[i] = fb_add_rect(x, y, PROGDOTS_H, PROGDOTS_H, (i == 0 ? LBLUE : WHITE)); + x += PROGDOTS_H + (PROGDOTS_W - (PROGDOTS_CNT*PROGDOTS_H))/(PROGDOTS_CNT-1); + } + pthread_create(&p->thread, NULL, progdots_thread, p); + fb_draw(); + return p; +} + +void progdots_destroy(progdots *p) +{ + p->run = 0; + pthread_join(p->thread, NULL); + + int i; + for(i = 0; i < PROGDOTS_CNT; ++i) + fb_rm_rect(p->dots[i]); + free(p); +} + +void progdots_set_active(progdots *p, int dot) +{ + p->active_dot = dot; + int i; + for(i = 0; i < PROGDOTS_CNT; ++i) + p->dots[i]->color = (i == dot ? LBLUE : WHITE); +} diff --git a/progressdots.h b/progressdots.h new file mode 100644 index 0000000..0353c77 --- /dev/null +++ b/progressdots.h @@ -0,0 +1,24 @@ +#ifndef PROGRESSDOTS_H +#define PROGRESSDOTS_H + +#include +#include "framebuffer.h" + +#define PROGDOTS_W 300 +#define PROGDOTS_H 10 +#define PROGDOTS_CNT 8 + +typedef struct +{ + int x, y; + pthread_t thread; + volatile int run; + fb_rect *dots[PROGDOTS_CNT]; + int active_dot; +} progdots; + +progdots *progdots_create(int x, int y); +void progdots_destroy(progdots *p); +void progdots_set_active(progdots *p, int dot); + +#endif diff --git a/rom_info.txt b/rom_info.txt index b76c2f8..92784ab 100644 --- a/rom_info.txt +++ b/rom_info.txt @@ -39,6 +39,6 @@ initrd_path="%r/boot/initrd.img" # - %s - root directory, from root of the root device # - %i - root image, from root of the root device # - %f - fs of the root image -base_cmdline="%b root=%d rootfstype=%r rw console=tty0 fbcon=rotate:1 access=m2 quiet splash rootflags=defaults,noatime,nodiratime" +base_cmdline="%b root=%d rootfstype=%r rw console=tty0 access=m2 quiet splash rootflags=defaults,noatime,nodiratime" img_cmdline="loop=%i loopfstype=%f" dir_cmdline="rootsubdir=%s"