⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 深圳优龙科技LPC2468开发板BIOS.
💻 C
字号:
/*****************************************************************************
 *   shell.c:  BIOSBOX Shell实现
 *
 *   Copyright(C) 2007, uCdragon
 *   All rights reserved.
 *
 *   History
 *   2007.03.16  lqm@ucdragon.net
 *
******************************************************************************/
#include "def.h"
#include "board.h"
#include "utils.h"

#define MAX_CMD_LEN           30
#define MAX_CMD_HIS           5
#define CTRL_KEY(k)           (k+1-'A')

#define ESC_UP_KEY		      0x41
#define ESC_DOWN_KEY	      0x42
#define ESC_RIGHT_KEY	      0x43
#define ESC_LEFT_KEY	      0x44
#define ESC_HOME_KEY	      0x48
#define ESC_END_KEY		      0x4b

#define UP_KEY		          CTRL_KEY('W')
#define DOWN_KEY	          CTRL_KEY('S')
#define RIGHT_KEY	          CTRL_KEY('D')
#define LEFT_KEY	          CTRL_KEY('A')

#define	ENTER_KEY	          0x0d
#define	BACK_KEY	          0x08
#define	ESC_KEY		          0x1b
#define	SPACE_KEY		      0x20

//import from command.c
void ExcuteCommand(char * cmd);

void ShowBootInfo(char * board )
{
	puts  ( "\n ***************************************\n" );
	puts  ( "*                                       *\n" );
	printf( "*      BIOSBOX for %8s  V1.00      *\n",board );
	printf( "*       LQM %s %s        *\n" , __DATE__ , __TIME__ );
	puts  ( "*       http://www.uCdragon.com         *\n" );
	puts  ( "*                                       *\n" );
	puts  ( " ***************************************\n\n" );
}

char Escape(char key)
{
	switch(key)
	{
		case ESC_UP_KEY:
		  return UP_KEY;
		case ESC_DOWN_KEY:
		  return DOWN_KEY;
		case ESC_LEFT_KEY:
		  return LEFT_KEY;
		case ESC_RIGHT_KEY:
		  return RIGHT_KEY;
		default:
		  return 0;
	}
}
void ShowNewCmd(int cursor,int len,char * dest,char * src)
{	while(cursor--) putch(BACK_KEY);
	cursor = len;
	while(cursor--) putch(SPACE_KEY);
	while(len--) putch(BACK_KEY);
	if(src)
	{
		puts(src);
		while(*src) * dest ++ = * src ++;
	}
}
void BeginShell(char * board)
{
	char his[MAX_CMD_HIS][MAX_CMD_LEN];
	int lens[MAX_CMD_HIS] = {0};
	int escaping = 0;
	int entry=0;
	int etemp=-1;
	int modified=0;
	int cursor=0;
	char key;
	int temp;

	ShowBootInfo(board);
	SecInitBoard();
	puts("> ");

	while(TRUE)
	{	key=getch();
		if(escaping ) 
		{
			if(key == '[') key = Escape(getch());
			escaping = 0;
		}
		switch(key)
		{
			case 0:
				break;
			case ESC_KEY:
				escaping = 1;
				break;
			case ENTER_KEY:
				if(lens[entry])
				{
					his[entry][lens[entry]] = 0;
					cursor = 0;
					ExcuteCommand(his[entry]);
					if(modified)
					{
						if(++entry == MAX_CMD_HIS) entry = 0;
						etemp = entry;
						modified = 0;
					}
					else if(++etemp == MAX_CMD_HIS) etemp = 0;
					lens[entry] = 0;
				}
				puts("\n> ");
				break;
			case BACK_KEY:
				if(cursor > 0) 
				{
					modified = 1;
					putch(BACK_KEY);
					cursor --;
					lens[entry] --;
					if(cursor < lens[entry]) {
						for(temp =cursor;temp<lens[entry];temp++)
						{
							his[entry][temp] =his[entry][temp+1];
							putch(his[entry][temp]);
						}
					}
					putch(SPACE_KEY);
					putch(BACK_KEY);
					if(cursor < lens[entry]) {
						for(temp =cursor;temp<lens[entry];temp++)
						{	
							putch(BACK_KEY);
						}
					}
				}
				break;
			case UP_KEY:
				temp = etemp-1;
				if(temp == -1) temp = MAX_CMD_HIS -1;
				if(temp == entry) break;
				if(lens[temp] == 0) break;
				etemp = temp;
				ShowNewCmd(cursor,lens[entry],his[entry],his[etemp]);
				modified = 0;
				lens[entry] = cursor = lens[etemp];
				break;
			case DOWN_KEY:
				if(etemp == entry) break;
				if(++etemp == MAX_CMD_HIS) etemp = 0;
				ShowNewCmd(cursor,lens[entry],his[entry],etemp == entry? 0 : his[etemp]);
				modified = 0;
				cursor = etemp == entry ? 0 : lens[etemp];
				lens[entry] = cursor ;
				break;
			case LEFT_KEY:
				if(cursor > 0)  
				{
					cursor --;
					putch(BACK_KEY);
				}
				break;
			case RIGHT_KEY:
				if(cursor < lens[entry]) 
				{
					putch(his[entry][cursor ++]);
				}
				break;
			default:
				modified = 1;
				if(cursor >= MAX_CMD_LEN-1) break;
				if(key < SPACE_KEY) key = SPACE_KEY;
				putch(key);
				if(cursor < lens[entry])
				{
					for(temp = lens[entry];temp > cursor;temp--) his[entry][temp] = his[entry][temp-1];
					for(temp = cursor+1;temp <= lens[entry];temp++) putch(his[entry][temp]);
					for(temp = cursor;temp < lens[entry];temp++) putch(BACK_KEY);
				}
				his[entry][cursor++] = key;
				lens[entry]++;
				break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -