#include "stdafx.h"
#include "MorphisChannelSwitching.h"
#include "MorphisChannelSwitchingDlg.h"
#include ".\morphischannelswitchingdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMorphisChannelSwitchingDlg::CMorphisChannelSwitchingDlg(CWnd* pParent )
: CDialog(CMorphisChannelSwitchingDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
InitializeCriticalSection(&Lock);
}
CMorphisChannelSwitchingDlg::~CMorphisChannelSwitchingDlg()
{
DeleteCriticalSection(&Lock);
}
void CMorphisChannelSwitchingDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SLIDER_LOCK_SENSITIVITY, SliderLockSensitivity);
DDX_Control(pDX, IDC_LOCK_SENSITIVITY, LockSensitivity);
DDX_Control(pDX, IDC_GainLuma, GainLuma);
DDX_Control(pDX, IDC_CONTRAST, Contrast);
DDX_Control(pDX, IDC_BRIGHTNESS, Brightness);
DDX_Control(pDX, IDC_SLIDER_GainLuma, SliderGainLuma);
DDX_Control(pDX, IDC_SLIDER_CONTRAST, SliderContrast);
DDX_Control(pDX, IDC_SLIDER_BRIGHTNESS, SliderBrightness);
DDX_Control(pDX, IDC_CHECK_SET_ALL_CHANNELS, SetAllChannels);
DDX_Control(pDX, IDC_EDIT_NBR_OF_CHANNELS, NumberOfChannels);
DDX_Control(pDX, IDC_COMBO_DIG_TO_USE, ComboDigitizers);
}
BEGIN_MESSAGE_MAP(CMorphisChannelSwitchingDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_LOCK_SENSITIVITY,
OnNMReleasedcaptureSliderLockSensitivity)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_GainLuma, OnNMReleasedcaptureSliderGainLuma)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_CONTRAST, OnNMReleasedcaptureSliderContrast)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_BRIGHTNESS, OnNMReleasedcaptureSliderBrightness)
ON_BN_CLICKED(IDC_CHECK_SET_ALL_CHANNELS, OnBnClickedCheckSetAllChannels)
ON_CBN_SELCHANGE(IDC_COMBO_DIG_TO_USE, OnCbnSelchangeComboDigToUse)
ON_BN_CLICKED(IDC_BUTTON_START, OnBnClickedButtonStart)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnBnClickedButtonStop)
ON_BN_CLICKED(IDC_RADIO0, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO1, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO2, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO3, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO4, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO5, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO6, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO7, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO8, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO9, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO10, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO11, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO12, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO13, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO14, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO15, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO18_ANY, OnBnClickedRadioField)
ON_BN_CLICKED(IDC_RADIO19_ODD, OnBnClickedRadioField)
ON_BN_CLICKED(IDC_RADIO20_EVEN, OnBnClickedRadioField)
ON_BN_CLICKED(IDC_CHECK_AUTO_GAIN, OnBnClickedCheckAutoGain)
ON_BN_CLICKED(IDC_CHANNEL_ENABLED, OnBnClickedChannelEnabled)
ON_EN_CHANGE(IDC_EDIT_OVERLAY, OnEnChangeEditOverlay)
ON_WM_TIMER()
END_MESSAGE_MAP()
BOOL CMorphisChannelSwitchingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
ShowWindow(SW_NORMAL);
m_MilApplication = m_MilSystem = m_MilDisplay = m_MilImageDisp = M_NULL;
memset(m_MilImageDispChild, 0 , sizeof(m_MilImageDispChild));
memset(m_ThreadHandle, 0 , sizeof(m_ThreadHandle));
MIL_INT i;
for (i = 0; i < 16; i++)
m_ChannelInfo[i].Init();
for (i = 0; i < MAX_DIGITIZERS; i++)
m_DigInfo[i].Init();
OnBnClickedButtonStop();
SetTimer(0, 1000, NULL);
return TRUE;
}
void CMorphisChannelSwitchingDlg::OnCancel()
{
OnBnClickedButtonStop();
CDialog::OnCancel();
}
void CMorphisChannelSwitchingDlg::OnBnClickedButtonStart()
{
CString InputText;
MIL_INT NbrOfChannels = 0;
NumberOfChannels.GetWindowText(InputText);
m_NumberOfChannels = _ttoi((LPCTSTR)InputText);
m_NumberOfChannels = min(m_NumberOfChannels, 16);
m_NumberOfChannels = max(m_NumberOfChannels, 1);
InputText.Format(_T("%d"), m_NumberOfChannels);
NumberOfChannels.SetWindowText(InputText);
m_SelectedChannel = -1;
SliderLockSensitivity.EnableWindow(TRUE);
SliderGainLuma.EnableWindow(TRUE);
SliderContrast.EnableWindow(TRUE);
SliderBrightness.EnableWindow(TRUE);
if(GetCheckedRadioButton(IDC_RADIO16_FIELD, IDC_RADIO17_FRAME) == IDC_RADIO17_FRAME)
m_GrabFieldNum = 2;
else
m_GrabFieldNum = 1;
GetDlgItem(IDC_EDIT_OVERLAY)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_DIG_TO_USE)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_SET_ALL_CHANNELS)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO18_ANY)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO19_ODD)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO20_EVEN)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_AUTO_GAIN)->EnableWindow(TRUE);
GetDlgItem(IDC_CHANNEL_ENABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NBR_OF_CHANNELS)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO16_FIELD)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO17_FRAME)->EnableWindow(FALSE);
LRESULT Result;
OnNMReleasedcaptureSliderLockSensitivity(NULL, &Result);
OnNMReleasedcaptureSliderGainLuma(NULL, &Result);
OnNMReleasedcaptureSliderContrast(NULL, &Result);
OnNMReleasedcaptureSliderBrightness(NULL, &Result);
AllocateMILSystem();
}
void CMorphisChannelSwitchingDlg::OnBnClickedButtonStop()
{
FreeMILSystem();
CString InputText;
NumberOfChannels.GetWindowText(InputText);
m_NumberOfChannels = _ttoi((LPCTSTR)InputText);
if(!m_NumberOfChannels)
{
m_NumberOfChannels = 4;
NumberOfChannels.SetWindowText(_T("4"));
}
m_SelectedChannel = 0;
m_GrabFieldNum = 1;
SliderLockSensitivity.SetRange(15, 255);
SliderGainLuma.SetRange(1,255);
SliderContrast.SetRange(1,255);
SliderBrightness.SetRange(1,255);
SliderLockSensitivity.SetPos(60);
SliderGainLuma.SetPos(20);
SliderContrast.SetPos(128);
SliderBrightness.SetPos(128);
GetDlgItem(IDC_STATIC_STAT_DIG0)->SetWindowText(_T("Digitizer 0:"));
GetDlgItem(IDC_STATIC_STAT_DIG1)->SetWindowText(_T("Digitizer 1:"));
GetDlgItem(IDC_STATIC_STAT_DIG2)->SetWindowText(_T("Digitizer 2:"));
GetDlgItem(IDC_STATIC_STAT_DIG3)->SetWindowText(_T("Digitizer 3:"));
GetDlgItem(IDC_STATIC_STAT_TOTAL)->SetWindowText(_T("Total:"));
((CButton*)GetDlgItem(IDC_RADIO0))->SetCheck(BST_CHECKED);
for(int i = 0; i < 16; i++)
GetDlgItem(IDC_RADIO0 + i)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_SET_ALL_CHANNELS)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_DIG_TO_USE)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_OVERLAY)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO18_ANY)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO19_ODD)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO20_EVEN)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_AUTO_GAIN)->EnableWindow(FALSE);
GetDlgItem(IDC_CHANNEL_ENABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NBR_OF_CHANNELS)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO16_FIELD)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO17_FRAME)->EnableWindow(TRUE);
SetAllChannels.SetCheck(TRUE);
SliderLockSensitivity.EnableWindow(FALSE);
SliderGainLuma.EnableWindow(FALSE);
SliderContrast.EnableWindow(FALSE);
SliderBrightness.EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_OVERLAY)->EnableWindow(FALSE);
CheckRadioButton(IDC_RADIO16_FIELD, IDC_RADIO17_FRAME, IDC_RADIO16_FIELD);
CheckRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN, IDC_RADIO18_ANY);
((CButton *)GetDlgItem(IDC_CHECK_AUTO_GAIN))->SetCheck(TRUE);
((CButton *)GetDlgItem(IDC_CHANNEL_ENABLED))->SetCheck(TRUE);
m_MilApplication = m_MilSystem = m_MilDisplay = m_MilImageDisp = M_NULL;
memset(m_MilImageDispChild, 0 , sizeof(m_MilImageDispChild));
memset(m_ThreadHandle, 0 , sizeof(m_ThreadHandle));
for (int i = 0; i < 16; i++)
m_ChannelInfo[i].Init();
for (int i = 0; i < MAX_DIGITIZERS; i++)
m_DigInfo[i].Init();
}
void CMorphisChannelSwitchingDlg::AllocateMILSystem()
{
MIL_INT i = 0;
MIL_INT NbGrab = 0;
MIL_INT DigSizeBand = 1;
MIL_INT DigSizeX = 0;
MIL_INT DigSizeY = 0;
MIL_INT DispNbrImageX = 0;
MIL_INT DispNbrImageY = 0;
MIL_INT x, y;
DWORD ThreadId[MAX_DIGITIZERS];
MIL_INT NbrOfCamerasPresent = 0;
MIL_INT NbrOfCamerasPerDig = 0;
MIL_INT NbrOfDigitizers = 0;
MIL_INT DigIndex = 0;
MappAlloc(M_NULL, M_DEFAULT, &m_MilApplication);
MsysAlloc(M_DEFAULT, M_SYSTEM_MORPHIS, M_DEFAULT, M_DEFAULT, &m_MilSystem);
MsysControl(m_MilSystem, M_TIMEOUT, 1);
MdispAlloc(m_MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &m_MilDisplay);
NbrOfDigitizers = MsysInquire(m_MilSystem, M_DIGITIZER_NUM, M_NULL);
for(i = 0; i < NbrOfDigitizers; i++)
{
CString Combo;
MdigAlloc(m_MilSystem, Device[i], MIL_TEXT("M_DEFAULT"), M_DEFAULT,
&m_DigInfo[i].MilDigitizer);
MdigControl(m_DigInfo[i].MilDigitizer, M_GRAB_FIELD_NUM, m_GrabFieldNum);
MdigControl(m_DigInfo[i].MilDigitizer, M_GRAB_TIMEOUT, 1000);
Combo.Format(MIL_TEXT("%d"), i);
ComboDigitizers.AddString(Combo);
m_DigInfo[i].MilSystem = m_MilSystem;
m_DigInfo[i].DeviceNumber = i;
m_DigInfo[i].pMorphisChannelSwitchingDlg = this;
}
ComboDigitizers.SetCurSel(0);
DigSizeBand = MdigInquire(m_DigInfo[0].MilDigitizer, M_SIZE_BAND, M_NULL);
DigSizeX = MdigInquire(m_DigInfo[0].MilDigitizer, M_SIZE_X, M_NULL);
DigSizeY = MdigInquire(m_DigInfo[0].MilDigitizer, M_SIZE_Y, M_NULL);
if(m_GrabFieldNum == 1)
{
DigSizeX /= 2;
DigSizeY /= 2;
}
switch(m_NumberOfChannels)
{
case 1:
DispNbrImageX = 1; DispNbrImageY = 1; break;
case 2:
DispNbrImageX = 2; DispNbrImageY = 1; break;
case 3:
case 4:
DispNbrImageX = 2; DispNbrImageY = 2; break;
case 5:
case 6:
DispNbrImageX = 3; DispNbrImageY = 2; break;
case 7:
case 8:
case 9:
DispNbrImageX = 3; DispNbrImageY = 3; break;
case 10:
case 11:
case 12:
DispNbrImageX = 4; DispNbrImageY = 3; break;
default:
DispNbrImageX = 4; DispNbrImageY = 4; break;
}
MappControl(M_DEFAULT, M_ERROR, M_PRINT_DISABLE);
MbufAllocColor(m_MilSystem,
DigSizeBand,
(MIL_INT) (DigSizeX * DispNbrImageX),
(MIL_INT) (DigSizeY * DispNbrImageY),
8L+M_UNSIGNED,
M_IMAGE + M_DISP + M_VIDEO_MEMORY + (DigSizeBand==3? M_YUV16 + M_PACKED: 0),
&m_MilImageDisp);
if(m_MilImageDisp == 0)
MbufAllocColor(m_MilSystem,
DigSizeBand,
(MIL_INT) (DigSizeX * DispNbrImageX),
(MIL_INT) (DigSizeY * DispNbrImageY),
8L+M_UNSIGNED,
M_IMAGE + M_DISP + (DigSizeBand == 3? M_YUV16 + M_PACKED: 0),
&m_MilImageDisp);
MbufClear(m_MilImageDisp, 128L);
MdispSelect(m_MilDisplay, m_MilImageDisp);
MappControl(M_DEFAULT, M_ERROR, M_PRINT_ENABLE);
i = 0;
for(y = 0; y < DispNbrImageY; y++)
{
for(x = 0; x < DispNbrImageX; x++)
{
MbufChild2d(m_MilImageDisp,
(MIL_INT)(DigSizeX * x),
(MIL_INT)(DigSizeY * y),
(MIL_INT)(DigSizeX ),
(MIL_INT)(DigSizeY ),
&m_MilImageDispChild[i++]);
}
}
NbrOfCamerasPerDig = (MIL_INT)((m_NumberOfChannels / (double)NbrOfDigitizers) + 0.5);
DigIndex = -1;
for(i = 0; i < m_NumberOfChannels; i++)
{
MIL_ID MilGrabBuffer;
MbufAllocColor(m_MilSystem, DigSizeBand, DigSizeX, DigSizeY,
8L+M_UNSIGNED,
M_IMAGE + M_GRAB + (DigSizeBand == 3? M_YUV16 + M_PACKED:0),
&MilGrabBuffer);
MbufClear(MilGrabBuffer, 0);
if(NbrOfCamerasPerDig)
{
if((i % NbrOfCamerasPerDig) == 0)
DigIndex++;
}
else
DigIndex =0;
m_ChannelInfo[i].pDigInfo = &m_DigInfo[DigIndex%NbrOfDigitizers];
m_ChannelInfo[i].Index = i;
m_ChannelInfo[i].MilChannel = Channel[i];
m_ChannelInfo[i].MilImageDisp = m_MilImageDispChild[i];
m_ChannelInfo[i].MilGrabBuffer = MilGrabBuffer;
m_ChannelInfo[i].OverlayText.Format(_T("Camera %d"), i);
}
m_Exit = 0;
for(i = 0; i < NbrOfDigitizers; i++)
{
m_ThreadHandle[i]=(HANDLE) CreateThread(NULL, 0L,
(LPTHREAD_START_ROUTINE) &ChannelSwitchingThread,
&m_DigInfo[i], 0L, &(ThreadId[i]));
MosSleep(500);
}
return;
}
void CMorphisChannelSwitchingDlg::FreeMILSystem()
{
MIL_INT i;
m_Exit = true;
for(i = 0; i < MAX_DIGITIZERS; i++)
if(m_ThreadHandle[i])
{
EnterCriticalSection(&Lock);
WaitForSingleObject(m_ThreadHandle[i], INFINITE);
LeaveCriticalSection(&Lock);
}
for(i = 0; i < MAX_DIGITIZERS; i++)
{
CloseHandle(m_ThreadHandle[i]);
}
for (i = 0; i < 16; i++)
{
m_ChannelInfo[i].pDigInfo = NULL;
if(m_ChannelInfo[i].MilGrabBuffer)
MbufFree(m_ChannelInfo[i].MilGrabBuffer);
if(m_MilImageDispChild[i])
MbufFree(m_MilImageDispChild[i]);
}
if(m_MilImageDisp)
MbufFree(m_MilImageDisp);
for(i = 0; i < MAX_DIGITIZERS; i++)
if(m_DigInfo[i].MilDigitizer)
{
MdigFree(m_DigInfo[i].MilDigitizer);
}
if(m_MilDisplay)
MdispFree(m_MilDisplay);
if(m_MilSystem)
MsysFree(m_MilSystem);
if(m_MilApplication)
MappFree(m_MilApplication);
m_MilApplication = m_MilSystem = m_MilDisplay = m_MilImageDisp = M_NULL;
memset(m_MilImageDispChild, 0 , sizeof(m_MilImageDispChild));
memset(m_ThreadHandle, 0 , sizeof(m_ThreadHandle));
for (i = 0; i < 16; i++)
m_ChannelInfo[i].Init();
for (i = 0; i < MAX_DIGITIZERS; i++)
m_DigInfo[i].Init();
ComboDigitizers.ResetContent();
return;
}
unsigned int CMorphisChannelSwitchingDlg::ChannelSwitchingThread(void *TParam)
{
DIG_DEVICE_INFO *pDigInfo = (DIG_DEVICE_INFO *)TParam;
CMorphisChannelSwitchingDlg *pThis =
(CMorphisChannelSwitchingDlg *) pDigInfo->pMorphisChannelSwitchingDlg;
CHANNEL_INFO *pChannelInfo = pThis->m_ChannelInfo;
CHANNEL_INFO *pCurChannel = NULL;
CHANNEL_INFO *pPrevChannel = NULL;
MIL_ID MilDigitizer = pDigInfo->MilDigitizer;
MIL_ID MilSystem = pDigInfo->MilSystem;
MIL_INT Index = 0;
MIL_INT i = 0;
double TimeStart, TimeStartFrameRate, TimeEnd;
MIL_INT CameraCount = 0;
double CurrentTime;
MIL_INT LockSensitivity = -1;
MIL_INT MilChannel = -1;
MIL_INT GrabStartMode = -1;
MIL_INT GrabAutoGain = -1;
MIL_INT GainLuma = -1;
MIL_INT Contrast = -1;
MIL_INT Brightness = -1;
MdigControl(MilDigitizer, M_CAMERA_LOCK, M_DISABLE);
MdigControl(MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS_QUEUED);
if(pThis->m_GrabFieldNum == 1)
MdigControl(MilDigitizer, M_GRAB_SCALE_X, 0.5);
MappControl(M_DEFAULT, M_ERROR, M_PRINT_DISABLE);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
MappTimer(M_DEFAULT, M_TIMER_READ, &TimeStart);
TimeStartFrameRate = TimeStart;
Index = 0;
i = 0;
while(!pThis->m_Exit)
{
MappTimer(M_DEFAULT, M_TIMER_READ, &CurrentTime);
if(Index < (pThis->m_NumberOfChannels-1))
Index++;
else
{
Index = 0;
if(CameraCount == 0)
{
GainLuma = Contrast = Brightness = -1;
MilChannel = LockSensitivity = GrabStartMode = GrabAutoGain = -1;
pDigInfo->AvgFrameRate = 0;
pDigInfo->AvgFrameRateCurrent = 0;
MosSleep(1000);
}
CameraCount = 0;
}
if(pChannelInfo[Index].pDigInfo == NULL)
continue;
if(MilDigitizer != pChannelInfo[Index].pDigInfo->MilDigitizer)
continue;
pCurChannel = &pChannelInfo[Index];
if(pDigInfo->NbrFramesGrabbed == 0)
{
pPrevChannel = pCurChannel = &pChannelInfo[Index];
MdigControl(MilDigitizer, M_CHANNEL, pPrevChannel->MilChannel);
}
if(pCurChannel->IsEnabled)
{
CameraCount++;
MdigGrab(MilDigitizer, pPrevChannel->MilGrabBuffer);
if(LockSensitivity != pCurChannel->LockSensitivity)
MdigControl(MilDigitizer, M_CAMERA_LOCK_SENSITIVITY, pCurChannel->LockSensitivity);
if(MilChannel != pCurChannel->MilChannel)
MdigControl(MilDigitizer, M_CHANNEL, pCurChannel->MilChannel);
if(GrabStartMode != pCurChannel->GrabStartMode)
MdigControl(MilDigitizer, M_GRAB_START_MODE, pCurChannel->GrabStartMode);
if(pCurChannel->UseAutomaticInputGain)
{
if(GrabAutoGain != M_ENABLE)
MdigControl(MilDigitizer, M_GRAB_AUTOMATIC_INPUT_GAIN, M_ENABLE);
}
else
{
if(GrabAutoGain != M_DISABLE)
MdigControl(MilDigitizer, M_GRAB_AUTOMATIC_INPUT_GAIN, M_DISABLE);
if(GainLuma != pCurChannel->GainLuma)
MdigControl(MilDigitizer, M_GRAB_INPUT_GAIN, pCurChannel->GainLuma);
}
if(Contrast != pCurChannel->Contrast)
MdigControl(MilDigitizer, M_CONTRAST_REF, (double)pCurChannel->Contrast);
if(Brightness != pCurChannel->Brightness)
MdigControl(MilDigitizer, M_BRIGHTNESS_REF, (double)pCurChannel->Brightness);
LockSensitivity = pCurChannel->LockSensitivity;
MilChannel = pCurChannel->MilChannel;
GrabAutoGain = pCurChannel->UseAutomaticInputGain? M_ENABLE: M_DISABLE;
GrabStartMode = pCurChannel->GrabStartMode;
GainLuma = pCurChannel->GainLuma;
Contrast = pCurChannel->Contrast;
Brightness = pCurChannel->Brightness;
MgraText(M_DEFAULT, pPrevChannel->MilGrabBuffer, 10, 10,
pPrevChannel->OverlayText.GetBuffer());
MbufCopy(pPrevChannel->MilGrabBuffer, pPrevChannel->MilImageDisp);
MdigGrabWait(MilDigitizer, M_GRAB_END);
if(MappGetError(M_DEFAULT, M_CURRENT, M_NULL))
{
MdigControl(MilDigitizer, M_CHANNEL, pPrevChannel->MilChannel);
MosSleep(CAMERA_PRESENT_TIME_IN_MS);
if(MdigInquire(MilDigitizer, M_CAMERA_PRESENT, M_NULL) == 0)
{
MIL_INT Channel = pPrevChannel->Index;
CString ChannelText;
ChannelText.Format(_T("~Camera %d"), Channel);
if(!pThis->m_Exit)
{
EnterCriticalSection(&pThis->Lock);
pThis->GetDlgItem(IDC_RADIO0 + (int)Channel)->SetWindowText(ChannelText);
LeaveCriticalSection(&pThis->Lock);
}
pPrevChannel->IsEnabled = false;
}
MdigControl(MilDigitizer, M_CHANNEL, pCurChannel->MilChannel);
MosSleep(CAMERA_PRESENT_TIME_IN_MS);
GainLuma = Contrast = Brightness = -1;
MilChannel = LockSensitivity = GrabStartMode = GrabAutoGain = -1;
}
pDigInfo->NbrFramesGrabbed++;
if((pDigInfo->NbrFramesGrabbed % 50) == 0)
{
MappTimer(M_DEFAULT, M_TIMER_READ, &TimeEnd);
pDigInfo->AvgFrameRateCurrent = 50.0/(TimeEnd-TimeStartFrameRate);
pDigInfo->AvgFrameRate = pDigInfo->NbrFramesGrabbed/((TimeEnd- TimeStart));
MappTimer(M_DEFAULT, M_TIMER_READ, &TimeStartFrameRate);
}
pPrevChannel = pCurChannel;
}
}
return 0;
}
void CMorphisChannelSwitchingDlg::OnNMReleasedcaptureSliderLockSensitivity(NMHDR *pNMHDR,
LRESULT *pResult)
{
CString Text;
Text.Format(MIL_TEXT("%d"),SliderLockSensitivity.GetPos());
LockSensitivity.SetWindowText(Text);
UpdateChannelSettings();
*pResult = 0;
}
void CMorphisChannelSwitchingDlg::OnNMReleasedcaptureSliderGainLuma(NMHDR *pNMHDR,
LRESULT *pResult)
{
CString Text;
Text.Format(MIL_TEXT("%d"),SliderGainLuma.GetPos());
GainLuma.SetWindowText(Text);
UpdateChannelSettings();
*pResult = 0;
}
void CMorphisChannelSwitchingDlg::OnNMReleasedcaptureSliderContrast(NMHDR *pNMHDR,
LRESULT *pResult)
{
CString Text;
Text.Format(MIL_TEXT("%d"),SliderContrast.GetPos());
Contrast.SetWindowText(Text);
UpdateChannelSettings();
*pResult = 0;
}
void CMorphisChannelSwitchingDlg::OnNMReleasedcaptureSliderBrightness(NMHDR *pNMHDR,
LRESULT *pResult)
{
CString Text;
Text.Format(MIL_TEXT("%d"),SliderBrightness.GetPos());
Brightness.SetWindowText(Text);
UpdateChannelSettings();
*pResult = 0;
}
void CMorphisChannelSwitchingDlg::OnEnChangeEditOverlay()
{
CString InputText;
GetDlgItem(IDC_EDIT_OVERLAY)->GetWindowText(InputText);
if(m_SelectedChannel != -1)
m_ChannelInfo[m_SelectedChannel].OverlayText = InputText;
else
for(MIL_INT i = 0; i < m_NumberOfChannels; i++)
m_ChannelInfo[i].OverlayText = InputText;
}
void CMorphisChannelSwitchingDlg::OnBnClickedCheckAutoGain()
{
UpdateChannelSettings();
}
void CMorphisChannelSwitchingDlg::OnBnClickedChannelEnabled()
{
if(m_SelectedChannel != -1)
{
m_ChannelInfo[m_SelectedChannel].IsEnabled =
(((CButton *)GetDlgItem(IDC_CHANNEL_ENABLED))->GetCheck())? true: false;
}
UpdateChannelSettings();
}
void CMorphisChannelSwitchingDlg::OnBnClickedCheckSetAllChannels()
{
CString ChannelSettingsText;
MIL_INT EnableChannels = !(SetAllChannels.GetCheck());
if(EnableChannels)
{
m_SelectedChannel = GetCheckedRadioButton(IDC_RADIO0, IDC_RADIO15) - IDC_RADIO0;
m_SelectedChannel = max(m_SelectedChannel, 0);
ChannelSettingsText.Format(_T("Camera %d acquisition settings"), m_SelectedChannel);
switch(m_ChannelInfo[m_SelectedChannel].GrabStartMode)
{
case M_FIELD_START_ODD:
CheckRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN, IDC_RADIO19_ODD);
break;
case M_FIELD_START_EVEN:
CheckRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN, IDC_RADIO20_EVEN);
break;
default:
case M_FIELD_START:
CheckRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN, IDC_RADIO18_ANY);
break;
}
ComboDigitizers.SetCurSel((int)m_ChannelInfo[m_SelectedChannel].pDigInfo->DeviceNumber);
GetDlgItem(IDC_CHANNEL_ENABLED)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_OVERLAY)->SetWindowText(
m_ChannelInfo[m_SelectedChannel].OverlayText);
UpdateDisplayChannelSettings(m_SelectedChannel);
}
else
{
m_SelectedChannel = -1;
ChannelSettingsText.Format(_T("Set all camera acquisition settings"));
GetDlgItem(IDC_CHANNEL_ENABLED)->EnableWindow(FALSE);
}
GetDlgItem(IDC_STATIC_CHANNEL_SETTINGS)->SetWindowText(ChannelSettingsText);
UpdateChannelSettings();
for(int i = 0; i < 16; i++)
{
if(i < m_NumberOfChannels)
GetDlgItem(IDC_RADIO0 + i)->EnableWindow((BOOL)EnableChannels);
else
GetDlgItem(IDC_RADIO0 + i)->EnableWindow(FALSE);
}
}
void CMorphisChannelSwitchingDlg::OnBnClickedRadio()
{
OnBnClickedCheckSetAllChannels();
}
void CMorphisChannelSwitchingDlg::OnBnClickedRadioField()
{
MIL_INT GrabStartModeRadioButton = 0;
MIL_INT MilGrabStartMode = 0;
GrabStartModeRadioButton = GetCheckedRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN);
if(GrabStartModeRadioButton == IDC_RADIO20_EVEN)
MilGrabStartMode = M_FIELD_START_EVEN;
else if(GrabStartModeRadioButton == IDC_RADIO19_ODD)
MilGrabStartMode = M_FIELD_START_ODD;
else
MilGrabStartMode = M_FIELD_START;
if(m_SelectedChannel == -1)
{
for(MIL_INT i = 0; i < m_NumberOfChannels; i++)
{
m_ChannelInfo[i].GrabStartMode = MilGrabStartMode;
}
}
else
{
m_ChannelInfo[m_SelectedChannel].GrabStartMode = MilGrabStartMode;
}
}
void CMorphisChannelSwitchingDlg::OnCbnSelchangeComboDigToUse()
{
MIL_INT CurSel = ComboDigitizers.GetCurSel();
if(m_SelectedChannel == -1)
{
for(MIL_INT i = 0; i < 16; i++)
{
m_ChannelInfo[i].pDigInfo = &m_DigInfo[CurSel];
}
}
else
{
m_ChannelInfo[m_SelectedChannel].pDigInfo = &m_DigInfo[CurSel];
}
}
void CMorphisChannelSwitchingDlg::UpdateChannelSettings()
{
if(m_SelectedChannel == -1)
{
for(MIL_INT i = 0; i < m_NumberOfChannels; i++)
{
UpdateChannelSettings(i);
}
}
else
{
UpdateChannelSettings(m_SelectedChannel);
}
}
void CMorphisChannelSwitchingDlg::UpdateChannelSettings(MIL_INT Channel)
{
MIL_INT GrabStartModeRadioButton = 0;
MIL_INT MilGrabStartMode = 0;
GrabStartModeRadioButton = GetCheckedRadioButton(IDC_RADIO18_ANY, IDC_RADIO20_EVEN);
if(GrabStartModeRadioButton == IDC_RADIO20_EVEN)
MilGrabStartMode = M_FIELD_START_EVEN;
else if(GrabStartModeRadioButton == IDC_RADIO19_ODD)
MilGrabStartMode = M_FIELD_START_ODD;
else
MilGrabStartMode = M_FIELD_START;
m_ChannelInfo[Channel].GrabStartMode = MilGrabStartMode;
m_ChannelInfo[Channel].LockSensitivity = SliderLockSensitivity.GetPos();
m_ChannelInfo[Channel].GainLuma = SliderGainLuma.GetPos();
m_ChannelInfo[Channel].Contrast = SliderContrast.GetPos();
m_ChannelInfo[Channel].Brightness = SliderBrightness.GetPos();
m_ChannelInfo[Channel].UseAutomaticInputGain =
(((CButton *)GetDlgItem(IDC_CHECK_AUTO_GAIN))->GetCheck())? true: false;
CString ChannelText;
if(m_ChannelInfo[Channel].IsEnabled)
ChannelText.Format(_T("Camera %d"), Channel);
else
ChannelText.Format(_T("~Camera %d"), Channel);
GetDlgItem(IDC_RADIO0 + (int)Channel)->SetWindowText(ChannelText);
if(m_ChannelInfo[Channel].UseAutomaticInputGain == false)
SliderGainLuma.EnableWindow(TRUE);
else
SliderGainLuma.EnableWindow(FALSE);
}
void CMorphisChannelSwitchingDlg::UpdateDisplayChannelSettings(MIL_INT Channel)
{
ComboDigitizers.SetCurSel((int)m_ChannelInfo[Channel].pDigInfo->DeviceNumber);
SliderLockSensitivity.SetPos((int)m_ChannelInfo[Channel].LockSensitivity);
SliderGainLuma.SetPos((int)m_ChannelInfo[Channel].GainLuma);
SliderContrast.SetPos((int)m_ChannelInfo[Channel].Contrast);
SliderBrightness.SetPos((int)m_ChannelInfo[Channel].Brightness);
((CButton *)GetDlgItem(IDC_CHECK_AUTO_GAIN))->SetCheck(
m_ChannelInfo[Channel].UseAutomaticInputGain);
((CButton *)GetDlgItem(IDC_CHANNEL_ENABLED))->SetCheck(m_ChannelInfo[Channel].IsEnabled);
if(m_ChannelInfo[Channel].UseAutomaticInputGain == false)
SliderGainLuma.EnableWindow(TRUE);
else
SliderGainLuma.EnableWindow(FALSE);
LRESULT Result;
OnNMReleasedcaptureSliderLockSensitivity(NULL, &Result);
OnNMReleasedcaptureSliderGainLuma(NULL, &Result);
OnNMReleasedcaptureSliderContrast(NULL, &Result);
OnNMReleasedcaptureSliderBrightness(NULL, &Result);
}
void CMorphisChannelSwitchingDlg::OnTimer(UINT_PTR nIDEvent)
{
MIL_INT NumberOfCameras[MAX_DIGITIZERS] = {0};
MIL_INT TotalFrames = 0;
MIL_INT TotalCameras = 0;
double AvrFrameRate = 0;
double AvrFrameRateCurrent = 0;
int i;
CString Statistics;
for(i = 0; i < m_NumberOfChannels; i++)
{
if(m_ChannelInfo[i].pDigInfo && m_ChannelInfo[i].IsEnabled)
{
MIL_INT Index = m_ChannelInfo[i].pDigInfo->DeviceNumber;
NumberOfCameras[Index]++;
}
}
for(i = 0; i < 4; i++)
{
TotalCameras += NumberOfCameras[i];
TotalFrames += m_DigInfo[i].NbrFramesGrabbed;
AvrFrameRate += m_DigInfo[i].AvgFrameRate;
AvrFrameRateCurrent += m_DigInfo[i].AvgFrameRateCurrent;
Statistics.Format(_T("Digitizer %1.1d:\t%9.4d frames, \t%d cameras,\t%5.2f fps ")
_T("(current)\t%5.2f fps"),
i, m_DigInfo[i].NbrFramesGrabbed, NumberOfCameras[i],
m_DigInfo[i].AvgFrameRateCurrent, m_DigInfo[i].AvgFrameRate);
GetDlgItem(IDC_STATIC_STAT_DIG0+i)->SetWindowText(Statistics);
if(m_DigInfo[i].MilDigitizer)
GetDlgItem(IDC_STATIC_STAT_DIG0+i)->EnableWindow(TRUE);
else
GetDlgItem(IDC_STATIC_STAT_DIG0+i)->EnableWindow(FALSE);
}
Statistics.Format(_T("Total: \t%9.4d frames, \t%d cameras,\t%5.2f fps ")
_T("(current)\t%5.2f fps"),
TotalFrames, TotalCameras, AvrFrameRateCurrent, AvrFrameRate);
GetDlgItem(IDC_STATIC_STAT_TOTAL)->SetWindowText(Statistics);
}
void CMorphisChannelSwitchingDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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
{
CDialog::OnPaint();
}
}
HCURSOR CMorphisChannelSwitchingDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}