// DlgWaterfall.cpp : implementation file
//

#include "stdafx.h"
//
#include "DlgWaterfall.h"
#include "6046DryEndDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgWaterfall dialog


CDlgWaterfall::CDlgWaterfall(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgWaterfall::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgWaterfall)
	//}}AFX_DATA_INIT

	m_bSizing		= FALSE;
	m_Palette		= GREYSCALE;
	m_bProperties	= FALSE;
}


void CDlgWaterfall::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgWaterfall)
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgWaterfall, CDialog)
	//{{AFX_MSG_MAP(CDlgWaterfall)
	ON_WM_SHOWWINDOW()
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_GETMINMAXINFO()
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_PALETTE_BLUE, OnPaletteBlue)
	ON_COMMAND(ID_PALETTE_GREEN, OnPaletteGreen)
	ON_COMMAND(ID_PALETTE_RED, OnPaletteRed)
	ON_COMMAND(ID_PALETTE_GREYSCALE, OnPaletteGreyscale)
	ON_COMMAND(ID_PALETTE_INVERSEGREY, OnPaletteInversegrey)
	ON_COMMAND(ID_PALETTE_MIX2, OnPaletteMix2)
	ON_COMMAND(ID_PALETTE_OTHER, OnPaletteOther)
	ON_COMMAND(ID_PALETTE_RUST, OnPaletteRust)
	ON_COMMAND(ID_IMAGE_BRIGHTNESS, OnImageBrightness)
	ON_COMMAND(ID_SCALING_MEAN, OnScalingMean)
	ON_COMMAND(ID_SCALING_PEAK, OnScalingPeak)
	ON_COMMAND(ID_SCALING_RMS, OnScalingRms)
	ON_COMMAND(ID_PALETTE_SOIL, OnPaletteSoil)
	ON_WM_CREATE()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgWaterfall message handlers

BOOL CDlgWaterfall::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_wndMenu.LoadMenu(IDR_WATERFALL_MENU);
	SetMenu(&m_wndMenu);

	HICON icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	SetIcon(icon, FALSE);
	
	//RampColor();
	//SetTimer(1,300,NULL);

	pConfig = &((CMy6046DryEndApp*)AfxGetApp())->m_SystemConfig;
	
	LoadSettings();

	m_SSWindow.Configure(this, NULL, MAX_PING_BYTES, 100, 2,TOP_DOWN);
	m_SSWindow.SetAttributes(m_Palette, MEAN);
	m_SSWindow.SetBrightness(m_uiBrightness, TRUE);
	m_SSWindow.SetContrast(m_uiContrast, TRUE);
	
	CRect rect;
	GetWindowRect(&rect);
	POINT p = {rect.right, rect.top};
	m_dlgProperties.initPoint	= p;
	m_dlgProperties.pParent		= this;
	m_dlgProperties.m_dBrightness = m_uiBrightness;
	m_dlgProperties.m_dContrast	  = m_uiContrast;
	m_dlgProperties.Create(IDD_DLG_WFPROPERTIES, this);
	m_dlgProperties.ShowWindow(SW_HIDE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


void CDlgWaterfall::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
{
	lpMMI->ptMinTrackSize.x = 200;
	lpMMI->ptMinTrackSize.y = 225;

	CDialog::OnPaint();
	CDialog::OnGetMinMaxInfo(lpMMI);
}

void CDlgWaterfall::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
}


void CDlgWaterfall::OnDestroy() 
{
	//KillTimer(1);
	Sleep(100);
	SaveSettings();
	m_wndMenu.DestroyMenu();
	CDialog::OnDestroy();
}

void CDlgWaterfall::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	m_SSWindow.Refresh();
}	

/////////////////////////////////////////////////////////////////////////////////////////

BOOL CDlgWaterfall::AddNewProfile(BYTE	*PingData, int size)
{
	if(m_SSWindow.AddImageLine8(PingData, size))
		return TRUE;
	else
		return FALSE;
}

void CDlgWaterfall::SetType(DISPLAY_TYPE type)
{
	m_InternalID = type;
}

/////////////////////////////////////////////////////////////////////////////////////////

LRESULT CDlgWaterfall::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if(message == WM_EXITSIZEMOVE)
	{
		this->Invalidate(FALSE);
		if(m_bSizing){
			m_SSWindow.Resize();
			m_bSizing = FALSE;
		}
		else
			m_SSWindow.Refresh();

		SaveSettings();
			
	}
	if(message == WM_SIZING)
	{
		m_bSizing = TRUE;
	}
	if(message == REPAINT_BRIGHT)
	{
		m_SSWindow.SetBrightness((UINT)wParam, TRUE);
		m_uiBrightness = (UINT)wParam;
		this->Invalidate(FALSE);
		m_SSWindow.Refresh();
	}
	if(message == REPAINT_CONTRAST)
	{
		m_SSWindow.SetContrast((UINT)wParam, TRUE);
		m_uiContrast = (UINT)wParam;
		this->Invalidate(FALSE);
		m_SSWindow.Refresh();
	}
	if(message == HIDE_PROP_DLG_OK)
	{
		m_SSWindow.SetBrightness((UINT)m_dlgProperties.m_dBrightness, TRUE);
		m_SSWindow.SetContrast((UINT)m_dlgProperties.m_dContrast, TRUE);
		m_dlgProperties.ShowWindow(SW_HIDE);
		m_bProperties = !m_bProperties;
		SaveSettings();
	}
	if(message == HIDE_PROP_DLG_CANCEL)
	{
		m_uiBrightness = (UINT)m_dlgProperties.m_dStartBrightness;
		m_uiContrast   = (UINT)m_dlgProperties.m_dStartContrast;

		m_SSWindow.SetBrightness(m_uiBrightness, TRUE);
		m_SSWindow.SetContrast(m_uiContrast, TRUE);
		
		m_dlgProperties.ShowWindow(SW_HIDE);
		m_bProperties = !m_bProperties;
	}
	return CDialog::WindowProc(message, wParam, lParam);
}

void CDlgWaterfall::RampColor()
{
	int x = 0;
	for(int i=0; i<510; i++)
	{
		if(i<255)
		{
		  buff[i] = x++;
		}
		else
		{
		  buff[i] = x--;
		}
	}

}

//DEBUG ONLY
void CDlgWaterfall::OnTimer(UINT nIDEvent) 
{
	
	CDialog::OnTimer(nIDEvent);
}

void CDlgWaterfall::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//MAKE WINDOWS THINK WE CLICKED ON THE CAPTION BAR,
	//SO THE DIALOG CAN BE MOVED BY CLICKING ANYWHERE ON IT.
    PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));	
	CDialog::OnLButtonDown(nFlags, point);
}

void CDlgWaterfall::OnPaletteGreyscale() 
{
	m_Palette = (EPaletteType)GREYSCALE;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteInversegrey() 
{
	m_Palette = (EPaletteType)INVERSE;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteRed() 
{	
	m_Palette = (EPaletteType)RED;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteGreen() 
{	
	m_Palette = (EPaletteType)GREEN;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteBlue() 
{
	m_Palette = (EPaletteType)BLUE;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();	
}

void CDlgWaterfall::OnPaletteRust() 
{
	m_Palette = (EPaletteType)RUST;
	m_SSWindow.SetPalette(m_Palette);	
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteMix2() 
{
	m_Palette = (EPaletteType)MOSS;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}


void CDlgWaterfall::OnPaletteSoil() 
{
	m_Palette = (EPaletteType)SOIL;
	m_SSWindow.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgWaterfall::OnPaletteOther() 
{
	
}

void CDlgWaterfall::OnImageBrightness() 
{
	if(m_bProperties)
		m_dlgProperties.ShowWindow(SW_HIDE);
	else
		m_dlgProperties.ShowWindow(SW_SHOW);
	
	m_bProperties = !m_bProperties;
			
}

void CDlgWaterfall::LoadSettings()
{
	pConfig->Open(CSystemConfig::accessRead);
	pConfig->Read();
	pConfig->Close();
 
	switch(m_InternalID)
	{
	case WFHIGH:{
					m_Palette		= (EPaletteType)pConfig->HFSSWindowPalette;
					m_WindowRect	= pConfig->HFSSWindowRect;
					m_uiBrightness	= pConfig->HFSSBrightness;
					m_uiContrast    = pConfig->HFSSContrast;
					m_Scaling		= (EScalingMode)pConfig->HFSSScaling;
					break;
				}
	case WFLOW: {
					m_Palette		= (EPaletteType)pConfig->LFSSWindowPalette;
					m_WindowRect	= pConfig->LFSSWindowRect;
					m_uiBrightness	= pConfig->LFSSBrightness;
					m_uiContrast    = pConfig->LFSSContrast;
					m_Scaling		= (EScalingMode)pConfig->LFSSScaling;
					break;
				}
	//Not used here - we have a seperate class, but just in case
	case WFSBP: {
					m_Palette		= (EPaletteType)pConfig->SBPWindowPalette;
					m_WindowRect	= pConfig->SBPWindowRect;
					m_uiBrightness	= pConfig->SBPBrightness;
					m_uiContrast    = pConfig->SBPContrast;
					m_Scaling		= (EScalingMode)pConfig->SBPScaling;
					break;
				}
	}
	
	this->SetWindowPos(NULL,m_WindowRect.left,m_WindowRect.top,m_WindowRect.Width(),m_WindowRect.Height(),NULL);

	//This handles the initial menu item check
	//its a brute force approach!
	UINT results;
	switch(m_Palette)
	{
	case GREYSCALE: results = ID_PALETTE_GREYSCALE;break;
	case INVERSE:	results = ID_PALETTE_INVERSEGREY;break;
	case RED:		results = ID_PALETTE_RED;break;
	case GREEN:		results = ID_PALETTE_GREEN;break;
	case BLUE:		results = ID_PALETTE_BLUE;break;
	case RUST:		results = ID_PALETTE_RUST;break;
	case SOIL:		results = ID_PALETTE_SOIL;break;
	case MOSS:		results = ID_PALETTE_MIX2;break;
	default:break;					
	}	
	m_wndMenu.CheckMenuItem(results, MF_CHECKED);
	
	switch(m_Scaling)
	{
	case MEAN: { results = ID_SCALING_MEAN; break;}
	case PEAK: { results = ID_SCALING_PEAK; break;}
	case RMS:  { results = ID_SCALING_RMS;  break;}
	}
	m_wndMenu.CheckMenuItem(results, MF_CHECKED);

}

void CDlgWaterfall::SaveSettings()
{
	CRect temp;
	GetWindowRect(&temp);

	switch(m_InternalID)
	{
	case WFHIGH:{
					pConfig->HFSSWindowPalette	= m_Palette;
					pConfig->HFSSWindowRect		= temp;
					pConfig->HFSSBrightness	    = m_uiBrightness;
					pConfig->HFSSContrast		= m_uiContrast;
					pConfig->HFSSScaling		= m_Scaling;
					break;
				}
	case WFLOW: {
					pConfig->LFSSWindowPalette	= m_Palette;
					pConfig->LFSSWindowRect		= temp;
					pConfig->LFSSBrightness	    = m_uiBrightness;
					pConfig->LFSSContrast		= m_uiContrast;
					pConfig->LFSSScaling		= m_Scaling;
					break;
				}
	//Not used here - we have a seperate class, but just in case
	case WFSBP: {
					pConfig->SBPWindowPalette	= m_Palette;
					pConfig->SBPWindowRect		= temp;
					pConfig->SBPBrightness	    = m_uiBrightness;
					pConfig->SBPContrast		= m_uiContrast;
					pConfig->SBPScaling			= m_Scaling;
					break;
				}
	}
	

	if(pConfig->Open(CSystemConfig::accessWrite))
	{
		pConfig->Save();
		pConfig->Close();
	}
}

void CDlgWaterfall::Refresh()
{
	m_SSWindow.Resize();
}

void CDlgWaterfall::Cleanup()
{
	m_SSWindow.Cleanup();
}

void CDlgWaterfall::OnScalingMean() 
{
	m_Scaling = MEAN;
	m_SSWindow.SetScaleMode(MEAN);	
	SyncScalingMenu();
	SaveSettings();
}

void CDlgWaterfall::OnScalingPeak() 
{
	m_Scaling = PEAK;
	m_SSWindow.SetScaleMode(PEAK);
	SyncScalingMenu();
	SaveSettings();
}

void CDlgWaterfall::OnScalingRms() 
{
	m_Scaling = RMS;
	m_SSWindow.SetScaleMode(RMS);
	SyncScalingMenu();
	SaveSettings();
}


BOOL CDlgWaterfall::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
	{
		return TRUE ;
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

void CDlgWaterfall::OnClose() 
{
	((CMy6046DryEndDlg*)AfxGetMainWnd())->ForceClose(m_InternalID);
	
	CDialog::OnClose();
}

void CDlgWaterfall::SyncPaletteMenu()
{
	m_wndMenu.CheckMenuItem(ID_PALETTE_GREYSCALE, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_INVERSEGREY, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_RED, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_GREEN, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_BLUE, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_RUST, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_SOIL, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_PALETTE_MIX2, MF_UNCHECKED);


	UINT results;
	switch(m_Palette)
	{
	case GREYSCALE: results = ID_PALETTE_GREYSCALE;break;
	case INVERSE:	results = ID_PALETTE_INVERSEGREY;break;
	case RED:		results = ID_PALETTE_RED;break;
	case GREEN:		results = ID_PALETTE_GREEN;break;
	case BLUE:		results = ID_PALETTE_BLUE;break;
	case RUST:		results = ID_PALETTE_RUST;break;
	case SOIL:		results = ID_PALETTE_SOIL;break;
	case MOSS:		results = ID_PALETTE_MIX2;break;
	default:break;					
	}	
	m_wndMenu.CheckMenuItem(results, MF_CHECKED);


}

void CDlgWaterfall::SyncScalingMenu()
{
	m_wndMenu.CheckMenuItem(ID_SCALING_MEAN, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_SCALING_PEAK, MF_UNCHECKED);
	m_wndMenu.CheckMenuItem(ID_SCALING_RMS, MF_UNCHECKED);
	UINT results;
	switch(m_Scaling)
	{
	case MEAN: { results = ID_SCALING_MEAN; break;}
	case PEAK: { results = ID_SCALING_PEAK; break;}
	case RMS:  { results = ID_SCALING_RMS;  break;}
	}
	m_wndMenu.CheckMenuItem(results, MF_CHECKED);

}
