public void Add(EngineCycle cycle)
 {
     if (!cycles.Contains(cycle))
     {
         cycles.Add(cycle);
     }
 }
 public void Init(float[] source, EngineCycle cycle, int cyclePadding)
 {
     sourceData           = source;
     startSample          = cycle.startSample - cyclePadding;
     currentSample        = startSample;
     attackTimeSamples    = cyclePadding;
     sustainTimeSamples   = cycle.endSample - cycle.startSample;
     releaseTimeSamples   = cyclePadding;
     gainPerSampleAttack  = 1f / (float)attackTimeSamples;
     gainPerSampleRelease = -1f / (float)releaseTimeSamples;
     attackEndSample      = startSample + attackTimeSamples;
     releaseStartSample   = attackEndSample + sustainTimeSamples;
     endSample            = releaseStartSample + releaseTimeSamples;
     gain = 0f;
 }
        public async Task Initialize()
        {
            var fileName = await EnsureFile();

            var firstLine = true;

            _engineCycles    = new List <EngineCycle>();
            using var reader = File.OpenText(fileName);
            // Read through the entire file and add all cycles to the collection
            while (!reader.EndOfStream)
            {
                if (firstLine)
                {
                    header    = (await reader.ReadLineAsync())?.Split(',');
                    firstLine = false;
                }
                else
                {
                    var line = await reader.ReadLineAsync();

                    var item       = new EngineCycle();
                    var sensorData = line.Split(',');
                    item.EngineId   = "engine" + int.Parse(sensorData[0]).ToString("000");
                    item.Cycle      = Convert.ToInt32(sensorData[1]);
                    item.Data       = line;
                    item.SensorData = sensorData;
                    _engineCycles.Add(item);
                }
            }

            // Initialize state for every engine
            _cycleStates = new Dictionary <string, CycleState>();
            foreach (var engineId in _engineCycles.Select(cycle => cycle.EngineId).Distinct())
            {
                _cycleStates.Add(engineId,
                                 new CycleState
                {
                    Direction = Direction.Up, NextCycle = 1,
                    Cycles    = _engineCycles.Where(cycle =>
                                                    cycle.EngineId.Equals(engineId, StringComparison.CurrentCultureIgnoreCase))
                });
            }
        }