⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
***************************************************************************
* 文件名: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 + -