📄 missionnewdlg.cpp
字号:
if (sss.Open(m_strFilePath.GetBuffer(100),CFile::modeRead)==0){
AfxMessageBox("文件不存在,请重新选择文件!");
return;
}
g4InputFileLength = sss.GetLength();
sss.Read(gInputFileBuffer, g4InputFileLength);
sss.Close();
if (gInputFileBuffer[0] == 'A' && gInputFileBuffer[1] == 'V'){
// AVB文件
if (gInputFileBuffer[2] == 'B'){
g2PageFileLength = 0x0800;
g4InputFileLength = (gInputFileBuffer[0x08] << 8) | gInputFileBuffer[0x09];
g4TransferFileAddress = (gInputFileBuffer[0x0a] << 8) | gInputFileBuffer[0x0b];
g4TransferFileLength = g4InputFileLength;
g4OpenFileAddress = 0;
g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
return;
}
}
// AVM文件
else if (gInputFileBuffer[2] == 'M'){
g2PageFileLength = 0x0800;
g4InputFileLength = MRFBS_Byte2Dword(&gInputFileBuffer[0x08]);
g4TransferFileAddress = MRFBS_Byte2Dword(&gInputFileBuffer[0x0c]);
g4TransferFileLength = g4InputFileLength;
g4OpenFileAddress = 0;
g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
return;
}
}
else if (gInputFileBuffer[2] == 'T'){
g2PageFileLength = 0x0800;
g4InputFileLength = MRFBS_Byte2Dword(&gInputFileBuffer[0x08]);
g4TransferFileAddress = 0x00;
g4TransferFileLength = g4InputFileLength;
g4OpenFileAddress = 0;
g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
g4InputFileLength += 0x40;
if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
return;
}
g4InputFileLength = 0;
do {
gInputFileBuffer[g4InputFileLength] = gInputFileBuffer[g4InputFileLength+0x40];
} while (++g4InputFileLength < g4TransferFileLength);
}
else {
AfxMessageBox("不支持的文件,请重新选择文件!");
return;
}
MRFBM_ChangeBank(0); // 进入暂停模式
FRFBM_EnableTransferFile = 1;
progress_ctrl.SetPos(0); // 复位进度条
}
else {
AfxMessageBox("不支持文件的文件或文件已损坏,请重新选择文件!");
}
return;
}
void CDebug51Dlg::MRFBM_WriteFile(){
BYTE gLocal_1;
BYTE gLocal_2;
BYTE gLocal_Buffer[0x42];
DWORD g4Local_1;
WORD g2Local_1;
CByteArray hexdata;
if (gRFBM_WriteDelayTime == 0){
if (g2PageFileCounter == 0){
g2PageFileCounter = 1;
TCount = g2PageFileLength;
// 因为这个指令发送太快会令从方接收出错,故增加这个逻辑可以DELAY
if (gRFBM_WriteStartCommand == 1){
gRFBM_WriteStartCommand = 0;
g2PageFileCounter = 0;
MRFBM_Write_0xf9(0x0000, g4TransferFileAddress, g4TransferFileLength, g2PageFileLength);
}
g4Local_1 = g4TransferFileLength / 100;
g2TransferFilePercent = (WORD) g4Local_1;
g4Local_1 = g4TransferFileLength / g2PageFileLength;
g2PageFileEndCounter = (WORD) g4Local_1;
g4TransferFileChecksum = 0;
OnSaveIt();
}
else if (g2PageFileCounter < 0xffff){
++g2PageFileCounter;
if ((g4OpenFileAddress & 0x0fff) == 0x000){
gRFBM_FlashBlock = 0;
g4Local_1 = g4OpenFileAddress;
g2Local_1 = 0;
do {
if (gUpdataFileBuffer[g4Local_1] != gInputFileBuffer[g4Local_1]){
gUpdataFileBuffer[g4Local_1] = gInputFileBuffer[g4Local_1];
gRFBM_FlashBlock = 0x01;
}
++g4Local_1;
} while (++g2Local_1 < 0x1000);
}
gRFBM_FlashBlock = 0x01;
g4PageFileChecksum = 0;
g2Local_1 = 0;
do {
// 发送0x20组数据,每组0x40个字节
gLocal_Buffer[0] = 0x42;
gLocal_Buffer[1] = 0xf8;
gLocal_1 = 0;
do {
gLocal_2 = gInputFileBuffer[g4OpenFileAddress++];
gLocal_Buffer[gLocal_1 + 2] = gLocal_2;
g4PageFileChecksum += gLocal_2;
g4TransferFileChecksum += gLocal_2;
} while (++gLocal_1 < 64);
if (gRFBM_FlashBlock == 0x01){
MRFBM_WriteCommand(gLocal_Buffer);
}
g2Local_1 += 0x40;
} while (g2Local_1 < g2PageFileLength);
g4TransferFileAddress += g2PageFileLength;
if (gRFBM_FlashBlock == 0x01){
// 处理0xf9指令
if (g2PageFileCounter <= g2PageFileEndCounter){
MRFBM_Write_0xf9(g2PageFileCounter, g4TransferFileAddress, g4PageFileChecksum, 0x0000);
// 如果 > 0x4000则每隔 0x2000 增加DELAY
if ((g2PageFileCounter > 0x08) && ((g2PageFileCounter & 0x03) == 0x00)){
gLocal_1 = 0;
do {
MDELAY(64); // DELAY
} while (++gLocal_1 < 32);
}
}
}
// 如果是最后包,处理0xf9指令
if (g2PageFileCounter > g2PageFileEndCounter){
MRFBM_Write_0xf9(0xffff, g4TransferFileChecksum, g4PageFileChecksum, 0x0000);
g2PageFileCounter = 0xffff;
}
// 处理进度条
g4Local_1 = g2PageFileCounter;
g4Local_1 = g4Local_1 * g2PageFileLength;
g4Local_1 = g4Local_1 / g2TransferFilePercent;
if (g4Local_1 > 100) g4Local_1 = 100;
progress_ctrl.SetPos(g4Local_1);
TCount += g2PageFileLength;
}
else {
g2PageFileCounter = 0;
FRFBM_TransferFile = 0;
progress_ctrl.SetPos(100);
MRFBM_ChangeBank(1); // 进入运行模式
FDSPHardwareBank = 0;
}
}
return;
}
void CDebug51Dlg::OnComm(){ // 用于接收串口发来的数据,
VARIANT variant_inp;
COleSafeArray safearray_inp;
long g4Local_1;
long g4Local_2;
if (m_com.GetCommEvent() == 2){
variant_inp = m_com.GetInput();
safearray_inp = variant_inp;
g4Local_1 = safearray_inp.GetOneDimSize();
g4Local_2 = 0;
do { // 收到串口数据,只是保存在gRFBM_RX_FIFO之中,让OnTimer处理
safearray_inp.GetElement(&g4Local_2, gRFBM_RX_FIFO + g2RFBM_RX_InFIFO);
if (++g2RFBM_RX_InFIFO > cRFBM_RX_FIFO) g2RFBM_RX_InFIFO = 0;
} while (++g4Local_2 < g4Local_1);
}
return;
}
BOOL CDebug51Dlg::MRFBM_RX_Buffer(){
BYTE gLocal_1;
if (g2RFBM_RX_InFIFO != g2RFBM_RX_OutFIFO){ // FIFO不是空的,表示收到串口数据
while (1) {
gLocal_1 = gRFBM_RX_FIFO[g2RFBM_RX_OutFIFO]; // 从接收FIFO中取数
if (++g2RFBM_RX_OutFIFO > cRFBM_RX_FIFO) g2RFBM_RX_OutFIFO = 0;
//MDEBUG(gLocal_1);
//MDEBUG(gRFBM_Counter);
if (++gRFBM_Counter < 8){
if (gRFBM_Counter < 4){
if (gLocal_1 != 0xe0) gRFBM_Counter = 0; // 不为'0',重置计数器
}
else if (gRFBM_Counter < 6){
if (gLocal_1 != 0xfc) gRFBM_Counter = 0; // 不为'1',重置计数器
gRFBM_Command = 0;
}
else if (gRFBM_Counter == 6){
if (gLocal_1 == 0xfc) gRFBM_Command = 0x01; // 指令包类型选择0
}
else if (gRFBM_Counter == 7){
if (gLocal_1 == 0xfc) gRFBM_Command |= 0x02; // 指令包类型选择1
}
}
else {
if (MRFB_ReadCommand(gLocal_1)){
FRFBM_SlaveNotFound = 0;
return 1;
}
}
if (gRFBM_Counter > 64){ // 防止异常出错
gRFBM_Counter = 0;
}
if (g2RFBM_RX_InFIFO == g2RFBM_RX_OutFIFO) break; // FIFO已经清空则退出
};
}
return 0;
}
BOOL CDebug51Dlg::MRFB_ReadCommand(BYTE gLocal_1){ // 处理接收到的指令
BYTE gLocal_Bit;
gLocal_Bit = 2;
if (gLocal_1 == 0xe0){
gLocal_Bit = 0;
}
if (gLocal_1 == 0xfc){
gLocal_Bit = 1;
}
switch (gRFBM_Command){
case 0x00 :
gRFBM_Counter = 0;
break;
case 0x01 :
gRFBM_Counter = 0;
break;
case 0x02 :
if (gRFBM_Counter == 8){
FRFBM_RX_PauseMode = 0; // 运行模式
if (gLocal_Bit == 1){
FRFBM_RX_PauseMode = 1; // 暂停模式
}
}
else{
if (!FRFBM_RX_PauseMode){ // 运行模式的显示
gRFBM_Debug >>= 1;
if (gLocal_Bit == 1){
gRFBM_Debug |= 0x80;
}
if (gRFBM_Counter == 16){
MRFBM_Display();
FDSPHardwareBank = 1; // 收到运行模式的显示表示所运行的已经是运行模式
break;
}
}
else { // 暂停模式的显示
gRFBM_Debug = gLocal_1;
MRFBM_Display();
break;
}
}
return 0;
case 0x03 :
gRFBM_ChangeModeCommand = 0x80;
if (gLocal_Bit == 1){
gRFBM_ChangeModeCommand = 0x81;
}
gRFBM_Counter = 0;
break;
default : gRFBM_Counter = 0; break;
}
return 1;
}
void CDebug51Dlg::MRFBM_Display(){
gRFBM_Counter = 0;
MDEBUG(gRFBM_Debug); // 显示接受数据
gRFBM_ReceiveBuffer[g2RFBM_ReceiveCount] = gRFBM_Debug;
return;
}
BOOL CDebug51Dlg::MRFBM_Checksum(DWORD g4Local_1, DWORD g4Local_Checksum, DWORD g4Local_2){
do {
g4Local_Checksum += gInputFileBuffer[g4Local_1];
} while (++g4Local_1 < g4InputFileLength);
if (g4Local_Checksum != g4Local_2){
AfxMessageBox("文件已损坏,请重新选择文件!");
MDEBUG(0x44);
MDEBUG((BYTE)(g4Local_Checksum>>24));
MDEBUG((BYTE)(g4Local_Checksum>>16));
MDEBUG((BYTE)(g4Local_Checksum>>8));
MDEBUG((BYTE)(g4Local_Checksum));
MDEBUG((BYTE)(g4Local_2>>24));
MDEBUG((BYTE)(g4Local_2>>16));
MDEBUG((BYTE)(g4Local_2>>8));
MDEBUG((BYTE)g4Local_2);
return 0;
}
return 1;
}
void CDebug51Dlg::MRFBM_Write_0xf9(WORD g2Local_1, DWORD g4Local_1, DWORD g4Local_2, WORD g2Local_2){
BYTE gLocal_Buffer[72];
gLocal_Buffer[0] = 0x0e;
gLocal_Buffer[1] = 0xf9;
gLocal_Buffer[2] = (g2Local_1 >> 8) & 0xff; // 字节6
gLocal_Buffer[3] = g2Local_1 & 0xff; // 字节7
gLocal_Buffer[4] = (BYTE)(g4Local_1 >> 24) & 0xff;
gLocal_Buffer[5] = (BYTE)(g4Local_1 >> 16) & 0xff;
gLocal_Buffer[6] = (BYTE)(g4Local_1 >> 8) & 0xff;
gLocal_Buffer[7] = (BYTE)(g4Local_1 & 0xff);
gLocal_Buffer[8] = (BYTE)(g4Local_2 >> 24) & 0xff;
gLocal_Buffer[9] = (BYTE)(g4Local_2 >> 16) & 0xff;
gLocal_Buffer[10] = (BYTE)(g4Local_2 >> 8) & 0xff;
gLocal_Buffer[11] = (BYTE)(g4Local_2 & 0xff);
gLocal_Buffer[12] = (BYTE)(g2Local_2 >> 8) & 0xff;
gLocal_Buffer[13] = (BYTE)(g2Local_2 & 0xff);
MRFBM_WriteCommand(gLocal_Buffer);
return;
}
DWORD CDebug51Dlg::MRFBS_Byte2Dword(BYTE *gpLocal_1){
DWORD g4Local_1;
g4Local_1 = *gpLocal_1++;
g4Local_1 = (g4Local_1 << 8) | *gpLocal_1++;
g4Local_1 = (g4Local_1 << 8) | *gpLocal_1++;
g4Local_1 = (g4Local_1 << 8) | *gpLocal_1;
return g4Local_1;
}
void CDebug51Dlg::MRFBM_WriteCommand(BYTE *gpLocal_1){
BYTE gLocal_1;
BYTE gLocal_2;
BYTE gLocal_Checksum;
CByteArray hexdata;
// 0001 110x xxxx ....
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
hexdata.Add(0x80);
gLocal_Checksum = 0;
gLocal_2 = 0;
gLocal_1 = *gpLocal_1;
do {
gLocal_2 = *gpLocal_1++;
hexdata.Add(gLocal_2);
gLocal_Checksum += gLocal_2;
} while (--gLocal_1 != 0);
hexdata.Add(gLocal_Checksum);
m_com.SetOutput(COleVariant(hexdata));
this->UpdateData(false);
hexdata.RemoveAll();
return;
}
void CDebug51Dlg::MDELAY(WORD g2Local_1){
CByteArray hexdata;
do {
hexdata.Add(0xfe);
} while (--g2Local_1 != 0);
m_com.SetOutput(COleVariant(hexdata));
this->UpdateData(false);
hexdata.RemoveAll();
return;
}
void CDebug51Dlg::MRFBM_RoutineCommand(){
CByteArray hexdata;
// 0001 100
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0xfe);
m_com.SetOutput(COleVariant(hexdata));
this->UpdateData(false);
hexdata.RemoveAll();
return;
}
void CDebug51Dlg::MRFBM_ChangeBank(BOOL FLocal_1){
CByteArray hexdata;
// 0001 111x
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0x80);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
hexdata.Add(0xfe);
if (FLocal_1){
hexdata.Add(0xfe);
}
else {
hexdata.Add(0x80);
}
m_com.SetOutput(COleVariant(hexdata));
this->UpdateData(false);
hexdata.RemoveAll();
gRFBM_Change_Timer = 199;
FRFBM_ChangeBank = 1;
return;
}
void CDebug51Dlg::MDEBUG(BYTE gLocal_1){ // 用作调试
BYTE gLocal_2[4];
gLocal_2[0] = MHEX2ASC(gLocal_1 >> 4);
gLocal_2[1] = MHEX2ASC(gLocal_1);
gLocal_2[2] = ' ';
gLocal_2[3] = 0x00;
if (++g2RFBM_ReceiveCount > cRFBM_ReceiveBuffer){
OnSaveIt();
}
m_Receive += (CString)gLocal_2;
this->UpdateData(false);
// m_EditCtrl.LineScroll(m_EditCtrl.GetLineCount(),0);
return;
}
BYTE CDebug51Dlg::MHEX2ASC(BYTE gLocal_1){
gLocal_1 &= 0x0f;
if (gLocal_1 < 10) return gLocal_1 + '0';
return (gLocal_1 - 10) + 'A';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -