📄 main.c
字号:
/*
名称:main.c
日期:2005.01.12
作者:廖志凯
功能:解析由上位机(音频控制器)的命令(通过RS232),
控制下位机(子控制板)动作。
接收下位机的信息并发送给上位机
说明:程序使用RTX51实时多任务系统,
*/
#pragma large
#include "main.h"
/*------------------------------------------------------------------------------*/
//定义变量
uchar xdata cAddress; //自身地址
uchar xdata cDiplayId[2];
#define MAX_NAME_ID 48
uchar code cNameId[MAX_NAME_ID][17]=
{
"主: 分局903 ",
"主: 分局904 ",
"主: 分局939 ",
"主: 分局940 ",
"主: 市局应急 ",
"主: 分局常规01 ",
"主: 分局常规02 ",
"主: 分局常规04 ",
"主:交警总队350M",
"主: 市局01 ",
"主: 市局04 ",
"主: 黄浦01 ",
"主: 黄浦02 ",
"主: 特警01 ",
"主: 黄浦指挥 ",
"主:交警总队800M",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"主: 空闲组 ",
"备: 分局903 ",
"备: 分局904 ",
"备: 分局905 ",
"备: 分局939 ",
"备: 分局940 ",
"备: 分局常规01 ",
"备: 分局常规02 ",
"备: 分局常规04 ",
"备: 市局应急01 ",
"备:交警总队350M",
"备: 市局01 ",
"备: 市局02 ",
"备: 市局03 ",
"备: 市局04 ",
"备: 市局05 ",
"备: 黄浦01 ",
"备: 黄浦02 ",
"备: 特警01 ",
"备: 黄浦指挥 ",
"备: 黄浦应急组 ",
"备:交警总队800M",
};
/*===============================================================
功能:初始化
参数:
返回:
说明:获取电台号
===============================================================*/
void Init_System()
{
uchar _buff[20];
WDKEY = 0xAE; //开看门狗
IP = 0x00;
XBYTE[CTA] = 0x00; //把PA设置成IO模式
XBYTE[DCA] = 0x00; //把PA设置成输入模式
cAddress = XBYTE[DIA]; //读入PA值
os_set_slice(ST10MS);
Init_Serial();
EN_RS485_RECV();
//熄灭所以的灯
LED_RUN = 1;
CALL_IN1_LED = 1;
CALL_IN2_LED = 1;
cDiplayId[0] = 0;
cDiplayId[1] = 0;
//AUDIO_C1 = TURN_ON;
//AUDIO_C2 = TURN_ON;
AUDIO_C1 = TURN_OFF;
AUDIO_C2 = TURN_OFF;
memset(_buff, 0x00, 20);
memcpy(_buff, "监听设备", 8);
Write_Debug_Info(_buff, strlen(_buff));
memset(_buff, 0x00, 20);
sprintf(_buff,"%s%bd-%bd","地址:",cAddress,cAddress+1);
Write_Debug_Info(_buff, strlen(_buff));
memset(_buff, 0x00, 20);
sprintf(_buff,"%s;%s",__DATE__,__TIME__);
Write_Debug_Info(_buff, strlen(_buff));
os_wait2(K_TMO, T500MS);
Init_Vfd_Display();
Clear_Vfd_Display();
Define_Vfd_Userwindow(1, 1, 4, 0, 140, 2);
Select_Vfd_Window(1);
Position_Vfd_Home();
memset(_buff, 0x00, 20);
sprintf(_buff,"%s%bd", "地址:", cAddress);
Display_Vfd_Blending(_buff);
os_wait2(K_TMO, T50MS);
Define_Vfd_Userwindow(2, 1, 144, 0, 140, 2);
Select_Vfd_Window(2);
Position_Vfd_Home();
memset(_buff, 0x00, 20);
sprintf(_buff,"%s%bd", "地址:", cAddress+1);
Display_Vfd_Blending(_buff);
}
/*===============================================================
功能:判断上位机的命令是否正确,正确转发
参数:
返回:
说明:邮件的参数是接收数据长度
只有一条协议
FF 04 ID1 02 01 ID2 00
ID1-指监听设备自身地址
ID2-指要监听的电台号
===============================================================*/
void Command_Task(void) _task_ CMMD_TASK_ID
{
uchar xdata _tmp, _ui;
os_wait(K_TMO, T1S, 0x00);
Set_Vfd_Brightless(1);
while(1)
{
if( (cRecvBuffCnt != 0x00) && (cRecvBuffPtr < RECV_GRUOP) )
{//缓冲区内有数据
if( (cRecvBuff[cRecvBuffPtr][2] == cAddress) || (cRecvBuff[cRecvBuffPtr][2] == (cAddress+1)) )
{//坐席设备号正确
if(cRecvBuff[cRecvBuffPtr][3] == 2)
{//命令类型正确
if(cRecvBuff[cRecvBuffPtr][4] == 1)
{//操作类型正确
if( (cRecvBuff[cRecvBuffPtr][5] >= 1) &&(cRecvBuff[cRecvBuffPtr][5] <= MAX_NAME_ID) )
{//电台号正确
//计算和校
_tmp = cRecvBuff[cRecvBuffPtr][2];
for(_ui=3; _ui< cRecvBuff[cRecvBuffPtr][1]+2; _ui++)
{
_tmp += cRecvBuff[cRecvBuffPtr][_ui];
}
//if(_tmp == cRecvBuff[cRecvBuffPtr][_ui])
{//和校正确
if(cRecvBuff[cRecvBuffPtr][2] == cAddress)
{
Select_Vfd_Window(1);
Position_Vfd_Home();
cDiplayId[0] = cRecvBuff[cRecvBuffPtr][5]-1;
Display_Vfd_Blending(cNameId[cDiplayId[0]]);
}
else if(cRecvBuff[cRecvBuffPtr][2] == (cAddress+1))
{
Select_Vfd_Window(2);
Position_Vfd_Home();
cDiplayId[1] = cRecvBuff[cRecvBuffPtr][5]-1;
Display_Vfd_Blending(cNameId[cDiplayId[1]]);
}
}
}
}
}
}
//清除已处理的数据
memset(&cRecvBuff[cRecvBuffPtr][0],0x00,RECV_LENGTH);
cRecvBuffPtr = (cRecvBuffPtr + 1) % RECV_GRUOP;
cRecvBuffCnt --;
}
else
os_wait(K_TMO, T10MS, 0x00);
}
}
/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/
void Led1_Delay_Task(void) _task_ LED1DELAY_TASK_ID
{
CALL_IN1_LED = 0;
AUDIO_C1 = TURN_ON;
Set_Vfd_Brightless(8);
os_wait2(K_TMO, T1S);
AUDIO_C1 = TURN_OFF;
os_wait2(K_TMO, T1S);
os_wait2(K_TMO, T1S);
os_wait2(K_TMO, T1S);
CALL_IN1_LED = 1;
AUDIO_C1 = TURN_OFF;
Set_Vfd_Brightless(1);
os_delete_task(LED1DELAY_TASK_ID);
}
/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/
void Led2_Delay_Task(void) _task_ LED2DELAY_TASK_ID
{
CALL_IN2_LED = 0;
AUDIO_C2 = TURN_ON;
Set_Vfd_Brightless(8);
os_wait2(K_TMO, T1S);
AUDIO_C2 = TURN_OFF;
os_wait2(K_TMO, T1S);
os_wait2(K_TMO, T1S);
os_wait2(K_TMO, T1S);
CALL_IN2_LED = 1;
AUDIO_C2 = TURN_OFF;
Set_Vfd_Brightless(1);
os_delete_task(LED2DELAY_TASK_ID);
}
/*===============================================================
功能:判断是否有音频
参数:
返回:
说明:
===============================================================*/
void Information_Task(void) _task_ INFO_TASK_ID
{
static uchar cAudioCnt1 = 0,cAudioCnt2 = 0;
static uchar cNoAudioCnt1 = 0,cNoAudioCnt2 = 0;
os_wait(K_TMO, T1S, 0x00);
while(1)
{
os_wait(K_TMO, T10MS, 0x00);
//判断第一通道
if(!SPK_D1)
cAudioCnt1++;
else
cNoAudioCnt1++;
if(cNoAudioCnt1 > 40)
{
cAudioCnt1 = 0x00;
cNoAudioCnt1 = 0x00;
}
if(cAudioCnt1 >= 1)
{
cAudioCnt1 = 0x00;
cNoAudioCnt1 = 0x00;
os_delete_task(LED1DELAY_TASK_ID);
os_create_task(LED1DELAY_TASK_ID);
}
//判断第二通道
if(!SPK_D2)
cAudioCnt2++;
else
cNoAudioCnt2++;
if(cNoAudioCnt2 > 40)
{
cAudioCnt2 = 0x00;
cNoAudioCnt2 = 0x00;
}
if(cAudioCnt2 >= 1)
{
cAudioCnt2 = 0x00;
cNoAudioCnt2 = 0x00;
os_delete_task(LED2DELAY_TASK_ID);
os_create_task(LED2DELAY_TASK_ID);
}
}
}
/*===============================================================
功能:复位CPU
参数:
返回:
说明:
===============================================================*/
void Restart_Cpu(void)
{
WDKEY = 0xAE;
WDRST = 0x01;
while(1);
}
/*===============================================================
功能:完成定时操作
参数:
返回:
说明:10毫秒内判断一次I2C总线,若一秒中内有80次总线忙则
复位总线
===============================================================*/
void Timer_Task(void) _task_ TIMER_TASK_ID
{
static uchar xdata _ui = 0x00;
while(1)
{
os_wait(K_TMO, T10MS, 0x00);
WDRST = 0x00; //喂狗
_ui++;
if(_ui >= 50)
{
LED_RUN ^= 1;
_ui = 0x00;
}
}
}
/*===============================================================
功能:调用初始化函数并启动所有任务
参数:无
返回:无
说明:系统时间间隔为10ms
===============================================================*/
void Init_Task(void) _task_ INIT_TASK_ID
{
Init_System();
//os_create_task(SRECV_TASK_ID);
//os_create_task(STRAN_TASK_ID);
os_create_task(CMMD_TASK_ID);
os_create_task(INFO_TASK_ID);
os_create_task(TIMER_TASK_ID);
os_create_task(DEBUG_TASK_ID);
os_delete_task(INIT_TASK_ID);
}
/*===============================================================
功能:主函数,启动任务
参数:无
返回:无
说明:
===============================================================*/
void main(void)
{
os_start_system(INIT_TASK_ID);
}
/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -