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 }