This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,621 @@
// CDialManageLoopTask.cpp : 实现文件
//
#include "stdafx.h"
#include "GeoMative.h"
#include "DialManageLoopTask.h"
#include "afxdialogex.h"
#include "Lock\AutoLock.h"
#include "FileOperTools.h"
// DialManageLoopTask 对话框
extern int g_iUILanguage;
extern CGeoMativeApp theApp;
extern CString Tm2LocalStr(time_t t);
extern float tcp_ntohf(float f);
extern CString Tm2GmtStr(time_t t);
extern int g_iTimeZone;
extern char* U2G(const char* utf8);
extern time_t Str2GmtTm(CString szTime);
#define MODULE_NAME "CDialManageLoopTask"
IMPLEMENT_DYNAMIC(CDialManageLoopTask, CNetRequestDialog)
CDialManageLoopTask::CDialManageLoopTask(CWnd* pParent /*=NULL*/)
: CNetRequestDialog(CDialManageLoopTask::IDD, pParent)
{
InitializeCriticalSection(&m_cs);
}
CDialManageLoopTask::~CDialManageLoopTask()
{
DeleteCriticalSection(&m_cs);
}
void CDialManageLoopTask::DoDataExchange(CDataExchange* pDX)
{
CNetRequestDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_LOOP_TASK_LIST, m_LoopTaskList);
DDX_Control(pDX, IDC_LIST_SUBTASK_LIST, m_subtaskList);
DDX_Control(pDX, IDC_EDIT_LOOP_TASK_NAME, m_editLoopTaskName);
DDX_Control(pDX, IDC_EDIT_PLC_ID, m_editPLCID);
DDX_Control(pDX, IDC_EDIT_GD10_ID, m_editGDID);
DDX_Control(pDX, IDC_EDIT_LOOP_TYPE, m_editLoopType);
DDX_Control(pDX, IDC_EDIT_LOOP_COUNT, m_editLoopCount);
DDX_Control(pDX, IDC_EDIT_TIMER_TYPE, m_editTimerType);
DDX_Control(pDX, IDC_EDIT_START_TIME, m_editStartTime);
DDX_Control(pDX, IDC_EDIT_END_TIME, m_editEndTime);
DDX_Control(pDX, IDC_EDIT_EVERYDAY_START_TIME, m_editEverydayStartTime);
DDX_Control(pDX, IDC_EDIT_TASK_INTERVAL, m_editTaskInterval);
}
BEGIN_MESSAGE_MAP(CDialManageLoopTask, CNetRequestDialog)
ON_BN_CLICKED(ID_BTN_DELETE_LOOP_TASK, &CDialManageLoopTask::OnBnClickedBtnDeleteLoopTask)
ON_BN_CLICKED(IDOK, &CDialManageLoopTask::OnBnClickedOk)
ON_NOTIFY(NM_CLICK, IDC_LIST_LOOP_TASK_LIST, &CDialManageLoopTask::OnNMClickListLoopTaskList)
//ON_MESSAGE(WM_GET_TASK_LIST_MSG, OnGetSubListMsg)
END_MESSAGE_MAP()
// CDialManageLoopTask 消息处理程序
BOOL CDialManageLoopTask::OnInitDialog()
{
CNetRequestDialog::OnInitDialog();
CRect rcList;
m_LoopTaskList.GetClientRect(&rcList);
m_LoopTaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES);
int width = rcList.right - rcList.left;
int iColIndex = (int)VAL_ZERO;
int iColumnNum = 5;
if (LANG_ZHCN == g_iUILanguage)
{
m_LoopTaskList.InsertColumn(iColIndex++, _T("任务名称"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("任务ID"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("循环类型"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("开始时间"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("结束时间"), LVCFMT_LEFT, width / iColumnNum);
SetWindowTextA(_T("定时任务管理"));
m_strLoopTaskNumTips = _T("循环任务数: ");
m_strSubloopTaskNumTips = _T("子任务数: ");
GetDlgItem(IDC_STATIC_LOOP_NAME_DIS)->SetWindowText(_T("循环任务名:"));
GetDlgItem(IDC_STATIC_GD10_ID)->SetWindowText(_T("主机ID"));
GetDlgItem(IDC_STATIC_LOOP_TYPE)->SetWindowText(_T("循环类型:"));
GetDlgItem(IDC_STATIC_LOOP_COUNT)->SetWindowText(_T("循环次数:"));
GetDlgItem(IDC_STATIC_LOOP_TIMER)->SetWindowText(_T("定时类型:"));
GetDlgItem(IDC_STATIC_LOOP_START_TIME)->SetWindowText(_T("开始时间:"));
GetDlgItem(IDC_STATIC_LOOP_END_TIME)->SetWindowText(_T("结束时间:"));
GetDlgItem(IDC_STATIC_EVERY_TIME)->SetWindowText(_T("每天开始时间:"));
GetDlgItem(IDC_STATIC_SUB_TASK_SPACE)->SetWindowText(_T("任务间隔:"));
GetDlgItem(ID_BTN_DELETE_LOOP_TASK)->SetWindowTextA(_T("删除"));
GetDlgItem(IDOK)->SetWindowTextA(_T("确定"));
}
else
{
m_strLoopTaskNumTips = _T("loop task number: ");
m_strSubloopTaskNumTips = _T("Number of subtasks: ");
m_LoopTaskList.InsertColumn(iColIndex++, _T("Task name"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("Task ID"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("Loop type"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("Start time"), LVCFMT_LEFT, width / iColumnNum);
m_LoopTaskList.InsertColumn(iColIndex++, _T("End time"), LVCFMT_LEFT, width / iColumnNum);
}
m_subtaskList.GetClientRect(&rcList);
m_subtaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES);
width = rcList.right - rcList.left;
iColIndex = (int)VAL_ZERO;
iColumnNum = 4;
if (LANG_ZHCN == g_iUILanguage)
{
m_subtaskList.InsertColumn(iColIndex++, _T("任务名称"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("任务ID"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("脚本名称"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("总点数"), LVCFMT_LEFT, width / iColumnNum);
}
else
{
m_subtaskList.InsertColumn(iColIndex++, _T("task name"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("task ID"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("script name"), LVCFMT_LEFT, width / iColumnNum);
m_subtaskList.InsertColumn(iColIndex++, _T("Total points"), LVCFMT_LEFT, width / iColumnNum);
}
GetDlgItem(IDC_STATIC_LOOP_TASK_NUMBER)->SetWindowTextA(m_strLoopTaskNumTips);
GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(m_strSubloopTaskNumTips);
//初始化循环任务列表
InitLoopTaskList();
CString strTemp;
strTemp.Format(_T("SN%u"), m_dwDeviceSN);
m_editGDID.SetWindowTextA(strTemp);
strTemp.Format(_T("PLC%u"), m_dwPLCID);
m_editPLCID.SetWindowTextA(strTemp);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CDialManageLoopTask::OnBnClickedBtnDeleteLoopTask()
{
// TODO: 在此添加控件通知处理程序代码
/*while (m_LoopTaskList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1)
{
int nItem = m_LoopTaskList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
m_LoopTaskList.DeleteItem(nItem);
}*/
CString szListStr,strLog;
char ucTaskID[MAX_NAME_LEN] = { 0 };
char chStr[200];
int iLen = 0;
POSITION pos = m_LoopTaskList.GetFirstSelectedItemPosition();
if (pos == NULL)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("请先选中需要删除的任务"));
else
MessageBoxEx(NULL, _T("Please select the task to be deleted first!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return;
}
//theApp.m_NetWorkOper.SetSuspendForThread(true);
for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++)
{
if (m_LoopTaskList.GetItemState(i, LVNI_ALL | LVNI_SELECTED) == LVIS_SELECTED)
{
szListStr = m_LoopTaskList.GetItemText(i, 1);
m_vtDelLoopTask.push_back(szListStr);
strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE));
strLog.Format(_T("[%s][%d]:delete loop task request, taskid=%s"), MODULE_NAME, __LINE__, szListStr);
CFileOperTools::GetInstance()->WriteComLog(strLog);
PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN);
}
}
// while (pos)
// {
// m_iCurItemIndex = m_LoopTaskList.GetNextSelectedItem(pos);
// szListStr.Empty();
// szListStr = m_LoopTaskList.GetItemText(m_iCurItemIndex, 1);
// strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE));
// PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN);
// }
//theApp.m_NetWorkOper.SetSuspendForThread(false);
//清除界面数据
m_subtaskList.DeleteAllItems();
SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, _T(""));
SetDlgItemText(IDC_EDIT_LOOP_TYPE, _T(""));
SetDlgItemText(IDC_EDIT_START_TIME, _T(""));
SetDlgItemText(IDC_EDIT_END_TIME, _T(""));
SetDlgItemText(IDC_EDIT_LOOP_COUNT, _T(""));
}
void CDialManageLoopTask::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CNetRequestDialog::OnOK();
}
void CDialManageLoopTask::OnNMClickListLoopTaskList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (-1 != pNMItemActivate->iItem)
{
SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 0).GetBuffer());
SetDlgItemText(IDC_EDIT_TIMER_TYPE, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 2).GetBuffer());
SetDlgItemText(IDC_EDIT_START_TIME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 3).GetBuffer());
SetDlgItemText(IDC_EDIT_END_TIME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 4).GetBuffer());
//SetDlgItemText(IDC_EDIT_LOOP_COUNT, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 5).GetBuffer());
//更新循环子任务列表
CString strLoopTaskID = m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 1);
//AfxBeginThread(GetSubTaskThread, this);
char szTaskID[MAX_NAME_LEN] = { 0 };
strcpy(szTaskID, strLoopTaskID.GetBuffer());
PostNetRequest(EN_REQ_DOWNLOAD_LOOP_SUB_TABLE, this->m_hWnd, szTaskID, sizeof(szTaskID), 4096);
CString strLog;
strLog.Format(_T("[%s][%d]: get loop task args and sub table list request,taskid=%s"), MODULE_NAME, __LINE__, szTaskID);
CFileOperTools::GetInstance()->WriteComLog(strLog);
}
*pResult = 0;
}
void CDialManageLoopTask::InitLoopTaskList()
{
///////////////////////////////////////////////////////同步任务列表////////////////////////////////////////////////
char chSendStr[210] = { 0 };
UINT32 uiDevID = m_dwDeviceSN;
time_t tm;
m_uiTotalEndTime = (int)time(&tm);
m_uiTotalEndTime += 3600 * 8;
m_uiTotalStartTime = m_uiTotalEndTime - 30 * 24 * 3600;
//按天加载
UINT32 uiStartTime,uiEndTime;
uiStartTime = m_uiTotalStartTime;
uiEndTime = m_uiTotalStartTime + NUMBER_DAYS_LOAD_LOOP_LIST*24 * 3600;
uiDevID = htonl(uiDevID);
uiStartTime = htonl(uiStartTime);
uiEndTime = htonl(uiEndTime);
memcpy(chSendStr, &uiDevID, sizeof(UINT32));
memcpy(&chSendStr[sizeof(UINT32)], &uiStartTime, sizeof(UINT32));
memcpy(&chSendStr[2 * sizeof(UINT32)], &uiEndTime, sizeof(UINT32));
PostNetRequest(EN_REQ_DOWNLOAD_LOOP_TABLE, this->m_hWnd, chSendStr, 3 * sizeof(UINT32), 1500);
}
void CDialManageLoopTask::PreNetResponse(WPARAM wParam, LPARAM lParam)
{
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
if (pResponsePacket == NULL)
{
return;
}
switch (pResponsePacket->clsPacketBase.ucCmd)
{
case EN_CANCEL_LOOP_TASK_TRUST://删除循环任务响应
{
if ((1 > pResponsePacket->wDataLen) || (EN_RECV_SUCCESS != pResponsePacket->pData[0]))
{
//theApp.m_NetWorkOper.SetSuspendForThread(false);
return;
}
else
{
CString strLog;
for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++)
{
if (m_LoopTaskList.GetItemState(i, LVNI_ALL | LVNI_SELECTED) == LVIS_SELECTED)
{
CString strTaskID = m_LoopTaskList.GetItemText(i, 1);
// if (strTaskID.CompareNoCase(m_vtDelItemIndex.at(0)) == 0)
// {
m_LoopTaskList.DeleteItem(i);
m_vtDelLoopTask.pop_back();//只用于记录删除的个数,实际弹出的taskID不用管
//}
if (m_vtDelLoopTask.size() <= 0)
{
if (g_iUILanguage == LANG_ZHCN)
AfxMessageBox(_T("取消循环任务完成"));
else
MessageBoxEx(NULL, _T("Cancel loop task finished."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
strLog.Format(_T("[%s][%d]:Loop task List delete select Item response, taskid=%s"), MODULE_NAME, __LINE__, strTaskID);
CFileOperTools::GetInstance()->WriteComLog(strLog);
break;
/*szListStr =
m_vtDelItemIndex.push_back(szListStr);
strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE));
strLog.Format(_T("[%s][%d] delete loop taskid=%s"), MODULE_NAME, __LINE__, szListStr);
CFileOperTools::GetInstance()->WriteComLog();
PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN);*/
}
}
// for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++)
// {
// m_LoopTaskList.DeleteItem(m_iCurItemIndex);
// }
//theApp.m_NetWorkOper.SetSuspendForThread(false);
//清除界面数据
m_subtaskList.DeleteAllItems();
SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, _T(""));
SetDlgItemText(IDC_EDIT_LOOP_TYPE, _T(""));
SetDlgItemText(IDC_EDIT_START_TIME, _T(""));
SetDlgItemText(IDC_EDIT_END_TIME, _T(""));
SetDlgItemText(IDC_EDIT_LOOP_COUNT, _T(""));
}
}
break;
case EN_REQ_DOWNLOAD_LOOP_SUB_TABLE:
{
GetSubLoopListResponse(wParam, lParam);
}
break;
case EN_REQ_DOWNLOAD_TASK_ARG:
{
UINT32 *uiRevData = (UINT32*)(pResponsePacket->pData);
UINT32 uiRevDataNum = ntohl(uiRevData[0]);
if ((uiRevDataNum < 1) || (pResponsePacket->wDataLen < (sizeof(UINT32) + uiRevDataNum * sizeof(STRemTaskArg))))
{
//theApp.m_NetWorkOper.SetSuspendForThread(false);
return;
}
//pThis->SendMessage(WM_GET_TASK_LIST_MSG, (WPARAM)chMsgSyn, iLen);
CString str;
/*if ((uiRevDataNum < 1) || (iLen < (sizeof(UINT32) + uiRevDataNum * sizeof(STRemTaskArg))))
{
theApp.m_NetWorkOper.SetSuspendForThread(false);
return 0;
}*/
/*if (0 == m_stLoopTaskInfo.ucContrlType)
{
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("次数循环"));
}
else
{
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("定时循环"));
}
int iStartMin = m_stLoopTaskInfo.uiStartMin - 60 * g_iTimeZone;
if (iStartMin < 0)
{
iStartMin += 24 * 60; //格林威治时间是前一天了
}
if (iStartMin > 24 * 60)
{
iStartMin -= 24 * 60; //格林威治时间是后一天了
}
str.Empty(); str.Format(_T("%2d:%2d:00"), iStartMin /60, iStartMin % 60);
m_editEverydayStartTime.SetWindowTextA(str);
str.Empty(); str.Format(_T("%2d:%2d:00"), m_stLoopTaskInfo.uiTaskSpace/60, m_stLoopTaskInfo.uiTaskSpace%60);
m_editTaskInterval.SetWindowTextA(str);
*/
STRemTaskArg * ptTaskArg = (STRemTaskArg *)((char *)pResponsePacket->pData + sizeof(UINT32));
int iIndex = (int)VAL_ZERO;
//m_subtaskList.DeleteAllItems();
int iExtNum = m_subtaskList.GetItemCount();//已存在的行数
str.Empty();
str.Format("%s%u", m_strSubloopTaskNumTips, iExtNum + uiRevDataNum);
GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(str);
for (iIndex = 0; iIndex < uiRevDataNum; iIndex++)
{
m_subtaskList.InsertItem(iIndex + iExtNum, _T(""));
m_subtaskList.SetItemText(iIndex + iExtNum, 0, U2G(ptTaskArg[iIndex].ucTDName));
m_subtaskList.SetItemText(iIndex + iExtNum, 1, ptTaskArg[iIndex].ucTaskID);
m_subtaskList.SetItemText(iIndex + iExtNum, 2, U2G(ptTaskArg[iIndex].ucSciptName));
str.Empty(); str.Format("%u", ntohl(ptTaskArg[iIndex].uiTotalNum));
m_subtaskList.SetItemText(iIndex + iExtNum, 3, str);
}
}
break;
case EN_REQ_DOWNLOAD_LOOP_TABLE:
{
GetLoopListResponse(wParam, lParam);
}
break;
default:
break;
}
}
void CDialManageLoopTask::GetSubLoopListResponse(WPARAM wParam, LPARAM lParam)
{
CString strLog;
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
if (NULL == pResponsePacket || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_SUB_TABLE)
{
strLog.Format(_T("[%s][%d]: NULL == pResponsePacket || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_SUB_TABLE"), MODULE_NAME, __LINE__);
CFileOperTools::GetInstance()->WriteComLog(strLog);
return;
}
CString strTaskID;
CStringArray szArrayID;
STLoopTaskInfo stLoopTaskInfo;
STLoopTaskInfo *pstLoopTaskInfo = &stLoopTaskInfo;
char *pcTaskID = NULL;
int uiSubTaskNum = 0;
pstLoopTaskInfo = (STLoopTaskInfo *)pResponsePacket->pData;
uiSubTaskNum = ntohl(pstLoopTaskInfo->uiSubTaskNum);
if (pResponsePacket->wDataLen < (sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID)))
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("查看循环任务信息失败,数据长度错误"));
else
MessageBoxEx(NULL, _T("Failed to view loop task information, data length error."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
strLog.Format(_T("[%s][%d]: pResponsePacket->wDataLen=%d < (sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID))=%d"), MODULE_NAME, __LINE__, strLog, pResponsePacket->wDataLen, sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID));
CFileOperTools::GetInstance()->WriteComLog(strLog);
//theApp.m_NetWorkOper.SetSuspendForThread(false);
return;
}
// char szTaskID[MAX_NAME_LEN] = { 0 };
// if (0 != memcmp(szTaskID, pstLoopTaskInfo->ucTaskID, sizeof(pstLoopTaskInfo->ucTaskID)))
// {
// AfxMessageBox(_T("Synchronization loop sub task table to failed. Receiv loop task name is error."));
// //theApp.m_NetWorkOper.SetSuspendForThread(false);
// return;
// }
//memcpy(&pThis->m_stLoopTaskInfo, &pstLoopTaskInfo, sizeof(STLoopTaskInfo));//拷贝给显示框用
//显示未显示的循环任务详细信息
CString strEverydayStartTime;
CString strTaskInterval;
CString strLoopNum;
if (0 == pstLoopTaskInfo->ucContrlType)
{
if (LANG_ZHCN == g_iUILanguage)
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("次数循环"));
else
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("Number of cycles"));
}
else
{
if (LANG_ZHCN == g_iUILanguage)
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("定时循环"));
else
m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("Timer of cycles"));
}
int iStartMin = ntohl(pstLoopTaskInfo->uiStartMin) + 60 * g_iTimeZone;
if (iStartMin < 0)
{
iStartMin += 24 * 60; //格林威治时间是前一天了
}
if (iStartMin > 24 * 60)
{
iStartMin -= 24 * 60; //格林威治时间是后一天了
}
strEverydayStartTime.Format(_T("%2d:%2d:00"), iStartMin / 60, iStartMin % 60);
m_editEverydayStartTime.SetWindowTextA(strEverydayStartTime);
strTaskInterval.Format(_T("%2d:%2d:%2d"), ntohl(pstLoopTaskInfo->uiTaskSpace) / 60 / 60 % 60, ntohl(pstLoopTaskInfo->uiTaskSpace) / 60 % 60, ntohl(pstLoopTaskInfo->uiTaskSpace) % 60);
m_editTaskInterval.SetWindowTextA(strTaskInterval);
strLoopNum.Format(_T("%d/%d"),ntohs(pstLoopTaskInfo->uiRemainLoopNum), ntohs(pstLoopTaskInfo->uiLoopNum));
m_editLoopCount.SetWindowTextA(strLoopNum);
//取子任务名字
pcTaskID = (char*)&pResponsePacket->pData[sizeof(STLoopTaskInfo)];
for (int j = 0; j < uiSubTaskNum; j++)
{
strTaskID.Empty();
char *pcTemTaskID = (char*)&pcTaskID[sizeof(char)* MAX_NAME_LEN * j];
char ucTaskId[40] = { 0 };
strncpy(ucTaskId, pcTemTaskID, sizeof(char)* MAX_NAME_LEN);
//memcpy(&strTaskID, pcTaskID, sizeof(char) * 40);
strTaskID += ucTaskId;
szArrayID.Add(strTaskID);
}
//写入数据库
strLog.Format(_T("[%s][%d]: get loop task args and sub table list response,pstLoopTaskInfo->ucContrlType=%d,strEverydayStartTime=%s,strTaskInterval=%s,strLoopNum=%s"), MODULE_NAME, __LINE__, pstLoopTaskInfo->ucContrlType, strEverydayStartTime, strTaskInterval, strLoopNum);
CFileOperTools::GetInstance()->WriteComLog(strLog);
//查询子任务信息
//int iListIndex = m_SevTdList.GetItemCount();
GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(m_strSubloopTaskNumTips);
m_subtaskList.DeleteAllItems();
UINT32 uiGetTaskNum = 5;//5个任务获取一次,减少交互
UINT32 uiSubNum = htonl(uiGetTaskNum);
UINT32 *uiRevData = NULL;
STRemTaskArg * ptTaskArg = NULL;
char chMsgSyn[2048] = { 0 };
//char szTaskID[MAX_NAME_LEN] = { 0 };
memset(chMsgSyn, 0, sizeof(chMsgSyn));
int iStartNum = 0;
for (int j = 0; j < uiSubTaskNum; j++)
{
strncpy(&chMsgSyn[4 + (j-iStartNum)*MAX_NAME_LEN], szArrayID.GetAt(j), MAX_NAME_LEN*sizeof(BYTE));
if (j != 0 && ((j + 1) % uiGetTaskNum == 0))
{
uiSubNum = uiGetTaskNum;
}
else if (j + 1 == uiSubTaskNum)
{
uiSubNum = uiSubTaskNum - iStartNum;
}
else
{
continue;
}
int iSendLen = sizeof(UINT32) + sizeof(BYTE)*MAX_NAME_LEN*uiSubNum;
uiSubNum = htonl(uiSubNum);
memcpy(chMsgSyn, &uiSubNum, sizeof(UINT32));
iStartNum = j + 1;
PostNetRequest(EN_REQ_DOWNLOAD_TASK_ARG, this->m_hWnd, chMsgSyn, iSendLen);
memset(chMsgSyn, 0, sizeof(chMsgSyn));
}
}
void CDialManageLoopTask::GetLoopListResponse(WPARAM wParam, LPARAM lParam)
{
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
if (pResponsePacket == NULL || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_TABLE)
{
return;
}
STLoopTaskTable *pstLoopTask = NULL;
STLoopTaskTable stLoopTask;
CString strTaskID;
UINT32 uiLoopTaskNum = 0;
memcpy(&uiLoopTaskNum, pResponsePacket->pData, sizeof(uiLoopTaskNum));
uiLoopTaskNum = ntohl(uiLoopTaskNum);
for (int i = 0; i < uiLoopTaskNum; i++)
{
pstLoopTask = (STLoopTaskTable*)&pResponsePacket->pData[sizeof(uiLoopTaskNum) + i*sizeof(STLoopTaskTable)];
strTaskID.Empty();
strTaskID += pstLoopTask->ucTaskID;
if (strTaskID.FindOneOf("LOOP") == -1)
{
continue;
}
memcpy(stLoopTask.ucTaskID, pstLoopTask->ucTaskID, MAX_NAME_LEN);
memcpy(stLoopTask.ucTaskName, pstLoopTask->ucTaskName, MAX_NAME_LEN);
stLoopTask.uiStartTime = ntohl(pstLoopTask->uiStartTime);
stLoopTask.uiEndTime = ntohl(pstLoopTask->uiEndTime);
stLoopTask.ucLoopType = pstLoopTask->ucLoopType;
m_mapSaveLoopList[pstLoopTask->ucTaskName] = stLoopTask;
}
char chSendStr[210] = { 0 };
UINT32 uiDevID = m_dwDeviceSN;
CTime clsStart(m_uiTotalStartTime);
CTime clsStop(m_uiTotalEndTime);
CTimeSpan timeSpan1 = clsStop - clsStart;
int iDay = timeSpan1.GetDays();
if (iDay > 1)
{
CTimeSpan ts(NUMBER_DAYS_LOAD_LOOP_LIST, 0, 0, 0); // 加5天
clsStart = clsStart + ts;
CString date = clsStart.Format("%Y-%m-%d %H:%M:%S ");
m_uiTotalStartTime = Str2GmtTm(date);
time_t uiStartTime, uiEndTime;
uiStartTime = m_uiTotalStartTime;
uiEndTime = m_uiTotalStartTime + NUMBER_DAYS_LOAD_LOOP_LIST * 24 * 3600 + 3600;//3600预留一小时,客户端与服务器偏差时间
CString strLog;
strLog.Format(_T("zm:CDialManageLoopTask::GetLoopListResponse request start time%s,end time=%s\n"), Tm2LocalStr(uiStartTime), Tm2LocalStr(uiEndTime));
CFileOperTools::GetInstance()->WriteComLog(strLog);
uiDevID = htonl(uiDevID);
uiStartTime = htonl(uiStartTime);
uiEndTime = htonl(uiEndTime);
memcpy(chSendStr, &uiDevID, sizeof(UINT32));
memcpy(&chSendStr[sizeof(UINT32)], &uiStartTime, sizeof(UINT32));
memcpy(&chSendStr[2 * sizeof(UINT32)], &uiEndTime, sizeof(UINT32));
PostNetRequest(EN_REQ_DOWNLOAD_LOOP_TABLE, this->m_hWnd, chSendStr, 3 * sizeof(UINT32), 4096);
}
else
{
//显示循环列表
ShowLoopList();
}
}
void CDialManageLoopTask::ShowLoopList()
{
int iItemCount = m_mapSaveLoopList.size();
if (iItemCount <= 0)
return;
CString strTemp;
UINT32 uiLoopTaskNum = 0;
strTemp.Format(_T("%s%d"), m_strLoopTaskNumTips, iItemCount);
GetDlgItem(IDC_STATIC_LOOP_TASK_NUMBER)->SetWindowTextA(strTemp);
std::map<CString, STLoopTaskTable>::iterator iter = m_mapSaveLoopList.begin();
for (int i = 0; iter != m_mapSaveLoopList.end(); iter++,i++)
{
m_LoopTaskList.InsertItem(i, _T(""));
m_LoopTaskList.SetItemText(i, 0, U2G(iter->second.ucTaskName));
m_LoopTaskList.SetItemText(i, 1, iter->second.ucTaskID);
if (0 == iter->second.ucLoopType)
{
if (LANG_ZHCN == g_iUILanguage)
m_LoopTaskList.SetItemText(i, 2, _T("次数循环"));
else
m_LoopTaskList.SetItemText(i, 2, _T("Number of cycles"));
}
else
{
if (LANG_ZHCN == g_iUILanguage)
m_LoopTaskList.SetItemText(i, 2, _T("定时循环"));
else
m_LoopTaskList.SetItemText(i, 2, _T("Timer of cycles"));
}
strTemp = Tm2LocalStr(iter->second.uiStartTime);
m_LoopTaskList.SetItemText(i, 3, (LPCTSTR)(_bstr_t)strTemp);
strTemp = Tm2LocalStr(iter->second.uiEndTime);
m_LoopTaskList.SetItemText(i, 4, (LPCTSTR)(_bstr_t)strTemp);
}
}