<?xml version="1.0" encoding="ISO-8859-1"?>
<Xfn2Function xmlns="http://www.mclarenelectronics.com/schemas/OcsXfn"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="C:\Users\christopher.mantle\Documents\McLaren Electronic Systems\ATLAS 9\Funclib\OcsXFn.xsd">
    <InputParameters>
        <Identifier>aSteerWheel:Chassis</Identifier>
    </InputParameters>
    <OutputParameters>
        <OutputParameter>
            <Name>steerWheelSin</Name>
            <Description><![CDATA[Sine of steering wheel angle]]>
</Description>
            <Units>°</Units>
            <Format>%.2f</Format>
            <DisplayMin>-1.00</DisplayMin>
            <DisplayMax>1.00</DisplayMax>
        </OutputParameter>
        <OutputParameter>
            <Name>steerWheelCos</Name>
            <Description><![CDATA[Cosine of steering wheel angle]]>
</Description>
            <Units>°</Units>
            <Format>%.2f</Format>
            <DisplayMin>-1.00</DisplayMin>
            <DisplayMax>1.00</DisplayMax>
        </OutputParameter>
    </OutputParameters>
    <FunctionMode>XFN_Instantaneous</FunctionMode>
	<CalculationMode>XFN_EachSample</CalculationMode>
	<InterpolateBetweenSamples>false</InterpolateBetweenSamples>
	<JoinGapsAroundNull>true</JoinGapsAroundNull>
	<CalculateOverWholeSession>false</CalculateOverWholeSession>
	<StoreInSession>false</StoreInSession>
    <Implementation>
        <CSharpFunctionImplementationDefinition>
            <FunctionCode><![CDATA[using System;
using System.Collections.Generic;
using MESL.SqlRace.Domain.Functions;

public sealed class CalculatesSineAndCosine : IFunction
{
    public void Execute(IExecutionContext executionContext)
    {
        var functionInput = executionContext.FunctionInput;
        var functionOutput = executionContext.FunctionOutput;

        var timestampsCount = functionInput.Timestamps.Length;

        var aSteerWheelIndex = functionInput.InputParameterIndexes["aSteerWheel:Chassis"];
        var steerWheelSinIndex = functionOutput.OutputParameterIndexes["steerWheelSin:FunctionParameters"];
        var steerWheelCosIndex = functionOutput.OutputParameterIndexes["steerWheelCos:FunctionParameters"];

        var aSteerWheel = functionInput.Values[aSteerWheelIndex];
        var steerWheelSin = functionOutput.OutputParametersValues[steerWheelSinIndex];
        var steerWheelCos = functionOutput.OutputParametersValues[steerWheelCosIndex];
        for (var i = 0; i < timestampsCount; i++)
        {
            var aSteerWheelValueDeg = aSteerWheel[i];
            var aSteerWheelValueRad = DegreesToRadians(aSteerWheelValueDeg);
            steerWheelSin[i] = Math.Sin(aSteerWheelValueRad);
            steerWheelCos[i] = Math.Cos(aSteerWheelValueRad);
        }
    }
    
    private double DegreesToRadians(double degrees)
    {
        return Math.PI * degrees / 180.0;
    }
}
]]></FunctionCode>
        </CSharpFunctionImplementationDefinition>
    </Implementation>
    <Trigger>
        <ExecuteOnEveryDataRequestDefinition />
    </Trigger>
</Xfn2Function>
