From a8dab4c08af0e1d251ff633a2859c8b9b24efc7c Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Wed, 30 Jun 2004 13:31:14 +0000 Subject: New screen dump feature for recorders git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4817 a1c6a512-1295-4272-9138-f99709370657 --- apps/debug_menu.c | 13 +++++++++ apps/misc.c | 9 ++++-- apps/misc.h | 5 ++++ firmware/drivers/serial.c | 51 --------------------------------- firmware/usb.c | 67 +++++++++++++++++++++++++++++--------------- uisimulator/win32/button.c | 10 +++++++ uisimulator/x11/button-x11.c | 10 +++++++ 7 files changed, 89 insertions(+), 76 deletions(-) diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 02b86feefc..0b4be9d72d 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -1612,6 +1612,18 @@ static bool dbg_sound(void) return false; } +#ifdef HAVE_LCD_BITMAP +extern bool do_screendump_instead_of_usb; + +bool dbg_screendump(void) +{ + do_screendump_instead_of_usb = !do_screendump_instead_of_usb; + splash(HZ, true, "Screendump %s", + do_screendump_instead_of_usb?"enabled":"disabled"); + return false; +} +#endif + bool debug_menu(void) { int m; @@ -1635,6 +1647,7 @@ bool debug_menu(void) #endif #ifdef HAVE_LCD_BITMAP { "View battery", -1, view_battery }, + { "Screendump", -1, dbg_screendump }, #endif { "View HW info", -1, dbg_hw_info }, { "View partitions", -1, dbg_partitions }, diff --git a/apps/misc.c b/apps/misc.c index be1c3202fb..701f766a8d 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -23,6 +23,7 @@ #include "sprintf.h" #include "errno.h" #include "system.h" +#include "timefuncs.h" #define ONE_KILOBYTE 1024 #define ONE_MEGABYTE (1024*1024) @@ -102,7 +103,7 @@ int main(int argc, char **argv) #endif -#ifdef SCREENDUMP +#ifdef HAVE_LCD_BITMAP extern unsigned char lcd_framebuffer[LCD_HEIGHT/8][LCD_WIDTH]; static unsigned char bmpheader[] = { @@ -117,7 +118,6 @@ static unsigned char bmpheader[] = static unsigned char buf[112*8]; static unsigned char buf2[112*8]; static char dummy[2] = {0, 0}; -static int fileindex = 0; void screen_dump(void) { @@ -125,6 +125,7 @@ void screen_dump(void) int i, shift; int x, y; char filename[MAX_PATH]; + struct tm *tm = get_time(); i = 0; for(y = 0;y < LCD_HEIGHT/8;y++) @@ -151,7 +152,9 @@ void screen_dump(void) } } - snprintf(filename, MAX_PATH, "/dump%03d.bmp", fileindex++); + snprintf(filename, MAX_PATH, "/dump %04d-%02d-%02d %02d-%02d-%02d.bmp", + tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); f = creat(filename, O_WRONLY); if(f >= 0) { diff --git a/apps/misc.h b/apps/misc.h index c8aa266d5f..329c62750c 100644 --- a/apps/misc.h +++ b/apps/misc.h @@ -30,3 +30,8 @@ char *num2max5(unsigned int bytes, char *max5); * stored in buffer. */ int read_line(int fd, char* buffer, int buffer_size); + +#ifdef HAVE_LCD_BITMAP +/* Save a .BMP file containing the current screen contents. */ +void screen_dump(void); +#endif diff --git a/firmware/drivers/serial.c b/firmware/drivers/serial.c index 2badf2e39f..11dadc6f19 100644 --- a/firmware/drivers/serial.c +++ b/firmware/drivers/serial.c @@ -35,12 +35,6 @@ #define VOLUP 0xD0 #define VOLDN 0xE0 -#ifdef SCREENDUMP -#define SCRDMP 0xF0 - -static void screen_dump(void); -#endif - void serial_setup (void) { /* Set PB10 function to serial Rx */ @@ -118,11 +112,6 @@ int remote_control_rx(void) last_valid_button = BUTTON_RC_RIGHT; break; -#ifdef SCREENDUMP - case SCRDMP: - screen_dump(); - break; -#endif default: last_valid_button = BUTTON_NONE; break; @@ -144,43 +133,3 @@ int remote_control_rx(void) return ret; } - -#ifdef SCREENDUMP -static void serial_enable_tx(void) -{ - SCR1 |= 0x20; -} - -static void serial_tx(unsigned char ch) -{ - while (!(SSR1 & SCI_TDRE)) - { - ; - } - - /* - * Write data into TDR and clear TDRE - */ - TDR1 = ch; - SSR1 &= ~SCI_TDRE; -} - -static void screen_dump(void) -{ - int x, y; - int level; - - serial_enable_tx(); - - level = set_irq_level(HIGHEST_IRQ_LEVEL); - for(y = 0;y < LCD_HEIGHT/8;y++) - { - for(x = 0;x < LCD_WIDTH;x++) - { - serial_tx(lcd_framebuffer[y][x]); - } - } - set_irq_level(level); -} - -#endif diff --git a/firmware/usb.c b/firmware/usb.c index 280ff22f02..5350a8575e 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -35,6 +35,11 @@ extern void dbg_ports(void); /* NASTY! defined in apps/ */ +#ifdef HAVE_LCD_BITMAP +bool do_screendump_instead_of_usb = false; +void screen_dump(void); /* Nasty again. Defined in apps/ too */ +#endif + #define USB_REALLY_BRAVE #if !defined(SIMULATOR) && !defined(USB_NONE) @@ -149,13 +154,24 @@ static void usb_thread(void) switch(ev.id) { case USB_INSERTED: - /* Tell all threads that they have to back off the ATA. - We subtract one for our own thread. */ - num_acks_to_expect = - queue_broadcast(SYS_USB_CONNECTED, NULL) - 1; - waiting_for_ack = true; - DEBUGF("USB inserted. Waiting for ack from %d threads...\n", - num_acks_to_expect); +#ifdef HAVE_LCD_BITMAP + if(do_screendump_instead_of_usb) + { + screen_dump(); + } + else + { +#endif + /* Tell all threads that they have to back off the ATA. + We subtract one for our own thread. */ + num_acks_to_expect = + queue_broadcast(SYS_USB_CONNECTED, NULL) - 1; + waiting_for_ack = true; + DEBUGF("USB inserted. Waiting for ack from %d threads...\n", + num_acks_to_expect); +#ifdef HAVE_LCD_BITMAP + } +#endif break; case SYS_USB_CONNECTED_ACK: @@ -181,24 +197,31 @@ static void usb_thread(void) break; case USB_EXTRACTED: - if(usb_state == USB_INSERTED) +#ifdef HAVE_LCD_BITMAP + if(!do_screendump_instead_of_usb) { - /* Only disable the USB mode if we really have enabled it - some threads might not have acknowledged the - insertion */ - usb_slave_mode(false); - } +#endif + if(usb_state == USB_INSERTED) + { + /* Only disable the USB mode if we really have enabled it + some threads might not have acknowledged the + insertion */ + usb_slave_mode(false); + } - usb_state = USB_EXTRACTED; - - /* Tell all threads that we are back in business */ - num_acks_to_expect = - queue_broadcast(SYS_USB_DISCONNECTED, NULL) - 1; - waiting_for_ack = true; - DEBUGF("USB extracted. Waiting for ack from %d threads...\n", - num_acks_to_expect); + usb_state = USB_EXTRACTED; + + /* Tell all threads that we are back in business */ + num_acks_to_expect = + queue_broadcast(SYS_USB_DISCONNECTED, NULL) - 1; + waiting_for_ack = true; + DEBUGF("USB extracted. Waiting for ack from %d threads...\n", + num_acks_to_expect); #ifdef HAVE_LCD_CHARCELLS - lcd_icon(ICON_USB, false); + lcd_icon(ICON_USB, false); +#endif +#ifdef HAVE_LCD_BITMAP + } #endif break; diff --git a/uisimulator/win32/button.c b/uisimulator/win32/button.c index c9bd1ad04e..4532727200 100644 --- a/uisimulator/win32/button.c +++ b/uisimulator/win32/button.c @@ -23,6 +23,7 @@ #include "button.h" #include "kernel.h" #include "backlight.h" +#include "misc.h" /* how long until repeat kicks in */ #define REPEAT_START 6 @@ -89,6 +90,15 @@ void button_event(int key, bool pressed) case VK_SPACE: new_btn = BUTTON_PLAY; break; + + case VK_NUMPAD0: + case VK_F5: + if(pressed) + { + screen_dump(); + return; + } + break; #else case VK_RETURN: new_btn = BUTTON_MENU; diff --git a/uisimulator/x11/button-x11.c b/uisimulator/x11/button-x11.c index eae55318ad..1b2c19232f 100644 --- a/uisimulator/x11/button-x11.c +++ b/uisimulator/x11/button-x11.c @@ -19,6 +19,7 @@ #include "button.h" #include "kernel.h" #include "debug.h" +#include "misc.h" #include "X11/keysym.h" @@ -131,6 +132,15 @@ static int get_raw_button (void) case XK_3: k = BUTTON_F3; break; + + case XK_5: + if(!release) + { + screen_dump(); + return 0; + } + break; + #else case XK_KP_Add: case XK_Q: -- cgit v1.2.3