예제 #1
0
        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";
            }
        }
예제 #2
0
        /// <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");
            }
        }
예제 #3
0
        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;
            }
        }