Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -r7362b089e676aadfaa614cca148e2aed007bae95 -r1158d9e342ab00e93e264b8f161696c012302751 --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 7362b089e676aadfaa614cca148e2aed007bae95) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 1158d9e342ab00e93e264b8f161696c012302751) @@ -24,6 +24,7 @@ #include "OperationModes.h" #include "PersistentAlarm.h" #include "TaskPriority.h" +#include "Timers.h" #include "Utilities.h" /** @@ -52,7 +53,7 @@ #define MAX_CONDUCTIVITY_SENSOR_FAILURES 2 ///< Number of failures before alarming in timed window count. #define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ( 60 * MS_PER_SECOND ) ///< Set time for timed window count. -#define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ( 500 / TASK_PRIORITY_INTERVAL ) ///< New reading every 333ms, expect to get valid new reading in 500ms. +#define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< New reading every 700ms, expect to get valid new reading in 1s. #define COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Conductivity sensors FPGA error timeout in milliseconds. #define COND_SENSORS_READ_ERR_MAX_CNT 255 ///< Conductivity sensors read and error count max value. @@ -74,21 +75,33 @@ #define KOHMS_TO_OHMS 1000.0F ///< Kilo ohms to ohms conversion factor. #define COND_SENS_CMD_SETCAL 0x1 ///< Bit 0 set to 1 to send command set calibration data to FPGA -#define COND_SENS_CMD_SET_SN_HW 0x2 ///< Bit 1 set to 1 to send command set hardware version and serial number to FPGA -#define COND_SENS_CMD_RESET 0x4 ///< Bit 2 set to 1 to send command reset sensor to FPGA +#define COND_SENS_CMD_SET_SN_HW 0x2 ///< Bit 1 set to 1 to send command set hardware version and serial number to FPGA +#define COND_SENS_CMD_RESET 0x4 ///< Bit 2 set to 1 to send command reset sensor to FPGA +#define COND_SENS_WRITE_CAL_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Conductivity Sensor calibration writing timeout in ms. +#define COND_SENS_FPGA_CMD_OFFSET 1 ///< offset for sensor id +#define COND_SENS_CMD_RESPONSE_NONE 0x0000 ///< No command executed response +#define COND_SENS_CMD_RESPONSE_T_SUCCESS 0x5401 ///< Command T success +#define COND_SENS_CMD_RESPONSE_T_IN_PROG 0x54FF ///< Command T in progress +#define COND_SENS_CMD_RESPONSE_T_FAIL 0x5400 ///< Command T failed +#define COND_SENS_CMD_RESPONSE_V_SUCCESS 0x5601 ///< Command V success +#define COND_SENS_CMD_RESPONSE_V_IN_PROG 0x56FF ///< Command V in progress +#define COND_SENS_CMD_RESPONSE_V_FAIL 0x5600 ///< Command V failed + /// Defined states for the conductivity write transaction. typedef enum Conductvity_States { - CONDUCTIVITY_INIT_STATE = 0, ///< Conductivity sensor initiate state. + CONDUCTIVITY_READ_CAL_STATE = 0, ///< Conductivity sensor read cal state. CONDUCTIVITY_READ_DATA_STATE, ///< Conductivity sensor read data state. + CONDUCTIVITY_WRITE_CAL_STATE, ///< Conductivity sensor write cal state. NUM_OF_CONDUCTIVITY_STATES ///< Number of conductivity write states. } CONDUCTIVITY_STATE_T; /// Conductivity Sensor Status group typedef struct { + CONDUCTIVITY_STATE_T currentSensorState; ///< Current conductivity sensor state. F32 rawTemperature; ///< Raw Temperature in C from the conductivity sensor. F32 rawResistance; ///< Raw Resistance in kOhms from the conductivity sensor. F32 calculatedTemperature; ///< Calculated temperature in C. @@ -105,10 +118,11 @@ BOOL hasCalSlotBeenRead[ NUM_OF_CONDUCTIVTY_CAL_IDXS ]; ///< Boolean array tracking which cal mem data has been read. BOOL haveAllCalSlotsBeenRead; ///< Boolean to determine if all cal values have been read from the FPGA. BOOL calReadComplete; ///< Boolean to determine if cal values are within range and ready to read data. + BOOL isWriteCalibrationRequested; ///< Boolean to determine if NV manager as requested a cal write to sensor. + U32 calWriteTimer; ///< Timer count when calibration begins writing. } CONDUCTIVITY_SENSOR_STATUS_T; // ********** private data ********** -static CONDUCTIVITY_STATE_T currentConductivityState; ///< Current conductivity sensor state. static OVERRIDE_F32_T currentUncompenstatedConductivityReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< TODO: Get Vinay or Sean to tell me to remove this debug array in CR. static OVERRIDE_F32_T currentConductivityReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Current conductivity sensor conductivity readings (overrideable). static OVERRIDE_F32_T currentTemperatureReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Current conductivity sensor temperature readings (overrideable). @@ -122,11 +136,11 @@ static CONDUCTIVITY_REVISIONS_T conductivitySensorRevisions[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensor revision and serial data. static CONDUCTIVITY_COEFFICIENTS_T conductivityCalRecord[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity Calibration Data to be written on the sensor -static BOOL isWriteCalibrationRequested[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Request to write Calibration Data on sensor's flash memory // ********** private function prototypes ********** -static CONDUCTIVITY_STATE_T handleConductivityReadCalState( void ); -static CONDUCTIVITY_STATE_T handleConductivityReadDataState( void ); +static CONDUCTIVITY_STATE_T handleConductivityReadCalState( CONDUCTIVITY_SENSORS_T sensor ); +static CONDUCTIVITY_STATE_T handleConductivityReadDataState( CONDUCTIVITY_SENSORS_T sensor ); +static CONDUCTIVITY_STATE_T handleConductivityWriteCalState( CONDUCTIVITY_SENSORS_T sensor ); static void checkCondCounters( U32 sensorId, U08 condReadCount, U08 condErrorCount, U08 tempReadCount, U08 tempErrorCount ); static U32 getConductivitySensorReadCount( CONDUCTIVITY_SENSORS_T sensor ); static U32 getConductivitySensorErrorCount( CONDUCTIVITY_SENSORS_T sensor ); @@ -139,9 +153,9 @@ static void calculateTemperature( CONDUCTIVITY_SENSORS_T sensorNum ); static void calculateResistance( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ); -static void readConductivitySensorReadCounts( void ); -static void readConductivitySensorErrorCounts( void ); -static void readConductivitySensorCalData( void ); +static void readConductivitySensorReadCounts( CONDUCTIVITY_SENSORS_T sensor ); +static void readConductivitySensorErrorCounts( CONDUCTIVITY_SENSORS_T sensor ); +static void readConductivitySensorCalData( CONDUCTIVITY_SENSORS_T sensor ); static void writeConductivitySensorCalData( CONDUCTIVITY_SENSORS_T sensorId ); /*********************************************************************//** @@ -153,10 +167,10 @@ *************************************************************************/ void initConductivitySensors( void ) { - /// TODO: Revert back to init state. - currentConductivityState = CONDUCTIVITY_INIT_STATE; CONDUCTIVITY_SENSORS_T sensor; + memset( conductivitySensorStatus, 0 , sizeof( conductivitySensorStatus ) ); + // Initialize override structures for each conductivity sensor for ( sensor = FIRST_DD_COND_SENSOR; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) { @@ -195,13 +209,6 @@ lastTemperatureErrorCounter[ sensor ].ovInitData = 0; lastTemperatureErrorCounter[ sensor ].override = OVERRIDE_RESET; - conductivitySensorStatus[ sensor ].interalCondErrorCount = 0; - conductivitySensorStatus[ sensor ].interalTempErrorCount = 0; - conductivitySensorStatus[ sensor ].calMemCount = 0; - conductivitySensorStatus[ sensor ].calData = 0; - conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = FALSE; - memset( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead, 0 ,sizeof( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead ) ); - conductivitySensorCoefficients[ sensor ].K_high = 0.0F; conductivitySensorCoefficients[ sensor ].alpha_high = 0.0F; conductivitySensorCoefficients[ sensor ].eta_high = 0.0F; @@ -243,25 +250,43 @@ * @details \b Outputs: currentConductivityReadings[],currentTemperatureReadings[], * @return none *************************************************************************/ -void readConductivitySensorData( void ) +void readConductivitySensorData( CONDUCTIVITY_SENSORS_T sensor ) { - // Read raw conductivity - conductivitySensorStatus[ D17_COND ].rawResistance = getFPGAD17CondData(); - conductivitySensorStatus[ D27_COND ].rawResistance = getFPGAD27CondData(); - conductivitySensorStatus[ D29_COND ].rawResistance = getFPGAD29CondData(); - conductivitySensorStatus[ D43_COND ].rawResistance = getFPGAD43CondData(); - conductivitySensorStatus[ D74_COND ].rawResistance = getFPGAD74CondData(); - conductivitySensorStatus[ P9_COND ].rawResistance = getFPGAP9CondData(); - conductivitySensorStatus[ P18_COND ].rawResistance = getFPGAP18CondData(); - - // Read temperature associated to conductivity sensor - conductivitySensorStatus[ D17_COND ].rawTemperature = getFPGAD17CondTemp(); - conductivitySensorStatus[ D27_COND ].rawTemperature = getFPGAD27CondTemp(); - conductivitySensorStatus[ D29_COND ].rawTemperature = getFPGAD29CondTemp(); - conductivitySensorStatus[ D43_COND ].rawTemperature = getFPGAD43CondTemp(); - conductivitySensorStatus[ D74_COND ].rawTemperature = getFPGAD74CondTemp(); - conductivitySensorStatus[ P9_COND ].rawTemperature = getFPGAP9CondTemp(); - conductivitySensorStatus[ P18_COND ].rawTemperature = getFPGAP18CondTemp(); + // Read raw conductivity and temperature associated to conductivity sensor + switch ( sensor ) + { + case D17_COND: + conductivitySensorStatus[ D17_COND ].rawResistance = getFPGAD17CondData(); + conductivitySensorStatus[ D17_COND ].rawTemperature = getFPGAD17CondTemp(); + break; + case D27_COND: + conductivitySensorStatus[ D27_COND ].rawResistance = getFPGAD27CondData(); + conductivitySensorStatus[ D27_COND ].rawTemperature = getFPGAD27CondTemp(); + break; + case D29_COND: + conductivitySensorStatus[ D29_COND ].rawResistance = getFPGAD29CondData(); + conductivitySensorStatus[ D29_COND ].rawTemperature = getFPGAD29CondTemp(); + break; + case D43_COND: + conductivitySensorStatus[ D43_COND ].rawResistance = getFPGAD43CondData(); + conductivitySensorStatus[ D43_COND ].rawTemperature = getFPGAD43CondTemp(); + break; + case D74_COND: + conductivitySensorStatus[ D74_COND ].rawResistance = getFPGAD74CondData(); + conductivitySensorStatus[ D74_COND ].rawTemperature = getFPGAD74CondTemp(); + break; + case P9_COND: + conductivitySensorStatus[ P9_COND ].rawResistance = getFPGAP9CondData(); + conductivitySensorStatus[ P9_COND ].rawTemperature = getFPGAP9CondTemp(); + break; + case P18_COND: + conductivitySensorStatus[ P18_COND ].rawResistance = getFPGAP18CondData(); + conductivitySensorStatus[ P18_COND ].rawTemperature = getFPGAP18CondTemp(); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID1, sensor ) + break; + } } /*********************************************************************//** @@ -272,24 +297,43 @@ * @details \b Outputs: lastConductivityReadCounter[],lastTemperatureReadCounter[], * @return none *************************************************************************/ -static void readConductivitySensorReadCounts( void ) +static void readConductivitySensorReadCounts( CONDUCTIVITY_SENSORS_T sensor ) { // Update read counters for each conductivity sensor - lastConductivityReadCounter[ D17_COND ].data = getFPGAD17CondReadCount(); - lastConductivityReadCounter[ D27_COND ].data = getFPGAD27CondReadCount(); - lastConductivityReadCounter[ D29_COND ].data = getFPGAD29CondReadCount(); - lastConductivityReadCounter[ D43_COND ].data = getFPGAD43CondReadCount(); - lastConductivityReadCounter[ D74_COND ].data = getFPGAD74CondReadCount(); - lastConductivityReadCounter[ P9_COND ].data = getFPGAP9CondReadCount(); - lastConductivityReadCounter[ P18_COND ].data = getFPGAP18CondReadCount(); - - lastTemperatureReadCounter[ D17_COND ].data = getFPGAD17TempReadCount(); - lastTemperatureReadCounter[ D27_COND ].data = getFPGAD27TempReadCount(); - lastTemperatureReadCounter[ D29_COND ].data = getFPGAD29TempReadCount(); - lastTemperatureReadCounter[ D43_COND ].data = getFPGAD43TempReadCount(); - lastTemperatureReadCounter[ D74_COND ].data = getFPGAD74TempReadCount(); - lastTemperatureReadCounter[ P9_COND ].data = getFPGAP9TempReadCount(); - lastTemperatureReadCounter[ P18_COND ].data = getFPGAP18TempReadCount(); + switch ( sensor ) + { + case D17_COND: + lastConductivityReadCounter[ D17_COND ].data = getFPGAD17CondReadCount(); + lastTemperatureReadCounter[ D17_COND ].data = getFPGAD17TempReadCount(); + break; + case D27_COND: + lastConductivityReadCounter[ D27_COND ].data = getFPGAD27CondReadCount(); + lastTemperatureReadCounter[ D27_COND ].data = getFPGAD27TempReadCount(); + break; + case D29_COND: + lastConductivityReadCounter[ D29_COND ].data = getFPGAD29CondReadCount(); + lastTemperatureReadCounter[ D29_COND ].data = getFPGAD29TempReadCount(); + break; + case D43_COND: + lastConductivityReadCounter[ D43_COND ].data = getFPGAD43CondReadCount(); + lastTemperatureReadCounter[ D43_COND ].data = getFPGAD43TempReadCount(); + break; + case D74_COND: + lastConductivityReadCounter[ D74_COND ].data = getFPGAD74CondReadCount(); + lastTemperatureReadCounter[ D74_COND ].data = getFPGAD74TempReadCount(); + break; + case P9_COND: + lastConductivityReadCounter[ P9_COND ].data = getFPGAP9CondReadCount(); + lastTemperatureReadCounter[ P9_COND ].data = getFPGAP9TempReadCount(); + break; + case P18_COND: + lastConductivityReadCounter[ P18_COND ].data = getFPGAP18CondReadCount(); + lastTemperatureReadCounter[ P18_COND ].data = getFPGAP18TempReadCount(); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID1, sensor ) + break; + } } /*********************************************************************//** @@ -300,24 +344,43 @@ * @details \b Outputs: lastConductivityReadCounter[],lastTemperatureReadCounter[], * @return none *************************************************************************/ -static void readConductivitySensorErrorCounts( void ) +static void readConductivitySensorErrorCounts( CONDUCTIVITY_SENSORS_T sensor ) { // Update error counters for each conductivity sensor - lastConductivityErrorCounter[ D17_COND ].data = getFPGAD17CondErrorCount(); - lastConductivityErrorCounter[ D27_COND ].data = getFPGAD27CondErrorCount(); - lastConductivityErrorCounter[ D29_COND ].data = getFPGAD29CondErrorCount(); - lastConductivityErrorCounter[ D43_COND ].data = getFPGAD43CondErrorCount(); - lastConductivityErrorCounter[ D74_COND ].data = getFPGAD74CondErrorCount(); - lastConductivityErrorCounter[ P9_COND ].data = getFPGAP9CondErrorCount(); - lastConductivityErrorCounter[ P18_COND ].data = getFPGAP18CondErrorCount(); - - lastTemperatureErrorCounter[ D17_COND ].data = getFPGAD17TempErrorCount(); - lastTemperatureErrorCounter[ D27_COND ].data = getFPGAD27TempErrorCount(); - lastTemperatureErrorCounter[ D29_COND ].data = getFPGAD29TempErrorCount(); - lastTemperatureErrorCounter[ D43_COND ].data = getFPGAD43TempErrorCount(); - lastTemperatureErrorCounter[ D74_COND ].data = getFPGAD74TempErrorCount(); - lastTemperatureErrorCounter[ P9_COND ].data = getFPGAP9TempErrorCount(); - lastTemperatureErrorCounter[ P18_COND ].data = getFPGAP18TempErrorCount(); + switch ( sensor ) + { + case D17_COND: + lastConductivityErrorCounter[ D17_COND ].data = getFPGAD17CondErrorCount(); + lastTemperatureErrorCounter[ D17_COND ].data = getFPGAD17TempErrorCount(); + break; + case D27_COND: + lastConductivityErrorCounter[ D27_COND ].data = getFPGAD27CondErrorCount(); + lastTemperatureErrorCounter[ D27_COND ].data = getFPGAD27TempErrorCount(); + break; + case D29_COND: + lastConductivityErrorCounter[ D29_COND ].data = getFPGAD29CondErrorCount(); + lastTemperatureErrorCounter[ D29_COND ].data = getFPGAD29TempErrorCount(); + break; + case D43_COND: + lastConductivityErrorCounter[ D43_COND ].data = getFPGAD43CondErrorCount(); + lastTemperatureErrorCounter[ D43_COND ].data = getFPGAD43TempErrorCount(); + break; + case D74_COND: + lastConductivityErrorCounter[ D74_COND ].data = getFPGAD74CondErrorCount(); + lastTemperatureErrorCounter[ D74_COND ].data = getFPGAD74TempErrorCount(); + break; + case P9_COND: + lastConductivityErrorCounter[ P9_COND ].data = getFPGAP9CondErrorCount(); + lastTemperatureErrorCounter[ P9_COND ].data = getFPGAP9TempErrorCount(); + break; + case P18_COND: + lastConductivityErrorCounter[ P18_COND ].data = getFPGAP18CondErrorCount(); + lastTemperatureErrorCounter[ P18_COND ].data = getFPGAP18TempErrorCount(); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID1, sensor ) + break; + } } /*********************************************************************//** @@ -328,24 +391,43 @@ * @details \b Outputs: conductivitySensorStatus[] * @return none *************************************************************************/ -static void readConductivitySensorCalData( void ) +static void readConductivitySensorCalData( CONDUCTIVITY_SENSORS_T sensor ) { // Update cal data and counter for each conductivity sensor - conductivitySensorStatus[ D17_COND ].calData = getFPGAD17CondCalData(); - conductivitySensorStatus[ D27_COND ].calData = getFPGAD27CondCalData(); - conductivitySensorStatus[ D29_COND ].calData = getFPGAD29CondCalData(); - conductivitySensorStatus[ D43_COND ].calData = getFPGAD43CondCalData(); - conductivitySensorStatus[ D74_COND ].calData = getFPGAD74CondCalData(); - conductivitySensorStatus[ P9_COND ].calData = getFPGAP9CondCalData(); - conductivitySensorStatus[ P18_COND ].calData = getFPGAP18CondCalData(); - - conductivitySensorStatus[ D17_COND ].calMemCount = getFPGAD17CalMemCounter(); - conductivitySensorStatus[ D27_COND ].calMemCount = getFPGAD27CalMemCounter(); - conductivitySensorStatus[ D29_COND ].calMemCount = getFPGAD29CalMemCounter(); - conductivitySensorStatus[ D43_COND ].calMemCount = getFPGAD43CalMemCounter(); - conductivitySensorStatus[ D74_COND ].calMemCount = getFPGAD74CalMemCounter(); - conductivitySensorStatus[ P9_COND ].calMemCount = getFPGAP9CalMemCounter(); - conductivitySensorStatus[ P18_COND ].calMemCount = getFPGAP18CalMemCounter(); + switch ( sensor ) + { + case D17_COND: + conductivitySensorStatus[ D17_COND ].calData = getFPGAD17CondCalData(); + conductivitySensorStatus[ D17_COND ].calMemCount = getFPGAD17CalMemCounter(); + break; + case D27_COND: + conductivitySensorStatus[ D27_COND ].calData = getFPGAD27CondCalData(); + conductivitySensorStatus[ D27_COND ].calMemCount = getFPGAD27CalMemCounter(); + break; + case D29_COND: + conductivitySensorStatus[ D29_COND ].calData = getFPGAD29CondCalData(); + conductivitySensorStatus[ D29_COND ].calMemCount = getFPGAD29CalMemCounter(); + break; + case D43_COND: + conductivitySensorStatus[ D43_COND ].calData = getFPGAD43CondCalData(); + conductivitySensorStatus[ D43_COND ].calMemCount = getFPGAD43CalMemCounter(); + break; + case D74_COND: + conductivitySensorStatus[ D74_COND ].calData = getFPGAD74CondCalData(); + conductivitySensorStatus[ D74_COND ].calMemCount = getFPGAD74CalMemCounter(); + break; + case P9_COND: + conductivitySensorStatus[ P9_COND ].calData = getFPGAP9CondCalData(); + conductivitySensorStatus[ P9_COND ].calMemCount = getFPGAP9CalMemCounter(); + break; + case P18_COND: + conductivitySensorStatus[ P18_COND ].calData = getFPGAP18CondCalData(); + conductivitySensorStatus[ P18_COND ].calMemCount = getFPGAP18CalMemCounter(); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID1, sensor ) + break; + } } @@ -414,17 +496,25 @@ *************************************************************************/ void execConductivitySensors( void ) { - switch ( currentConductivityState ) + CONDUCTIVITY_SENSORS_T sensor; + + for ( sensor = FIRST_DD_COND_SENSOR; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) { - case CONDUCTIVITY_INIT_STATE: - currentConductivityState = handleConductivityReadCalState(); - break; - case CONDUCTIVITY_READ_DATA_STATE: - currentConductivityState = handleConductivityReadDataState(); - break; - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID, (U32)currentConductivityState ) - break; + switch ( conductivitySensorStatus[ sensor ].currentSensorState ) + { + case CONDUCTIVITY_READ_CAL_STATE: + conductivitySensorStatus[ sensor ].currentSensorState = handleConductivityReadCalState( sensor ); + break; + case CONDUCTIVITY_READ_DATA_STATE: + conductivitySensorStatus[ sensor ].currentSensorState = handleConductivityReadDataState( sensor ); + break; + case CONDUCTIVITY_WRITE_CAL_STATE: + conductivitySensorStatus[ sensor ].currentSensorState = handleConductivityWriteCalState( sensor ); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CONDUCTIVITY_SENSOR_ID, (U32)conductivitySensorStatus[ sensor ].currentSensorState ) + break; + } } } @@ -437,171 +527,154 @@ * conductivitySensorStatus[] * @return next state of the conductivity state machine. *************************************************************************/ -static CONDUCTIVITY_STATE_T handleConductivityReadCalState( void ) +static CONDUCTIVITY_STATE_T handleConductivityReadCalState( CONDUCTIVITY_SENSORS_T sensor ) { - CONDUCTIVITY_STATE_T state = CONDUCTIVITY_INIT_STATE; - CONDUCTIVITY_SENSORS_T sensor; - BOOL calResult = FALSE; + CONDUCTIVITY_STATE_T state = CONDUCTIVITY_READ_CAL_STATE; - readConductivitySensorCalData(); + readConductivitySensorCalData( sensor ); // Check which counter, assign it, and assign read bool to TRUE per sensor - for ( sensor = FIRST_DD_COND_SENSOR; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) - { - // check if we have finished reading all values. - conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = monitorCalDataReads( sensor ); + // check if we have finished reading all values. + conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = monitorCalDataReads( sensor ); - if ( FALSE == conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead ) + if ( FALSE == conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead ) + { + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_DISABLE_CONDUCTIVITY_SENSOR_CHECKS ) == TRUE ) { - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_DISABLE_CONDUCTIVITY_SENSOR_CHECKS ) == TRUE ) + // When test config is enabled, check first cal data. If we see a 0 there, + // then most likely not talking to a sensor while HW is in development ( cal data here should be non-zero. ) + if ( ( conductivitySensorStatus[ sensor ].calMemCount == 0 ) && + ( conductivitySensorStatus[ sensor ].calData == 0 ) ) { - // When test config is enabled, check first cal data. If we see a 0 there, - // then most likely not talking to a sensor while HW is in development ( cal data here should be non-zero. ) - if ( ( conductivitySensorStatus[ sensor ].calMemCount == 0 ) && - ( conductivitySensorStatus[ sensor ].calData == 0 ) ) - { - conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = TRUE; - } + conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = TRUE; } - else - { - switch( conductivitySensorStatus[ sensor ].calMemCount ) - { - case CAL_DATA_1: - memcpy( &conductivitySensorCoefficients[ sensor ].K_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_1 ] = TRUE; - break; - case CAL_DATA_2: - memcpy( &conductivitySensorCoefficients[ sensor ].alpha_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_2 ] = TRUE; - break; - case CAL_DATA_3: - memcpy( &conductivitySensorCoefficients[ sensor ].eta_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_3 ] = TRUE; - break; - case CAL_DATA_4: - memcpy( &conductivitySensorCoefficients[ sensor ].zeta_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_4 ] = TRUE; - break; - case CAL_DATA_5: - memcpy( &conductivitySensorCoefficients[ sensor ].K_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_5 ] = TRUE; - break; - case CAL_DATA_6: - memcpy( &conductivitySensorCoefficients[ sensor ].alpha_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_6 ] = TRUE; - break; - case CAL_DATA_7: - memcpy( &conductivitySensorCoefficients[ sensor ].eta_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_7 ] = TRUE; - break; - case CAL_DATA_8: - memcpy( &conductivitySensorCoefficients[ sensor ].zeta_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_8 ] = TRUE; - break; - case CAL_DATA_9: - memcpy( &conductivitySensorCoefficients[ sensor ].beta, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_9 ] = TRUE; - break; - case CAL_DATA_10: - memcpy( &conductivitySensorCoefficients[ sensor ].delta, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_10 ] = TRUE; - break; - case CAL_DATA_11: - memcpy( &conductivitySensorCoefficients[ sensor ].reserved1, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_11 ] = TRUE; - break; - case CAL_DATA_12: - memcpy( &conductivitySensorCoefficients[ sensor ].reserved2, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_12 ] = TRUE; - break; - case CAL_DATA_13: - memcpy( &conductivitySensorCoefficients[ sensor ].calibrationTime, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_13 ] = TRUE; - break; - case CAL_DATA_14: - memcpy( &conductivitySensorCoefficients[ sensor ].crc, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_14 ] = TRUE; - break; - case SW_REV_LOWER_WORD: - memcpy( conductivitySensorRevisions[ sensor ].swRev, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_LOWER_WORD ] = TRUE; - break; - case SW_REV_MID_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].swRev + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_MID_WORD ] = TRUE; - break; - case SW_REV_UPPER_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].swRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_UPPER_WORD ] = TRUE; - break; - case HW_REV_LOWER_WORD: - memcpy( conductivitySensorRevisions[ sensor ].hwRev, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_LOWER_WORD ] = TRUE; - break; - case HW_REV_MID_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_MID_WORD ] = TRUE; - break; - case HW_REV_UPPER_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_UPPER_WORD ] = TRUE; - break; - case HW_SERIAL_LOWER_WORD: - memcpy( conductivitySensorRevisions[ sensor ].hwSerial, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_LOWER_WORD ] = TRUE; - break; - case HW_SERIAL_MID_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].hwSerial + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_MID_WORD ] = TRUE; - break; - case HW_SERIAL_UPPER_WORD: - memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); - conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_UPPER_WORD ] = TRUE; - break; - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONDUCTIVITY_SENSOR_CAL_CHECK, sensor ) - break; - - } - } } - - // DD has read all cal values. Check ranges. else { - conductivitySensorStatus[ sensor ].calReadComplete = checkConductivityCoefficientRanges( sensor ); - - // TODO: this retry should be changed to an alarm or fault once we change the functionality of - // BETA 2.0 test config. This is meant to handle the in-between state of FPGA transitioning - // between 2.0 and non-2.0 data structures. - if ( FALSE == conductivitySensorStatus[ sensor ].calReadComplete ) + switch( conductivitySensorStatus[ sensor ].calMemCount ) { - conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = FALSE; - memset( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead, 0 ,sizeof( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead ) ); - } + case CAL_DATA_1: + memcpy( &conductivitySensorCoefficients[ sensor ].K_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_1 ] = TRUE; + break; + case CAL_DATA_2: + memcpy( &conductivitySensorCoefficients[ sensor ].alpha_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_2 ] = TRUE; + break; + case CAL_DATA_3: + memcpy( &conductivitySensorCoefficients[ sensor ].eta_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_3 ] = TRUE; + break; + case CAL_DATA_4: + memcpy( &conductivitySensorCoefficients[ sensor ].zeta_high, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_4 ] = TRUE; + break; + case CAL_DATA_5: + memcpy( &conductivitySensorCoefficients[ sensor ].K_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_5 ] = TRUE; + break; + case CAL_DATA_6: + memcpy( &conductivitySensorCoefficients[ sensor ].alpha_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_6 ] = TRUE; + break; + case CAL_DATA_7: + memcpy( &conductivitySensorCoefficients[ sensor ].eta_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_7 ] = TRUE; + break; + case CAL_DATA_8: + memcpy( &conductivitySensorCoefficients[ sensor ].zeta_low, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_8 ] = TRUE; + break; + case CAL_DATA_9: + memcpy( &conductivitySensorCoefficients[ sensor ].beta, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_9 ] = TRUE; + break; + case CAL_DATA_10: + memcpy( &conductivitySensorCoefficients[ sensor ].delta, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_10 ] = TRUE; + break; + case CAL_DATA_11: + memcpy( &conductivitySensorCoefficients[ sensor ].reserved1, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_11 ] = TRUE; + break; + case CAL_DATA_12: + memcpy( &conductivitySensorCoefficients[ sensor ].reserved2, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_12 ] = TRUE; + break; + case CAL_DATA_13: + memcpy( &conductivitySensorCoefficients[ sensor ].calibrationTime, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_13 ] = TRUE; + break; + case CAL_DATA_14: + memcpy( &conductivitySensorCoefficients[ sensor ].crc, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_14 ] = TRUE; + break; + case SW_REV_LOWER_WORD: + memcpy( conductivitySensorRevisions[ sensor ].swRev, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_LOWER_WORD ] = TRUE; + break; + case SW_REV_MID_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].swRev + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_MID_WORD ] = TRUE; + break; + case SW_REV_UPPER_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].swRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_UPPER_WORD ] = TRUE; + break; + case HW_REV_LOWER_WORD: + memcpy( conductivitySensorRevisions[ sensor ].hwRev, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_LOWER_WORD ] = TRUE; + break; + case HW_REV_MID_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_MID_WORD ] = TRUE; + break; + case HW_REV_UPPER_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_REV_UPPER_WORD ] = TRUE; + break; + case HW_SERIAL_LOWER_WORD: + memcpy( conductivitySensorRevisions[ sensor ].hwSerial, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_LOWER_WORD ] = TRUE; + break; + case HW_SERIAL_MID_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].hwSerial + LOWER_WORD_SIZE ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_MID_WORD ] = TRUE; + break; + case HW_SERIAL_UPPER_WORD: + memcpy( ( conductivitySensorRevisions[ sensor ].hwRev + ( LOWER_WORD_SIZE + MID_WORD_SIZE ) ), &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ HW_SERIAL_UPPER_WORD ] = TRUE; + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONDUCTIVITY_SENSOR_CAL_CHECK, sensor ) + break; + } } + } + // DD has read all cal values. Check ranges. + else + { + conductivitySensorStatus[ sensor ].calReadComplete = checkConductivityCoefficientRanges( sensor ); - if ( getTestConfigStatus( TEST_CONFIG_DD_FP_DISABLE_CONDUCTIVITY_SENSOR_CHECKS ) == TRUE ) + // TODO: this retry should be changed to an alarm or fault once we change the functionality of + // BETA 2.0 test config. This is meant to handle the in-between state of FPGA transitioning + // between 2.0 and non-2.0 data structures. + if ( FALSE == conductivitySensorStatus[ sensor ].calReadComplete ) { - conductivitySensorStatus[ sensor ].calReadComplete = TRUE; + conductivitySensorStatus[ sensor ].haveAllCalSlotsBeenRead = FALSE; + memset( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead, 0 ,sizeof( conductivitySensorStatus[ sensor ].hasCalSlotBeenRead ) ); } - // calResult determines if we are done reading calibration data from all sensors. - // each sensor can re-assign it back to false if it is not completely done reading. - if ( TRUE == conductivitySensorStatus[ sensor ].calReadComplete ) - { - calResult = TRUE; - } - else - { - calResult = FALSE; - } } - if ( TRUE == calResult ) + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_DISABLE_CONDUCTIVITY_SENSOR_CHECKS ) == TRUE ) { + conductivitySensorStatus[ sensor ].calReadComplete = TRUE; + } + + if ( TRUE == conductivitySensorStatus[ sensor ].calReadComplete ) + { // All cal data has been assigned and checks. state = CONDUCTIVITY_READ_DATA_STATE; } @@ -617,28 +690,81 @@ * @details \b Outputs: conductivitySensorCoefficients, conductivitySensorRevisions * @return next state of the conductivity state machine. *************************************************************************/ -static CONDUCTIVITY_STATE_T handleConductivityReadDataState( void ) +static CONDUCTIVITY_STATE_T handleConductivityReadDataState( CONDUCTIVITY_SENSORS_T sensor ) { CONDUCTIVITY_STATE_T state = CONDUCTIVITY_READ_DATA_STATE; BOOL isFPSensor = FALSE; - CONDUCTIVITY_SENSORS_T sensor; - readConductivitySensorData(); - readConductivitySensorReadCounts(); - readConductivitySensorErrorCounts(); + if ( ( sensor >= FIRST_FP_COND_SENSOR ) && + ( sensor <= LAST_FP_COND_SENSOR ) ) + { + isFPSensor = TRUE; + } - for ( sensor = FIRST_DD_COND_SENSOR; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) + readConductivitySensorData( sensor ); + readConductivitySensorReadCounts( sensor ); + readConductivitySensorErrorCounts( sensor ); + + checkCondCounters( sensor, getConductivitySensorReadCount( sensor ), getConductivitySensorErrorCount( sensor ), + getTemperatureSensorReadCount( sensor ), getTemperatureSensorErrorCount( sensor ) ); + + + calculateConductivityUpdatedStandard( sensor, isFPSensor ); + calculateConductivityUpdatedStandardTempCompensated( sensor, isFPSensor ); + + if ( TRUE == conductivitySensorStatus[ sensor ].isWriteCalibrationRequested ) { - checkCondCounters( sensor, getConductivitySensorReadCount( sensor ), getConductivitySensorErrorCount( sensor ), - getTemperatureSensorReadCount( sensor ), getTemperatureSensorErrorCount( sensor ) ); + state = CONDUCTIVITY_WRITE_CAL_STATE; + conductivitySensorStatus[ sensor ].calWriteTimer = getMSTimerCount(); + } - if ( ( sensor >= FIRST_FP_COND_SENSOR ) && - ( sensor <= LAST_FP_COND_SENSOR ) ) + return state; +} + +/*********************************************************************//** + * @brief + * The handleConductivityWriteCalState function handles writing cal record + * @details \b Inputs: conductivitySensorStatus. + * @details \b Outputs: + * @return next state of the conductivity state machine. + *************************************************************************/ +static CONDUCTIVITY_STATE_T handleConductivityWriteCalState( CONDUCTIVITY_SENSORS_T sensor ) +{ + CONDUCTIVITY_STATE_T state = CONDUCTIVITY_WRITE_CAL_STATE; + U16 cmdStatus = getFPGACalCmdStatus(); + U08 cmdSensorId = getFPGACalCmdSensorId() - COND_SENS_FPGA_CMD_OFFSET; + + if ( (U08)sensor == cmdSensorId ) + { + if ( TRUE == didTimeout( conductivitySensorStatus[ sensor ].calWriteTimer, COND_SENS_WRITE_CAL_TIMEOUT_MS ) ) { - isFPSensor = TRUE; + // TODO: How to recover? + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, sensor ) } - calculateConductivityUpdatedStandard( sensor, isFPSensor ); - calculateConductivityUpdatedStandardTempCompensated( sensor, isFPSensor ); + else + { + switch ( cmdStatus ) + { + case COND_SENS_CMD_RESPONSE_T_SUCCESS: + case COND_SENS_CMD_RESPONSE_V_SUCCESS: + setFPGACondSensorId( sensor ); + setFPGACondSensorCommand( (U08)COND_SENS_CMD_RESET ); + state = CONDUCTIVITY_READ_CAL_STATE; + break; + case COND_SENS_CMD_RESPONSE_T_FAIL: + case COND_SENS_CMD_RESPONSE_V_FAIL: + setFPGACondSensorId( sensor ); + setFPGACondSensorCommand( (U08)COND_SENS_CMD_RESET ); + // TODO: Retry? Revert? + break; + case COND_SENS_CMD_RESPONSE_V_IN_PROG: + case COND_SENS_CMD_RESPONSE_T_IN_PROG: + break; + default: + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, sensor ) + break; + } + } } return state; @@ -1016,17 +1142,15 @@ } BOOL setConductivityCalibrationData( CONDUCTIVITY_SENSORS_T sensorIdx, - CONDUCTIVITY_COEFFICIENTS_T record) + CONDUCTIVITY_COEFFICIENTS_T record ) { BOOL status = FALSE; if ( sensorIdx < NUM_OF_CONDUCTIVITY_SENSORS ) { - conductivityCalRecord[ sensorIdx ] = record; - isWriteCalibrationRequested[ sensorIdx ] = TRUE; - - // TODO: Start a timer - + conductivityCalRecord[ sensorIdx ] = record; + writeConductivitySensorCalData( sensorIdx ); + conductivitySensorStatus[ sensorIdx ].isWriteCalibrationRequested = TRUE; status = TRUE; } else @@ -1130,7 +1254,7 @@ *************************************************************************/ static void calculateConductivityUpdatedStandard( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ) { - F64 calculatedConductivity = 0.0; + F64 calculatedConductivity = -1.0; // Defaulting to -1 to show cal failures over broadcast F64 alpha = 0.0; F64 k = 0.0; @@ -1147,9 +1271,16 @@ calculateResistance( sensorNum, isFPSensor ); calculateTemperature( sensorNum ); - calculatedConductivity = ( ( k / conductivitySensorStatus[ sensorNum ].calculatedResistance ) * - ( 1 + ( alpha * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); - currentConductivityReadings[ sensorNum ].data = calculatedConductivity * SIEMENS_TO_MICROSIEMENS_CONVERSION; + if ( TRUE == conductivitySensorStatus[ sensorNum ].calReadComplete ) + { + calculatedConductivity = ( ( k / conductivitySensorStatus[ sensorNum ].calculatedResistance ) * + ( 1 + ( alpha * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); + currentUncompenstatedConductivityReadings[ sensorNum ].data = calculatedConductivity * SIEMENS_TO_MICROSIEMENS_CONVERSION; + } + else + { + currentUncompenstatedConductivityReadings[ sensorNum ].data = calculatedConductivity; + } } /*********************************************************************//** @@ -1164,7 +1295,7 @@ *************************************************************************/ static void calculateConductivityUpdatedStandardTempCompensated( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ) { - F64 calculatedConductivity = 0.0; + F64 calculatedConductivity = -1.0; // Defaulting to -1 to show cal failures over broadcast F64 k = 0.0; if ( TRUE == isFPSensor ) @@ -1185,7 +1316,7 @@ { conductivitySensorStatus[ sensorNum ].currentAlphaValue = BICARB_SENSORS_ALPHA_LOW; } - else if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_LOW_BOUNDS ) + else if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_HIGH_BOUNDS ) { conductivitySensorStatus[ sensorNum ].currentAlphaValue = BICARB_SENSORS_ALPHA_HIGH; } @@ -1200,7 +1331,7 @@ { conductivitySensorStatus[ sensorNum ].currentAlphaValue = DIALYSATE_SENSORS_ALPHA_LOW; } - else if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_LOW_BOUNDS ) + else if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_HIGH_BOUNDS ) { conductivitySensorStatus[ sensorNum ].currentAlphaValue = DIALYSATE_SENSORS_ALPHA_HIGH; } @@ -1214,9 +1345,16 @@ calculateResistance( sensorNum, isFPSensor ); calculateTemperature( sensorNum ); - calculatedConductivity = ( ( k / conductivitySensorStatus[ sensorNum ].calculatedResistance ) * - ( 1 + ( conductivitySensorStatus[ sensorNum ].currentAlphaValue * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); - currentConductivityReadings[ sensorNum ].data = calculatedConductivity * SIEMENS_TO_MICROSIEMENS_CONVERSION; + if ( TRUE == conductivitySensorStatus[ sensorNum ].calReadComplete ) + { + calculatedConductivity = ( ( k / conductivitySensorStatus[ sensorNum ].calculatedResistance ) * + ( 1 + ( conductivitySensorStatus[ sensorNum ].currentAlphaValue * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); + currentConductivityReadings[ sensorNum ].data = calculatedConductivity * SIEMENS_TO_MICROSIEMENS_CONVERSION; + } + else + { + currentConductivityReadings[ sensorNum ].data = calculatedConductivity; + } } /*********************************************************************//** Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 -r1158d9e342ab00e93e264b8f161696c012302751 --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 1158d9e342ab00e93e264b8f161696c012302751) @@ -116,7 +116,7 @@ void initConductivitySensors( void ); void execConductivitySensors( void ); -void readConductivitySensorData( void ); +void readConductivitySensorData( CONDUCTIVITY_SENSORS_T sensor ); F32 getConductivity( CONDUCTIVITY_SENSORS_T sensor ); F32 getConductivityTemperature( CONDUCTIVITY_SENSORS_T sensor ); Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -rc49f9ed931d60e5bd1d0a406fde6c9fe1437f73b -r1158d9e342ab00e93e264b8f161696c012302751 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision c49f9ed931d60e5bd1d0a406fde6c9fe1437f73b) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 1158d9e342ab00e93e264b8f161696c012302751) @@ -463,6 +463,56 @@ U16 fpgaACDCPMonVrms; ///< Reg 824. AC DC Power Supply RMS Voltage U16 fpgaACHeaterPMonIrms; ///< Reg 826. AC Heater RMS Current U16 fpgaACHeaterPMonVrms; ///< Reg 828. AC Heater RMS Voltage. + U08 fpgaD10FaultStatus; ///< Reg 830. DRV8434S Fault Status Register for D10. + U08 fpgaD10DiagStatus1; ///< Reg 831. DRV8434S Diag Status1 Register for D10. + U08 fpgaD10DiagStatus2; ///< Reg 832. DRV8434S Diag Status2 Register for D10. + U08 fpgaD10CtrlReg1Status; ///< Reg 833. DRV8434S CtrlReg1 Status for D10. + U08 fpgaD10CtrlReg2Status; ///< Reg 834. DRV8434S CtrlReg2 Status for D10. + U08 fpgaD10CtrlReg3Status; ///< Reg 835. DRV8434S CtrlReg3 Status for D10. + U08 fpgaD10CtrlReg4Status; ///< Reg 836. DRV8434S CtrlReg4 Status for D10. + U08 fpgaD10CtrlReg5Status; ///< Reg 837. DRV8434S CtrlReg5 Status for D10. + U08 fpgaD10CtrlReg6Status; ///< Reg 838. DRV8434S CtrlReg6 Status for D10. + U08 fpgaD10CtrlReg7Status; ///< Reg 839. DRV8434S CtrlReg7 Status for D10. + U08 fpgaD10CtrlReg8Status; ///< Reg 840. DRV8434S CtrlReg8 Status for D10. + U08 fpgaD10CtrlReg9Status; ///< Reg 841. DRV8434S CtrlReg9 Status for D10. + U08 fpgaD11FaultStatus; ///< Reg 842. DRV8434S Fault Status Register for D11. + U08 fpgaD11DiagStatus1; ///< Reg 843. DRV8434S Diag Status1 Register for D11. + U08 fpgaD11DiagStatus2; ///< Reg 844. DRV8434S Diag Status2 Register for D11. + U08 fpgaD11CtrlReg1Status; ///< Reg 845. DRV8434S CtrlReg1 Status for D11. + U08 fpgaD11CtrlReg2Status; ///< Reg 846. DRV8434S CtrlReg2 Status for D11. + U08 fpgaD11CtrlReg3Status; ///< Reg 847. DRV8434S CtrlReg3 Status for D11. + U08 fpgaD11CtrlReg4Status; ///< Reg 848. DRV8434S CtrlReg4 Status for D11. + U08 fpgaD11CtrlReg5Status; ///< Reg 849. DRV8434S CtrlReg5 Status for D11. + U08 fpgaD11CtrlReg6Status; ///< Reg 850. DRV8434S CtrlReg6 Status for D11. + U08 fpgaD11CtrlReg7Status; ///< Reg 851. DRV8434S CtrlReg7 Status for D11. + U08 fpgaD11CtrlReg8Status; ///< Reg 852. DRV8434S CtrlReg8 Status for D11. + U08 fpgaD11CtrlReg9Status; ///< Reg 853. DRV8434S CtrlReg9 Status for D11. + U08 fpgaD76FaultStatus; ///< Reg 854. DRV8434S Fault Status Register for D76. + U08 fpgaD76DiagStatus1; ///< Reg 855. DRV8434S Diag Status1 Register for D76. + U08 fpgaD76DiagStatus2; ///< Reg 856. DRV8434S Diag Status2 Register for D76. + U08 fpgaD76CtrlReg1Status; ///< Reg 857. DRV8434S CtrlReg1 Status for D76. + U08 fpgaD76CtrlReg2Status; ///< Reg 858. DRV8434S CtrlReg2 Status for D76. + U08 fpgaD76CtrlReg3Status; ///< Reg 859. DRV8434S CtrlReg3 Status for D76. + U08 fpgaD76CtrlReg4Status; ///< Reg 860. DRV8434S CtrlReg4 Status for D76. + U08 fpgaD76CtrlReg5Status; ///< Reg 861. DRV8434S CtrlReg5 Status for D76. + U08 fpgaD76CtrlReg6Status; ///< Reg 862. DRV8434S CtrlReg6 Status for D76. + U08 fpgaD76CtrlReg7Status; ///< Reg 863. DRV8434S CtrlReg7 Status for D76. + U08 fpgaD76CtrlReg8Status; ///< Reg 864. DRV8434S CtrlReg8 Status for D76. + U08 fpgaD76CtrlReg9Status; ///< Reg 865. DRV8434S CtrlReg9 Status for D76. + U08 fpgaD92FaultStatus; ///< Reg 866. DRV8434S Fault Status Register for D92. + U08 fpgaD92DiagStatus1; ///< Reg 867. DRV8434S Diag Status1 Register for D92. + U08 fpgaD92DiagStatus2; ///< Reg 868. DRV8434S Diag Status2 Register for D92. + U08 fpgaD92CtrlReg1Status; ///< Reg 869. DRV8434S CtrlReg1 Status for D92. + U08 fpgaD92CtrlReg2Status; ///< Reg 870. DRV8434S CtrlReg2 Status for D92. + U08 fpgaD92CtrlReg3Status; ///< Reg 871. DRV8434S CtrlReg3 Status for D92. + U08 fpgaD92CtrlReg4Status; ///< Reg 872. DRV8434S CtrlReg4 Status for D92. + U08 fpgaD92CtrlReg5Status; ///< Reg 873. DRV8434S CtrlReg5 Status for D92. + U08 fpgaD92CtrlReg6Status; ///< Reg 874. DRV8434S CtrlReg6 Status for D92. + U08 fpgaD92CtrlReg7Status; ///< Reg 875. DRV8434S CtrlReg7 Status for D92. + U08 fpgaD92CtrlReg8Status; ///< Reg 876. DRV8434S CtrlReg8 Status for D92. + U08 fpgaD92CtrlReg9Status; ///< Reg 877. DRV8434S CtrlReg9 Status for D92. + U16 fpgaCondSensorCalCmdStatus; ///< Reg 878. Conductivity sensor cal commands status + U08 fpgaCondSensorCmdSensorID; ///< Reg 880. Conductivty sensor cal command sensor ID } DD_FPGA_SENSORS_T; // TODO: Remove when Beta 1.9 is obsolete @@ -628,17 +678,17 @@ U32 fpgaD92PumpRevCount; ///< Reg 142. HDF pump revolution count U32 fpgaCondSensCalData1; ///< Reg 146 Conductivity Sensor Calibration Coefficient 1 - U32 fpgaCondSensCalData2; ///< Reg 150 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData3; ///< Reg 154 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData4; ///< Reg 158 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData5; ///< Reg 162 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData6; ///< Reg 166 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData7; ///< Reg 170 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData8; ///< Reg 174 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData9; ///< Reg 178 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData10; ///< Reg 182 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData11; ///< Reg 186 Conductivity Sensor Calibration Coefficient - U32 fpgaCondSensCalData12; ///< Reg 190 Conductivity Sensor Calibration Coefficient + U32 fpgaCondSensCalData2; ///< Reg 150 Conductivity Sensor Calibration Coefficient 2 + U32 fpgaCondSensCalData3; ///< Reg 154 Conductivity Sensor Calibration Coefficient 3 + U32 fpgaCondSensCalData4; ///< Reg 158 Conductivity Sensor Calibration Coefficient 4 + U32 fpgaCondSensCalData5; ///< Reg 162 Conductivity Sensor Calibration Coefficient 5 + U32 fpgaCondSensCalData6; ///< Reg 166 Conductivity Sensor Calibration Coefficient 6 + U32 fpgaCondSensCalData7; ///< Reg 170 Conductivity Sensor Calibration Coefficient 7 + U32 fpgaCondSensCalData8; ///< Reg 174 Conductivity Sensor Calibration Coefficient 8 + U32 fpgaCondSensCalData9; ///< Reg 178 Conductivity Sensor Calibration Coefficient 9 + U32 fpgaCondSensCalData10; ///< Reg 182 Conductivity Sensor Calibration Coefficient 10 + U32 fpgaCondSensCalData11; ///< Reg 186 Conductivity Sensor Calibration Coefficient 11 + U32 fpgaCondSensCalData12; ///< Reg 190 Conductivity Sensor Calibration Coefficient 12 U32 fpgaCondSensCalibrationTime; ///< Reg 194 Conductivity Sensor Calibration Time U16 fpgaCondSensCalibrationCRC; ///< Reg 198 Conductivity Sensor Calibration Data CRC U08 fpgaCondSensorID; ///< Reg 200 Conductivity Sensor Id @@ -4345,4 +4395,28 @@ fpgaActuatorSetPoints.fpgaCondSensorSerialNum = value; } +/*********************************************************************//** + * @brief + * The getFPGACalCmdStatus function gets conductivity sensor command status + * @details \b Inputs: fpgaCondSensorCalCmdStatus + * @details \b Outputs: none + * @return cal command status. + *************************************************************************/ +U16 getFPGACalCmdStatus( void ) +{ + return fpgaSensorReadings.fpgaCondSensorCalCmdStatus; +} + +/*********************************************************************//** + * @brief + * The getFPGACalCmdSensorId function gets conductivity sensor ID for commands + * @details \b Inputs: fpgaCondSensorCmdSensorID + * @details \b Outputs: none + * @return conductivity sensor ID. + *************************************************************************/ +U08 getFPGACalCmdSensorId( void ) +{ + return fpgaSensorReadings.fpgaCondSensorCmdSensorID; +} + /**@}*/ Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -rc49f9ed931d60e5bd1d0a406fde6c9fe1437f73b -r1158d9e342ab00e93e264b8f161696c012302751 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision c49f9ed931d60e5bd1d0a406fde6c9fe1437f73b) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 1158d9e342ab00e93e264b8f161696c012302751) @@ -322,6 +322,8 @@ F32 getFPGAP18CondTemp( void ); U32 getFPGAP18CondCalData( void ); U08 getFPGAP18CalMemCounter( void ); +U16 getFPGACalCmdStatus( void ); +U08 getFPGACalCmdSensorId( void ); void setFPGAP40PumpEnable( BOOL enable ); void setFPGAP40PumpPWM( U16 pwm );