ソースを参照

完成 设备面板 关联到CMainFrame中;

scbc.sat2 5 年 前
コミット
d6ac3bf2d7

+ 5 - 0
SATHelper/SATHelper/Device.cpp

@@ -22,6 +22,11 @@ void CDevice::Close()
 	m_obj.CloseSerialPort();
 }
 
+bool CDevice::IsOpen()
+{
+	return m_obj.IsOpen();
+}
+
 std::string CDevice::SendCommond(std::string cmd)
 {
 	if ( !m_obj.IsOpen() )

+ 1 - 0
SATHelper/SATHelper/Device.h

@@ -13,6 +13,7 @@ public:
 
 	bool Open();
 	void Close();
+	bool IsOpen();
 	std::string SendCommond(std::string cmd);
 public:
 	int m_iID;						// -- É豸µÄID

+ 727 - 1
SATHelper/SATHelper/MainFrm.cpp

@@ -50,6 +50,42 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
 	ON_MESSAGE(MSG_STATUS_BAR, &CMainFrame::OnMsgStatusBar)
 	ON_REGISTERED_MESSAGE(AFX_WM_ON_CHANGE_RIBBON_CATEGORY, &CMainFrame::OnRibbonChanged)
 	ON_WM_CLOSE()
+	ON_WM_DEVICECHANGE()
+	// 全步骤截图;
+	ON_COMMAND(ID_CHECK_FULL_CUT, &CMainFrame::OnCheckFullCut)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_FULL_CUT, &CMainFrame::OnUpdateCheckFullCut)
+	// 有声按钮;
+	ON_COMMAND(BTN_HAD_SOUND, &CMainFrame::OnHadSound)
+	ON_UPDATE_COMMAND_UI(BTN_HAD_SOUND, &CMainFrame::OnUpdateHadSound)
+	// 声音默认按钮;
+	ON_COMMAND(BTN_DEF_SOUND, &CMainFrame::OnDefSound)
+	ON_UPDATE_COMMAND_UI(BTN_DEF_SOUND, &CMainFrame::OnUpdateDefSound)
+	// 声音等级编辑框;
+	// OCR账号下拉框;
+	ON_COMMAND(ID_COMBOX_OCR, &CMainFrame::OnComboxOcr)
+	ON_UPDATE_COMMAND_UI(ID_COMBOX_OCR, &CMainFrame::OnUpdateComboxOcr)
+	// MenuTree项目下拉框;
+	ON_COMMAND(ID_COMBO_PRODUCT, &CMainFrame::OnComboProduct)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_PRODUCT, &CMainFrame::OnUpdateComboProduct)
+	// MenuTree UI下拉框;
+	ON_COMMAND(ID_COMBO_UI, &CMainFrame::OnComboUi)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_UI, &CMainFrame::OnUpdateComboUi)
+	// MenuTree 子UI下拉框;
+	ON_COMMAND(ID_COMBO_SUBUI, &CMainFrame::OnComboSubUi)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_SUBUI, &CMainFrame::OnUpdateComboSubUi)
+	// 信号仪1下拉框;
+	ON_COMMAND(ID_COMBO1_22293, &CMainFrame::OnCombo1_22293)
+	ON_UPDATE_COMMAND_UI(ID_COMBO1_22293, &CMainFrame::OnUpdateCombo1_22293)
+	// 信号仪2下拉框;
+	ON_COMMAND(ID_COMBO2_22293, &CMainFrame::OnCombo2_22293)
+	ON_UPDATE_COMMAND_UI(ID_COMBO2_22293, &CMainFrame::OnUpdateCombo2_22293)
+	// 信号仪1CheckBox;
+	ON_COMMAND(ID_CHECK1_22293, &CMainFrame::OnCheck1_22293)
+	ON_UPDATE_COMMAND_UI(ID_CHECK1_22293, &CMainFrame::OnUpdateCheck1_22293)
+	// 信号仪2CheckBox;
+	ON_COMMAND(ID_CHECK2_22293, &CMainFrame::OnCheck2_22293)
+	ON_UPDATE_COMMAND_UI(ID_CHECK2_22293, &CMainFrame::OnUpdateCheck2_22293)
+	//////////////////////////////////////////////////////////////////////////
 END_MESSAGE_MAP()
 
 // CMainFrame 构造/析构
@@ -71,6 +107,10 @@ CMainFrame::CMainFrame() noexcept :m_trayIcon(IDR_MAINFRAME)
 	}
 
 	m_pUB530View = m_pDeviceView = NULL;
+
+	ReadBaiduCfg(m_bdcfg);
+	ReadRsRunCfg(m_rscfg);
+	ReadTreePath();
 }
 
 CMainFrame::~CMainFrame()
@@ -303,7 +343,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	}
 #endif
 
-#if 1 // 第二个视图;
+#if 0 // 第二个视图;
 	CCreateContext context2;
 	m_pDeviceView = new CChildFrame();
 	context2.m_pLastView = NULL;
@@ -323,6 +363,9 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	m_pUB530View->MDIActivate();
 	m_pUB530View->ShowWindow(SW_SHOWMAXIMIZED);
 
+
+	InitDevicePanel();
+
 	return 0;
 }
 
@@ -730,3 +773,686 @@ LRESULT CMainFrame::OnRibbonChanged(WPARAM wParam, LPARAM lParam)
 
 	return LRESULT();
 }
+
+void CMainFrame::ReadBaiduCfg(BaiduCfg& bdcfg)
+{
+	TCHAR szValue[MAX_PATH] = { 0 };
+	TCHAR szBuffer[1024] = { 0 };
+	_stprintf_s(m_szBaiduCfgPath, _T("%s%s"), Global::g_szPython27Dir, _T("Lib\\site-packages\\ssat_sdk\\config\\baidu.cfg"));
+
+	GetPrivateProfileString(_T("CurStatus"), _T("Cur_Count"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+	bdcfg.cur_count = szValue;
+
+	GetPrivateProfileString(_T("CurStatus"), _T("Reset_Time"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+	bdcfg.reset_time = szValue;
+
+	// 读取所有Section值;
+	DWORD dwLen = GetPrivateProfileString(NULL, NULL, NULL, szBuffer, 1024, m_szBaiduCfgPath);
+	for (int i = 0, j = 0; i < dwLen; i++)
+	{
+		if (szBuffer[i] == '\0')
+		{
+			TCHAR szData[MAX_PATH] = { 0 };
+			memcpy(szData, &szBuffer[j], i - j);
+			if (_tcsicmp(szData, _T("CurStatus")))
+			{
+				CountInfo countInfo;
+				GetPrivateProfileString(szData, _T("APP_ID"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+				countInfo.app_id = szValue;
+
+				GetPrivateProfileString(szData, _T("API_KEY"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+				countInfo.api_key = szValue;
+
+				GetPrivateProfileString(szData, _T("SECRET_KEY"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+				countInfo.secret_key = szValue;
+
+				GetPrivateProfileString(szData, _T("Ret_Count"), NULL, szValue, MAX_PATH, m_szBaiduCfgPath);
+				countInfo.ret_count = szValue;
+
+				bdcfg.list_count.insert(std::pair<std::string, CountInfo>(szData, countInfo));
+			}
+			OutputDebugString(szData);
+			OutputDebugString("\n");
+			j = i + 1;
+		}
+	}
+}
+
+void CMainFrame::ReadRsRunCfg(RsRunCfg& rscfg)
+{
+	TCHAR szValue[MAX_PATH] = { 0 };
+	TCHAR szBuffer[1024] = { 0 };
+	_stprintf_s(m_szRsCfgPath, _T("%s%s"), Global::g_szPython27Dir, _T("Lib\\site-packages\\ssat_sdk\\config\\resource_run.cfg"));
+
+	GetPrivateProfileString(_T("Sound"), _T("sound_list"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.sound_list = szValue;
+
+	GetPrivateProfileString(_T("COMM"), _T("issendkeytakepicture_tester"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.full_cut = szValue;
+
+	GetPrivateProfileString(_T("COMM"), _T("tg39_port"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.tg39_port = szValue;
+
+	GetPrivateProfileString(_T("COMM"), _T("sat_home"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.sat_home = szValue;
+
+	GetPrivateProfileString(_T("COMM"), _T("sat_result_dir"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.sat_result_dir = szValue;
+
+	GetPrivateProfileString(_T("COMM"), _T("chroma22293"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.chroma22293 = szValue;
+
+	//...
+	GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.menutree_chip = szValue;
+
+	GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.menutree_style = szValue;
+
+	GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.menutree_channel = szValue;
+
+	// SATHelper
+	GetPrivateProfileString(_T("SATHelper"), _T("chroma1"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.chroma1 = szValue;
+
+	GetPrivateProfileString(_T("SATHelper"), _T("chroma2"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.chroma2 = szValue;
+}
+
+void CMainFrame::ReadTreePath()
+{
+	// 必须在ReadRsRunCfg之后调用;
+	TCHAR szRootDir[MAX_PATH] = { 0 };
+	_stprintf_s(szRootDir, _T("%s%s"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\"));
+
+	auto _get_dir = [](std::string dir) {
+		int nIndex = dir.find_last_of('\\');
+		if (nIndex != std::string::npos)
+		{
+			return dir.substr(nIndex + 1);
+		}
+
+		return dir;
+	};
+
+	auto _get_name = [](std::string dir) {
+		int pos1 = dir.find_last_of('\\');
+		if (pos1 != std::string::npos)
+		{
+			dir = dir.substr(pos1 + 1);
+			int pos2 = dir.find_last_of('.');
+			if (pos2 != std::string::npos)
+			{
+				dir = dir.substr(0, pos2);
+				int pos3 = dir.find("MenuTree_");
+				if (pos3 != std::string::npos)
+				{
+					return dir.substr(strlen("MenuTree_"));
+				}
+			}
+		}
+
+		return std::string();
+	};
+
+	// 查找根目录下的目录;
+	filehelper fh;
+	STR_VEC vt_dir;
+	fh.getsubfolder(szRootDir, &vt_dir);
+	for (auto it : vt_dir)
+	{
+		STR_VEC vt_subdir;
+		std::vector<UITree> vtTree;
+		fh.getsubfolder(it.c_str(), &vt_subdir);
+		for (auto ui : vt_subdir)
+		{
+			// 查找xls文件;
+			UITree uitree;
+			uitree.ui = ui;
+			fh.getfiles_findout_subfolder(ui.c_str(), _T("*.xls"), &uitree.vtSubUI);
+			vtTree.push_back(uitree);
+		}
+
+		m_map_tree.insert(std::pair<std::string, std::vector<UITree>>(_get_dir(it), vtTree));
+	}
+
+	// 去除目录级;
+	for (std::map<std::string, std::vector<UITree>>::iterator it = m_map_tree.begin(); it != m_map_tree.end(); it++)
+	{
+		for (std::vector<UITree>::iterator ui = it->second.begin(); ui != it->second.end(); ui++)
+		{
+			ui->ui = _get_dir(ui->ui);
+			for (std::vector<std::string>::iterator xls = ui->vtSubUI.begin(); xls != ui->vtSubUI.end();)
+			{
+				*xls = _get_name(xls->c_str());
+				if (xls->size() == 0)
+				{
+					xls = ui->vtSubUI.erase(xls);
+				}
+				else
+				{
+					xls++;
+				}
+			}
+		}
+	}
+}
+
+void CMainFrame::ParseJson()
+{
+	if (m_rscfg.chroma1.size() == 0)
+	{
+		cJSON* pJson = cJSON_Parse(m_rscfg.chroma22293.c_str());
+		if (pJson)
+		{
+			cJSON* pArray = cJSON_GetObjectItem(pJson, "devices");
+			if (pArray)
+			{
+				int nCount = cJSON_GetArraySize(pArray);
+				for (int i = 0; i < nCount; i++)
+				{
+					cJSON* pItem = cJSON_GetArrayItem(pArray, i);
+					if (pItem)
+					{
+						if (i == 0)
+							m_rscfg.chroma1 = cJSON_GetObjectItem(pItem, "port") ? cJSON_GetObjectItem(pItem, "port")->valuestring : _T("");
+						if (i == 1)
+							m_rscfg.chroma2 = cJSON_GetObjectItem(pItem, "port") ? cJSON_GetObjectItem(pItem, "port")->valuestring : _T("");
+					}
+				}
+			}
+		}
+
+		// 保存;
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma1"), m_rscfg.chroma1.c_str(), m_szRsCfgPath);
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma2"), m_rscfg.chroma2.c_str(), m_szRsCfgPath);
+	}
+}
+
+void CMainFrame::RunDevice()
+{
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pCheck1 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK1_22293));
+	CMFCRibbonButton* pCheck2 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK2_22293));
+
+	if (m_rscfg.chroma1.size())
+	{
+		CDevice* pdev = new CDevice();
+		pdev->m_iBaudrate = 115200;
+		pdev->m_iDatabit = 8;
+		pdev->m_iPort = atoi(m_rscfg.chroma1.substr(3).c_str());
+		pdev->m_iParitybit = 0;
+		pdev->m_iStopbit = 1;
+		pdev->m_iID = 1;
+		pdev->m_strDeviceName = "Chroma22293";
+		pdev->m_iDeviceType = 1;
+		if (pdev->Open())
+		{
+			g_dmap.insert(std::pair<int, CDevice*>(pdev->m_iID, pdev));
+		}
+		else
+		{
+			delete pdev;
+		}
+	}
+
+	if (m_rscfg.chroma2.size())
+	{
+		CDevice* pdev = new CDevice();
+		pdev->m_iBaudrate = 115200;
+		pdev->m_iDatabit = 8;
+		pdev->m_iPort = atoi(m_rscfg.chroma2.substr(3).c_str());
+		pdev->m_iParitybit = 0;
+		pdev->m_iStopbit = 1;
+		pdev->m_iID = 2;
+		pdev->m_strDeviceName = "Chroma22293";
+		pdev->m_iDeviceType = 1;
+		if (pdev->Open())
+		{
+			g_dmap.insert(std::pair<int, CDevice*>(pdev->m_iID, pdev));
+		}
+		else
+		{
+			delete pdev;
+		}
+	}
+
+	UpdateData(FALSE);
+}
+
+void CMainFrame::InitCombobox_port()
+{
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCommbox1 = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO1_22293));
+	CMFCRibbonComboBox* pCommbox2 = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO2_22293));
+	for (std::vector<std::string>::iterator it = m_vtCOM.begin(); it != m_vtCOM.end(); it++)
+	{
+		if (!IsPortInserted(pCommbox1, it->c_str()))
+			pCommbox1->AddItem(it->c_str());
+
+		if (!IsPortInserted(pCommbox2, it->c_str()))
+			pCommbox2->AddItem(it->c_str());
+	}
+
+	if (m_rscfg.chroma1.size())
+		pCommbox1->SelectItem(m_rscfg.chroma1.c_str());
+	if (m_rscfg.chroma2.size())
+		pCommbox2->SelectItem(m_rscfg.chroma2.c_str());
+
+}
+
+BOOL CMainFrame::IsPortInserted(CMFCRibbonComboBox* pCommbox, LPCTSTR lpPort)
+{
+	int nCount = pCommbox->GetCount();
+	for (int i = 0; i < nCount; i++ )
+	{
+		if (_tcsicmp(pCommbox->GetItem(i), lpPort) == 0)
+			return TRUE;
+	}
+
+	return FALSE;
+}
+
+BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
+{
+	switch (nEventType)
+	{
+		// 串口拨掉;
+	case DBT_DEVICEREMOVECOMPLETE:
+		break;
+		// 串口插入;
+	case DBT_DEVICEARRIVAL:
+	{
+		Global::GetSysSerialPort(m_vtCOM);
+		InitCombobox_port();
+	}
+	break;
+	default:
+		break;
+	}
+	return TRUE;
+}
+
+
+void CMainFrame::InitDevicePanel()
+{
+	ParseJson();
+	// Ribbon Combobox添加默认项;
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pOcrCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBOX_OCR));
+	if (pOcrCombo)
+	{
+		for (auto it : m_bdcfg.list_count)
+		{
+			pOcrCombo->AddItem(it.first.c_str());
+		}
+
+		// 选择默认项;
+		pOcrCombo->SetEditText(m_bdcfg.cur_count.c_str());
+	}
+
+	// 剩余次数;
+	CMFCRibbonEdit* pOcrCount = DYNAMIC_DOWNCAST(CMFCRibbonEdit, pRibbon->FindByID(ID_EDIT_COUNT));
+	if (pOcrCount)
+	{
+		pOcrCount->SetEditText(m_bdcfg.reset_time.c_str());
+	}
+
+	// 声音等级;
+	CMFCRibbonEdit* pSoundLevel = DYNAMIC_DOWNCAST(CMFCRibbonEdit, pRibbon->FindByID(ID_EDIT_SOUND_LEVEL));
+	if (pSoundLevel)
+	{
+		pSoundLevel->SetEditText(m_bdcfg.reset_time.c_str());
+	}
+
+	// 全步骤截图;
+// 	CMFCRibbonCheckBox* pCheckFullCut = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_CHECK_FULL_CUT));
+// 	if (pCheckFullCut)
+// 	{
+// 		pCheckFullCut->SetCheck();
+// 	}
+
+	// MenuTree;
+	CMFCRibbonComboBox* pChipCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_PRODUCT));
+	if (pChipCombo)
+	{
+		for (auto it : m_map_tree)
+		{
+			pChipCombo->AddItem(it.first.c_str());
+		}
+
+		// 选择默认项;
+		pChipCombo->SetEditText(m_rscfg.menutree_chip.c_str());
+
+		// UI下拉框;
+		CString curText = pChipCombo->GetEditText();
+		CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
+		for (auto it : m_map_tree.find(curText.GetString())->second)
+		{
+			pStyleCombo->AddItem(it.ui.c_str());
+		}
+		pStyleCombo->SetEditText(m_rscfg.menutree_style.c_str());
+	}
+
+	// 启动设备;
+	Global::GetSysSerialPort(m_vtCOM);
+	InitCombobox_port();
+	RunDevice();
+}
+
+void CMainFrame::OnCheckFullCut()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pFullCutCheck = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK_FULL_CUT));
+	if (pFullCutCheck)
+	{
+		WritePrivateProfileString(_T("COMM"), _T("issendkeytakepicture_tester"), !pFullCutCheck->IsChecked() ? _T("True") : _T("False"), m_szRsCfgPath);
+		m_rscfg.full_cut = !pFullCutCheck->IsChecked() ? _T("True") : _T("False");
+	}
+}
+
+
+void CMainFrame::OnUpdateCheckFullCut(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(!_tcsicmp(m_rscfg.full_cut.c_str(), _T("True")));
+}
+
+
+void CMainFrame::OnHadSound()
+{
+	// TODO: 在此添加命令处理程序代码
+}
+
+
+void CMainFrame::OnUpdateHadSound(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+}
+
+
+void CMainFrame::OnDefSound()
+{
+	// TODO: 在此添加命令处理程序代码
+}
+
+
+void CMainFrame::OnUpdateDefSound(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+}
+
+
+void CMainFrame::OnComboxOcr()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pOcrCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBOX_OCR));
+	if (pOcrCombo)
+	{
+		// 获取当前文本项;
+		CString strOcr = pOcrCombo->GetEditText();
+		WritePrivateProfileString(_T("CurStatus"), _T("Cur_Count"), strOcr, m_szBaiduCfgPath);
+	}
+}
+
+
+
+void CMainFrame::OnUpdateComboxOcr(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+}
+
+
+void CMainFrame::OnComboProduct()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pChipCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_PRODUCT));
+	if (pChipCombo)
+	{
+		// UI下拉框;
+		CString curText = pChipCombo->GetEditText();
+		CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
+		pStyleCombo->RemoveAllItems();
+		for (auto it : m_map_tree.find(curText.GetString())->second)
+		{
+			pStyleCombo->AddItem(it.ui.c_str());
+		}
+		pStyleCombo->SelectItem(0);
+
+		// SUBUI下拉框;
+		CString strUIName = pStyleCombo->GetEditText();
+		CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+		pSubUICombo->RemoveAllItems();
+		std::vector<UITree>& ui = m_map_tree.find(curText.GetString())->second;
+		for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
+		{
+			if (_tcsicmp(strUIName.GetString(), it->ui.c_str()) == 0)
+			{
+				if (it->vtSubUI.size() == 0)
+					break;
+
+				for (auto SubUI : it->vtSubUI)
+				{
+					pSubUICombo->AddItem(SubUI.c_str());
+				}
+
+				pSubUICombo->SelectItem(0);
+			}
+		}
+
+		// 保存结果;
+		CString strCurChip = pChipCombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), strCurChip, m_szRsCfgPath);
+
+		CString strCurStyle = pStyleCombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
+
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
+	}
+}
+
+
+void CMainFrame::OnUpdateComboProduct(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
+}
+
+void CMainFrame::OnComboUi()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pStyleCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_UI));
+	if (pStyleCombo)
+	{
+		CMFCRibbonComboBox* pChipCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_PRODUCT));
+		// UI下拉框;
+		CString curText = pChipCombo->GetEditText();
+		// SUBUI下拉框;
+		CString strUIName = pStyleCombo->GetEditText();
+		CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+		pSubUICombo->RemoveAllItems();
+		std::vector<UITree>& ui = m_map_tree.find(curText.GetString())->second;
+		for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
+		{
+			if (_tcsicmp(strUIName.GetString(), it->ui.c_str()) == 0)
+			{
+				if (it->vtSubUI.size() == 0)
+					break;
+
+				for (auto SubUI : it->vtSubUI)
+				{
+					pSubUICombo->AddItem(SubUI.c_str());
+				}
+
+				pSubUICombo->SelectItem(0);
+			}
+		}
+
+		// UI下拉框;
+		CString strCurStyle = pStyleCombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
+
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
+	}
+}
+
+void CMainFrame::OnUpdateComboUi(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
+}
+
+void CMainFrame::OnComboSubUi()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pSubUICombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_SUBUI));
+	if (pSubUICombo)
+	{
+		// UI下拉框;
+		CString strSubStyle = pSubUICombo->GetEditText();
+		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strSubStyle, m_szRsCfgPath);
+	}
+}
+
+void CMainFrame::OnUpdateComboSubUi(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+
+}
+
+
+void CMainFrame::OnCombo1_22293()
+{
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCombobx1 = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO1_22293));
+
+	// 保存到配置文件中;
+	int nCurSel = pCombobx1->GetCurSel();
+	if (nCurSel != CB_ERR)
+	{
+		CString strChroma1 = pCombobx1->GetEditText();
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma1"), strChroma1, m_szRsCfgPath);
+
+		CDevice* pDev = g_dmap.find(1)->second;
+		int port = atoi(strChroma1.Right(1).GetString());
+		if (pDev->m_iPort != port)
+		{
+			pDev->m_iPort = port;
+			pDev->Close();
+			pDev->Open();
+		}
+	}
+}
+
+void CMainFrame::OnUpdateCombo1_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	
+}
+
+void CMainFrame::OnCombo2_22293()
+{
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCombobx2 = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO2_22293));
+
+	// 保存到配置文件中;
+	int nCurSel = pCombobx2->GetCurSel();
+	if (nCurSel != CB_ERR)
+	{
+		CString strChroma2 = pCombobx2->GetEditText();
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma2"), strChroma2, m_szRsCfgPath);
+
+		CDevice* pDev = g_dmap.find(2)->second;
+		int port = atoi(strChroma2.Right(1).GetString());
+		if (pDev->m_iPort != port)
+		{
+			pDev->m_iPort = port;
+			pDev->Close();
+			pDev->Open();
+		}
+	}
+}
+
+void CMainFrame::OnUpdateCombo2_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	
+}
+
+
+void CMainFrame::OnCheck1_22293()
+{
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pCheck1 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK1_22293));
+		
+	// TODO: 在此添加命令处理程序代码
+	if (g_dmap.find(1) != g_dmap.end())
+	{
+		if (pCheck1->IsChecked())
+		{
+			g_dmap.find(1)->second->Close();
+		}
+		else
+		{
+			g_dmap.find(1)->second->Open();
+		}
+	}
+}
+
+void CMainFrame::OnUpdateCheck1_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	if (g_dmap.find(1) != g_dmap.end())
+		pCmdUI->SetCheck(g_dmap.find(1)->second->IsOpen());
+	else
+		pCmdUI->SetCheck(FALSE);
+}
+
+void CMainFrame::OnCheck2_22293()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pCheck2 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK2_22293));
+
+	// TODO: 在此添加命令处理程序代码
+	if (g_dmap.find(2) != g_dmap.end())
+	{
+		if (pCheck2->IsChecked())
+		{
+			g_dmap.find(2)->second->Close();
+		}
+		else
+		{
+			g_dmap.find(2)->second->Open();
+		}
+	}
+}
+
+void CMainFrame::OnUpdateCheck2_22293(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	if (g_dmap.find(2) != g_dmap.end())
+		pCmdUI->SetCheck(g_dmap.find(2)->second->IsOpen());
+	else
+		pCmdUI->SetCheck(FALSE);
+}

+ 114 - 6
SATHelper/SATHelper/MainFrm.h

@@ -24,6 +24,7 @@
 #include "ChildFrm.h"
 #include "DeviceView.h"
 #include "UB530View.h"
+#include "filehelper.h"
 //////////////////////////////////////////////////////////////////////////
 #include "TrayIcon.h"
 #define USE_TRAYICON 1
@@ -42,7 +43,7 @@ class CMainFrame : public CMDIFrameWndEx
 public:
 	CMainFrame() noexcept;
 
-// 特性
+	// 特性
 public:
 	CSATHelperDoc* m_pDoc;
 	CFormView* m_pActiveView;
@@ -50,14 +51,14 @@ public:
 	CChildFrame* m_pUB530View;
 	CChildFrame* m_pDeviceView;
 
-// 操作
+	// 操作
 public:
 
-// 重写
+	// 重写
 public:
 	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 
-// 实现
+	// 实现
 public:
 	virtual ~CMainFrame();
 #ifdef _DEBUG
@@ -91,7 +92,7 @@ protected:  // 控件条嵌入成员
 	CMFCCaptionBar    m_wndCaptionBar;
 #endif
 
-// 生成的消息映射函数
+	// 生成的消息映射函数
 protected:
 	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 	afx_msg void OnWindowManager();
@@ -123,7 +124,7 @@ protected:
 
 	CMFCOutlookBarTabCtrl* FindOutlookParent(CWnd* pWnd);
 	CMFCOutlookBarTabCtrl* m_pCurrOutlookWnd;
-	CMFCOutlookBarPane*    m_pCurrOutlookPage;
+	CMFCOutlookBarPane* m_pCurrOutlookPage;
 
 public:
 #if USE_TRAYICON
@@ -169,6 +170,113 @@ public:
 	virtual BOOL PreTranslateMessage(MSG* pMsg);
 	//afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
 	afx_msg LRESULT OnRibbonChanged(WPARAM wParam, LPARAM lParam);
+
+
+public:
+	//////////////////////////////////////////////////////////////////////////
+	// 读取baidu.cfg配置文件内容;
+	typedef struct __COUNT_INFO__
+	{
+		std::string app_id;
+		std::string api_key;
+		std::string secret_key;
+		std::string ret_count;
+	}CountInfo, * pCountInfo;
+
+	typedef struct __BAIDU_CFG__
+	{
+		std::string cur_count;
+		std::string reset_time;
+		std::map<std::string, __COUNT_INFO__> list_count;
+	}BaiduCfg, * pBaiduCfg;
+
+	BaiduCfg m_bdcfg;
+	TCHAR m_szBaiduCfgPath[MAX_PATH];
+	void ReadBaiduCfg(BaiduCfg& bdcfg);
+
+	//////////////////////////////////////////////////////////////////////////
+	// 读取resource_run.cfg配置文件内容;
+	typedef struct __RS_RUN_CFG__
+	{
+		std::string sound_list;	// 声音级别;
+		std::string full_cut;	// 是否全步骤截图;('True/False')
+		//....
+		std::string tg39_port;
+		std::string sat_home;
+		std::string sat_result_dir;
+		std::string chroma22293;
+		//...
+		std::string menutree_chip;
+		std::string menutree_style;
+		std::string menutree_channel;
+		//...
+		std::string chroma1;
+		std::string chroma2;
+	}RsRunCfg, * pRsRunCfg;
+
+	RsRunCfg m_rscfg;
+	TCHAR m_szRsCfgPath[MAX_PATH];
+	void ReadRsRunCfg(RsRunCfg& rscfg);
+
+	//////////////////////////////////////////////////////////////////////////
+	// 读取menutree目录;
+	typedef struct __UI_TREE__
+	{
+		std::string ui;
+		std::vector<std::string> vtSubUI;
+	}UITree, * pUITree;
+	std::map<std::string, std::vector<UITree>> m_map_tree;
+	void ReadTreePath();
+
+	// 解析json;
+	void ParseJson();
+
+	// 运行设备;
+	void RunDevice();
+
+	std::vector<std::string> m_vtCOM;
+	void InitCombobox_port();
+	BOOL IsPortInserted(CMFCRibbonComboBox* pCommbox, LPCTSTR lpPort);
+	afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
+
+public:
+	void InitDevicePanel();
+	// 全步骤截图;
+	afx_msg void OnCheckFullCut();
+	afx_msg void OnUpdateCheckFullCut(CCmdUI* pCmdUI);
+	// 有声按钮;
+	afx_msg void OnHadSound();
+	afx_msg void OnUpdateHadSound(CCmdUI* pCmdUI);
+	// 声音默认按钮;
+	afx_msg void OnDefSound();
+	afx_msg void OnUpdateDefSound(CCmdUI* pCmdUI);
+	// 声音等级编辑框;
+
+	// OCR账号下拉框;
+	afx_msg void OnComboxOcr();
+	afx_msg void OnUpdateComboxOcr(CCmdUI* pCmdUI);
+	// MenuTree项目下拉框;
+	afx_msg void OnComboProduct();
+	afx_msg void OnUpdateComboProduct(CCmdUI* pCmdUI);
+	// MenuTree UI下拉框;
+	afx_msg void OnComboUi();
+	afx_msg void OnUpdateComboUi(CCmdUI* pCmdUI);
+	// MenuTree 子UI下拉框;
+	afx_msg void OnComboSubUi();
+	afx_msg void OnUpdateComboSubUi(CCmdUI* pCmdUI);
+
+	// 信号仪1下拉框;
+	afx_msg void OnCombo1_22293();
+	afx_msg void OnUpdateCombo1_22293(CCmdUI* pCmdUI);
+	// 信号仪2下拉框;
+	afx_msg void OnCombo2_22293();
+	afx_msg void OnUpdateCombo2_22293(CCmdUI* pCmdUI);
+	// 信号仪1CheckBox;
+	afx_msg void OnCheck1_22293();
+	afx_msg void OnUpdateCheck1_22293(CCmdUI* pCmdUI);
+	// 信号仪2CheckBox;
+	afx_msg void OnCheck2_22293();
+	afx_msg void OnUpdateCheck2_22293(CCmdUI* pCmdUI);
 };