summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2004-06-30 13:31:14 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2004-06-30 13:31:14 +0000
commita8dab4c08af0e1d251ff633a2859c8b9b24efc7c (patch)
treebe8b66535d905e50319788f988f94ab008a48ba3
parent058302a4807e14d564195de9825e3aa970ea68f9 (diff)
downloadrockbox-a8dab4c08af0e1d251ff633a2859c8b9b24efc7c.zip
rockbox-a8dab4c08af0e1d251ff633a2859c8b9b24efc7c.tar.gz
rockbox-a8dab4c08af0e1d251ff633a2859c8b9b24efc7c.tar.bz2
rockbox-a8dab4c08af0e1d251ff633a2859c8b9b24efc7c.tar.xz
New screen dump feature for recorders
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4817 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/debug_menu.c13
-rw-r--r--apps/misc.c9
-rw-r--r--apps/misc.h5
-rw-r--r--firmware/drivers/serial.c51
-rw-r--r--firmware/usb.c67
-rw-r--r--uisimulator/win32/button.c10
-rw-r--r--uisimulator/x11/button-x11.c10
7 files changed, 89 insertions, 76 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 02b86fe..0b4be9d 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 be1c320..701f766 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 c8aa266..329c627 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 2badf2e..11dadc6 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 280ff22..5350a85 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 c9bd1ad..4532727 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 eae5531..1b2c192 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: