1.make.py添加输出源文件的命令 2.解决找不到usart设备导致文件管理无法退出卡死的问题 3.解决点击关于本机卡死的问题 4.解决工具界面中文工具显示乱码的问题
		
			
				
	
	
		
			357 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | ||
| #include "tools.h"
 | ||
| #include "nrf.h"
 | ||
| #include "mymem.h"
 | ||
| #include "system_file.h"
 | ||
| #include "system_updata.h"
 | ||
| #include "random.h"
 | ||
| #include "libc.h"
 | ||
| 
 | ||
| 
 | ||
| #ifndef BOOTLOADER
 | ||
| 	#include "rthw.h"
 | ||
| 	#define IRQ_DISABLE() 		rt_enter_critical()
 | ||
| 	#define IRQ_ENABLE()			rt_exit_critical()
 | ||
| #else
 | ||
| 	#define IRQ_DISABLE() { }
 | ||
| 	#define IRQ_ENABLE()	{ }
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*------------------------文件传输相关函数-----------------------------*/
 | ||
| 
 | ||
| // 1,使用nrf,否则使用串口
 | ||
| #define USE_NRF 0
 | ||
| 
 | ||
| static int tools_updata_thread_on(void);
 | ||
| static int tools_updata_thread_off(void);
 | ||
| 
 | ||
| int tools_updata_on(void)
 | ||
| {
 | ||
|     tools_updata_thread_on();
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int tools_updata_off(void)
 | ||
| {
 | ||
|     tools_updata_thread_off();
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| static int g_updata_work;
 | ||
| static int g_updata_down;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| static int tools_updata_all_frame(uint8_t *data,int *len,uint8_t dat);
 | ||
| static void cd_updata_thread(void *t)
 | ||
| {
 | ||
|     g_updata_down=0;
 | ||
|     uint8_t *data=mymalloc(256);
 | ||
|     int len=0;
 | ||
|     #if USE_NRF==1
 | ||
|     if(nrf_init()!=NRF_OK)
 | ||
|     {
 | ||
|         g_updata_down=1;
 | ||
|         myfree(data);
 | ||
|         return ;
 | ||
|     }
 | ||
|     #else
 | ||
|     FILE *f=fopen("usart","r");
 | ||
|     if(f==NULL) {
 | ||
|       myfree(data);
 | ||
|       g_updata_down=1;
 | ||
|       return;
 | ||
|     }
 | ||
|     #endif
 | ||
|     while(1)
 | ||
|     {
 | ||
|         rt_thread_delay(20);
 | ||
|         if(g_updata_work)
 | ||
|         {
 | ||
|             uint8_t dat=0;
 | ||
|             #if USE_NRF==1
 | ||
|             while(nrf_read_byte(&dat)==NRF_OK)
 | ||
|             #else
 | ||
|             int get_c;
 | ||
|             while(get_c=getc(f),dat=get_c,get_c!=EOF)
 | ||
|             #endif
 | ||
|             {
 | ||
|                 if(tools_updata_all_frame(data,&len,dat))
 | ||
|                 {
 | ||
|                     SysFile_UpdataByIrq(data,len);
 | ||
|                     #if USE_NRF==1
 | ||
|                     nrf_send((uint8_t []){0},1,0);
 | ||
|                     #else
 | ||
|                     putc(0,f);
 | ||
|                     #endif
 | ||
|                     len=0;
 | ||
|                     mymemset(data,0,4);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         else
 | ||
|             break;
 | ||
|     }
 | ||
|     #if USE_NRF==1
 | ||
|     nrf_deinit();
 | ||
|     #else
 | ||
|     fclose(f);
 | ||
|     #endif
 | ||
|     myfree(data);
 | ||
|     g_updata_down=1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| static int tools_updata_thread_on(void)
 | ||
| {
 | ||
|     if(g_updata_work==0)
 | ||
|     {
 | ||
|         g_updata_work=1;
 | ||
|         rt_thread_t t=rt_thread_create("updata",cd_updata_thread,0,512,5,20);
 | ||
|         rt_thread_startup(t);
 | ||
|         return 0;
 | ||
|     }
 | ||
|     return -1;
 | ||
| }
 | ||
| 
 | ||
| static int tools_updata_thread_off(void)
 | ||
| {
 | ||
|     if(g_updata_work)
 | ||
|     {
 | ||
|         g_updata_work=0;
 | ||
|         while(g_updata_down==0)
 | ||
|         {
 | ||
|             // 等待直到GPS服务线程退出
 | ||
|             rt_thread_delay(5);
 | ||
|         }
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| // 判断是否是一个完整帧,是返回1
 | ||
| static int tools_updata_all_frame(uint8_t *data,int *len,uint8_t dat)
 | ||
| {
 | ||
|     if(*len<0) return 0;
 | ||
|     if(*len<2) {
 | ||
|         if(dat==0xff)
 | ||
|             {data[*len]=dat;(*len)++;}
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         data[*len]=dat;(*len)++;
 | ||
|         if(*len>=4)
 | ||
|         {
 | ||
|             if(((data[2]<<8)|data[3])==*len-2)
 | ||
|                 return 1;
 | ||
|         }
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /*------------------------文件传输相关函数End--------------------------*/
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| // 获取随机数函数实现
 | ||
| int rand(void)
 | ||
| {
 | ||
|     RANDOM_Init();
 | ||
|     return RANDOM_Get();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| // 重定向rt-thread 的打印输出函数
 | ||
| // void rt_hw_console_output(const char *str)
 | ||
| // {
 | ||
| //   while(*str)
 | ||
| //   {
 | ||
| //     fputc(*str, stdout);
 | ||
| //     str++;
 | ||
| //   }
 | ||
| // }
 | ||
| 
 | ||
| 
 | ||
| #define chars_wid       (480/8)
 | ||
| #define chars_hid       (272/16)
 | ||
| 
 | ||
| typedef struct{
 | ||
|     int pos_x;
 | ||
|     int pos_y;
 | ||
|     int wchar;//双字节字符
 | ||
|     char chars[chars_hid][chars_wid];
 | ||
| }stdout_file;
 | ||
| 
 | ||
| static stdout_file *g_stdout_file;
 | ||
| 
 | ||
| static int topen(void)
 | ||
| {
 | ||
|   stdout_file *file=g_stdout_file;
 | ||
|   if(file==NULL)
 | ||
|   {
 | ||
|     file=mymalloc(sizeof(stdout_file));
 | ||
|     mymemset(file,0,sizeof(stdout_file));
 | ||
|     g_stdout_file=file;
 | ||
|   }
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| static int tclose(void)
 | ||
| {
 | ||
|   stdout_file **file=&g_stdout_file;
 | ||
|   if(*file)
 | ||
|   {
 | ||
|     myfree(*file);
 | ||
|     *file=0;
 | ||
|   }
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| static void puts_inc_y(stdout_file *p);
 | ||
| 
 | ||
| // x方向自增
 | ||
| static void puts_inc_x(stdout_file *p)
 | ||
| {
 | ||
|     p->pos_x++;
 | ||
|     if(p->pos_x>=chars_wid)
 | ||
|     {
 | ||
|         p->pos_x=0;
 | ||
|         puts_inc_y(p);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // y方向自增
 | ||
| static void puts_inc_y(stdout_file *p)
 | ||
| {
 | ||
|     p->pos_y++;
 | ||
|     if(p->pos_y>=chars_hid)
 | ||
|     {
 | ||
|         memcpy(p->chars[0],p->chars[1],(chars_hid-1)*chars_wid);
 | ||
|         memset(p->chars[chars_hid-1],0,chars_wid);
 | ||
|         p->pos_y--;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // 存储一个字符
 | ||
| static void puts_char(stdout_file *p,int ch)
 | ||
| {
 | ||
|     p->chars[p->pos_y][p->pos_x]=ch;
 | ||
| }
 | ||
| 
 | ||
| static int put(int ch)
 | ||
| {
 | ||
|   stdout_file *file=g_stdout_file;
 | ||
| 
 | ||
|   if(file)
 | ||
|   {
 | ||
|     if(ch>0x80)
 | ||
|     {
 | ||
|       if(file->pos_x>=chars_wid-2)
 | ||
|       {
 | ||
|         puts_inc_y(file);
 | ||
|         file->pos_x=0;
 | ||
|       }
 | ||
|       file->wchar=1;
 | ||
|       puts_char(file,ch);
 | ||
|       puts_inc_x(file);
 | ||
|     }
 | ||
|     else if(file->wchar)
 | ||
|     {
 | ||
|       puts_char(file,ch);
 | ||
|       puts_inc_x(file);
 | ||
|       file->wchar=0;
 | ||
|     }
 | ||
|     else if(ch>=' '&&ch<='~')
 | ||
|     {
 | ||
|       puts_char(file,ch);
 | ||
|       puts_inc_x(file);
 | ||
|     }
 | ||
|     else if(ch=='\r')
 | ||
|     {
 | ||
|       file->pos_x=0;
 | ||
|     }
 | ||
|     else if(ch=='\n') {
 | ||
|       puts_inc_y(file);
 | ||
|       file->pos_x=0;
 | ||
|     }
 | ||
|     else if(ch=='\t'){
 | ||
|     }
 | ||
|     return ch;
 | ||
|   }
 | ||
|   return EOF;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| static int puts_(const void *ptr,int size)
 | ||
| {
 | ||
|   for(int i=0;i<size;i++)
 | ||
|   {
 | ||
|     put(((uint8_t *)ptr)[i]);
 | ||
|   }
 | ||
|   return size;
 | ||
| }
 | ||
| 
 | ||
| extern_device2(lcd,topen,tclose,put,NULL,puts_,NULL);
 | ||
| 
 | ||
| 
 | ||
| // 绘制调试信息到屏幕
 | ||
| void tools_dbg_print(int (*draw_txt)(int c,int x,int y))
 | ||
| {
 | ||
|   stdout_file *p=g_stdout_file;
 | ||
|   if(draw_txt==NULL) return;
 | ||
|   if(p==NULL) return;
 | ||
|   uint8_t *str;
 | ||
|   for(int y=0;y<chars_hid;y++)
 | ||
|   {
 | ||
|     for(int x=0;x<chars_wid;)
 | ||
|     {
 | ||
|       str=(uint8_t *)&p->chars[y][x];
 | ||
|       if(str[0]>0x80)
 | ||
|       {
 | ||
|         draw_txt((str[0]<<8)|str[1],x*8,y*16);
 | ||
|         x+=2;
 | ||
|       }
 | ||
|       else
 | ||
|       {
 | ||
|         draw_txt(str[0],x*8,y*16);
 | ||
|         x+=1;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 |