// SpectrTestDlg.h : header file
public:
CGridglctrl1 m_grid; // компонент GridGL
CUnitctrl1 m_unit; // компонент Unit
CButton m_startBtn; // кнопка "Запустить "Spectr.exe"
public:
// фукнция, обрабатывающая нажатие кнопки "Запустить "Spectr.exe"
afx_msg void OnBnClickedButton1();
//функция, считывающая информацию с программы, запущенной через Юнит
void ReadyUnitctrl1(long param);
//смотрим, не было ли ошибки при соединении с программой
void CheckActivateError(long error);
//переменная, в которой хранится размер массива, получаемого от программы, запущеной через Юнит
int m_oldArraySize;
//запрос размера массива
long RequestDataArraySize();
//запрос массива, содержащего сетку частот
void RequestFreq();
public:
//структура, содержащая флаги о запросах
struct flagsS
{
//конструктор по умолчанию
flagsS::flagsS()
{
m_bRequestFreq = false;
m_bRequestSpectr = false;
}
//флаги
bool m_bRequestFreq; //запрос массива сетки частот
bool m_bRequestSpectr; //запрос коэффициентов спектра
} flags;
// SpectrTestDlg.cpp : implementation file
// обработка нажатия кнопки "Запустить "Spectr.exe"
void CSpectrTestDlg::OnBnClickedButton1()
{
//делаем кнопку запуска неактивной
m_startBtn.EnableWindow(0);
//проводим инициализацию Юнита
m_unit.InitUnit();
//запускаем программу "спектральный анализ"
long error = m_unit.Activate(L"Spectr");
//смотрим, не было ли ошибки при соединении с программой
CheckActivateError(error);
//немного подождем, пока запустится программа
Sleep(500);
//сдвигаем окно программы в левый верхний угол экрана
m_unit.MoveUnit(0,0);
//посылаем команду Юниту на запрос массива, содержащего сетку частот
RequestFreq();
}
//смотрим, не было ли ошибки при соединении с программой
void CSpectrTestDlg::CheckActivateError(long error)
{
switch (error)
{
case 0:
//все нормально, соединение есть
break;
case -1:
MessageBox(L"Нет свободного места для подключения к серверу программ Unit (слишком много программ подключено к серверу Unit)");
break;
case -2:
MessageBox(L"Нет свободного места для подключения к серверу программ Unit
(слишком много программ подключено к серверу Unit)");
break;
case -4:
MessageBox(L"не запускается программа Spectr.exe (нет на диске, не та версия)");
break;
case -5:
MessageBox(L"Программа не проходит инициализацию с сервером программ Unit (мало оперативной памяти или дискового пространства)");
break;
default: break;
}
}
//запрос массива, содержащего сетку частот
void CSpectrTestDlg::RequestFreq()
{
m_unit.SetParam(6,0);
//ставим флаг запроса сетки частот
flags.m_bRequestFreq = true;
flags.m_bRequestSpectr = false;
}
//функция, считывающая информацию с программы, запущенной через Юнит
void CSpectrTestDlg::ReadyUnitctrl1(long param)
{
//узнаем размер массива данных
long arraySize = RequestDataArraySize();
//смотрим, какая информация к нам пришла
//объявляем временные переменные
long size;
float* data = new float[arraySize]; //создаем динамический массив
long parametr;
//читаем данные, поступившие с программы Spectr.exe
m_unit.Read(&size,data,¶metr);
//если стоит флаг о запросе четки частот, то
//в предыдущей строчке (m_unit.Read) мы прочитали сетку частот
if (flags.m_bRequestFreq == true)
{
//сразу же сбрасываем флаг
flags.m_bRequestFreq = false;
//теперь необходимо выставить параметры координатной сетки компонента GridGL.ocx
m_grid.SetSize(arraySize);
m_grid.SetNumVisiblePoints(arraySize);
//выставляем параметры отображения по оси X
m_grid.SetXfirst(data[0]); //значение в начале координатной сетки
m_grid.SetXend(data[arraySize-1]);//значение в конце координатной сетки
//выставляем текущую область видимости по оси Х
m_grid.SetMathlx(data[0]); //Левая граница отображения данных
m_grid.SetMathdx(arraySize-1); //Длина отображения данных
//посылаем команду Юниту на запрос массива, содержащего спектр
m_unit.SetParam(7,0);
//ставим флаг запроса спектра
flags.m_bRequestSpectr = true;
} else
{
//если размер вновь пришедшего массива отличается от размера предыдущего массива,
//значит надо подстроить координатную сетку под новый размер
//(это может быть если вы изменили настройки Spectr.exe в ручную, а не через Юнит)
if (m_oldArraySize != arraySize)
{
m_oldArraySize = arraySize;
RequesrFreq();
}
else
//если же пришел спектр, то просто отрисовываем его на графике
m_grid.Paint(data);
}
//поскольку массив динамический, то необходимо его удалить
delete []data;
}
//запрос размера массива, передаваемого от запущенной программы Spectr.exe
long CSpectrTestDlg::RequestDataArraySize()
{
long size;
float data;
long parametr;
m_unit.Read(&size,NULL,¶metr);
return size;
}