Index: firmware/App/Drivers/ConductivityTeensy.c =================================================================== diff -u -r64ca86ddd949d0ae1c02fa10dfb3b8bb6e0c9f6c -r9ccc651bf491c37bc202ad8d80f0e4063523320d --- firmware/App/Drivers/ConductivityTeensy.c (.../ConductivityTeensy.c) (revision 64ca86ddd949d0ae1c02fa10dfb3b8bb6e0c9f6c) +++ firmware/App/Drivers/ConductivityTeensy.c (.../ConductivityTeensy.c) (revision 9ccc651bf491c37bc202ad8d80f0e4063523320d) @@ -23,26 +23,35 @@ #include "Comm.h" #include "ConductivityTeensy.h" +#include "Timers.h" -#define SCI_RECEIVE_DMA_REQUEST 38 ///< Serial port receive DMA request line. -#define SCI_TRANSMIT_DMA_REQUEST 39 ///< Serial port transmit DMA request line. +#define SCI_RECEIVE_DMA_REQUEST 30 ///< Serial port receive DMA request line. +#define SCI_TRANSMIT_DMA_REQUEST 31 ///< Serial port transmit DMA request line. -#define COND_WRITE_CMD_BUFFER_LEN 256 ///< Conductivity write command buffer byte length. -#define COND_WRITE_RSP_BUFFER_LEN 8 ///< Conductivity write command response buffer byte length. -#define COND_READ_CMD_BUFFER_LEN 8 ///< Conductivity read command buffer byte length. -#define COND_READ_RSP_BUFFER_LEN 256 ///< Conductivity read command response buffer byte length. -#define COND_CMD_Q_LEN 8 ///< Maximum number of cmds that can be queue'd. -#define QUEUE_START_INDEX 0U ///< Queue start index. +#define COND_CMD_Q_LEN 8 ///< Maximum number of cmds that can be queue'd. +#define QUEUE_START_INDEX 0U ///< Queue start index. -#define COND_CMD_Q_LEN 8 ///< Maximum number of cmds that can be queue'd. -#define QUEUE_START_INDEX 0U ///< Queue start index. +#define COND_WRITE_CMD_BUFFER_LEN 256 ///< Conductivity transmit buffer length in bytes. +#define COND_WRITE_RSP_BUFFER_LEN 256 ///< Conductivity receive buffer length in bytes. -#define COND_STATUS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Timeout before which we should receive INIT_STATUS_IN_PROGRESS from teensy -#define COND_DATA_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Timeout before which we should receive INIT_STATUS_INITIALIZED or INIT_STATUS_FAILED from teensy +#define COND_TX_BUFFER_LEN 256 ///< Conductivity transmit buffer length in bytes. +#define COND_RX_BUFFER_LEN 256 ///< Conductivity receive buffer length in bytes. -//#define COND_TX_BUFFER_LEN 256 ///< Conductivity transmit buffer length in bytes. -//#define COND_RX_BUFFER_LEN 256 ///< Conductivity receive buffer length in bytes. +#define RX_SIZE_INIT_SENSOR 2 +#define RX_SIZE_GET_INIT_STATUS 1 +#define RX_SIZE_UPDATE_EEPROM 1 +#define RX_SIZE_GET_EEPROM ( sizeof( CONDUCTIVITY_EEPROM_DATA_T ) ) +#define RX_SIZE_UPDATE_MEASUREMENT_SETTINGS 1 +#define RX_SIZE_GET_MEASUREMENT_SETTNGS ( sizeof( CONDUCTIVITY_MEASUREMENT_SETTINGS_T ) ) +#define RX_SIZE_GET_MEASUREMENT ( sizeof( CONDUCTIVITY_SENSOR_DATA_T ) ) +#define RX_SIZE_STOP_MEASUREMENT 1 +#define RX_SIZE_GET_ALL_MEASUREMENTS ( 6 * RX_SIZE_GET_MEASUREMENT ) +#define RX_SIZE_SELECT_SENSOR 1 +#define RX_SIZE_GET_SINGLE_MEASUREMENT ( sizeof( CONDUCTIVITY_SENSOR_DATA_T ) ) +#define COND_STATUS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Timeout before which we should receive INIT_STATUS_IN_PROGRESS from teensy +#define COND_DATA_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Timeout before which we should receive INIT_STATUS_INITIALIZED or INIT_STATUS_FAILED from teensy + // ********** private data ********** static CONDUCTIVITY_COMM_STATE_T conductivityCommState = COND_COMM_STATE_IDLE; static CONDUCTIVITY_COMM_STATE_T currentFailedState = COND_COMM_STATE_IDLE; @@ -60,11 +69,11 @@ // Conductivity comm buffers static U08 condWriteCmdBuffer[ COND_WRITE_CMD_BUFFER_LEN ]; ///< Conductivity write command buffer. Holds the next Conductivity write command to be transmitted. static U08 condWriteResponseBuffer[ COND_WRITE_RSP_BUFFER_LEN ]; ///< Conductivity write command response buffer. Memory reserved to capture the response to the last Conductivity write command. -static U08 condReadCmdBuffer[ COND_READ_CMD_BUFFER_LEN ]; ///< Conductivity read command buffer. Holds the next Conductivity read command to be transmitted. -static U08 condReadResponseBuffer[ COND_READ_RSP_BUFFER_LEN ]; ///< Conductivity read command response buffer. Memory reserved to capture the response to the last Conductivity read command. +//static U08 condReadCmdBuffer[ COND_READ_CMD_BUFFER_LEN ]; ///< Conductivity read command buffer. Holds the next Conductivity read command to be transmitted. +//static U08 condReadResponseBuffer[ COND_READ_RSP_BUFFER_LEN ]; ///< Conductivity read command response buffer. Memory reserved to capture the response to the last Conductivity read command. -//static U08 condTxBuffer[ COND_TX_BUFFER_LEN ]; ///< Conductivity transmit buffer. -//static U08 condRxBuffer[ COND_RX_BUFFER_LEN ]; ///< Conductivity receive buffer +static U08 condTxBuffer[ COND_TX_BUFFER_LEN ]; ///< Conductivity transmit buffer. +static U08 condRxBuffer[ COND_RX_BUFFER_LEN ]; ///< Conductivity receive buffer // Conductivity queue buffer and supporting variables. static TEENSY_CMD_INDEX_T condCmdQ[ COND_CMD_Q_LEN ]; ///< Conductivity command queue buffer. @@ -89,17 +98,17 @@ static CONDUCTIVITY_COEFFICIENTS_T conductivityCoeff[MAX_TEENSY_SENSOR]; static const CONDUCTIVITY_CMD_DATA_T teensyCmdMap[] = { - { TEENSY_CMD_INIT_SENSOR , (U08*)"a" }, - { TEENSY_CMD_GET_INIT_STATUS , (U08*)"l" }, - { TEENSY_CMD_UPDATE_EEPROM_DATA , (U08*)"save" }, - { TEENSY_CMD_GET_EEPROM_DATA , (U08*)"e" }, - { TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS , (U08*)"cfg" }, - { TEENSY_CMD_GET_MEASUREMENT_SETTINGS , (U08*)"k" }, - { TEENSY_CMD_GET_MEASUREMENT , (U08*)"m" }, - { TEENSY_CMD_STOP_MEASUREMENT , (U08*)"n" }, - { TEENSY_CMD_GET_ALL_MEASUREMENTS , (U08*)"g" }, - { TEENSY_CMD_SELECT_SENSOR , (U08*)"j" }, - { TEENSY_CMD_GET_SINGLE_MEASUREMENT , (U08*)"h" }, + { TEENSY_CMD_INIT_SENSOR , (U08*)"a" , RX_SIZE_INIT_SENSOR }, + { TEENSY_CMD_GET_INIT_STATUS , (U08*)"l" , RX_SIZE_GET_INIT_STATUS }, + { TEENSY_CMD_UPDATE_EEPROM_DATA , (U08*)"save", RX_SIZE_UPDATE_EEPROM }, + { TEENSY_CMD_GET_EEPROM_DATA , (U08*)"e" , RX_SIZE_GET_EEPROM }, + { TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS , (U08*)"cfg" , RX_SIZE_UPDATE_MEASUREMENT_SETTINGS }, + { TEENSY_CMD_GET_MEASUREMENT_SETTINGS , (U08*)"k" , RX_SIZE_GET_MEASUREMENT_SETTNGS }, + { TEENSY_CMD_GET_MEASUREMENT , (U08*)"m" , RX_SIZE_GET_MEASUREMENT }, + { TEENSY_CMD_STOP_MEASUREMENT , (U08*)"n" , RX_SIZE_STOP_MEASUREMENT }, + { TEENSY_CMD_GET_ALL_MEASUREMENTS , (U08*)"g" , RX_SIZE_GET_ALL_MEASUREMENTS }, + { TEENSY_CMD_SELECT_SENSOR , (U08*)"j" , RX_SIZE_SELECT_SENSOR }, + { TEENSY_CMD_GET_SINGLE_MEASUREMENT , (U08*)"h" , RX_SIZE_GET_SINGLE_MEASUREMENT }, }; // Conductivity cmd data structs @@ -109,13 +118,6 @@ CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurementSettingsTX; CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurementSettingsRX; -// Conductivity cmd data structs -TEENSY_SENSOR_INDEX_T currentSelectedSensor; -CONDUCTIVITY_EEPROM_DATA_T eePromDataTX; -CONDUCTIVITY_EEPROM_DATA_T eePromDataRX; -CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurementSettingsTX; -CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurementSettingsRX; - // ********** private function prototypes ********** static void initConductivityDMAchannels( void ); static CONDUCTIVITY_COMM_STATE_T handleConductivityIdle( void ); @@ -143,7 +145,7 @@ static CONDUCTIVITY_PARSE_STATUS parseConductivityMeasurements( const U32 *buffer, U32 len ); static BOOL txTeensyWriteCmd( TEENSY_CMD_INDEX_T cmdIndex, const U08* param ); -static BOOL txTeensyReadCmd( TEENSY_CMD_INDEX_T cmdIndex ); +static BOOL rxTeensyReadRsp( TEENSY_CMD_INDEX_T cmdIndex ); static CONDUCTIVITY_COMM_STATE_T txInitSensor( void ); static CONDUCTIVITY_COMM_STATE_T rxInitSensor( void ); @@ -196,17 +198,112 @@ condResponseTime = 0; // initialize Conductivity comm buffers - memset( &condWriteCmdBuffer, 0, COND_WRITE_CMD_BUFFER_LEN ); - memset( &condReadCmdBuffer, 0, COND_READ_CMD_BUFFER_LEN ); +// memset( &condWriteCmdBuffer, 0, COND_WRITE_CMD_BUFFER_LEN ); +// memset( &condReadCmdBuffer, 0, COND_READ_CMD_BUFFER_LEN ); -// memset( &condTxBuffer, 0, COND_TX_BUFFER_LEN ); -// memset( &condRxBuffer, 0, COND_RX_BUFFER_LEN ); + memset( &condTxBuffer, 0, COND_TX_BUFFER_LEN ); + memset( &condRxBuffer, 0, COND_RX_BUFFER_LEN ); initConductivityDMAchannels(); // add init conductivity commands enqueue( TEENSY_CMD_INIT_SENSOR ); - enqueue( TEENSY_CMD_GET_MEASUREMENT ); + enqueue( TEENSY_CMD_GET_INIT_STATUS ); +} + +static void initConductivityDMAchannels( void ) +{ + + memset( &condWriteCmdBuffer, 0, COND_WRITE_CMD_BUFFER_LEN ); + memset( &condWriteResponseBuffer, 0, COND_WRITE_RSP_BUFFER_LEN ); + // Enable interrupt notifications for FPGA serial port + sciEnableNotification( sciREG, SCI_OE_INT | SCI_FE_INT ); + // Assign DMA channels to h/w DMA requests + dmaReqAssign( DMA_CH1, SCI_RECEIVE_DMA_REQUEST ); + dmaReqAssign( DMA_CH3, SCI_TRANSMIT_DMA_REQUEST ); + // Set DMA channel priorities + dmaSetPriority( DMA_CH1, HIGHPRIORITY ); + dmaSetPriority( DMA_CH3, LOWPRIORITY ); + // Enable DMA block transfer complete interrupts + dmaEnableInterrupt( DMA_CH1, BTC ); + dmaEnableInterrupt( DMA_CH3, BTC ); + + // Initialize Conductivity DMA Write Control Record + condDMAWriteControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAWriteControlRecord.SADD = (U32)condWriteCmdBuffer; // Transfer source address + condDMAWriteControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register + condDMAWriteControlRecord.CHCTRL = 0; // No chaining + condDMAWriteControlRecord.ELCNT = 1; // Frame is 1 element + condDMAWriteControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAWriteControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte for read + condDMAWriteControlRecord.WRSIZE = ACCESS_8_BIT; // Element size is 1 byte for write + condDMAWriteControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAWriteControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment + condDMAWriteControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed + condDMAWriteControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAWriteControlRecord.ELSOFFSET = 0; // Not used + condDMAWriteControlRecord.ELDOFFSET = 0; // Not used + condDMAWriteControlRecord.FRSOFFSET = 0; // Not used + condDMAWriteControlRecord.FRDOFFSET = 0; // Not used + + // Initialize Conductivity DMA Write Response Control Record + condDMAWriteRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAWriteRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register + condDMAWriteRespControlRecord.DADD = (U32)condWriteResponseBuffer; // Transfer destination address + condDMAWriteRespControlRecord.CHCTRL = 0; // No chaining + condDMAWriteRespControlRecord.ELCNT = 1; // Frame is 1 element + condDMAWriteRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAWriteRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte + condDMAWriteRespControlRecord.WRSIZE = ACCESS_8_BIT; // + condDMAWriteRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAWriteRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed + condDMAWriteRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment + condDMAWriteRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAWriteRespControlRecord.ELDOFFSET = 0; // Not used + condDMAWriteRespControlRecord.ELSOFFSET = 0; // Not used + condDMAWriteRespControlRecord.FRDOFFSET = 0; // Not used + condDMAWriteRespControlRecord.FRSOFFSET = 0; // Not used + +// // Initialize Conductivity DMA Read Control RecordfpgaReadCmdBuffer +// condDMAReadControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) +// condDMAReadControlRecord.SADD = (U32)condRxBuffer; // Transfer source address +// condDMAReadControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register +// condDMAReadControlRecord.CHCTRL = 0; // No chaining +// condDMAReadControlRecord.ELCNT = 1; // Frame is 1 element +// condDMAReadControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known +// condDMAReadControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte +// condDMAReadControlRecord.WRSIZE = ACCESS_8_BIT; // +// condDMAReadControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer +// condDMAReadControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment +// condDMAReadControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed +// condDMAReadControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off +// condDMAReadControlRecord.ELSOFFSET = 0; // Not used +// condDMAReadControlRecord.ELDOFFSET = 0; // Not used +// condDMAReadControlRecord.FRSOFFSET = 0; // Not used +// condDMAReadControlRecord.FRDOFFSET = 0; // Not used +// +// // Initialize Conductivity DMA Read Response Control Record +// condDMAReadRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) +// condDMAReadRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register +// condDMAReadRespControlRecord.DADD = (U32)condRxBuffer; // Transfer destination address +// condDMAReadRespControlRecord.CHCTRL = 0; // No chaining +// condDMAReadRespControlRecord.ELCNT = 1; // Frame is 1 element +// condDMAReadRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known +// condDMAReadRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte +// condDMAReadRespControlRecord.WRSIZE = ACCESS_8_BIT; // +// condDMAReadRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer +// condDMAReadRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed +// condDMAReadRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment +// condDMAReadRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off +// condDMAReadRespControlRecord.ELDOFFSET = 0; // Not used +// condDMAReadRespControlRecord.ELSOFFSET = 0; // Not used +// condDMAReadRespControlRecord.FRDOFFSET = 0; // Not used +// condDMAReadRespControlRecord.FRSOFFSET = 0; // Not used + + // There should not be any data pending yet + consumeUnexpectedConductivityData(); +} + /*********************************************************************//** * @brief * The execConductivityTeensy function manages incoming data exchanges with @@ -369,272 +466,37 @@ return state; } - static CONDUCTIVITY_COMM_STATE_T handleFailedState( void ) { - switch(currentFailedState) - { - case TEENSY_CMD_INIT_SENSOR: - break; - case TEENSY_CMD_GET_INIT_STATUS: - break; - case TEENSY_CMD_UPDATE_EEPROM_DATA: - break; - case TEENSY_CMD_GET_EEPROM_DATA: - break; - case TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS: - break; - case TEENSY_CMD_GET_MEASUREMENT_SETTINGS: - break; - case TEENSY_CMD_GET_MEASUREMENT: - break; - case TEENSY_CMD_STOP_MEASUREMENT: - break; - case TEENSY_CMD_GET_ALL_MEASUREMENTS: - break; - case TEENSY_CMD_SELECT_SENSOR: - break; - case TEENSY_CMD_GET_SINGLE_MEASUREMENT: - break; - default: - break; + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_FAILED; - } -} - - - -static void initConductivityDMAchannels( void ) -{ - // Assign DMA channels to h/w DMA requests - dmaReqAssign( DMA_CH1, SCI_RECEIVE_DMA_REQUEST ); - dmaReqAssign( DMA_CH3, SCI_TRANSMIT_DMA_REQUEST ); - // Set DMA channel priorities - dmaSetPriority( DMA_CH1, HIGHPRIORITY ); - dmaSetPriority( DMA_CH3, LOWPRIORITY ); - // Enable DMA block transfer complete interrupts - dmaEnableInterrupt( DMA_CH1, BTC ); - dmaEnableInterrupt( DMA_CH3, BTC ); - - // Initialize Conductivity DMA Write Control Record - condDMAWriteControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - condDMAWriteControlRecord.SADD = (U32)condWriteCmdBuffer; // Transfer source address - condDMAWriteControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register - condDMAWriteControlRecord.CHCTRL = 0; // No chaining - condDMAWriteControlRecord.ELCNT = 1; // Frame is 1 element - condDMAWriteControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known - condDMAWriteControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte for read - condDMAWriteControlRecord.WRSIZE = ACCESS_8_BIT; // Element size is 1 byte for write - condDMAWriteControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - condDMAWriteControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment - condDMAWriteControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed - condDMAWriteControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - condDMAWriteControlRecord.ELSOFFSET = 0; // Not used - condDMAWriteControlRecord.ELDOFFSET = 0; // Not used - condDMAWriteControlRecord.FRSOFFSET = 0; // Not used - condDMAWriteControlRecord.FRDOFFSET = 0; // Not used - - // Initialize Conductivity DMA Write Response Control Record - condDMAWriteRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - condDMAWriteRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register - condDMAWriteRespControlRecord.DADD = (U32)condWriteResponseBuffer; // Transfer destination address - condDMAWriteRespControlRecord.CHCTRL = 0; // No chaining - condDMAWriteRespControlRecord.ELCNT = 1; // Frame is 1 element - condDMAWriteRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known - condDMAWriteRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte - condDMAWriteRespControlRecord.WRSIZE = ACCESS_8_BIT; // - condDMAWriteRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - condDMAWriteRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed - condDMAWriteRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment - condDMAWriteRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - condDMAWriteRespControlRecord.ELDOFFSET = 0; // Not used - condDMAWriteRespControlRecord.ELSOFFSET = 0; // Not used - condDMAWriteRespControlRecord.FRDOFFSET = 0; // Not used - condDMAWriteRespControlRecord.FRSOFFSET = 0; // Not used - - // Initialize Conductivity DMA Read Control Record - condDMAReadControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - condDMAReadControlRecord.SADD = (U32)condReadCmdBuffer; // Transfer source address - condDMAReadControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register - condDMAReadControlRecord.CHCTRL = 0; // No chaining - condDMAReadControlRecord.ELCNT = 1; // Frame is 1 element - condDMAReadControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known - condDMAReadControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte - condDMAReadControlRecord.WRSIZE = ACCESS_8_BIT; // - condDMAReadControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - condDMAReadControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment - condDMAReadControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed - condDMAReadControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - condDMAReadControlRecord.ELSOFFSET = 0; // Not used - condDMAReadControlRecord.ELDOFFSET = 0; // Not used - condDMAReadControlRecord.FRSOFFSET = 0; // Not used - condDMAReadControlRecord.FRDOFFSET = 0; // Not used - - // Initialize Conductivity DMA Read Response Control Record - condDMAReadRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - condDMAReadRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register - condDMAReadRespControlRecord.DADD = (U32)condReadResponseBuffer; // Transfer destination address - condDMAReadRespControlRecord.CHCTRL = 0; // No chaining - condDMAReadRespControlRecord.ELCNT = 1; // Frame is 1 element - condDMAReadRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known - condDMAReadRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte - condDMAReadRespControlRecord.WRSIZE = ACCESS_8_BIT; // - condDMAReadRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - condDMAReadRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed - condDMAReadRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment - condDMAReadRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - condDMAReadRespControlRecord.ELDOFFSET = 0; // Not used - condDMAReadRespControlRecord.ELSOFFSET = 0; // Not used - condDMAReadRespControlRecord.FRDOFFSET = 0; // Not used - condDMAReadRespControlRecord.FRSOFFSET = 0; // Not used - - // There should not be any data pending yet - consumeUnexpectedConductivityData(); -} - -/*********************************************************************//** - * @brief - * The execConductivityTeensy function manages incoming data exchanges with - * the Teensy board over UART. - * @details \b Inputs: conductivityCommState - * @details \b Outputs: conductivityCommState - * @return none - *************************************************************************/ -void execConductivityTeensy( void ) -{ - switch ( conductivityCommState ) + switch( state ) { - case COND_COMM_STATE_IDLE: - conductivityCommState = handleConductivityIdle(); - break; - - case COND_COMM_STATE_SEND_CMD: - conductivityCommState = handleConductivityTX(); - break; - - case COND_COMM_STATE_RCV_RSPNS: - conductivityCommState = handleConductivityRX(); - break; - - default: - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, (U32)conductivityCommState ) - break; - } -} - -/*********************************************************************//** - * @brief - * The handleConductivityIdle handles the command queue and transitions to the respective - * comm state. - * @details \b Inputs: TBD - * @details \b Outputs: TBD - * @return none - *************************************************************************/ -static CONDUCTIVITY_COMM_STATE_T handleConductivityIdle( void ) -{ - CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_IDLE; - if ( !isQueueEmpty() ) - { - dequeue(); - state = COND_COMM_STATE_SEND_CMD; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleConductivityTX handles the transmission of data over UART - * to the Teensy board. - * @details \b Inputs: TBD - * @details \b Outputs: TBD - * @return none - *************************************************************************/ -static CONDUCTIVITY_COMM_STATE_T handleConductivityTX( void ) -{ - CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD; - - - switch ( currentCmd ) - { case TEENSY_CMD_INIT_SENSOR: - state = sendCmd_initSensor(); break; case TEENSY_CMD_GET_INIT_STATUS: - state = sendCmd_getInitStatus(); break; case TEENSY_CMD_UPDATE_EEPROM_DATA: - state = sendCmd_updateEEPROMdata( eePromDataTX ); break; case TEENSY_CMD_GET_EEPROM_DATA: - state = sendCmd_getEEPROMdata(); break; case TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS: - state = sendCmd_updateMeasurementSettings( measurementSettingsTX ); break; case TEENSY_CMD_GET_MEASUREMENT_SETTINGS: - state = sendCmd_getMeasurementSettings(); break; case TEENSY_CMD_GET_MEASUREMENT: - state = sendCmd_getMeasurements(); break; case TEENSY_CMD_STOP_MEASUREMENT: - sendCmd_stopMeasurement(); break; case TEENSY_CMD_GET_ALL_MEASUREMENTS: - sendCmd_getAllMeasurements(); break; case TEENSY_CMD_SELECT_SENSOR: - sendCmd_selectSensor( currentSelectedSensor ); break; case TEENSY_CMD_GET_SINGLE_MEASUREMENT: - sendCmd_getSingleMeasurement( currentCmd ); break; default: break; - } - return state; -} - -/*********************************************************************//** - * @brief - * The handleConductivityRX handles the receiving of data over UART - * to the Teensy board. - * @details \b Inputs: TBD - * @details \b Outputs: TBD - * @return none - *************************************************************************/ -static CONDUCTIVITY_COMM_STATE_T handleConductivityRX( void ) -{ - CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD; - - switch ( currentCmd ) - { - case TEENSY_CMD_INIT_SENSOR: - break; - case TEENSY_CMD_GET_INIT_STATUS: - break; - case TEENSY_CMD_UPDATE_EEPROM_DATA: - break; - case TEENSY_CMD_GET_EEPROM_DATA: - break; - case TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS: - break; - case TEENSY_CMD_GET_MEASUREMENT_SETTINGS: - break; - case TEENSY_CMD_GET_MEASUREMENT: - break; - case TEENSY_CMD_STOP_MEASUREMENT: - break; - case TEENSY_CMD_GET_ALL_MEASUREMENTS: - break; - case TEENSY_CMD_SELECT_SENSOR: - break; - case TEENSY_CMD_GET_SINGLE_MEASUREMENT: - break; - default: - break; } return state; @@ -672,8 +534,8 @@ condBulkWriteAndReadInProgress = FALSE; condReadCommandInProgress = TRUE; // Initiate bulk read command - startConductivityDMAReceiptOfReadResp(); - startConductivityDMAReadCmd(); + //startConductivityDMAReceiptOfReadResp(); + //startConductivityDMAReadCmd(); } } @@ -825,7 +687,7 @@ static void setupConductivityDMAForWriteCmd( U32 bytes2Transmit ) { // Verify # of bytes does not exceed buffer length - if ( bytes2Transmit <= COND_WRITE_CMD_BUFFER_LEN ) + if ( bytes2Transmit <= COND_TX_BUFFER_LEN ) { condDMAWriteControlRecord.FRCNT = bytes2Transmit; } @@ -842,7 +704,7 @@ static void setupConductivityDMAForWriteResp( U32 bytes2Receive ) { // Verify # of bytes does not exceed buffer length - if ( bytes2Receive <= COND_WRITE_RSP_BUFFER_LEN ) + if ( bytes2Receive <= COND_RX_BUFFER_LEN ) { condDMAWriteRespControlRecord.FRCNT = bytes2Receive; } @@ -855,37 +717,37 @@ setSCIDMAReceiveInterrupt(); } -static void setupConductivityDMAForReadCmd( U32 bytes2Transmit ) -{ - // Verify # of bytes does not exceed buffer length - if ( bytes2Transmit <= COND_READ_CMD_BUFFER_LEN ) - { - condDMAReadControlRecord.FRCNT = bytes2Transmit; - } -} +//static void setupConductivityDMAForReadCmd( U32 bytes2Transmit ) +//{ +// // Verify # of bytes does not exceed buffer length +// if ( bytes2Transmit <= COND_RX_BUFFER_LEN ) +// { +// condDMAReadControlRecord.FRCNT = bytes2Transmit; +// } +//} +// +//static void startConductivityDMAReadCmd( void ) +//{ +// dmaSetCtrlPacket( DMA_CH3, condDMAReadControlRecord ); +// dmaSetChEnable( DMA_CH3, DMA_HW ); +// setSCIDMATransmitInterrupt(); +//} +// +//static void setupConductivityDMAForReadResp( U32 bytes2Receive ) +//{ +// // Verify # of bytes does not exceed buffer length +// if ( bytes2Receive <= COND_RX_BUFFER_LEN ) +// { +// condDMAReadRespControlRecord.FRCNT = bytes2Receive; +// } +//} +//static void startConductivityDMAReceiptOfReadResp( void ) +//{ +// dmaSetCtrlPacket( DMA_CH1, condDMAReadRespControlRecord ); +// dmaSetChEnable( DMA_CH1, DMA_HW ); +// setSCIDMAReceiveInterrupt(); +//} -static void startConductivityDMAReadCmd( void ) -{ - dmaSetCtrlPacket( DMA_CH3, condDMAReadControlRecord ); - dmaSetChEnable( DMA_CH3, DMA_HW ); - setSCIDMATransmitInterrupt(); -} - -static void setupConductivityDMAForReadResp( U32 bytes2Receive ) -{ - // Verify # of bytes does not exceed buffer length - if ( bytes2Receive <= COND_READ_RSP_BUFFER_LEN ) - { - condDMAReadRespControlRecord.FRCNT = bytes2Receive; - } -} -static void startConductivityDMAReceiptOfReadResp( void ) -{ - dmaSetCtrlPacket( DMA_CH1, condDMAReadRespControlRecord ); - dmaSetChEnable( DMA_CH1, DMA_HW ); - setSCIDMAReceiveInterrupt(); -} - /*********************************************************************//** * @brief * The parseMeasurementSettings Reads measurement settings from buffer and @@ -1022,7 +884,6 @@ static BOOL txTeensyWriteCmd( TEENSY_CMD_INDEX_T cmdIndex, const U08* param ) { BOOL success = FALSE; - U32 txByteLength = 0; U16 written = 0; // Validate command index and ensure command string exists @@ -1036,38 +897,37 @@ const U08* baseCmd = (const U08*)teensyCmdMap[ cmdIndex ].teensyCMD; // Clear the write buffer before writing - memset( condWriteCmdBuffer, 0, COND_WRITE_CMD_BUFFER_LEN ); + memset( &condTxBuffer, 0, COND_TX_BUFFER_LEN ); // Format command with optional parameter if ( ( NULL != param ) && ( strlen( (const char*)param ) > 0 ) ) { - written = snprintf( (char*)condWriteCmdBuffer, - COND_WRITE_CMD_BUFFER_LEN, + written = snprintf( (char*)condTxBuffer, + COND_TX_BUFFER_LEN, "%s %s", (const char*)baseCmd, (const char*)param ); - - if ( written > 0 ) - { - success = TRUE; - } } else { - written = snprintf( (char*)condWriteCmdBuffer, - COND_WRITE_CMD_BUFFER_LEN, + written = snprintf( (char*)condTxBuffer, + COND_TX_BUFFER_LEN, "%s", (const char*)baseCmd ); - - if ( written > 0 ) - { - success = TRUE; - } } } + if ( written > 0 ) + { + memcpy( &condWriteCmdBuffer, &condTxBuffer, written ); + success = TRUE; + } + condWriteCommandInProgress = TRUE; setupConductivityDMAForWriteCmd( written ); + setupConductivityDMAForWriteResp( teensyCmdMap[ cmdIndex ].rxSize ); + + startConductivityDMAReceiptOfWriteResp(); startConductivityDMAWriteCmd(); return success; } @@ -1078,33 +938,21 @@ * @param cmdIndex Index of the command in teensyCmd[]. * @return TRUE if the command was successfully written to the read buffer, FALSE otherwise. */ -static BOOL txTeensyReadCmd( TEENSY_CMD_INDEX_T cmdIndex ) +static BOOL rxTeensyReadRsp( TEENSY_CMD_INDEX_T cmdIndex ) { BOOL success = FALSE; - // Validate command index and ensure command string exists - if ( ( cmdIndex >= MAX_NUM_OF_TEENSY_CMDS ) || - ( NULL == teensyCmdMap[ cmdIndex ].teensyCMD ) ) - { - success = FALSE; - } - else - { - const U08* baseCmd = (const U08*)teensyCmdMap[ cmdIndex ].teensyCMD;; + if ( TRUE == condWriteCmdRspnsRcvd ) + { + // Clear the read buffer before writing + memset( &condRxBuffer, 0, COND_RX_BUFFER_LEN ); + memcpy( &condRxBuffer, &condWriteResponseBuffer, teensyCmdMap[ cmdIndex ].rxSize ); + success = TRUE; + } + // Should not be any data received at this time + consumeUnexpectedConductivityData(); - // Clear the read buffer before writing - memset( condReadCmdBuffer, 0, COND_READ_CMD_BUFFER_LEN ); - - // Write only the command string (no parameters allowed) - U16 written = snprintf( (char*)condReadCmdBuffer, - COND_READ_CMD_BUFFER_LEN, - "%s", - (const char*)baseCmd ); - - success = ( written > 0 ) && ( written < COND_READ_CMD_BUFFER_LEN ); - } - - return success; + return success; } static CONDUCTIVITY_COMM_STATE_T txInitSensor( void ) @@ -1130,50 +978,37 @@ static CONDUCTIVITY_COMM_STATE_T rxInitSensor( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - CONDUCTIVITY_INIT_STATUS_T initStatus = CONDUCTIVITY_INIT_STATUS_UNITIALIZED; + CONDUCTIVITY_INIT_STATUS_T initStatusFirstByte = CONDUCTIVITY_INIT_STATUS_FAILED; // set to fail for testing + CONDUCTIVITY_INIT_STATUS_T initStatusSecondByte = CONDUCTIVITY_INIT_STATUS_FAILED; // if data populates + BOOL recvComplete = rxTeensyReadRsp( TEENSY_CMD_INIT_SENSOR ); - initStatus = (CONDUCTIVITY_INIT_STATUS_T)condWriteResponseBuffer[0]; - - switch(initStatus) + if ( TRUE == recvComplete ) { - case CONDUCTIVITY_INIT_STATUS_UNITIALIZED: - // Check if init has not started before the timeout - if ( TRUE == didTimeout( condResponseTime, COND_STATUS_TIMEOUT_MS ) ) - { - // Then, Move to failed state - state = COND_COMM_STATE_FAILED; - } - else - { - // Get the current time - condResponseTime = getMSTimerCount(); - } - break; + initStatusFirstByte = (CONDUCTIVITY_INIT_STATUS_T)condRxBuffer[0]; + initStatusSecondByte = (CONDUCTIVITY_INIT_STATUS_T)condRxBuffer[1]; - case CONDUCTIVITY_INIT_STATUS_IN_PROGRESS: - // Check if initialization has not completed before the timeout - if ( TRUE == didTimeout( condResponseTime, COND_DATA_TIMEOUT_MS ) ) + switch(initStatusSecondByte) { - // Then, Move to failed state - state = COND_COMM_STATE_FAILED; - } - else - { - // Reset timer for next use - condResponseTime = 0; - } - break; + case CONDUCTIVITY_INIT_STATUS_UNITIALIZED: + break; - case CONDUCTIVITY_INIT_STATUS_INITIALIZED: - // Move to execute next command - state = COND_COMM_STATE_IDLE; - break; + case CONDUCTIVITY_INIT_STATUS_IN_PROGRESS: + state = COND_COMM_STATE_IDLE; + break; - case CONDUCTIVITY_INIT_STATUS_FAILED: - default: - // Then, Move to failed state + case CONDUCTIVITY_INIT_STATUS_INITIALIZED: + state = COND_COMM_STATE_IDLE; + break; + + case CONDUCTIVITY_INIT_STATUS_FAILED: + default: + state = COND_COMM_STATE_FAILED; + break; + } + } + else if ( TRUE == didTimeout( condResponseTime, COND_STATUS_TIMEOUT_MS ) ) + { state = COND_COMM_STATE_FAILED; - break; } return state; @@ -1184,7 +1019,7 @@ CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_TX; // If the get init status cmd was sent successfully - if ( TRUE == txTeensyReadCmd( TEENSY_CMD_GET_INIT_STATUS ) ) + if ( TRUE == txTeensyWriteCmd( TEENSY_CMD_GET_INIT_STATUS, NULL ) ) { state = COND_COMM_STATE_RX; } @@ -1199,9 +1034,37 @@ static CONDUCTIVITY_COMM_STATE_T rxGetInitStatus( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - conductivityInitStatus = ( CONDUCTIVITY_INIT_STATUS_T )condReadResponseBuffer[ 0 ]; - state = COND_COMM_STATE_IDLE; + CONDUCTIVITY_INIT_STATUS_T initStatus = CONDUCTIVITY_INIT_STATUS_UNITIALIZED; + BOOL recvComplete = rxTeensyReadRsp( TEENSY_CMD_INIT_SENSOR ); + if ( TRUE == recvComplete ) + { + initStatus = (CONDUCTIVITY_INIT_STATUS_T)condRxBuffer[0]; + } + else if ( TRUE == didTimeout( condResponseTime, COND_STATUS_TIMEOUT_MS ) ) + { + state = COND_COMM_STATE_FAILED; + } + + switch(initStatus) + { + case CONDUCTIVITY_INIT_STATUS_UNITIALIZED: + break; + + case CONDUCTIVITY_INIT_STATUS_IN_PROGRESS: + state = COND_COMM_STATE_IDLE; + break; + + case CONDUCTIVITY_INIT_STATUS_INITIALIZED: + state = COND_COMM_STATE_IDLE; + break; + + case CONDUCTIVITY_INIT_STATUS_FAILED: + default: + state = COND_COMM_STATE_FAILED; + break; + } + return state; } @@ -1251,7 +1114,7 @@ static CONDUCTIVITY_COMM_STATE_T rxUpdateEEPROMdata( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - condUpdateEEPROMstatus = ( CONDUCTIVITY_UPDATE_EEPROM_STATUS_T )condWriteResponseBuffer[ 0 ]; + condUpdateEEPROMstatus = ( CONDUCTIVITY_UPDATE_EEPROM_STATUS_T )condTxBuffer[ 0 ]; state = COND_COMM_STATE_IDLE; return state; } @@ -1260,7 +1123,7 @@ { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_TX; - if ( TRUE == txTeensyReadCmd( TEENSY_CMD_GET_EEPROM_DATA ) ) + if ( TRUE == rxTeensyReadRsp( TEENSY_CMD_GET_EEPROM_DATA ) ) { state = COND_COMM_STATE_RX; @@ -1276,7 +1139,7 @@ static CONDUCTIVITY_COMM_STATE_T rxGetEEPROMdata( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - CONDUCTIVITY_PARSE_STATUS parseStatus = parseEEPROMdata( condReadResponseBuffer, COND_READ_RSP_BUFFER_LEN ); + CONDUCTIVITY_PARSE_STATUS parseStatus = parseEEPROMdata( condRxBuffer, COND_RX_BUFFER_LEN ); state = COND_COMM_STATE_IDLE; return state; } @@ -1312,7 +1175,7 @@ static CONDUCTIVITY_COMM_STATE_T rxUpdateMeasurementSettings( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - condUpdateMeasurementSettings = ( CONDUCTIVITY_UPDATE_MST_STATUS_T )condWriteResponseBuffer[0]; + condUpdateMeasurementSettings = ( CONDUCTIVITY_UPDATE_MST_STATUS_T )condTxBuffer[0]; state = COND_COMM_STATE_IDLE; return state; } @@ -1321,7 +1184,7 @@ { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_TX; - if ( TRUE == txTeensyReadCmd( TEENSY_CMD_GET_MEASUREMENT_SETTINGS ) ) + if ( TRUE == rxTeensyReadRsp( TEENSY_CMD_GET_MEASUREMENT_SETTINGS ) ) { state = COND_COMM_STATE_RX; } @@ -1336,7 +1199,7 @@ static CONDUCTIVITY_COMM_STATE_T rxGetMeasurementSettings( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - CONDUCTIVITY_PARSE_STATUS parseStatus = parseMeasurementSettings( condReadResponseBuffer, COND_READ_RSP_BUFFER_LEN ); + CONDUCTIVITY_PARSE_STATUS parseStatus = parseMeasurementSettings( condRxBuffer, COND_RX_BUFFER_LEN ); state = COND_COMM_STATE_IDLE; return state; @@ -1346,7 +1209,7 @@ { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_TX; - if ( TRUE == txTeensyReadCmd( TEENSY_CMD_GET_MEASUREMENT ) ) + if ( TRUE == rxTeensyReadRsp( TEENSY_CMD_GET_MEASUREMENT ) ) { state = COND_COMM_STATE_RX; } @@ -1360,7 +1223,7 @@ static CONDUCTIVITY_COMM_STATE_T rxGetMeasurements( void ) { CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RX; - CONDUCTIVITY_PARSE_STATUS parseStatus = parseConductivityMeasurements( condReadResponseBuffer, COND_READ_RSP_BUFFER_LEN ); + CONDUCTIVITY_PARSE_STATUS parseStatus = parseConductivityMeasurements( condRxBuffer, COND_RX_BUFFER_LEN ); state = COND_COMM_STATE_IDLE; return state; } @@ -1369,7 +1232,7 @@ static void txStopMeasurement( void ) { - if ( FALSE == txTeensyReadCmd( TEENSY_CMD_STOP_MEASUREMENT ) ) + if ( FALSE == rxTeensyReadRsp( TEENSY_CMD_STOP_MEASUREMENT ) ) { // Handle error } @@ -1384,7 +1247,7 @@ static void txGetAllMeasurements( void ) { - if ( FALSE == txTeensyReadCmd( TEENSY_CMD_GET_ALL_MEASUREMENTS ) ) + if ( FALSE == rxTeensyReadRsp( TEENSY_CMD_GET_ALL_MEASUREMENTS ) ) { // Handle error } @@ -1419,7 +1282,7 @@ { // Assumes sensor has already been selected - if ( FALSE == txTeensyReadCmd( TEENSY_CMD_GET_SINGLE_MEASUREMENT ) ) + if ( FALSE == rxTeensyReadRsp( TEENSY_CMD_GET_SINGLE_MEASUREMENT ) ) { // Handle error } @@ -1431,41 +1294,6 @@ // condReadResponseBuffer } -static CONDUCTIVITY_INIT_STATUS_T getInitStatus( void ) -{ - tx_getInitStatus(); - rx_getInitStatus(); - return conductivityInitStatus; -} - -static const CONDUCTIVITY_EEPROM_DATA_T* getEEPROMdata(void) -{ - return &conductivityEEPROMdata; -} - - -static const CONDUCTIVITY_MEASUREMENT_SETTINGS_T* getMeasurementSettings(void) -{ - return &conductivityMeasurementSettings; -} - -static const CONDUCTIVITY_SENSOR_DATA_T* getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ) -{ - const CONDUCTIVITY_SENSOR_DATA_T* result = NULL; - - if (sensorNum < MAX_TEENSY_SENSOR) - { - result = &rawConductivityValues[ sensorNum ]; - } - - return result; -} - -static const CONDUCTIVITY_SENSOR_DATA_T* getAllMeasurements( void ) -{ - return rawConductivityValues; -} - static void calculateConductivity( TEENSY_SENSOR_INDEX_T sensorNum ) { F64 calculatedConductivity = 0.0;