?? main.c
字號:
}
}
*/
break;
}
default:
break;
}
}
}
/* ---------------------- 數據是從室內分機發來的 ---------------------------- */
else // 數據是從室內分機發來的
{
if (pRxFrame->Frame.aData[0] & Command_Ack) // 應答幀
{
pRxFrame->Frame.aData[0] &= ~Command_Ack;
// 判斷幀數據類型
switch (pRxFrame->Frame.aData[0])
{
case Command_CallRequest: // 室內分機返回呼叫請求應答幀
{
if (SystemStatus.Status == Status_CallSendingRequest) // 呼叫請求的命令已經發出,
{
// 檢查返回呼叫應答的室內分機的地址是不是剛才要發出呼叫請求的室內分機的地址
if ((pRxFrame->Frame.Addr[0] == TxFrame.Frame.Addr[0])
&& (pRxFrame->Frame.Addr[1] == TxFrame.Frame.Addr[1])
&& (pRxFrame->Frame.Addr[2] == TxFrame.Frame.Addr[2])
&& (pRxFrame->Frame.Addr[3] == TxFrame.Frame.Addr[3]))
{
RS485SendWaitTimer = 0x00; // 將計數器清零
if (GetRouteInfoByRouteAddr(&RouteInfo))
{
// 將狀態轉移到呼叫狀態
RingTimeCounter = MAX_RING_TIMES;
SystemStatus.Status = Status_Calling;
// 設置當前呼叫的目的地址
// SetConnectingAddr();
ConnectingAddr[0] = pRxFrame->Frame.Addr[0];
ConnectingAddr[1] = pRxFrame->Frame.Addr[1];
ConnectingAddr[2] = pRxFrame->Frame.Addr[2];
ConnectingAddr[3] = pRxFrame->Frame.Addr[3];
// 將檢索到的單元地址填入LCD顯示緩沖
InitDispBuffer(TRUE);
DispBuffer[1][7] = (RouteInfo.House >> 4) | 0x30;
DispBuffer[1][8] = (RouteInfo.House&0x0F) | 0x30;
DispBuffer[1][11] = (RouteInfo.Floor / 10) | 0x30;// >> 4
DispBuffer[1][12] = (RouteInfo.Floor % 10) | 0x30;// &0x0F
DispBuffer[1][13] = (RouteInfo.User / 10) | 0x30;
DispBuffer[1][14] = (RouteInfo.User % 10) | 0x30;
UpdateDisp(TRUE);
// 通過分機地址解析出該分機的樓層號和房間號
OpenRingPower();// 打開鈴聲音頻電路
}
}
}
else
{
RS485AckCancelCommand();
}
break;
}
case (Command_CallRequest | Command_Busy): //室內分機返回忙信號
{
if (SystemStatus.Status == Status_CallSendingRequest)
{
// 檢查返回呼叫應答的室內分機的地址是不是剛才要發出呼叫請求的室內機地址
if ((pRxFrame->Frame.Addr[0] == TxFrame.Frame.Addr[0])
&& (pRxFrame->Frame.Addr[1] == TxFrame.Frame.Addr[1])
&& (pRxFrame->Frame.Addr[2] == TxFrame.Frame.Addr[2])
&& (pRxFrame->Frame.Addr[3] == TxFrame.Frame.Addr[3]))
{
RS485SendWaitTimer = 0x00; // 將計數器清零
// 顯示對方忙
memcpy(&DispBuffer[0][1], &DispBuffer[1][1], DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
memcpy(&DispBuffer[1][1], "對方忙,請返回!", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
MessageShowTimer = 300; // 消息顯示時間為3ms
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_ShowingMessage;
UpdateDisp(FALSE);
}
}
break;
}
case Command_HandUp: // 分機應答管理機的摘機信號
{
if ((pRxFrame->Frame.Addr[0] == TxFrame.Frame.Addr[0])
&& (pRxFrame->Frame.Addr[1] == TxFrame.Frame.Addr[1])
&& (pRxFrame->Frame.Addr[2] == TxFrame.Frame.Addr[2])
&& (pRxFrame->Frame.Addr[3] == TxFrame.Frame.Addr[3])
&& (GetRouteInfoByRouteAddr(&RouteInfo)))
{
RS485SendWaitTimer = 0;
SystemStatus.Status = Status_Talking;
InitDispBuffer(TRUE);
DispBuffer[1][7] = (RouteInfo.House >> 4) | 0x30; // 樓棟號
DispBuffer[1][8] = (RouteInfo.House&0xFF) | 0x30;
DispBuffer[1][11] = (RouteInfo.Floor / 10) | 0x30; // 樓層號
DispBuffer[1][12] = (RouteInfo.Floor % 10)| 0x30;//
DispBuffer[1][13] = (RouteInfo.User / 10) | 0x30;
DispBuffer[1][14] = (RouteInfo.User % 10) | 0x30;
UpdateDisp(TRUE);
}
break;
}
case Command_Disconnect: // 分機應答管理機的斷開連接的命令
{
if ((pRxFrame->Frame.Addr[1] == ConnectingAddr[1])
&& (pRxFrame->Frame.Addr[2] == ConnectingAddr[2])
&& (pRxFrame->Frame.Addr[3] == ConnectingAddr[3]))
{
RS485SendWaitTimer = 0;
// 設置當前連接的目的地址為無效地址
ClearConnectingAddr();
// 關閉音頻、視頻電源
ClosePower();
SystemStatus.Status = Status_Idle;
InitDispBuffer(TRUE);
UpdateDisp(FALSE);
}
break;
}
default:
break;
}
}
else // 分機的命令幀
{
switch (pRxFrame->Frame.aData[0])
{
case Command_CallRequest: // 室內分機的呼叫請求
{
// 返回呼叫應答信號
TxFrame.Frame.Addr[0] = pRxFrame->Frame.Addr[0];
TxFrame.Frame.Addr[1] = pRxFrame->Frame.Addr[1];
TxFrame.Frame.Addr[2] = pRxFrame->Frame.Addr[2];
TxFrame.Frame.Addr[3] = pRxFrame->Frame.Addr[3];
TxFrame.Frame.nLength = 1;
TxFrame.Frame.aData[0] = (Command_CallRequest | Command_Ack);
TxFrameLength = 6; // 發送數據幀的長度為6個字節,不包括校驗和停止字節
if ((pRxFrame->Frame.Addr[0] == ConnectingAddr[0]) // 如果當前正在連接,再發來呼叫請求則認為是重復發送的請求,返回應答信號
&& (pRxFrame->Frame.Addr[1] == ConnectingAddr[1])
&& (pRxFrame->Frame.Addr[2] == ConnectingAddr[2])
&& (pRxFrame->Frame.Addr[3] == ConnectingAddr[3]))
{
}
else if ((SystemStatus.Status == Status_Talking) // 正在通話
|| (SystemStatus.Status == Status_Viewing) // 正在監視
|| (SystemStatus.Status == Status_Calling) // 正在呼叫室內分機
|| (SystemStatus.Status == Status_Alarming_F) // 分機報警
|| (SystemStatus.Status == Status_Alarming_M) // 門口機報警
|| (SystemStatus.Status == Status_bCallingIn_M) // 正在被門口機呼叫
|| (SystemStatus.Status == Status_bCallingIn_F)) // 正在被室內機呼叫
{
// 如果管理機正忙,則返回忙信號
TxFrame.Frame.aData[0] |= Command_Busy;
}
else if (bHandleUp == TRUE) // 分機呼叫的時候管理機的手柄拿起來了表示管理機正忙
{
// 返回忙信號
TxFrame.Frame.aData[0] |= Command_Busy;
}
else if (GetRouteInfoByRouteAddr(&RouteInfo))
{
// 設置正在通話的分機地址
// SetConnectingAddr();
ConnectingAddr[0] = pRxFrame->Frame.Addr[0];
ConnectingAddr[1] = pRxFrame->Frame.Addr[1];
ConnectingAddr[2] = pRxFrame->Frame.Addr[2];
ConnectingAddr[3] = pRxFrame->Frame.Addr[3];
RingTimeCounter = MAX_RING_TIMES;
KeyBuffer[0] = 0;
SystemStatus.Status = Status_bCallingIn_F;
InitDispBuffer(TRUE);
DispBuffer[1][7] = (RouteInfo.House >> 4) | 0x30;
DispBuffer[1][8] = (RouteInfo.House&0xFF) | 0x30;
if (DispBuffer[1][7] == 0x30)
{
DispBuffer[1][7] = ' '; // 最前面的'0'不顯示
}
DispBuffer[1][11] = (RouteInfo.Floor / 10) | 0x30;
DispBuffer[1][12] = (RouteInfo.Floor % 10) | 0x30;
DispBuffer[1][13] = (RouteInfo.User / 10) | 0x30;
DispBuffer[1][14] = (RouteInfo.User % 10) | 0x30;
UpdateDisp(TRUE);
OpenRingPower(); // 打開振鈴音頻電路
}
// 返回應答信號
RS485SendTxFrame();
break;
}
case Command_HandUp: // 分機發送摘機命令
{
// 返回呼叫應答信號
TxFrame.Frame.Addr[0] = pRxFrame->Frame.Addr[0];//可能多余
TxFrame.Frame.Addr[1] = pRxFrame->Frame.Addr[1];
TxFrame.Frame.Addr[2] = pRxFrame->Frame.Addr[2];
TxFrame.Frame.Addr[3] = pRxFrame->Frame.Addr[3];
TxFrame.Frame.nLength = 1;
TxFrame.Frame.aData[0] = (Command_CallRequest | Command_Ack);
TxFrameLength = 6; // 發送數據幀的長度為6個字節,不包括校驗和停止字節
if (SystemStatus.Status == Status_Calling) // 如果管理機正在呼叫分機
{
if ((pRxFrame->Frame.Addr[0] == ConnectingAddr[0])
&& (pRxFrame->Frame.Addr[1] == ConnectingAddr[1])
&& (pRxFrame->Frame.Addr[2] == ConnectingAddr[2])
&& (pRxFrame->Frame.Addr[3] == ConnectingAddr[3])
&& (GetRouteInfoByRouteAddr(&RouteInfo)))
{
// 分機摘機之后,關閉振鈴信號,切換到通話的通道
ChangeToTalkChannel();
SystemStatus.Status = Status_Talking;
InitDispBuffer(TRUE);
DispBuffer[1][7] = (RouteInfo.House >> 4) | 0x30;// 樓棟號
DispBuffer[1][8] = (RouteInfo.House&0xFF) | 0x30;
DispBuffer[1][11] = (RouteInfo.Floor / 10 ) | 0x30;// 樓層號>> 4
DispBuffer[1][12] = (RouteInfo.Floor % 10) | 0x30;// &0xFF
DispBuffer[1][13] = (RouteInfo.User / 10) | 0x30;
DispBuffer[1][14] = (RouteInfo.User % 10) | 0x30;
UpdateDisp(FALSE);
}
}
else
{
TxFrame.Frame.aData[0] = Command_Disconnect;
}
RS485SendTxFrame(); // 發送應答幀
break;
}
case Command_Disconnect: // 分機斷開連接請求
{
// CommandDisconnect();
if ((pRxFrame->Frame.Addr[0] == ConnectingAddr[0])
&& (pRxFrame->Frame.Addr[1] == ConnectingAddr[1])
&& (pRxFrame->Frame.Addr[2] == ConnectingAddr[2])
&& (pRxFrame->Frame.Addr[3] == ConnectingAddr[3]))
{
// 返回應答
TxFrame.Frame.Addr[0] = pRxFrame->Frame.Addr[0];
TxFrame.Frame.Addr[1] = pRxFrame->Frame.Addr[1];
TxFrame.Frame.Addr[2] = pRxFrame->Frame.Addr[2];
TxFrame.Frame.Addr[3] = pRxFrame->Frame.Addr[3];
TxFrame.Frame.nLength = 1;
TxFrame.Frame.aData[0] = Command_Disconnect | Command_Ack;// 返回門口機的斷開連接的請求
TxFrameLength = 6;
RS485SendTxFrame(); // 返回應答
// 關閉音頻、視頻電源
ClosePower();
// 將連接地址置為無效的地址
ClearConnectingAddr();
// 系統狀態回到初始狀態
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_Idle;
InitDispBuffer(TRUE);
UpdateDisp(FALSE);
}
break;
}
case Command_Alarm: // 分機報警
{
if (GetRouteInfoByRouteAddr(&RouteInfo))
{
if ((SystemStatus.Status == Status_Viewing) // 如果系統正忙,則先關閉當前連接并切換到報警狀態
|| (SystemStatus.Status == Status_Calling)
|| (SystemStatus.Status == Status_Talking)
|| (SystemStatus.Status == Status_CallSendingRequest)
|| (SystemStatus.Status == Status_ViewSendingRequest)
|| (SystemStatus.Status == Status_bCallingIn_M)
|| (SystemStatus.Status == Status_bCallingIn_F))
{
RS485SendCancelCommand(); // 先取消當前連接
// 將連接地址置為無效的地址
ClearConnectingAddr();
// 關閉音頻、視頻電源
ClosePower();
SystemStatus.Status = Status_Idle;
KeyBuffer[0] = 0;
}
// 返回報警應答信號
TxFrame.Frame.Addr[0] = pRxFrame->Frame.Addr[0];
TxFrame.Frame.Addr[1] = pRxFrame->Frame.Addr[1];
TxFrame.Frame.Addr[2] = pRxFrame->Frame.Addr[2];
TxFrame.Frame.Addr[3] = pRxFrame->Frame.Addr[3];
TxFrame.Frame.nLength = 0x01;
TxFrame.Frame.aData[0] = (Command_Alarm | Command_Ack);
TxFrameLength = 6;
RS485SendTxFrame();
if ((SystemStatus.Status != Status_Alarming_F)
&& (SystemStatus.Status != Status_Alarming_M))
{
SystemStatus.PreStatus = SystemStatus.Status;
}
SystemStatus.Status = Status_Alarming_F;
InitDispBuffer(TRUE);
AlarmRecord.Addr[0] = 0x00;
AlarmRecord.Addr[1] = RouteInfo.House;
DispBuffer[1][5] = (RouteInfo.House >> 4) | 0x30;
if (DispBuffer[1][5] == 0x30)
{
DispBuffer[1][5] = ' '; // 最前面的'0'不顯示
}
DispBuffer[1][6] = (RouteInfo.House&0x0F) | 0x30;
// 由分機地址得到分機的房間號碼
i = RouteInfo.Floor; // 樓層號
j = RouteInfo.User; // 分機號
AlarmRecord.Addr[2] = i;
DispBuffer[1][9] = (i / 10) | 0x30;//(i >> 4) | 0x30;
DispBuffer[1][10] = (i % 10) | 0x30;//(i&0x0F) | 0x30;
AlarmRecord.Addr[3] = j;
DispBuffer[1][11] = (j / 10) | 0x30;
DispBuffer[1][12] = (j % 10) | 0x30;
UpdateDisp(FALSE);
AlarmTimeCounter = MAX_ALARM_TIMES; // 設定最長報警時間
OpenAlarmPower(); // 打開報警音頻電路
// 保存報警記錄
memcpy((BYTE *)(&(AlarmRecord.Time)), (BYTE *)(&Time), sizeof(t_Time));// 保存時間
SaveAlarmRecord(&AlarmRecord); // 將報警記錄AlarmRecord結構體寫入到I2C存儲器中
}
break;
}
case Command_CancelAlarm: // 取消報警
{
KeyBuffer[0] = 0x00;
CancelKeyPress();
break;
}
default:
break;
}
}
}
if (pRxFrame != NULL)
{
MsgPutBuf((BYTE *)pRxFrame);
}
}
//
// 從RS232模擬串口接收到單個數據字節
/*void RS232RxHandler(PMSG msg)
{
BYTE RxData = msg->Param;
} */
//
// 等待與門口主機通信的線路空閑下來
// 通過設置Timer 0定時器等待一個特定的時間, 在這段時間當中如果沒有檢測到線路上有數據則認為線路空閑
void WaitForLineIdle(void)
{
LineIdle = FALSE;
// Init timer0 counter
TH0 = LineIdleWaitTime >> 8;
TL0 = LineIdleWaitTime & 0xFF;
TR0 = ENABLE; // timer0 run
EX0 = ENABLE; // 開INT0中斷,檢測Rx線上是否有數據(低電平)
while ( !LineIdle ) ; // wait for Timer2 interrupt
EX0 = DISABLE; // 關INT0中斷
TR0 = DISABLE; // timer0 stop
}
/*---------------------------------------------------------------------------*/
// 將正在連接的目的地址清空為無效地址
void ClearConnectingAddr(void)
{
ConnectingAddr[0] = 0xFF;
ConnectingAddr[1] = 0xFF;
ConnectingAddr[2] = 0xFF;
ConnectingAddr[3] = 0xFF;
}
/*----------------------------------------------------------------------------+
| End of source file |
+----------------------------------------------------------------------------*/
/*------------------------ Nothing Below This Line --------------------------*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -