// DlgPopupReport.cpp : implementation file
//

#include "stdafx.h"
#include "6046dryend.h"
#include "6046dryendDlg.h"
#include "DlgPopupReport.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgPopupReport dialog


CDlgPopupReport::CDlgPopupReport(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgPopupReport::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgPopupReport)
	//}}AFX_DATA_INIT

	m_pImageList = NULL;
	m_pImageList = new CImageList;

	labels[0].Format("STATUS");
	labels[1].Format("ALARM");
	labels[2].Format("WARNING");

	stati[0].Format("Cleared");
	stati[1].Format("Active");
	stati[2].Format("Acknowledged");
	stati[3].Format("Disabled");

	errCauses[0].Format("Unknown");
	errCauses[1].Format("Internal Error Code");
	errCauses[2].Format("Service Required");
	errCauses[3].Format("Temp. out of Range");
	errCauses[4].Format("Humidity out of Range");

}


void CDlgPopupReport::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgPopupReport)
	DDX_Control(pDX, IDC_BTN_ENABLE, m_ctrlBtnEnable);
	DDX_Control(pDX, IDC_BTN_REM, m_ctrlCleanup);
	DDX_Control(pDX, IDC_SHOWHISTORY, m_ctrlShowHistory);
	DDX_Control(pDX, IDC_BTN_OPTIONS, m_ctrlBtnOptions);
	DDX_Control(pDX, IDC_BTN_QUERYALL, m_ctrlQueryAll);
	DDX_Control(pDX, IDC_MSGLIST, m_ctrlMessageList);
	DDX_Control(pDX, IDC_BTN_DIS, m_ctrlDisable);
	DDX_Control(pDX, IDC_BTN_ACK, m_ctrlAcknowledge);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgPopupReport, CDialog)
	//{{AFX_MSG_MAP(CDlgPopupReport)
	ON_BN_CLICKED(IDC_BTN_ACK, OnBtnAck)
	ON_BN_CLICKED(IDC_BTN_DIS, OnBtnDis)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BTN_OPTIONS, OnBtnOptions)
	ON_BN_CLICKED(IDC_BTN_QUERYALL, OnBtnQueryall)
	ON_BN_CLICKED(IDC_BTN_REM, OnBtnRem)
	ON_NOTIFY(NM_CLICK, IDC_MSGLIST, OnClickMsglist)
	ON_BN_CLICKED(IDC_SHOWHISTORY, OnShowhistory)
	ON_BN_CLICKED(IDC_BTN_ENABLE, OnBtnEnable)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgPopupReport message handlers

BOOL CDlgPopupReport::OnInitDialog() 
{
	CDialog::OnInitDialog();

	HICON icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	SetIcon(icon, FALSE);

	m_pConfig = (CSystemConfig*)&((CMy6046DryEndApp*)AfxGetApp())->m_SystemConfig;
	LoadSettings();

	m_ctrlCleanup.SetShade (SHS_METAL,8,20,5,RGB(85,25,25));
	m_ctrlShowHistory.SetShade (SHS_METAL,8,20,5,RGB(85,25,25));
	m_ctrlDisable.SetShade (SHS_METAL,8,20,5,RGB(85,25,25));
	m_ctrlAcknowledge.SetShade (SHS_METAL,8,20,5,RGB(25,85,25));
	m_ctrlQueryAll.SetShade (SHS_METAL,8,20,5,RGB(25,25,25));
	m_ctrlBtnOptions.SetShade (SHS_METAL,8,20,8,RGB(125,125,125));
	m_ctrlBtnEnable.SetShade (SHS_METAL,8,20,5,RGB(25,85,25));

	if(m_pImageList)
	{
		m_pImageList->Create(16,16,ILC_COLOR8,3,1);
		m_pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICON_INFO));
		m_pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICON_ALARM));
		m_pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICON_WARNING));
	}
	
	CRect rect;
	m_ctrlMessageList.GetClientRect(&rect);
	m_ctrlMessageList.InsertColumn(1,"Type",		LVCFMT_CENTER, 70, NULL);
	m_ctrlMessageList.InsertColumn(2,"Status",		LVCFMT_CENTER, 45, NULL);
	m_ctrlMessageList.InsertColumn(3,"Time Tag",	LVCFMT_CENTER, 75, NULL);
	m_ctrlMessageList.InsertColumn(4,"Sensor ID",	LVCFMT_CENTER, 60, NULL);
	m_ctrlMessageList.InsertColumn(5,"Info",		LVCFMT_CENTER, 180, NULL);
	m_ctrlMessageList.InsertColumn(6,"Cause",		LVCFMT_CENTER, 60, NULL);


	m_ctrlMessageList.SetBkColor(RGB(0,35,0));
	m_ctrlMessageList.SetTextBkColor(RGB(0,35,0));
	m_ctrlMessageList.SetTextColor(RGB(0,255,55));

	m_ctrlMessageList.SetImageList(m_pImageList,LVSIL_SMALL);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgPopupReport::AddNewMessage(CString message, SAWTYPE type, C7kStatus::EMODE mode, UINT msgID, TIME7K time)
{
	currentTimeStore = time;
	currentMsgID	 = msgID;

	TRACE("NEW SAW MESSAGE REC'D....%s\r\n", message);
	
	//First Check if this is an alrm clear message
	if((mode == 0)&&(msgID >0))
	{
		FindAndClearAlarm(message);
		RefreshListFromHistory();
		return;
	}

	switch(type)
	{
	case STATUS:	{PostSysMsg(message);break;}
	case ALARM:		{PostAlarmMsg(message);break;}
	case WARNING:	{PostWarningMsg(message);break;}
	}
}

void CDlgPopupReport::PostSysMsg( CString message )
{
	//strBuff = message.GetBuffer(message.GetLength());

	//begin parsing...
	

	//end parsing...

	//message.ReleaseBuffer();
}

void CDlgPopupReport::PostAlarmMsg( CString message )
{
	//Fill in the generic messge struct
	ParseMessageToStruct(message);

	//check if it exists already...
	SAWMSG temp;
	deque<SAWMSG>::iterator pos;
	for(pos = m_vecMsgQue.begin(); pos < m_vecMsgQue.end(); pos++)
	{
		temp = *pos;

		if(temp.alarmID ==  m_genericMsg.alarmID) 
		{	
			if(temp.mainType == m_genericMsg.mainType) 
			{	
				if(temp.sensorID == m_genericMsg.sensorID) 
				{
					if(temp.extraFeild1 == m_genericMsg.extraFeild1)
					{
						if(temp.extraFeild2 == m_genericMsg.extraFeild2)
							return;
					}
				}
					
			}
		}
	}
	//Add message to list
	m_vecMsgQue.push_back(m_genericMsg);

	if(m_genericMsg.alarmID != 0 && m_genericMsg.mainType != STATUS)
	{
		CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();	
		pTemp->AddAlarm();
	}
	//Post Message
	PostCurrentMsg();
}

void CDlgPopupReport::PostWarningMsg( CString message )
{
	//begin parsing...

	//end parsing...
}


void CDlgPopupReport::PostCurrentMsg()
{
	CString time,temp;
	time.Format("%d:%02d:%02d", m_genericMsg.Time7K.m_ucHours, m_genericMsg.Time7K.m_ucMinutes, (int)floor(m_genericMsg.Time7K.m_fSeconds) );

	
	//type 
	m_ctrlMessageList.InsertItem(0,labels[m_genericMsg.mainType], m_genericMsg.mainType);

	//status
	m_ctrlMessageList.SetItemText(0,1,stati[m_genericMsg.state]);

	//time
	m_ctrlMessageList.SetItemText(0,2, time);

	//ID
	if(m_genericMsg.sensorID == -1)
		temp.Format("None");
	else
		temp.Format("%d", m_genericMsg.sensorID);

	m_ctrlMessageList.SetItemText(0,3,temp);

	//Info
	m_ctrlMessageList.SetItemText(0,4,m_genericMsg.msg);

	if(m_genericMsg.alarmID == 4)
	{
		m_ctrlMessageList.SetItemText(0,5,errCauses[m_genericMsg.extraFeild1]);
	}
	else
		m_ctrlMessageList.SetItemText(0,5,"N/A");
	

}

void CDlgPopupReport::RefreshListFromHistory()
{
	m_ctrlMessageList.DeleteAllItems();

	//parse the message list and display all
	deque<SAWMSG>::iterator pos;
	for(pos = m_vecMsgQue.begin(); pos < m_vecMsgQue.end(); pos++)
	{
		if(pos->hidden == TRUE)
			continue;
		
		m_genericMsg = *pos;
		PostCurrentMsg();

	}
}

////////////////////////////////////////////////////////////
//BUTTON CLICK HANDLERS
////////////////////////////////////////////////////////////
void CDlgPopupReport::OnBtnAck() 
{

	
	//Get position iterator of selection
	int lastSelected = 0;
	int once = 0;
	POSITION pos = m_ctrlMessageList.GetFirstSelectedItemPosition();
	if (pos == NULL)
	   AfxMessageBox("No Items were selected!");
	else
	{
	   while (pos)
	   {
		  int nItem = m_ctrlMessageList.GetNextSelectedItem(pos);

		  if(once ==0)
		  {
				lastSelected = nItem;
				once = 1;
		  }
		  nItem = m_vecMsgQue.size() - nItem - 1;
		  //Do processing on nItem here: Get actual message from buffer, get alarm ID, call remote FXN
		  
		  if(m_vecMsgQue[nItem].mainType == STATUS)
			  continue;
		  
		  m_vecMsgQue[nItem].state = ACKNOWLEDGED;
		  CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();	
		  //Acknowledge is only local effect
		  pTemp->SubtractAlarm();
	   }
	
	   RefreshListFromHistory();
	
	}//end else
	m_ctrlMessageList.SetItemState(lastSelected, LVIS_SELECTED, LVIS_SELECTED | LVIS_FOCUSED);
	m_ctrlMessageList.SetSelectionMark(lastSelected);
	m_ctrlMessageList.EnsureVisible(lastSelected, FALSE);
}

void CDlgPopupReport::OnBtnDis() 
{

	//Get position iterator of selection
	POSITION pos = m_ctrlMessageList.GetFirstSelectedItemPosition();
	CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();	
	
	if (pos == NULL)
	   TRACE("No items were selected!\n");
	else
	{
	   while (pos)
		{
			int nItem = m_ctrlMessageList.GetNextSelectedItem(pos);
			
			nItem = m_vecMsgQue.size() - nItem - 1;
			
			//Do processing on nItem here: Get actual message from buffer, get alarm ID, call remote FXN
			SAWMSG temp = m_vecMsgQue[nItem];
		  
			if((temp.mainType == STATUS) || (temp.state == DISABLED))
				continue;

			//add the alarm to the disabled list
			//temp.state = DISABLED;
			//m_vecDisabledAlarms.push_back(temp);

			//If the alarm is not subtract alarm counter then disable
			if((temp.state == ACTIVE) || (temp.state == ACKNOWLEDGED))
			{
				pTemp->SubtractAlarm();
				m_vecMsgQue[nItem].state = DISABLED;
			}
			pTemp->RemoteAlarm(temp.alarmID, (C6046RemoteClient::EALARMACTION)0); //disable action = 0
	   
		}//end while

			RefreshListFromHistory();
	
	}//end else

}


void CDlgPopupReport::OnBtnEnable() 
{
	//Get position iterator of selection
	POSITION pos = m_ctrlMessageList.GetFirstSelectedItemPosition();
	CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();	
	
	if (pos == NULL)
	   TRACE("No items were selected!\n");
	else
	{
	   while (pos)
		{
			int nItem = m_ctrlMessageList.GetNextSelectedItem(pos);
			
			nItem = m_vecMsgQue.size() - nItem - 1;
			
			//Do processing on nItem here: Get actual message from buffer, get alarm ID, call remote FXN
			SAWMSG temp = m_vecMsgQue[nItem];
		  
			if((temp.mainType == STATUS) || (temp.state == ACKNOWLEDGED))
				continue;

			//If the alarm is not acknowledged, we need to acknowledge then disable
			if((temp.state == DISABLED))
			{
				m_vecMsgQue[nItem].state = ACKNOWLEDGED;
			}
			pTemp->RemoteAlarm(temp.alarmID, (C6046RemoteClient::EALARMACTION)1); //enable action = 1
	   
		}//end while

			RefreshListFromHistory();
	
	}//end else
	
}


void CDlgPopupReport::OnBtnRem() 
{	
	deque<SAWMSG>::iterator pos;
	for(pos = m_vecMsgQue.begin(); pos < m_vecMsgQue.end(); pos++)
	{
		//Just simply hide them for now
		if((pos->state >= ACKNOWLEDGED) || (pos->state == CLEARED))
			pos->hidden = TRUE;
	}
	//Redraw all
	RefreshListFromHistory();
}


void CDlgPopupReport::OnBtnQueryall() 
{
	m_vecMsgQue.clear();
	m_ctrlMessageList.DeleteAllItems();
	CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();
	pTemp->ClearAllAlarms();
	pTemp->RemoteReportAlarms();
}



void CDlgPopupReport::OnBtnOptions() 
{
	if(m_dlgOptions.DoModal() == IDOK)
	{
		//Make remote calls etc...
		CMy6046DryEndDlg* dlg = (CMy6046DryEndDlg*)AfxGetMainWnd();
		
		dlg->RemoteAutoHealthCheck(m_dlgOptions.m_bAutoHealth, m_dlgOptions.m_uiSeconds);
	}	
}

void CDlgPopupReport::OnClickMsglist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	//If the user highlights an alarm message, activate the remove ack buttons
	
	*pResult = 0;
}

/////////////////////////////////////////////////////////
//WINDOWS DEFINED MESSAGE OVERRIDES
/////////////////////////////////////////////////////////
void CDlgPopupReport::OnDestroy() 
{
	CDialog::OnDestroy();
	
	m_pImageList->DeleteImageList();
	delete m_pImageList;
	m_pImageList = NULL;
}

LRESULT CDlgPopupReport::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
		
	return CDialog::WindowProc(message, wParam, lParam);
}


void CDlgPopupReport::OnShowhistory() 
{
	deque<SAWMSG>::iterator pos;
	for(pos = m_vecMsgQue.begin(); pos < m_vecMsgQue.end(); pos++)
	{
		//Just simply hide them for now
		pos->hidden = FALSE;
	}
	//Redraw all
	RefreshListFromHistory();
	
}

BOOL CDlgPopupReport::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
	{
		return TRUE ;
	}	
	return CDialog::PreTranslateMessage(pMsg);
}


void CDlgPopupReport::ParseMessageToStruct( CString message )
{
	CString msgExtract, numExtract;	
	int	indexBuffer[5];
	ZeroMemory(indexBuffer, 5);
	int foundCommas = 0;


	ZeroMemory(&m_genericMsg, sizeof(SAWMSG));
	ZeroMemory(m_genericMsg.msg, 256);

	//This is the same efor all messages just about
	m_genericMsg.alarmID		= (NSurveyEvent::EALARMID)currentMsgID;											
	m_genericMsg.Time7K			= currentTimeStore;
	m_genericMsg.hidden			= FALSE;
	m_genericMsg.mainType		= ALARM;
	m_genericMsg.state			= ACTIVE;
	m_genericMsg.sensorID		= -1;
	m_genericMsg.extraFeild1	= -1;
	m_genericMsg.extraFeild2	= -1;
	
	//set up the index buffer for commas
	for(int i=0; i<message.GetLength(); i++)
	{
		if(message.GetAt(i) == ',')
			indexBuffer[foundCommas++] = i;
	}

	//begin parsing...
	switch(currentMsgID)
	{
		case alarmIdAllClear:			{	m_genericMsg.mainType	= STATUS;									
											m_genericMsg.state		= CLEARED;
											((CMy6046DryEndDlg*)AfxGetMainWnd())->ClearAllAlarms();
											sprintf(m_genericMsg.msg, "System Health Check Passed");
											break; }

		case alarmIdDiskSpaceCritical:	{	msgExtract  = message.Mid(0, message.GetLength());																				
											sprintf(m_genericMsg.msg, msgExtract);
											break; }                       
		
		case alarmIdSensorNotResponding:{	numExtract = message.Mid(0, indexBuffer[0]);
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength());	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }                     
		
		case alarmIdPingDropped:		{	numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.sensorID = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[0]+1, indexBuffer[1]-indexBuffer[0]-1);
											m_genericMsg.extraFeild1 = (ULONG)atof(numExtract);
											
											numExtract = message.Mid(indexBuffer[1]+1,  message.GetLength()-indexBuffer[1]);
											m_genericMsg.extraFeild2 = (ULONG)atof(numExtract);
											
											if(m_genericMsg.extraFeild2 > 0)
												sprintf(m_genericMsg.msg, "Pings Dropped - Start: %d,  End: %d",m_genericMsg.extraFeild1,m_genericMsg.extraFeild2 );
											else
												sprintf(m_genericMsg.msg, "Ping Dropped - #%d",m_genericMsg.extraFeild1);

											break; }

		case alarmIdSensorReportedFailure:{ numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.sensorID = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[0]+1, indexBuffer[1]-indexBuffer[0]-1);
											m_genericMsg.extraFeild1 = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[1]+1, indexBuffer[2]-indexBuffer[1]-1);
											m_genericMsg.extraFeild2 = atoi(numExtract);
											
											msgExtract = message.Mid(indexBuffer[2]+1, message.GetLength()-indexBuffer[2]);
											sprintf(m_genericMsg.msg,"%s, Internal Code = %d", msgExtract,m_genericMsg.extraFeild2);
											break; }

		case alarmIdSensorUnhealthy:	{	numExtract = message.Mid(0, indexBuffer[0]);
											
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }

		case alarmIdSensorFailedToStart:{	numExtract = message.Mid(0, indexBuffer[0]);
											
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }


		case alarmIdSensorFailedToShutdown:{numExtract = message.Mid(0, indexBuffer[0]);
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }

		
		case alarmIdSensorFailedToLoadData:{numExtract = message.Mid(0, indexBuffer[0]);
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }
		
		case alarmIdSensorFailedToSetTime:{ numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.sensorID = atoi(numExtract);
											
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											sprintf(m_genericMsg.msg, msgExtract);
											break; }
		
		case alarmIdSensorFailedToRoute7kMessage:{ numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.sensorID = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[0]+1, indexBuffer[1]-1);
											m_genericMsg.extraFeild1 = (ULONG)atof(numExtract);
											
											msgExtract = message.Mid(indexBuffer[1]+1,  message.GetLength()-indexBuffer[1]);
											sprintf(m_genericMsg.msg, "%s, Client Index: %d",msgExtract,m_genericMsg.extraFeild1);
											break; }

		
		case alarmIdSensorCommandFailed:{	numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.sensorID = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[0]+1, indexBuffer[1]-1);
											m_genericMsg.extraFeild1 = (ULONG)atof(numExtract);
											
											msgExtract = message.Mid(indexBuffer[1]+1,  message.GetLength()-indexBuffer[1]);
											sprintf(m_genericMsg.msg, "%s, Client ID: %d",msgExtract, m_genericMsg.extraFeild1);
											break; }
		
		case alarmIdSensorStatusRetrievalFailed:{numExtract = message.Mid(0, indexBuffer[0]);
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }

		
		case alarmIdResetFailed:		{	numExtract = message.Mid(0, indexBuffer[0]);
											msgExtract = message.Mid(indexBuffer[0]+1, message.GetLength()-indexBuffer[0]);	
											m_genericMsg.sensorID = atoi(numExtract);
											sprintf(m_genericMsg.msg, msgExtract);
											break; }
		
		case alarmIdInvalidCommand:		{	numExtract = message.Mid(0, indexBuffer[0]);
											m_genericMsg.extraFeild1 = atoi(numExtract);
											
											numExtract = message.Mid(indexBuffer[0]+1, indexBuffer[1]-1);
											m_genericMsg.extraFeild2 = (ULONG)atof(numExtract);
											
											msgExtract = message.Mid(indexBuffer[1]+1, message.GetLength()-indexBuffer[1]);
											sprintf(m_genericMsg.msg, "%s, Msg ID: %d, Client Index: %d",msgExtract,m_genericMsg.extraFeild2,m_genericMsg.extraFeild1);
											break; }

		case alarmIdKeyMissing:			{	msgExtract  = message.Mid(0, message.GetLength());																				
											sprintf(m_genericMsg.msg, msgExtract);
											((CMy6046DryEndDlg*)AfxGetMainWnd())->m_ctrlMainTabs.NotifyTab(0,TCP_DISCONNECT);
											((CMy6046DryEndDlg*)AfxGetMainWnd())->m_ctrlMainTabs.NotifyTab(1,TCP_DISCONNECT);
											break;
										}
		case alarmIdLoadConfigurationFailed:{
												msgExtract  = message.Mid(0, message.GetLength());																				
												sprintf(m_genericMsg.msg, msgExtract);
											}
		case alarmIdDiskFailure:		{
											msgExtract  = message.Mid(0, message.GetLength());																				
											sprintf(m_genericMsg.msg, msgExtract);
										}
	}
	//end parsing...


}

void CDlgPopupReport::FindAndClearAlarm(CString msg)
{
	CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();	

	TRACE("ALARM CLEARED MESSAGE REC\r\n");

	ParseMessageToStruct(msg);

	SAWMSG temp;

	deque<SAWMSG>::iterator pos;
	for(pos = m_vecMsgQue.begin(); pos < m_vecMsgQue.end(); pos++)
	{
		temp = *pos;
		//Find the appropriate alarm and clear it manually
		if(m_genericMsg.alarmID == temp.alarmID)
		{
			if(m_genericMsg.sensorID == temp.sensorID)
			{
				if((m_genericMsg.extraFeild1 == temp.extraFeild1) && (m_genericMsg.extraFeild2 == temp.extraFeild2))
				{
					//We have a winner!
					if(pos->state == ACTIVE)
					{
						((CMy6046DryEndDlg*)AfxGetMainWnd())->SubtractAlarm();
					}
					pos->state = CLEARED;
				}		
			
			}

		}
	}
}

void CDlgPopupReport::LoadSettings()
{
	if(m_pConfig->Open(CSystemConfig::accessRead))
	{
		m_pConfig->Read();
		m_pConfig->Close();



	}
	
}

void CDlgPopupReport::SaveSettings()
{
	if(m_pConfig->Open(CSystemConfig::accessWrite))
	{
		m_pConfig->Save();
		m_pConfig->Close();
	}
}
void CDlgPopupReport::OnClose() 
{
	// TODO: Add your message handler code here and/or call default

	CMy6046DryEndDlg* pTemp = (CMy6046DryEndDlg*)AfxGetMainWnd();
	pTemp->ToggleAlarmsDisplay();
	
	CDialog::OnClose();
}
