// MF76A_counterDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "MF76A_counter.h"
#include "MF76A_counterDlg.h"
#include ".\mf76a_counterdlg.h"
#include "gpib488.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

int BoardNo=0;                 // GP-IB boardの番号
short DevAdrs[] = {2,-1};      // MF76Acounterのアドレス及び配列要素終端記号
int Length = 80;               // データ長さ(バイト)
char RecvBuff[80];             // 読み込みバッファ
unsigned int interval = 10000; // 読み込み間隔,単位:ミリ秒
unsigned int fileInterval = 600000;    // ファイル書き出し間隔,単位:ミリ秒
BOOL silent = false;           // 消音
CStdioFile fout;
CString Buff[600];             // ファイルバッファ,最大600データ
int  BuffPos = 0;              // ファイルバッファ最終位置

// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// ダイアログ データ
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

// 実装
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CMF76A_counterDlg ダイアログ



CMF76A_counterDlg::CMF76A_counterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMF76A_counterDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMF76A_counterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDinit, INITbutton);
	DDX_Control(pDX, IDreceive, RECEIVEbutton);
	DDX_Control(pDX, IDstop, STOPbutton);
	afx_msg void OnBnClickedINITbutton();
	afx_msg void OnBnClickedRECEIVEbutton();
	afx_msg void OnBnClickedSTOPbutton();
	afx_msg void OnTimer(UINT nIDEvent);
	DDX_Control(pDX, IDC_LIST1, m_list1);
	DDX_Control(pDX, IDC_CHECK2, m_check2);
	DDX_Control(pDX, IDC_LIST3, m_list3);
}

BEGIN_MESSAGE_MAP(CMF76A_counterDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDinit, OnBnClickedinit)
	ON_BN_CLICKED(IDreceive, OnBnClickedreceive)
	ON_BN_CLICKED(IDstop, OnBnClickedstop)
	ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
	ON_BN_CLICKED(IDC_CHECK2, OnBnClickedCheck2)
	ON_LBN_SELCHANGE(IDC_LIST3, OnLbnSelchangeList3)
END_MESSAGE_MAP()

// CMF76A_counterDlg メッセージ ハンドラ

BOOL CMF76A_counterDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// "バージョン情報..." メニューをシステム メニューに追加します。

	// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// TODO: 初期化をここに追加します。

	m_list1.ResetContent();
    m_list1.AddString("1秒");      //希望計測間隔一覧の設定
	m_list1.AddString("10秒");  
	m_list1.AddString("1分");  
	m_list1.AddString("10分");  
	m_list1.AddString("30分");  
	m_list1.AddString("1時間"); 
	m_list1.AddString("6時間"); 
	m_list1.AddString("12時間");
	m_list1.AddString("24時間");
    //ファイル保存間隔設定
	m_list3.ResetContent();
	m_list3.AddString("10分");
	m_list3.AddString("30分");
	m_list3.AddString("1時間");
	m_list3.AddString("6時間");
	m_list3.AddString("12時間");
	m_list3.AddString("24時間");

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CMF76A_counterDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CMF76A_counterDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 CMF76A_counterDlg::OnQueryDragIcon()
{
	return static_cast(m_hIcon);
}


void CMF76A_counterDlg::OnBnClickedinit()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。
	
	    
		//AfxMessageBox("初期化ボタンが押された。");
	    BuffPos=0;
	    SetTimer(1,interval,NULL);//データ取り込み間隔のタイマ設定	
	    SetTimer(2,fileInterval,NULL);//ファイル書き出し間隔

		//計算機側GPIBボードを利用可能にする(開く)
		SendIFC(BoardNo);

        //装置の初期化 
		DevClear(BoardNo,DevAdrs[0]);
		
        //装置を送信側,計算機を聴取側に設定
        ReceiveSetup(BoardNo,DevAdrs[0]);
}

void CMF76A_counterDlg::OnBnClickedreceive()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。

	// TODO: ダイアログで <データ取り込み> が押された時のコード。
	
	//AfxMessageBox("データ取込ボタンが押された。");

	time_t tm;
	CMF76A_counterDlg myDlg;
	CString m_text1, m_text2;
	CString FileName="Data\\", date;
    char m_text3[80];

	    //ファイル名の合成及びファイルを開く(生成又は追記モード)
		time(&tm);         //計算機時刻取得-->&tm
		CTime tm1(tm); 
		
        //データ受信
        RcvRespMsg(BoardNo,&RecvBuff[0],Length,0x0A);

		//AfxMessageBox("データ取込した。");
        m_text2=tm1.Format("%Y%m%dT%H%M%S");//データ取り込み時刻の生成
        Buff[BuffPos] = m_text2 + "," + RecvBuff;//入力データを形式をそのまま指定ファイルへ保存
        Buff[++BuffPos] = "";

		CClientDC myDC(this);
		
		myDC.TextOut(20,90,m_text2);

		myDC.TextOut(160,90,"データ空");//データ取り込み失敗の場合の表示
        
		//表示形式への変換(行末CR/LF−−>\n)
        int i=0;
		while (((m_text3[i]=RecvBuff[i])!=0x0D)&&(i&tm
		CTime tm1(tm); 
		        
        //データ受信
        RcvRespMsg(BoardNo,&RecvBuff[0],Length,0x0A);

		//AfxMessageBox("データ取込した。");
		
		m_text2=tm1.Format("%Y%m%dT%H%M%S");//データ取り込み時刻の生成
        Buff[BuffPos] = m_text2 + "," + RecvBuff;//入力データを形式をそのまま指定ファイルへ格納
        BuffPos++; Buff[BuffPos] = "";

		CClientDC myDC(this);

		myDC.TextOut(20,90,m_text2);

		myDC.TextOut(160,90,"データ空");//データ取り込み失敗の場合の表示
        
		//表示形式への変換(行末CR/LF−−>\n)

		int i=0;
		while (((m_text3[i]=RecvBuff[i])!=0x0D)&&(i&tm
		CTime tm1(tm); 
		m_text1=tm1.Format("%Y%m%d%H%M%S");//データ取り込み時刻の生成
	    FileName += m_text1 + ".txt";
        fout.Open(FileName, CFile::modeCreate | CFile::modeWrite);
        
		for(i=0;i<=BuffPos;i++){ 
		  fout.WriteString(Buff[i]);//バッファ内容を形式を指定ファイルへ保存
		}
		BuffPos = 0;
		fout.Close();
	}
}

void CMF76A_counterDlg::OnBnClickedstop()
{
	time_t tm;
	CString FileName="Data\\", date;
	CString m_text1,m_text2;
	int i;
	// TODO : ここにコントロール通知ハンドラ コードを追加します。

		// TODO: ダイアログで <表示> が押されたときのコード。
	
     	//AfxMessageBox("取り込み終了ボタンが押された。");
		CWnd::KillTimer(1); //タイマ1を停止する。
		CWnd::KillTimer(2); //タイマ2を停止する。
		//保存ファイル名の生成
		time(&tm);         //計算機時刻取得-->&tm
		CTime tm1(tm); 
		m_text1=tm1.Format("%Y%m%d%H%M%S");//データ取り込み時刻の生成
	    FileName += m_text1 + ".txt";
        fout.Open(FileName, CFile::modeCreate | CFile::modeWrite);
        
		for(i=0;i<=BuffPos;i++){ 
		  fout.WriteString(Buff[i]);//バッファ内容を形式を指定ファイルへ保存
		}
		BuffPos = 0;
		fout.Close();

		return;
}

void CMF76A_counterDlg::OnLbnSelchangeList1()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。

	CString ss;
	int n;

	n = m_list1.GetCurSel();   //希望の計測間隔の取得
	if (n != LB_ERR) {
		m_list1.GetText(n, ss);
		//AfxMessageBox(ss);
		if      (ss == "1秒")     interval =     1000;
		else if (ss == "10秒")    interval =    10000;
		else if (ss == "1分")     interval =    60000;
		else if (ss == "10分")    interval =   600000;
		else if (ss == "30分")    interval =  1800000;
		else if (ss == "1時間")   interval =  3600000;
		else if (ss == "6時間")   interval = 21600000;
		else if (ss == "12時間")  interval = 43200000;
		else if (ss == "24時間")  interval = 86400000;
		else interval  = 100000;       //さもなくば,10分
	}
}


void CMF76A_counterDlg::OnBnClickedCheck2()
{
	if (m_check2.GetCheck() == BST_CHECKED) silent = true;
	else silent = false;
}

void CMF76A_counterDlg::OnLbnSelchangeList3()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。
		CString ss;
	int n;

	n = m_list3.GetCurSel();   //希望の計測間隔の取得
	if (n != LB_ERR) {
		m_list3.GetText(n, ss);
		//AfxMessageBox(ss);
		if (ss == "10分")         fileInterval =   600000;
		else if (ss == "30分")    fileInterval =  1800000;
		else if (ss == "1時間")   fileInterval =  3600000;
		else if (ss == "6時間")   fileInterval = 21600000;
		else if (ss == "12時間")  fileInterval = 43200000;
		else if (ss == "24時間")  fileInterval = 86400000;
		else fileInterval  = 600000;       //さもなくば,10分
	}
}