找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4881|回复: 0
打印 上一主题 下一主题
收起左侧

stm32单片机自制pda之theme.c源代码

[复制链接]
跳转到指定楼层
楼主
ID:37685 发表于 2013-9-5 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
完整代码下载地址:http://www.51hei.com/f/29782212PDA.rar
#include <stm32f10x_lib.h>
#include "theme.h"
#include "ff.h"//包含文件系统,更新主题用
#include "w25x16.h"//包含Flash驱动,读取主题用
#include "ILI9320.h"//包含LCD驱动,显示文本用
#include "ui.h"//包含ui,显示窗体用
#include "touch.h"//包含触摸屏,控制用
#include "delay.h"//包含延时,触摸屏连续读坐标用
#include "app.h"//包含软件包,检测SD卡用
#include "picdecoder.h"//包含图像解码,更新图标用
#include "string.h"//更新图标用
#include "readme.h"//引用readme
////////////////////////////////////////////////
//地址说明
//对话框指示图标:32×32
//主界面图标:56×56
//文件管理图标:16×16
////////////////////////////////////////////////
//此文件实现和主题有关的功能
//包括:
//更新图标
//更新字库
//待机画面延时
//屏幕关闭延时
////////////////////////////////////////////////
u8 bootup_font_update=0;//开机强制更新字库标志
#if ICO_TO_SD==0//图标存放在flash时候需要判断是否更新图标
u8 bootup_ico_update=0;//开机强制更新图标标志
#endif
//字库地址
ico fon12;//font12地址:0-7
ico fon16;//font16地址:8-15
ico oem2uni;//oem2uni地址:16-23
ico uni2oem;//uni2oem地址:24-31
//主界面图标地址
ico setup;//设置图标地址:16-23
ico music;//音乐图标地址:24-31
ico radio;//收音机图标地址:32-39
ico drawing;//绘图板图标地址:40-47
ico notebook;//记事本图标地址:48-55
ico source;//资源管理器图标地址:56-63
ico others;//附加功能图标地址:64-71
ico date;//日历图标地址:72-79
ico pic;//图库图标地址:80-87
//文件管理器图标地址
ico filejak;//文件夹图标地址:88-95
ico shutdown;//关机微标图片地址:96-103
ico sound;//音乐图标地址:104-111
ico txt;//txt文档图标地址:112-119
ico picture;//图片图标地址:120-127
ico files;//文件图标地址:128-135
ico drive;//驱动器图标地址:136-143
//告示图标地址
ico right;//对号图标地址:144-151
ico wrong;//错号图标地址:152-159
ico sigh;//感叹号图标地址:160-167
ico question;//问号图标地址:168-175
ico recycle;//垃圾桶图标地址:176-183
//设置菜单下的图标
ico tmd;//时间与日期图标
ico font;//更新字库图标地址
ico icon;//更新图标图标地址
ico scrsaver;//屏保图标地址
ico about;//关于图标地址
ico sd;//SD卡图标地址
ico scroff;//屏幕关闭图标地址
ico target;//屏幕校准图标地址
//开机画面图标
ico bootup;//开机画面图标地址
//调色板
ico colorpad;//调色板地址
//主题初始化,读取Flash中的相应项目地址
void Theme_Init(void)
{
u32 temp[2];
u8 t[2];
//主界面图标地址
//12字体
SPI_Flash_Read((u8*)temp,2,8);//从0开始读出8字节地址数据
fon12.addr=temp[0];
fon12.size=temp[1];
//16字体
SPI_Flash_Read((u8*)temp,10,8);//从0开始读出8字节地址数据
fon16.addr=temp[0];
fon16.size=temp[1];
//oem2uni地址
SPI_Flash_Read((u8*)temp,18,8);//从0开始读出8字节地址数据
oem2uni.addr=temp[0];
oem2uni.size=temp[1];
//uni2oem地址
SPI_Flash_Read((u8*)temp,26,8);//从0开始读出8字节地址数据
uni2oem.addr=temp[0];
uni2oem.size=temp[1];

#if ICO_TO_SD==0//图标放flash的操作
//设置图标
SPI_Flash_Read((u8*)temp,34,8);//从0开始读出8字节地址数据
setup.addr=temp[0];
setup.size=temp[1];
//音乐图标
SPI_Flash_Read((u8*)temp,42,8);//从0开始读出8字节地址数据
music.addr=temp[0];
music.size=temp[1];
//收音机图标
SPI_Flash_Read((u8*)temp,50,8);//从0开始读出8字节地址数据
radio.addr=temp[0];
radio.size=temp[1];
//绘图板图标
SPI_Flash_Read((u8*)temp,58,8);//从0开始读出8字节地址数据
drawing.addr=temp[0];
drawing.size=temp[1];
//记事本图标
SPI_Flash_Read((u8*)temp,66,8);//从0开始读出8字节地址数据
notebook.addr=temp[0];
notebook.size=temp[1];
//资源管理器图标地址
SPI_Flash_Read((u8*)temp,74,8);//从0开始读出8字节地址数据
source.addr=temp[0];
source.size=temp[1];
//附加功能图标地址
SPI_Flash_Read((u8*)temp,82,8);//从0开始读出8字节地址数据
others.addr=temp[0];
others.size=temp[1];
//日历图标地址
SPI_Flash_Read((u8*)temp,90,8);//从0开始读出8字节地址数据
date.addr=temp[0];
date.size=temp[1];
//图库图标地址
SPI_Flash_Read((u8*)temp,98,8);//从0开始读出8字节地址数据
pic.addr=temp[0];
pic.size=temp[1];
//文件管理器图标地址
//文件夹图标地址
SPI_Flash_Read((u8*)temp,106,8);//从0开始读出8字节地址数据
filejak.addr=temp[0];
filejak.size=temp[1];
//关机微标图片地址
SPI_Flash_Read((u8*)temp,114,8);//从0开始读出8字节地址数据
shutdown.addr=temp[0];
shutdown.size=temp[1];
//音乐图标地址
SPI_Flash_Read((u8*)temp,122,8);//从0开始读出8字节地址数据
sound.addr=temp[0];
sound.size=temp[1];
//txt文档图标地址
SPI_Flash_Read((u8*)temp,130,8);//从0开始读出8字节地址数据
txt.addr=temp[0];
txt.size=temp[1];
//图片图标地址
SPI_Flash_Read((u8*)temp,138,8);//从0开始读出8字节地址数据
picture.addr=temp[0];
picture.size=temp[1];
//文件图标地址
SPI_Flash_Read((u8*)temp,146,8);//从0开始读出8字节地址数据
files.addr=temp[0];
files.size=temp[1];
//驱动器图标地址
SPI_Flash_Read((u8*)temp,154,8);//从0开始读出8字节地址数据
drive.addr=temp[0];
drive.size=temp[1];

//告示图标地址
//对号图标地址
SPI_Flash_Read((u8*)temp,162,8);//从0开始读出8字节地址数据
right.addr=temp[0];
right.size=temp[1];
//错号图标地址
SPI_Flash_Read((u8*)temp,170,8);//从0开始读出8字节地址数据
wrong.addr=temp[0];
wrong.size=temp[1];
//感叹号图标地址
SPI_Flash_Read((u8*)temp,178,8);//从0开始读出8字节地址数据
sigh.addr=temp[0];
sigh.size=temp[1];
//问号图标地址
SPI_Flash_Read((u8*)temp,186,8);//从0开始读出8字节地址数据
question.addr=temp[0];
question.size=temp[1];
//垃圾桶图标地址
SPI_Flash_Read((u8*)temp,194,8);//从0开始读出8字节地址数据
recycle.addr=temp[0];
recycle.size=temp[1];
//设置功能下图标地址
//时间与日期图标地址
SPI_Flash_Read((u8*)temp,202,8);//从0开始读出8字节地址数据
tmd.addr=temp[0];
tmd.size=temp[1];
//更新字库图标地址
SPI_Flash_Read((u8*)temp,210,8);//从0开始读出8字节地址数据
font.addr=temp[0];
font.size=temp[1];
//更新图标图标地址
SPI_Flash_Read((u8*)temp,218,8);//从0开始读出8字节地址数据
icon.addr=temp[0];
icon.size=temp[1];
//屏保图标地址
SPI_Flash_Read((u8*)temp,226,8);//从0开始读出8字节地址数据
scrsaver.addr=temp[0];
scrsaver.size=temp[1];
//关于图标地址
SPI_Flash_Read((u8*)temp,234,8);//从0开始读出8字节地址数据
about.addr=temp[0];
about.size=temp[1];
//sd卡图标地址
SPI_Flash_Read((u8*)temp,242,8);//从0开始读出8字节地址数据
sd.addr=temp[0];
sd.size=temp[1];
//屏幕关闭延时图标地址
SPI_Flash_Read((u8*)temp,250,8);//从0开始读出8字节地址数据
scroff.addr=temp[0];
scroff.size=temp[1];
//屏幕校准图标地址
SPI_Flash_Read((u8*)temp,258,8);//从0开始读出8字节地址数据
target.addr=temp[0];
target.size=temp[1];
//开机画面图标地址
SPI_Flash_Read((u8*)temp,266,8);//从0开始读出8字节地址数据
bootup.addr=temp[0];
bootup.size=temp[1];
//调色板地址
SPI_Flash_Read((u8*)temp,274,8);//从0开始读出8字节地址数据
colorpad.addr=temp[0];
colorpad.size=temp[1];
#else
setup.addr=1;
music.addr=2;
radio.addr=3;
drawing.addr=4;
notebook.addr=5;
source.addr=6;
others.addr=7;
date.addr=8;
pic.addr=9;
filejak.addr=10;
shutdown.addr=11;
sound.addr=12;
txt.addr=13;
picture.addr=14;
files.addr=15;
drive.addr=16;
right.addr=17;
wrong.addr=18;
sigh.addr=19;
question.addr=20;
recycle.addr=21;
tmd.addr=22;
font.addr=23;
icon.addr=24;
scrsaver.addr=25;
about.addr=26;
sd.addr=27;
scroff.addr=28;
target.addr=29;
bootup.addr=30;
colorpad.addr=31;
#endif
//检查字库图标是否存在
SPI_Flash_Read(t,0,2);//读取字库,图标存在标记
if(t[0]!=0xaa)//字库不存在
{
  bootup_font_update=1;
  clear(0,0,240,320,0);
  show_string(0,0,240,"Updating system Font...",16,color(255,0,0));
  if(Font_Update())//显示蓝屏错误界面
  {
   show_string(0,16,240,"Information:",12,color(255,255,255));
   show_string(0,32,240,"System Font lost!",12,color(255,255,255));
   show_string(0,48,240,"Direction:",12,color(255,255,255));
   show_string(0,64,240,"0:/font/fon12.dzk",12,color(255,255,255));
   show_string(0,80,240,"0:/font/fon16.dzk",12,color(255,255,255));
   show_string(0,96,240,"0:/font/uni2oem.bin",12,color(255,255,255));
   show_string(0,112,240,"0:/font/oem2uni.bin",12,color(255,255,255));
   while(1);//蓝屏死机
  }
}
#if ICO_TO_SD==0
if(t[1]!=0xbb)//图标不存在
{
  bootup_ico_update=1;
  if(Ico_Update())//显示蓝屏错误界面
  {
   clear(0,0,240,320,color(0,0,255));
   show_string(0,0,240,"System Error!!",12,color(255,255,255));
   show_string(0,16,240,"Information:",12,color(255,255,255));
   show_string(0,32,240,"System Icon lost!",12,color(255,255,255));
   show_string(0,48,240,"Direction:",12,color(255,255,255));
   show_string(0,64,240,"\"0:/ico\"[Include about 30 icons.]",12,color(255,255,255));
   while(1);//蓝屏死机
  }
}
#endif
}
extern u8 SPI_FLASH_BUF[4096];
//生成readme文件
void Creat_Readme(void)
{
FIL readme;
UINT bytewrite;
u32 count=0;
u8 *buf=SPI_FLASH_BUF;
if(f_open(&readme,"0:/readme.txt",FA_OPEN_EXISTING)==FR_NO_FILE)
{
  f_open(&readme,"0:/readme.txt",FA_OPEN_ALWAYS|FA_WRITE);
  while(read_me[count]!='\0')//复制readme
  {
   if((read_me[count]!='[')&&(read_me[count]!=']'))buf[count]=read_me[count];
   else//写入回车符
   {
    if(read_me[count]=='[')buf[count]=0x0d;
    if(read_me[count]==']')buf[count]=0x0a;
   }
   count++;
  }
  f_write(&readme,SPI_FLASH_BUF,count,&bytewrite);
  f_close(&readme);
}
}
//字库更新
extern u8 jpg_buffer[1024];//引用图片解码缓存
const u8 font_warming[]=
{"此操作将更新系统字库,"\
"请务必确认字库来源,"\
"未知来源的字库可能会导致文本显示大面积乱码,是否继续?"\
"如果继续,请把相关文件命名为指定名称后存放在SD卡根目录的FONT文件夹里,"\
"并点击'是(Y)',取消请点击'否(N)'。详情参阅readme.txt。"\
};
u8 Font_Update(void)
{
u8 *buffer=jpg_buffer;//字库更新缓存,大小为2扇区,引用图片解码缓存
u32 temp[2];//用以缓存文件地址和大小
u8 t[1];
u32 i=0,offset=2048;//字节数缓存,offset为Flash数据起始地址
u8 sta=0;//操作缓存
FIL file;//文件读取缓存
UINT b_left;//文件剩余字节数
u16 byte_to_read=1024;//需要读取的文件字节数
//界面提示
//先还原坐标,避免上一次数据的影响
Pen_Point.x0=0;
Pen_Point.y0=0;
if(Reflash_SD())
{
  if(bootup_font_update)
  {
   clear(0,0,240,320,0);
   show_string(0,0,240,"Updating system font...",16,color(255,0,0));
   goto BOOTUP_RENEW;
  }
  Windows(10,80,230,240,"注意——更新字库",12);//显示窗体,标题栏高18
  show_string(23,106,200,font_warming,12,color(0,0,0));//文本框高度28,文本框长180
  Button(20,208,68,232,UNPRESS,"是(Y)",30,12);//显示是按钮
  Button(172,208,220,232,UNPRESS,"否(N)",30,12);//显示否按钮
//  show_ico(15,107,59,151,question.addr,question.size);//显示疑问图标(这个注释掉,避免在图标还没更新的情况下显示图标导致死机)
  while(sta==0)
  {
   if(Pen_Point.Key_Sta==Key_Down)
   {
    Pen_Int_Set(0);//关闭中断
    Pen_Point.Key_Sta=Key_Up;
    do//连续读取数据
    {
     Convert_Pos();
     if(Is_In_Area(20,208,68,232))//((Pen_Point.x0>20)&&(Pen_Point.x0<68))&&((Pen_Point.y0>208)&&(Pen_Point.y0<232)))
     sta=1;
     else if(Is_In_Area(172,208,220,232))//((Pen_Point.x0>172)&&(Pen_Point.x0<220))&&((Pen_Point.y0>208)&&(Pen_Point.y0<232)))
     sta=2;
     else sta=0;
     if(sta==1)Button(20,208,68,232,PRESS,"是(Y)",30,12);//显示是按钮
     else if(sta==2)Button(172,208,220,232,PRESS,"否(N)",30,12);//显示否按钮
     else if(sta==0)
     {
      Button(20,208,68,232,UNPRESS,"是(Y)",30,12);//显示是按钮
      Button(172,208,220,232,UNPRESS,"否(N)",30,12);//显示否按钮
     }
     Delay_us(50);
    }while(T_PEN==0);
    Pen_Int_Set(1);//开启中断
   }
  }
  if(sta==2)goto CANCEL;
  if(sta==1)
  {
BOOTUP_RENEW:
   //更新12字体
   //更新过程
   Windows(10,80,230,240,"字库更新中……",12);//显示窗体,标题栏高18
   Button(98,208,146,232,INVALID,"取消",24,12);//显示取消按钮,居中
   //提示字体(居中显示)
   show_string(70,135,240,"更新fon12.dzk……",12,color(0,0,0));
   if(f_open(&file,"0:/font/fon12.dzk",FA_READ)!=FR_OK)
   {
    if(bootup_font_update)return 1;
    else goto NOFILE;
   }
   while(1)
   {
    f_read(&file,buffer,byte_to_read,&b_left);//从SD卡中读取
    SPI_Flash_Write(buffer,i+offset,byte_to_read);//写入Flash
    //进度条
    Progress_Bar(20,155,200,i,file.fsize,1);//进度条长度200
    if((b_left<byte_to_read)&&(b_left!=0))byte_to_read=b_left;
    else if(b_left==0)break;//读取完毕,退出
    i+=1024;
   }
   fon12.addr=2048;//记录字库地址
   temp[0]=fon12.addr;
   temp[1]=file.fsize;
   offset=file.fsize+fon12.addr;//获取偏移值
   i=0;
   byte_to_read=1024;//还原要读字节数
   f_close(&file);//关闭fon12.dzk
   SPI_Flash_Write((u8*)temp,2,8);//写入地址数据
   
   //更新16字体
   //更新过程
   Windows(10,80,230,240,"字库更新中……",12);//显示窗体,标题栏高18
   Button(98,208,146,232,INVALID,"取消",24,12);//显示取消按钮,居中
   //提示字体(居中显示)
   show_string(70,135,240,"更新fon16.dzk……",12,color(0,0,0));
   if(f_open(&file,"0:/font/fon16.dzk",FA_READ)!=FR_OK)
   {
    if(bootup_font_update)return 1;
    else goto NOFILE;
   }
   while(1)
   {
    f_read(&file,buffer,byte_to_read,&b_left);//从SD卡中读取
    SPI_Flash_Write(buffer,i+offset,byte_to_read);//写入Flash
    //进度条
    Progress_Bar(20,155,200,i,file.fsize,1);//进度条长度200
    if((b_left<byte_to_read)&&(b_left!=0))byte_to_read=b_left;
    else if(b_left==0)break;//读取完毕,退出
    i+=1024;
   }
   fon16.addr=offset;
   temp[0]=fon16.addr;
   temp[1]=file.fsize;
   offset=file.fsize+fon16.addr;//重新获得下一个文件的偏移地址
   i=0;
   byte_to_read=1024;//还原要读字节数
   f_close(&file);
   SPI_Flash_Write((u8*)temp,10,8);//写入fon16地址信息
   //更新oem2uni
   //更新过程
   Windows(10,80,230,240,"字库更新中……",12);//显示窗体,标题栏高18
   Button(98,208,146,232,INVALID,"取消",24,12);//显示取消按钮,居中
   //提示字体(居中显示)
   show_string(70,135,240,"更新oem2uni.bin……",12,color(0,0,0));
   if(f_open(&file,"0:/font/oem2uni.bin",FA_READ)!=FR_OK)
   {
    if(bootup_font_update)return 1;
    else goto NOFILE;
   }
   while(1)
   {
    f_read(&file,buffer,byte_to_read,&b_left);//从SD卡中读取
    SPI_Flash_Write(buffer,i+offset,byte_to_read);//写入Flash
    //进度条
    Progress_Bar(20,155,200,i,file.fsize,1);//进度条长度200
    if((b_left<byte_to_read)&&(b_left!=0))byte_to_read=b_left;
    else if(b_left==0)break;//读取完毕,退出
    i+=1024;
   }
   oem2uni.addr=offset;
   temp[0]=oem2uni.addr;
   temp[1]=file.fsize;
   offset=file.fsize+oem2uni.addr;//重新获得下一个文件的偏移地址
   i=0;
   byte_to_read=1024;//还原要读字节数
   f_close(&file);
   SPI_Flash_Write((u8*)temp,18,8);//写入oem2uni地址信息

   //更新uni2oem
   //更新过程
   Windows(10,80,230,240,"字库更新中……",12);//显示窗体,标题栏高18
   Button(98,208,146,232,INVALID,"取消",24,12);//显示取消按钮,居中
   //提示字体(居中显示)
   show_string(70,135,240,"更新uni2oem.bin……",12,color(0,0,0));
   if(f_open(&file,"0:/font/uni2oem.bin",FA_READ)!=FR_OK)
   {
    if(bootup_font_update)return 1;
    else goto NOFILE;
   }
   while(1)
   {
    f_read(&file,buffer,byte_to_read,&b_left);//从SD卡中读取
    SPI_Flash_Write(buffer,i+offset,byte_to_read);//写入Flash
    //进度条
    Progress_Bar(20,155,200,i,file.fsize,1);//进度条长度200
    if((b_left<byte_to_read)&&(b_left!=0))byte_to_read=b_left;
    else if(b_left==0)break;//读取完毕,退出
    i+=1024;
   }
   uni2oem.addr=offset;
   temp[0]=uni2oem.addr;
   temp[1]=file.fsize;
   offset=file.fsize+uni2oem.addr;//重新获得下一个文件的偏移地址
   i=0;
   byte_to_read=1024;//还原要读字节数
   f_close(&file);
   SPI_Flash_Write((u8*)temp,26,8);//写入uni2oem地址信息
   //更新完成,写入字库存在标志
   t[0]=0xaa;
   SPI_Flash_Write(t,0,1);//写入0xaa为字库存在标志
   bootup_font_update=0;//还原开机更新标志
   sta=0;
   goto END;//退出
  }
NOFILE:
  Windows(10,80,230,240,"注意——更新字库失败",12);//显示窗体,标题栏高18
  Button(98,208,146,232,UNPRESS,"确定",24,12);//显示取消按钮,居中
  //提示字体(居中显示)
  show_string(41,153,200,"未找到相应文件,更新失败!",12,color(0,0,0));//文本框高度28,文本框长180
//  show_ico(15,137,59,181,wrong.addr,wrong.size);//显示错误图标(注释掉,避免图标未更新之前显示图标导致死机)
  goto OUT;
END:
  Windows(10,80,230,240,"注意——更新字库成功",12);//显示窗体,标题栏高18
  Button(98,208,146,232,UNPRESS,"确定",24,12);//显示取消按钮,居中
  //提示字体(居中显示)
  show_string(89,153,200,"更新完成!",12,color(0,0,0));//文本框高度28,文本框长180
//  show_ico(15,137,59,181,right.addr,right.size);//显示正确图标(注释掉,避免图标未更新之前显示图标导致死机)
  goto OUT;
CANCEL:
  Windows(10,80,230,240,"注意——更新字库失败",12);//显示窗体,标题栏高18
  Button(98,208,146,232,UNPRESS,"确定",24,12);//显示取消按钮,居中
  //提示字体(居中显示)
  show_string(71,153,200,"操作被用户取消!",12,color(0,0,0));//文本框高度28,文本框长180
//  show_ico(15,137,59,181,sigh.addr,sigh.size);//显示感叹号图标(注释掉,避免图标未更新之前显示图标导致死机)
  goto OUT;
OUT:
  while(1)
  {
   if(Pen_Point.Key_Sta==Key_Down)
   {
    Pen_Int_Set(0);//关闭中断
    Pen_Point.Key_Sta=Key_Up;
    do//连续读取数据
    {
     Convert_Pos();
     if(Is_In_Area(98,208,146,232))//((Pen_Point.x0>98)&&(Pen_Point.x0<146))&&((Pen_Point.y0>208)&&(Pen_Point.y0<232)))
     {
      sta=1;
      Button(98,208,146,232,PRESS,"确定",24,12);//显示取消按钮,居中
     }
     else
     {
      sta=0;
      Button(98,208,146,232,UNPRESS,"确定",24,12);//显示取消按钮,居中
     }
     Delay_us(50);
    }while(T_PEN==0);
    Pen_Int_Set(1);//开启中断
    if(sta==1)break;
   }
  }
}
return 0;
}
#if ICO_TO_SD==0
//图片更新程序
//对话框指示图标:32×32
//主界面图标:56×56
//文件管理图标:16×16
const u8 ico_warming[]=
{
"注意,此操作将会替换系统内置图标,"\
"一般用于自定义用户图标,"\
"请用户在更新前将图标按照指定文件名存放在SD卡根目录下的ico文件夹里,"\
"点击'是(Y)'更新,点击'否(N)'退出,详情请查看SD卡根目录下的readme.txt文件。"\
};
const char fn_date[]={"DATE.BMP"};
const char fn_drawing[]={"DRAWING.BMP"};
const char fn_drive[]={"DRIVE.BMP"};
const char fn_filejak[]={"FILEJAK.BMP"};
const char fn_files[]={"FILES.BMP"};
const char fn_music[]={"MUSIC.BMP"};
const char fn_sound[]={"SOUND.BMP"};
const char fn_notebook[]={"NOTEBOOK.BMP"};
const char fn_txt[]={"TXT.BMP"};
const char fn_others[]={"OTHERS.BMP"};
const char fn_pic[]={"PIC.BMP"};
const char fn_picture[]={"PICTURE.BMP"};
const char fn_question[]={"QUESTION.BMP"};
const char fn_radio[]={"RADIO.BMP"};
const char fn_recycle[]={"RECYCLE.BMP"};
const char fn_source[]={"SOURCE.BMP"};
const char fn_right[]={"RIGHT.BMP"};
const char fn_setup[]={"SETUP.BMP"};
const char fn_shutdown[]={"SHUTDOWN.BMP"};
const char fn_sigh[]={"SIGH.BMP"};
const char fn_wrong[]={"WRONG.BMP"};
const char fn_tmd[]={"TMD.BMP"};
const char fn_font[]={"FONT.BMP"};
const char fn_ico[]={"ICO.BMP"};
const char fn_scrsaver[]={"SCRSAVER.BMP"};
const char fn_about[]={"ABOUT.BMP"};
const char fn_sd[]={"SD.BMP"};
const char fn_scroff[]={"SCROFF.BMP"};
const char fn_target[]={"TARGET.BMP"};
const char fn_bootup[]={"BOOTUP.BMP"};
const char fn_colorpad[]={"COLORPAD.BMP"};
const TCHAR ico_dir[]={"0:/ICO"};
const TCHAR _dir_[]={"/"};
u8 Ico_Update(void)
{
u8 *buffer=jpg_buffer;//图像读回缓存,大小为2扇区,引用图片解码缓存
u8 key=0;
u32 temp[2];//用来存放咚咚的起始地址和大小
u8 t[1];
u32 total_size=0;//需要更新的图标总大小
u32 progress_size=0;//总进度大小
u32 progress_size_index=0;//当前进度大小
//文件系统所需
FILINFO icoinfo;
FIL ico;
DIR dir;//搜索文件所用
UINT byteleft;
u32 byteread=1024;
u32 offset;
//更新图标所用,用来记录flash地址以及更新到的图标号数
u8 ico_count=0;
TCHAR direction[20];
u32 addr;
//先还原坐标,避免上一次数据的影响
Pen_Point.x0=0;
Pen_Point.y0=0;
if(Reflash_SD())
{
  if(bootup_ico_update)
  {
   clear(0,0,240,320,0);
   show_string(0,0,240,"Updating system icons...",16,color(255,0,0));
   goto REFLASH_ICO;
  }
  Windows(10,79,229,241,"注意——更新图标",12);//显示窗体
  show_string(23,105,200,ico_warming,12,color(0,0,0));//文本框高度28,文本框长180
  Button(19,209,67,233,UNPRESS,"是(Y)",30,12);//显示是按钮
  Button(171,209,219,233,UNPRESS,"否(N)",30,12);//显示否按钮
//  show_ico(10,107,64,151,question.addr,question.size);//显示疑问图标(这个注释掉,避免图标未更新之前显示图标导致死机)
  while(key==0)
  {
   if(Pen_Point.Key_Sta==Key_Down)
   {
    Pen_Int_Set(0);//关闭中断
    Pen_Point.Key_Sta=Key_Up;
    do//连续读取数据
    {
     Convert_Pos();
     if(Is_In_Area(19,209,67,233))key=1;//((Pen_Point.x0>19)&&(Pen_Point.x0<67))&&((Pen_Point.y0>209)&&(Pen_Point.y0<233)))key=1;//是
     else if(Is_In_Area(171,209,219,233))key=2;//((Pen_Point.x0>171)&&(Pen_Point.x0<219))&&((Pen_Point.y0>209)&&(Pen_Point.y0<233)))key=2;//否
     else key=0;
     if(key==1)Button(19,209,67,233,PRESS,"是(Y)",30,12);//显示是按钮
     else Button(19,209,67,233,UNPRESS,"是(Y)",30,12);//显示是按钮
     if(key==2)Button(171,209,219,233,PRESS,"否(N)",30,12);//显示否按钮
     else Button(171,209,219,233,UNPRESS,"否(N)",30,12);//显示否按钮
     Delay_us(50);
    }while(T_PEN==0);
    Pen_Int_Set(1);//开启中断
   }
  }
  if(key==1)
  {
   key=0;
   goto REFLASH_ICO;
  }
  if(key==2)
  {
   key=0;
   goto CANCEL;
  }
REFLASH_ICO:
  Windows(10,79,229,241,"更新图标中……",12);//显示窗体
  Button(95,209,143,233,INVALID,"取消",24,12);//显示取消按钮
  show_string(19,157,199,"总进度:",12,color(0,0,0));
  show_string(19,127,199,"当前进度:",12,color(0,0,0));
  show_string(19,115,199,"复制:",12,color(0,0,0));
  //计算需要更新的图标的总大小
  if(f_opendir(&dir,ico_dir)==FR_OK)
  {
   while(1)
   {
    f_readdir(&dir,&icoinfo);
    if(strcmp(icoinfo.fname,fn_date)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_drawing)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_drive)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_filejak)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_files)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_music)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_sound)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_notebook)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_txt)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_others)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_pic)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_picture)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_question)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_radio)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_recycle)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_source)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_right)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_setup)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_shutdown)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_sigh)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_wrong)==0)total_size+=icoinfo.fsize;
    //设置菜单下图标
    else if(strcmp(icoinfo.fname,fn_tmd)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_font)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_ico)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_scrsaver)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_about)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_sd)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_scroff)==0)total_size+=icoinfo.fsize;
    else if(strcmp(icoinfo.fname,fn_target)==0)total_size+=icoinfo.fsize;
    //开机画面图标
    else if(strcmp(icoinfo.fname,fn_bootup)==0)total_size+=icoinfo.fsize;
    //调色板
    else if(strcmp(icoinfo.fname,fn_colorpad)==0)total_size+=icoinfo.fsize;
    if(icoinfo.fname[0]==NULL)break;
   }
  }
  else
  {
   if(bootup_ico_update)return 1;
   else goto FAIL;
  }
  while(ico_count<31)
  {
   strcpy((char*)direction,(char*)ico_dir);
   strcat((char*)direction,(char*)_dir_);
   switch(ico_count)
   {
    case 0:strcat((char*)direction,fn_setup);break;
    case 1:strcat((char*)direction,fn_music);break;
    case 2:strcat((char*)direction,fn_radio);break;
    case 3:strcat((char*)direction,fn_drawing);break;
    case 4:strcat((char*)direction,fn_notebook);break;
    case 5:strcat((char*)direction,fn_source);break;
    case 6:strcat((char*)direction,fn_others);break;
    case 7:strcat((char*)direction,fn_date);break;
    case 8:strcat((char*)direction,fn_pic);break;
    case 9:strcat((char*)direction,fn_filejak);break;
    case 10:strcat((char*)direction,fn_shutdown);break;
    case 11:strcat((char*)direction,fn_sound);break;
    case 12:strcat((char*)direction,fn_txt);break;
    case 13:strcat((char*)direction,fn_picture);break;
    case 14:strcat((char*)direction,fn_files);break;
    case 15:strcat((char*)direction,fn_drive);break;
    case 16:strcat((char*)direction,fn_right);break;
    case 17:strcat((char*)direction,fn_wrong);break;
    case 18:strcat((char*)direction,fn_sigh);break;
    case 19:strcat((char*)direction,fn_question);break;
    case 20:strcat((char*)direction,fn_recycle);break;
    //设置菜单下的图标
    case 21:strcat((char*)direction,fn_tmd);break;
    case 22:strcat((char*)direction,fn_font);break;
    case 23:strcat((char*)direction,fn_ico);break;
    case 24:strcat((char*)direction,fn_scrsaver);break;
    case 25:strcat((char*)direction,fn_about);break;
    case 26:strcat((char*)direction,fn_sd);break;
    case 27:strcat((char*)direction,fn_scroff);break;
    case 28:strcat((char*)direction,fn_target);break;
    //开机画面图标
    case 29:strcat((char*)direction,fn_bootup);break;
    case 30:strcat((char*)direction,fn_colorpad);break;
   }
   if(f_stat(direction,&icoinfo)!=FR_OK)
   {
    if(bootup_ico_update)return 1;
    else goto FAIL;//读取文件状态,文件不存在则失败
   }
   if(f_open(&ico,direction,FA_READ)!=FR_OK)
   {
    if(bootup_ico_update)return 1;
    else goto FAIL;//打开文件,如果打开不到,则失败
   }
   f_lseek(&ico,0);
   clear(55,115,200,127,color(0xd4,0xd0,0xc8));//清空提示字符串位置
   show_string(55,115,199,(u8*)direction,12,color(0,0,0));//显示提示字符串
   SPI_Flash_Read((u8*)temp,(26+(ico_count*8)),8);//读出上一个元素地址
   if(ico_count==0)addr=temp[0]+temp[1]+500000;//制作要写入元素的首地址,第一个图标和字库错开50000个地址,防止更新字库时候错杀图标
   else addr=temp[0]+temp[1];
   temp[0]=addr;//记录要写入元素首地址
   temp[1]=icoinfo.fsize;//记录要写入元素大小
   offset=0;//清空偏移值
   while(1)//开始复制信息
   {
    f_read(&ico,buffer,byteread,&byteleft);
    SPI_Flash_Write(buffer,addr+offset,byteread);
    offset+=byteread;
    Progress_Bar(19,141,200,progress_size_index,icoinfo.fsize,1);
    Progress_Bar(19,171,200,progress_size,total_size,1);
    if((byteread>byteleft)&&(byteleft!=0))byteread=byteleft;
    else if(byteleft==0)
    {
     byteread=1024;//还原要读取的字节数
     progress_size_index=0;//还原当前进度计数
     SPI_Flash_Write((u8*)temp,(34+(ico_count*8)),8);//记录地址标志
     f_close(&ico);//关闭文件s
     break;//读取完毕,退出
    }
    progress_size_index+=byteread;
    progress_size+=byteread;
   }
   ico_count++;
  }
  //图标更新完毕,记录图标存在标志
  t[0]=0xbb;
  SPI_Flash_Write(t,1,1);
  bootup_ico_update=0;//还原强制更新标志
  Theme_Init();//复制完毕,初始化一次主题
  Windows(10,79,229,241,"注意——图标更新成功",12);//显示窗体
  Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
  show_string(74,153,158,"更新完成!",12,color(0,0,0));//文本框高度28,文本框长180
  show_ico(20,137,64,181,right.addr,right.size);
  goto OUT;
FAIL:
  Windows(10,79,229,241,"注意——图标更新失败",12);//显示窗体
  Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
  show_string(47,153,200,"主要文件丢失,更新失败!",12,color(0,0,0));//文本框高度28,文本框长180
//  show_ico(20,137,64,181,wrong.addr,wrong.size);//(注释掉,避免图标未更新之前显示图标导致死机)
  goto OUT;
CANCEL:
  Windows(10,79,229,241,"注意——图标更新失败",12);//显示窗体
  Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
  show_string(77,153,200,"用户取消操作!",12,color(0,0,0));//文本框高度28,文本框长180
//  show_ico(20,137,64,181,sigh.addr,sigh.size);//(注释掉,避免图标未更新之前显示图标导致死机)
  goto OUT;
OUT:
  while(key==0)
  {
   if(Pen_Point.Key_Sta==Key_Down)
   {
    Pen_Int_Set(0);//关闭中断
    Pen_Point.Key_Sta=Key_Up;
    do//连续读取数据
    {
     Convert_Pos();
     if(Is_In_Area(95,209,143,233))key=1;//((Pen_Point.x0>95)&&(Pen_Point.x0<143))&&((Pen_Point.y0>209)&&(Pen_Point.y0<233)))key=1;
     else key=0;
     if(key)Button(95,209,143,233,PRESS,"确定",24,12);//显示取消按钮
     else Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
     Delay_us(50);
    }while(T_PEN==0);
    Pen_Int_Set(1);//开启中断
   }
  }
}
return 0;
}
#else
u8 Ico_Update(void)
{
u8 key=0;
Windows(10,79,229,241,"更新图标",12);//显示窗体
Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
show_string(74,153,158,"图标存放位置被设置为SD卡,无需更新!",12,color(0,0,0));//文本框高度28,文本框长180
show_ico(20,137,64,181,sigh.addr,sigh.size);
while(key==0)
{
  if(Pen_Point.Key_Sta==Key_Down)
  {
   Pen_Int_Set(0);//关闭中断
   Pen_Point.Key_Sta=Key_Up;
   do//连续读取数据
   {
    Convert_Pos();
    if(Is_In_Area(95,209,143,233))key=1;//((Pen_Point.x0>95)&&(Pen_Point.x0<143))&&((Pen_Point.y0>209)&&(Pen_Point.y0<233)))key=1;
    else key=0;
    if(key)Button(95,209,143,233,PRESS,"确定",24,12);//显示取消按钮
    else Button(95,209,143,233,UNPRESS,"确定",24,12);//显示取消按钮
    Delay_us(50);
   }while(T_PEN==0);
   Pen_Int_Set(1);//开启中断
  }
}
return 0;
}
#endif
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表