/* CapViewer.cpp : implementation file This module is responsible for displaying the in-flight window with 4 buttons: Record, Calibrate, Sleep, Shutdown. It is also responsible for handling all the MFC-related messages associated with that window */ #include "stdafx.h" #include "AIRSLoader.h" #include "CapViewer.h" #include "GlobalDefinitions.h" #include #include "InstrumentSetup.h" #include "message.h" #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif typedef BOOL (WINAPI * SetSuspendState ) (BOOL, BOOL, BOOL); TCHAR szRecord[250] = "C:\\FORESTRY\\icons\\Record.bmp"; TCHAR szCalibrate[250] = "C:\\FORESTRY\\icons\\Calibrate.bmp"; TCHAR szSleep[250] = "C:\\FORESTRY\\icons\\Sleep.bmp"; TCHAR szShutdown[250] = "C:\\FORESTRY\\icons\\Shutdown.bmp"; TCHAR szRecordOn[250] = "C:\\FORESTRY\\icons\\RecordOn.bmp"; TCHAR szCalibrateOn[250] = "C:\\FORESTRY\\icons\\CalibrateOn.bmp"; TCHAR szSleepOn[250] = "C:\\FORESTRY\\icons\\SleepOn.bmp"; TCHAR szShutdownOn[250] = "C:\\FORESTRY\\icons\\ShutdownOn.bmp"; TCHAR szBatteryMeter[250] = "C:\\FORESTRY\\icons\\BatteryMeter.bmp"; ///////////////////////////////////////////////////////////////////////////// // CCapViewer dialog CCapViewer::CCapViewer(CWnd* pParent /*=NULL*/) : CDialog(CCapViewer::IDD, pParent) { //{{AFX_DATA_INIT(CCapViewer) m_bCalibration = FALSE; m_bRecord = FALSE; //}}AFX_DATA_INIT } void CCapViewer::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCapViewer) DDX_Control(pDX, IDC_INFO, m_CInfoBox); DDX_Control(pDX, IDC_BATTERYBAR, m_CBatteryBar); DDX_Control(pDX, IDC_BATTERYPERCENT, m_CBatteryPercent); DDX_Control(pDX, IDC_BATTERYMETER, m_CBatteryMeter); DDX_Control(pDX, IDC_RECORD, m_CRecord); DDX_Control(pDX, IDC_CALIBRATION, m_CCalibrate); DDX_Control(pDX, IDC_SLEEP, m_CSleep); DDX_Control(pDX, IDC_SHUTDOWN, m_CShutdown); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCapViewer, CDialog) //{{AFX_MSG_MAP(CCapViewer) ON_BN_CLICKED(IDC_RECORD, OnCapture) ON_BN_CLICKED(IDC_CALIBRATION, OnCalibration) ON_BN_CLICKED(IDC_SHUTDOWN, OnShutdown) ON_WM_DESTROY() ON_BN_CLICKED(IDC_SLEEP, OnSleep) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCapViewer message handlers void RunBatteryMonitorThread(void *lpParam) { CCapViewer *pCapViewer = (CCapViewer*)lpParam; char portBM[64]; UINT batteryPercent; HANDLE hBM; char display[20]; if (!GetPrivateProfileString("PORTS", "BAT_MON_PORT", PARAMNOTFOUND, portBM, MAX_PATH, CONFIGURATION_FILE_PATH)) return; hBM = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if(hBM == INVALID_HANDLE_VALUE) return; DCB m_dcb; if (!GetCommState(hBM, &m_dcb)) return; // **important** : // BuildCommDCB uses no handshaking protocol for DCB // PentaMetric device requires no hardware handshaking if (!BuildCommDCB("2400,n,8,1", &m_dcb)) return; if (!SetCommState(hBM, &m_dcb)) return; while (true) { batteryPercent = pCapViewer->ReadBatteryFull(hBM); sprintf(display, "%d%s", batteryPercent, "% Full"); pCapViewer->m_CBatteryPercent.SetWindowText(display); pCapViewer->m_CBatteryBar.MoveWindow(943, 102, 39, 484-(484 * batteryPercent) / 100, TRUE); Sleep(2000); } } UINT CCapViewer::ReadBatteryFull(HANDLE portHandle) { UCHAR echo[2]; UINT nBatteryFull = 0; DWORD dwMask, dwRet; UCHAR READ_BATTERYFULL[SHORT_READ_CMD] = {SHORT_READ, BATTERYFULL_CMD, BATTERYFULL_CMD_LEN, BATTERYFULL_CMD_CHS}; WriteFile(portHandle, READ_BATTERYFULL, SHORT_READ_CMD, &dwRet, NULL); dwMask = EV_RXCHAR | EV_RXFLAG | EV_ERR; SetCommMask(portHandle, dwMask); if(WaitCommEvent(portHandle, &dwMask, NULL)) { if(dwMask & EV_RXCHAR) { memset(echo, 0, 2); ReadFile(portHandle, echo, 2, &dwRet, NULL); nBatteryFull = echo[0]; } } return nBatteryFull; } void RunRecordDataThread(void *lpParam) { sRemoveAllRecordStoppingConditions(); CCapViewer *pCapViewer = (CCapViewer*)lpParam; /* Select all devices */ sSelectDevice(NULL, FALSE, TRUE, NULL); /* Start recording */ sRecord(swoWAIT_TO_START); } void RunCalibrationThread(void *lpParam) { /* Select all devices */ sSelectDevice(NULL, FALSE, TRUE, NULL); /* Start live capture */ sLive(swoWAIT_TO_START); } void CCapViewer::OnCapture() { // TODO: Add your control notification handler code here /* Disable stream filters for recording phase */ sEnableStreamFilterDataRecord(hWideangleCam, hWideangleStreamFilter, 0); sEnableStreamFilterDataRecord(hTelephotoCam, hTelephotoStreamFilter, 0); /* Disable other buttons */ m_CCalibrate.EnableWindow(FALSE); m_CSleep.EnableWindow(FALSE); m_CShutdown.EnableWindow(FALSE); m_CInfoBox.SetWindowText("Recording in progress"); HBITMAP hBitmap; /* Record Button */ hBitmap = (HBITMAP) LoadImage(NULL, szRecordOn, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CRecord.MoveWindow(100, 100, 320, 192, TRUE); m_CRecord.SetBitmap(hBitmap); /* Calibration Button */ hBitmap = (HBITMAP) LoadImage(NULL, szCalibrate, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CCalibrate.MoveWindow(100, 392, 320, 192, TRUE); m_CCalibrate.SetBitmap(hBitmap); m_bRecord = !m_bRecord; if(m_bRecord) { m_CInfoBox.SetWindowText("Recording in progress"); _beginthread(RunRecordDataThread, 0, this); } else { sStop(); /* Change record button back */ hBitmap = (HBITMAP) LoadImage(NULL, szRecord, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CRecord.MoveWindow(100, 100, 320, 192, TRUE); m_CRecord.SetBitmap(hBitmap); /* Enable the rest of the buttons */ m_CCalibrate.EnableWindow(TRUE); m_CSleep.EnableWindow(TRUE); m_CShutdown.EnableWindow(TRUE); m_CInfoBox.SetWindowText("Recording cancelled"); } } void CCapViewer::OnCalibration() { // TODO: Add your control notification handler code here /* Enable stream filters for recording phase */ sEnableStreamFilterDataRecord(hWideangleCam, hWideangleStreamFilter, 1); sEnableStreamFilterDataRecord(hTelephotoCam, hTelephotoStreamFilter, 1); HBITMAP hBitmap; m_bCalibration = !m_bCalibration; /* Create Record Button */ hBitmap = (HBITMAP) LoadImage(NULL, szRecord, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CRecord.MoveWindow(100, 100, 320, 192, TRUE); m_CRecord.SetBitmap(hBitmap); /* Disable other buttons */ m_CRecord.EnableWindow(FALSE); m_CSleep.EnableWindow(FALSE); m_CShutdown.EnableWindow(FALSE); if(m_bCalibration) { /* Show "calibrate" button */ hBitmap = (HBITMAP) LoadImage(NULL, szCalibrateOn, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); _beginthread(RunCalibrationThread, 0, NULL); } else { /* Show "calibrating" button */ hBitmap = (HBITMAP) LoadImage(NULL, szCalibrate, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); sStop(); /* Enable the rest of the buttons */ m_CRecord.EnableWindow(TRUE); m_CSleep.EnableWindow(TRUE); m_CShutdown.EnableWindow(TRUE); } /* Change button back */ m_CCalibrate.MoveWindow(100, 392, 320, 192, TRUE); m_CCalibrate.SetBitmap(hBitmap); } BOOL CCapViewer::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_pDevCfg = (CDeviceConfig *) new CDeviceConfig(g_lpszCfgPath); hPwModule = LoadLibrary("powrprof.dll"); HBITMAP hBitmap; /* Main window */ MoveWindow(0, 0, 1280, 768, TRUE); m_CInfoBox.MoveWindow(100, 430, 150, 350, TRUE); /* Create Record button */ hBitmap = (HBITMAP) LoadImage(NULL, szRecord, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CRecord.MoveWindow(100, 100, 320, 192, TRUE); m_CRecord.SetBitmap(hBitmap); /* Create Calibration button */ hBitmap = (HBITMAP) LoadImage(NULL, szCalibrate, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CCalibrate.MoveWindow(100, 392, 320, 192, TRUE); m_CCalibrate.SetBitmap(hBitmap); /* Create Sleep button */ hBitmap = (HBITMAP) LoadImage(NULL, szSleep, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CSleep.MoveWindow(520, 100, 320, 192, TRUE); m_CSleep.SetBitmap(hBitmap); /* Create Shutdown button */ hBitmap = (HBITMAP) LoadImage(NULL, szShutdown, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CShutdown.MoveWindow(520, 392, 320, 192, TRUE); m_CShutdown.SetBitmap(hBitmap); /* // Battery meter hBitmap = (HBITMAP) LoadImage(NULL, szBatteryMeter, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CBatteryMeter.SetBitmap(hBitmap); m_CBatteryMeter.MoveWindow(940, 100, 45, 484, TRUE); m_CBatteryPercent.MoveWindow(940, 590, 100, 50, TRUE); */ /* Needs to be called twice for some reason */ ShowCursor(FALSE); ShowCursor(FALSE); // Set up the instruments with the correct settings and enable text logging InitializeDeviceSettings(); //_beginthread(RunBatteryMonitorThread, 0, this); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CCapViewer::OnShutdown() { // TODO: Add your control notification handler code here HANDLE hToken; TOKEN_PRIVILEGES tkp; if(m_bCalibration | m_bRecord) { sStop(); // Wait long enough for stream 5 to end its work; Sleep(3000); } if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return; if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) return; //PostQuitMessage(0); } void CCapViewer::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here if(hPwModule) FreeLibrary(hPwModule); ShowCursor(TRUE); ShowCursor(TRUE); } void CCapViewer::OnSleep() { // TODO: Add your control notification handler code here sStop(); OnDestroy(); // record button HBITMAP hBitmap; hBitmap = (HBITMAP) LoadImage(NULL, szRecord, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CRecord.MoveWindow(100, 100, 320, 192, TRUE); m_CRecord.SetBitmap(hBitmap); // calibration button hBitmap = (HBITMAP) LoadImage(NULL, szCalibrate, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_CCalibrate.MoveWindow(100, 392, 320, 192, TRUE); m_CCalibrate.SetBitmap(hBitmap); SetSuspendState setState =(SetSuspendState ) GetProcAddress(hPwModule, "SetSuspendState"); //setState(SET_HIBERNATE, TRUE, FALSE); setState(SET_SLEEP, TRUE, FALSE); } LRESULT CCapViewer::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case UM_CALIBRATION_DONE : OnCalibration(); break; } return CDialog::WindowProc(message, wParam, lParam); }