Index: firmware/App/Drivers/ConductivityTeensy.c =================================================================== diff -u -rbd896114f304304a7096b30b2a85067a64645e82 -r0bb2512f5a49b16b8c19e07e3dd34610129a07e3 --- firmware/App/Drivers/ConductivityTeensy.c (.../ConductivityTeensy.c) (revision bd896114f304304a7096b30b2a85067a64645e82) +++ firmware/App/Drivers/ConductivityTeensy.c (.../ConductivityTeensy.c) (revision 0bb2512f5a49b16b8c19e07e3dd34610129a07e3) @@ -52,6 +52,7 @@ #define RX_SIZE_SELECT_SENSOR 1 ///< Expected response bytes length of select sensor cmd. #define RX_SIZE_GET_SINGLE_MEASUREMENT ( sizeof( COND_SENSOR_DATA_T ) ) ///< Expected response bytes length of get single sensor measurement cmd. +#define COND_INIT_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Timeout before which we should transition to idle state. #define COND_STATUS_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Timeout before which we should receive acknowledgment from teensy #define COND_DATA_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Timeout before which we should receive data from teensy #define COND_TEMP_OFFSET 25 ///< Temperature offset constant used in RTD calculations. @@ -62,6 +63,7 @@ static COND_COMM_STATE_T condCommState; ///< current Conductivity driver comm state. +static U32 condInitTime; ///< Tracks duration of init state. static U32 condResponseTime; ///< Tracks duration between cmd sent and its response received. static U32 condReceiptCounter; ///< Conductivity response receipt counter. static U32 condTransmitCounter; ///< Conductivity command transmit counter. @@ -128,6 +130,7 @@ static void initEEPROMdata( void ); static void initMeasurementSettings( void ); +static COND_COMM_STATE_T handleConductivityInit( void ); static COND_COMM_STATE_T handleConductivityIdle( void ); static COND_COMM_STATE_T handleConductivityTX( void ); static COND_COMM_STATE_T handleConductivityRX( void ); @@ -201,7 +204,8 @@ *************************************************************************/ void initConductivityTeensy( void ) { - condCommState = COND_COMM_STATE_IDLE; + condCommState = COND_COMM_STATE_INIT; + condInitTime = getMSTimerCount(); condResponseTime = 0; condReceiptCounter = 0; condTransmitCounter = 0; @@ -218,9 +222,9 @@ memset( &condCmdQ, 0, COND_CMD_Q_LEN ); memset( &condUpdateSettingStatus, 0, MAX_COND_MST_PARAM_IDX ); - memset( &condRawMeasurement, 0, MAX_TEENSY_SENSOR ); - memset( &condCalculatedMeasurement, 0, MAX_TEENSY_SENSOR ); - memset( &condCoeff, 0, MAX_TEENSY_SENSOR ); + memset( &condRawMeasurement, 0, ( sizeof( condRawMeasurement ) * MAX_TEENSY_SENSOR ) ); + memset( &condCalculatedMeasurement, 0, ( sizeof( condCalculatedMeasurement ) * MAX_TEENSY_SENSOR ) ); + memset( &condCoeff, 0, ( sizeof( condCoeff ) * MAX_TEENSY_SENSOR ) ); queueCount = 0; queueRearIndex = 0; @@ -241,6 +245,7 @@ enqueue( TEENSY_CMD_GET_INIT_STATUS ); enqueue( TEENSY_CMD_SELECT_SENSOR ); enqueue( TEENSY_CMD_GET_EEPROM_DATA ); + condInitTime = 0; } /*********************************************************************//** @@ -380,6 +385,10 @@ { switch ( condCommState ) { + case COND_COMM_STATE_INIT: + condCommState = handleConductivityInit(); + break; + case COND_COMM_STATE_IDLE: condCommState = handleConductivityIdle(); break; @@ -404,6 +413,25 @@ /*********************************************************************//** * @brief + * The handleConductivityInit handles the init sequence and transitions to the respective + * comm state. + * @details \b Inputs: none + * @details \b Outputs: none + * @return state - Next state. + *************************************************************************/ +static COND_COMM_STATE_T handleConductivityInit( void ) +{ + COND_COMM_STATE_T state = COND_COMM_STATE_INIT; + + if ( TRUE == didTimeout( condInitTime, COND_INIT_TIMEOUT_MS ) ) + { + state = COND_COMM_STATE_IDLE; + } + return state; +} + +/*********************************************************************//** + * @brief * The handleConductivityIdle handles the command queue and transitions to the respective * comm state. * @details \b Inputs: condAutomatedDataPolling @@ -1970,7 +1998,7 @@ /*********************************************************************//** * @brief - * The getConductivityValue function gets the current calculated conductivity / + * The getTeensyConductivityValue function gets the current calculated conductivity / impedance value. * @details \b Inputs: condCalculatedMeasurement * @details \b Outputs: none @@ -1984,15 +2012,19 @@ if ( D74_COND != sensorId ) { - result = ( F32 )condCalculatedMeasurement[ sensorNum ].Conductivity; + result = condCalculatedMeasurement[ sensorNum ].Conductivity.data; + if ( OVERRIDE_KEY == condCalculatedMeasurement[ sensorNum ].Conductivity.override ) + { + result = condCalculatedMeasurement[ sensorNum ].Conductivity.ovData; + } } return result; } /*********************************************************************//** * @brief - * The getTemperatureValue function gets the current conductivity sensor + * The getTeensyConductivityTemperatureValue function gets the current conductivity sensor * temperature for a given conductivity sensor. * @details \b Inputs: condCalculatedMeasurement * @details \b Outputs: none @@ -2006,14 +2038,44 @@ if ( D74_COND != sensorId ) { - result = ( F32 )condCalculatedMeasurement[ sensorNum ].Temperature; + result = condCalculatedMeasurement[ sensorNum ].Temperature.data; + if ( OVERRIDE_KEY == condCalculatedMeasurement[ sensorNum ].Temperature.override ) + { + result = condCalculatedMeasurement[ sensorNum ].Temperature.ovData; + } } return result; } /*********************************************************************//** * @brief + * The getTeensyConductivityResistanceValue function gets the current conductivity sensor + * resistance for a given conductivity sensor. + * @details \b Inputs: condCalculatedMeasurement + * @details \b Outputs: none + * @param sensorId ID of conductivity sensor to get temperature. + * @return The current temperature of a given conductivity sensor. + *************************************************************************/ +F32 getTeensyConductivityResistanceValue( CONDUCTIVITY_SENSORS_T sensorId ) +{ + U32 sensorNum = getTeensyCondId( sensorId ); + F32 result = 0.0F; + + if ( D74_COND != sensorId ) + { + result = condCalculatedMeasurement[ sensorNum ].Resistance.data; + if ( OVERRIDE_KEY == condCalculatedMeasurement[ sensorNum ].Resistance.override ) + { + result = condCalculatedMeasurement[ sensorNum ].Resistance.ovData; + } + } + + return result; +} + +/*********************************************************************//** + * @brief * The calculateConductivity function calculates the conductivity value. * @details \b Inputs: currentConductivityModel - conductivity model being used. * @details \b Outputs: condCalculatedMeasurement - calculated conductivity value @@ -2093,7 +2155,7 @@ B0 ); - condCalculatedMeasurement[ sensorNum ].Conductivity = calculatedConductivity; + condCalculatedMeasurement[ sensorNum ].Conductivity.data = (F32)calculatedConductivity; } /*********************************************************************//** @@ -2125,9 +2187,9 @@ calculateResistance( sensorNum, isFPSensor ); calculateTemperature( sensorNum ); - calculatedConductivity = ( ( k / condCalculatedMeasurement[ sensorNum ].Resistance ) * - ( 1 + alpha * ( COND_TEMP_OFFSET - condCalculatedMeasurement[ sensorNum ].Temperature ) ) ); - condCalculatedMeasurement[ sensorNum ].Conductivity = calculatedConductivity; + calculatedConductivity = ( ( k / getTeensyConductivityResistanceValue( sensorNum ) ) * + ( 1 + alpha * ( COND_TEMP_OFFSET - getTeensyConductivityTemperatureValue( sensorNum ) ) ) ); + condCalculatedMeasurement[ sensorNum ].Conductivity.data = (F32)calculatedConductivity; } /*********************************************************************//** @@ -2168,10 +2230,10 @@ calculateTemperature( sensorNum ); calculatedConductivity = ( ( k / R ) * - ( 1 + alpha * ( COND_TEMP_OFFSET - condCalculatedMeasurement[ sensorNum ].Temperature ) ) ); + ( 1 + alpha * ( COND_TEMP_OFFSET - getTeensyConductivityTemperatureValue( sensorNum ) ) ) ); calculatedConductivity = calculatedConductivity * COND_CONVERSION_SM_TO_USCM; - condCalculatedMeasurement[ sensorNum ].Conductivity = calculatedConductivity; + condCalculatedMeasurement[ sensorNum ].Conductivity.data = (F32)calculatedConductivity; } /*********************************************************************//** @@ -2211,7 +2273,7 @@ zeta = condCoeff[ sensorNum ].zetaHighDDUS; } calculatedResistance = ( ( eta * R ) + zeta ); - condCalculatedMeasurement[ sensorNum ].Resistance = calculatedResistance; + condCalculatedMeasurement[ sensorNum ].Resistance.data = (F32)calculatedResistance; } /*********************************************************************//** @@ -2232,7 +2294,7 @@ F64 Z = condRawMeasurement[ sensorNum ].rtdRzMag; calculatedTemperature = ( ( beta * Z ) + gamma ); - condCalculatedMeasurement[ sensorNum ].Temperature = calculatedTemperature; + condCalculatedMeasurement[ sensorNum ].Temperature.data = (F32)calculatedTemperature; } /************************************************************************* @@ -2242,6 +2304,124 @@ /*********************************************************************//** * @brief + * The testTeensyConductivitySensorReadingsOverride function overrides the value of the + * specified conductivity sensor with a given value. + * @details \b Inputs: none + * @details \b Outputs: condCalculatedMeasurement[] + * @param message Override message from Dialin which includes an sensor + * ID and override value of the conductivity sensor. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testTeensyConductivitySensorReadingsOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_DD_COND_SENSOR ) && ( payload.index <= LAST_FP_COND_SENSOR ) ) + { + // D74 is not connected to Teensy and does not have a data structure to override. + if ( LAST_DD_COND_SENSOR != payload.index ) + { + result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + F32 value = payload.state.f32; + + condCalculatedMeasurement[ payload.index ].Conductivity.ovData = value; + condCalculatedMeasurement[ payload.index ].Conductivity.override = OVERRIDE_KEY; + } + else + { + condCalculatedMeasurement[ payload.index ].Conductivity.override = OVERRIDE_RESET; + condCalculatedMeasurement[ payload.index ].Conductivity.ovData = condCalculatedMeasurement[ payload.index ].Conductivity.ovInitData; + } + } + } + return result; +} + +/*********************************************************************//** + * @brief + * The testTeensyConductivitySensorTemperatureReadingsOverride function overrides + * the value of the specified conductivity sensor temperature with a given value. + * @details \b Inputs: none + * @details \b Outputs: condCalculatedMeasurement[] + * @param message Override message from Dialin which includes an sensor + * ID and override value of the conductivity sensor temperature. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testTeensyConductivitySensorTemperatureReadingsOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_DD_COND_SENSOR ) && ( payload.index <= LAST_FP_COND_SENSOR ) ) + { + // D74 is not connected to Teensy and does not have a data structure to override. + if ( LAST_DD_COND_SENSOR != payload.index ) + { + result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + F32 value = payload.state.f32; + + condCalculatedMeasurement[ getTeensyCondId( payload.index ) ].Temperature.ovData = value; + condCalculatedMeasurement[ getTeensyCondId( payload.index ) ].Temperature.override = OVERRIDE_KEY; + } + else + { + condCalculatedMeasurement[ getTeensyCondId( payload.index ) ].Temperature.override = OVERRIDE_RESET; + condCalculatedMeasurement[ getTeensyCondId( payload.index ) ].Temperature.ovData = condCalculatedMeasurement[ getTeensyCondId( payload.index ) ].Temperature.ovInitData; + } + } + + } + return result; +} + +/*********************************************************************//** + * @brief + * The testTeensyConductivitySensorResistanceReadingsOverride function overrides + * the value of the specified conductivity sensor resistance with a given value. + * @details \b Inputs: none + * @details \b Outputs: condCalculatedMeasurement[] + * @param message Override message from Dialin which includes an sensor + * ID and override value of the conductivity sensor temperature. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testTeensyConductivitySensorResistanceReadingsOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_DD_COND_SENSOR ) && ( payload.index <= LAST_FP_COND_SENSOR ) ) + { + // D74 is not connected to Teensy and does not have a data structure to override. + if ( LAST_DD_COND_SENSOR != payload.index ) + { + result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + F32 value = payload.state.f32; + + condCalculatedMeasurement[ payload.index ].Resistance.ovData = value; + condCalculatedMeasurement[ payload.index ].Resistance.override = OVERRIDE_KEY; + } + else + { + condCalculatedMeasurement[ payload.index ].Resistance.override = OVERRIDE_RESET; + condCalculatedMeasurement[ payload.index ].Resistance.ovData = condCalculatedMeasurement[ payload.index ].Resistance.ovInitData; + } + } + + } + return result; +} +/*********************************************************************//** + * @brief * The testSetTeenyConductivityModel function sets the given conductivity model * @details \b Inputs: none * @details \b Outputs: currentConductivityModel[] Index: firmware/App/Drivers/ConductivityTeensy.h =================================================================== diff -u -rbd896114f304304a7096b30b2a85067a64645e82 -r0bb2512f5a49b16b8c19e07e3dd34610129a07e3 --- firmware/App/Drivers/ConductivityTeensy.h (.../ConductivityTeensy.h) (revision bd896114f304304a7096b30b2a85067a64645e82) +++ firmware/App/Drivers/ConductivityTeensy.h (.../ConductivityTeensy.h) (revision 0bb2512f5a49b16b8c19e07e3dd34610129a07e3) @@ -94,7 +94,8 @@ /// Enumeration of Conductivity Communication states. typedef enum Conductivity_Comm_States { - COND_COMM_STATE_IDLE = 0, ///< Idle comm state, will q automated polling if nothing is q'd. + COND_COMM_STATE_INIT = 0, ///< Init comm state, waits 1s before moving to idle. + COND_COMM_STATE_IDLE, ///< Idle comm state, will q automated polling if nothing is q'd. COND_COMM_STATE_TX, ///< TX comm state, sends commands to teensy. COND_COMM_STATE_RX, ///< RX comm state, recv data from teensy. COND_COMM_STATE_FAILED, ///< Failed comm state @@ -196,9 +197,9 @@ /// Structure to store calculated Conductivity and Temperature for each sensor. typedef struct { - F64 Conductivity; - F64 Resistance; - F64 Temperature; + OVERRIDE_F32_T Conductivity; + OVERRIDE_F32_T Resistance; + OVERRIDE_F32_T Temperature; } COND_CALCULATED_MEASUREMENTS_T; /// Structure to enqueue and dequeue commands in the command queue @@ -219,5 +220,8 @@ F32 getTeensyConductivityValue( CONDUCTIVITY_SENSORS_T sensorId ); F32 getTeensyConductivityTemperatureValue( CONDUCTIVITY_SENSORS_T sensorId ); BOOL testSetTeenyConductivityModel( MESSAGE_T *message ); +BOOL testTeensyConductivitySensorReadingsOverride( MESSAGE_T *message ); +BOOL testTeensyConductivitySensorTemperatureReadingsOverride( MESSAGE_T *message ); +BOOL testTeensyConductivitySensorResistanceReadingsOverride( MESSAGE_T *message ); #endif /* _CONDUCTIVITY_TEENSY_H_ */ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rbd896114f304304a7096b30b2a85067a64645e82 -r0bb2512f5a49b16b8c19e07e3dd34610129a07e3 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision bd896114f304304a7096b30b2a85067a64645e82) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 0bb2512f5a49b16b8c19e07e3dd34610129a07e3) @@ -268,7 +268,15 @@ { MSG_ID_FP_DEF_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testGenPermeateDefDataPublishIntervalOverride}, { MSG_ID_FP_DEF_STATUS_REQUEST, &testGetFPDefeaturedStatus }, #ifdef __TEENSY_CONDUCTIVITY_DRIVER__ + { MSG_ID_DD_CONDUCTIVITY_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testDDConductivitySensorDataPublishIntervalOverride }, + { MSG_ID_FP_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFPConductivitySensorDataPublishIntervalOverride }, { MSG_ID_DD_SET_CONDUCTIVITY_MODEL_REQUEST, &testSetTeenyConductivityModel }, + { MSG_ID_DD_CONDUCTIVITY_SENSOR_READINGS_OVERRIDE_REQUEST, &testTeensyConductivitySensorReadingsOverride }, + { MSG_ID_DD_CONDUCTIVITY_SENSOR_TEMPERATURE_OVERRIDE_REQUEST, &testTeensyConductivitySensorTemperatureReadingsOverride }, + { MSG_ID_DD_CONDUCTIVITY_SENSOR_RESISTANCE_OVERRIDE_REQUEST, &testTeensyConductivitySensorResistanceReadingsOverride }, + { MSG_ID_FP_CONDUCTIVITY_OVERRIDE_REQUEST, &testTeensyConductivitySensorReadingsOverride }, + { MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST, &testTeensyConductivitySensorTemperatureReadingsOverride }, + { MSG_ID_FP_CONDUCTIVITY_SENSOR_RESISTANCE_OVERRIDE_REQUEST, &testTeensyConductivitySensorResistanceReadingsOverride }, #endif };