Started a gui menuflow

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI

Revision:
3:b029a3f73a9e
Parent:
2:5828e6917e75
--- a/Monitoring.c	Tue Jun 09 22:57:20 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1375 +0,0 @@
-*********************************************************************/
-
-/* Includes ------------------------------------------------------------------*/
-#define EXTERN extern
-#include "SS.h"                   
-#include "main.h"                   
-#include "_ss_pwm.h"      
-#include "_SS_I2CX_Drivers.h"
-#include "_SS_I2CX_SDP600.h"
-#include "_SS_I2CX_X201641.h"
-#include "Ventilation.h"   
-#include "MotorTempTable.h"
-#include "_SS_FlowComputer.h"
-#include "_SS_TSI_4040.h"
-#include "_SS_Data_Logging.h"
-#include "_SS_OnOffActioner.h"
-#undef EXTERN
-
-#define INIT_VARIABLES
-#define EXTERN
-#include "Monitoring.h"           
-#undef  EXTERN
-#undef  INIT_VARIABLES
-  
-  
-// *********************** Register locations **********************************
-#define DMA_IFCR1    (*(volatile uint32_t *)0x40020004)
-#define DMA_CCR1     (*(volatile uint32_t *)0x40020008)
-#define DMA_CNTDR1   (*(volatile uint32_t *)0x4002000c)
-#define DMA_CPAR1    (*(volatile uint32_t *)0x40020010)
-#define DMA_CMAR1    (*(volatile uint32_t *)0x40020014)
-
-#define ADC1_SR      (*(volatile uint32_t *)0x40012400)
-#define ADC1_SQR1    (*(volatile uint32_t *)0x4001242C)
-#define ADC1_SQR2    (*(volatile uint32_t *)0x40012430)
-#define ADC1_SQR3    (*(volatile uint32_t *)0x40012434)
-#define ADC1_LTR     (*(volatile uint32_t *)0x40012428)
-#define ADC1_HTR     (*(volatile uint32_t *)0x40012424)
-#define ADC1_CR1     (*(volatile uint32_t *)0x40012404)
-#define ADC1_CR2     (*(volatile uint32_t *)0x40012408)
-
-
-// ************************* ADC CONFIGURATION CHANNELS ************************
-#define FREE_MEAS_CHANNEL             0
-#define PPROX_MEAS_CHANNEL            1
-#define CURRENT_MEAS_CHANNEL          2
-#define ALIM_24V_MEAS_CHANNEL         6
-#define TEMP_PHASE_A                  5
-#define TEMP_PHASE_B                  4
-#define TEMP_PHASE_C                  3
-
-// ********************* 24V ALARM MANAGEMENT **********************************
-#ifndef C_M3_DEVICETEST_TARGET
-
-#endif    
-
-
-
-// ************************ I2C SENSORS MANAGEMENT *****************************
-#ifndef C_M3_DEVICETEST_TARGET
-  #define       READING_NO_SENSOR               0
-  #define       READING_FLOW_SENSORS            1
-  //#define       READING_PRESSURE_SENSORS        2
-  #define       STOP_READING_FLOW_SENSORS       3
-  #define       START_READING_FLOW_SENSORS      4
-  #define       NUMBER_I2C_REBOOT               3
-  
-  #define       FLOW_SENSOR_READING             0
-  #define       FLOW_SENSOR_OK                  1
-  #define       FLOW_SENSOR_FAIL                2
-  static          u8            ucStatusSDP600=FLOW_SENSOR_READING;
-  static          u8            ucStatusX201641=FLOW_SENSOR_READING;
-  
-  static volatile u8            ucReadingFlowSensor=START_READING_FLOW_SENSORS;    // I2Cx sensor managment
-  static          u8            ucCounterFlowErrorMeasurement=0;
-  static          u16           uiTotalCounterFlowErrorMeasurement=0;
-
-  #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)  
-    #ifdef  DISPLAY_AVERAGE_BLOWER_RAW_FLOW
-      #define       SMOOTH_BLOWER_RAW_FLOW_COUNTER      50
-      static          u16           uiBlowerRAWFlowTemp[SMOOTH_BLOWER_RAW_FLOW_COUNTER];                  
-      static          u8            ucIndexBlowerRAWFlowSmooth=0;
-      
-      #define       BLOWER_RAW_FLOW_SAMPLES_NUMBER  200
-      static          u32           ulSumBlowerFlowRAWMes=0;
-      static          u16           uiBlowerRAWFlowSamplesCounter=BLOWER_RAW_FLOW_SAMPLES_NUMBER;
-    #endif
-    
-    #define       SMOOTH_BLOWER_FLOW_LARGE_COUNTER      75//100     // MUST BE HIGHER THAN SMOOTH_BLOWER_FLOW_SMALL_COUNTER
-    #define       SMOOTH_BLOWER_FLOW_SMALL_COUNTER      15      // MUST BE LOWER  THAN SMOOTH_BLOWER_FLOW_LARGE_COUNTER
-    static            int16_t       iTempBlowerFlowForSmallSmooth[SMOOTH_BLOWER_FLOW_SMALL_COUNTER];          
-    static            int16_t       iTempBlowerFlowForLargeSmooth[SMOOTH_BLOWER_FLOW_LARGE_COUNTER];          
-    static            u8            ucIndexSmallBlowerFlowSmooth=0;
-    static            u8            ucIndexLargeBlowerFlowSmooth=0;
-    
-    static            int16_t       idConductancedtSmooth[SMOOTH_BLOWER_FLOW_SMALL_COUNTER]; 
-  #endif  // (SDP600_USED_I2C1_BUS) || (X201641_USED_I2C1_BUS)  
-#endif    // C_M3_DEVICETEST_TARGET
-    
-    
-    
-// ****************** PROXIMAL PRESSURE SENSOR MANAGEMENT **********************
-#ifndef C_M3_DEVICETEST_TARGET
-  #define         SMOOTH_PPROX_PRESSURE_COUNTER   40
-  static  u8              ucIndexPproxPressureSmooth=0;  
-  static  u16             uiProximalPressureTemp[SMOOTH_PPROX_PRESSURE_COUNTER];
-#endif  // C_M3_DEVICETEST_TARGET
-  
-  
-  
-// ********************* MEASURES MANAGEMENT **********************************
-#ifndef C_M3_DEVICETEST_TARGET              
-  // ---- Current measurement
-  static  u32             ulSumCurrentADCMesFiltered=0;
-  static  u32             ulCounterADC_FilteredBlowerCurrentMes=0;
-  
-  // ---- Temperature measurement
-  static  u32             ulADCSumBlowerTemperature=0;
-  static  u16             uiTemperatureSamplesCounter=0;
-  
-  #ifdef TEMPERATURE_TRENDS
-    #ifdef  USE_FLOW_COMPUTER 
-      #define   FLOW_COMPUTER_CYCLE_DETECTION_TIMER                   10        // 100ms
-      static  u8              ucFlowComputerCycle=EXPIRATION_CYCLE;
-      static  u16             uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
-    #else
-      #define   TIME_OUT_TEMPERATURE_MEASUREMENT                      6000      // 60s
-      static  u16             uiTimeOutTemperatureMeasurement=0;
-    #endif  // #ifdef  USE_FLOW_COMPUTER 
-    static  u32             ulADCSumTemperaturePhaseA=0;
-    static  u16             uiADCTemperaturePhaseA;
-    static  u32             ulADCSumTemperaturePhaseB=0;
-    static  u16             uiADCTemperaturePhaseB;
-    static  u32             ulADCSumTemperaturePhaseC=0;
-    static  u16             uiADCTemperaturePhaseC;  
-  #endif
-    
-  // ---- Blower Speed measurment
-  static  u32             ulSumTachoTicks=0;
-  static  u32             ulCounterAverageMotorSpeed=0;
-    
-  // --- Blower current Bessel filter  
-  /*static  u16             uiCurrentADCMesFilteredPrev2;
-  static  u16             uiCurrentADCMesFilteredPrev1;  
-  static  u16             uiCurrentADCMesPrev2;
-  static  u16             uiCurrentADCMesPrev1;
-  static  u16             uiCurrentADCMesFiltered;*/
-
-  // --- Motor voltage
-  static  u32             ulSumADC_MotorVoltage;
-  static  u32             ulCounterADC_MotorVoltage;  
-  
-  // --- Temporary measurements
-  static  u16             uiPproxMax;
-  static  u16             uiVtiTemp;
-  static  u16             uiVteTemp;
-  static  u16             uiTiMesTemp;
-  static  u16             uiTeMesTemp;
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-  
-  
-#ifndef C_M3_DEVICETEST_TARGET  
-  static  u8              ucVentilationCycleCopy=INSPIRATION_CYCLE;
-  static  int32_t         lSumVti=0;
-  static  int32_t         lSumVte=0;
-  static  u8              ucCounterAlarmVteMin=0;
-  static  u8              ucCounterLPAlarm=0;
-#endif  // C_M3_DEVICETEST_TARGET  
-  
-  
-#define RCC_APB2RSTR (*(volatile uint32_t *)0x4002100c)
-
-  
-// ***************** Functions **********************************************
-int16_t ComputeFlowInLitersPerMin(u16 uFlowRAW, bool bPositiveFlow);
-void    ComputeBlowerPower(void);
-u16     ComputeTemperature(u16 uiADCMotorTemp, u16 *puiTempLUT, u16 uiTemperatureGain);
-
-
-/*******************************************************************************
-* Function Name  : ADC1_init
-* Description    : Init ADC1
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ADC1_init(void)
-{
-  // First perform De_init
-  DMA_CCR1 &= (uint32_t)(~0x1);  // channel 1 disable
-  DMA_CCR1 = 0; // Reset Channelx control register
-  DMA_CNTDR1 = 0; // Reset Channelx remaining bytes register
-  DMA_CPAR1 = 0; // Reset Channelx peripheral address register
-  DMA_CMAR1 = 0; // Reset Channelx memory address register
-  DMA_IFCR1 |= DMA_Channel1_IT_Mask; // Reset interrupt pending bits
-  // end de-init
-
-  // Initialise DMA #1
-  DMA_CPAR1 = (uint32_t)(ADC1_BASE + 0x4c);    // base adress of ADC1 ADC_DR register
-  
-  DMA_CMAR1 = (unsigned long)(&uiADC_Value[0]);
-  DMA_CNTDR1 = NUMBER_ADC_CONVERSION;   // numbers of data to be transfered
-  
-  DMA_CCR1 = (3<<12) + (1<<10) + (1<<8) + (1<<7) + (1<<5) /*+ (1<<1)*/; // very high priority, mem size 16 bits, periph size 16 bits, mem increase,/* circular enabled*/, /*transfer complete IT*/
-  DMA_CCR1 |= 1;  // channel 1 enable  
-  
-  
-  
-  // De-init of the ADC 1
-  RCC_APB2RSTR |= RCC_APB2Periph_ADC1;          // enable
-  RCC_APB2RSTR &= ~RCC_APB2Periph_ADC1;         // disable
-  // end De-init of the ADC 1
-      
-  // Select channels of the regular group
-  #ifdef TEMPERATURE_TRENDS  
-    ADC1_SQR1 = ((NUMBER_ADC_CONVERSION-1)<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;
-    ADC1_SQR2 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + TEMP_PHASE_C;  
-    ADC1_SQR3 = (TEMP_PHASE_B<<25) + (TEMP_PHASE_A<<20) + (FREE_MEAS_CHANNEL<<15) + (CURRENT_MEAS_CHANNEL<<10) + (ALIM_24V_MEAS_CHANNEL<<5) + PPROX_MEAS_CHANNEL;      
-  #else
-    ADC1_SQR1 = ((NUMBER_ADC_CONVERSION-1)<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;
-    ADC1_SQR2 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;  
-    ADC1_SQR3 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (CURRENT_MEAS_CHANNEL<<10) + (ALIM_24V_MEAS_CHANNEL<<5) + PPROX_MEAS_CHANNEL;      
-  #endif
-      
-  // 21 micros ADC conversion time
-  ADC1->SMPR2= (7<<27) + (7<<24) + (7<<21) + (7<<18) + (7<<15) + (7<<12) + (7<<9) + (7<<6) + (7<<3) + 7;      
-  ADC1->SMPR1= (7<<21) + (7<<18) + (7<<15) + (7<<12) + (7<<9) + (7<<6) + (7<<3) + 7;   
-  
-  ADC1_CR1  = (1<<8);                                                           // Scan mode enabled
-  ADC1_CR2  = (1<<8);                                                           // DMA mode enabled
-    
-  ADC1_CR2 |= 1;                                                                // start ADC1 - power-on
-
-  // Delay at least 1uSec for ADC calibration/stabilisation. See ADC documentation
-  // Stabilization time > 1uS for ADC, between power-on and start of conversion
-  // Give it 10uSecs just to be sure.   
-  Delay100NS(100);  
-  
-  // Calibration of ADC1
-  ADC1_CR2 |= (1<<3);                                                           // reset calibration registers
-  ADC1_CR2 |= (1<<2);                                                           // Enable calibration
-  while ((ADC1_CR2 & (1<<2)) == (1<<2));                                        // Wait end of calibration
-  
-  ADC1_CR2 |= 1;                                                                // start ADC1 - start conversions    
-}
-
-
-/*******************************************************************************
-* Function Name  : CheckAlimMotorVoltage
-* Description    : Check the voltage range of the 24V power supply
-* Input          : None
-* Output         : None
-* Return         : OPSTATUS_OK or OPSTATUS_FAIL
-*******************************************************************************/
-opstatus_t CheckAlimMotorVoltage(void)
-{
-  if (uiDCinADCMeas<271 || uiDCinADCMeas>2090)
-    return(OPSTATUS_FAIL);                        // <12V or >24V
-  return(OPSTATUS_OK);
-}
-
-
-/*******************************************************************************
-* Function Name  : Compute24VMeasure
-* Description    : Compute the 24V measure
-* Input          : None
-* Output         : None
-* Return         : OPSTATUS_OK or OPSTATUS_FAIL
-*******************************************************************************/
-#ifndef C_M3_DEVICETEST_TARGET
-void Compute24VMeasure(void)
-{
-  u32 ulTemp;
-  u16 uiADC_BlowerVoltage;
-  
-  if (bMemoStartVentilation==TRUE)
-    uiADC_BlowerVoltage=uiAverageADC_MotorVoltage;
-  else
-    uiADC_BlowerVoltage=uiDCinADCMeas;
-    
-  ulTemp=((u32)uiADC_BlowerVoltage*100)/1452;
-  ulTemp+=100;
-  uiTechnicalDataMes[MOTOR_VOLTAGE_TEC_MES]=(u16)ulTemp;
-  uiMotorVoltageMes=(u16)ulTemp;
-}
-#endif
-
-void GetFirstMotorVoltageReading(void)
-{
-  uiAverageADC_MotorVoltage=uiDCinADCMeas;
-}
-/*******************************************************************************
-* Function Name  : ComputeBlowerPower
-* Description    : Compute the power of the blower
-* Input          : None
-* Output         : None
-* Return         : OPSTATUS_OK or OPSTATUS_FAIL
-*******************************************************************************/
-void ComputeBlowerPower(void)
-{
-  uiTechnicalDataMes[MOTOR_POWER_TEC_MES]=((u32)uiMotorVoltageMes*uiBlowerCurrentMes)/10;
-}
-
-/*******************************************************************************
-* Function Name  : SpeedMeasurement
-* Description    : Return blower speed
-* Input          : Tacho counter
-* Output         : None
-* Return         : Blower speed in RPM
-*******************************************************************************/
-u16 SpeedMeasurement(u16 uiTachoCounter)
-{
-  u16 uiSpeedTemp=65500;
-    
-  if (uiTachoCounter>915)
-    uiSpeedTemp=(u16)(60000000UL/uiTachoCounter);        
-  
-  return(uiSpeedTemp);
-}
-
-
-/*******************************************************************************
-* Function Name  : ReadADCInputs
-* Description    : Read all ADC input (function calls every 1ms)
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/  
-void ReadADCInputs(void)
-{ 
-  //u32       ulTerm1, ulTerm2, ulTerm3, ulTerm4, ulTerm5;
-  
-  // ADC Pprox measurement
-  uiProximalPressureADCMes=uiADC_Value[ADC_PPROX_MES];   
-          
-  // ADC DCin measurement
-  uiDCinADCMeas=uiADC_Value[ADC_DCIN_MES];
-  
-  // ADC Blower current measurement
-  ComputeADCBlowerCurrent(FALSE);      
-  
-  // ADC Free measurement  
-  uiADCBlowerTemperatureMeas=uiADC_Value[ADC_FREE_MES];
-     
-  #ifdef TEMPERATURE_TRENDS
-  uiADCTemperaturePhaseA=uiADC_Value[ADC_TEMP_PHASE_A];
-  uiADCTemperaturePhaseB=uiADC_Value[ADC_TEMP_PHASE_B];
-  uiADCTemperaturePhaseC=uiADC_Value[ADC_TEMP_PHASE_C];
-  #endif
-  
-  // 2nd order Bessel Filter (Fcut-out=36Hz, sample rate=1KHz)
-  /*ulTerm1=(919UL*uiADCBlowerCurrent)>>6;
-  ulTerm2=(919UL*uiCurrentADCMesPrev1)>>5;
-  ulTerm3=(919UL*uiCurrentADCMesPrev2)>>6;
-  ulTerm4=(1427UL*uiCurrentADCMesFilteredPrev1)>>1;
-  ulTerm5=259UL*uiCurrentADCMesFilteredPrev2;
-  
-  uiCurrentADCMesFiltered=(ulTerm1+ulTerm2+ulTerm3+ulTerm4-ulTerm5)>>9;
-  uiCurrentADCMesFilteredPrev2=uiCurrentADCMesFilteredPrev1;
-  uiCurrentADCMesFilteredPrev1=uiCurrentADCMesFiltered;  
-  uiCurrentADCMesPrev2=uiCurrentADCMesPrev1;
-  uiCurrentADCMesPrev1=uiADCBlowerCurrent;*/
-  
-  
-  // 2nd order Bessel Filter (Fcut-out=150Hz, sample rate=1KHz)
-  /*ulTerm1=(1929UL*uiADCBlowerCurrent)>>1;
-  ulTerm2=(1929UL*uiCurrentADCMesPrev1);
-  ulTerm3=(1929UL*uiCurrentADCMesPrev2)>>1;
-  ulTerm4=(1095UL*uiCurrentADCMesFilteredPrev1)>>1;
-  ulTerm5=(2479UL*uiCurrentADCMesFilteredPrev2)>>3;
-  
-  uiCurrentADCMesFiltered=(ulTerm1+ulTerm2+ulTerm3+ulTerm4-ulTerm5)>>12;
-  uiCurrentADCMesFilteredPrev2=uiCurrentADCMesFilteredPrev1;
-  uiCurrentADCMesFilteredPrev1=uiCurrentADCMesFiltered;  
-  uiCurrentADCMesPrev2=uiCurrentADCMesPrev1;
-  uiCurrentADCMesPrev1=uiADCBlowerCurrent;*/
-  
-  // --- Start new conversions
-  ADC1->CR2 |= 1;    
-}
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : ComputeMeasurements
-* Description    : Compute different measures
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/  
-void ComputeMeasurements(void)
-{    
-  // ---------------------- Measure Current (A) ----------------------------
-  uiBlowerCurrentMes=ComputeBlowerCurrentInAmper(uiADCBlowerCurrent);
-      
-  // -------------------- Compute motor voltage (V) ------------------------
-  Compute24VMeasure();
-  ComputeBlowerPower();    
-  
-  // ---------------------- Others measurements ----------------------------
-  if (bMemoStartVentilation==TRUE)
-  {
-    // --- Motor speed (RPM) (every 10ms)
-    uiBlowerSpeedMes=SpeedMeasurement(uiTachoTimeTicks);  
-  }  
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-#ifdef TEMPERATURE_TRENDS  
-/*******************************************************************************
-* Function Name  : ComputeAverageOnMeasurements
-* Description    : Average differents mesures : MUST BE CALLED EVERY 10ms 
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/  
-void ComputeAverageOnMeasurements(void)
-{   
-  #ifdef  USE_FLOW_COMPUTER
-    // ----------- USE THE FLOW COMPUTER TO DETECT CYCLE ----------------
-    u16         uiDummy;
-    opstatus_t  opstatus;
-    
-    // Read new flow from flow computer every 10ms  
-    opstatus=SS_Xgetw(flc, &uiDummy);        
-    if (opstatus==OPSTATUS_OK)
-    {
-      // Update flow/pressure displayed
-      uiBlowerFlow=iFlowFromFlowComputer*10;
-      uiPoutPressureMes=uiPressureFromFlowComputer;
-              
-      // Comm with flow computer OK !!    
-      #ifdef  DATA_LOGGING
-      if (bRecordTemperatureTrendsAllowed==FALSE)
-      {
-        bRecordTemperatureTrendsAllowed=TRUE;
-        uiTrendsSampleTime=RECORD_TRENDS_SAMPLE_TIME;
-      }
-      #endif  // DATA_LOGGING
-      
-      // inspiration/expiration cycle detection
-      if (ucFlowComputerCycle==EXPIRATION_CYCLE)
-      {
-        // Inspiration detection
-        if (iFlowFromFlowComputer>50) // 5l/min
-        {
-          uiFlowComputerCycleModificationTimer--;
-          if (uiFlowComputerCycleModificationTimer==0)
-          {
-            ucFlowComputerCycle=INSPIRATION_CYCLE;
-            
-            // Compute temperature of the previous inspiratory cycle
-            if (uiTemperatureSamplesCounter!=0)
-            {
-              uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);           
-              uiADCAverageTemperaturePhaseA=ulADCSumTemperaturePhaseA/uiTemperatureSamplesCounter;
-              uiADCAverageTemperaturePhaseB=ulADCSumTemperaturePhaseB/uiTemperatureSamplesCounter;
-              uiADCAverageTemperaturePhaseC=ulADCSumTemperaturePhaseC/uiTemperatureSamplesCounter;          
-            }
-            ulADCSumBlowerTemperature=0;
-            ulADCSumTemperaturePhaseA=0;
-            ulADCSumTemperaturePhaseB=0;
-            ulADCSumTemperaturePhaseC=0;
-            uiTemperatureSamplesCounter=0;
-          }
-        }
-        else
-          uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
-      }
-      else 
-      {
-        // Record temperature as long as the flow is positive
-        if (iFlowFromFlowComputer>(-10)) // >-1l/min
-        {
-          ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas; 
-          ulADCSumTemperaturePhaseA+=uiADCTemperaturePhaseA;
-          ulADCSumTemperaturePhaseB+=uiADCTemperaturePhaseB;
-          ulADCSumTemperaturePhaseC+=uiADCTemperaturePhaseC;
-          uiTemperatureSamplesCounter++;
-        }
-        
-        // Expiration detection
-        if (iFlowFromFlowComputer<(-50)) // <-5l/min
-        {
-          uiFlowComputerCycleModificationTimer--;
-          if (uiFlowComputerCycleModificationTimer==0)
-            ucFlowComputerCycle=EXPIRATION_CYCLE;
-        }
-        else
-          uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
-      }
-    }
-    else if (opstatus==OPSTATUS_FAIL)
-    {
-      // Comm Failure with flow computer => no data recorded
-      uiBlowerFlow=0;
-      uiPoutPressureMes=0;
-      
-      #ifdef  DATA_LOGGING
-      bRecordTemperatureTrendsAllowed=FALSE;
-      #endif     
-      uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=0;
-    }       
-  #else
-    // ----------- USE THE 24V MEASURE TO DETECT CYCLE ----------------        
-    if (uiDCinADCMeas>500)
-    {
-      // Inspiration
-      ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas; 
-      ulADCSumTemperaturePhaseA+=uiADCTemperaturePhaseA;
-      ulADCSumTemperaturePhaseB+=uiADCTemperaturePhaseB;
-      ulADCSumTemperaturePhaseC+=uiADCTemperaturePhaseC;
-      uiTemperatureSamplesCounter++;
-      uiTimeOutTemperatureMeasurement=TIME_OUT_TEMPERATURE_MEASUREMENT;
-      #ifdef  DATA_LOGGING
-      bRecordTemperatureTrendsAllowed=TRUE;
-      #endif
-    }
-    else if (uiTimeOutTemperatureMeasurement!=0)
-    {
-      // Expiration
-      uiTimeOutTemperatureMeasurement--;
-      if (uiTemperatureSamplesCounter!=0)
-      {
-        uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);           
-        uiADCAverageTemperaturePhaseA=ulADCSumTemperaturePhaseA/uiTemperatureSamplesCounter;
-        uiADCAverageTemperaturePhaseB=ulADCSumTemperaturePhaseB/uiTemperatureSamplesCounter;
-        uiADCAverageTemperaturePhaseC=ulADCSumTemperaturePhaseC/uiTemperatureSamplesCounter;          
-      }
-      ulADCSumBlowerTemperature=0;
-      ulADCSumTemperaturePhaseA=0;
-      ulADCSumTemperaturePhaseB=0;
-      ulADCSumTemperaturePhaseC=0;
-      uiTemperatureSamplesCounter=0;           
-    }  
-    else
-    {
-      uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=0;
-      
-      ulADCSumBlowerTemperature=0;
-      ulADCSumTemperaturePhaseA=0;
-      ulADCSumTemperaturePhaseB=0;
-      ulADCSumTemperaturePhaseC=0;
-      uiTemperatureSamplesCounter=0;   
-      
-      #ifdef  DATA_LOGGING
-      bRecordTemperatureTrendsAllowed=FALSE;
-      #endif            
-    }
-  #endif  // #ifdef  USE_FLOW_COMPUTER      
-}
-#endif  // #ifdef TEMPERATURE_TRENDS     
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-/*******************************************************************************
-* Function Name  : ComputeADCBlowerCurrent
-* Description    : Compute the average current during a PWM cycle (20micros)
-* Input          : bRecordCurrentOffset
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ComputeADCBlowerCurrent(bool bRecordCurrentOffset) 
-{                       
-  if (bRecordCurrentOffset==TRUE)
-  {        
-    uiADCOffsetBlowerCurrent=uiADCBlowerCurrent=uiADC_Value[ADC_CURRENT_MES];    
-  }
-  else
-  {    
-    uiADCBlowerCurrent=uiADC_Value[ADC_CURRENT_MES];              
-  }
-}
-
-
-/*******************************************************************************
-* Function Name  : ComputeBlowerCurrentInAmper
-* Description    : Return blower current value in cAmper (ex: 100=1.00A)
-* Input          : ADC value
-* Output         : None
-* Return         : Blower current in cAmper (ex: 100=1.00A)
-*******************************************************************************/
-int16_t ComputeBlowerCurrentInAmper(u16 uiADCBlowerCurrentLocal)
-{
-  int32_t lTempValue;  
-  
-  // Computation using MOT_CUR_MEAS2
-  lTempValue=(int32_t)uiADCBlowerCurrentLocal-(int32_t)uiADCOffsetBlowerCurrent;
-  lTempValue*=1000;
-  lTempValue/=uiTechnicalDataSet[GAIN_BLOWER_CURRENT_TEC];
-  return(lTempValue);  
-}
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : LaunchFlowReadingOnI2CBus
-* Description    : Open and Read the flow sensor(s) on the I2C bus
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void LaunchFlowReadingOnI2CBus(void)
-{
-  opstatus_t  byOpStatus;
-  u16         uiSensorErr;
-  
-  if (fOpenI2C1SDP600Sensors==FALSE  || fOpenI2C2SDP600Sensors==FALSE   ||
-      fOpenI2C1X201641Sensors==FALSE || fOpenI2C2X201641Sensors==FALSE)
-  {        
-    byOpStatus=SS_Xopen(I2C_SDP600);
-    if (byOpStatus==OPSTATUS_FAIL)
-      uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;     
-    
-    byOpStatus=SS_Xopen(I2C_X201641);
-    if (byOpStatus==OPSTATUS_FAIL)    
-      uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;     
-            
-    ucReadingFlowSensor=STOP_READING_FLOW_SENSORS;
-  }
-  else if (ucReadingFlowSensor==STOP_READING_FLOW_SENSORS)
-  {
-    ucReadingFlowSensor=START_READING_FLOW_SENSORS;
-  }
-  else if (ucReadingFlowSensor==READING_FLOW_SENSORS)
-  {            
-    // Reading SDP600 Flow sensors
-    if (ucStatusSDP600==FLOW_SENSOR_READING)
-    {
-      byOpStatus=SS_Xgetw(I2C_SDP600, &uiSensorErr);    
-      if (byOpStatus==OPSTATUS_OK)                  
-        ucStatusSDP600=FLOW_SENSOR_OK;          
-      else if (byOpStatus==OPSTATUS_FAIL)
-        ucStatusSDP600=FLOW_SENSOR_FAIL;
-    }
-    
-    // Reading X201641 Flow sensors
-    if (ucStatusX201641==FLOW_SENSOR_READING)
-    {
-      byOpStatus=SS_Xgetw(I2C_X201641, &uiSensorErr);    
-      if (byOpStatus==OPSTATUS_OK)            
-        ucStatusX201641=FLOW_SENSOR_OK;          
-      else if (byOpStatus==OPSTATUS_FAIL)          
-        ucStatusX201641=FLOW_SENSOR_FAIL;          
-    }
-    
-    // End of flow measurement?
-    if (ucStatusSDP600!=FLOW_SENSOR_READING && ucStatusX201641!=FLOW_SENSOR_READING)
-    {                              
-      if (ucStatusSDP600==FLOW_SENSOR_OK && ucStatusX201641==FLOW_SENSOR_OK)
-      {      
-        ucCounterFlowErrorMeasurement=0; 
-        #ifdef TIME_MEASUREMENT
-        GPIOB->BRR = GPIO_Pin_5;
-        #endif
-      }
-      else
-      {
-        // Error counters
-        uiTotalCounterFlowErrorMeasurement++;
-        ucCounterFlowErrorMeasurement++;
-        if (ucCounterFlowErrorMeasurement>=NUMBER_I2C_REBOOT)      
-        {
-          //ulErrorCounter|=uiSensorErr;                                                      
-          uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;
-        }
-      }
-      
-      // Next Sensors to measure
-      ucReadingFlowSensor=READING_NO_SENSOR;
-      ucStatusSDP600=FLOW_SENSOR_READING;
-      ucStatusX201641=FLOW_SENSOR_READING;
-    }
-  }
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : ComputeFlowMeasurement
-* Description    : Conpute inspiratory and erxpiratory flow measurements
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ComputeFlowMeasurement(void)
-{
-  #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)
-  int32_t     lValue;
-  u16         uiValue;
-  #ifdef  DISPLAY_AVERAGE_BLOWER_RAW_FLOW
-    u32         ulValue;
-  #endif
-  #endif
-  
-  if (ucReadingFlowSensor==START_READING_FLOW_SENSORS)
-  {
-    ucReadingFlowSensor=READING_FLOW_SENSORS;
-  }
-  else if (ucReadingFlowSensor==READING_NO_SENSOR)
-  {    
-    ucReadingFlowSensor=READING_FLOW_SENSORS;  
-  
-    // **** Reading of the Inspiratory RAW Flow
-    #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)          
-      #ifdef SDP600_USED_I2C1_BUS          
-        SDP600_ReadADCFlowValue(I2C1, SDP600_BLOWER_FLOW_SENSOR, &uiValue);  
-      #endif
-      #ifdef X201641_USED_I2C1_BUS          
-        X201641_ReadADCFlowValue(I2C1, X201641_BLOWER_FLOW_SENSOR, &uiValue);  
-      #endif
-      if (uiValue==uiTechnicalDataSet[FLOWI_OFFSET_TEC])
-      {
-        uiBlowerFlowRAWMes=0;
-        iBlowerFlowMes=0;
-      }
-      else if (uiValue>uiTechnicalDataSet[FLOWI_OFFSET_TEC])
-      {
-        uiBlowerFlowRAWMes=uiValue-uiTechnicalDataSet[FLOWI_OFFSET_TEC];
-        iBlowerFlowMes=ComputeFlowInLitersPerMin(uiBlowerFlowRAWMes, FALSE);
-      }
-      else
-      {
-        uiBlowerFlowRAWMes=uiTechnicalDataSet[FLOWI_OFFSET_TEC]-uiValue;
-        iBlowerFlowMes=ComputeFlowInLitersPerMin(uiBlowerFlowRAWMes, TRUE);
-      }
-        
-      // Smoothing RWA data signals
-      #ifdef  DISPLAY_AVERAGE_BLOWER_RAW_FLOW
-      uiBlowerRAWFlowTemp[ucIndexBlowerRAWFlowSmooth]=uiBlowerFlowRAWMes;
-      ulValue=0;
-      for (uiValue=0; uiValue<SMOOTH_BLOWER_RAW_FLOW_COUNTER; uiValue++)          
-          ulValue+=uiBlowerRAWFlowTemp[uiValue];  
-      uiBlowerFlowRAWSmoothingMes=ulValue/SMOOTH_BLOWER_RAW_FLOW_COUNTER;                          
-      ucIndexBlowerRAWFlowSmooth++;
-      if (ucIndexBlowerRAWFlowSmooth>=SMOOTH_BLOWER_RAW_FLOW_COUNTER)
-        ucIndexBlowerRAWFlowSmooth=0;
-         
-      // Average of the RAW data signal      
-      ulSumBlowerFlowRAWMes+=uiBlowerFlowRAWSmoothingMes;
-      uiBlowerRAWFlowSamplesCounter--;
-      if (uiBlowerRAWFlowSamplesCounter==0)
-        {           
-        uiAverageBlowerFlowRAWMes=ulSumBlowerFlowRAWMes/BLOWER_RAW_FLOW_SAMPLES_NUMBER;
-        ulSumBlowerFlowRAWMes=0;
-        uiBlowerRAWFlowSamplesCounter=BLOWER_RAW_FLOW_SAMPLES_NUMBER;
-        }
-      #endif  // DISPLAY_AVERAGE_BLOWER_RAW_FLOW
-    
-    
-    // **** Reading of the Inspiratory Flow in l/min
-    /*#ifdef SDP600_USED_I2C1_BUS
-      SDP600_CalculFlowValue(I2C1, SDP600_BLOWER_FLOW_SENSOR, &iBlowerFlowMes);                          
-    #endif
-    #ifdef X201641_USED_I2C1_BUS  
-      X201641_CalculFlowValue(I2C1, X201641_BLOWER_FLOW_SENSOR, &iBlowerFlowMes);                          
-    #endif*/
-    iTempBlowerFlowForSmallSmooth[ucIndexSmallBlowerFlowSmooth]=iBlowerFlowMes;        
-    iTempBlowerFlowForLargeSmooth[ucIndexLargeBlowerFlowSmooth]=iBlowerFlowMes;        
-           
-    // Small Smoothing of the inspiratory flow signal
-    lValue=0;
-    for (uiValue=0; uiValue<SMOOTH_BLOWER_FLOW_SMALL_COUNTER; uiValue++)          
-        lValue+=iTempBlowerFlowForSmallSmooth[uiValue];          
-    iBlowerFlowSmoothingMes=lValue/(int16_t)SMOOTH_BLOWER_FLOW_SMALL_COUNTER;        
-    ucIndexSmallBlowerFlowSmooth++;
-    if (ucIndexSmallBlowerFlowSmooth>=SMOOTH_BLOWER_FLOW_SMALL_COUNTER)
-      ucIndexSmallBlowerFlowSmooth=0;
-    
-    // Large Smoothing of the inspiratory flow signal
-    lValue=0;
-    for (uiValue=0; uiValue<SMOOTH_BLOWER_FLOW_LARGE_COUNTER; uiValue++)          
-        lValue+=iTempBlowerFlowForLargeSmooth[uiValue];          
-    iBlowerFlowSmoothingMesForTrigger=lValue/(int16_t)SMOOTH_BLOWER_FLOW_LARGE_COUNTER;            
-    ucIndexLargeBlowerFlowSmooth++;
-    if (ucIndexLargeBlowerFlowSmooth>=SMOOTH_BLOWER_FLOW_LARGE_COUNTER)
-      ucIndexLargeBlowerFlowSmooth=0; 
-    
-    // Flow for Optima Comm 
-    uiBlowerFlow=iBlowerFlowMes;
-    uiBlowerFlowSmoothingMes=iBlowerFlowSmoothingMes;
-    uiBlowerFlowTriggerMes=iBlowerFlowSmoothingMesForTrigger;
-    #endif  // (SDP600_USED_I2C1_BUS) || (X201641_USED_I2C1_BUS)
-  }
-  
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-double powApprox(double a, double x)
-{
-    union
-    {
-        double d;
-        int A[2];
-    } Z = { a };
-    Z.A[1] = (int)(x * (Z.A[1] - 1072632447) + 1072632447);
-    Z.A[0] = 0;
-    return Z.d;
-}
-/*******************************************************************************
-* Function Name  : ComputeConductance
-* Description    : Compute Conductance
-* Input          : Pressure, Flow
-* Output         : Conductance
-* Return         : None
-*******************************************************************************/
-float prevConductance = 0.0f;
-u8 bufferIndex = 0;
-bool filled = FALSE;
-int16_t littleSum = 0;
-
-void ComputeConductance(void)
-{
-  float pressure = iProximalPressureMes/10.0f;
-  float flow = iBlowerFlowSmoothingMes/100.0f/60.0f;
-  float density = 1.225f;
-  float viscosity = 0.00018f;
-  float calcConductance = 0.0f;
-  
-  if(pressure != 0)
-  {
-          calcConductance  = (100000)*((powApprox((flow*0.001f),1.75)*powApprox(density,0.75)*powApprox(viscosity,0.25)/(pressure / 10.0f)* 98.0638f));
-          calcConductance  = calcConductance * 1000.0f;          
-          if(calcConductance < 60000 && calcConductance > -60000)
-          {
-                  uiConductanceCalc = (int16_t)calcConductance;
-          }         
-  }
-//  int16_t tempValue = idConductancedtSmooth[bufferIndex];
-//  idConductancedtSmooth[bufferIndex]= (int16_t)(calcConductance - prevConductance);//1000;
-//  littleSum += idConductancedtSmooth[bufferIndex];
-//  bufferIndex++;
-//  if(bufferIndex > SMOOTH_BLOWER_FLOW_LARGE_COUNTER)
-//  {
-//    bufferIndex = 0;
-//    if(!filled)
-//    {
-//      filled = TRUE;
-//    }
-//  }
-//  
-//  if(filled)
-//  {
-//    littleSum -= tempValue;    
-//    uidConductanceCalcdt = littleSum/SMOOTH_BLOWER_FLOW_LARGE_COUNTER;
-//  }
-  uidConductanceCalcdt = (int16_t)(calcConductance - prevConductance);
-  prevConductance  = calcConductance;
-}
-/*******************************************************************************
-* Function Name  : ComputeProximalPressureMeasurements
-* Description    : Compute Proximal pressure measurements
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ComputeProximalPressureMeasurements(void)
-{
-  u32 ulValue;
-  u16 uiValue;
-    
-  iProximalPressureMes=((100L*((int16_t)uiProximalPressureADCMes-(int16_t)uiTechnicalDataSet[PPROX_OFFSET_TEC]))/(int16_t)uiTechnicalDataSet[PPROX_GAIN_TEC]);                  
-  if (iProximalPressureMes>0)
-    uiProximalPressureMes=(u16)iProximalPressureMes;
-  else
-    uiProximalPressureMes=0; 
-  uiNegativeProximalPressureMes=iProximalPressureMes;
-  
-  // Smoothing proximal pressure
-  uiProximalPressureTemp[ucIndexPproxPressureSmooth]=uiProximalPressureMes;  
-  ulValue=0;
-  for (uiValue=0; uiValue<SMOOTH_PPROX_PRESSURE_COUNTER; uiValue++)          
-      ulValue+=uiProximalPressureTemp[uiValue];          
-  uiProximalPressureSmoothingMes=ulValue/SMOOTH_PPROX_PRESSURE_COUNTER;
-  
-  ucIndexPproxPressureSmooth++;
-  if (ucIndexPproxPressureSmooth>=SMOOTH_PPROX_PRESSURE_COUNTER)
-    ucIndexPproxPressureSmooth=0;                             
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : ComputeOffsetProximalPressureSensor
-* Description    : Compute offset of the proximal pressure sensor
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ComputeOffsetProximalPressureSensor(void)
-{
-  u32 ulOffsetSum=0;
-  u16 i;
-  
-  for (i=0; i<64; i++)
-  {
-    ulOffsetSum+=uiADC_Value[ADC_PPROX_MES];
-    uiTempoSysTick=5;
-    while (uiTempoSysTick!=0){}
-  }
-  uiTechnicalDataSet[PPROX_OFFSET_TEC]=ulOffsetSum>>6;    
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : VentilationMonitoringAndAlarms
-* Description    : Compute measurements and alarms during ventilation
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void VentilationMonitoringAndAlarms(void)
-{
-  u16 uiTotalTimeMes;
-  
-  if (bMemoStartVentilation==TRUE && uiTechnicalDataSet[DEVICE_MODE_TEC]==VENTILATION_MODE)
-  {    
-    if (ucVentilationCycle==INSPIRATION_CYCLE)
-    {
-      // ***************** INSPIRATION ******************
-      if (ucVentilationCycleCopy==EXPIRATION_CYCLE)
-      {
-        // --- Beginning of inspiration
-        ucVentilationCycleCopy=INSPIRATION_CYCLE;
-        SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_ON);
-        
-        // Update Vte measurement
-        uiVentilationMeasures[VTE_MES]=uiVteTemp;
-        
-        // Update Te measurement
-        uiVentilationMeasures[TE_MES]=uiTeMesTemp;
-       
-        // Update Average ADC Motor Voltage
-        if (ulCounterADC_MotorVoltage!=0)
-          uiAverageADC_MotorVoltage=ulSumADC_MotorVoltage/ulCounterADC_MotorVoltage;
-        
-        // Update Current measurement
-        if (ulCounterADC_FilteredBlowerCurrentMes!=0)
-          uiBreathBlowerCurrentMes=ComputeBlowerCurrentInAmper(ulSumCurrentADCMesFiltered/ulCounterADC_FilteredBlowerCurrentMes);
-        ulSumCurrentADCMesFiltered=0; ulCounterADC_FilteredBlowerCurrentMes=0;
-        
-        // Update average blower speed
-        if (ulCounterAverageMotorSpeed!=0)
-          uiAverageBlowerSpeedMes=SpeedMeasurement(ulSumTachoTicks/ulCounterAverageMotorSpeed);
-        ulSumTachoTicks=0;    
-        ulCounterAverageMotorSpeed=0;
-
-        // Update average motor temperature during inspiration        
-        if (uiTemperatureSamplesCounter!=0)
-        {          
-            uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);          
-            if (uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]>890)
-              uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_TEMPERATURE_ALARM_MASK;
-            else if (uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]<810)
-              uiFlagsAlarm[ALARM_FLAGS2]&=(~MOTOR_TEMPERATURE_ALARM_MASK);
-        }
-        ulADCSumBlowerTemperature=0; uiTemperatureSamplesCounter=0;
-                        
-        // --- Pmax=0
-        uiPproxMax=0;
-                        
-        // --- Vti=0
-        lSumVti=0;
-        uiRecordVtiMes=uiVentilationMeasures[VTI_MES];        
-        
-        // --- Dislay Breath rate
-        uiTotalTimeMes=uiVentilationMeasures[TI_MES]+uiVentilationMeasures[TE_MES];
-        if (uiTotalTimeMes>0)
-          uiVentilationMeasures[BREATH_RATE_MES]=600000/uiTotalTimeMes;
-        
-        // --- Ti=0
-        uiTiMesTemp=0;
-        
-        // --- Max flow
-        iBlowerFlowSmoothingMaxMes=0;
-                        
-        // --- Alarm Vte Min
-        if (uiVentilationMeasures[VTE_MES]<uiVentilationSet[VTE_MIN_ALARM_SET] && enVentilationMode!=CPAP_MODE)
-        {
-          ucCounterAlarmVteMin++;
-          if (ucCounterAlarmVteMin>=5)
-          {
-            ucCounterAlarmVteMin=5;
-            uiFlagsAlarm[ALARM_FLAGS1]|=LOW_VTE_ALARM_MASK;
-          }
-        }
-        else
-        {
-          ucCounterAlarmVteMin=0;
-          uiFlagsAlarm[ALARM_FLAGS1]&=(~LOW_VTE_ALARM_MASK);
-        }
-      }
-      else //if (ucVentilationCycle==EXPIRATION_CYCLE)
-      {
-        // --- During inspiration
-        
-        // --- Motor Speed
-        ulSumTachoTicks+=uiTachoTimeTicks;    
-        ulCounterAverageMotorSpeed++;
-        
-        // --- Blower Current
-        ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
-        ulCounterADC_FilteredBlowerCurrentMes++;
-        
-        // --- Inc Pmax
-        if (uiProximalPressureMes>uiPproxMax)
-          uiPproxMax=uiProximalPressureMes;
-        
-        // --- Inc max flow
-        if (iBlowerFlowSmoothingMes>iBlowerFlowSmoothingMaxMes)
-          iBlowerFlowSmoothingMaxMes=iBlowerFlowSmoothingMes;
-        
-        // --- Inc Vti
-        if (iBlowerFlowMes>30)
-          lSumVti+=iBlowerFlowMes;
-        uiVtiTemp=(u32)lSumVti/6000;       
-        
-        // --- Inc Ti
-        uiTiMesTemp++;
-
-        // --- Motor temperature        
-        ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas; 
-        uiTemperatureSamplesCounter++;
-        
-        // --- Alarm Pmax
-        if (uiProximalPressureMes>uiVentilationSet[HIGH_PRESSURE_ALARM_SET] && enVentilationMode!=CPAP_MODE)
-        {
-          uiFlagsAlarm[ALARM_FLAGS1]|=HIGH_PRESSURE_ALARM_MASK;
-          fAlarmPmax=TRUE;          
-        }
-                                
-        // --- Alarm Vti Max
-        if ((uiVtiTemp>uiVentilationSet[VTI_MAX_ALARM_SET] && enVentilationMode==PS_MODE)   ||
-            (uiVtiTemp>uiVentilationSet[VTI_MAX_ALARM_SET] && enVentilationMode==APCV_MODE))
-        {
-          uiFlagsAlarm[ALARM_FLAGS1]|=HIGH_VTI_ALARM_MASK;
-          fAlarmVtiMax=TRUE;
-        }
-      }
-    }
-    else
-    {
-      // ***************** EXPIRATION ******************
-      if (ucVentilationCycleCopy==INSPIRATION_CYCLE)
-      {
-        // --- Beginning of Expiration
-        ucVentilationCycleCopy=EXPIRATION_CYCLE;
-        SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_OFF);
-        
-        // Update Pprox max measurement
-        uiVentilationMeasures[PPROX_MAX_MES]=uiPproxMax;
-          
-        // Update Vti measurement
-        uiVentilationMeasures[VTI_MES]=uiVtiTemp;
-        
-        // Update Ti measurement
-        uiVentilationMeasures[TI_MES]=uiTiMesTemp;
-        
-        // --- Motor Speed
-        ulSumTachoTicks+=uiTachoTimeTicks;    
-        ulCounterAverageMotorSpeed++;
-        
-        // --- Blower Current
-        ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
-        ulCounterADC_FilteredBlowerCurrentMes++;
-        
-        // --- Vte=0
-        lSumVte=0;
-        
-        // --- Te=0
-        uiTeMesTemp=0;      
-        
-        // --- Alarm Low Pressure
-        if ((uiVentilationMeasures[PPROX_MAX_MES]<(uiVentilationSet[PS_SET]-5) && enVentilationMode==PS_MODE)   ||
-            (uiVentilationMeasures[PPROX_MAX_MES]<(uiVentilationSet[PI_SET]-5) && enVentilationMode==APCV_MODE) ||
-            (uiVentilationMeasures[PPROX_MAX_MES]<uiVentilationSet[LOW_PRESSURE_ALARM_SET] && enVentilationMode==AVC_MODE))
-        { 
-          ucCounterLPAlarm++;
-          if (ucCounterLPAlarm>=4)
-          {
-            ucCounterLPAlarm=4;
-            uiFlagsAlarm[ALARM_FLAGS1]|=LOW_PRESSURE_ALARM_MASK;
-          }
-        }
-        else
-        {
-          ucCounterLPAlarm=0;
-          uiFlagsAlarm[ALARM_FLAGS1]&=(~LOW_PRESSURE_ALARM_MASK);
-        }
-        
-        // --- Clear Alarm High pressure        
-        if (fAlarmPmax==FALSE)
-          uiFlagsAlarm[ALARM_FLAGS1]&=(~HIGH_PRESSURE_ALARM_MASK);
-        fAlarmPmax=FALSE;
-        
-        // --- Clear Alarm Vti Max
-        if (fAlarmVtiMax==FALSE)
-          uiFlagsAlarm[ALARM_FLAGS1]&=(~HIGH_VTI_ALARM_MASK);
-        fAlarmVtiMax=FALSE;
-      }
-      else
-      {
-        // --- During Expiration
-        
-        // --- Motor Speed
-        ulSumTachoTicks+=uiTachoTimeTicks;    
-        ulCounterAverageMotorSpeed++;
-        
-        // --- Blower Current
-        ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
-        ulCounterADC_FilteredBlowerCurrentMes++;
-        
-        // --- Inc Vte
-        if (iBlowerFlowMes<(-30))
-          lSumVte+=iBlowerFlowMes;
-        if (lSumVte<0)
-          uiVteTemp=(u32)(lSumVte/(-6000));
-        else
-          uiVteTemp=0;
-        
-        // --- Inc Te
-        uiTeMesTemp++;
-        if (uiTeMesTemp>60000) uiTeMesTemp=60000;
-        
-        // --- Average motor voltage
-        if (uiTeMesTemp==100)
-        {
-          ulSumADC_MotorVoltage=0;
-          ulCounterADC_MotorVoltage=0;
-        }
-        else if (uiTeMesTemp>100)
-        {
-          ulSumADC_MotorVoltage+=uiDCinADCMeas;
-          ulCounterADC_MotorVoltage++;
-        }
-      }
-    }
-  } 
-  else // if (bMemoStartVentilation==TRUE && uiTechnicalDataSet[DEVICE_MODE_TEC]==VENTILATION_MODE) 
-  {
-    #ifndef TEMPERATURE_TRENDS
-    uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(uiADCBlowerTemperatureMeas);
-    #endif
-  }
-}
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-#ifndef C_M3_DEVICETEST_TARGET
-/*******************************************************************************
-* Function Name  : ClearVentilationAlarm
-* Description    : Clear all ventilation Alarms
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ClearAllVentilationAlarms(void)
-{
-  u8    i;
-  u8    ucAlarmFlag;
-  
-  for (i=0; i<SIZE_BLOWER_ALARM; i++)
-  {    
-    ucAlarmFlag=stBlowerAlarmStatus[i].ucAlarmFlag;
-    if (stBlowerAlarmStatus[i].bVentilationAlarm==TRUE && (ucAlarmFlag==ALARM_FLAGS1 || ucAlarmFlag==ALARM_FLAGS2))
-      uiFlagsAlarm[ucAlarmFlag]&=(~stBlowerAlarmStatus[i].uiAlarmMask);
-  }
-}
-
-                   
-/*******************************************************************************
-* Function Name  : ClearAlarm
-* Description    : Clear a specific alarm
-* Input          : Mask of the alarm
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ClearAlarm(u8 ucAlarmFlag, u16 uiMask)
-{ 
-  uiFlagsAlarm[ucAlarmFlag]&=(~uiMask);
-}
-
-                   
-/*******************************************************************************
-* Function Name  : ClearAllMeasures
-* Description    : Clear all ventilation measures
-* Input          : None
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void ClearAllMeasures(void)
-{
-  u8  i;
-  
-  // Reset measures except alarms
-  for (i=0; i<SIZE_LRM_GROUP; i++)
-  {
-    if (i!=ALARM_ID1_MES && i!=ALARM_ID2_MES)// && i!=ALARM_ID3_MES && i!=ALARM_ID4_MES)      
-      uiVentilationMeasures[i]=0;
-  }  
-  
-  // Reset others measures
-  uiBlowerSpeedMes=0;             uiAverageBlowerSpeedMes=0;      // Speed=0 RPM
-  ulSumTachoTicks=0;              ulCounterAverageMotorSpeed=0;
-  uiBreathBlowerCurrentMes=0;                                   // Blower current=0 A
-  ulSumCurrentADCMesFiltered=0;   ulCounterADC_FilteredBlowerCurrentMes=0;
-  bDisplayInspiratoryTrigger=FALSE;    
-  #ifdef  MOTOR_LIFE_TESTING
-    uiAverateMotorTempMes=0;
-  #endif  // #ifdef  MOTOR_LIFE_TESTING
-    
-  // Init temporary variables
-  ucVentilationCycleCopy=INSPIRATION_CYCLE;
-  uiPproxMax=0;
-  uiVtiTemp=0;
-  uiTiMesTemp=0;
-  ucCounterLPAlarm=0;
-  fAlarmPmax=FALSE;        
-  fAlarmVtiMax=FALSE;
-  ucCounterAlarmVteMin=0;
-}
-
-
-/*******************************************************************************
-* Function Name  : ReadStopVentilationAlarmNumber
-* Description    : Read the alarm number which stops the ventilation
-* Input          : None
-* Output         : None
-* Return         : alarm number
-*******************************************************************************/
-u8  ReadStopVentilationAlarmNumber(void)
-{
-  u16 uiMask;
-  u8  i;
-  u8  ucAlarmNumber=SIZE_BLOWER_ALARM;
-  
-  // Check Alarm which stops ventilation
-  if (uiFlagsAlarm[ALARM_FLAGS1]!=0 ||
-      uiFlagsAlarm[ALARM_FLAGS2]!=0)
-      /*uiFlagsAlarm[ALARM_FLAGS3]!=0 ||
-      uiFlagsAlarm[ALARM_FLAGS4]!=0)*/
-  {
-    for (i=0; i<SIZE_BLOWER_ALARM; i++)
-    {
-      if (stBlowerAlarmStatus[i].bForceVentilToStop==TRUE)
-      {
-        uiMask=stBlowerAlarmStatus[i].uiAlarmMask;
-        if ((uiFlagsAlarm[stBlowerAlarmStatus[i].ucAlarmFlag]&uiMask)==uiMask)
-        {
-          ucAlarmNumber=i;                    
-          break;
-        }
-      }
-    }
-  }    
-  return(ucAlarmNumber);      
-}
-
-
-/*******************************************************************************
-* Function Name  : UpdateAlarmsMeasureID
-* Description    : Update the alarms ventilation measure variables
-* Input          : None
-* Output         : None
-* Return         : alarm number
-*******************************************************************************/
-#ifdef  USE_OPTIMACOMM
-void  UpdateAlarmsMeasureID(void)
-{
-  uiVentilationMeasures[ALARM_ID1_MES]=uiFlagsAlarm[ALARM_FLAGS1];
-  uiVentilationMeasures[ALARM_ID2_MES]=uiFlagsAlarm[ALARM_FLAGS2];  
-}
-#endif  // #ifdef  USE_OPTIMACOMM
-#endif  // #ifndef C_M3_DEVICETEST_TARGET
-
-
-/*******************************************************************************
-* Function Name  : ComputeMotorTemperature
-* Description    : Return temperature (in degres C)
-* Input          : uiADCMotorTemp : ADC value
-* Output         : None
-* Return         : None
-*******************************************************************************/
-u16 ComputeMotorTemperature(u16 uiADCMotorTemp)
-{
-  u16   uiTemp, uiTempDec;
-  u32   ulTemp;
-    
-  for (uiTemp=0; uiTemp<121; uiTemp++)
-  {
-    if (uiADCMotorTemp>=uiADCMotorTempTable[uiTemp])
-      break;    
-  }
-  
-  if (uiADCMotorTemp<uiADCMotorTempTable[120])
-    return(1200);  
-  else if (uiADCMotorTemp>=uiADCMotorTempTable[0])
-    return(0);  
-  else if (uiADCMotorTemp==uiADCMotorTempTable[uiTemp])
-    ulTemp=uiTemp*10;  
-  else   
-  {
-    uiTempDec=((uiADCMotorTempTable[uiTemp-1]-uiADCMotorTemp)*10)/(uiADCMotorTempTable[uiTemp-1]-uiADCMotorTempTable[uiTemp]);  
-    ulTemp=((uiTemp-1)*10)+uiTempDec;
-  }
-  
-  ulTemp*=1000;
-  ulTemp/=uiTechnicalDataSet[GAIN_BLOWER_TEMP_TEC];
-  return((u16)ulTemp);  
-}
-
-
-/*******************************************************************************
-* Function Name  : ComputeFlowInLitersPerMin
-* Description    : Compute the flow in l/min
-* Input          : uFlowRAW : flow digital value, bPositiveFlow= TRUE if positive flow
-* Output         : None
-* Return         : signed Flow in l/min
-*******************************************************************************/
-int16_t ComputeFlowInLitersPerMin(u16 uiFlowRAW, bool bPositiveFlow)
-{
-  u16       uiIndex;
-  int16_t   iFlow;
-  u32       a;
-  int32_t   b;
-  int32_t   y;
-  
-  for (uiIndex=0; uiIndex<stLUTFlowSensor.uiLUT_TableSize; uiIndex++)
-  {
-    if (uiFlowRAW==stLUTFlowSensor.uiFlowSensorTicks[uiIndex])
-    {
-      iFlow=(int16_t)stLUTFlowSensor.uiFlowValue[uiIndex];
-      break;
-    }
-    else if (uiFlowRAW<stLUTFlowSensor.uiFlowSensorTicks[uiIndex])
-    {
-      if (uiIndex==0)
-      {
-        iFlow=(int16_t)(((u32)uiFlowRAW*stLUTFlowSensor.uiFlowValue[uiIndex])/stLUTFlowSensor.uiFlowSensorTicks[uiIndex]);
-      }
-      else
-      {
-        a=(100UL*(stLUTFlowSensor.uiFlowValue[uiIndex]-stLUTFlowSensor.uiFlowValue[uiIndex-1]))/(stLUTFlowSensor.uiFlowSensorTicks[uiIndex]-stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]);
-        b=((int32_t)stLUTFlowSensor.uiFlowValue[uiIndex-1]*100)-((int32_t)stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]*a);
-        y=((int32_t)a*(int32_t)uiFlowRAW)+b;
-        iFlow=(int16_t)(y/100);
-      }
-      break;
-    }
-    else
-    {
-      iFlow=(int16_t)stLUTFlowSensor.uiFlowValue[uiIndex];
-    }
-  }
-      
-  if (bPositiveFlow==FALSE)
-    iFlow*=(-1);
-  
-  return(iFlow);
-}
-
-/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
-
-
-