// BEQDemoDlg.cpp : ʵÏÖÎļþ // #include "stdafx.h" #include "BEQDemo.h" #include "BEQDemoDlg.h" #include "afxdialogex.h" #include #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif // ÓÃÓÚÓ¦ÓóÌÐò¡°¹ØÓÚ¡±²Ëµ¥ÏîµÄ CAboutDlg ¶Ô»°¿ò class CAboutDlg : public CDialogEx { public: CAboutDlg(); // ¶Ô»°¿òÊý¾Ý #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö // ʵÏÖ protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CBEQDemoDlg ¶Ô»°¿ò CBEQDemoDlg::CBEQDemoDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_BEQDEMO_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CBEQDemoDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_LOG, m_editLog); DDX_Control(pDX, IDC_STATIC_DOOR1, m_staticDoor1); DDX_Control(pDX, IDC_STATIC_DOOR2, m_staticDoor2); DDX_Control(pDX, IDC_STATIC_DOOR3, m_staticDoor3); DDX_Control(pDX, IDC_STATIC_DOOR4, m_staticDoor4); DDX_Control(pDX, IDC_STATIC_DOOR5, m_staticDoor5); } BEGIN_MESSAGE_MAP(CBEQDemoDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_TEST1, &CBEQDemoDlg::OnBnClickedButtonTest1) ON_BN_CLICKED(IDC_BUTTON_TEST2, &CBEQDemoDlg::OnBnClickedButtonTest2) ON_BN_CLICKED(IDC_BUTTON_TEST3, &CBEQDemoDlg::OnBnClickedButtonTest3) ON_BN_CLICKED(IDC_BUTTON_SET_STATE, &CBEQDemoDlg::OnBnClickedButtonSetState) ON_BN_CLICKED(IDC_BUTTON_SET_STATE2, &CBEQDemoDlg::OnBnClickedButtonSetState2) ON_BN_CLICKED(IDC_BUTTON_SERVO_TEST1, &CBEQDemoDlg::OnBnClickedButtonServoTest1) ON_BN_CLICKED(IDC_BUTTON_SERVO_TEST2, &CBEQDemoDlg::OnBnClickedButtonServoTest2) ON_BN_CLICKED(IDC_BUTTON_SERVO_TEST3, &CBEQDemoDlg::OnBnClickedButtonServoTest3) END_MESSAGE_MAP() // CBEQDemoDlg ÏûÏ¢´¦Àí³ÌÐò BOOL CBEQDemoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // ½«¡°¹ØÓÚ...¡±²Ëµ¥ÏîÌí¼Óµ½ÏµÍ³²Ëµ¥ÖС£ // IDM_ABOUTBOX ±ØÐëÔÚϵͳÃüÁΧÄÚ¡£ ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // ÉèÖô˶Ի°¿òµÄͼ±ê¡£ µ±Ó¦ÓóÌÐòÖ÷´°¿Ú²»ÊǶԻ°¿òʱ£¬¿ò¼Ü½«×Ô¶¯ // Ö´Ðд˲Ù×÷ SetIcon(m_hIcon, TRUE); // ÉèÖôóͼ±ê SetIcon(m_hIcon, FALSE); // ÉèÖÃСͼ±ê // TODO: ÔÚ´ËÌí¼Ó¶îÍâµÄ³õʼ»¯´úÂë return TRUE; // ³ý·Ç½«½¹µãÉèÖõ½¿Ø¼þ£¬·ñÔò·µ»Ø TRUE } void CBEQDemoDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // Èç¹ûÏò¶Ô»°¿òÌí¼Ó×îС»¯°´Å¥£¬ÔòÐèÒªÏÂÃæµÄ´úÂë // À´»æÖƸÃͼ±ê¡£ ¶ÔÓÚʹÓÃÎĵµ/ÊÓͼģÐ굀 MFC Ó¦ÓóÌÐò£¬ // Õ⽫ÓÉ¿ò¼Ü×Ô¶¯Íê³É¡£ void CBEQDemoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ÓÃÓÚ»æÖƵÄÉ豸ÉÏÏÂÎÄ SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // ʹͼ±êÔÚ¹¤×÷Çø¾ØÐÎÖоÓÖÐ int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // »æÖÆÍ¼±ê dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //µ±Óû§Í϶¯×îС»¯´°¿Úʱϵͳµ÷Óô˺¯ÊýÈ¡µÃ¹â±ê //ÏÔʾ¡£ HCURSOR CBEQDemoDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CBEQDemoDlg::OnBnClickedButtonTest1() { BEQ::IEquipment* pEuqipment = nullptr; BEQ_CreateEquipment(pEuqipment, "BEQ001"); } void CBEQDemoDlg::OnBnClickedButtonTest2() { BEQ::IEquipment* pEuqipment = nullptr; BEQ_GetEquipment(pEuqipment, "BEQ001"); if (pEuqipment != nullptr) { pEuqipment->setVersion("1.0.2"); BEQ::IUnit* pUnit1 = pEuqipment->addUnit("U1", 5); pEuqipment->runOnServerMode(8080); char szName[256]; pUnit1->getName(szName, 256); AfxMessageBox(szName); pUnit1->setState(BEQ::EQ_STATE::IDLE); } } void CBEQDemoDlg::OnBnClickedButtonTest3() { BEQ::IEquipment* pEuqipment = nullptr; BEQ_GetEquipment(pEuqipment, "Test1"); if (pEuqipment != nullptr) { BEQ_DestroyEquipment(pEuqipment); } } void CBEQDemoDlg::OnBnClickedButtonSetState() { BEQ::IUnit* pUnit = nullptr; BEQ::IEquipment* pEuqipment = nullptr; BEQ_GetEquipment(pEuqipment, "BEQ001"); if (pEuqipment != nullptr) { pUnit = pEuqipment->getUnit("U1"); } if (pUnit != nullptr) { // pUnit->setState(BEQ::EQ_STATE::E_TIME); // pUnit->setDoorState(BEQ::DOOR_STATE::CLOSE); pUnit->setAlarm(0, 0, ""); } } void CBEQDemoDlg::OnBnClickedButtonSetState2() { BEQ::IUnit* pUnit = nullptr; BEQ::IEquipment* pEuqipment = nullptr; BEQ_GetEquipment(pEuqipment, "BEQ001"); if (pEuqipment != nullptr) { pUnit = pEuqipment->getUnit("U1"); } if (pUnit != nullptr) { // pUnit->setState(BEQ::EQ_STATE::RUN); // pUnit->setDoorState(BEQ::DOOR_STATE::OPEN); // pUnit->setAlarm(206, 1, "Aµ¥Ôª-ÉÏÇ»ÌåZÖá1Òì³£"); /* static int i = 0; i++; if (i % 6 == 1) { pUnit->stepIdle(); } if (i % 6 == 2) { pUnit->stepMaterialReceived("A12345"); } if (i % 6 == 3) { pUnit->stepProcessingStarted("A12345"); } if (i % 6 == 4) { pUnit->stepProcessing("A12345", 15, 1); } if (i % 6 == 5) { pUnit->stepMaterialRemoved("A12345"); } if (i % 6 == 0) { pUnit->stepProcessingCompleted("A12345"); } */ /* auto now = std::chrono::system_clock::now(); auto duration_in_milliseconds = std::chrono::duration_cast(now.time_since_epoch()); uint64_t timestamp = duration_in_milliseconds.count(); pUnit->setDataTimeAndResetData(timestamp); static int i = 0; i++; if (i < 6) { pUnit->addData("TMP", "1.1,2.1,3.2,4.3,5.4,6.6,7.7,8.8,9.9,10.1,11.1,12.1", false); pUnit->addData("AIR", "112.19", false); pUnit->addData("PRE", "151,152.3,153.4,154.5,155.6", true); } else { pUnit->addData("TMP", "81.1,2.1,3.2,4.3,5.4,6.6,7.7,8.8,9.9,10.1,11.1,12.1", false); pUnit->addData("AIR", "8112.19", false); pUnit->addData("PRE", "8151,152.3,153.4,154.5,155.6", true); }*/ pUnit->addRecipe(1001, "RECIPE_1001", false); pUnit->addRecipe(1002, "RECIPE_1002", false); pUnit->addRecipe(1003, "RECIPE_1003", false); pUnit->addRecipe(1004, "RECIPE_1004", false); pUnit->addRecipe(1005, "RECIPE_1005", false); pUnit->addRecipe(1006, "RECIPE_1006", true); } } void CBEQDemoDlg::OnBnClickedButtonServoTest1() { BEQ::IServo* pServo = nullptr; BEQ_CreateServo(pServo, "BLServo"); ASSERT(pServo); BEQ::IRemoteEquipment* pRemoteEquipment = nullptr; pServo->createRemoteEquipment(pRemoteEquipment, "127.0.0.1", 8192); ASSERT(pRemoteEquipment); if (pRemoteEquipment != nullptr) { BEQ::IUnit* pUnitA = pRemoteEquipment->addUnit("UNITA", 5); BEQ::IUnit* pUnitB = pRemoteEquipment->addUnit("UNITB", 5); } char szAddr[64]; pRemoteEquipment->getAddr(szAddr, 64); CString s; s.Format("%s:%d", szAddr, pRemoteEquipment->getPort()); AfxMessageBox(s); BEQ::ServoListener listener; listener.onRemoteEqConnecting = [&](void* pServo, void* pRemoteEiuipment) -> void { TRACE("onRemoteEqConnecting...\n"); }; listener.onRemoteEqConnected = [&](void* pServo, void* pRemoteEiuipment) -> void { TRACE("onRemoteEqConnected...\n"); }; listener.onRemoteEqConnectFailed = [&](void* pServo, void* pRemoteEiuipment, int errorCode) -> void { TRACE("onRemoteEqConnectFailed...\n"); }; listener.onRemoteEqDisconnecting = [&](void* pServo, void* pRemoteEiuipment) -> void { TRACE("onRemoteEqDisconnecting...\n"); }; listener.onRemoteEqDisconnected = [&](void* pServo, void* pRemoteEiuipment) -> void { TRACE("onRemoteEqDisconnected...\n"); }; listener.onRemoteEqReadRawdata = [&](void* pServo, void* pRemoteEiuipment, const char* pszData, int len) -> void { TRACE("onRemoteEqReadRawdata...\n"); }; listener.onRemoteEqEventUpdate = [&](void* pServo, void* pRemoteEiuipment, void* pUnit, BEQ::REMOTE_EQ_EVENT eventCode) -> void { TRACE("onRemoteEqEventUpdate...\n"); HandleRemoteEqEventUpdate(eventCode, pUnit); }; pServo->setListener(listener); pServo->connectRemoteEquipment(pRemoteEquipment); } void CBEQDemoDlg::OnBnClickedButtonServoTest2() { BEQ::IServo* pServo = nullptr; BEQ_GetServo(pServo, "BLServo"); ASSERT(pServo); char szName[256]; pServo->getName(szName, 256); AfxMessageBox(szName); } void CBEQDemoDlg::OnBnClickedButtonServoTest3() { // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë } void CBEQDemoDlg::AppendTextToLog(const CString& text) { // ×·¼ÓÎı¾Ö®Ç°¼ì²éÐÐÊý CString existingText; m_editLog.GetWindowText(existingText); // ¼ÆË㵱ǰÐÐÊý int lineCount = 0; for (int i = 0; i < existingText.GetLength(); i++) { if (existingText[i] == '\n') lineCount++; } // Èç¹ûÐÐÊý³¬¹ý 100£¬Çå¿Õ¿Ø¼þ if (lineCount >= 100) { m_editLog.SetWindowText(_T("")); // Çå¿Õ¿Ø¼þ } // ×·¼ÓÐÂÎı¾ m_editLog.SetSel(m_editLog.GetWindowTextLength(), m_editLog.GetWindowTextLength()); // ÉèÖùâ±êµ½Îı¾Ä©Î² m_editLog.ReplaceSel(text + _T("\r\n")); // ×·¼ÓÎı¾²¢»»ÐÐ } const char* CBEQDemoDlg::ConverUint64ToTimeString(uint64_t time) { static char buffer[32]; auto timePoint = std::chrono::time_point(std::chrono::milliseconds(time)); std::time_t t = std::chrono::system_clock::to_time_t(timePoint); std::tm tmPtr; if (localtime_s(&tmPtr, &t) == 0) { strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tmPtr); } else { snprintf(buffer, sizeof(buffer), "Invalid Time"); } return buffer; } void CBEQDemoDlg::UpdateDoorStatus(CColorStatic& doorControl, bool isOpen) { if (isOpen) { doorControl.SetWindowText(_T("open")); doorControl.SetBkColor(RGB(255, 0, 0)); // ºìÉ«±íʾ´ò¿ª } else { doorControl.SetWindowText(_T("close")); doorControl.SetBkColor(RGB(0, 255, 0)); // ÂÌÉ«±íʾ¹Ø±Õ } doorControl.Invalidate(); } void CBEQDemoDlg::HandleRemoteEqEventUpdate(BEQ::REMOTE_EQ_EVENT eventCode, void* pUnit) { BEQ::IUnit* pUnitEx = (BEQ::IUnit*)pUnit; char chUnitName[128] = {0}; pUnitEx->getName(chUnitName, sizeof(chUnitName)); switch (eventCode) { case BEQ::REMOTE_EQ_EVENT::DEVICE_STATUS_CHANGED: { // ´¦ÀíÉ豸״̬ CString strStatus; static char* eqState[] = { "IDLE", "RUN", "DOWN", "MAINTENANCE", "MCHG", "E_TIME" }; strStatus.Format("DEVICE_STATUS_CHANGED@%s: %s", chUnitName, eqState[(int)pUnitEx->getState()]); AppendTextToLog(strStatus); break; } case BEQ::REMOTE_EQ_EVENT::DOOR_STATUS_CHANGED: { // ´¦ÀíÃÅ״̬ UpdateDoorStatus(m_staticDoor1, (pUnitEx->getDoorState() >> 0) & 1); UpdateDoorStatus(m_staticDoor2, (pUnitEx->getDoorState() >> 1) & 1); UpdateDoorStatus(m_staticDoor3, (pUnitEx->getDoorState() >> 2) & 1); UpdateDoorStatus(m_staticDoor4, (pUnitEx->getDoorState() >> 3) & 1); UpdateDoorStatus(m_staticDoor5, (pUnitEx->getDoorState() >> 4) & 1); CString strDoorStatus; strDoorStatus.Format("DOOR_STATUS_CHANGED@%s: %d", chUnitName, pUnitEx->getDoorState()); AppendTextToLog(strDoorStatus); break; } case BEQ::REMOTE_EQ_EVENT::ALARM_INFO_CHANGED: { // ´¦Àí±¨¾¯ÐÅÏ¢ CString strAlarmInfo; strAlarmInfo.Format("ALARM_INFO_CHANGED@%s: %d %d", chUnitName, pUnitEx->getAlarmCode(), pUnitEx->getAlarmLevel()); AppendTextToLog(strAlarmInfo); break; } case BEQ::REMOTE_EQ_EVENT::REMOVE_ALARM_INFO: { // ´¦Àí½â³ý¸æ¾¯ CString strRemoveAlarmInfo; strRemoveAlarmInfo.Format("REMOVE_ALARM_INFO@%s: %d %d", chUnitName, pUnitEx->getAlarmCode(), pUnitEx->getAlarmLevel()); AppendTextToLog(strRemoveAlarmInfo); break; } case BEQ::REMOTE_EQ_EVENT::PRODUCTION_PROCESS_CHANGED: { // ´¦ÀíÖÆ×÷¹ý³Ì״̬ static char* stepState[] = { "IDLE", "MATERIAL_RECEIVED", "MATERIAL_REMOVED", "PROCESSING_STARTED", "PROCESSING", "PROCESSING_COMPLETED" }; CString strProduction; strProduction.Format("PRODUCTION_PROCESS_CHANGED@%s: %s", chUnitName, stepState[(int)pUnitEx->getStepState()]); AppendTextToLog(strProduction); break; } case BEQ::REMOTE_EQ_EVENT::SERSOR_DATA_CHANGED: { // ´¦Àí×îÐÂÊý¾Ý£¬´«¸ÐÆ÷£¨Î¶ȡ¢Ñ¹Á¦µÈ£© CString strSersorData; strSersorData.Format("SERSOR_DATA_CHANGED@%s: %s", chUnitName, ConverUint64ToTimeString(pUnitEx->getDataTime())); AppendTextToLog(strSersorData); break; } case::BEQ::REMOTE_EQ_EVENT::RECIPE_LIST_CHANGED: { // ´¦ÀíÅä·½Áбí CString strRecipeList; strRecipeList.Format("RECIPE_LIST_CHANGED@%s: ", chUnitName); std::map mapRec;// = pUnit->getRecipes(); for (auto it = mapRec.begin(); it != mapRec.end(); it++) { TRACE("RecipeList[%d]: %s\n", it->first, it->second.c_str()); } AppendTextToLog(strRecipeList); break; } case BEQ::REMOTE_EQ_EVENT::LOAD_EVENT_CHANGED: { // ´¦ÀíÉϱ¨Ê¼þ break; } default: // ´¦ÀíÆäËû״̬... TRACE("Unknown status...\n"); break; } }