#include "Driver.h"
#include "os.h"
#include "string.h"
#include "lwiplib.h"
#define APPVERSION 0x26
//
extern unsigned char MACAddress[];
extern unsigned char IPAddress[];
extern unsigned char NetMaskAddr[];
extern unsigned char GwWayAddr[];
///////////////////////////////////////////////////////////////////////////
U8 MacAddress_OS[6]; //设备MAC地址,静态信息,一次性读取备用
// bool MACGetOK_OS; //MAC读取正确标志
U16 SleepTimer; //操作系统记时器
U16 OSMainTimer; //操作系统记时器
U16 IdleTimeS; //通信中断时间
U16 ReportTimer;
//操作系统接收缓冲区
#define MAX_INCMD_SIZE 256 //频点信息一次可能传300+字节
#define MAX_RECV_BUF_SIZE 1024
U8 tmpRecvBuf[MAX_INCMD_SIZE];
U8 OSReceBuf[MAX_RECV_BUF_SIZE]; //接收数据缓冲区
U16 OSReceBufWRPos; //写指针
U16 OSReceBufRDPos; //读指针
#define RESEND_BUF_SIZE 256
U8 OSResendBuffer[RESEND_BUF_SIZE]; //重发数据缓冲区
U16 OSResendBufPos_WR; //重发数据长度
U16 OSResendBufPos_RD; //重发数据长度
bool Registered2Platform; //是否已注册到平台:TRUE已注册
#define MAX_OUTCMD_SIZE 256 //输出信息最大256字节
struct stCmdHeader CmdHeader; //输出头
U8 OutCommand[MAX_OUTCMD_SIZE]; //输出命令缓冲区
struct stAPPInfo AppInfo; //存储全局信息:APP信息、IP和MAC信息
struct stMACIPInfo MACIPInfo; //存储全局信息:APP信息、IP和MAC信息
U8 OutDebugInfo; //方便调试,增加调试信息反馈
U8 gUpgradeStatus; //升级状态
// U8 gIfTimeoutSleep; //超时休眠标记
U8 gSwitchMS;
#define PARAM_FLASH_SIZE 128
U8 tmpInfo[PARAM_FLASH_SIZE]; //FLASH中存储的参数
//==================================APP部分==============================
#define MAX_SEG_NUM 6
#define MAX_LOG_NUM 5
#define MAX_SIG_NUM MAX_SEG_NUM*MAX_LOG_NUM
////////////2013-3-23同侦测讨论后,修改代码/////////////////////////////
struct stBlockSignalInfo Sig[MAX_SIG_NUM]; //缓存的信号信息
struct stBlockSignalInfo Sig_Block_12[MAX_LOG_NUM*2+1]; //缓存的信号信息
struct stBlockSignalInfo Sig_Block_36[MAX_LOG_NUM*4+1]; //缓存的信号信息
U8 Num_Sig12;
U8 Idx_Sig12;
U8 Num_Sig36;
U8 Idx_Sig36;
U8 BlockingNum_12; //当前正在阻断的信号个数
U8 BlockingNum_36; //当前正在阻断的信号个数
U8 SigNumBatch; //这一批收到的频点总数
U16 LastID; //上一个ID
U16 PhoneBlockSignalType; //当前阻断手机信号类型
U8 MyGroupID; //分组控制组号,缺省为0
bool NewID; //是不是新ID
bool HasReceivedCmd; //接收到扩展命令
bool PowerIsOff;
//=================================================================================
U8 MCReceBuf[256]; //接收数据缓冲区
U8 MCReceBufWRPos; //写指针
U8 MCReceBufRDPos; //读指针
//================
bool gSwitch_LIHE=false;
bool gSwitch_VariableParam=false;
bool gSwitch_Strong=false;
bool gSwitch_4432SetOneTime=false;
/*
////////////////////////
#define MAX_SWCHAN_12 MAX_LOG_NUM*4+1
U8 SwitchQueue_12[MAX_SWCHAN_12];
U8 SwitchIndex_12[MAX_SWCHAN_12];
bool SwitchQueue_12_Busy[MAX_SWCHAN_12];
U8 SwitchQueue_12_Num=0;
#define MAX_SWCHAN_36 MAX_LOG_NUM*8+1
U8 SwitchQueue_36[MAX_SWCHAN_36];
U8 SwitchIndex_36[MAX_SWCHAN_36];
bool SwitchQueue_36_Busy[MAX_SWCHAN_36];
U8 SwitchQueue_36_Num=0;
*/
bool gIfForecedSleep_1G=false; //强制休眠_1G
bool gIfForecedSleep_Phone=false; //强制休眠_手机
bool ReportResetAllready=false;
U32 SaveFreqNum; //20130504 预置频点
U32 SaveFreqs[MAX_SIG_NUM]; //20130504 预置频点
char gFreq2Revise[20]; //频偏设置,1G以下分20个频率段设置频偏,单位4PPM
U16 TimeSpan_FanOff; //风扇关闭持续ms数
U16 TimeSpan_FanOn; //风扇开启持续ms数
void ResetMCU(void)
{
int i;
Upgrade_PrepareForBoot();
// IntMasterDisable();
WatchDogOff(); //关闭软件看门狗,交给硬件看门狗来启动
for(i=0;i<100000000;i++); //延迟2.5秒,硬件看门狗启动芯片
CallApplication(0); //万一硬件看门个坏了,还可以直接调用BOOT程序
for(i=0;i<100000000;i++);
CallApplication(0);
}
void OSInit(void)
{
//操作系统层初始化
SleepTimer=0;
OSMainTimer=0;
IdleTimeS=0;
ReportTimer=0;
OSReceBufWRPos=0;
OSReceBufRDPos=0;
OSResendBufPos_WR=0;
OSResendBufPos_RD=0;
Registered2Platform=false;
OutDebugInfo=0;
gUpgradeStatus=4;
// gIfTimeoutSleep=0;
gSwitchMS=2;
Num_Sig12=0;
Idx_Sig12=0;
Num_Sig36=0;
Idx_Sig36=0;
BlockingNum_12=0;
BlockingNum_36=0;
SigNumBatch=0;
LastID=0;
PhoneBlockSignalType=0x7F;
MyGroupID=0;
NewID=false;
HasReceivedCmd=false;
PowerIsOff=false;
MCReceBufWRPos=0;
MCReceBufRDPos=0;
gSwitch_LIHE=false;
gSwitch_VariableParam=false;
gSwitch_Strong=false;
gSwitch_4432SetOneTime=false;
//SwitchQueue_12_Num=0;
//SwitchQueue_36_Num=0;
gIfForecedSleep_1G=false;
gIfForecedSleep_Phone=false;
CmdHeader.SYNFLAG=0xf0a5; //命令头
CmdHeader.FromDevID=3; //阻断发出
CmdHeader.Len=0;
CmdHeader.CmdCode=0;
CmdHeader.CMDCRC=0;
GetMacAddress(MacAddress_OS); //调用驱动层函数获取MAC地址
memcpy(MACIPInfo.MAC,MacAddress_OS,6);
TimeSpan_FanOn=20; //缺省将风扇转速设置为2000转左右
TimeSpan_FanOff=40;
}
//读取保存在FLASH中的信息,目前存储了24个字节参数
void GetSavedInfoInFlash(void)
{
int i;
for(i=0;i<64;i++)
tmpInfo[i]=ReadFlash(INFO_BASE+i);
AppInfo.AppVer=APPVERSION; //版本号
AppInfo.AppLen=(tmpInfo[3]<<8)+tmpInfo[2]; //长度
AppInfo.AppCRC=(tmpInfo[5]<<8)+tmpInfo[4]; //crc
AppInfo.AppValid=tmpInfo[6]; //有效标志
memcpy(&MACIPInfo,tmpInfo+8,18);
//将参数设置到协议栈对应的参数中
MACIP_SetParam4LWIP();
}
//主程序:
//--(1)软件狗打开时,定时(50ms)发送保活消息
//--(2)长时间(5min)没有外围通信时,执行硬件复位操作
//--(3)有数据(新发和重发)发送时,尝试发送数据
//--(4)有数据接收时,接收并缓冲数据,尝试处理完整的命令
void OsMain(void)
{
U16 inDataLen;
//操作系统主循环
//处理基础定时器
if(Timer1Ms()==true)
{
OSMainTimer++;
SleepTimer++;
ReportTimer++;
Control_FAN_130619(); //实现风扇转速的控制
//(1)如果硬件看门狗开启,则每50ms发送一个保活包
if(OSMainTimer>=50)
{
KeepAlive(); //两只狗都要喂
KeepAlive_HardwareWatchdog();
OSMainTimer=0;
}
if(ReportTimer>=20000)
{
ReportTimer=0;
if(PowerIsOff==false)
APP0426_ReportWorkingStatus2Platform(); //如果电源关闭,则不向外发送任何消息
}
if(SleepTimer>=10000) //2013.6.21 每10ms查询机箱温度,根据温度调整风扇转速
{
SleepTimer=0;
AdujustFanControlPolicy();
}
/*
if(SleepTimer>=1000) //2013-4-29 20:00 凌总和覃总商讨后决定不要自动休眠了。
{
SleepTimer=0;
IdleTimeS++;
//(2)如果5分钟没有收到平台的心跳命令,则通知应用层关闭所有阻断,硬件休眠
if(IdleTimeS>=300)
{
IdleTimeS=0;
gIfTimeoutSleep=1; //标识程序进入超时休眠状态
Control_Sleep_Speaker(FALSE); //JP5 Sleep
Control_Sleep_Phone(FALSE); //JP6 Sleep
FanOff();
}
}
//(3)数据发送处理,检查是否有待发送数据,如果有则向驱动层发送数据
if(OSResendBufPos_WR>OSResendBufPos_RD)
{
//调用驱动层接口发送数据
if(SendData(OSResendBuffer+OSResendBufPos_RD,OSResendBufPos_WR-OSResendBufPos_RD))
{
OSResendBufPos_RD=OSResendBufPos_WR;
}
}
else if(OSResendBufPos_RD>OSResendBufPos_WR)
{
if(SendData(OSResendBuffer+OSResendBufPos_RD,RESEND_BUF_SIZE-OSResendBufPos_RD))
{
OSResendBufPos_RD=0;
}