static void StateMeasuring(void) { UINT16 poxOutputSignalRaw, SpO2BaselineSignalRaw; /* read SPO2 signals: these are the steps: 1. turn on IR LED 2. wait 3. read baseline and read IR signal 4. turn off IR LED (both LEDs off) 5. wait 6. turn on Red LED 7. wait 8. read Red signal 9. turn off Red LED (both LEDs off) 10. wait */ UINT16 elapsedTimeCopy = ElapsedTimeIn_us; switch (SpO2ActualSubStateSubState) { case 0: SPO2_SET_SWITCH_CONTROL(SPO2_CONTROL_IR); //set switch to select IR signals Pwm_Start(PwmIRValue); //start pwm with IR value START_TIMER_us(); //start timer to wait 250us SpO2ActualSubStateSubState++; break; case 1: if (elapsedTimeCopy >= IR_ON_TIME_us) { ElapsedTimeIn_us = 0; { poxOutputSignalRaw = ADC1_Read12b(SPO2_ADC_CHANNEL_OUTPUT_SIGNAL); //read IR baseline and IR signal SpO2BaselineSignalRaw = ADC0_Read12b(SPO2_ADC_CHANNEL_BASELINE_SIGNAL); #if (defined SPO2_FIR) poxOutputSignalRaw = u32SPO2_Filter(poxOutputSignalRaw,&gu16IR_Samples[0]); //SpO2BaselineSignalRaw = ADC0_Read12b(SPO2_ADC_CHANNEL_OUTPUT_SIGNAL); //Read IR Baseline SpO2BaselineSignalRaw = u32SPO2_BaselineFilter(SpO2BaselineSignalRaw, &gu16IR_Base[0]);//Remove AC #endif MovingAverage_PushNewValue16b(&SpO2IRBaselineSignal, SpO2BaselineSignalRaw); //store IR baseline and IR signal MovingAverage_PushNewValue16b(&SpO2IRLedSignal, poxOutputSignalRaw); } Pwm_Stop(0); //turn off LEDs SpO2ActualSubStateSubState++; } break; case 2: if (elapsedTimeCopy >= IR_OFF_TIME_us) { ElapsedTimeIn_us = 0; //PTFD_PTFD2 = 1; SPO2_SET_SWITCH_CONTROL(SPO2_CONTROL_RED); //set switch to select Red signal Pwm_Start(PwmRedValue); //start pwm for Red LED SpO2ActualSubStateSubState++; } break; case 3: if (elapsedTimeCopy >= RED_ON_TIME_us) { ElapsedTimeIn_us = 0; //PTFD_PTFD2 = 0; //if (IsTimeToUpdateGraphData) { poxOutputSignalRaw = ADC1_Read12b(SPO2_ADC_CHANNEL_OUTPUT_SIGNAL); //Read RED signal SpO2BaselineSignalRaw = ADC0_Read12b(SPO2_ADC_CHANNEL_BASELINE_SIGNAL); //Read RED baseline #if (defined SPO2_FIR) poxOutputSignalRaw = u32SPO2_Filter(poxOutputSignalRaw,&gu16R_Samples[0]); //SpO2BaselineSignalRaw = ADC0_Read12b(SPO2_ADC_CHANNEL_OUTPUT_SIGNAL); //Read RED baseline SpO2BaselineSignalRaw = u32SPO2_BaselineFilter(SpO2BaselineSignalRaw, &gu16R_Base[0]);//Remove AC #endif MovingAverage_PushNewValue16b(&SpO2RedBaselineSignal, SpO2BaselineSignalRaw); //store Red baseline and red signal MovingAverage_PushNewValue16b(&SpO2RedLedSignal, poxOutputSignalRaw); } Pwm_Stop(0); //turn off LEDs SpO2ActualSubStateSubState++; } break; case 4: if (elapsedTimeCopy >= RED_OFF_TIME_us) { ElapsedTimeIn_us = 0; SpO2ActualSubStateSubState = 0; SpO2SamplesBetweenPulses++; if (IsTimeToUpdateGraphData && SpO2IsDiagnosticMode) { IsTimeToUpdateGraphData = FALSE; SaveGraphData(); SwTimer_StartTimer(TimerSendGraphData, SPO2_UPDATE_GRAPH_PERIOD); } #define RECALIBRATE_TIME 512 if (TimerToRecalibrate == 0) { static unsigned char toogle = 0; #define MAX_CALIBRATION_ATTEMPTS 128 static UINT16 calibrationAttempts = 0; //check if both baselines are within the limits if ((SpO2IRBaselineSignal.Result > BASELINE_SETPOINT_UPPER_LIMIT_MIN) || (SpO2IRBaselineSignal.Result < BASELINE_SETPOINT_LOWER_LIMIT_MIN) || ((SpO2RedBaselineSignal.Result > BASELINE_SETPOINT_UPPER_LIMIT_MIN) || (SpO2RedBaselineSignal.Result < BASELINE_SETPOINT_LOWER_LIMIT_MIN))) { if (toogle == SPO2_CONTROL_RED) { if ((SpO2RedBaselineSignal.Result > BASELINE_SETPOINT_UPPER_LIMIT_MID) || (SpO2RedBaselineSignal.Result < BASELINE_SETPOINT_LOWER_LIMIT_MID)) { CalibrateRedLedIntensity(); TimerToRecalibrate = 16; //if (calibrationAttempts < 0xFF) { calibrationAttempts++; } } toogle = SPO2_CONTROL_IR; } else if (toogle == SPO2_CONTROL_IR) { if ((SpO2IRBaselineSignal.Result > BASELINE_SETPOINT_UPPER_LIMIT_MID) || (SpO2IRBaselineSignal.Result < BASELINE_SETPOINT_LOWER_LIMIT_MID)) { CalibrateIRLedIntensity(); TimerToRecalibrate = 16; //if (calibrationAttempts < 0xFF) { calibrationAttempts++; } } toogle = SPO2_CONTROL_RED; } } else { TimerToRecalibrate = RECALIBRATE_TIME; calibrationAttempts = 0; } } else { TimerToRecalibrate--; } //if (IsSignalStable) { FindMaxAndMin(); } if ((SpO2ValidValue >= 10) && (!SpO2IsDiagnosticMode)) { //generate pox ok event SpO2ActualEvent = SPO2_EVENT_MEASUREMENT_COMPLETE_OK; SpO2_AbortMeasurement(); } } break; } }
int PwmOut_Start( int index ) { int status; if ( index < 0 || index > 3 ) return CONTROLLER_ERROR_ILLEGAL_INDEX; if ( PwmOut_users[ index ]++ == 0 ) { // Look up the IO's that will be used int ioA; int ioB; PwmOut_GetIos( index, &ioA, &ioB ); // Try to get the IO's status = Io_Start( ioA, true ); if ( status != CONTROLLER_OK ) { PwmOut_users[ index ]--; return status; } status = Io_Start( ioB, true ); if ( status != CONTROLLER_OK ) { PwmOut_users[ index ]--; // better give back ioA since we did get that Io_Stop( ioA ); return status; } // Make sure we can get the PWM channel status = Pwm_Start( index ); if ( status != CONTROLLER_OK ) { PwmOut_users[ index ]--; // better give back the io's since we did get them Io_Stop( ioA ); Io_Stop( ioB ); return status; } // Set all the io's right // Enable as PIOs Io_PioEnable( ioA ); Io_PioEnable( ioB ); // Switch them off Io_SetFalse( ioA ); Io_SetFalse( ioB ); // Turn them into outputs Io_SetOutput( ioA ); Io_SetOutput( ioB ); PwmOut_SetDuty( index, 0 ); Io_SetTrue( ioA ); } return CONTROLLER_OK; }