public class TriggerDelayCalculator
public TriggerDelayCalculatorOptions Options {get; private set;}
public void Configure(TriggerDelayCalculatorOptions options)
if (options.DistanceMmBetweenPhotocellAndCameras <= 0)
throw new ArgumentException("Invalid options.DistanceMmBetweenPhotocellAndCameras");
if (options.ConveyorSpeed <= 0)
throw new ArgumentException("Invalid options.ConveyorSpeed");
if (options.DelayMsBetweenCameras <= 0)
throw new ArgumentException("Invalid options.DelayMsBetweenCameras");
if (options.LengthMmIgnorePieze < 0)
throw new ArgumentException("Invalid options.LengthMmIgnorePieze");
public bool TryExecute(double piezeLength, out double delayCamera1, out double delayCamera2)
var theoricalDistanceMmBetweenPiezeAndCameras = Options.DistanceMmBetweenPhotocellAndCameras - piezeLength / 2 + Options.LengthMmIgnorePieze;
var theoricalDelayOfPiezeCenter = (theoricalDistanceMmBetweenPiezeAndCameras * 1000 / Options.ConveyorSpeed) + Options.DelayMsGlobal;
delayCamera1 = theoricalDelayOfPiezeCenter;
delayCamera2 = theoricalDelayOfPiezeCenter + Options.DelayMsBetweenCameras;
public class TriggerDelayCalculatorOptions
public double DistanceMmBetweenPhotocellAndCameras {get; set;}
public double ConveyorSpeed {get; set;}
public double DelayMsBetweenCameras {get; set;}
public double LengthMmIgnorePieze {get; set;}
public double DelayMsGlobal {get; set;}
public static void Main()
var options = new TriggerDelayCalculatorOptions
DistanceMmBetweenPhotocellAndCameras = 100.0,
DelayMsBetweenCameras = 20.0,
LengthMmIgnorePieze = 25.0,
var triggerDelayCalculator = new TriggerDelayCalculator();
triggerDelayCalculator.Configure(options);
triggerDelayCalculator.TryExecute(100.0, out delayCamera1, out delayCamera2);
Console.WriteLine("Delay Cam1: " + delayCamera1.ToString() + " ; Delay Cam2: " + delayCamera2.ToString());