public Lamp(PDBConfig pdb, string number_str) { this.pdb = pdb; string upper_str = number_str.ToUpper(); if (IsDirectLamp(upper_str)) { this.lamp_type = "dedicated"; this.output = (byte)(Int32.Parse(number_str.Substring(1))); } else if (IsPDBLamp(number_str)) { this.lamp_type = "pdb"; string[] addr_parts = PDBFunctions.SplitMatrixAddressParts(number_str); string source_addr, sink_addr; source_addr = addr_parts[0]; sink_addr = addr_parts[1]; PDBAddress addr = PDBFunctions.DecodePdbAddress(source_addr, pdb.aliases.ToArray()); source_boardnum = addr.board; source_banknum = addr.bank; source_outputnum = addr.output; addr = PDBFunctions.DecodePdbAddress(sink_addr, pdb.aliases.ToArray()); sink_boardnum = addr.board; sink_banknum = addr.bank; sink_outputnum = addr.output; } else { lamp_type = "unknown"; } }
/// <summary> /// Decodes Ax-By-z or x/y/z into PDB address, bank number, and output number. <para/> /// Raises exception if it is not a PDB address, otherwise returns a PDBAddress - (addr, bank, number). /// </summary> /// <param name="addr"></param> /// <param name="aliases"></param> /// <returns></returns> /// <exception cref="ArgumentOutOfRangeException"></exception> /// <exception cref="ArgumentException"></exception> public static PDBAddress DecodePdbAddress(string addr, DriverAlias[] aliases = null) { if (aliases == null) { aliases = new DriverAlias[] { } } ; string[] _params; PDBAddress address = new PDBAddress(); foreach (DriverAlias alias in aliases) { if (alias.match(addr).Success) { addr = alias.decode(addr); break; } } if (addr.Contains('-')) { _params = addr.Split('-'); if (_params.Length != 3) { throw new ArgumentOutOfRangeException("PDB address must have 3 components"); } address.board = (byte)Int32.Parse(_params[0].Substring(1)); address.bank = (byte)Int32.Parse(_params[1].Substring(1)); address.output = (byte)Int32.Parse(_params[2]); return(address); } else if (addr.Contains('/')) { _params = addr.Split('/'); Array.Reverse(_params); if (_params.Length != 3) { throw new ArgumentOutOfRangeException("PDB address must have 3 components"); } address.board = (byte)Int32.Parse(_params[0]); address.bank = (byte)Int32.Parse(_params[1]); address.output = (byte)Int32.Parse(_params[2]); return(address); } else { throw new ArgumentException("PDB address delimiter (- or /) not found"); } }
public Coil(PDBConfig pdb, string number_str) { this.pdb = pdb; string upper_str = number_str.ToUpper(); if (this.is_direct_coil(upper_str)) { this.coil_type = "dedicated"; this.bank_num = (byte)((Int32.Parse(number_str.Substring(1)) - 1) / 8); this.output_num = (byte)(Int32.Parse(number_str.Substring(1))); } else if (this.is_pdb_coil(number_str)) { this.coil_type = "pdb"; PDBAddress addr = PDBFunctions.DecodePdbAddress(number_str, this.pdb.aliases.ToArray()); this.board_num = addr.board; this.bank_num = addr.bank; this.output_num = addr.output; } }