📄 selectbattdlg.cpp
字号:
ASSERT(pCalSpeed_ArgCmdToCom);
ZeroMemory(pCalSpeed_ArgCmdToCom, sizeof(CalSpeed_ArgCmdToCom));
//==1.向MCU发送命令部分===
pCalSpeed_ArgCmdToCom->szCmdBuff[0] = 0x55;
pCalSpeed_ArgCmdToCom->szCmdBuff[1] = 0x55;
pCalSpeed_ArgCmdToCom->szCmdBuff[2] = 0x55;
pCalSpeed_ArgCmdToCom->szCmdBuff[3] = 0x55;
pCalSpeed_ArgCmdToCom->szCmdBuff[10] = 0x08;
//转换成SOC内的字节顺序
::memcpy(&pCalSpeed_ArgCmdToCom->szCmdBuff[4], &nActualSize, sizeof(int)*1);
::SwapByte(&pCalSpeed_ArgCmdToCom->szCmdBuff[5], &pCalSpeed_ArgCmdToCom->szCmdBuff[6]);
::SwapByte(&pCalSpeed_ArgCmdToCom->szCmdBuff[4], &pCalSpeed_ArgCmdToCom->szCmdBuff[7]);
pCalSpeed_ArgCmdToCom->nActualLen = 12;
}
/////////////////////////////////////////////////////////////////////////////////////
static BOOL g_bReading = FALSE;
static BOOL g_bImmdShowTip = FALSE;
/////////////////////////////////////////////////////////////////////////////////////
//以下三个变量专为停止通信线程使用
static BOOL g_bStopThread = FALSE;
static BOOL g_bExitStopThread = FALSE;
static CCriticalSection g_sStopSyncObj;
/////////////////////////////////////////////////////////////////////////////////////
//因为使用了安全线程对象,所以必须用线程
UINT _fpStopThread(LPVOID pData)
{
CSelectBattDlg *pThis = (CSelectBattDlg *)pData;
if (pThis == NULL)
return 1;
g_bReading = !g_bReading;
pThis->m_btnConn.SetWindowText(g_bReading?"『停止读取』":"『连接读取』");
if (!g_bReading)
{
g_objCalSerialComm.StopComm(TRUE);
pThis->m_btnClose.EnableWindow(TRUE);
}
return 1;
}
UINT _fpStartThread(LPVOID pData)
{
CalSpeed_ArgCmdToCom *pArgObj = (CalSpeed_ArgCmdToCom *)pData;
g_objCalSerialComm.SendUiCmd(pArgObj);
return 1;
}
#define _HOPEBYTES 40
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
void CSelectBattDlg::OnConn()
{
//1.得到本次采集的总数据
int nHopeReadBytes = 0;
////////////////////////////////////////////////////////////////////////////////////////
//
g_bReading = !g_bReading;
m_btnConn.SetWindowText(g_bReading?"『停止读取』":"『连接读取』");
if (!g_bReading)
{
g_objCalSerialComm.InitArv();
g_objCalSerialComm.StopComm(TRUE);
m_btnClose.EnableWindow(TRUE);
return;
}
//2.查询文件是否存在?
CFileFind sFileFind;
TRACE1("文件=%s.\n", g_pstrPath);
if (sFileFind.FindFile((LPCTSTR)g_pstrPath) )
{
::AfxMessageBox("该电池型号的数据文件已存在,请重新输入!");
return ;
}
////////////////////////////////////////////////////////////////////////////////////////////
//3.确认后开始
m_btnClose.EnableWindow(FALSE);
if (::MessageBox(this->GetSafeHwnd(), _T("确定开始读取数据"), _T("读取采集器数据"),
MB_ICONEXCLAMATION|MB_YESNO) == IDNO)
{
g_bReading = FALSE;
m_btnConn.SetWindowText("『连接读取』");
m_btnClose.EnableWindow(TRUE);
return;
}
if (g_strBattPath.GetLength() <= 1)
{
g_bReading = FALSE;
m_btnConn.SetWindowText("『连接读取』");
m_btnClose.EnableWindow(TRUE);
return ;
}
///////////////////////////////////////////////////////////////////////////////////////////
//4.期望读取数据
int nExpectReadTime = this->GetRdTime(); //期望读取秒
g_sGlobalArgInfo.fTotalTime = nExpectReadTime/1.0;
if (nExpectReadTime <= 0)
{
g_bReading = FALSE;
m_btnConn.SetWindowText("『连接读取』");
m_btnClose.EnableWindow(TRUE);
return ;
}
//5.启动线程开始通信
g_objCalSerialComm.InitArv();
g_objCalSerialComm.InitThread();
g_objCalSerialComm.StartComm();
////////////////////////////////////////////////////////////////////////////////////////////
//6.启动通讯
g_sDataStream.InitFile(g_pstrPath/*文件名*/);//存储文件名
CalSpeed_ArgCmdToCom sArgObj;
nHopeReadBytes = nExpectReadTime*_HOPEBYTES/*Ksps*/; //计算出期望读取的字节数(KBytes)
::TsfSendData(&sArgObj, nHopeReadBytes); //读取 X 512 bytes
g_objCalSerialComm.SendUiCmd(&sArgObj);
}
void CSelectBattDlg::OnClose()
{
g_objCalSerialComm.InitArv();
g_objCalSerialComm.AcceptConsumer(NULL); //取消通知界面
g_objCalSerialComm.ClosePort();
//关闭文件
g_sDataStream.Cleanup();
//退出界面
this->EndDialog(1);
}
void CSelectBattDlg::NotifyData (void *pData/*首地址*/, ULONG nSize/*大小*/)
{
CDataReaderImpl::NotifyData(pData, nSize);
}
//
HRESULT CSelectBattDlg::OnRecvMsg(WPARAM wParam, LPARAM lParam)
{
int nCmdId = *(int *)wParam;
switch (nCmdId)
{
case 0x01: //退出通信
{
::AfxBeginThread(_fpStopThread, this, /*THREAD_PRIORITY_ABOVE_NORMAL*/THREAD_PRIORITY_HIGHEST);
}
break;
case 0x02: //显示接收数据
{
float fVal= (*(float *)lParam)/1.0;
this->SetRdTime(fVal);
}
break;
}
return -1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//清空闪存
UINT _fpEraseFlashThread(LPVOID pData)
{
LPCalSpeed_ArgCmdToCom pArgObj = (LPCalSpeed_ArgCmdToCom)pData;
//准备擦存
::EraseFlashBytes(pArgObj);
g_objCalSerialComm.SendUiCmd(pArgObj);
return 1;
}
static CalSpeed_ArgCmdToCom g_sEmptyFlashArgObj;
void CSelectBattDlg::OnEmptyFlash()
{
if (::MessageBox(NULL, "确认清除采集器数据吗?", "操作警告", MB_ICONINFORMATION|MB_YESNO)== IDNO)
return ;
m_btnEmpty.SetWindowText("【正在清空】");
m_btnEmpty.EnableWindow(FALSE);
m_btnConn.EnableWindow(FALSE);
this->SetTimer(1, 1000*20, NULL);
::AfxBeginThread(_fpEraseFlashThread, &g_sEmptyFlashArgObj);
}
void CSelectBattDlg::OnTimer(UINT nIDEvent)
{
m_btnEmpty.EnableWindow(TRUE);
m_btnConn.EnableWindow(TRUE);
m_btnEmpty.SetWindowText("【清空闪存】");
this->KillTimer(1);
//
CDialog::OnTimer(nIDEvent);
}
#define BIF_USENEWUI 0x0050
#define BIF_EDITBO 0x080
void CSelectBattDlg::OnChgPath()
{
#ifdef _USEFILEDIALOG
char pstrPath[APPPATHLEN];
::pltCurrentPath(pstrPath, APPPATHLEN);
static CFileDialog dlg(TRUE, NULL, NULL,
OFN_HIDEREADONLY|BIF_RETURNONLYFSDIRS, _T("All Files (*.*)|*.*||"), this);
// Set the directory where the file open dialog will start from.
dlg.m_ofn.lpstrInitialDir = (LPCTSTR)pstrPath;
// Set the title for the file open dialog.
dlg.m_ofn.lpstrTitle = _T("电池数据存放目录");
dlg.DoModal();
CString strFile = dlg.GetPathName();
#else
CString strFile, m_Path;
BROWSEINFO bi;
char name[MAX_PATH];
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = name;
bi.lpszTitle =_T("电池数据存放目录");
bi.ulFlags = BIF_USENEWUI;
LPITEMIDLIST pidl=SHBrowseForFolder(&bi);
if(pidl == NULL)
return;
SHGetPathFromIDList(pidl, strFile.GetBuffer(MAX_PATH));
#if 1
//获得分配算符
IMalloc* pMalloc = NULL;
HRESULT hr = SHGetMalloc(&pMalloc);
if(FAILED(hr))
{
;
}
//释放pidl
pMalloc->Free((void*)pidl);
pidl = NULL;
//清除分配符
pMalloc->Release();
pMalloc = NULL;
#endif
strFile.ReleaseBuffer();
m_Path=strFile;
if(strFile.GetAt(strFile.GetLength()-1)!='\\')
m_Path+="\\";
#endif
TRACE1("sd = %s.\n", m_Path);
if (m_Path.GetLength() <= 0)
return ;
int nIndex = m_Path.ReverseFind('\\');
g_strBattPath = m_Path.Left(nIndex); //当前路径
if (g_strBattPath.GetLength() >= 0)
{
::AfxGetApp()->WriteProfileString("数据目录", "默认路径", g_strBattPath);
this->OnChangeBatttype();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -