001    /*----------------------------------------------------------------------------*/
002    /* Copyright (c) FIRST 2008-2012. All Rights Reserved.                        */
003    /* Open Source Software - may be modified and shared by FRC teams. The code   */
004    /* must be accompanied by the FIRST BSD license file in the root directory of */
005    /* the project.                                                               */
006    /*----------------------------------------------------------------------------*/
007    
008    package edu.wpi.first.wpilibj;
009    
010    import edu.wpi.first.wpilibj.communication.ModulePresence;
011    
012    /**
013     * Base class for AnalogModule and DigitalModule.
014     * 
015     * @author dtjones
016     */
017    public class Module extends SensorBase {
018    
019        /**
020         * An array holding the object representing each module
021         */
022        protected static Module[] m_modules = new Module[ModulePresence.ModuleType.kSolenoid.getValue() * ModulePresence.kMaxModuleNumber + (ModulePresence.kMaxModuleNumber - 1)];
023        /**
024         * The module number of the module
025         */
026        protected int m_moduleNumber;
027        protected ModulePresence.ModuleType m_moduleType;
028    
029        /**
030         * Constructor.
031         *
032         * @param moduleNumber The number of this module (1 or 2).
033         */
034        protected Module(ModulePresence.ModuleType moduleType, final int moduleNumber) {
035            m_modules[toIndex(moduleType, moduleNumber)] = this;
036            m_moduleNumber = moduleNumber;
037        }
038    
039        /**
040         * Gets the module number associated with a module.
041         *
042         * @return The module's number.
043         */
044        public int getModuleNumber() {
045            return m_moduleNumber;
046        }
047    
048        /**
049         * Gets the module type associated with a module.
050         *
051         * @return The module's type.
052         */
053        public ModulePresence.ModuleType getModuleType() {
054            return m_moduleType;
055        }
056    
057        /**
058         * Static module singleton factory.
059         * 
060         * @param moduleType The type of the module represented.
061         * @param moduleNumber The module index within the module type.
062         * @return the module
063         */
064        public static Module getModule(ModulePresence.ModuleType moduleType, int moduleNumber) {
065            if(m_modules[toIndex(moduleType, moduleNumber)] == null) {
066                if(moduleType.equals(ModulePresence.ModuleType.kAnalog)) {
067                    new AnalogModule(moduleNumber);
068                } else if (moduleType.equals(ModulePresence.ModuleType.kDigital)) {
069                    new DigitalModule(moduleNumber);
070      /*        } else if (moduleType.equals(ModulePresence.ModuleType.kSolenoid)) {
071                    new Sol
072       */      } else {
073                    throw new RuntimeException("A module of type "+moduleType+" with module index "+moduleNumber);
074                }
075            }
076            return m_modules[toIndex(moduleType, moduleNumber)];
077        }
078    
079        /**
080         * Create an index into m_modules based on type and number
081         *
082         * @param moduleType The type of the module represented.
083         * @param moduleNumber The module index within the module type.
084         * @return The index into m_modules.
085         */
086        private static int toIndex(ModulePresence.ModuleType moduleType, int moduleNumber) {
087            if(moduleNumber == 0 || moduleNumber > ModulePresence.kMaxModuleNumber)
088                return 0;
089            return moduleType.getValue() * ModulePresence.kMaxModuleNumber + (moduleNumber - 1);
090        }
091    }