Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:4 курс - Трояновский / ПИУС / ПЦР / ПЦР-2005 / Drawer_1 / MainForm
.cpp//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include<iostream>
#include<fstream>
#include "MainForm.h"
#include "FuncEditor.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
#include <iomanip>
TForm1 *Form1;
fstream& operator<< (fstream &s, vector<double> &v){
s << v.size() << "\t";
for(vector<double>::iterator i = v.begin(); i != v.end(); i++){
// s << precision(5) << width(10) << *i << "\t";
s << setw(10) << fixed << *i << "\t";
}
s << endl;
return s;
}
fstream& operator>> (fstream &s, vector<double> &v){
size_t size;
s >> size;
v.resize(size);
for(vector<double>::iterator i = v.begin(); i != v.end(); i++)
s >> *i;
return s;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
fromAdder.Bind(PaintBox1);
fromAdder.SetCaption("Сигнал на входе в объект E(t)");
fromObject.Bind(PaintBox2);
fromObject.SetCaption("Сигнал на выходе из объекта Y(t)");
fromAdc.Bind(PaintBox3);
fromAdc.SetType(TDSeries2::typeDiscontinuous);
fromAdc.SetScale(CSpinEdit1->Value);
fromAdc.SetCaption("Сигнал на выходе из АЦП Y*(t)");
fromControlObject.Bind(PaintBox4);
fromControlObject.SetType(TDSeries2::typeDiscontinuous);
fromControlObject.SetScale(CSpinEdit1->Value);
fromControlObject.SetCaption("Сигнал на выходе из регулятора");
fromDac.Bind(PaintBox5);
fromDac.SetCaption("Сигнал на выходе из ЦАП U(t)");
toSystem.Bind(PaintBox0);
toSystem.SetCaption("Входной сигнал X(t)");
ComboBox1->ItemIndex=0;
input.resize(100);
input[0]=1;
mainControls.resize(50);
mainControls[0]=0.5;
mainControls[1]=0.4;
mainControls[2]=0.3;
mainControls[3]=0.2;
mainControls[4]=0.1;
controlControls.resize(10);
controlControls[0]=0.3;
controlControls[0]=0.2;
controlControls[0]=0.1;
Process();
}
//---------------------------------------------------------------------------
void TForm1::Process() {
mainAdder.releaseData();
mainObject.releaseData();
controlObject.releaseData();
controlAdc.releaseData();
controlDac.releaseData();
mainAdder.releaseControls();
mainObject.releaseControls();
controlObject.releaseControls();
mainObject.setTau(1);
controlObject.setTau(CSpinEdit1->Value);
controlAdc.setTau(CSpinEdit1->Value);
controlDac.setTau(CSpinEdit1->Value);
mainAdder.processData(input);
mainObject.setControls(mainControls);
controlObject.setControls(controlControls);
for (int i=0; i<input.size(); i++) {
mainObject.processData(mainAdder.getData());
controlAdc.processData(mainObject.getData());
if (controlAdc.isNew()) {
controlObject.processData(controlAdc.getData());
};
controlDac.processData(controlObject.getData());
mainAdder.setControls(controlDac.getData());
mainAdder.processData(input);
}
fromAdc.SetScale(CSpinEdit1->Value);
fromControlObject.SetScale(CSpinEdit1->Value);
fromAdc.SetLimit(input.size());
fromControlObject.SetLimit(input.size());
vector<double> adderData=mainAdder.getData();
adderData.pop_back();
vector<double> objectData=mainObject.getData();
vector<double> adcData=controlAdc.getData();
vector<double> cntrlObjectData=controlObject.getData();
vector<double> dacData=controlDac.getData();
toSystem.SetData(input);
fromAdder.SetData(adderData);
fromObject.SetData(objectData);
fromAdc.SetData(adcData);
fromControlObject.SetData(cntrlObjectData);
fromDac.SetData(dacData);
toSystem.Update();
fromAdder.Update();
fromObject.Update();
fromAdc.Update();
fromControlObject.Update();
fromDac.Update();
}
void __fastcall TForm1::FuncHClick(TObject *Sender)
{
FuncEditorForm->SetData(mainControls);
FuncEditorForm->SetCaption("h(t) - объект");
FuncEditorForm->SetType(TDSeries2::typeContinuous);
FuncEditorForm->SetScale(1);
if(FuncEditorForm->ShowModal() == mrOk){
mainControls=FuncEditorForm->GetData();
Process();
};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FuncQClick(TObject *Sender)
{
FuncEditorForm->SetData(controlControls);
FuncEditorForm->SetCaption("q(t) - регулятор");
FuncEditorForm->SetType(TDSeries2::typeDiscontinuous);
FuncEditorForm->SetScale(5);
if(FuncEditorForm->ShowModal() == mrOk){
controlControls=FuncEditorForm->GetData();
Process();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
if (Edit1->Text=="") {
Edit1->Text=100;
}
switch ( ComboBox1->ItemIndex ) {
case 0:
input.clear();
input.resize(Edit1->Text.ToInt());
input[0]=1;
Process();
break;
case 1:
input.clear();
input.resize(Edit1->Text.ToInt());
for(int i=0; i<Edit1->Text.ToInt(); i++) {
input[i]=(double)20*((double)rand())/RAND_MAX-10;
};
Process();
break;
case 2:
input.clear();
input.resize(Edit1->Text.ToInt());
for(int i=0; i<Edit1->Text.ToInt(); i++) {
input[i]=1;
};
Process();
break;
case 3:
input.clear();
input.resize(Edit1->Text.ToInt());
input[0]=1;
FuncEditorForm->SetData(input);
FuncEditorForm->SetCaption("Входной сигнал");
FuncEditorForm->SetType(TDSeries2::typeContinuous);
FuncEditorForm->SetScale(1);
if(FuncEditorForm->ShowModal() == mrOk){
input=FuncEditorForm->GetData();
Process();
break;
};
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
if (Edit1->Text=="") {
Edit1->Text=100;
}
if (CSpinEdit1->Text!="") {
Process();
};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if (Edit1->Text!="") {
int nSize = Edit1->Text.ToInt();
switch ( ComboBox1->ItemIndex ) {
case 0:
input.resize(nSize);
input[0]=1;
Process();
break;
case 1:
input.clear();
input.resize(nSize);
for(int i=0; i < nSize; i++) {
input[i]=(double)20*((double)rand())/RAND_MAX-10;
};
Process();
break;
case 2:
input.clear();
input.resize(nSize);
for(int i=0; i < nSize; i++) {
input[i]=1;
};
Process();
break;
case 3:
input.resize(nSize);
Process();
break;
};
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if(ParamStr(1).Length()){
if(ParamStr(1) == "-auto"){
AutoMode();
exit(0);
}
else if(ParamStr(1) == "-opt")
sOptimize = ParamStr(2);
}
else
sOptimize = "optimize.exe";
if(FileExists(sOptimize)){
Optimize->Visible = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AutoMode(){
HANDLE hEvStart, hEvFinish, hEvClose;
hEvStart = CreateEvent(NULL, 0, 0, "pous/start");
hEvFinish = CreateEvent(NULL, 0, 0, "pous/finish");
hEvClose = CreateEvent(NULL, 0, 0, "pous/close");
if(!hEvStart || !hEvFinish || !hEvClose)
exit(0);
HANDLE hWait[2] = {hEvStart, hEvClose};
while(1){
DWORD res = WaitForMultipleObjects(2, hWait, FALSE, INFINITE);
switch(res){
case WAIT_OBJECT_0:
LoadData("data.in");
FirstProcess();
SaveData("data.out");
SetEvent(hEvFinish);
break;
case WAIT_OBJECT_0 + 1:
exit(0);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveData(const char *str) {
fstream out(str);
vector<double> adderData=mainAdder.getData();
adderData.pop_back();
vector<double> objectData=mainObject.getData();
vector<double> adcData=controlAdc.getData();
vector<double> cntrlObjectData=controlObject.getData();
vector<double> dacData=controlDac.getData();
setprecision(4);
out << input;
out << mainControls;
out << controlControls;
out << CSpinEdit1->Value << endl;
out << adderData;
out << objectData;
out << adcData;
out << cntrlObjectData;
out << dacData;
out.close();
}
void __fastcall TForm1::LoadData(const char *str) {
fstream out(str, ios_base::in);
out >> input;
out >> mainControls;
out >> controlControls;
out >> CSpinEdit1->Value;
Process();
}
void TForm1::FirstProcess() {
mainAdder.releaseData();
mainObject.releaseData();
controlObject.releaseData();
controlAdc.releaseData();
controlDac.releaseData();
mainAdder.releaseControls();
mainObject.releaseControls();
controlObject.releaseControls();
mainObject.setTau(1);
controlObject.setTau(CSpinEdit1->Value);
controlAdc.setTau(CSpinEdit1->Value);
controlDac.setTau(CSpinEdit1->Value);
mainAdder.processData(input);
mainObject.setControls(mainControls);
controlObject.setControls(controlControls);
for (int i=0; i<input.size(); i++) {
mainObject.processData(mainAdder.getData());
controlAdc.processData(mainObject.getData());
if (controlAdc.isNew()) {
controlObject.processData(controlAdc.getData());
};
controlDac.processData(controlObject.getData());
mainAdder.setControls(controlDac.getData());
mainAdder.processData(input);
}
fromAdc.SetScale(CSpinEdit1->Value);
fromControlObject.SetScale(CSpinEdit1->Value);
fromAdc.SetLimit(input.size());
fromControlObject.SetLimit(input.size());
}
void __fastcall TForm1::OptimizeClick(TObject *Sender)
{
SaveData("data.out");
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
BOOL b = CreateProcess(
sOptimize.c_str(),
0,
0,
0,
FALSE,
// CREATE_NEW_CONSOLE,
CREATE_NO_WINDOW,
0,
0,
&si,
&pi
);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// WinExec(sOptimize, SW_SHOWNORMAL);
LoadData("data.in");
ComboBox1->ItemIndex=3;
}
//---------------------------------------------------------------------------
Соседние файлы в папке Drawer_1