Плагин на Delphi
1. Назначение
Плагин осуществляет понижение частоты модуля АЦП в два раза.
- Работа как в реальном масштабе времени, так и в режиме просмотра файла.
- При понижении частоты новые отсчеты вычисляются как арифметическое среднее двух отсчетов.
2. Исходный текст плагина
// 03.05.2010г.
//автор Delphi-кода Максим Асташев
unit Plugin;
interface
uses lgraph2; // подключим модуль с объявлениями структур
var
Curr_PluginDataInfoStr:PluginDataInfoStr; // структура с параметрами АЦП
FirstFlag:integer; // признак первых данных
LastPoints:array[0..31] of double; // массив для хранения последнего кадра
{
Назначение - при помощи этой функции LGraph2 узнает название плагина (которое появится в настройках оборудования),
версию плагина и требуемые плагину параметры
}
procedure PluginInfo(p_info:PPluginInfoStr); stdcall;
{
Функция сообщает плагину о текущих настройках оборудования, настроенного в LGraph, а также получает от плагина
параметры рассчетных каналов (если они есть)
}
procedure PluginDataInfo(d_info:PPluginDataInfoStr); stdcall;
{
Настройка визуальных элементов. При помощи этой функции плагин может создать в окне ЛГрафа визуальные элементы типа
графиков или мультиметрных окошек.
}
procedure PluginVisualSetting(main_visual_settings: PPluginVisualMainStr; p_visual:PPluginVisualStr); stdcall;
// Основная функция обмена данными между плагином и ЛГраф2 во время ввода данных или во время просмотра файлов
procedure PluginDataExchange(data_str:PPluginDataStr); stdcall;
// Функция сообщает плагину, что начался сбор данных. Необязательная функция (в плагине может отсутствовать).
procedure PluginStartInput(data_str:PPluginDataStr); stdcall;
//Функция сообщает плагину, что закончился сбор данных. Необязательная функция (в плагине может отсутствовать).
procedure PluginStopInput(data_str:PPluginDataStr); stdcall;
implementation
uses SysUtils;
// главная функция обработки данных от АЦП
procedure PluginDataExchange(data_str:PPluginDataStr); stdcall;
var I, J,DATA_N, Index:Integer;
begin
DATA_N:=data_Str^.n*Curr_PluginDataInfoStr.adc_nch; // сколько всего отсчетов будем обрабатывать
if(FirstFlag = 1) then // для первых данных скопируем первый кадр
begin
FirstFlag:=0;
For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do
LastPoints[I]:=data_Str^.data_to_plugin^[I];
end;
// обработка массива с пришедшими данными (для вычисления первого кадра используем последний кадр от предыдущего вызова LastPoints)
For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do
For J:=0 to (data_Str^.n div 2)-1 do
if(J <> 0) then data_Str^.data_from_plugin^[J*Curr_PluginDataInfoStr.adc_nch+I]:=(data_Str^.data_to_plugin^[(J*2)*
Curr_PluginDataInfoStr.adc_nch+I]+data_Str^.data_to_plugin^[(J*2-1)*Curr_PluginDataInfoStr.adc_nch+I])/2
else data_Str^.data_from_plugin^[J*Curr_PluginDataInfoStr.adc_nch+I]:=(data_Str^.data_to_plugin^[I]+LastPoints[I])/2;
data_Str^.n_from_plugin:=data_Str^.n div 2; // число сгенерированных кадров равно половине поступивших
// запоминм последний кадр в LastPoints
Index:=DATA_N-Curr_PluginDataInfoStr.adc_nch;
For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do
LastPoints[I]:=data_Str^.data_to_plugin^[I+Index];
end;
// информационная функция
procedure PluginInfo(p_info:PPluginInfoStr); stdcall;
var I, J:Integer;
S:String;
begin
p_info^.name:='Resampler'; // название плагина
p_info^.comment:='Change sampling rate'; // комментарий
p_info^.version:=65536; // версия плагина
p_info^.lgraph_version:=$220;
p_info^.max_nch:=16;
p_info^.min_nch:=1;
for i:=0 to 31 do // сформируем названия каналов
begin
S:='In_Ch'+IntToStr(I);
for J:=1 to length(S) do p_info^.channel_names[i,j-1]:=S[j];
end;
end;
// функция получения параметров модуля АЦП (вызывается перед запуском сбора данных)
procedure PluginDataInfo(d_info:PPluginDataInfoStr); stdcall;
var I, J:Integer;
S:String;
begin
d_info^.input_kadrs_min:=10;
d_info^.input_kadrs_max:=Max_Points;
d_info^.no_omit_old_data :=1; // через плагин пойдут все данные
d_info^.plugin_nch :=d_info^.adc_nch;
d_info^.plugin_channel_rate :=d_info^.rate[0]/2; // частоту делим пополам
d_info^.max_points_from_plugin:=d_info^.input_kadrs_max div 2;
for i:=0 to 31 do // названия выходных каналов плагина
begin
S:='Out_Ch'+IntToStr(I);
for J:=1 to length(S) do d_info^.plugin_channel_names[i,j-1]:=S[j];
end;
Curr_PluginDataInfoStr:=d_info^; // запомним параметры АЦП
end;
procedure PluginVisualSetting(main_visual_settings: PPluginVisualMainStr; p_visual:PPluginVisualStr); stdcall;
begin
{}
end;
procedure PluginStartInput(data_str:PPluginDataStr); stdcall;
begin
FirstFlag:=1; // установим признак первых данных
end;
procedure PluginStopInput(data_str:PPluginDataStr); stdcall;
begin
{}
end;
end.



