// DEMO_ALLDlg.cpp : implementation file // #include "stdafx.h" #include "DEMO_ALL.h" #include "DEMO_ALLDlg.h" #include "..\87CANlib\ver_110\I87KCAN.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAX_LINE 1000 ///////////////////////////////////////////////////////////////////////////// // CDEMO_ALLDlg dialog CDEMO_ALLDlg::CDEMO_ALLDlg(CWnd* pParent /*=NULL*/) : CDialog(CDEMO_ALLDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDEMO_ALLDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDEMO_ALLDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDEMO_ALLDlg) DDX_Control(pDX, IDC_RESET_CNT_BUTTON, m_MsgCntReset); DDX_Control(pDX, IDC_MSG_CNT_STATIC, m_MsgCnt); DDX_Control(pDX, IDC_MsgCtrlLIST, m_MsgListCtrl); DDX_Control(pDX, IDC_DLEN_EDIT, m_DataLen); DDX_Control(pDX, IDC_SLOT_COMBO, m_Slot); DDX_Control(pDX, IDC_SEND_BUTTON, m_Send); DDX_Control(pDX, IDC_RTR_CHECK, m_RTR); DDX_Control(pDX, IDC_PAUSE_BUTTON, m_Pause); DDX_Control(pDX, IDC_ID_EDIT, m_ID); DDX_Control(pDX, IDC_I87KCAN_Reset_BUTTON, m_Reset); DDX_Control(pDX, IDC_I87KCAN_INIT_BUTTON, m_Init); DDX_Control(pDX, IDC_HOST_LED_STATIC, m_HostLed); DDX_Control(pDX, IDC_DATA_EDIT, m_Data); DDX_Control(pDX, IDC_CLEAR_STATUS_BUTTON, m_ClearStatus); DDX_Control(pDX, IDC_CLEAR_BUTTON, m_Clear); DDX_Control(pDX, IDC_CAN_STATUS_STATIC, m_CANStatus); DDX_Control(pDX, IDC_CAN_LED_STATIC, m_CANLed); DDX_Control(pDX, IDC_BT1_EDIT, m_Bt1); DDX_Control(pDX, IDC_BT0_EDIT, m_Bt0); DDX_Control(pDX, IDC_BAUD_COMBO, m_Baud); DDX_Control(pDX, IDC_ACC_MASK_EDIT, m_AccMask); DDX_Control(pDX, IDC_ACC_CODE_EDIT, m_AccCode); DDX_Control(pDX, IDC_11bit_RADIO, m_11bit); DDX_Control(pDX, IDC_29bit_RADIO, m_29bit); DDX_Control(pDX, IDC_ACK_RADIO, m_Ack); DDX_Control(pDX, IDC_NOACK_RADIO, m_NoAck); DDX_Control(pDX, IDC_BUFFER_RADIO, m_Buffer); DDX_Control(pDX, IDC_NOBUFFER_RADIO, m_NoBuffer); DDX_Control(pDX, IDC_HEX_RADIO, m_Hex); DDX_Control(pDX, IDC_DEC_RADIO, m_Dec); DDX_Control(pDX, IDC_ASCII_RADIO, m_ASCII); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDEMO_ALLDlg, CDialog) //{{AFX_MSG_MAP(CDEMO_ALLDlg) ON_BN_CLICKED(IDC_I87KCAN_INIT_BUTTON, OnI87kcanInitButton) ON_WM_DESTROY() ON_WM_TIMER() ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnPauseButton) ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton) ON_BN_CLICKED(IDC_11bit_RADIO, On11bitRADIO) ON_BN_CLICKED(IDC_29bit_RADIO, On29bitRADIO) ON_BN_CLICKED(IDC_RTR_CHECK, OnRtrCheck) ON_CBN_SELENDOK(IDC_SLOT_COMBO, OnSelendokSlotCombo) ON_BN_CLICKED(IDC_CLEAR_BUTTON, OnClearButton) ON_BN_CLICKED(IDC_HEX_RADIO, OnHexRadio) ON_BN_CLICKED(IDC_DEC_RADIO, OnDecRadio) ON_BN_CLICKED(IDC_ASCII_RADIO, OnAsciiRadio) ON_BN_CLICKED(IDC_RESET_CNT_BUTTON, OnResetCntButton) ON_BN_CLICKED(IDC_CLEAR_STATUS_BUTTON, OnClearStatusButton) ON_BN_CLICKED(IDC_I87KCAN_Reset_BUTTON, OnI87KCANResetBUTTON) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDEMO_ALLDlg message handlers #define Comport 1 HBITMAP hRedLed,hGreenLed; WORD OldSlotSelect,PortEnable,TimerEnable,MsgFormat; BYTE OldCANReg=0,OldOverflogFlag; WORD LineCnt; DWORD RxMsgCnt; CString CntStr; BOOL CDEMO_ALLDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog //SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CenterWindow(GetDesktopWindow()); // center to the hpc screen // TODO: Add extra initialization here hGreenLed=m_CANLed.GetBitmap(); hRedLed=m_HostLed.GetBitmap(); //initial button FormInit(); //parameter initialize m_Slot.SetCurSel(0); OldSlotSelect=0; m_Ack.SetCheck(BST_CHECKED); m_Buffer.SetCheck(BST_CHECKED); m_11bit.SetCheck(BST_CHECKED); m_Hex.SetCheck(BST_CHECKED); MsgFormat=0; m_Baud.SetCurSel(11); m_AccCode.LimitText(8); m_AccCode.SetWindowText(_T("00000000")); m_AccMask.LimitText(8); m_AccMask.SetWindowText(_T("FFFFFFFF")); m_Bt0.LimitText(2); m_Bt0.SetWindowText(_T("FF")); m_Bt1.LimitText(2); m_Bt1.SetWindowText(_T("FF")); m_DataLen.LimitText(1); m_DataLen.SetWindowText(_T("8")); m_Data.LimitText(23); m_Data.SetWindowText(_T("FF FF FF FF FF FF FF FF")); m_ID.LimitText(3); m_ID.SetWindowText(_T("3FF")); m_11bit.SetCheck(TRUE); m_Buffer.SetCheck(TRUE); m_Ack.SetCheck(TRUE); m_CANStatus.SetWindowText(_T("****")); SetDlgItemText(IDC_MSG_CNT_STATIC,_T("**********")); //initiate list control object m_MsgListCtrl.InsertColumn(0,_T("NO."),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(1,_T("Mode"),LVCFMT_CENTER,42); m_MsgListCtrl.InsertColumn(2,_T("ID"),LVCFMT_CENTER,70); m_MsgListCtrl.InsertColumn(3,_T("RTR"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(4,_T("L"),LVCFMT_CENTER,18); m_MsgListCtrl.InsertColumn(5,_T("D0"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(6,_T("D1"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(7,_T("D2"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(8,_T("D3"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(9,_T("D4"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(10,_T("D5"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(11,_T("D6"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(12,_T("D7"),LVCFMT_CENTER,34); m_MsgListCtrl.InsertColumn(13,_T("Time"),LVCFMT_CENTER,48); return TRUE; // return TRUE unless you set the focus to a control } void CDEMO_ALLDlg::OnI87kcanInitButton() { wchar_t wTempStr[100],*endptr; BYTE TempBt0=0,TempBt1=0; WORD Ret; CString TempStr; DWORD BaudMap[]={5000UL,10000UL,20000UL,25000UL,50000UL,100000UL,125000UL, 20000UL,250000UL,500000UL,800000UL,1000000UL}; DWORD TempAcc,TempAmc; //Check COM 1 status and open COM 1 if (Get_Com_Status(Comport) || PortEnable){ Ret=Close_Com(Comport); if (Ret) return; if (TimerEnable) KillTimer(12345); TimerEnable=0; PortEnable=0; } Ret=Open_Com(Comport,115200UL,8,0,1); if (Ret){ FormInit(); wsprintf(wTempStr,_T("Open Com1 Error, Error Code=%d"),Ret); MessageBox(wTempStr,_T("Error"),MB_OK); return; } PortEnable=1; //Select the slot where the I-87KCAN is plugged. ChangeSlotTo87K(m_Slot.GetCurSel()+1); //configue the I-87KCAN setting and initiate the I-87KCAN m_AccCode.GetWindowText(wTempStr,16); TempAcc=_tcstoul(wTempStr,&endptr,16); m_AccMask.GetWindowText(wTempStr,16); TempAmc=_tcstoul(wTempStr,&endptr,16); if (m_Baud.GetCurSel()==12){ m_Bt0.GetWindowText(wTempStr,4); TempBt0=(BYTE)(_tcstoul(wTempStr,&endptr,16)&0xff); m_Bt0.GetWindowText(wTempStr,4); TempBt1=(BYTE)(_tcstoul(wTempStr,&endptr,16)); } if (m_Ack.GetCheck()==TRUE){ if (m_Buffer.GetCheck()==TRUE){ Ret=I87KCANInit(BaudMap[m_Baud.GetCurSel()],TempBt0,TempBt1,TempAcc,TempAmc,0,0); } else{ Ret=I87KCANInit(BaudMap[m_Baud.GetCurSel()],TempBt0,TempBt1,TempAcc,TempAmc,0,1); } } else{ if (m_Buffer.GetCheck()==TRUE){ Ret=I87KCANInit(BaudMap[m_Baud.GetCurSel()],TempBt0,TempBt1,TempAcc,TempAmc,1,0); } else{ Ret=I87KCANInit(BaudMap[m_Baud.GetCurSel()],TempBt0,TempBt1,TempAcc,TempAmc,1,1); } } if (Ret){ FormInit(); wsprintf(wTempStr,_T("Initiate I-87KCAN Error, Error Code=%d"),Ret); MessageBox(wTempStr,_T("Error"),MB_OK); return; } //start the objects and parameters used in the dialog m_CANLed.SetBitmap(hGreenLed); m_CANLed.RedrawWindow(NULL,NULL,0); m_HostLed.SetBitmap(hGreenLed); m_HostLed.RedrawWindow(NULL,NULL,0); m_ClearStatus.EnableWindow(TRUE); m_Reset.EnableWindow(TRUE); m_11bit.EnableWindow(TRUE); m_29bit.EnableWindow(TRUE); m_ID.EnableWindow(TRUE); m_RTR.EnableWindow(TRUE); m_DataLen.EnableWindow(TRUE); m_Data.EnableWindow(TRUE); m_Send.EnableWindow(TRUE); m_Pause.EnableWindow(TRUE); m_CANStatus.SetWindowText(_T("0x0C")); m_MsgCnt.SetWindowText(_T("0000000000")); m_MsgCntReset.EnableWindow(TRUE); if (!TimerEnable) SetTimer(12345,1,NULL); TimerEnable=1; } void CDEMO_ALLDlg::OnDestroy() { CDialog::OnDestroy(); //recover the timer setting and COM 1 setting if (TimerEnable) KillTimer(12345); if (PortEnable) Close_Com(Comport); } void CDEMO_ALLDlg::OnTimer(UINT nIDEvent) { BYTE TempCANReg,TempOverflogFlag,Mode,RTR,DataLen,Data[8]; wchar_t wTempStr[200]; WORD Ret; DWORD ID; //Get I-87KCAN status from I-87KCAN module Ret=GetStatus(&TempCANReg,&TempOverflogFlag); if (Ret){ FormInit(); wsprintf(wTempStr,_T("Get Status Error, Error Code=%d"),Ret); MessageBox(wTempStr,_T("Error"),MB_OK); return; } if (TempCANReg!=OldCANReg){ wsprintf(wTempStr,_T("0x%02X"),TempCANReg); m_CANStatus.SetWindowText(wTempStr); OldCANReg=TempCANReg; } //Show the I-87KCAN status if (TempOverflogFlag!=OldOverflogFlag){ if (TempOverflogFlag&0x1){ m_CANLed.SetBitmap(hRedLed); } else{ m_CANLed.SetBitmap(hGreenLed); } if (TempOverflogFlag&0x2){ m_HostLed.SetBitmap(hRedLed); } else{ m_HostLed.SetBitmap(hGreenLed); } OldOverflogFlag=TempOverflogFlag; } //Get CAN message from I-87KCAN Ret=GetCANMsg(&Mode,&ID,&RTR,&DataLen,Data); if (Ret){ if (Ret==CAN87K_FIFO_EMPTY) return; FormInit(); wsprintf(wTempStr,_T("Get Message Error, Error Code=%d"),Ret); MessageBox(wTempStr,_T("Error"),MB_OK); return; } //Show the receive CAN message information in the list control object if (RTR){ CString strText; strText.Format(_T("%03d"),LineCnt); m_MsgListCtrl.InsertItem(LineCnt,strText); m_MsgListCtrl.SetItemText(LineCnt,1,Mode?_T("2.0B"):_T("2.0A")); strText.Format(_T("%lX"),ID); m_MsgListCtrl.SetItemText(LineCnt,2, strText); m_MsgListCtrl.SetItemText(LineCnt,3, RTR?_T("Y"):_T("N")); strText.Format(_T("%d"),DataLen); m_MsgListCtrl.SetItemText(LineCnt,4, strText); } else{ CString strText; strText.Format(_T("%03d"),LineCnt); m_MsgListCtrl.InsertItem(LineCnt,strText); m_MsgListCtrl.SetItemText(LineCnt,1,Mode?_T("2.0B"):_T("2.0A")); strText.Format(_T("%lX"),ID); m_MsgListCtrl.SetItemText(LineCnt,2,strText); m_MsgListCtrl.SetItemText(LineCnt,3,RTR?_T("Y"):_T("N")); strText.Format(_T("%d"),DataLen); m_MsgListCtrl.SetItemText(LineCnt,4,strText); for (int i=0;i5){ CSize Rolling; Rolling.cx=0; Rolling.cy=30*(LineCnt-5); m_MsgListCtrl.Scroll(Rolling); } if (LineCnt==MAX_LINE){ m_MsgListCtrl.DeleteAllItems( ); LineCnt=0; } //Show the CAN message counter RxMsgCnt++; CntStr.Format(_T("%010ld"),RxMsgCnt); SetDlgItemText(IDC_MSG_CNT_STATIC,CntStr); CDialog::OnTimer(nIDEvent); } void CDEMO_ALLDlg::FormInit(void) { WORD Ret; //Initiate all objects and parameters used in the dialog m_CANLed.SetBitmap(NULL); m_HostLed.SetBitmap(NULL); m_ClearStatus.EnableWindow(FALSE); m_Reset.EnableWindow(FALSE); m_11bit.EnableWindow(FALSE); m_29bit.EnableWindow(FALSE); m_ID.EnableWindow(FALSE); m_RTR.EnableWindow(FALSE); m_DataLen.EnableWindow(FALSE); m_Data.EnableWindow(FALSE); m_Send.EnableWindow(FALSE); m_Pause.EnableWindow(FALSE); m_CANStatus.SetWindowText(_T("****")); m_MsgCnt.SetWindowText(_T("**********")); m_MsgCntReset.EnableWindow(FALSE); if (TimerEnable) KillTimer(12345); TimerEnable=0; RxMsgCnt=0UL; LineCnt=0; Ret=Close_Com(Comport); if (Ret) return; PortEnable=0; } void CDEMO_ALLDlg::OnPauseButton() { //Let the tiemr stop or continue if (TimerEnable){ m_Pause.SetWindowText(_T("Go")); KillTimer(12345); TimerEnable=0; } else{ m_Pause.SetWindowText(_T("Pause")); SetTimer(12345,1,NULL); TimerEnable=1; } } void CDEMO_ALLDlg::OnSendButton() { wchar_t wTempStr[100],*wendptr; char TempStr[100],*ptr1,*ptr2,*endptr; BYTE Mode,RTR,DataLen,Data[8]; WORD i,Ret; DWORD ID; //configue the transmit CAN message m_ID.GetWindowText(wTempStr,16); ID=_tcstoul(wTempStr,&wendptr,16); if (m_11bit.GetCheck()){ Mode=0; } else{ Mode=1; } if (m_RTR.GetCheck()){ RTR=1; } else{ RTR=0; } m_DataLen.GetWindowText(wTempStr,2); DataLen=(BYTE)(_tcstoul(wTempStr,&wendptr,10)&0xff); if (DataLen>8) DataLen=8; m_Data.GetWindowText(wTempStr,46); wcstombs(TempStr,wTempStr,46); sprintf(TempStr,"%s ",TempStr); i=0; ptr1=TempStr; ptr2=strchr(TempStr,' '); while(ptr2){ *ptr2=0; if (i>7) break; Data[i]=(BYTE)(strtoul(ptr1, &endptr,16)&0xff); i++; ptr1=ptr2+1; ptr2=strchr(ptr1,' '); } while(i