// WinCVView.cpp : CWinCVView クラスの動作の定義を行います。 // #include "stdafx.h" #include "WinCV.h" #include "WinCVDoc.h" #include "WinCVView.h" #include "Caio.h" #include "MyDialog1.h" #include "mmsystem.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWinCVView IMPLEMENT_DYNCREATE(CWinCVView, CView) BEGIN_MESSAGE_MAP(CWinCVView, CView) //{{AFX_MSG_MAP(CWinCVView) ON_COMMAND(ID_CVcond, OnCVcond) ON_COMMAND(ID_CVstart, OnCVstart) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWinCVView クラスの構築/消滅 CWinCVView::CWinCVView() { // TODO: この場所に構築用のコードを追加してください。 Cycles=1;SWrate=0.0; E_0=0.0; E_1=0.0; E_2=0.0; InputE=0.0; ADrange0=-10000.0; ADrange1=10000.0; Potential=0.0, Current=0.0; Crange=1.0, SamplingRate=1000; Status=0; Ndata=0; AMselect=0; DArange0=-10000.0; DArange1=10000.0; long Ret, Ret2; char ErrorString[256]; Ret=AioInit("Aio000", &Id); if (Ret != 0) { Ret=AioGetErrorString( Ret, ErrorString); MessageBox(ErrorString); exit(0); } Ret=AioSetAiInputMethod(Id,0); if (Ret!=0){ Ret=AioGetErrorString( Ret, ErrorString); MessageBox(ErrorString); exit(0); } Ret=AioSetAiRangeAll(Id, PM10); if (Ret!=0){ Ret=AioGetErrorString( Ret, ErrorString); MessageBox(ErrorString); exit(0); } //チャネル数の設定:1チャネル AoChannels = 1; Ret = AioSetAoChannels(Id, AoChannels); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } //メモリ形式の設定:FIFO Ret = AioSetAoMemoryType(Id, 0); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } //クロック種類の設定:内部 Ret = AioSetAoClockType(Id, 0); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } //開始条件の設定:ソフトウェア Ret = AioSetAoStartTrigger(Id, 0); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } //停止条件の設定:設定回数変換終了 Ret = AioSetAoStopTrigger(Id, 0); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } //メモリのリセット Ret = AioResetAoMemory(Id); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); MessageBox(ErrorString); return; } FILE *fin; char buf[256]; float test[10]; int n; n=0; if ((fin=fopen("WinCV.cnd","rb"))==NULL) { MessageBox("デフォルトパラメータを読み込めませんでした。"); return; } while (fgets(buf,256,fin)!=NULL) { test[n]=atof(&buf[0]); n=n+1; } fclose(fin); SWrate=test[0]/1000.0; E_0=test[1]/1000.0; E_1=test[2]/1000.0; E_2=test[3]/1000.0; Cycles=(int) test[4]; SamplingRate=(long) test[5]; Crange=test[6]/1000.0; } CWinCVView::~CWinCVView() { } BOOL CWinCVView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CWinCVView クラスの描画 void CWinCVView::OnDraw(CDC* pDC) { CWinCVDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 char name[20], *t1; long Ctemp1; double Ctemp2; t1=gcvt(Potential, 8, name); pDC->TextOut(100,20,t1); pDC->TextOut(200,20,"mV"); Ctemp1=Current*10000.0; Ctemp2=Ctemp1/10000.0; t1=gcvt(Ctemp2, 8, name); pDC->TextOut(300,20,t1); pDC->TextOut(400,20,"mA"); t1=gcvt(Status, 8, name); pDC->TextOut(500,20,t1); int xt, yt; double Xi, Yi; if (Ndata>0) { CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(125,125,125)); CBrush* OldBrush=pDC->SelectObject(&NewBrush); CRect DRect(100,50,650,350); pDC->FrameRect(DRect, &NewBrush); pDC->SelectObject(OldBrush); NewBrush.DeleteObject(); for (int i=1; i<(Ndata+1); i++) { Xi=DataPot[i]; Yi=DataCur[i]; if (Xi>=Xmin && Xi<=Xmax && Yi>=Ymin && Yi<=Ymax) { xt=(int) 550*(Xi-Xmin)/(Xmax-Xmin) + 100; yt=(int) -300*(Yi-Ymin)/(Ymax-Ymin) + 350; pDC->SetPixel(xt, yt, RGB(0,0,255)); pDC->SetPixel(xt+1, yt, RGB(0,0,255)); pDC->SetPixel(xt, yt+1, RGB(0,0,255)); pDC->SetPixel(xt+1, yt+1, RGB(0,0,255)); } } t1=gcvt(Xmin, 8, name); pDC->TextOut(100,360,t1); t1=gcvt(Xmax, 8, name); pDC->TextOut(640,360,t1); Ctemp1=Ymin*10000.0; Ctemp2=Ctemp1/10000.0; t1=gcvt(Ctemp2, 8, name); pDC->TextOut(35,330,t1); Ctemp1=Ymax*10000.0; Ctemp2=Ctemp1/10000.0; t1=gcvt(Ctemp2, 8, name); pDC->TextOut(35,50,t1); } } ///////////////////////////////////////////////////////////////////////////// // CWinCVView クラスの診断 #ifdef _DEBUG void CWinCVView::AssertValid() const { CView::AssertValid(); } void CWinCVView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CWinCVDoc* CWinCVView::GetDocument() // 非デバッグ バージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinCVDoc))); return (CWinCVDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CWinCVView クラスのメッセージ ハンドラ void CWinCVView::OnCVcond() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog1 mD; int ret, Ret, Ret2; mD.m_SWrate=SWrate; mD.m_E_0=E_0; mD.m_E_1=E_1; mD.m_E_2=E_2; mD.m_cycles=Cycles; mD.m_CVsamplingrate=SamplingRate; mD.m_CV_Crange=Crange; ret=mD.DoModal(); if (ret==IDOK) { SWrate=mD.m_SWrate; E_0=mD.m_E_0; E_1=mD.m_E_1; E_2=mD.m_E_2; Cycles=mD.m_cycles; SamplingRate=mD.m_CVsamplingrate; Crange=mD.m_CV_Crange; } Ymin=-abs(Crange); Ymax=abs(Crange); Xmin=E_0; Xmax=E_0; if (Xmin>E_1) {Xmin=E_1;} if (XmaxE_2) {Xmin=E_2;} if (Xmax DATA_MAX){ MessageBox("サンプリング点数が多すぎます。"); exit(0); } TotalTime=AoSamplingTimes*AoSamplingRate; //出力データ作成:サイン波形 long AoData[DATA_MAX]; int i, j; int PM; long DN; DN=0; PM=1; if (DAout_1Ymax) { Ymin=DataCur[2]; Ymax=DataCur[1]; } } else if (nd>2) { if (Current>Ymax) {Ymax=Current;} if (Current