1105 lines
30 KiB
C++
1105 lines
30 KiB
C++
// CanDeviceDlg.cpp : 实现文件
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "DriverMainDlg.h"
|
||
#include "resource.h"
|
||
#include "afxdialogex.h"
|
||
#include "PluginDriver.h"
|
||
|
||
|
||
int StopFlag = 0;
|
||
unsigned long nextrow;
|
||
|
||
|
||
// CCanDeviceDlg 对话框
|
||
//控件ID只需要在当前窗口中唯一,这里随便写一个就好
|
||
#define ID_VIRTUAL_LIST_CTRL (20000)
|
||
#define TIMER_ID_ADD_TEST_DATA (2024)
|
||
IMPLEMENT_DYNAMIC(CDriverMainDlg, CDialogEx)
|
||
|
||
CDriverMainDlg::CDriverMainDlg(CWnd* pParent /*=NULL*/)
|
||
: CDialogEx(IDD_DEV_CAN_DLG, pParent)
|
||
{
|
||
m_bOpenCan = FALSE;
|
||
m_DevIndex = 0;
|
||
m_bCanRxEn = TRUE;
|
||
m_bAutoRefresh = TRUE;
|
||
m_bAutoSend2 = TRUE;
|
||
m_strSendID = "00 00 00 88";
|
||
m_strSendData = "01 02 03 04 05 06 07 08";
|
||
//m_pMainWnd = (CPluginMainDialog*) pParent;
|
||
m_StopSendFlag = 0;
|
||
m_StopSendFlag2 = 0;
|
||
m_DevType = VCI_USBCAN2;
|
||
m_nAgvAction = A_STOP;
|
||
m_nAgvReturnState= RE_A_STOP;
|
||
m_nSendCanIndex = 0;
|
||
m_nRecvCanIndex = 1;
|
||
m_pstVirtualList = new CEXVirtualListCtrl();
|
||
m_pQueue = NULL;
|
||
m_iniPath = theApp.m_strModulePath + "\\config.ini";
|
||
ReadConfigFromIni();
|
||
|
||
}
|
||
|
||
CDriverMainDlg::~CDriverMainDlg()
|
||
{
|
||
}
|
||
|
||
void CDriverMainDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialogEx::DoDataExchange(pDX);
|
||
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMETYPE_IDX0, m_nSendFrameTypeIdx0);
|
||
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMEFORMAT_IDX0, m_nSendFrameFormatIdx0);
|
||
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMETYPE_IDX1, m_nSendFrameTypeIdx1);
|
||
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMEFORMAT_IDX1, m_nSendFrameFormatIdx1);
|
||
DDX_Check(pDX, IDC_CHECK_CANRX_EN, m_bCanRxEn);
|
||
DDX_Check(pDX, IDC_AUTO_SEND, m_bAutoSend);
|
||
DDX_Check(pDX, IDC_AUTO_SEND2, m_bAutoSend2);
|
||
DDX_Check(pDX, IDC_CHECK_AUTO_REFRESH_SHOW, m_bAutoRefresh);
|
||
DDX_Control(pDX, IDC_EDIT_FMagneticOffset, m_txFMagneticOffset);
|
||
DDX_Control(pDX, IDC_EDIT_BMagneticOffset, m_txBMagneticOffset);
|
||
DDX_Control(pDX, IDC_EDIT_RFID_ID , m_txRFIDID);
|
||
//DDX_Control(pDX, IDC_LIST1, m_MessageList);
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CDriverMainDlg, CDialogEx)
|
||
ON_BN_CLICKED(IDC_CHECK_CANRX_EN, OnCheckCanrxEn)
|
||
ON_BN_CLICKED(IDC_BTN_SEND_MAN, &CDriverMainDlg::OnBnClickedBtnSendMan)
|
||
ON_BN_CLICKED(IDC_AUTO_SEND, &CDriverMainDlg::OnBnClickedAutoSend)
|
||
ON_BN_CLICKED(IDC_CHECK_AUTO_REFRESH_SHOW, &CDriverMainDlg::OnBnClickedCheckAutoRefreshShow)
|
||
ON_BN_CLICKED(IDC_BTN_SEND_MAN2, &CDriverMainDlg::OnBnClickedBtnSendMan2)
|
||
ON_BN_CLICKED(IDC_AUTO_SEND2, &CDriverMainDlg::OnBnClickedAutoSend2)
|
||
ON_BN_CLICKED(IDC_BUTTON_AGVSTOP, &CDriverMainDlg::OnBnClickedButtonAgvstop)
|
||
ON_BN_CLICKED(IDC_BUTTON_AGVESTOP, &CDriverMainDlg::OnBnClickedButtonAgvestop)
|
||
ON_BN_CLICKED(IDC_BUTTON_AGVFORWARD, &CDriverMainDlg::OnBnClickedButtonAgvforward)
|
||
ON_BN_CLICKED(IDC_BUTTON_AGVBACKWARD, &CDriverMainDlg::OnBnClickedButtonAgvbackward)
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
//一位十六进制转换为十进制
|
||
int CDriverMainDlg::HexChar(char c)
|
||
{
|
||
if ((c >= '0') && (c <= '9'))
|
||
return c - 0x30;
|
||
else if ((c >= 'A') && (c <= 'F'))
|
||
return c - 'A' + 10;
|
||
else if ((c >= 'a') && (c <= 'f'))
|
||
return c - 'a' + 10;
|
||
else
|
||
return 0x10;
|
||
}
|
||
|
||
//两位十六进制数转换为十进制
|
||
int CDriverMainDlg::Str2Hex(CString str)
|
||
{
|
||
int len = str.GetLength();
|
||
if (len == 2)
|
||
{
|
||
int a = HexChar(str[0]);
|
||
int b = HexChar(str[1]);
|
||
if (a == 16 || b == 16)
|
||
{
|
||
AfxMessageBox("Format error");
|
||
return 256;
|
||
}
|
||
else
|
||
{
|
||
return a * 16 + b;
|
||
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
AfxMessageBox("input length must be 2");
|
||
return 256;
|
||
}
|
||
}
|
||
|
||
void CDriverMainDlg::InitVirtualList()
|
||
{
|
||
//信息显示列表初始化
|
||
m_pstVirtualList->InsertColumn(0, "Seq");
|
||
m_pstVirtualList->SetColumnWidth(0, 110);
|
||
m_pstVirtualList->InsertColumn(1, "Time");
|
||
m_pstVirtualList->SetColumnWidth(1, 110);
|
||
m_pstVirtualList->InsertColumn(2, "CANIndex");
|
||
m_pstVirtualList->SetColumnWidth(2, 100);
|
||
m_pstVirtualList->InsertColumn(3, "Tx-Rx");
|
||
m_pstVirtualList->SetColumnWidth(3, 80);
|
||
m_pstVirtualList->InsertColumn(4, " ID ");
|
||
m_pstVirtualList->SetColumnWidth(4, 100);
|
||
m_pstVirtualList->InsertColumn(5, "Frame");
|
||
m_pstVirtualList->SetColumnWidth(5, 80);
|
||
m_pstVirtualList->InsertColumn(6, "Type");
|
||
m_pstVirtualList->SetColumnWidth(6, 90);
|
||
m_pstVirtualList->InsertColumn(7, "DLC");
|
||
m_pstVirtualList->SetColumnWidth(7, 60);
|
||
m_pstVirtualList->InsertColumn(8, "Data");
|
||
m_pstVirtualList->SetColumnWidth(8, 250);
|
||
}
|
||
|
||
void CDriverMainDlg::WriteVirtualList(CString strFrameId, CString strFrameData, int nTxRx, int nCanIdx, int nFrameType, int nFrameFormat)
|
||
{
|
||
//数据按行格式化
|
||
char acTemp[DATA_LINE_SIZE + 1] = { 0 };
|
||
|
||
//发送信息列表显示
|
||
CString strTime;
|
||
SYSTEMTIME systime;
|
||
GetLocalTime(&systime);
|
||
|
||
char acId[11] = { 0 };
|
||
memset(acId, 32, 10); //初始化为空格字符串
|
||
memcpy(acId, strFrameId.GetBuffer(), strFrameId.GetLength());
|
||
|
||
|
||
char acData[33] = { 0 };
|
||
memset(acData, 32, 32); //初始化为空格字符串
|
||
memcpy(acData, strFrameData.GetBuffer(), strFrameData.GetLength());
|
||
|
||
sprintf_s(acTemp, "%-10d,%02d:%02d:%02d:%03d,%-3d,%-3d,%s,%-3d,%-3d,%-3d,%s\n", m_pQueue->GetAutoSn(),
|
||
systime.wHour, systime.wMinute, systime.wSecond, systime.wMilliseconds,
|
||
nCanIdx,
|
||
nTxRx,
|
||
acId,
|
||
nFrameFormat,
|
||
nFrameType,
|
||
8,
|
||
acData);
|
||
|
||
//调用接口写入数据
|
||
m_pQueue->WriteItem(acTemp);
|
||
}
|
||
|
||
|
||
|
||
|
||
//和模块进程通讯的管道回调函数:
|
||
void g_PipeCallBack(void* pObj, int lMsgId, WPARAM wparam, LPARAM lparam)
|
||
{
|
||
CDriverMainDlg* pModule = (CDriverMainDlg*)pObj;
|
||
if (CEXPIPE_CONNECT_OK == lMsgId)
|
||
{
|
||
//连接成功
|
||
//if (FALSE == pModule->PostMessage(WM_PLATFORM_CONNECT_OK, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
|
||
LogOutToFile("已连接父进程管道");
|
||
|
||
//向WMS服务器请求设备配置信息
|
||
theApp.SendMsg2Platform("WMS", DEVICE_CONFIG_REQ);
|
||
}
|
||
else if (CEXPIPE_DIS_CLIENT == lMsgId)
|
||
{
|
||
//管道断开,结束
|
||
#ifndef _DEBUG
|
||
LogOutToFile("父进程连接管道断开,本模块自动退出");
|
||
//if (FALSE == pModule->PostMessage(WM_CLOSE, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
|
||
pModule->PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_EXIT, 0), 0);
|
||
#endif
|
||
}
|
||
else if (CEXPIPE_NEW_DATA == lMsgId)
|
||
{
|
||
pModule->ProcessPipeMsg(lMsgId, (char*)wparam, (int)lparam);
|
||
}
|
||
else
|
||
{
|
||
;
|
||
}
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::ProcessPipeMsg(int lMsgId, char* pData, int lLen)
|
||
{
|
||
if (lLen == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
PIPE_DATA_STRUCT* pstData = (PIPE_DATA_STRUCT*)pData;
|
||
|
||
//平台转发给插件的消息
|
||
if (pstData->lMsgId == MAIN_2_MODULE_WMS && pstData->lDataLen > 0)
|
||
{
|
||
Json::Reader reader;
|
||
Json::Value root;
|
||
if (reader.parse((char*)pstData->acData, root))
|
||
{
|
||
CString strReceiver = root["receiver"].asString().c_str();
|
||
CString strSender = root["sender"].asString().c_str();
|
||
int nMsgType = root["type"].asInt();
|
||
|
||
|
||
//获取设备配置信息返回
|
||
/*if (nMsgType == DEVICE_CONFIG_RET)
|
||
{
|
||
|
||
}
|
||
else if (nMsgType == SET_TRANS_MODE_REQ && m_bDeviceInit) //设置输送线的工作模式
|
||
{
|
||
|
||
}
|
||
else if (nMsgType == GET_TRANS_STATE_REQ)//请求获取输送线状态
|
||
{
|
||
|
||
}*/
|
||
|
||
}
|
||
}
|
||
else if (pstData->lMsgId == MAIN_2_MODULE_SHOWWINDOW)
|
||
{
|
||
//PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_SHOW, 0), 0);
|
||
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
|
||
SetForegroundWindow();
|
||
}
|
||
|
||
LogOutToFile("HttpServiceListener::OnRecvRequest End");
|
||
}
|
||
|
||
|
||
// CCanDeviceDlg 消息处理程序
|
||
BOOL CDriverMainDlg::OnInitDialog()
|
||
{
|
||
|
||
CString strPipe;
|
||
for (int i = 0; i < __argc; i++)
|
||
{
|
||
if (0 == strcmp(__argv[i], "-pipe") && i + 1 < __argc)
|
||
{
|
||
strPipe = __argv[i + 1];
|
||
}
|
||
}
|
||
|
||
if (strPipe.IsEmpty())
|
||
{
|
||
char acPipe[256] = "";
|
||
|
||
CString iniPath = theApp.m_strModulePath.Left(theApp.m_strModulePath.ReverseFind('\\') + 1);
|
||
//m_strModulePath = theApp.m_strModulePath.ReverseFind("\\");
|
||
iniPath = iniPath + "config.ini";
|
||
//中文名称,仅显示用
|
||
GetPrivateProfileString("AGV-MODULE", "PIPE_DRIVER", "", acPipe, 256, iniPath);
|
||
strPipe = acPipe;
|
||
}
|
||
g_pstPipeClient->RegisterCall(g_PipeCallBack, this);
|
||
g_pstPipeClient->Connect(strPipe.GetBuffer());
|
||
|
||
|
||
|
||
m_strDataDir = theApp.m_strModulePath + "\\data";
|
||
CreateDirectory(m_strDataDir.GetString(), NULL);
|
||
|
||
|
||
if (!m_pstVirtualList->Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_OWNERDATA | LVS_EX_DOUBLEBUFFER, CRect(0, 0, 0, 0), this, ID_VIRTUAL_LIST_CTRL)) {
|
||
TRACE0("Failed to create MyVirtualListCtrl\n");
|
||
delete m_pstVirtualList;
|
||
m_pstVirtualList = nullptr;
|
||
return FALSE; // 返回 FALSE 以使框架知道未成功初始化
|
||
}
|
||
|
||
InitVirtualList();
|
||
OpenCanDevice();
|
||
|
||
CRect rectList;
|
||
GetDlgItem(IDC_STATIC_LIST)->GetWindowRect(&rectList);
|
||
ScreenToClient(rectList);
|
||
m_pstVirtualList->MoveWindow(rectList.left, rectList.top, rectList.Width(), rectList.Height());
|
||
|
||
m_pQueue = new CEXMemFileQueue(m_strDataDir.GetString());
|
||
m_pstVirtualList->SetData(m_pQueue);
|
||
//m_pstVirtualList->StartAutoRefresh(10);//列表10毫秒刷新一次
|
||
|
||
CDialogEx::OnInitDialog();
|
||
|
||
if (TRUE == m_bAutoRefresh)
|
||
{
|
||
m_pstVirtualList->StartAutoRefresh(10);
|
||
}
|
||
else
|
||
{
|
||
m_pstVirtualList->StopAutoRefresh();
|
||
}
|
||
|
||
if (m_bCanRxEn)
|
||
{
|
||
StopFlag = 0;
|
||
//开启接收线程
|
||
AfxBeginThread(ReceiveCanThread, this);
|
||
}
|
||
else
|
||
StopFlag = 1;
|
||
|
||
if (m_bAutoSend2)
|
||
{
|
||
m_StopSendFlag2 = 0;
|
||
//开启发送线程
|
||
AfxBeginThread(SendCanThread2, this);
|
||
}
|
||
else
|
||
m_StopSendFlag2 = 1;
|
||
|
||
return TRUE;
|
||
|
||
|
||
}
|
||
|
||
//打开设备
|
||
BOOL CDriverMainDlg::OpenCanDevice()
|
||
{
|
||
|
||
DWORD Reserved = 0;
|
||
//打开设备
|
||
if (VCI_OpenDevice(VCI_USBCAN2, 0, Reserved) != 1)
|
||
{
|
||
//MessageBox("open failed");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Open Can Device Failed");
|
||
return FALSE;
|
||
}
|
||
VCI_INIT_CONFIG InitInfo[1];
|
||
InitInfo->Timing0 = 0x01; //250K
|
||
InitInfo->Timing1 = 0x1C;
|
||
InitInfo->Filter = 0;
|
||
InitInfo->AccCode = 0x80000000;
|
||
InitInfo->AccMask = 0xFFFFFFFF;
|
||
InitInfo->Mode = 0; //Data ;Remote;
|
||
//初始化通道0
|
||
if (VCI_InitCAN(VCI_USBCAN2, 0, 0, InitInfo) != 1) //can-0
|
||
{
|
||
//MessageBox("Init-CAN failed!");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Init-CAN-Index0 Failed!");
|
||
return FALSE;
|
||
}
|
||
Sleep(100);
|
||
//初始化通道0
|
||
if (VCI_StartCAN(VCI_USBCAN2, 0, 0) != 1) //can-0
|
||
{
|
||
//MessageBox("Start-CAN failed!");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Start-CAN-Index0 Failed!");
|
||
return FALSE;
|
||
}
|
||
//初始化通道1
|
||
//if (m_nDevType == 1)
|
||
{
|
||
if (VCI_InitCAN(VCI_USBCAN2, 0, 1, InitInfo) != 1) //can-1
|
||
{
|
||
//MessageBox("Init-CAN failed!");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Init-CAN-Index1 Failed!");
|
||
return FALSE;
|
||
}
|
||
}
|
||
Sleep(100);
|
||
|
||
InitInfo->Mode = 0; //Data ;Remote;
|
||
//初始化通道1
|
||
if (VCI_StartCAN(VCI_USBCAN2, 0, 1) != 1) //can-0
|
||
{
|
||
//MessageBox("Start-CAN failed!");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Start-CAN-Index1 Failed!");
|
||
return FALSE;
|
||
}
|
||
|
||
//MessageBox("Open successfule!\n Start CAN OK!");
|
||
UpdateCanStatue(TRUE);
|
||
//InsertLog(LOG_INFO, "Open The CAN Device Successfule!");
|
||
//KillTimer(TIMER_RECONNECT_CAN);
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
void CDriverMainDlg::UpdateCanStatue(BOOL bStatue)
|
||
{
|
||
if (TRUE == bStatue)
|
||
{
|
||
GetDlgItem(IDC_STATUS_CAN)->SetWindowText("已连接");
|
||
}
|
||
else
|
||
{
|
||
GetDlgItem(IDC_STATUS_CAN)->SetWindowText("已关闭");
|
||
}
|
||
}
|
||
|
||
void CDriverMainDlg::ReadConfigFromIni()
|
||
{
|
||
CString strIniPath = theApp.m_strModulePath + "\\config.ini";
|
||
// 初始化设备配置
|
||
m_nSendFrameFormatIdx0 = GetPrivateProfileInt("CAN", "FRAME_FORMAT_IDX0", 0, strIniPath);
|
||
m_nSendFrameTypeIdx0 = GetPrivateProfileInt("CAN", "FRAME_TYPE_IDX0", 0, strIniPath);
|
||
m_nSendFrameFormatIdx1 = GetPrivateProfileInt("CAN", "FRAME_FORMAT_IDX1", 0, strIniPath);
|
||
m_nSendFrameTypeIdx1 = GetPrivateProfileInt("CAN", "FRAME_TYPE_IDX1", 0, strIniPath);
|
||
|
||
|
||
return; // return TRUE unless you set the focus to a control
|
||
// 异常: OCX 属性页应返回 FALSE
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void CDriverMainDlg::Drive_enable() //使能
|
||
{
|
||
char can2_buff[8] = { 0 };
|
||
can2_buff[0] = 0x23;
|
||
can2_buff[1] = 0x0D;
|
||
can2_buff[2] = 0x20;
|
||
can2_buff[3] = 0x01;
|
||
can2_buff[4] = 0;
|
||
can2_buff[5] = 0;
|
||
can2_buff[6] = 0;
|
||
can2_buff[7] = 0;
|
||
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600001, can2_buff);
|
||
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600002, can2_buff);
|
||
}
|
||
void CDriverMainDlg::Drive_disable() //失能
|
||
{
|
||
char can2_buff[8] = { 0 };
|
||
can2_buff[0] = 0x23;
|
||
can2_buff[1] = 0x0C;
|
||
can2_buff[2] = 0x20;
|
||
can2_buff[3] = 0x01;
|
||
can2_buff[4] = 0;
|
||
can2_buff[5] = 0;
|
||
can2_buff[6] = 0;
|
||
can2_buff[7] = 0;
|
||
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600001, can2_buff);
|
||
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600002, can2_buff);
|
||
}
|
||
|
||
|
||
/*
|
||
param0: can设备索引
|
||
param1: can口索引
|
||
param2: standard/extend
|
||
param3: data/remote
|
||
*/
|
||
|
||
void CDriverMainDlg::SendCanData(int nDevIdx, int nCanIdx, int nFrameType, int nFrameFormat, UINT32 acFrameId, char acFrameData[8])
|
||
{
|
||
//从界面获取发送信息
|
||
VCI_CAN_OBJ sendbuf[1];
|
||
|
||
int datanum = 8;
|
||
sendbuf->ExternFlag = nFrameType;
|
||
sendbuf->DataLen = datanum;
|
||
sendbuf->RemoteFlag = nFrameFormat;
|
||
sendbuf->ID = acFrameId;
|
||
|
||
memcpy(sendbuf->Data, acFrameData, datanum);
|
||
/*for (int i = 0; i < datanum; i++)
|
||
{
|
||
sendbuf->Data[i] = acFrameData[i];
|
||
}*/
|
||
/****************************************************************************/
|
||
/******************************从界面获取发送信息完毕***********************/
|
||
/****************************************************************************/
|
||
|
||
static bool snederr_flag = false;
|
||
//调用动态链接库发送函数
|
||
int flag = VCI_Transmit(m_DevType, m_DevIndex, nCanIdx, sendbuf, 1);//CAN message send
|
||
if (flag<1)
|
||
{
|
||
//VCI_CloseDevice(m_DevType, m_DevIndex);
|
||
if (flag == -1)
|
||
{
|
||
//Can设备已断开
|
||
//MessageBox("failed- device not open\n");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Failed- Device Not Open!");
|
||
OpenCanDevice();
|
||
UpdateCanStatue(FALSE);
|
||
|
||
}
|
||
else if (flag == 0)
|
||
{
|
||
//MessageBox("send error\n");
|
||
//m_pMainWnd->InsertLog(LOG_ERROR, "Send Can Mesaage Error!");
|
||
UpdateCanStatue(FALSE);
|
||
}
|
||
|
||
if (false == snederr_flag)
|
||
{
|
||
snederr_flag = true;
|
||
UpdateCanStatue(FALSE);
|
||
}
|
||
return;
|
||
|
||
}
|
||
snederr_flag = false;
|
||
BYTE data;
|
||
CString strFrameId, strTmp, strFrameData;
|
||
strFrameId.Format("%08X", acFrameId);
|
||
|
||
for (int i = 0; i<sendbuf->DataLen; i++)
|
||
{
|
||
data = sendbuf->Data[i];
|
||
strTmp.Format("%02X", data);
|
||
strFrameData += strTmp + " ";
|
||
}
|
||
|
||
WriteVirtualList(strFrameId, strFrameData, SEND_MSG, nCanIdx, nFrameType, nFrameFormat);
|
||
|
||
}
|
||
|
||
void CDriverMainDlg::OnCheckCanrxEn()
|
||
{
|
||
UpdateData(TRUE);
|
||
if (m_bCanRxEn)
|
||
{
|
||
StopFlag = 0;
|
||
//开启接收线程
|
||
AfxBeginThread(ReceiveCanThread, this);
|
||
}
|
||
else
|
||
StopFlag = 1;
|
||
}
|
||
|
||
void CDriverMainDlg::Control_Mode_Reset()
|
||
{
|
||
m_nAgvAction = A_STOP; //控制模式切换到自动停车模式
|
||
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.LRollerF = 0; //滚筒停止
|
||
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.LRollerB = 0;
|
||
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.RRollerF = 0;
|
||
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.RRollerB = 0;
|
||
}
|
||
|
||
int Control_Mode_Switch;
|
||
UINT CDriverMainDlg::ReceiveCanThread(LPVOID v)
|
||
{
|
||
CDriverMainDlg *pThis = (CDriverMainDlg*)v;
|
||
|
||
while (1)
|
||
{
|
||
VCI_CAN_OBJ pCanObj[200];
|
||
|
||
for (int kCanIndex = 0; kCanIndex<2; kCanIndex++)
|
||
{
|
||
//调用动态链接看接收函数
|
||
int NumValue = VCI_Receive(pThis->m_DevType, pThis->m_DevIndex, kCanIndex, pCanObj, 200, 0);
|
||
if (NumValue >0)
|
||
{
|
||
//接收信息列表显示
|
||
CString strTime;
|
||
SYSTEMTIME systime;
|
||
GetLocalTime(&systime);
|
||
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour, systime.wMinute, systime.wSecond, systime.wMilliseconds);
|
||
|
||
|
||
for (int num = 0; num < NumValue; num++)
|
||
{
|
||
CString strFrameId, strFrameData, strTmp;
|
||
strFrameId.Format("%08X", pCanObj[num].ID);
|
||
|
||
for (int i = 0; i < (pCanObj[num].DataLen); i++) //数据信息
|
||
{
|
||
strTmp.Format("%02X ", pCanObj[num].Data[i]);
|
||
strFrameData += strTmp;
|
||
}
|
||
|
||
pThis->WriteVirtualList(strFrameId, strFrameData, 1, kCanIndex);
|
||
|
||
//在这里处理收到的CAN消息
|
||
|
||
//解析定位引导数据
|
||
pThis->AnalysiseCanData(kCanIndex, pCanObj[num]);
|
||
|
||
/*if (MANUAL_MODE ==pThis->m_pMainWnd->m_nAgvMode)
|
||
{
|
||
//计算运动控制参数(手动模式)
|
||
pThis->CalculateManualCanParam();
|
||
Control_Mode_Switch = 1;
|
||
}
|
||
else
|
||
{
|
||
//计算运动控制参数(自动模式),需要考虑m_nAgvAction值
|
||
if (Control_Mode_Switch)
|
||
{
|
||
pThis->Control_Mode_Reset();
|
||
Control_Mode_Switch = 0;
|
||
}
|
||
pThis->CalculateAutoCanParam();
|
||
}*/
|
||
|
||
//下发运动控制参数
|
||
//pThis->SendCanData();
|
||
|
||
}
|
||
}
|
||
else if (NumValue == -1)
|
||
{
|
||
// USB-CAN设备不存在或USB掉线,可以调用VCI_CloseDevice并重新VCI_OpenDevice。如此可以达到USB-CAN设备热插拔的效果。
|
||
pThis->UpdateCanStatue(FALSE);
|
||
pThis->OpenCanDevice();
|
||
}
|
||
|
||
}
|
||
Sleep(10);
|
||
|
||
if (StopFlag == 1)
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
|
||
//解析接收到的CAN数据
|
||
void CDriverMainDlg::AnalysiseCanData(int nCanIndex, VCI_CAN_OBJ objCan)
|
||
{
|
||
CString nEdit;
|
||
if ( 0 == nCanIndex)
|
||
{
|
||
if (objCan.ID == 0x444)
|
||
{
|
||
//电池SOC
|
||
m_stSensorData.Battery_SOC = objCan.Data[6];
|
||
}
|
||
else if (objCan.ID == 0x01) //前磁导航数据 左负右正
|
||
{
|
||
//前磁条偏移
|
||
m_stSensorData.FMagnetism_Offset = -((int16_t)(int8_t)objCan.Data[4]) * 5;
|
||
nEdit.Format(_T("%d"), m_stSensorData.FMagnetism_Offset);
|
||
m_txFMagneticOffset.SetWindowText(nEdit);
|
||
if (objCan.Data[1] == 0 && objCan.Data[2] == 0) //都没检测到 出轨
|
||
{
|
||
m_stSensorData.FMagnetism_Valid = 0;
|
||
m_stSensorData.FMagnetism_ALLTrue = 0;
|
||
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条无效");
|
||
}
|
||
else if (objCan.Data[1] == 0xFF && objCan.Data[2] == 0xFF) //都检测到 横磁条停车
|
||
{
|
||
m_stSensorData.FMagnetism_ALLTrue = 1;
|
||
m_stSensorData.FMagnetism_Valid = 1;
|
||
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条横向");
|
||
}
|
||
else
|
||
{
|
||
m_stSensorData.FMagnetism_ALLTrue = 0;
|
||
m_stSensorData.FMagnetism_Valid = 1;
|
||
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条有效");
|
||
}
|
||
}
|
||
else if (objCan.ID == 0x02) //后磁导航数据 左负右正
|
||
{
|
||
m_stSensorData.BMagnetism_Offset = ((int16_t)(int8_t)objCan.Data[4]) * 5;
|
||
nEdit.Format(_T("%d"), m_stSensorData.BMagnetism_Offset);
|
||
m_txBMagneticOffset.SetWindowText(nEdit);
|
||
if (objCan.Data[1] == 0 && objCan.Data[2] == 0) //都没检测到 出轨
|
||
{
|
||
m_stSensorData.BMagnetism_Valid = 0;
|
||
m_stSensorData.BMagnetism_ALLTrue = 0;
|
||
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条无效");
|
||
}
|
||
else if (objCan.Data[1] == 0xFF && objCan.Data[2] == 0xFF) //都检测到 横磁条停车
|
||
{
|
||
m_stSensorData.BMagnetism_ALLTrue = 1;
|
||
m_stSensorData.BMagnetism_Valid = 1;
|
||
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条横向");
|
||
}
|
||
else
|
||
{
|
||
m_stSensorData.BMagnetism_ALLTrue = 0;
|
||
m_stSensorData.BMagnetism_Valid = 1;
|
||
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条有效");
|
||
}
|
||
}
|
||
else if (objCan.ID == 0x03) //RFID
|
||
{
|
||
m_stSensorData.RFID_Point = objCan.Data[7];
|
||
nEdit.Format(_T("%d"), m_stSensorData.RFID_Point);
|
||
m_txRFIDID.SetWindowText(nEdit);
|
||
}
|
||
}
|
||
else if (1 == nCanIndex)
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::CalculateManualCanParam() //遥控器控制
|
||
{
|
||
/*static int reserve_flag = 0;
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Reserve == 0) //复用按键没有按下
|
||
{
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Forward)
|
||
m_stDrvierControl.Drive_Speed = 2000;
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Backward)
|
||
m_stDrvierControl.Drive_Speed = -2000;
|
||
else
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.LeftRotation) //左转
|
||
{
|
||
m_stDrvierControl.Diversion_Position += 4000;
|
||
if (m_stDrvierControl.Diversion_Position > m_stDrvierControl.MAN_Angle_L)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.MAN_Angle_L;
|
||
}
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.RightRotation) //右转
|
||
{
|
||
m_stDrvierControl.Diversion_Position -= 4000;
|
||
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.MIX_Angle_R)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.MIX_Angle_R;
|
||
}
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.ZeroHold) //零度角
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
}
|
||
if (reserve_flag == 1)
|
||
{
|
||
reserve_flag = 0;
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerStop();
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerStop();
|
||
}
|
||
}
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Reserve) //复用按键按下
|
||
{
|
||
reserve_flag = 1;
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Forward) //左滚筒向前
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerF();
|
||
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.LeftRotation)//左滚筒向后
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerB();
|
||
else
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerStop();
|
||
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Backward) //右滚筒向前
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerF();
|
||
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.RightRotation)//右滚筒向后
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerB();
|
||
else
|
||
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerStop();
|
||
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
}*/
|
||
}
|
||
|
||
|
||
|
||
|
||
void CDriverMainDlg::CalculateAutoCanParam()
|
||
{
|
||
switch (m_nAgvAction)
|
||
{
|
||
case A_STOP:
|
||
m_nAgvReturnState = Auto_Stop();
|
||
break;
|
||
case FORWARD:
|
||
m_nAgvReturnState = Auto_Forward(m_stDrvierControl.SPEEDPAR);
|
||
break;
|
||
case BACKWARD:
|
||
m_nAgvReturnState = Auto_Backward(m_stDrvierControl.SPEEDPAR);
|
||
break;
|
||
case E_STOP: //急停立马刹车
|
||
m_nAgvReturnState = Auto_EStop();
|
||
break;
|
||
default:
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
int CDriverMainDlg::Auto_Stop()
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_A_STOP;
|
||
}
|
||
int CDriverMainDlg::Auto_EStop()
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_E_STOP;
|
||
}
|
||
|
||
int CDriverMainDlg::Auto_Forward(float speedpar) //去载货区 进入雷达减速区通过速度系数调整速度
|
||
{
|
||
int Position_P = 4000; //转向比例
|
||
if (m_stSensorData.FMagnetism_Valid == 1) //磁条数据有效
|
||
{
|
||
m_stDrvierControl.Diversion_Position = Position_P * m_stSensorData.FMagnetism_Offset; // 计算出比例部分
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle - m_stDrvierControl.Diversion_Position;
|
||
m_stDrvierControl.Drive_Speed = 3000 * speedpar;
|
||
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.AutoMIN_Angle)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMIN_Angle;
|
||
else if(m_stDrvierControl.Diversion_Position > m_stDrvierControl.AutoMAX_Angle)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMAX_Angle;
|
||
if (m_stSensorData.FMagnetism_ALLTrue) //横向磁条停车 正常停车
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_POINT_STOP;
|
||
}
|
||
return RE_NORMAL_RUN;
|
||
}
|
||
else //磁条无效异常停车
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_UNUSUAL_STOP;
|
||
}
|
||
}
|
||
int CDriverMainDlg::Auto_Backward(float speedpar) //去卸货区
|
||
{
|
||
int Position_P = 4000;
|
||
if (m_stSensorData.BMagnetism_Valid == 1) //磁条数据有效
|
||
{
|
||
m_stDrvierControl.Diversion_Position = Position_P * m_stSensorData.BMagnetism_Offset; // 计算出比例部分
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle - m_stDrvierControl.Diversion_Position;
|
||
m_stDrvierControl.Drive_Speed = -2000 * speedpar;
|
||
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.AutoMIN_Angle)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMIN_Angle;
|
||
else if (m_stDrvierControl.Diversion_Position > m_stDrvierControl.AutoMAX_Angle)
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMAX_Angle;
|
||
if (m_stSensorData.BMagnetism_ALLTrue) //横向磁条停车 正常停车
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_POINT_STOP;
|
||
}
|
||
return RE_NORMAL_RUN;
|
||
}
|
||
else
|
||
{
|
||
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
|
||
m_stDrvierControl.Drive_Speed = 0;
|
||
return RE_UNUSUAL_STOP;
|
||
}
|
||
}
|
||
|
||
int Speed = 0;
|
||
int LastSpeed = 0;
|
||
void CDriverMainDlg::SendCanData()
|
||
{
|
||
/*
|
||
UINT32 Drive_acId = 0x6000001; //驱动帧ID
|
||
UINT32 Diversion_Id = 0x6000002; //转向帧ID
|
||
char acData[8] = { 0 };
|
||
acData[0] = 0x23;
|
||
acData[1] = 0x0D;
|
||
acData[2] = 0x20;
|
||
acData[3] = 0x01;
|
||
acData[4] = 0;
|
||
acData[5] = 0;
|
||
acData[6] = 0;
|
||
acData[7] = 0;
|
||
//发送驱动使能
|
||
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Drive_acId, acData);
|
||
Sleep(2);
|
||
//发送转向使能
|
||
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Diversion_Id, acData);
|
||
Sleep(2);
|
||
|
||
|
||
//速度控制
|
||
if (Speed < m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed > 0) //正向加速
|
||
{
|
||
Speed = Speed + 50;
|
||
if (Speed > m_stDrvierControl.Drive_Speed)
|
||
Speed = m_stDrvierControl.Drive_Speed;
|
||
}
|
||
else if (Speed > m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed < 0) //反向加速
|
||
{
|
||
Speed = Speed - 50;
|
||
if (Speed < m_stDrvierControl.Drive_Speed)
|
||
Speed = m_stDrvierControl.Drive_Speed;
|
||
}
|
||
else if (Speed > m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed > 0) //正向减速
|
||
{
|
||
Speed = Speed - 50;
|
||
if (Speed < m_stDrvierControl.Drive_Speed)
|
||
Speed = m_stDrvierControl.Drive_Speed;
|
||
}
|
||
else if (Speed < m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed < 0) //反向减速
|
||
{
|
||
Speed = Speed + 50;
|
||
if (Speed > m_stDrvierControl.Drive_Speed)
|
||
Speed = m_stDrvierControl.Drive_Speed;
|
||
}
|
||
else if (m_stDrvierControl.Drive_Speed == 0)
|
||
Speed = 0;
|
||
|
||
//行走方向显示
|
||
if (Speed > 0)
|
||
{
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = true;
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = false;
|
||
}
|
||
else if(Speed < 0)
|
||
{
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = false;
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = true;
|
||
}
|
||
else
|
||
{
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = false;
|
||
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = false;
|
||
}
|
||
|
||
//急停
|
||
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.SafeState_u.bits.AGVEstop)
|
||
Speed = 0;
|
||
|
||
TRACE("%d\n\r", Speed);
|
||
acData[0] = 0x23;
|
||
acData[1] = 0x00;
|
||
acData[2] = 0x20;
|
||
acData[3] = 0x01;
|
||
acData[4] = (uint8_t)((((uint32_t)Speed) & 0xff000000) >> 24);;
|
||
acData[5] = (uint8_t)((((uint32_t)Speed) & 0xff0000) >> 16);
|
||
acData[6] = (uint8_t)((((uint32_t)Speed) & 0xff00) >> 8);
|
||
acData[7] = (uint8_t)(((uint32_t) Speed) & 0xff);
|
||
//发送驱动速度
|
||
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Drive_acId, acData); //驱动电机
|
||
Sleep(8);
|
||
acData[0] = 0x23;
|
||
acData[1] = 0x02;
|
||
acData[2] = 0x20;
|
||
acData[3] = 0x01;
|
||
acData[4] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff000000) >> 24);;
|
||
acData[5] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff0000) >> 16);
|
||
acData[6] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff00) >> 8);
|
||
acData[7] = (uint8_t)(((uint32_t) m_stDrvierControl.Diversion_Position) & 0xff);
|
||
//发送转向位置
|
||
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Diversion_Id, acData); //转向电机
|
||
Sleep(8);
|
||
LastSpeed = Speed;*/
|
||
}
|
||
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedBtnSendMan()
|
||
{
|
||
UINT32 acId = 0x023;
|
||
char acData[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
||
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, acId, acData);
|
||
}
|
||
|
||
|
||
|
||
UINT CDriverMainDlg::SendCanThread(LPVOID v)
|
||
{
|
||
|
||
CDriverMainDlg *dlg = (CDriverMainDlg*)v;
|
||
while ( 0 == dlg->m_StopSendFlag)
|
||
{
|
||
UINT32 acId = 0x11;
|
||
char acData[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
||
dlg->SendCanData(0, 1, dlg->m_nSendFrameTypeIdx0, dlg->m_nSendFrameFormatIdx0, acId, acData);
|
||
Sleep(10);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedAutoSend()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
UpdateData(TRUE);
|
||
if (m_bAutoSend)
|
||
{
|
||
m_StopSendFlag = 0;
|
||
//开启接收线程
|
||
AfxBeginThread(SendCanThread, this);
|
||
}
|
||
else
|
||
m_StopSendFlag = 1;
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedCheckAutoRefreshShow()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
if (m_bAutoRefresh)
|
||
{
|
||
m_pstVirtualList->StartAutoRefresh(10);
|
||
}
|
||
else
|
||
{
|
||
m_pstVirtualList->StopAutoRefresh();
|
||
}
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedBtnSendMan2() //电机使能
|
||
{
|
||
UINT32 acId = 0x6000001;
|
||
char acData[8] = { 0x23, 0x0D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
||
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, acId, acData);
|
||
}
|
||
|
||
|
||
UINT CDriverMainDlg::SendCanThread2(LPVOID v)
|
||
{
|
||
/*CCanDeviceDlg *dlg = (CCanDeviceDlg*)v;
|
||
char acData[8] = { 0 };
|
||
static uint8_t Enable_time = 0;
|
||
static uint8_t Brake_time = 0;
|
||
while (0 == dlg->m_StopSendFlag2)
|
||
{
|
||
/速度不为0 打开刹车
|
||
if (dlg->m_stDrvierControl.Drive_Speed != 0)
|
||
{
|
||
dlg->m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.Brake = 1;
|
||
Brake_time = 0;
|
||
}
|
||
else
|
||
Brake_time++;
|
||
if (Brake_time > 20 || E_STOP == dlg->m_nAgvAction) //正常停车计时 || 急停立马刹车
|
||
{
|
||
Brake_time = 100;
|
||
dlg->m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.Brake = 0;
|
||
}
|
||
dlg->SendCanData();
|
||
}*/
|
||
return 0;
|
||
}
|
||
void CDriverMainDlg::OnBnClickedAutoSend2()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
|
||
UpdateData(TRUE);
|
||
if (m_bAutoSend2)
|
||
{
|
||
m_StopSendFlag2 = 0;
|
||
//开启发送线程
|
||
AfxBeginThread(SendCanThread2, this);
|
||
}
|
||
else
|
||
m_StopSendFlag2 = 1;
|
||
}
|
||
|
||
int before_trafficstop_action;
|
||
int before_safestop_action;
|
||
void CDriverMainDlg::OnBnClickedButtonAgvstop()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
m_nAgvAction = A_STOP;
|
||
before_trafficstop_action = -1;
|
||
before_safestop_action = -1;
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedButtonAgvestop()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
m_nAgvAction = E_STOP;
|
||
before_trafficstop_action = -1;
|
||
before_safestop_action = -1;
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedButtonAgvforward()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
m_nAgvAction = FORWARD;
|
||
}
|
||
|
||
|
||
void CDriverMainDlg::OnBnClickedButtonAgvbackward()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
m_nAgvAction = BACKWARD;
|
||
}
|