using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BenchtopParser { public class Program { public String? ProgramNumber { get; set; } public Dictionary> Group { get; set; } public Program() { this.Group = new Dictionary>(); } } public class Configuration { public String? name { get; set; } public String? value { get; set; } public String? type { get; set; } public String? unit { get; set; } public Configuration(List config, String data) { String[] nameValue = data.Split("="); name = nameValue[0].Trim(); value = nameValue[1].Trim(); unit = config[1].Trim(); type = config[2].Trim(); //a, c, f, i } } public class ProgramConfig { public Dictionary programs = new Dictionary(); public ProgramConfig (String program_config_value) { Program? current = null; foreach (var line in program_config_value.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) { List configLine = line.Split("\t").ToList(); if (configLine.Count < 2) { throw new Exception("Invalid Program Config, please provide an I28 Program Config file data"); } // Remove the first two items because they seem to be a checksum and an unneeded type. // Then we can start at 0 like normal, not have the first important bit be at 2. configLine.RemoveAt(0); // Remove random hex value configLine.RemoveAt(0); // Remove L column /* LOOP CONTROL */ if (configLine[0].StartsWith("Start,")) { // initialize programconfig current = new Program(); continue; } if (configLine[0].StartsWith("Stop,")) { // Short circuit early when stop comes. if (current != null && current.ProgramNumber != null) { programs.Add(current.ProgramNumber, current); } current = null; // TODO: What if multiple configs how to handle start and stop? break; } var config = configLine[0].Split(",", 2).ToList(); if (configLine.Count == 1) { // Set Program Number if (current == null) { throw new Exception("Setting Program Number Before Start. Error In Config"); } current.ProgramNumber = config[1]; continue; } /* CREATE A CONFIGURATION */ var value = config[1]; var programnumber_group_data = value.Split('\\'); // snake case as its three values var data = programnumber_group_data[2]; if (data.StartsWith("=")) { continue; /* comment line */ } Configuration lineConfig = new Configuration(configLine, data); // Deal with this group logic var group = programnumber_group_data[1]; if (current != null && !current.Group.ContainsKey(group)) { current.Group.Add(group, new Dictionary { { lineConfig.name, lineConfig } }); } else if (current != null) { current.Group[group].Add(lineConfig.name, lineConfig); } else { throw new Exception("Config list is null, something broke"); } } // TODO: What if multiple configs how to handle start and stop? } } }