versadac  1
versadac - Scalable Recorder Firmware
eiot2srai2.h
1 /*******************************************************************************
2 FILE : eiot2srai2.h
3 VERSION : $Id$
4 AUTHOR : David Cozens
5 SYSTEM : Diab C for PowerPC under vxWorks
6 DESCRIPTION : This file contains The t2500 module classes
7 
8  Modification for 8Hz execution (for Scalable Recorder)
9 
10 *******************************************************************************/
11 
12 #ifndef __EIOT2SRAI2_H
13 #define __EIOT2SRAI2_H
14 /* The following section is needed by eio_t25sr.c */
15 
16 /*
17  * Defines for the different calibration points, two are used for each range
18  */
19 #define AIC_CAL_VOLT_LOW (2000.0) /* (+/- 10V) low cal pnt */
20 #define AIC_CAL_VOLT_HIGH (8000.0) /* (+/- 10V) high cal pnt */
21 #define AIC_CAL_MV_LOW (20.0) /* (+/- 150mV) low cal pnt */
22 #define AIC_CAL_MV_HIGH (80.0) /* (+/- 150mV) high cal pnt */
23 #define AIC_CAL_MA_LOW (4.0) /* (+/- 30mA) low cal pnt */
24 #define AIC_CAL_MA_HIGH (16.0) /* (+/- 30mA) high cal pnt */
25 #define AIC_CAL_HIZ_LOW (800.0) /* (0...1.8V) low cal pnt */
26 #define AIC_CAL_HIZ_HIGH (1200.0) /* (0...1.8V) high cal pnt */
27 #define AIC_CAL_OHM_LOW (200.0) /* Ohms low cal pnt */
28 #define AIC_CAL_OHM_HIGH (400.0) /* Ohms high cal pnt */
29 #define AIC_CAL_HOHM_LOW (1200.0) /* Ohms (high range) low cal pnt */
30 #define AIC_CAL_HOHM_HIGH (4800.0) /* Ohms (high range) high cal pnt*/
31 
32 /* Range Limits */
33 #define AIC_VOLT_RANGE_LOW (-10300.0) /* -10.3V */
34 #define AIC_VOLT_RANGE_HIGH (10300.0) /* 10.3V */
35 #define AIC_MV_RANGE_LOW (-150.0) /* -150mV */
36 #define AIC_MV_RANGE_HIGH (150.0) /* 150mV */
37 #define AIC_AI2_4_MA_RANGE_LOW (-30.0) /* -30mA */
38 #define AIC_AI2_4_MA_RANGE_HIGH (30.0) /* 30mA */
39 #define AIC_AI3_MA_RANGE_LOW (-28.0) /* -28mA */
40 #define AIC_AI3_MA_RANGE_HIGH (28.0) /* 28mA */
41 
42 #define AIC_HIZ_RANGE_LOW (0.0) /* 0.0V */
43 #define AIC_HIZ_RANGE_HIGH (1800.0) /* 1.8V */
44 #define AIC_OHM_RANGE_LOW (0.0) /* 0.0 Ohm */
45 #define AIC_OHM_RANGE_HIGH (464.0) /* 464.0 Ohm */
46 #define AIC_HOHM_RANGE_LOW (0.0) /* 0.0 Ohm */
47 #define AIC_HOHM_RANGE_HIGH (7000.0) /* 7000.0 Ohm */
48 #define AIC_POT_RANGE_LOW (0.0) /* 0.0% */
49 #define AIC_POT_RANGE_HIGH (100.0) /* 100.0% */
50 
51 #define AIC_MV_RANGE_NOMINAL_INPUT_IMPEDANCE (100000000.0f)
52 #define AIC_MA_RANGE_NOMINAL_INPUT_IMPEDANCE (5.0f)
53 #define AIC_AI3_NOMINAL_INPUT_IMPEDANCE (70.0f)
54 #define AIC_HIZ_RANGE_NOMINAL_INPUT_IMPEDANCE (101000000.0f)
55 #define AIC_VOLT_RANGE_NOMINAL_INPUT_IMPEDANCE (303000.0f)
56 
57 #define AIC_MAX_FILTER_TIME (999999999) /* 999.999999 seconds */
58 
59 /* Capability discovery functions use AI2_NUMBER_OF_CALIBRATION_RANGES */
60 enum Ai2CalibrationRangeEnum
61 {
62  AI2_CALIBRATION_RANGE_VOLTS,
63  AI2_CALIBRATION_RANGE_MILLIVOLTS,
64  AI2_CALIBRATION_RANGE_HiZ_VOLTS,
65  AI2_CALIBRATION_RANGE_RTD_OHMS,
66  AI2_CALIBRATION_RANGE_RTD_OHMS_HIGH,
67  AI2_NUMBER_OF_CALIBRATION_RANGES
68 };
69 
70 /* Capability discovery functions use AI2_NUMBER_OF_CHANNELS */
71 enum Ai2Channels
72 {
73  AI2_CHANNEL_1,
74  AI2_CHANNEL_2,
75  AI2_NUMBER_OF_CHANNELS
76 };
77 
78 #ifdef __cplusplus
79 
80 /* This section must never be included from C */
81 
82 
83 #include "eio_t25srm.h"
84 #include "dfc_ssm.h"
85 #include "rst_ssm.h"
86 #include "led_ssm.h"
87 
88 #ifdef __cplusplus
89 extern "C" {
90 #endif
91 
92 // All ranges are polled on a basic 125mS update cycle. Ancilliary readings
93 // such as CJ measurement are interleaved with zero reference measurements on alternate
94 // 125mS cycles. A variable of this type is maintained and toggled on each 125mS
95 // cycle to identify what we are doing.
96 enum Ai2UpdateCycles
97 {
98  AI2_UPDATE_CYCLE_62_5mS,
99  AI2_UPDATE_CYCLE_125mS,
100  AI2_UPDATE_CYCLE_187_5mS,
101  AI2_UPDATE_CYCLE_250mS,
102  AI2_UPDATE_CYCLE_312_5mS,
103  AI2_UPDATE_CYCLE_375mS,
104  AI2_UPDATE_CYCLE_437_5mS,
105  AI2_UPDATE_CYCLE_500mS,
106  AI2_UPDATE_CYCLE_562_5mS,
107  AI2_UPDATE_CYCLE_625mS,
108  AI2_UPDATE_CYCLE_687_5mS,
109  AI2_UPDATE_CYCLE_750mS,
110  AI2_NUMBER_OF_UPDATE_CYCLES,
111 };
112 
113 enum Ai2CalibrationTypeEnum
114 {
115  AI2_CALIBRATION_TYPE_VOLTS,
116  AI2_CALIBRATION_TYPE_RESISTANCE,
117 };
118 
119 enum Ai2FilterTypeEnum
120 {
121  AI2_FILTER_TYPE_MAIN,
122  AI2_FILTER_TYPE_AUX,
123  AI2_NUMBER_OF_FILTER_TYPES
124 };
125 
126 enum Ai2OperatingRanges
127 {
128  /*
129  * The following is a list of the different input modes which are
130  * supported by the module.
131  * Note the suffexes BL, and BH determine which way the MeasuredValue drifts
132  * on a input wire break. This does not always correspond with the VWIRE setting
133  */
134  AIC_MODE_OFF, /* +/- 150 milliVolt range is used, output is ignored */
135  AIC_MODE_VOLTS, /* +/- 10 Volt range */
136  AIC_MODE_MA, /* +/- 20 mA range, external resistor */
137 
138  AIC_MODE_HIGHZ, /* High impedence 0.0..1.8 Volt input */
139 
140  /* The TC ranges are only to be used on channel 1 */
141  AIC_MODE_TC_BL, /* Thermocouple for CJC (Break Low) */
142  AIC_MODE_TC, /* Thermocouple for CJC */
143  AIC_MODE_TC_BH, /* Thermocouple for CJC (Break High) */
144 
145  AIC_MODE_MV_BL, /* mV (Break Low) */
146  AIC_MODE_MV, /* mV */
147  AIC_MODE_MV_BH, /* mV (Break High) */
148 
149  AIC_MODE_OHM2, /* 2 Wire resistance 0..640 Ohms Mode */
150 
151  AIC_MODE_OHMH2, /* 2 Wire resistance 0..7K Ohms Mode */
152 
153  AIC_MODE_OHM3_BL, /* 3 Wire resistance 0..640 Ohms Mode */
154  AIC_MODE_OHM3, /* 3 Wire resistance 0..640 Ohms Mode */
155  AIC_MODE_OHM3_BH, /* 3 Wire resistance 0..640 Ohms Mode */
156 
157  AIC_MODE_OHM4_BL, /* 4 Wire resistance 0..640 Ohms Mode */
158  AIC_MODE_OHM4, /* 4 Wire resistance 0..640 Ohms Mode */
159  AIC_MODE_OHM4_BH, /* 4 Wire resistance 0..640 Ohms Mode */
160 
161  AIC_MODE_OHMH3_BL, /* 3 Wire resistance 0..7K Ohms Mode (Break Low) */
162  AIC_MODE_OHMH3, /* 3 Wire resistance 0..7K Ohms Mode */
163  AIC_MODE_OHMH3_BH, /* 3 Wire resistance 0..7K Ohms Mode (Break High) */
164 
165  AIC_MODE_OHMH4_BL, /* 4 Wire resistance 0..7K Ohms Mode (Break Low) */
166  AIC_MODE_OHMH4, /* 4 Wire resistance 0..7K Ohms Mode */
167  AIC_MODE_OHMH4_BH, /* 4 Wire resistance 0..7K Ohms Mode (Break High) */
168 
169  AIC_MODE_POT_BL, /* Potentiometer input (Break Low) */
170  AIC_MODE_POT, /* Potentiometer input */
171  AIC_MODE_POT_BH, /* Potentiometer input (Break High) */
172  AIC_MODE_UNSUPPORTED,/* +/- 150 millivolt range is used, PV is forced to a fault condition */
173  NUMBER_OF_AIC_MODES,
174 
175 };
176 
177 enum Ai2RunStates
178 {
179  EIO_T2500AI2_STATE_MODULE_NEEDS_RESET,
180  EIO_T2500AI2_STATE_INITIALISING,
181  EIO_T2500AI2_STATE_RUNTIME,
182  EIO_T2500AI2_STATE_DELETE,
183  EIO_T2500AI2_STATE_SECONDARY,
184  EIO_T2500AI2_STATE_BECOMING_PRIMARY_1,
185  EIO_T2500AI2_STATE_BECOMING_PRIMARY_2,
186 };
187 
188 enum Ai2EepromAccessState
189 {
190  AI2_EEPROM_RESET_STATE,
191  AI2_EEPROM_READ_CHANNEL_1_USER_CALIBRATION,
192  AI2_EEPROM_READ_CHANNEL_2_USER_CALIBRATION,
193  AI2_EEPROM_READ_CHANNEL_1_FACTORY_CALIBRATION,
194  AI2_EEPROM_READ_CHANNEL_2_FACTORY_CALIBRATION,
195  AI2_EEPROM_IDLE,
196  AI2_EEPROM_WRITE,
197  AI2_EEPROM_WRITE_DONE
198 };
199 
200 // internal states of the calibration state machine
201 enum Ai2CalibrationState
202 {
203  AI2_CAL_STATE_IDLE,
204  AI2_CAL_STATE_WAIT_FOR_RANGE,
205  AI2_CAL_STATE_INIT,
206  AI2_CAL_STATE_RUNNING,
207  AI2_CAL_STATE_DATA_GATHERED,
208  AI2_CAL_STATE_WAIT_FOR_VALUE,
209  AI2_CAL_STATE_POINT_DONE,
210  AI2_CAL_STATE_SAVE,
211  AI2_CAL_STATE_SAVE_LOW_POINT,
212  AI2_CAL_STATE_SAVE_HIGH_POINT,
213  AI2_CAL_STATE_DATA_SAVED,
214  AI2_CAL_STATE_RESTORE,
215  AI2_CAL_STATE_END_CAL
216 };
217 
218 enum Ai2CalibrationPoints
219 {
220  AI2_CAL_POINT_LOW,
221  AI2_CAL_POINT_HIGH,
222  AI2_NUMBER_OF_CALIBRATION_POINTS
223 };
224 
225 typedef struct
226 {
227  DsmTotalConfigDataType m_cycleData[AI2_NUMBER_OF_UPDATE_CYCLES];
228 }Ai2RangeTotalConfig;
229 
230 class EioT2500AI2Module:public EioT2500Module
231 {
232  public:
233  EioT2500AI2Module(unsigned char moduleNumber, EioT2500CycleEnum z_expectedCycleNumber);
234  virtual ~EioT2500AI2Module();
235 
236  protected:
237  virtual void update62_5mS();
238  virtual void update125mS();
239  virtual void updateBuffers125ms();
240  EioBoolean getCalibrated(EioUint8 channel, EioAICalType calType, EioUint8 rangeNumber);
241 
242  private:
243  void decipherCalibration();
244  void checkUserCalibration();
245 
246  Ai2OperatingRanges getOperatingRange(EioUint8 channel);
247  EioUint8 eeCheckBits( EioUint8 *bytePtr);
248  static void secondaryFilter( float sample, float *polep, float divisor, EioSint8 *resetp );
249  void driveChannelLeds();
250  void updateEepromImage125mS();
251  void disableAll62_5mS();
252  void disableAll125mS();
253  void updateCalibrationState();
254 
255  Ai2RunStates m_state;
256  Ai2EepromAccessState m_eepromState;
257  Ai2CalibrationState m_calibrationState[AI2_NUMBER_OF_CHANNELS];
258  float m_calibrationCoefficient1[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
259  float m_calibrationCoefficient2[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
260  bool m_rangeCalibrated[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
261  EioBoolean m_rangeFactoryCalibrated[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
262  EioBoolean m_rangeUserCalibrated[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
263  float m_oldCalCoefficient1[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
264  float m_oldCalCoefficient2[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
265  bool m_oldRangeCalibrated[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_RANGES];
266  bool m_factoryCalRead;
267  EioUint8 m_calCounter[AI2_NUMBER_OF_CHANNELS];
268  EioUint32 m_calReading[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_POINTS];
269  EioUint32 m_deltaCounts[AI2_NUMBER_OF_CHANNELS];
270  Ai2CalibrationPoints m_calPointIndex[AI2_NUMBER_OF_CHANNELS];
271  float m_actualCalValue[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_CALIBRATION_POINTS];
272 
273  static float m_calScaleFactor;
274  static float m_calibrationRefLow[AI2_NUMBER_OF_CALIBRATION_RANGES];
275  static float m_calibrationRefHigh[AI2_NUMBER_OF_CALIBRATION_RANGES];
276  static Ai2CalibrationTypeEnum m_calType[AI2_NUMBER_OF_CALIBRATION_RANGES];
277  static Ai2RangeTotalConfig m_rangeTotalConfig[NUMBER_OF_AIC_MODES];
278  static EioUint8 m_rangeRepeatCycles[NUMBER_OF_AIC_MODES];
279  static Ai2CalibrationRangeEnum m_calibrationRange[NUMBER_OF_AIC_MODES];
280  static Ai2OperatingRanges m_calOperatingRange[AI2_NUMBER_OF_CALIBRATION_RANGES];
281 
282 
283  // recovery messages
284  DfcDelaySpiScheduledMessage * m_delayMessage;
285  ResetSpiScheduledMessage * m_resetMessage;
286 
287  DfcVWireDataReadySpiScheduledMessage * m_channelLedMessage;
288  DfcTotalConfigSpiScheduledMessage * m_dfcTotalConfigMessage;
289 
290  EEReadSpiScheduledMessage * m_eereadCalibration;
291  EEWriteEnableSpiScheduledMessage * m_eeenableWriteCalibration;
292  EEWriteSpiScheduledMessage * m_eewriteCalibration;
293 
294 
295  DfcDsmTotalConfigSpiScheduledMessage * m_totalConfig62_5mS[AI2_NUMBER_OF_CHANNELS];
296  DfcDsmTotalConfigSpiScheduledMessage * m_totalConfig125mS[AI2_NUMBER_OF_CHANNELS];
297 
298  DsmMuxEnum m_currentMux[AI2_NUMBER_OF_CHANNELS];
299 
300  DfcReadFilterCountSpiScheduledMessage * m_readFilter62_5mS[AI2_NUMBER_OF_CHANNELS];
301  DfcReadFilterCountSpiScheduledMessage * m_readFilter125mS[AI2_NUMBER_OF_CHANNELS];
302 
303  LedSpiScheduledMessage * m_moduleLed;
304 
305  bool m_messagesScheduled;
306  EioUint8 m_eepromImage[256];
307 
308  EioSint32 m_filterCount[AI2_NUMBER_OF_CHANNELS][NUMBER_OF_DSM_MUX];
309  EioUint8 m_filterStatus[AI2_NUMBER_OF_CHANNELS][NUMBER_OF_DSM_MUX];
310  EioUint8 m_lastHeartBeat[AI2_NUMBER_OF_CHANNELS];
311  float m_divisor[AI2_NUMBER_OF_CHANNELS];
312  EioSint8 m_filterReset[AI2_NUMBER_OF_CHANNELS][AI2_NUMBER_OF_FILTER_TYPES];
313  EioUint8 m_rangingCount[AI2_NUMBER_OF_CHANNELS];
314  float m_sensorBreakValue[AI2_NUMBER_OF_CHANNELS];
315 
316  EioAIMeasuredValueData m_measuredValueData[AI2_NUMBER_OF_CHANNELS];
317  EioAIPointConfig m_pointConfig[AI2_NUMBER_OF_CHANNELS];
318  EioAICalibrationData m_calData[AI2_NUMBER_OF_CHANNELS];
319 
320  Ai2OperatingRanges m_currentRange[AI2_NUMBER_OF_CHANNELS];
321 
322  Ai2UpdateCycles m_updateCycle;
323 
324  EioUint8 m_hideAuxilliaryErrors;
325  EioUint8 m_dfcConfigAttempts;
326  EioUint8 m_ignoreCJorZeroCount;
327 
328 };
329 #ifdef __cplusplus
330 } /* extern "C" */
331 #endif
332 #endif /* __cplusplus */
333 #endif /*__EIOT2SRAI2_H */
Definition: eio_t25srm.h:58
Definition: eio_ai.h:44
Definition: dfc_ssm.h:198
Definition: ee_ssm.h:113
Definition: rst_ssm.h:14
Definition: eiot2cal.h:36
Definition: eio_ai.h:76
Definition: dfc_ssm.h:233
Definition: dfc_ssm.h:266
Definition: led_ssm.h:12
Definition: dfc_ssm.h:206
Definition: dfc_ssm.h:306
Definition: ee_ssm.h:126
Definition: ee_ssm.h:59
Definition: dfc_ssm.h:174