Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r844f98879b7425c207b58562e623ab960adbc357 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 844f98879b7425c207b58562e623ab960adbc357) @@ -78,6 +78,9 @@ #define MAX_COMM_ERROR_RETRIES 5 ///< Maximum consecutive FPGA communication error retries. +#define FPGA_INPUT_VOLTAGE_SCALE 3.0 ///< FPGA source and aux voltage. +#define FPGA_PVN_VOLTAGE_SCALE 1.0 ///< FPGA pvn voltage. + #define FPGA_ADC1_AUTO_READ_ENABLE 0x01 ///< Auto-read enable bit for ADC1 control register. #define FPGA_AIRTRAP_LEVEL_LOW_MASK 0x0008 ///< Bit mask for air trap lower level sensor. @@ -100,6 +103,10 @@ #define FPGA_PBO_TEMP_OFFSET 50.0 ///< Used in conversion of PBo temperature reading to deg C. #define FPGA_ALARM_AUDIO_VOLUME_SHIFT 3 ///< Shift alarm audio volume 3 bits to left before writing to register. +#define FPGA_ALARM_AUDIO_DIVIDE_SHIFT 6 ///< Shift alarm audio volume divider 6 bits to left before writing to register. + +#define FPGA_BACKUP_ALARM_AUDIO_CONVERT 0.4 ///< Converts backup (piezo) alarm audio ADC volts to amps. + #define FRONT_DOOR_SWITCH_MASK 0x0010 ///< Front door switch bit mask. Bit 4 of the GPIO register. #define PUMP_TRACK_SWITCH_MASK 0x0020 ///< Pump track switch bit mask. Bit 5 of the GPIO register. @@ -180,13 +187,13 @@ S16 VBVPosition; ///< Reg 360. Encoder position from VBV pinch valve. 0 until PID interface is enabled. S16 VDiPosition; ///< Reg 362. Encoder position from VDi pinch valve. 0 until PID interface is enabled. S16 VDoPosition; ///< Reg 364. Encoder position from VDo pinch valve. 0 until PID interface is enabled. - S16 VSparePosition; ///< Reg 366. Encoder position from VSpare pinch valve. 0 until PID interface is enabled. + S16 fpgaIntVoltage; ///< Reg 366. Internal FPGA Vcc voltage. 3V range over 12 bits (0..4095). U16 valveStatus; ///< Reg 368. Valve status register. U16 VBAPWMTarget; ///< Reg 370. PWM target duty cycle for VBA pinch valve. U16 VBVPWMTarget; ///< Reg 372. PWM target duty cycle for VBV pinch valve. U16 VDiPWMTarget; ///< Reg 374. PWM target duty cycle for VDi pinch valve. U16 VDoPWMTarget; ///< Reg 376. PWM target duty cycle for VDo pinch valve. - U16 VSparePWMTarget; ///< Reg 378. PWM target duty cycle for Vspare pinch valve. + U16 fpgaAuxVoltage; ///< Reg 378. Internal FPGA Vcc Aux voltage. 3V range over 12 bits (0..4095). U08 syringePumpStatus; ///< Reg 380. Syringe pump status register. U08 syringePumpADCReadCounter; ///< Reg 381. Syringe pump ADC read counter. U08 syringePumpADCandDACStatus; ///< Reg 382. Syringe pump ADC and DAC status register. @@ -201,12 +208,13 @@ U16 VBVCurrent; ///< Reg 400. VBV pinch valve current (Register VAUX2) U16 VDoCurrent; ///< Reg 402. VDo pinch valve current (Register VAUX3) U16 VBACurrent; ///< Reg 404. VBA pinch valve current (Register VAUX8) - U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX9) + U16 VDiSpeed; ///< Reg 406. VDi pinch valve current (Register VAUX5) U16 VDoSpeed; ///< Reg 408. VDo pinch valve speed (Register VAUX10) - U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX11) - U16 fpgaBoardTemperature; ///< Reg 412. FPGA board temperature. - U16 VAUX13; ///< Reg 414. Register VAUX13. - U16 fpgaTimerCount_ms; ///< Reg 416. Internal FPGA timer count in ms. + U16 VDiCurrent; ///< Reg 410. VDi pinch valve current (Register VAUX13) + U16 fpgaTemperature; ///< Reg 412. FPGA die temperature (deg C = counts x (503.975/4096) - 273.15). + U16 fpgaVpvn; ///< Reg 414. FPGA pvn voltage. 1V range over 12 bits (0..4095). + U16 fpgaTimerCount_ms; ///< Reg 416. Free running 1ms timer counter. Rolls over at 65535.Internal FPGA timer count in ms. + U16 backupAlarmAudioPeakCurrent; ///< Reg 418. Piezo alarm peak ADC current in previous 10ms. 12 bit unsigned. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -1111,29 +1119,89 @@ /*********************************************************************//** * @brief + * The getFPGATemperature function gets the fpga internal die temperature. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current internal FPGA die temperature (in counts) + *************************************************************************/ +U16 getFPGATemperature( void ) +{ + return fpgaSensorReadings.fpgaTemperature; +} + +/*********************************************************************//** + * @brief + * The getFPGAVcc function gets the fpga input voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA input voltage (in volts) + *************************************************************************/ +F32 getFPGAVcc( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaIntVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVccAux function gets the fpga aux. voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA aux. voltage (in volts) + *************************************************************************/ +F32 getFPGAVccAux( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaAuxVoltage * FPGA_INPUT_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAVpvn function gets the fpga pvn voltage. + * @details Inputs: fpgaHeader + * @details Outputs: none + * @return current FPGA pvn voltage (in volts) + *************************************************************************/ +F32 getFPGAVpvn( void ) +{ + F32 result = (F32)fpgaSensorReadings.fpgaVpvn * FPGA_PVN_VOLTAGE_SCALE / (F32)BITS_12_FULL_SCALE; + + return result; +} + +/*********************************************************************//** + * @brief * The setAlarmAudioState function sets the fpga audio control to the given * state and volume. * @details Inputs: none * @details Outputs: alarm audio state and attenuation set - * @param state the state of alarm audio to command: + * @param state the state of alarm audio to command (3..5): * 0 - No alarm tone * 1 - Low priority alarm tone (c e) * 2 - Medium priority alarm tone (c f# c) * 3 - High priority alarm tone (c f# c - c f#) * 4 - Continuous test tone (e) - * @param volumeLevel the level of attenuation to command (0..4) + * @param volumeLevel the level of attenuation to command (0..2): * 4 - 3 dB gain * 3 - 6 dB gain * 2 - 9 dB gain * 1 - 12 dB gain * 0 - 15 dB gain + * @param volumeDivider further attenuation via divider (6..7): + * 0 - Divide by 2 + * 1 - Divide by 4 + * 2 - Divide by 8 + * 3 - Divide by 16 * @return none *************************************************************************/ -void setAlarmAudioState( U32 state, U32 volumeLevel ) +void setAlarmAudioState( U32 state, U32 volumeLevel, U32 volumeDivider ) { U08 audioCmd = (U08)state; audioCmd |= ( (U08)volumeLevel << FPGA_ALARM_AUDIO_VOLUME_SHIFT ); + audioCmd |= ( (U08)volumeDivider << FPGA_ALARM_AUDIO_DIVIDE_SHIFT ); if ( ( state <= NUM_OF_ALARM_PRIORITIES ) && ( volumeLevel <= MAX_ALARM_VOLUME_ATTENUATION ) ) { @@ -1557,6 +1625,32 @@ /*********************************************************************//** * @brief + * The getFPGAArterialPressureReadCounter function gets the latest arterial + * pressure sensor read counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor read counter + *************************************************************************/ +U08 getFPGAArterialPressureReadCounter( void ) +{ + return fpgaSensorReadings.adc1SequenceCount; +} + +/*********************************************************************//** + * @brief + * The getFPGAArterialPressureErrorCounter function gets the latest arterial + * pressure sensor error counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last arterial pressure sensor error counter + *************************************************************************/ +U08 getFPGAArterialPressureErrorCounter( void ) +{ + return fpgaSensorReadings.adc1ErrorCount; +} + +/*********************************************************************//** + * @brief * The getFPGAVenousPressure function gets the latest venous pressure reading. * The high 2 bits are status bits: 00=ok, 01=cmd mode, 10=stale data, 11=diag * The low 14 bits are data. Zero is at 1638. Values above are positive, @@ -1841,6 +1935,22 @@ /*********************************************************************//** * @brief + * The getFPGABackupAlarmAudioCurrent function gets the latest piezo alarm + * audio current reading. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return Latest piezo alarm audio current reading + *************************************************************************/ +F32 getFPGABackupAlarmAudioCurrent( void ) +{ + U16 adcCnts = fpgaSensorReadings.backupAlarmAudioPeakCurrent; + F32 result = ( ( (F32)adcCnts / (F32)BITS_12_FULL_SCALE ) * FPGA_BACKUP_ALARM_AUDIO_CONVERT ) * (F32)MA_PER_AMP; + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAAirTrapLevels function gets the latest air trap level sensor * readings. * @details Inputs: fpgaSensorReadings @@ -2318,7 +2428,7 @@ *************************************************************************/ U16 getFPGABoardTemperature( void ) { - return fpgaSensorReadings.fpgaBoardTemperature; + return fpgaSensorReadings.fpgaTemperature; } /*********************************************************************//**