%% $Revision: 1.1.6.3 $
%% 
%%
%% Copyright 1994-2003 The MathWorks, Inc.
%%
%% Abstract:
%%      Signal Generator block target file.
%%

%implements SignalGenerator "C"

%% Function: BlockInstanceSetup ==============================================
%% Abstract:
%%   Set expression folding compliance
%%
%function BlockInstanceSetup(block, system) void
  %<LibBlockSetIsExpressionCompliant(block)>
%endfunction


%% Function: NoPortOutputs ==========================================================
%% Abstract:
%%      Generate output for specified waveform
%%
%function NoPortOutputs(block, system) Output
  {
  %assign time = "%<LibGetT()>"
  %%
  %assign nfreq = SIZE(Frequency.Value, 1)
  %%
  %switch ParamSettings.WaveForm
    %case "sine"
      %assign twoPi = ParamSettings.TwoPi
      %if nfreq == 1
	%assign freq = LibBlockParameter(Frequency,"","",0)
	%if TYPE(freq) == "Real"
	  real_T sin2PiFT = sin(%<twoPi*freq>*%<time>);
	%else
	  real_T sin2PiFT = sin(%<twoPi>*%<freq>*%<time>);
	%endif
	%assign sinterm = "sin2PiFT"
      %else
	real_T twoPiT = %<twoPi>*%<time>;
	%assign twoPiTime = "twoPiT"
      %endif
      %break
    %case "square"
      %if nfreq == 1
	%assign freq = LibBlockParameter(Frequency,"","",0)
	real_T phase = %<freq>*%<time>;
	phase = phase-floor(phase);
      %else
	real_T phase;
      %endif
      %break
    %case "sawtooth"
      %if nfreq == 1
	%assign freq = LibBlockParameter(Frequency,"","",0)
	real_T phase = %<freq>*%<time>;
	phase = 1.0-2.0*(phase-floor(phase));
      %else
	real_T phase;
      %endif
      %break
    %default
      %%START_ASSERT
      %assign errTxt = "Unknown waveform: %<ParamSettings.WaveForm>"
      %<LibBlockReportFatalError(block, errTxt)>
      %%END_ASSERT
  %endswitch
  %%
  %assign rollVars = ["Y", "P"]
  %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
    %assign y = LibBlockOutputSignal(0, "", lcv, idx)
    %switch ParamSettings.WaveForm
      %case "sine"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%assign freq = LibBlockParameter(Frequency, "", lcv, idx)
	%if nfreq > 1
	  %if TYPE(freq) == "Real"
	    %assign sinterm = "sin(%<freq>*%<twoPiTime>)"
	  %else
	    %assign sinterm = "sin(%<freq>*%<twoPiTime>)"
	  %endif
	%endif
	%<y> = %<ampl>*%<sinterm>;
	%break
      %case "square"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%if TYPE(ampl) == "Real"
	  %assign minusampl = -ampl
	%else
	  %assign minusampl = "-%<ampl>"
	%endif
	%assign freq = LibBlockParameter(Frequency, "", lcv, idx)
	%if nfreq > 1
	  phase = %<freq>*%<time>;
	  phase = phase-floor(phase);
	%endif
	%<y> = ( phase >= 0.5 ) ?
	%<ampl> : %<minusampl>;
	%break
      %case "sawtooth"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%assign freq = LibBlockParameter(Frequency, "", lcv, idx)
	%if nfreq > 1
	  phase = %<freq>*%<time>;
	  phase = 1.0-2.0*(phase-floor(phase));
	%endif
	%<y> = %<ampl>*phase;
	%break
	%%START_ASSERT
      %default
	%assign errTxt = "Unknown waveform: %<ParamSettings.WaveForm>"
	%<LibBlockReportFatalError(block, errTxt)>
	%%END_ASSERT
    %endswitch
  %endroll
  }

%endfunction

%% Function: PortOutputs ==========================================================
%% Abstract:
%%      Generate output for specified waveform
%%
%function PortOutputs(block, system) Output
  {
  %%
  %if (LibDataInputPortWidth(0) == 1)
    %%
    %assign time = LibBlockInputSignal(0, "", "", 0)
    %%
  %endif
  %%
  %assign nfreq = SIZE(Frequency.Value, 1)
  %%
  %if (nfreq == 1)
    %%
    %assign freq = LibBlockParameter(Frequency,"","",0)
    %%
  %endif
  %%
  %switch ParamSettings.WaveForm
    %case "sine"
      %assign twoPi = ParamSettings.TwoPi
      %if (nfreq == 1) && (LibDataInputPortWidth(0) == 1)
	%%
	%if TYPE(freq) == "Real" && TYPE(time) == "Real"
	  %%
	  real_T sin2PiFT = sin(%<twoPi*freq*time>);
	  %%
	%elseif TYPE(freq) == "Real"
	  %%
	  real_T sin2PiFT = sin(%<twoPi*freq>*%<time>);
	  %%
	%elseif TYPE(time) == "Real"
	  %%
	  real_T sin2PiFT = sin(%<twoPi*time>*%<freq>);
	  %%
	%else
	  %%
	  real_T sin2PiFT = sin(%<twoPi>*%<freq>*%<time>);
	  %%
	%endif
	%%
	%assign sinterm = "sin2PiFT"
	%%
      %elseif LibDataInputPortWidth(0) == 1
	%%
	real_T twoPiT = %<twoPi>*%<time>;
	%%
	%assign twoPiTime = "twoPiT"
	%%
      %elseif nfreq == 1
	%%
	real_T twoPiF = %<twoPi>*%<freq>;
	%%
	%assign twoPiFreq = "twoPiF"
	%%
      %endif
      %break
    %case "square"
      %if (nfreq == 1) && (LibDataInputPortWidth(0) == 1)
	%assign freq = LibBlockParameter(Frequency,"","",0)
	%%
	real_T phase = %<freq>*%<time>;
	phase = phase-floor(phase);
	%%
      %else
	%%
	real_T phase;
	%%
      %endif
      %break
    %case "sawtooth"
      %if (nfreq == 1) && (LibDataInputPortWidth(0) == 1)
	%assign freq = LibBlockParameter(Frequency,"","",0)
	%%
	real_T phase = %<freq>*%<time>;
	phase = 1.0-2.0*(phase-floor(phase));
	%%
      %else
	%%
	real_T phase;
	%%
      %endif
      %break
    %default
      %%START_ASSERT
      %assign errTxt = "Unknown waveform: %<ParamSettings.WaveForm>"
      %<LibBlockReportFatalError(block, errTxt)>
      %%END_ASSERT
  %endswitch
  %%
  %assign rollVars = ["Y", "U", "P"]
  %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
    %assign y = LibBlockOutputSignal(0, "", lcv, idx)
    %%
    %if (LibDataInputPortWidth(0) > 1)
      %%
      %assign time = LibBlockInputSignal(0, "", lcv, idx)
      %%
    %endif
    %%
    %if (nfreq > 1)
      %%
      %assign freq = LibBlockParameter(Frequency, "", lcv, idx)
      %%
    %endif
    %%
    %switch ParamSettings.WaveForm
      %case "sine"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%%
	%if (nfreq > 1) && (LibDataInputPortWidth(0) > 1)
	  %%
	  %assign sinterm = "sin(%<twoPi> * %<freq> * %<time>)"
	  %%
	%elseif (nfreq > 1)
	  %%
	  %assign sinterm = "sin(%<freq> * %<twoPiTime>)"
	  %%
	%elseif (LibDataInputPortWidth(0) > 1)
	  %%
	  %assign sinterm = "sin(%<twoPiFreq> * %<time>)"
	  %%
	%endif
	%%
	%<y> = %<ampl>*%<sinterm>;
	%break
      %case "square"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%if TYPE(ampl) == "Real"
	  %assign minusampl = -ampl
	%else
	  %assign minusampl = "-%<ampl>"
	%endif
	%assign freq = LibBlockParameter(Frequency, "", lcv, idx)
	%if (nfreq > 1) || (LibDataInputPortWidth(0) > 1)
	  phase = %<freq>*%<time>;
	  %%
	  phase = phase-floor(phase);
	  %%
	%endif
	%%
	%<y> = ( phase >= 0.5 ) ?
	%<ampl> : %<minusampl>;
	%%
	%break
      %case "sawtooth"
	%assign ampl = LibBlockParameter(Amplitude, "", lcv, idx)
	%assign freq = LibBlockParameter(Frequency, "", lcv, idx)
	%if (nfreq > 1) || (LibDataInputPortWidth(0) > 1)
	  phase = %<freq>*%<time>;
	  %%
	  phase = 1.0-2.0*(phase-floor(phase));
	  %%
	%endif
	%<y> = %<ampl>*phase;
	%break
	%%START_ASSERT
      %default
	%assign errTxt = "Unknown waveform: %<ParamSettings.WaveForm>"
	%<LibBlockReportFatalError(block, errTxt)>
	%%END_ASSERT
    %endswitch
  %endroll
  }

%endfunction

%% Function: Outputs ==========================================================
%%
%function Outputs(block, system) Output
  %%
  %if timeSrc == 1
    %%
    %<PortOutputs(block, system)>
    %%
  %else
    %%
    %<NoPortOutputs(block, system)>
    %%
  %endif
  %%
%endfunction

%% [EOF] siggen.tlc
