我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了
一 . 如何实现命令缓存
在之前已经完成了键盘的响应工作,但这种响应却是有很大的问题,比如说对于一次按键的两次中断处理。后来我把两种中断都加入了响应判断中,这样就不会有之前第10天所提到的bug了。
* 在替换函数中完成识别。修改如下
char* replace_char(char s[40]){ char *chr = "$" ; if((strcmp(s,"1E")==0)||(strcmp(s,"9E")==0)){ chr = "a" ; }else if((strcmp(s,"30")==0)||(strcmp(s,"B0")==0)){ chr = "b" ; } ... // 省略 return chr ;* 这里是一些功能按键的识别修改
// Enter -> 回车键 响应之前缓存的命令 换行 if((strcmp(s,"1C")==0)||(strcmp(s,"9C")==0)){ action_command(binfo); //响应命令 write_x = 58 ; //下面是换行 write_y += 19 ; putfonts8_asc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>"); } // F1 -> 终端刷新 类似于clear命令 else if((strcmp(s,"3B")==0)||(strcmp(s,"BB")==0)){ //关于F1的响应中断 sprintf(command,"%s",""); // 命令缓存清空 flag = 0 ; // 按键模式回复默认,这个看第10天,本质目的是为了处理一次按键的两次终端 new_pe(binfo); // 通过操作显存直接刷新当前终端 putfonts8_asc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>"); } // Backspace -> 删格键 else if(strcmp(s,"0E")==0){ // 回退 write_x -= 8 ; boxfill8(binfo->vram, binfo->scrnx , COL8_000000, write_x, write_y, write_x+19, write_y+19); if(write_x<=58){ write_x = 146 ; write_y -= 19 ; } } 这些就是按键识别上目前修改的内容了。
接下来我们要添加一个功能,在每次按键之后,不但在屏幕上显示这个键,而且将他缓存在缓冲区,在下次回车的时候进行识别,并清空。
先来看一个简单的demo
// command数组就是命令缓存区 char command[100] = ""; void add_command(char *s) { sprintf(command,"%s%s",command,s); } void action_command(){ // 响应 } 二 . 实现
command就是一个命令缓存数组,每次按键之后调用add_command()命令将这次的按键保存。
char* replace_char(char s[40]){ char *chr = "$" ; if((strcmp(s,"1E")==0)||(strcmp(s,"9E")==0)){ chr = "a" ; }else if((strcmp(s,"30")==0)||(strcmp(s,"B0")==0)){ chr = "b" ; } ... // 省略 return chr ; // Enter -> 回车键 响应之前缓存的命令 换行 if((strcmp(s,"1C")==0)||(strcmp(s,"9C")==0)){ action_command(binfo); //响应命令 write_x = 58 ; //下面是换行 write_y += 19 ; putfonts8_asc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>"); } // F1 -> 终端刷新 类似于clear命令 else if((strcmp(s,"3B")==0)||(strcmp(s,"BB")==0)){ //关于F1的响应中断 sprintf(command,"%s",""); // 命令缓存清空 flag = 0 ; // 按键模式回复默认,这个看第10天,本质目的是为了处理一次按键的两次终端 new_pe(binfo); // 通过操作显存直接刷新当前终端 putfonts8_asc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>"); } // Backspace -> 删格键 else if(strcmp(s,"0E")==0){ // 回退 write_x -= 8 ; boxfill8(binfo->vram, binfo->scrnx , COL8_000000, write_x, write_y, write_x+19, write_y+19); if(write_x<=58){ write_x = 146 ; write_y -= 19 ; } } // command数组就是命令缓存区 char command[100] = ""; void add_command(char *s) { sprintf(command,"%s%s",command,s); } void action_command(){ // 响应 } 