User Tools

Site Tools


documentation:testcode
/*	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 <StreamsSDK.h>
#include "InstrumentSetup.h"
#include "message.h"
 
 
#include <process.h>
 
#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);
}
documentation/testcode.txt · Last modified: 2007/03/22 18:07 (external edit)