//================================================================== // // Filename: mapp_Ami.c // Description: Ami driver // //------------------------------------------------------------------ // // version: // date: 23:54pm, 08.Apr.2012, by Sirius // Description: // //------------------------------------------------------------------ //================================================================== /*------------------------------------------------------------------------------ * I N C L U D E *------------------------------------------------------------------------------*/ //#include #include "stm32f0xx.h" #include "general.h" #include "mapp_can.h" #include "mapp_msg.h" #include "mapp_uart1.h" #include "main.h" #include "mapp_ext.h" #include "mapp_Ami.h" #include "mapp_ami.h" #include "mapp_pwr.h" #include "mapp_gpio.h" #include "mapp_key.h" #include "mapp_bus.h" /*------------------------------------------------------------------------------ * D E F I N E *------------------------------------------------------------------------------*/ #define AMI_TX_BUF_LEN (40) #define AMI_RX_BUF_LEN (30) /*------------------------------------------------------------------------------ * S T R U C T *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * S T A T I C - V A R I A B L E S *------------------------------------------------------------------------------*/ //static U08 s_u8DvdRxBuf[UART3_RX_BUF_SIZE] = {0}; static U08 s_u8AmiRxBuf[AMI_RX_BUF_LEN] = {0}; static U08 s_u8AmiTxBuf[AMI_TX_BUF_LEN] = {0}; static VU16 s_vu16AmiTaskTmr=0; /*------------------------------------------------------------------------------ * G L O B A L *------------------------------------------------------------------------------*/ T_AMI_CFG gtAmi ={0}; /*------------------------------------------------------------------------------ * P R O T O T Y P E *------------------------------------------------------------------------------*/ static BOOL s_AmiRxCheck(void); static void s_frmAmiRxSysReset(void); static void s_frmAmiRxHandshake(void); static void s_frmAmiRxSysUpdateReset(void); static void s_frmAmiRxMic(void); static void s_frmAmiRxUled(void); static void s_frmAmiRxRelay(void); static void s_frmAmiRxSip(void); static void s_frmAmiRxID(void); static void s_frmAmiRxDoorLed(void); static void s_frmAmiRxCallLed(void); static void s_frmAmiRxAsk(void); static void s_frmAmiRxEvent(void); static void s_frmAmiTxNull(U16 prm); static void s_frmAmiTxID(U16 prm); static void s_frmAmiTxKey(U16 prm); static void s_frmAmiTxVersion(U16 prm); static void s_frmAmiRxNetReset(void); //------------------------------------------------------------------ // array for function receive data from DVD // 13:53pm, 21.Sep.2012, modified by Sirius //------------------------------------------------------------------ #define NbOfAmiRxCmd (14) static const T_AMI_RX_FUNC arryAmiRxFuncTbl[NbOfAmiRxCmd] = { {"CALL", s_frmAmiRxHandshake}, /* 14 无效 */ {"KEY;", Uart_EVEAL_RevData}, /* 1 */ {"KEY=", Uart_EVEAL_RevData}, /* 2 */ {"KEY?", Uart_EVEAL_RevData}, /* 3 */ {"MIC", s_frmAmiRxMic}, /* 4 */ {"NLED", s_frmAmiRxMic}, /* 5 */ {"ULED", s_frmAmiRxUled}, /* 6 */ {"RELAY", s_frmAmiRxRelay}, /* 7 */ {"SIP", s_frmAmiRxSip}, /* 8 */ {"ID", s_frmAmiRxID}, /* 9 */ {"DOORLED", s_frmAmiRxDoorLed}, /* 10 */ {"CALLLED", s_frmAmiRxCallLed}, /* 11 */ {"ASK", s_frmAmiRxAsk}, /* 12 */ {"NETRESET", s_frmAmiRxNetReset}, /* 13 */ }; //------------------------------------------------------------------ // array for function transmit data to DVD // 17:42pm, 20.Sep.2012, modified by Sirius //------------------------------------------------------------------ static const fp_prm arryAmiTxFuncTbl[NumOfAMIMsg] = { s_frmAmiTxNull, /* Ami_MSG_NULL */ s_frmAmiTxKey, /* Ami_MSG_KEY */ s_frmAmiTxID, /* Ami_MSG_ID */ s_frmAmiTxVersion, /* Ami_MSG_VER */ }; //------------------------------------------------------------------------ void AmiValInit(void) { U32 u32prm =0; MEMSET(>Ami, 0, sizeof(T_AMI_CFG)); u32prm = ( (DeviceMacInfo[0] <<24) | (DeviceMacInfo[1] <<16) | (DeviceMacInfo[2] <<8) | DeviceMacInfo[4] ) ; gtAmi.FJKeymac = HexToInt(u32prm); } /*---------------------------------------------------------------------- // Function uses : AmiTaskTmr // Input parameter : // Output parameter : // Use Function : // Reserve date : 09:11am, 30.Aug.2012, written by Sirius ----------------------------------------------------------------------*/ void AmiTaskTmr(void) { if( s_vu16AmiTaskTmr != 0xFFFF ) {s_vu16AmiTaskTmr++;} } /*---------------------------------------------------------------------- // Function uses : s_AmiRxCheck // Input parameter : // Output parameter : // Use Function : check frame format received from Ami. // Reserve date : 14:28pm, 21.Sep.2012, written by Sirius ----------------------------------------------------------------------*/ static BOOL s_AmiRxCheck(void) { U08 len = 0; //U08 chksum = 0; len = s_u8AmiRxBuf[0]; if (s_u8AmiRxBuf[len] == '#') { return (TRUE); } else { return (FALSE); } } /*---------------------------------------------------------------------- // Function uses : s_AmiRxIDCheck // Input parameter : // Output parameter : // Use Function : check frame format received from Ami. // Reserve date : 11:51am, 30.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static BOOL s_AmiRxIDCheck(U08 u8cnt) { U08 i = 0; U08 len = 0; /* LEN ==4,只比较前4个字节*/ len = strlen(arryAmiRxFuncTbl[u8cnt].datatype); for (i = 0; i < len; i++) { if (arryAmiRxFuncTbl[u8cnt].datatype[i] != s_u8AmiRxBuf[1+i]) { return (FALSE); } } return (TRUE); } /*---------------------------------------------------------------------- // Function uses : DvdRxTask // Input parameter : // Output parameter : // Use Function : Receive command data from DVD. // Reserve date : 15:18pm, 22.Feb.2013, written by Sirius ----------------------------------------------------------------------*/ void AmiRxTask(void) { U08 err = 0; U08 i = 0; Uart2GetChar(s_u8AmiRxBuf, 0, &err); /* Copy data if received */ if (err == COM_NO_ERR) { /* Valid data received */ if (s_AmiRxCheck()) { /* Caculate checksum and feed back Ack data */ for (i = 0; i < NbOfAmiRxCmd; i++) { if (s_AmiRxIDCheck(i)) { arryAmiRxFuncTbl[i].pfunc(); break; } } } } } /*---------------------------------------------------------------------- // Function uses : DvdTxTask // Input parameter : // Output parameter : // Use Function : Transmit data to DVD. // Reserve date : 14:29pm, 19.Feb.2013, written by Sirius ----------------------------------------------------------------------*/ void AmiTxTask(void) { T_MESSAGE *pmsg; pmsg = OSQGet(AmiMsgQueue); if (pmsg->id < NumOfAMIMsg) { arryAmiTxFuncTbl[pmsg->id](pmsg->prm); } if( s_vu16AmiTaskTmr >= 300 ) { s_vu16AmiTaskTmr = 0; // OSQPost(AmiMsgQueue, AMI_MSG_VER, 0); } } /*---------------------------------------------------------------------- // Function uses : s_frmAmiRxHandshake // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxHandshake(void) { Uart_Call_RevData( s_u8AmiRxBuf[6] ); } static void s_frmAmiRxEvent(void) { Uart_Call_RevData( s_u8AmiRxBuf[6] ); } static void s_frmAmiTxNull(U16 prm) { prm = prm; } /*---------------------------------------------------------------------- // Function uses : s_frmAmiRxSysReset // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxSysReset(void) { gtPwrCfg.state = POWER_ON_RESET; gtAmi.workmode = 0; //进入测试模式 } /*---------------------------------------------------------------------- // Function uses : s_frmAmiRxSysReset // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxSysUpdateReset(void) { // SYS_SetUpdate(); gtPwrCfg.state = POWER_ON_RESET; gtAmi.workmode = 0; //进入测试模式 } /*---------------------------------------------------------------------- // Function uses : s_frmAmiRxMic // Input parameter : // Output parameter : // Use Function :0:手柄麦克风,1:面板麦克风 // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxMic(void) { if(s_u8AmiRxBuf[5]=='0') { //GpioMicSwOutputCfg (RESET); } else { // GpioMicSwOutputCfg (SET); } } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxUled // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxUled(void) { U08 u8cnt =0; u8cnt = s_u8AmiRxBuf[6] - 0x30; if (u8cnt >2) { u8cnt =2; } gtAmi.Uled = u8cnt; } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxUled // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxRelay(void) { U08 u8cnt =0; u8cnt = s_u8AmiRxBuf[6] - 0x30; if (u8cnt == 0) { gtAmi.Relay[0 ]= s_u8AmiRxBuf[8]; if ( gtAmi.Relay[0 ] == '0') { RELAY_OFF; } else if ( gtAmi.Relay[0 ] == '1') { RELAY_ON; } } else if (u8cnt == 1) { gtAmi.Relay[1 ]= s_u8AmiRxBuf[8]; } else { gtAmi.Relay[2 ]= s_u8AmiRxBuf[8]; } } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxUled // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxDoorLed(void) { gtAmi.DoorLed[0] = s_u8AmiRxBuf[9]-0x30; gtAmi.DoorLed[1] = s_u8AmiRxBuf[10]-0x30; gtAmi.DoorLed[2] = s_u8AmiRxBuf[11]-0x30; } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxUled // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxSip(void) { if(s_u8AmiRxBuf[5]=='0') { gtAmi.RTL8152_flag=0; } else if(s_u8AmiRxBuf[5]=='1') { gtAmi.RTL8152_flag=1; } else if(s_u8AmiRxBuf[5]=='2') { gtAmi.RTL8152_flag=2; } } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxID // Input parameter : // Output parameter : // Use Function : // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxID(void) { OSQPost(AmiMsgQueue, AMI_MSG_ID, 0); } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxID // Input parameter : // Output parameter : // Use Function : // Reserve date : 18:35pm, 17.JAN.2020, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxCallLed(void) { gtAmi.callled_red = s_u8AmiRxBuf[9] -0x30; gtAmi.callled_yel = s_u8AmiRxBuf[10] -0x30; } /*---------------------------------------------------------------------- // Function name : s_frmAmiRxID // Input parameter : // Output parameter : // Use Function : // Reserve date : 18:35pm, 17.JAN.2020, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiRxAsk(void) { if (s_u8AmiRxBuf[5] ==0x49) { OSQPost(AmiMsgQueue, AMI_MSG_ID, 0); } else if (s_u8AmiRxBuf[5] ==0x56) { OSQPost(AmiMsgQueue, AMI_MSG_VER, 0); } } static void s_frmAmiRxNetReset(void) { if (s_u8AmiRxBuf[10] == '0') { POWER_RESET_OFF; } else if(s_u8AmiRxBuf[10] == '1') { POWER_RESET_ON; } } /*---------------------------------------------------------------------- // Function uses : s_frmAmiTxKey // Input parameter : // Output parameter : // Use Function : SWC key code. // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiTxKey(U16 prm) { U08 *buf = (U08*)NULL; static U08 upresstwo =0; buf = &s_u8AmiTxBuf[0]; /* Obtain pointer to Tx buffer */ *buf++ = '$'; #ifdef WDFJKEY_MAC_ADD *buf++ = HI_BYTE( gtArm.FJKeymac); //dwdtest *buf++ = LO_BYTE( gtArm.FJKeymac); //dwdtest #endif *buf++ = 'K'; *buf++ = 'E'; *buf++ = 'Y'; if ( gtArm.KeyState == 0x22) { *buf++ = 0x30+ 0xf; upresstwo =1; } else { if (HI_BYTE(prm)==8) { *buf++ = 0x30+0x0b; } else if (HI_BYTE(prm)==9) { *buf++ = 0x30+0x0c; }else if (HI_BYTE(prm)==0xa) { *buf++ = 0x30+0x0d; }else if (HI_BYTE(prm)==0xb) { *buf++ = 0x30+0x0e; } else { *buf++ = 0x30+HI_BYTE(prm); } } *buf++ = ','; gtAmi.startworkflag =1; if ((HI_BYTE(prm)<5) && (LO_BYTE(prm) == 0X02)){ //dwd200422 prm &= 0xff00; prm |= 0x01; } *buf++ = 0X30+LO_BYTE(prm); // LED_ACK_TASK(prm); *buf++ = '#'; #ifdef WDFJKEY_MAC_ADD Uart2PutChar(s_u8AmiTxBuf, 11); #else Uart2PutChar(s_u8AmiTxBuf, 9); #endif } /*---------------------------------------------------------------------- // Function uses : s_frmAmiTxID // Input parameter : // Output parameter : // Use Function : DEVICE ID // Reserve date : 14:55pm, 6.Sep.2019, written by dwd ----------------------------------------------------------------------*/ static void s_frmAmiTxID(U16 prm) { U08 *buf = (U08*)NULL; U08 u8cnt =0; buf = &s_u8AmiTxBuf[0]; /* Obtain pointer to Tx buffer */ #ifdef WDFJKEY_MAC_ADD *buf++ = HI_BYTE( gtAmi.FJKeymac); //dwdtest *buf++ = LO_BYTE( gtAmi.FJKeymac); //dwdtest #endif *buf++ = '$'; *buf++ = 'I'; *buf++ = 'D'; *buf++ = ','; for (u8cnt = 0;u8cnt <15;u8cnt ++) { // *buf ++ = DeviceID[u8cnt]; } // *buf++ = 0X30+LO_BYTE(prm); *buf++ = '1'; *buf++ = '#'; #ifdef WDFJKEY_MAC_ADD Uart2PutChar(s_u8AmiTxBuf, 23); #else Uart2PutChar(s_u8AmiTxBuf, 21); #endif } static void s_frmAmiTxVersion(U16 prm) { U08 *buf = (U08*)NULL; U08 u8cnt =0; buf = &s_u8AmiTxBuf[0]; /* Obtain pointer to Tx buffer */ #ifdef WDFJKEY_MAC_ADD *buf++ = HI_BYTE( gtAmi.FJKeymac); //dwdtest *buf++ = LO_BYTE( gtAmi.FJKeymac); //dwdtest #endif *buf++ = '$'; *buf++ = 'V'; *buf++ = ','; for (u8cnt = 0;u8cnt <15;u8cnt ++) { *buf ++ = DeviceVisionInfo[u8cnt]; } // *buf++ = 0X30+LO_BYTE(prm); *buf++ = 'F'; *buf++ = '#'; #ifdef WDFJKEY_MAC_ADD Uart2PutChar(s_u8AmiTxBuf, 22); #else Uart2PutChar(s_u8AmiTxBuf, 20); #endif } //============================================================== // End Of File //==============================================================