function moje(block) %toto je první funkce, kterou si program vyvolá, slouží pouze k inicializaci funkce setup
  setup(block);

function setup(block) %zde se provádí základní nastavení s-funkce
%nastavení počtu vstupů a výstupů
block.NumInputPorts  = 1;
block.NumOutputPorts = 2;

%nastavení vlastnistí vstupů a výstupů jako převzaté
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
 
block.InputPort(1).DirectFeedthrough = true;
  
%nastavení časového kroku jako převzaté
block.SampleTimes = [-1 0];


%deklarace využívaných metod
block.RegBlockMethod('Outputs', @Output); 
block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
block.RegBlockMethod('Terminate', @Terminate);

function SetInpPortFrameData(block, idx, fd) %nastavení nutné pro práci s více vstupy, nebo výstupy
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode  = fd;
block.OutputPort(2).SamplingMode = fd;

function Output(block) %zpracování vstupů a výstupů, komunikace s LJ
%zapnutí LJ a zahájení komunikace
NET.addAssembly('LJUDDotNet');
ljudObj = LabJack.LabJackUD.LJUD;
[~, ljhandle] = ljudObj.OpenLabJackS('LJ_dtU3', 'LJ_ctUSB', '0', true, 0); %připojení prvního dostupného LJ
ljudObj.ePutS(ljhandle, 'LJ_ioPIN_CONFIGURATION_RESET', 0, 0, 0); %použití základního nastavení LJ
%% Zapnutí zdroje obvodu
ljudObj.AddRequestS(ljhandle, 'LJ_ioPUT_DAC', 1, 2, 0, 0);

%získání požadovaného napětí ze vstupu do s-funkce
out = block.InputPort(1).Data; %získání požadovaného napětí ze vstupu do s-funkce
ljudObj.AddRequestS(ljhandle, 'LJ_ioPUT_DAC', 0, out, 0, 0); %přidání požadavku na zapsání získané hodnoty na pin DAC0

ljudObj.AddRequestS(ljhandle, 'LJ_ioGET_AIN', 0, 0, 0, 0); %požadavek na čtení hodnoty na AIN0
ljudObj.AddRequestS(ljhandle, 'LJ_ioGET_AIN', 1, 0, 0, 0); %požadavek na čtení hodnoty na AIN1

ljudObj.GoOne(ljhandle); %vykonání požadavků

%získání výsledku pro první požadavek (zápis hodnoty na DAC1)
[ljerror, ioType, channel, dblValue, dummyInt, dummyDbl] = ljudObj.GetFirstResult(ljhandle, 0, 0, 0, 0, 0);


%získání výsledku pro druhý požadavek (zápis hodnoty na DAC0)
[ljerror, ioType, channel, dblValue, dummyInt, dummyDbl] = ljudObj.GetNextResult(ljhandle, 0, 0, 0, 0, 0);



%získání výsledků pro třetí požadavek (čtení z AIN0)
[ljerror, ioType, channel, dblValue, dummyInt, dummyDbl] = ljudObj.GetNextResult(ljhandle, 0, 0, 0, 0, 0);

inAIN0 = dblValue; %uložení hodnoty výstupu z AIN0

%získání výsledků pro čtvrtý požadavek (čtení z AIN1)
[ljerror, ioType, channel, dblValue, dummyInt, dummyDbl] = ljudObj.GetNextResult(ljhandle, 0, 0, 0, 0, 0);

inAIN1 = dblValue; %uložení hodnoty výstupu z AIN1

%předání hodnot získaných z LJ výstupům z S-funkce
block.OutputPort(1).Data = inAIN0;
block.OutputPort(2).Data = inAIN1;


  
function Terminate(block) %Procesy pro ukončení chodu
%zajišťuje nastavení výstupní hodnoty na 0 při ukončení chodu programu
%operace zahájení komunikace musí probíhat i zde, protože s-funkce si
%nedokáže přrdávat parametry mezi metodami
ljasm = NET.addAssembly('LJUDDotNet');
ljudObj = LabJack.LabJackUD.LJUD;
[ljerror, ljhandle] = ljudObj.OpenLabJackS('LJ_dtU3', 'LJ_ctUSB', '0', true, 0);
ljudObj.AddRequestS(ljhandle, 'LJ_ioPUT_DAC', 0, 0, 0, 0);
ljudObj.AddRequestS(ljhandle, 'LJ_ioPUT_DAC', 1, 0, 0, 0); %PRO TEST POLOHY
ljudObj.GoOne(ljhandle);
