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 }