📄 procdiag.cpp
字号:
// NAME: ProcDiag.cpp
//--------------------------------------------------------------------------------------------------
//
// GENERAL DESCRIPTION
//
// This module provides the implementation of the interface with the phone DiagTask.
//--------------------------------------------------------------------------------------------------
//
// Revision History:
// Modification Tracking
// Author Date Number Description of Changes
// ------------------------- ------------ ---------- ----------------------------------------
//
// Portability:
// This module can be portable to other C++ compilers or Win32 platforms.
//--------------------------------------------------------------------------------------------------
// INCLUDE FILES
//--------------------------------------------------------------------------------------------------
#include "StdAfx.h"
#include "common.h"
#include "ProcDiag.h"
#include "DiagCmd.h"
#include "UART.h"
#include "BurnFlash.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
using namespace std;
//--------------------------------------------------------------------------------------------------
// ENUM
//--------------------------------------------------------------------------------------------------
enum {
MODE_OFFLINE_A_F, /* Go to offline analog */
MODE_OFFLINE_D_F, /* Go to offline digital */
MODE_RESET_F, /* Reset. Only exit from offline */
MODE_MAX_F, /* Last (and invalid) mode enum value */
MODE_16BIT_SIZE = 0x7FFF
} diag_mode_enum_type;
//--------------------------------------------------------------------------------------------------
// GLOBAL VARIABLES
//--------------------------------------------------------------------------------------------------
CProcDiag theDiag; //the unique instance for the application
//--------------------------------------------------------------------------------------------------
// CLASS IMPLEMENTATION
//--------------------------------------------------------------------------------------------------
//
// Construction/Destruction
//--------------------------------------------------------------------------------------------------
CProcDiag::CProcDiag()
{
m_packet_snd = new pkt_buffer_type;
if(m_packet_snd == NULL)
{
cout << "memory new error!" << endl;
exit(1);
}
}
CProcDiag::~CProcDiag()
{
if(m_packet_snd != NULL)
{
delete m_packet_snd;
m_packet_snd = NULL;
}
}
//--------------------------------------------------------------------------------------------------
// External Member Fucntions
//--------------------------------------------------------------------------------------------------
//
// FUNCTION: CProcDiag::SendDloadCmd
//
// DESCRIPTION:
// This function writes the phone S/W to the specific Flash address.
//
// ARGUMENTS PASSED:
// None
// RETURN VALUE:
// SUCCESS
// ERR_SND_CHG_TO_OFFLINE_CMD
// ERR_COMM_FAIL
// PRE-CONDITIONS:
// (1) The phone must work on a normal state.
// (2) The phone and the PC connect with a cable through COM1/COM2
//
// POST-CONDITIONS:
// None
// IMPORTANT NOTES:
// None
//--------------------------------------------------------------------------------------------------
BYTE
CProcDiag::SendDloadCmd()
{
BYTE rlt = ChangeToOffline();
if(rlt != SUCCESS)
return rlt;
Sleep(6000);
START_BUILDING_PACKET(m_packet_snd);
ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_DLOAD_F);
FINISH_BUILDING_PACKET(m_packet_snd);
if( !SendAndWaitRsp())
{
cout << TAB_SUB_OPR << "send download fail." << endl;
TRACE0("\r\nsend download fail!\r\n");
return ERR_COMM_FAIL;
}
return SUCCESS;
}
//--------------------------------------------------------------------------------------------------
// Internal Member Fucntions
//--------------------------------------------------------------------------------------------------
BOOL
CProcDiag::SendAndWaitRsp()
{
const BYTE *data;
data = (BYTE*) m_packet_snd->buf;
if(m_packet_snd->broken == TRUE)
{
TRACE0("\r\nthe transmit packet is broken in diag_transmit_packet!\r\n");
return false;
}
theComm.TransmitPacket((BYTE*)m_packet_snd);
memset(m_rcv_buf, 0, MAX_PACKET_LEN);
if(theComm.RcvPacket (m_rcv_buf, false) == 0)
{
TRACE("\r\nreceive response is overtime in diag_transmit_packet!\r\n");
return false;
}
switch(m_packet_snd->buf[0])
{
case DIAG_DLOAD_F:
switch(m_rcv_buf[0])
{
case DIAG_DLOAD_F:
return true;
case DIAG_BAD_CMD_F:
case DIAG_BAD_LEN_F:
case DIAG_BAD_DEV_F:
case DIAG_BAD_MODE_F:
default:
TRACE0("receive BAD response in diag_dload_cmd!");
return false;
}
break;
case DIAG_CONTROL_F:
if(m_rcv_buf[0] == DIAG_CONTROL_F)
return true;
else
break;
case DIAG_DIAG_VER_F:
if(m_rcv_buf[0] == DIAG_DIAG_VER_F)
return true;
else
break;
default:
break;
}
return false;
}
BYTE
CProcDiag::ChangeToOffline()
{
BYTE cTmp;
WORD wTmp = MODE_OFFLINE_D_F;
START_BUILDING_PACKET(m_packet_snd);
ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_CONTROL_F);
cTmp = B_PTR(wTmp)[0];
ADD_BYTE_TO_PACKET(m_packet_snd, cTmp);
cTmp = B_PTR(wTmp)[1];
ADD_BYTE_TO_PACKET(m_packet_snd, cTmp);
FINISH_BUILDING_PACKET(m_packet_snd);
if( !SendAndWaitRsp())
{
cout << TAB_SUB_OPR << "send offline fail." << endl;
TRACE0("\r\nsend offline fail!\r\n");
return ERR_SND_CHG_TO_OFFLINE_CMD;
}
return SUCCESS;
}
BYTE
CProcDiag::SayHello()
{
/* Send a DIAG_DIAG_VER_F diag command to check if it is in diag download mode */
printf("111111111111111111111111111111");
START_BUILDING_PACKET(m_packet_snd);
ADD_BYTE_TO_PACKET(m_packet_snd, DIAG_DIAG_VER_F);
FINISH_BUILDING_PACKET(m_packet_snd);
if( !SendAndWaitRsp())
{
return ERR_UNKNOWN;
}
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -