/*
 * Capacitor.java - provides one capacitor to the inductor/time simulator.
 *
 * This is essentially a 'double' with the ability to
 * a) know about industry-standard capacitor values, and
 * b) provide a String with its value in microfarads (e.g. "1,200 uF")
 *
 * Created on October 11, 2003, 10:37 PM
 * @author  Barry barry@coilgun.info
 */
public class Capacitor {
    
    // Capacitor value, in farads
    private double capacitance;
    
    static public final int CAPACITORS_PER_DECADE = 12;
    static public final int NUMBER_DECADES = 7;
    static public final int NUMBER_CAPACITORS = NUMBER_DECADES * CAPACITORS_PER_DECADE + 1;
    
    /** Creates a new instance of Capacitor.
     *  Do not call this publicly; use @see initCapacitorList instead.
     */
    private Capacitor(double newValue) {
        capacitance = newValue;
    }
    
    /** Getter for property capacitance.
     * @return Value of capacitor (in farads)
     */
    public double getCapacitance() {
        return capacitance;
    }
    
    /** Return the string representation of a capacitor
     */
    public String toString() {
        Nearest nearest = new Nearest();
        double microFarads = getCapacitance() * 1E6;
        return nearest.toStringSigFig(microFarads, 2) + " uF";
    }
    
    /** 
     * Capacitor factory method - 
     * Create list of standard value capacitors. 
     * The main advantage of this class are these standard 20% value components.
     */
    public static Capacitor[] initCapacitorList() {
        Capacitor[] cap = new Capacitor[NUMBER_CAPACITORS];
        
        // init the first decade explicitly with industry standard values
        cap[0] = new Capacitor(1.0E-6F);
        cap[1] = new Capacitor(1.2E-6F);
        cap[2] = new Capacitor(1.5E-6F);
        cap[3] = new Capacitor(1.8E-6F);
        cap[4] = new Capacitor(2.2E-6F);
        cap[5] = new Capacitor(2.7E-6F);
        cap[6] = new Capacitor(3.3E-6F);
        cap[7] = new Capacitor(3.9E-6F);
        cap[8] = new Capacitor(4.7E-6F);
        cap[9] = new Capacitor(5.6E-6F);
        cap[10] = new Capacitor(6.8E-6F);
        cap[11] = new Capacitor(8.2E-6F);
        
        // copy and scale the first decade into other decades
        for (int index=12; index<NUMBER_CAPACITORS; index++) {
            cap[index] = new Capacitor( cap[index-CAPACITORS_PER_DECADE].capacitance * 10 );
        }
                
        return cap;
    }
    
}
