https://bitbucket.org/hudson/magic-lantern
Raw File
Tip revision: 284c98443573705c42002c179320a0bd13753e43 authored by a1ex on 12 December 2011, 20:27:12 UTC
Optimize for size
Tip revision: 284c984
console.c
// script console

#include "bmp.h"
#include "dryos.h"
#include "menu.h"
#include "gui.h"
#include "property.h"

void console_printf(const char* fmt, ...); // how to replace the normal printf?
#define printf console_printf

#define CONSOLE_W 55
#define CONSOLE_H 15
#define CONSOLE_FONT FONT_MED

// buffer is circular and filled with spaces
#define BUFSIZE (CONSOLE_H * CONSOLE_W)
char* console_buffer = 0;

char* console_puts_buffer = 0; // "normal" copy of the circular buffer

int console_buffer_index = 0; 

int console_visible = 0;

FILE* console_log_file = 0;
void console_show() 
{ 
	console_visible = 1;
	FIO_RemoveFile(CARD_DRIVE "console.log");
	console_log_file = FIO_CreateFile(CARD_DRIVE "console.log");
	//~ bmp_printf(FONT_LARGE, 0, 0, "CONSOLE ON ");
	console_printf("\nMagic Lantern console\n");
}
void console_hide() 
{ 
	console_visible = 0;
	msleep(500);
	clrscr();
	FIO_CloseFile(console_log_file);
	console_log_file = 0;
	//~ bmp_printf(FONT_LARGE, 0, 0, "CONSOLE OFF");
}

static void
console_toggle( void * priv )
{
	if (console_visible) console_hide();
	else console_show();
}

static void
console_test( void * priv )
{
	console_visible = 1;
	printf("Hello World!\n");
	printf("The quick brown fox jumps over the lazy dog. Computer programs expand so as to fill the core available. El trabajo y la economia son la mejor loteria. \n");
}

static void
console_print( void * priv, int x, int y, int selected )
{
	bmp_printf(
		selected ? MENU_FONT_SEL : MENU_FONT,
		x, y,
		"Debug Console: %s",
		*(unsigned*) priv ? "ON " : "OFF"
	);
}

static struct menu_entry script_menu[] = {
	/*{
		.priv		= "Console test",
		.display	= menu_print,
		.select		= console_test,
	},*/
	{
		.priv = &console_visible,
		.display	= console_print,
		.select		= console_toggle,
	},
};

void console_clear()
{
	if (!console_buffer) return;
	int i;
	for (i = 0; i < BUFSIZE; i++)
		console_buffer[i] = ' ';
}
void console_init()
{
	console_buffer = AllocateMemory(BUFSIZE+32);
	console_puts_buffer = AllocateMemory(BUFSIZE+32);

	console_clear();
	
	menu_add( "Debug", script_menu, COUNT(script_menu) );
}

void console_puts(const char* str) // don't DebugMsg from here!
{
	#define NEW_CHAR(c) console_buffer[mod(console_buffer_index++, BUFSIZE)] = (c)
	
	if (console_log_file)
		my_fprintf( console_log_file, "%s", str );
	
	if (!console_buffer) return 0;
	char* c = str;
	while (*c)
	{
		if (*c == '\n')
			while (mod(console_buffer_index, CONSOLE_W) != 0) 
				NEW_CHAR(' ');
		else if (*c == '\t')
		{
			NEW_CHAR(' ');
			while (mod(mod(console_buffer_index, CONSOLE_W), 4) != 0) 
				NEW_CHAR(' ');
		}
		else if (*c == 8)
		{
			console_buffer_index = mod(console_buffer_index - 1, BUFSIZE);
			console_buffer[mod(console_buffer_index, BUFSIZE)] = 0;
		}
		else
			NEW_CHAR(*c);
		c++;
	}
	console_buffer[mod(console_buffer_index, BUFSIZE)] = 0;
}

void console_printf(const char* fmt, ...) // don't DebugMsg from here!
{
	char buf[256];
	va_list			ap;
	va_start( ap, fmt );
	int len = vsnprintf( buf, 256, fmt, ap );
	va_end( ap );
	console_puts(buf);
}

void console_draw()
{
	if (!console_buffer) return 0;
	if (!console_puts_buffer) return 0;
	unsigned x0 = 720/2 - fontspec_font(CONSOLE_FONT)->width * CONSOLE_W/2;
	unsigned y0 = 480/2 - fontspec_font(CONSOLE_FONT)->height * CONSOLE_H/2;
	unsigned w = fontspec_font(CONSOLE_FONT)->width * CONSOLE_W;
	unsigned h = fontspec_font(CONSOLE_FONT)->height * CONSOLE_H;
	int i;

	int found_cursor = 0;
	for (i = 0; i < BUFSIZE; i++)
	{
		// last character should be on last line => this ensures proper scrolling
		int cbpos = mod((console_buffer_index / CONSOLE_W) * CONSOLE_W  + CONSOLE_W + i, BUFSIZE);
		if (console_buffer[cbpos] == 0) // end of data
		{ 
			if (!found_cursor)
			{
				console_puts_buffer[i] = '_';
				found_cursor = 1;
				continue;
			}
		}
		console_puts_buffer[i] = found_cursor ? ' ' : console_buffer[cbpos];
	}
	console_puts_buffer[BUFSIZE] = 0;
	bmp_puts_w(FONT(CONSOLE_FONT,COLOR_WHITE,COLOR_BG_DARK), &x0, &y0, CONSOLE_W, console_puts_buffer);
}


static void
console_task( void )
{
	console_init();
	while(1)
	{
		if (console_visible && !gui_menu_shown())
		{
			console_draw();
		}
		msleep(200);
	}
}

TASK_CREATE( "console_task", console_task, 0, 0x1f, 0x1000 );


//~ INIT_FUNC(__FILE__, console_init);


back to top