14 FI2_SSM_TIME_STATUS_RANGING,
15 FI2_SSM_TIME_STATUS_FREQUENCY_TOO_HIGH,
16 FI2_SSM_TIME_STATUS_FREQUENCY_TOO_LOW,
17 FI2_SSM_TIME_STATUS_PSU_FAIL,
18 FI2_SSM_TIME_STATUS_OK = 255
20 #define FI2_SSM_STATUS_MASK 0x3F
21 #define FI2_SSM_STATUS_SENSOR_BREAK_MASK 0x40
22 #define FI2_SSM_STATUS_SHORT_CIRCUIT_MASK 0x80
24 #define FI2_RX_TIME_MSB_MASK 0x1F
25 #define FI2_RX_COUNT_MSB_MASK 0x3F
26 #define FI2_SSM_TIME_MASK ((((unsigned int)FI2_RX_TIME_MSB_MASK)<<24)|0xFFFFFF)
28 #define EIO_FI2_LED_3_MASK 0x01
29 #define EIO_FI2_LED_CHANNEL_1_FAULT_MASK 0x02
30 #define EIO_FI2_LED_4_MASK 0x04
31 #define EIO_FI2_LED_CHANNEL_2_FAULT_MASK 0x08
32 #define EIO_FI2_LED_2_MASK 0x10
33 #define EIO_FI2_LED_1_MASK 0x20
35 #ifdef FI_MODULE_FIRMWARE_DEBUG
55 unsigned char * rxp = getRxPtr();
56 unsigned char checksum = FI2_RX_CHECKSUM_SEED;
57 unsigned char returnedChecksum = rxp[FI2_RX_CHECKSUM];
58 for(
int i = 0; i < FI2_RX_LENGTH-FI2_CHECKSUM_SIZE; i++)
62 return checksum == returnedChecksum;
75 bool getTransacted(){
bool temp = m_transacted; m_transacted =
false;
return temp;};
88 void getCountData(
unsigned char * channel,
bool * sensorBreak,
bool * shortCct,
bool * shuntFitted,
bool * contactFitted,
unsigned long * time,
89 unsigned long * count,
unsigned short * status)
91 unsigned char * rxp = getRxPtr();
93 *channel = (rxp[FI2_RX_COUNT_A_AND_STATUS] & FI2_RX_CHANNEL_NUMBER_MASK )?1:0;
94 *sensorBreak = (rxp[FI2_RX_TIME_A_AND_STATUS] & FI2_RX_SENSOR_BREAK_MASK ) == FI2_RX_SENSOR_BREAK_MASK;
95 *shortCct = (rxp[FI2_RX_TIME_A_AND_STATUS] & FI2_RX_SHORT_CCT_MASK ) == FI2_RX_SHORT_CCT_MASK;
96 *shuntFitted = (rxp[FI2_RX_TIME_A_AND_STATUS] & FI2_RX_SHUNT_FITTED_MASK ) == FI2_RX_SHUNT_FITTED_MASK;
97 *contactFitted = (rxp[FI2_RX_COUNT_A_AND_STATUS] & FI2_RX_CONTACT_FITTED_MASK ) == FI2_RX_CONTACT_FITTED_MASK;
100 if (*sensorBreak && *shortCct)
102 *status = rxp[FI2_RX_TIME_D] & FI2_SSM_STATUS_MASK;
106 *sensorBreak = (rxp[FI2_RX_TIME_D] & FI2_SSM_STATUS_SENSOR_BREAK_MASK) == FI2_SSM_STATUS_SENSOR_BREAK_MASK;
107 *shortCct = (rxp[FI2_RX_TIME_D] & FI2_SSM_STATUS_SHORT_CIRCUIT_MASK) == FI2_SSM_STATUS_SHORT_CIRCUIT_MASK;
111 *status = FI2_SSM_TIME_STATUS_OK;
113 *time = (rxp[FI2_RX_TIME_A_AND_STATUS] & FI2_RX_TIME_MSB_MASK ) << 24;
114 *time += rxp[FI2_RX_TIME_B] << 16;
115 *time += rxp[FI2_RX_TIME_C] << 8;
116 *time += rxp[FI2_RX_TIME_D];
117 *count = (rxp[FI2_RX_COUNT_A_AND_STATUS] & FI2_RX_COUNT_MSB_MASK ) << 16;
118 *count += rxp[FI2_RX_COUNT_B] << 8;
119 *count += rxp[FI2_RX_COUNT_C];
121 #ifdef FI_MODULE_FIRMWARE_DEBUG
122 if ((g_fred>0) && (*channel == (g_fred-1))) printf(
"%d,%d\r\n",*time,*count);
125 unsigned char * txp = getTxPtr();
126 unsigned char csum=42;
127 for (
char i=0;i<8;i++)
129 printf(
"%02X",rxp[i] );
131 if (*channel) printf(
"\r\n");
149 void setConfig(
int channel,
unsigned char debounceCode,
unsigned char voltCode,
unsigned char threshold,
bool on)
151 unsigned char * txp = getTxPtr();
153 #ifdef FI_MODULE_FIRMWARE_DEBUG
156 txp[FI2_TX_CHANNEL_1_PSU_AND_DEBOUNCE] = g_conf1;
157 txp[FI2_TX_CHANNEL_1_THRESHOLD] = g_thr1;
158 txp[FI2_TX_CHANNEL_2_PSU_AND_DEBOUNCE] = g_conf2;
159 txp[FI2_TX_CHANNEL_2_THRESHOLD] = g_thr2;
166 txp[FI2_TX_CHANNEL_2_PSU_AND_DEBOUNCE] = (voltCode & FI2_TX_SUPPLY_VOLTS_MASK) +
168 txp[FI2_TX_CHANNEL_2_THRESHOLD] = threshold;
171 txp[FI2_TX_CHANNEL_2_ENABLE] = FI2_TX_CHANNEL_OFF_MASK;
173 txp[FI2_TX_CHANNEL_2_ENABLE] = 0;
178 txp[FI2_TX_CHANNEL_1_PSU_AND_DEBOUNCE] = (voltCode & FI2_TX_SUPPLY_VOLTS_MASK) +
180 txp[FI2_TX_CHANNEL_1_THRESHOLD] = threshold;
182 txp[FI2_TX_CHANNEL_1_ENABLE] = FI2_TX_CHANNEL_OFF_MASK;
184 txp[FI2_TX_CHANNEL_1_ENABLE] = 0;
202 void setModuleLEDs(
unsigned char leds)
204 unsigned char * txp = getTxPtr();
205 txp[FI2_TX_LEDS] = ~leds;
206 #ifdef FI_MODULE_FIRMWARE_DEBUG
208 txp[FI2_TX_LEDS] = g_leds;
222 unsigned char * txp = getTxPtr();
223 unsigned char checksum = FI2_TX_CHECKSUM_SEED;
224 for(
int i = 0; i < FI2_TX_LENGTH-FI2_CHECKSUM_SIZE; i++)
228 txp[FI2_TX_CHECKSUM] = checksum;
233 static const unsigned char EIO_FI2_MAGNETIC_THRESHOLD = 255;
234 static const unsigned char EIO_FI2_MAX_LOGIC_THRESHOLD = 200;
236 static const unsigned char EIO_FI2_DEBOUNCE_CODE_50mS = 0x04;
237 static const unsigned char EIO_FI2_DEBOUNCE_CODE_20mS = 0x08;
238 static const unsigned char EIO_FI2_DEBOUNCE_CODE_10mS = 0x0C;
239 static const unsigned char EIO_FI2_DEBOUNCE_CODE_5mS = 0x10;
240 static const unsigned char EIO_FI2_DEBOUNCE_CODE_500uS = 0x14;
241 static const unsigned char EIO_FI2_DEBOUNCE_CODE_150uS = 0x18;
242 static const unsigned char EIO_FI2_DEBOUNCE_CODE_50uS = 0x1C;
243 static const unsigned char EIO_FI2_DEBOUNCE_CODE_15uS = 0x20;
244 static const unsigned char EIO_FI2_DEBOUNCE_CODE_OFF = 0x3C;
246 static const unsigned char EIO_FI2_PSU_8V_CODE = 0;
247 static const unsigned char EIO_FI2_PSU_12V_CODE = 1;
248 static const unsigned char EIO_FI2_PSU_24V_CODE = 3;
251 static unsigned short moduleToDevice(
unsigned char module);
253 static const unsigned char FI2_TX_CHECKSUM_SEED = 213;
254 static const unsigned char FI2_RX_CHECKSUM_SEED = 42;
255 static const unsigned char FI2_CHECKSUM_SIZE = 1;
257 static const unsigned char FI2_RX_CHANNEL_NUMBER_MASK = 0x40;
258 static const unsigned char FI2_RX_SENSOR_BREAK_MASK = 0x20;
259 static const unsigned char FI2_RX_SHORT_CCT_MASK = 0x40;
260 static const unsigned char FI2_RX_SHUNT_FITTED_MASK = 0x80;
261 static const unsigned char FI2_RX_CONTACT_FITTED_MASK = 0x80;
265 FI2_RX_TIME_A_AND_STATUS,
269 FI2_RX_COUNT_A_AND_STATUS,
276 static const unsigned char FI2_TX_DEBOUNCE_MASK = 0x3C;
278 static const unsigned char FI2_CH1_CONFIG_MASK = 0x13;
279 static const unsigned char FI2_TX_SUPPLY_VOLTS_MASK = 0x03;
280 static const unsigned char FI2_CH2_CONFIG_MASK = 0x2C;
281 static const unsigned char FI2_TX_CHANNEL_OFF_MASK = 0x01;
285 FI2_TX_CHANNEL_1_PSU_AND_DEBOUNCE,
286 FI2_TX_CHANNEL_1_THRESHOLD,
287 FI2_TX_CHANNEL_2_PSU_AND_DEBOUNCE,
288 FI2_TX_CHANNEL_2_THRESHOLD,
290 FI2_TX_CHANNEL_1_ENABLE,
291 FI2_TX_CHANNEL_2_ENABLE,