📄 main.c
字号:
/*
***************************************************************************
* 文件名:main.C
* Copyright (c) 2007-2008 江苏光一科技有限公司研发中心
* 创建人
* 日 期:
* 修改人:
* 日 期:
* 描 述
*
* 版 本:
***************************************************************************/
#define MAIN_GLOBALS
#include "global.h"
#include "main.h"
#include "powerram.h"
#include "commup.h"
#include "stipulparse.h"
#include "parameter.h"
#include "gprsmanag.h"
#include "XLCD.h"
#include "display.h"
/*_________________________________________________*/
INT32S Down_Send_ok = 0;
INT32S Down_Rev_ok = 0;
//INT8U _jiaocai_addr[6];
INT8U Task_Set_Flag = 0; //任务配置或有效标志改变标志 0:未改变 1:改变;
//如在其它函数中定义,此处应为外部变量
INT16U count_2m = 0; //2分钟定时计数变量
INT8U start_2m = 0; //2分钟定时开始标志变量
OS_EVENT *Timer4S_Sem;
OS_EVENT *Timer1mSem;
//OS_EVENT *Timer0Sem;
OS_EVENT *Timer0Sem1;
/*_________________________________________________*/
extern INT8U TaskData[128*1024]; //有效任务数据区 bu cui
extern PARAM_STR ParamInSram;
extern INT32S sample_data(void);
extern void get_jiaocai_add(void);
extern void fat_sram1(void);
extern void pass_process(void);
extern PARAM_STR ParamInSram;
BOOLEAN InitAllCommParam(void)
{
CloseComm(COMM1);
CloseComm(COMM2);
CloseComm(COMM4);
//if(OpenComm(COMM1,UART_BPS_1200,EVEN_PARITY,ONE_STOP_BIT,EIGHT_CHAR_BIT)!=0)
if(OpenComm(COMM1,UART_BPS_9600,EVEN_PARITY,ONE_STOP_BIT,EIGHT_CHAR_BIT)!=0)
return FALSE;
if(OpenComm(COMM2,UART_BPS_9600,NO_PARITY,ONE_STOP_BIT,EIGHT_CHAR_BIT)!=0)
return FALSE;
if(OpenComm(COMM4,UART_BPS_9600,EVEN_PARITY,ONE_STOP_BIT,EIGHT_CHAR_BIT)!=0)
return FALSE;
return TRUE;
}
void AllEINTInit(void)
{
// 初始化显示板键盘中断, 下降沿触发
//EINTInit( PORT_DISP_INT, EXT_MODE_EDGE_DOWN, FALSE );
KeyInit();
// 初始化掉电中断, 下降沿触发
EINTInit(2, EXT_MODE_EDGE_DOWN, FALSE );
// 初始化GPRS/CDMA短信中断,低电平触发
EINTInit(3, EXT_MODE_EDGE_DOWN, FALSE );
// 脉冲计数中断
T1Init();
}
//void TaskZT( void *pdata )
//{
// pdata = pdata;
//}
int main(void)
{
uint8 err;
err = 1;
WatchDogInit(1);
WatchDogDisable(0);
OSInit();
//OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4 );
OSTaskCreate(TaskStart,
(void *)0,
&Task_Start_Stack[TASK_START_STK_SIZE - 1],
TASK_START_PRIO);
Rcv_Que_Sem = OSSemCreate(0); // 建立消息
Comm_Sem = OSMutexCreate(7, &err); // 建立互斥信号量,优先级为7
//Gprs_Set_Ack = OSSemCreate(0);
Timer4S_Sem = OSSemCreate(0); //2S定时信号 by cui
Timer1mSem = OSSemCreate(0); //1m定时信号 by cui
Timer0Sem1 = OSSemCreate(0); //0时0分信号 by cui
Task_Call_Box = OSMboxCreate(Task_Call); // 建立任务召唤邮箱
OSStart();
return 0;
}
/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务。
**
** 输 入: pdata 任务附加参数(指针)
** 输 出: 无
********************************************************************************************************/
void TaskStart(void *pdata)
{
pdata = pdata; /*避免编译警告*/
TargetInit();
PINSEL0 &= 0xFFFFF3FF;
IO0DIR |= 1<<5 ;
IO0CLR = 1<<5 ;
IO2DIR |= 3<<18 ; //warn_led off
IO2SET = 3<<18 ;
CommInit(COMM1);
CommInit(COMM2);
CommInit(COMM4);
AllEINTInit();
InitRcvBuf(); // 初始化接收缓冲区
SystemInit();
if(InitAllCommParam()!=TRUE)
{
while(1)
{
;
}
}
// OSTaskCreate( TaskZT, (void*)0, &TaskZTStk[TASK_STK_SIZE-1], 5 );
OSTaskCreate(
TaskTimer,
(void *)0,
&Task_Timer_Stack[TASK_TIMER_STK_SIZE - 1],
TASK_TIMER_PRIO);
OSTaskCreate(
TaskCommManage,
(void *)0,
&Task_Comm_Manage_Stack[TASK_COMM_MANAGE_STK_SIZE - 1],
TASK_COMM_MANAGE_PRIO);
OSTaskCreate(
TaskStipulParse,
(void *)0,
&Task_Stipul_Parse_Stack[TASK_STIPUL_PARSE_STK_SIZE - 1],
TASK_STIPUL_PARSE_PRIO);
OSTaskCreate(
TaskDataSample,
(void *)0,
&Task_Data_Sample_Stack[TASK_DAY_SAMPLE_STK_SIZE - 1],
TASK_DAY_SAMPLE_PRIO);
OSTaskCreate(
TaskTaskMemSet,
(void *)0,
&Task_Task_Mem_Set_Stack [TASK_TASK_MEM_SET_STK_SIZE-1],
TASK_TASK_MEM_SET_PRIO);
// by cui
OSTaskCreate(
TaskStipulTask,
(void *)0,
&Task_Stipul_Task_Stack[TASK_STIPUL_TASK_STK_SIZE - 1],
TASK_STIPUL_TASK_PRIO);
OSTaskCreate(
TaskAlarmTask,
(void *)0,
&Task_Alarm_Task_Stack[TASK_ALARM_TASK_STK_SIZE - 1],
TASK_ALARM_TASK_PRIO);
OSTaskCreate(
TaskProgmDown,
(void *)0,
&Task_Progm_Down_Stack[TASK_PROGM_DOWN_STK_SIZE - 1],
TASK_PROGM_DOWN_PRIO);
OSTaskCreate(
TaskPassDay,
(void *)0,
&Task_Pass_Day_Stack[TASK_PASS_DATE_STK_SIZE - 1],
TASK_PASS_DATE_PRIO);
OSTaskCreate(
TaskPowerDown,
(void *)0,
&Task_Power_Down_Stack[TASK_POWER_DOWN_STK_SIZE - 1],
TASK_POWER_DOWN_PRIO);
OSTaskCreate(
TaskLcd,
(void *)0,
&Task_LCD_Stack[TASK_LCD_STK_SIZE - 1],
TASK_LCD_PRIO);
OSTaskCreate(
TaskParamChk,
(void *)0,
&Task_Param_Chk_Stack[TASK_PARAM_CHK_STK_SIZE - 1],
TASK_PARAM_CHK_PRIO);
OSTaskCreate(
TaskGprsManage,
(void *)0,
&Task_Gprs_Manage_Stack[TASK_GPRS_MANAGE_STK_SIZE - 1],
TASK_GPRS_MANAGE_PRIO);
for(;;)
{
WatchDogClear(1);
EnableCommRts();
OSTimeDlyHMSM(0,0,0,500);
DisableCommRts();
OSTimeDlyHMSM(0,0,0,500);
//ReadBuf(COMM1);
//OSTimeDly(2);
}
}
/*********************************************************************************************************
** 函数名称: TaskTimer
** 功能描述: 定时任务。
**
** 输 入: pdata
** 输 出: 无
********************************************************************************************************/
void TaskTimer (void *pdata)
{
uint32 systimes;
uint8 temp;
INT16U uc_year;
INT16U uc_month;
INT16U uc_day;
INT16U uc_week;
INT16U uc_hour;
INT16U uc_minute;
INT16U uc_second;
static INT16U uc_second_temp=0;
INT32U count=0;
pdata = pdata;
while(1)
{
systimes = OSTimeGet();
if ((systimes-LastSysTimes)>=200)
{
LastSysTimes = systimes;
if (GprsManagPar.gprsok==1)
{
if (GprsManagPar.on==1)
{
GprsManagPar.heartsp ++; // 计算心跳间隔
}
else
{
GprsManagPar.logsp ++; // 计算登录间隔
}
}
DateTimeRead(&uc_year,&uc_month,&uc_day,&uc_week,&uc_hour,&uc_minute,&uc_second);
DateTimeRead(&uc_year,&uc_month,&uc_day,&uc_week,&uc_hour,&uc_minute,&uc_second);
temp = uc_year%100;
ParamInSram.Term_Par.X8030[0] = HEX2BCD(temp); // 将时钟写入参数区
ParamIn.Term_Par.X8030[0] = HEX2BCD(temp);
ParamInSram.Term_Par.X8030[1] = HEX2BCD((uint8)uc_month);
ParamIn.Term_Par.X8030[1] = HEX2BCD((uint8)uc_month);
ParamInSram.Term_Par.X8030[2] = HEX2BCD((uint8)uc_day);
ParamIn.Term_Par.X8030[2] = HEX2BCD((uint8)uc_day);
ParamInSram.Term_Par.X8030[3] = HEX2BCD((uint8)uc_hour);
ParamIn.Term_Par.X8030[3] = HEX2BCD((uint8)uc_hour);
ParamInSram.Term_Par.X8030[4] = HEX2BCD((uint8)uc_minute);
ParamIn.Term_Par.X8030[4] = HEX2BCD((uint8)uc_minute);
ParamInSram.Term_Par.X8030[5] = HEX2BCD((uint8)uc_second);
ParamIn.Term_Par.X8030[5] = HEX2BCD((uint8)uc_second);
if (CommOverFlag==1) // 串口超时
{
CommOverTimes ++;
}
else
{
CommOverTimes = 0;
}
}
// by cui
DateTimeRead(&uc_year,&uc_month,&uc_day,&uc_week,&uc_hour,&uc_minute,&uc_second);
if((uc_second_temp != uc_second))
{
count++;
if(start_2m) count_2m++; //2分钟定时计数;
if((count%8)==0) OSSemPost(Timer4S_Sem);
if((count%16)==0)
{
OSSemPost(Timer1mSem);
if((uc_hour==0)&&(uc_minute==0))
{
// OSSemPost(Timer0Sem);
OSSemPost(Timer0Sem1);
}
count=0;
}
uc_second_temp = uc_second;
}
OSTimeDly(50);
}
}
/*********************************************************************************************************
** 函数名称: TaskCommManage
** 功能描述: 通讯管理任务。
**
** 输 入: pdata
** 输 出: 无
** 说 明: 创建一个信号量,用于向规约解析通讯
********************************************************************************************************/
void TaskCommManage (void *pdata)
{
static uint8 u_tqnum;
uint8 buf[32];
uint8 len;
uint8 err;
pdata = pdata;
while(1)
{
OSMutexPend(Comm_Sem, 1, &err);
if (err==OS_NO_ERR)
{
CommOverTimes = 0;
CommOverFlag = 1;
ReadBuf(COMM1);
CommOverTimes = 0;
ReadBuf(COMM2);
CommOverTimes = 0;
CommOverFlag = 0;
}
OSMutexPost(Comm_Sem);
if (WriteRcvQue()==0)
{
OSSemPost(Rcv_Que_Sem); // 有完整帧写入接收队列
}
for (u_tqnum=0;u_tqnum<64;u_tqnum++) // 发送处理
{//*
if (u_tqnum==64)
break;
if (Send_Q[u_tqnum].state==1) // 发送队列是否有数据要发送
{ //if (Send_Q[u_tqnum].count<3) // 检查发送次数
{
Send_Q[u_tqnum].count ++;
switch (Send_Q[u_tqnum].ch) // 判断发送通道
{
case 01: // 短信通道
if (GprsManagPar.smsok == 1)
{
GprsInitFlag = 1;
buf[0] = 0x22; // 切换到短信模式
buf[1] = 0xE3;
buf[2] = 0x01;
len = 3;
WriteGprsCmd(buf, len); // 发送命令
while (ReadGprsBuf()==0)
{
OSTimeDly(100);
}
GprsInitFlag = 0; // 切换到数据模式
WriteCpuIoStatus(IO_SEL_MODE_DATA);
OSMutexPend(Comm_Sem, 0, &err);
OS_ENTER_CRITICAL();
WriteComm(COMM2, Send_Q[u_tqnum].buf, // 调用发送函数
Send_Q[u_tqnum].len);
OS_EXIT_CRITICAL();
OSMutexPost(Comm_Sem);
Send_Q[u_tqnum].state = 0; // 发送成功清楚发送队列标志
GprsInitFlag = 1;
buf[0] = 0x22; // 切换到非短信模式
buf[1] = 0xE3;
buf[2] = 0x00;
len = 3;
OSMutexPend(Comm_Sem, 0, &err);
WriteGprsCmd(buf, len); // 发送命令
while (ReadGprsBuf()==0)
{
OSTimeDly(100);
}
OSMutexPend(Comm_Sem, 0, &err);
GprsInitFlag = 0; // 切换到数据模式
WriteCpuIoStatus(IO_SEL_MODE_DATA);
}
break;
case 02: // GPRS通道
if (GprsManagPar.on == 1) // 如果GPRS在线,
{
GprsInitFlag = 0; // 切换到数据模式
WriteCpuIoStatus(IO_SEL_MODE_DATA);
OSMutexPend(Comm_Sem, 0, &err);
OS_ENTER_CRITICAL();
WriteComm(COMM2, Send_Q[u_tqnum].buf, // 调用发送函数
Send_Q[u_tqnum].len);
OS_EXIT_CRITICAL();
OSMutexPost(Comm_Sem);
Send_Q[u_tqnum].state = 0; // 发送成功清楚发送队列标志
}
else // 如果GPRS不在线,将发送通道改为备用通道
{
if (ParamInSram.Term_Par.X8011[0]==0x06)// 从参数区找出备用通道
{
Send_Q[u_tqnum].ch = 0x06;
}
else if (ParamInSram.Term_Par.X8011[0]==0x05)
{
// 如果是红外,要通道切换
}
else
{
Send_Q[u_tqnum].state = 0; // 如果是短信,丢弃
}
}
break;
case 05: // 红外通道
waitms(20);
OSMutexPend(Comm_Sem, 0, &err);
OS_ENTER_CRITICAL();
WriteComm(COMM1, Send_Q[u_tqnum].buf, // 调用发送函数
Send_Q[u_tqnum].len);
OS_EXIT_CRITICAL();
OSMutexPost(Comm_Sem);
Send_Q[u_tqnum].state = 0; // 发送成功清楚发送队列标志
break;
case 06: // RS232通道
waitms(20);
OSMutexPend(Comm_Sem, 0, &err);
OS_ENTER_CRITICAL();
WriteComm(COMM1, Send_Q[u_tqnum].buf, // 调用发送函数
Send_Q[u_tqnum].len);
OS_EXIT_CRITICAL();
OSMutexPost(Comm_Sem);
Send_Q[u_tqnum].state = 0; // 发送成功清楚发送队列标志
break;
default:
break;
}
}
//else
//{
//Send_Q[u_tqnum].state = 0; // 发送3三次失败,抛掉
//}
}
else
continue;
}//*
OSTimeDly(10);
}
}
/*********************************************************************************************************
** 函数名称: TaskStipulParse
** 功能描述: 规约解析任务。
**
** 输 入: pdata
** 输 出: 无
********************************************************************************************************/
void TaskStipulParse (void *pdata)
{
uint8 err;
//uint8 i;
pdata = pdata;
while(1)
{
OSSemPend(Rcv_Que_Sem, 0, &err);
if (err == OS_NO_ERR)
{
StipParsDel(); // 调用规约解析处理函数
}
else
{
err = err;
}
OSTimeDly(1);
}
}
/*********************************************************************************************************
** 函数名称: TaskDataSample
** 功能描述: 规约任务。
**
** 输 入: pdata
** 输 出: 无
********************************************************************************************************/
void TaskDataSample (void *pdata)
{
INT32S rep;
INT8U err;
pdata = pdata;
get_jiaocai_add();
while(1)
{
OSSemPend(Timer4S_Sem,0,&err);
rep = sample_data();
OSTimeDly(200);
}
}
/*********************************************************************************************************
** 函数名称: TaskStipulTask
** 功能描述: 规约任务。
**
** 输 入: pdata
** 输 出: 无
********************************************************************************************************/
void TaskStipulTask (void *pdata)
{
INT8U err;
pdata = pdata;
fat_sram1();
while(1)
{
//OSSemPend(Timer1mSem,0,&err);
//task_data();
OSTimeDly(20);
}
}
/*********************************************************************************************************
** 函数名称: TaskTaskMemSet
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -