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

📄 treedir.c

📁 一款MP3 Player Firmware 的原代码,非常有参考价值
💻 C
字号:
#include "as31glue.h"#include "main.h"#include "printf.h"#include "sta013.h"//#include "display.h"#include "dirlist.h"#include "treedir.h"#include "paulmon2.h"#define TREEVIEW_NAME_LEN 16#define TREEVIEW_VALUE_LEN 5#define FIRST_DISPLAY_LINE 1#define LAST_DISPLAY_LINE  8#define SCROLL_OFFSET      0#define TREEBUF_MAX 24#define MAX_SUBDIRS (LAST_DISPLAY_LINE-FIRST_DISPLAY_LINE)static simm_id /* struct dl_struct */ top_dir;		// (first dir on screen)static simm_id /* struct dl_struct */ selected_dir;	// (selected dir)static simm_id /* struct fl_struct */ top_file;		// Same as for the dirsstatic simm_id /* struct fl_struct */ selected_file;static bit dir_selected;/* boolean to tell whether a file or dir is 			   selected */extern data simm_id temp_id;static xdata unsigned char treebuf[TREEBUF_MAX];static xdata unsigned char treebuf_len;static xdata unsigned char treedir_value[PARAM_COUNT];// these 2 appear to be write only variables, never// actually used in the display codestatic xdata unsigned char line_selected_fl;static xdata unsigned char line_selected_dl;dirlist_t * data dl_struct;filelist_t * data fl_struct;// treeview_display displays the list directories on the lcd_display//#pragma NOGCSEvoidtreedir_display(){	xdata unsigned char i;	xdata unsigned char j;	//xdata unsigned char k;	xdata unsigned char current_line;	xdata unsigned char *source;	xdata unsigned char *dest;	simm_id cur_dir;	simm_id cur_file;	simm_id store[MAX_SUBDIRS];	xdata unsigned char store_level;	print("\r\n\r\n\r\nBegin treedir_display\r\n");	if (dir_selected) {		store_level=0;		cur_dir=top_dir;		if (top_dir==0 || cur_dir==0) {    			return;		}		// work out basic store level		temp_id=top_dir;		while(temp_id != 0) {			dl_struct=addr6(temp_id);			temp_id=dl_struct->parent_dir;			store_level++;		}		store_level--;		dl_struct = Addr6(selected_dir);		printf("selected_dir: %s\r\n", Addr7(dl_struct->long_name));		dl_struct = Addr6(cur_dir);		printf("1st: %s\r\n", Addr7(dl_struct->long_name));		// work through all the dirs displaying (where being displayed)		for (current_line = FIRST_DISPLAY_LINE;		  (current_line <= LAST_DISPLAY_LINE) && cur_dir != 0;		  current_line++) {			dl_struct = Addr6(cur_dir);				//printf("tree: %s (%d) (%d)\r\n", Addr7(dl_struct->long_name),			//   store_level, dl_struct->next);				// turn off scrolling, clear line, switch to current line,			// switch to tree font			print("\\A0\\L");			print_char((char)(current_line + 31));			print("\\[\\B ");			print_char((char)(current_line + 31));			print("\\C!");			// for each level (character)			for(i=0; i<store_level; i++) {				temp_id=cur_dir;				dl_struct=addr6(temp_id);				// get this level dir				for(j=i; j<store_level; j++) {					temp_id=dl_struct->parent_dir;					dl_struct=addr6(temp_id);				}				if(dl_struct->next==0)					print_char(' ');				else					print("\\!");			}			dl_struct = Addr6(cur_dir);			// determine tree character			if (dl_struct->next==0)				print("\\+"); // last entry			else				print("\\*"); // continuation entry			// change font for selection			if (cur_dir==selected_dir)				print("\\C!"); // bold    			else				print("\\C "); // normal			// print heading			source = Addr7(dl_struct->long_name);			dest = treebuf;			treebuf_len = 0;			while(*source != '\0') {				treebuf_len++;				if(treebuf_len >= TREEBUF_MAX-store_level)					break;				else					*dest = *source;					source++;					dest++;			}			*dest = '\0';			print_str(treebuf);			print("\\C \\]");			print_crlf();			// drop down a level, or continue on this level, or drop back?			if((dl_struct->subdir_start)!=0 &&			  store_level<MAX_SUBDIRS && // expand this subdir?			  dl_struct->treedir_expand==1) {				//print("\r\nexpanding subdir\r\n");				// store (simm_id) of next subdir in the list				// note: can't use parent_dir later and avoid this				//       because we need to know position in linked list				store[store_level]=dl_struct->next;				store_level++;				// change subdir to one below				cur_dir=dl_struct->subdir_start;			} else {				cur_dir=dl_struct->next;				while(store_level>0 && cur_dir==0) {					// restore (simm_id) of next dir					store_level--;					cur_dir=store[store_level];					//print("\r\ndropping back...");				}				//printf("cur_dir=%d\r\n", cur_dir);			}		}	} else {		cur_file = top_file;		if (top_file==0 || cur_file == 0)			return;		for (current_line = FIRST_DISPLAY_LINE;		  (current_line <= LAST_DISPLAY_LINE) && cur_file !=0;		  current_line++) {			fl_struct = Addr6(cur_file);					// clear line, turn off scrolling, switch to current line,			// switch to tree font			print("\\A0\\L");			print_char((char)(current_line + 31));			print("\\[\\B ");			print_char((char)(current_line + 31));			print("\\C!");			// determine tree character			if (fl_struct->next==0)				print("\\+"); // last file			else				print("\\*"); // continuation			// change font if selected and set scroll			if (cur_file==selected_file)				print("\\C!\\A2"); // bold			else				print("\\C \\A0"); // normal			// print filename			source = Addr7(fl_struct->long_name);			dest = treebuf;			treebuf_len = 0;			while(*source!='\0') {				treebuf_len++;				if(treebuf_len >= TREEBUF_MAX && cur_file!=selected_file)					break;				else					*dest = *source;				source++;				dest++;			}			*dest = '\0';			print_str(treebuf);			print("\\C \\]");			print_crlf;			// change to next file if there are any remaining			cur_file=fl_struct->next;		}	}}unsigned chartreedir_user_action(event_t event){	//xdata unsigned char i;	// returns 1 if display needs updating	dl_struct = Addr6(selected_dir);	//printf("treedir_expand: %hx\r\n", dl_struct->treedir_expand);  switch(event) {  case E_RIGHT:	if(dl_struct->treedir_expand==2){	//Play file selected in filelist		fl_struct=Addr6(selected_file);		e_play_selected_file = fl_struct->pl_entry;		add_new_event(E_PLAY_SELECTED);		return 0;		break;	}	if(dl_struct->treedir_expand==1 || dl_struct->subdir_start==0) {										// goto filelist if needed		//dir_selected=dir_selected?0:1;		dir_selected ^= 1;		selected_file=dl_struct->filelist_start;		top_file=selected_file;		line_selected_fl=0;		if(dl_struct->subdir_start==0)			dl_struct->treedir_expand++;	}	if(dl_struct->treedir_expand!=2) {	// go deeper		dl_struct->treedir_expand++;	}	return 1;	break;  case E_LEFT:	if(dl_struct->treedir_expand!=0)	// go shallower		dl_struct->treedir_expand--;	if(dl_struct->treedir_expand==1) {	// change out from filelist if		//dir_selected=dir_selected?0:1;	// needed		dir_selected ^= 1;		if(dl_struct->subdir_start==0)			dl_struct->treedir_expand--;	}	return 1;	break;	  case E_DOWN:	if(dir_selected) {		// look for next heading or expanded param		if (dl_struct->treedir_expand==1 && dl_struct->subdir_start) {			// drop to next dir down			selected_dir=dl_struct->subdir_start;		} else if(dl_struct->next) {			selected_dir=dl_struct->next;		} else {			// need to try all higher-up directories			temp_id=selected_dir;			while(dl_struct->next==0 && temp_id!=root) {				temp_id=dl_struct->parent_dir;				dl_struct=addr6(temp_id);			}			if(temp_id==root) {				//print("\r\nback to root\r\n");				return 0;			} else {				selected_dir=dl_struct->next;				//printf("\r\nnext=%s\r\n", Addr7(dl_struct->long_name));			}		}		// also, pan down if necessary		if (line_selected_dl < LAST_DISPLAY_LINE - SCROLL_OFFSET) {			line_selected_dl++;			//not panning whole display down		} else {			//panning whole display down			dl_struct = Addr6(top_dir);			if (dl_struct->treedir_expand==1 && dl_struct->subdir_start) {				top_dir=dl_struct->subdir_start;			} else if(dl_struct->next) {				top_dir=dl_struct->next;			} else {				// need to try all higher-up directories				temp_id=top_dir;				while(dl_struct->next==0 && temp_id!=root) {					temp_id=dl_struct->parent_dir;					dl_struct=addr6(temp_id);				}					if(temp_id==root) {					//back to root					return 0;				} else {					top_dir=dl_struct->next;				}			}		}	} else { //scroll filelist		fl_struct=Addr6(selected_file);		//printf("\r\ntop_file: %x, selected_file: %x, line_selected: %hx\r\n", top_file, selected_file, line_selected_fl);		//Go to next file if exists		if(fl_struct->next) {			selected_file=fl_struct->next;			//pan down if necessary			if(line_selected_fl < LAST_DISPLAY_LINE - SCROLL_OFFSET)				line_selected_fl++;			else {				fl_struct=Addr6(top_file);				if(fl_struct->next)					top_file=fl_struct->next;			}		}		else			return 0;			}    return 1;    break;	case E_UP:    // find previous item to that selected	if(dir_selected){ // scroll dirlist    	if(dl_struct->prev) {			// previous in same directory, trivial if not expanded			//print("\r\nprevious in same directory, trivial\r\n");			selected_dir=dl_struct->prev;			dl_struct=Addr6(selected_dir);			while(dl_struct->treedir_expand==1 && dl_struct->subdir_end) {				selected_dir=dl_struct->subdir_end;				dl_struct=Addr6(selected_dir);			}		} else if(dl_struct->parent_dir && selected_dir!=root		/*dl_struct->parent_dir!=root*/) {			//print("\r\nprevious in parent dir\r\n");			// previous is up a directory			selected_dir=dl_struct->parent_dir;			dl_struct=Addr6(selected_dir);		} else {			//print("\r\nno previous!!!\r\n");			return 0;		}    		// now, pan display up if necessary		if (line_selected_dl >= FIRST_DISPLAY_LINE + SCROLL_OFFSET) {			line_selected_dl--;			//print("\r\ndecremented line_selected\r\n");		} else {			//print("\r\nset top_dir=selected_dir\r\n");			top_dir=selected_dir; // dir is same at top and selected		}	} else { // scroll filelist		fl_struct=Addr6(selected_file);		//printf("\r\ntop_file: %x, selected_file: %x, line_selected: %hx\r\n", top_file, selected_file, line_selected_fl);			//Go to next file if not first		if(fl_struct->prev)			selected_file=fl_struct->prev;		else			return 0;		if(line_selected_fl >= FIRST_DISPLAY_LINE + SCROLL_OFFSET)			line_selected_fl--;		else			top_file=selected_file;	}    return 1;    break;  case E_DEC:#if 0 	if(!dir_selected) {		line_selected_fl=0;		for(i=0;i<=MAX_SUBDIRS && ((filelist_t *)Addr6(top_dir))->next;i++)			top_file=fl_struct->next;					selected_file=top_file;	}    return 1;    break;#endif  case E_INC:#if 0	if(!dir_selected) {		line_selected_fl=0;		for(i=0;i<=MAX_SUBDIRS && ((filelist_t *)Addr6(top_dir))->prev;i++)			top_file=fl_struct->prev;		selected_file=top_file;	}	return 1;#endif	break;  default:    printf("Unsupported event %d\r\n", event);    break;  }    return 0;}// TODO: remove thissimm_id treedir_get_selected(void) {	fl_struct = addr6(selected_file);	return fl_struct->pl_entry;}void treedir_init() {  line_selected_dl = FIRST_DISPLAY_LINE;  line_selected_fl = FIRST_DISPLAY_LINE;  //dl_struct=Addr6(root);  //top_dir=dl_struct->subdir_start;  top_dir=root;  selected_dir=top_dir;  top_file=0;  selected_file=0;    dir_selected=1;    //dl_struct=Addr6(top_dir);  //printf("Initialized tree directory: root=%x top_dir=%x\r\n", root, top_dir);}

⌨️ 快捷键说明

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