//======================================================================
//文件名称：includes.h
//功能概要：应用工程总头文件
//版权所有：苏州大学嵌入式系统与物联网研究所(sumcu.suda.edu.cn)
//版本更新：2017-02-01  V1.0，2017-09-27  V2.0
//功能描述：（1）包含用到的构件；（2）全局变量一处声明多处使用处理方法代码段；
//       （3）全局变量声明；（4）常数宏定义
//======================================================================

#ifndef _INCLUDES_H
#define _INCLUDES_H

//（1）【根据实际需要增删】包含用到的构件
#include "common.h"
#include "adc.h"
#include "flash.h"
#include "gpio.h"
#include "i2c.h"
#include "timer.h"
#include "spi.h"
#include "pwm.h"
#include "incapture.h"
#include "outcmp.h"
#include "systick.h"
#include "tpm.h"
#include "uart.h"
#include "projectJump.h"
#include "light.h"
#include "emuart.h"
#include "wdog.h"
#include "ueupdate.h"
#include "uecom.h"
#include "pit.h"
#include "rf.h"
#include "ram.h"

//（2）【不动】全局变量一处声明多处使用处理方法代码段
//    为下面声明全局变量，使用前缀G_VAR_PREFIX宏定义做准备
//    GLOBLE_VAR在main.c中有宏定义
#ifdef GLOBLE_VAR		 //main.c文件中包含本头文件时，全局变量不加“extern”前缀
#define G_VAR_PREFIX
#else                    //其他文件中包含本头文件时，全局变量自动加“extern”前缀
#define G_VAR_PREFIX extern
#endif
//握手帧    共4个字节    帧标识为5
#pragma  pack(push,1)
struct shakeData
{
	uint_8 uecomType[25];  //通信模组类型
	uint_8 mcuType[10];    //MCU类型
	uint_32 uStartAds;     //User程序起始地址
	uint_32 uCodeSize;     //User程序总代码大小
	uint_32 replaceNum;    //替换更新最大字节
	uint_32 reserveNum;    //保留更新最大字节（不等于0意味着有User程序）
};
#pragma  pack(pop)
#pragma  pack(push,1)        //取消4字节对齐
//【不动】记录金葫芦硬件的相关配置信息，保存在flash中的信息
typedef struct FlashData
{
	//①产品信息
	uint_8 equipName[30];      //产品名称
	uint_8 equipID[20];        //产品序列号
	uint_8 equipType[20];      //产品型号
	uint_8 vendor[30];         //生产厂家
	uint_8 softVer[4];         //软件版本
	uint_64 productTime;       //生产时间（64位时间戳）
	uint_8 userName[20];       //用户名
	uint_8 phone[11];          //手机号
	//②服务器信息
	uint_8 serverIP[15];       //服务器IP
	uint_8 serverPort[5];      //服务器端口号
    //③用户存入flash的信息
	uint_32 sendFrequencySec;  //发送频率
	uint_32 resetCount;        //复位次数
	uint_8  frameCmd[2];       //命令
}FlashData;
#pragma  pack(pop)     //恢复4字节对齐

//自定义区域，存放热复位后保留原值的全局变量
#define CUSTOM_SECTION __attribute__((section (".impinfo")))

//（3）【根据实际需要增删】全局变量声明，一律加前缀G_VAR_PREFIX，仅此一次声明即可
//    全局变量命名一律以g开头，尽可能保证全工程内唯一性，并且一定要注明其含义
//    （声明时不准赋值）
G_VAR_PREFIX uint_8 gFunFlag;      //主函数功能标识
G_VAR_PREFIX uint_8 gCount;        //500ms计数单元
G_VAR_PREFIX uint_64 gTime;
G_VAR_PREFIX uint_32 gUSNo;          //用户程序起始扇区号
G_VAR_PREFIX uint_32 gUENo;          //用户程序结束扇区号
G_VAR_PREFIX uint_8 gRemoteFlag;
G_VAR_PREFIX uint_8 gRetbuf[100];
G_VAR_PREFIX uint_16 gRetLen;
G_VAR_PREFIX FlashData      gFlashData; //需要写入flash中的数据
G_VAR_PREFIX struct shakeData gShakeData;   //握手帧数据
//热复位不清0的全局变量
G_VAR_PREFIX CUSTOM_SECTION uint_8 gcRecvBuf[1024];  //串口1(或者串口2)接收数据缓冲区
G_VAR_PREFIX CUSTOM_SECTION uint_16 gcRecvLen;//串口1(或者串口2)接收到的数据长度，为0时表示没有收到数据
G_VAR_PREFIX uint_16 gRecvdataLen;   //串口1接收到非更新数据的数据长度
G_VAR_PREFIX CUSTOM_SECTION uint_8 gcUpdateFlag[10];
//使用直接地址的RAM空间
G_VAR_PREFIX CUSTOM_SECTION vuint_8 WDResetCount;
G_VAR_PREFIX CUSTOM_SECTION vuint_8 WDTimeCount;
G_VAR_PREFIX CUSTOM_SECTION vuint_8 gFuncFlag;
G_VAR_PREFIX CUSTOM_SECTION vuint_8 PINResetCount;
G_VAR_PREFIX CUSTOM_SECTION vuint_8 PINTimeCount;
G_VAR_PREFIX CUSTOM_SECTION vuint_8 NMICount;

//（4）【根据实际需要增删】全局使用的宏定义常数，使用全大写
#define MCUTYPE    "KW01"                //MCU型号
#define USERSECTOR 51                       //用户程序起始扇区号
#define SECTORNUM  128                      //MCU扇区总数
#define SECTORSIZE 0x400                   //扇区大小，
#define STACKTOP   0x20003000               //栈顶
#define USERBASE   (USERSECTOR*SECTORSIZE)  //用户程序代码地址

#endif
