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 import edu.wpi.first.wpilibj.tables.ITable; 012 013 /** 014 * Base class for all sensors. 015 * Stores most recent status information as well as containing utility functions for checking 016 * channels and error processing. 017 */ 018 public abstract class SensorBase { // TODO: Refactor 019 020 /** 021 * Ticks per microsecond 022 */ 023 public static final int kSystemClockTicksPerMicrosecond = 40; 024 /** 025 * Number of digital channels per digital sidecar 026 */ 027 public static final int kDigitalChannels = 14; 028 /** 029 * Number of analog channels per module 030 */ 031 public static final int kAnalogChannels = 8; 032 /** 033 * Number of analog modules 034 */ 035 public static final int kAnalogModules = 2; 036 /** 037 * Number of solenoid channels per module 038 */ 039 public static final int kSolenoidChannels = 8; 040 /** 041 * Number of analog modules 042 */ 043 public static final int kSolenoidModules = 2; 044 /** 045 * Number of PWM channels per sidecar 046 */ 047 public static final int kPwmChannels = 10; 048 /** 049 * Number of relay channels per sidecar 050 */ 051 public static final int kRelayChannels = 8; 052 053 private static int m_defaultAnalogModule = 1; 054 private static int m_defaultDigitalModule = 1; 055 private static int m_defaultSolenoidModule = 1; 056 057 /** 058 * Creates an instance of the sensor base and gets an FPGA handle 059 */ 060 public SensorBase() { 061 } 062 063 /** 064 * Sets the default Digital Module. 065 * This sets the default digital module to use for objects that are created without 066 * specifying the digital module in the constructor. The default module is initialized 067 * to the first module in the chassis. 068 * 069 * @param moduleNumber The number of the digital module to use. 070 */ 071 public static void setDefaultDigitalModule(final int moduleNumber) { 072 checkDigitalModule(moduleNumber); 073 SensorBase.m_defaultDigitalModule = moduleNumber; 074 } 075 076 /** 077 * Sets the default Analog module. 078 * This sets the default analog module to use for objects that are created without 079 * specifying the analog module in the constructor. The default module is initialized 080 * to the first module in the chassis. 081 * 082 * @param moduleNumber The number of the analog module to use. 083 */ 084 public static void setDefaultAnalogModule(final int moduleNumber) { 085 checkAnalogModule(moduleNumber); 086 SensorBase.m_defaultAnalogModule = moduleNumber; 087 } 088 089 /** 090 * Set the default location for the Solenoid (9472) module. 091 * 092 * @param moduleNumber The number of the solenoid module to use. 093 */ 094 public static void setDefaultSolenoidModule(final int moduleNumber) { 095 checkSolenoidModule(moduleNumber); 096 SensorBase.m_defaultSolenoidModule = moduleNumber; 097 } 098 099 /** 100 * Check that the digital module number is valid. 101 * Module numbers are 1 or 2 (they are no longer real cRIO slots). 102 * 103 * @param moduleNumber The digital module module number to check. 104 */ 105 protected static void checkDigitalModule(final int moduleNumber) { 106 if(!ModulePresence.getModulePresence(ModulePresence.ModuleType.kDigital, moduleNumber - 1)) 107 System.err.println("Digital module " + moduleNumber + " is not present."); 108 } 109 110 /** 111 * Check that the digital module number is valid. 112 * Module numbers are 1 or 2 (they are no longer real cRIO slots). 113 * 114 * @param moduleNumber The digital module module number to check. 115 */ 116 protected static void checkRelayModule(final int moduleNumber) { 117 checkDigitalModule(moduleNumber); 118 } 119 120 /** 121 * Check that the digital module number is valid. 122 * Module numbers are 1 or 2 (they are no longer real cRIO slots). 123 * 124 * @param moduleNumber The digital module module number to check. 125 */ 126 protected static void checkPWMModule(final int moduleNumber) { 127 checkDigitalModule(moduleNumber); 128 } 129 130 /** 131 * Check that the analog module number is valid. 132 * Module numbers are 1 or 2 (they are no longer real cRIO slots). 133 * 134 * @param moduleNumber The analog module module number to check. 135 */ 136 protected static void checkAnalogModule(final int moduleNumber) { 137 if(!ModulePresence.getModulePresence(ModulePresence.ModuleType.kAnalog, moduleNumber - 1)) { 138 System.err.println("Analog module " + moduleNumber + " is not present."); 139 } 140 } 141 142 /** 143 * Verify that the solenoid module is correct. 144 * Module numbers are 1 or 2 (they are no longer real cRIO slots). 145 * 146 * @param moduleNumber The solenoid module module number to check. 147 */ 148 protected static void checkSolenoidModule(final int moduleNumber) { 149 if(!ModulePresence.getModulePresence(ModulePresence.ModuleType.kSolenoid, moduleNumber - 1)) { 150 System.err.println("Solenoid module " + moduleNumber + " is not present."); 151 } 152 } 153 154 /** 155 * Check that the digital channel number is valid. 156 * Verify that the channel number is one of the legal channel numbers. Channel numbers are 157 * 1-based. 158 * 159 * @param channel The channel number to check. 160 */ 161 protected static void checkDigitalChannel(final int channel) { 162 if (channel <= 0 || channel > kDigitalChannels) { 163 System.err.println("Requested digital channel number is out of range."); 164 } 165 } 166 167 /** 168 * Check that the digital channel number is valid. 169 * Verify that the channel number is one of the legal channel numbers. Channel numbers are 170 * 1-based. 171 * 172 * @param channel The channel number to check. 173 */ 174 protected static void checkRelayChannel(final int channel) { 175 if (channel <= 0 || channel > kRelayChannels) { 176 System.err.println("Requested relay channel number is out of range."); 177 throw new IndexOutOfBoundsException("Requested relay channel number is out of range."); 178 } 179 } 180 181 /** 182 * Check that the digital channel number is valid. 183 * Verify that the channel number is one of the legal channel numbers. Channel numbers are 184 * 1-based. 185 * 186 * @param channel The channel number to check. 187 */ 188 protected static void checkPWMChannel(final int channel) { 189 if (channel <= 0 || channel > kPwmChannels) { 190 System.err.println("Requested PWM channel number is out of range."); 191 throw new IndexOutOfBoundsException("Requested PWM channel number is out of range."); 192 } 193 } 194 195 /** 196 * Check that the analog channel number is value. 197 * Verify that the analog channel number is one of the legal channel numbers. Channel numbers 198 * are 1-based. 199 * 200 * @param channel The channel number to check. 201 */ 202 protected static void checkAnalogChannel(final int channel) { 203 if (channel <= 0 || channel > kAnalogChannels) { 204 System.err.println("Requested analog channel number is out of range."); 205 } 206 } 207 208 /** 209 * Verify that the solenoid channel number is within limits. Channel numbers 210 * are 1-based. 211 * 212 * @param channel The channel number to check. 213 */ 214 protected static void checkSolenoidChannel(final int channel) { 215 if (channel <= 0 || channel > kSolenoidChannels) { 216 System.err.println("Requested solenoid channel number is out of range."); 217 } 218 } 219 220 /** 221 * Get the number of the default analog module. 222 * 223 * @return The number of the default analog module. 224 */ 225 public static int getDefaultAnalogModule() { 226 return SensorBase.m_defaultAnalogModule; 227 } 228 229 /** 230 * Get the number of the default analog module. 231 * 232 * @return The number of the default analog module. 233 */ 234 public static int getDefaultDigitalModule() { 235 return SensorBase.m_defaultDigitalModule; 236 } 237 238 /** 239 * Get the number of the default analog module. 240 * 241 * @return The number of the default analog module. 242 */ 243 public static int getDefaultSolenoidModule() { 244 return SensorBase.m_defaultSolenoidModule; 245 } 246 247 /** 248 * Free the resources used by this object 249 */ 250 public void free() {} 251 }