public void RunAction()
    {
        switch (action)
        {
        case PulseAction.StartHemorrhage:
        {
            SEHemorrhage h = new SEHemorrhage();
            h.SetCompartment(ExternalHemorrhageCmpt.RightLeg);
            h.SetType(SEHemorrhage.eType.External);
            h.GetRate().SetValue(50, VolumePerTimeUnit.mL_Per_min);
            driver.engine.ProcessAction(h);
            break;
        }

        case PulseAction.StopHemorrhage:
        {
            SEHemorrhage h = new SEHemorrhage();
            h.SetCompartment(ExternalHemorrhageCmpt.RightLeg);
            h.SetType(SEHemorrhage.eType.External);
            h.GetRate().SetValue(0, VolumePerTimeUnit.mL_Per_min);
            driver.engine.ProcessAction(h);
            break;
        }

        case PulseAction.StartIVBag:
        {
            SESubstanceCompoundInfusion sci = new SESubstanceCompoundInfusion();
            sci.SetSubstanceCompound(Compound.Saline);
            sci.GetBagVolume().SetValue(500, VolumeUnit.mL);
            sci.GetRate().SetValue(75, VolumePerTimeUnit.mL_Per_s);
            driver.engine.ProcessAction(sci);
            break;
        }

        case PulseAction.StopIVBag:
        {
            SESubstanceCompoundInfusion sci = new SESubstanceCompoundInfusion();
            sci.SetSubstanceCompound(Compound.Saline);
            sci.GetBagVolume().SetValue(0, VolumeUnit.mL);
            sci.GetRate().SetValue(0, VolumePerTimeUnit.mL_Per_s);
            driver.engine.ProcessAction(sci);
            break;
        }

        case PulseAction.StartSuccinylcholineInfusion:
        {
            SESubstanceInfusion si = new SESubstanceInfusion();
            si.SetSubstance(Substance.Succinylcholine);
            si.GetConcentration().SetValue(5000, MassPerVolumeUnit.ug_Per_mL);
            si.GetRate().SetValue(100, VolumePerTimeUnit.mL_Per_min);
            driver.engine.ProcessAction(si);
            break;
        }

        case PulseAction.StopSuccinylcholineInfusion:
        {
            SESubstanceInfusion si = new SESubstanceInfusion();
            si.SetSubstance(Substance.Succinylcholine);
            si.GetRate().SetValue(0, VolumePerTimeUnit.mL_Per_min);
            driver.engine.ProcessAction(si);
            break;
        }

        case PulseAction.InjectMorphine:
        {
            SESubstanceBolus bo = new SESubstanceBolus();
            bo.SetSubstance(Substance.Morphine);
            bo.GetConcentration().SetValue(10, MassPerVolumeUnit.mg_Per_mL);
            bo.GetDose().SetValue(1, VolumeUnit.mL);
            bo.SetAdminRoute(SESubstanceBolus.eAdministration.Intravenous);
            driver.engine.ProcessAction(bo);
            break;
        }

        case PulseAction.TensionPneumothorax:
        {
            SETensionPneumothorax tp = new SETensionPneumothorax();
            tp.SetSide(eSide.Left);
            tp.SetType(eGate.Open);
            tp.GetSeverity().SetValue(0.65);
            driver.engine.ProcessAction(tp);
            break;
        }

        case PulseAction.NeedleDecompressions:
        {
            SENeedleDecompression nd = new SENeedleDecompression();
            nd.SetSide(eSide.Left);
            nd.SetState(eSwitch.On);
            driver.engine.ProcessAction(nd);
            break;
        }

        case PulseAction.StartAirwayObstruction:
        {
            SEAirwayObstruction ao = new SEAirwayObstruction();
            ao.GetSeverity().SetValue(0.7);
            driver.engine.ProcessAction(ao);
            break;
        }

        case PulseAction.StopAirwayObstruction:
        {
            SEAirwayObstruction ao = new SEAirwayObstruction();
            ao.GetSeverity().SetValue(0.0);
            driver.engine.ProcessAction(ao);
            break;
        }

        case PulseAction.StartIntubation:
        {
            SEIntubation tub = new SEIntubation();
            tub.SetType(SEIntubation.eType.Tracheal);
            driver.engine.ProcessAction(tub);
            break;
        }

        case PulseAction.StopIntubation:
        {
            SEIntubation tub = new SEIntubation();
            tub.SetType(SEIntubation.eType.Off);
            driver.engine.ProcessAction(tub);
            break;
        }

        case PulseAction.VentilateIntubation:
        {
            SEAnesthesiaMachineConfiguration am = new SEAnesthesiaMachineConfiguration();
            am.GetConfiguration().SetConnection(SEAnesthesiaMachine.Connection.Tube);
            am.GetConfiguration().GetInletFlow().SetValue(5, VolumePerTimeUnit.L_Per_min);
            am.GetConfiguration().GetInspiratoryExpiratoryRatio().SetValue(0.5);
            am.GetConfiguration().GetOxygenFraction().SetValue(0.23);
            am.GetConfiguration().SetOxygenSource(SEAnesthesiaMachine.OxygenSource.Wall);
            am.GetConfiguration().GetPositiveEndExpiredPressure().SetValue(1, PressureUnit.cmH2O);
            am.GetConfiguration().SetPrimaryGas(SEAnesthesiaMachine.PrimaryGas.Nitrogen);
            am.GetConfiguration().GetRespiratoryRate().SetValue(16, FrequencyUnit.Per_min);
            am.GetConfiguration().GetVentilatorPressure().SetValue(10.5, PressureUnit.cmH2O);
            driver.engine.ProcessAction(am);
            break;
        }

        case PulseAction.VentilateMask:
        {
            SEAnesthesiaMachineConfiguration am = new SEAnesthesiaMachineConfiguration();
            am.GetConfiguration().SetConnection(SEAnesthesiaMachine.Connection.Mask);
            am.GetConfiguration().GetInletFlow().SetValue(5, VolumePerTimeUnit.L_Per_min);
            am.GetConfiguration().GetInspiratoryExpiratoryRatio().SetValue(0.5);
            am.GetConfiguration().GetOxygenFraction().SetValue(0.23);
            am.GetConfiguration().SetOxygenSource(SEAnesthesiaMachine.OxygenSource.Wall);
            am.GetConfiguration().GetPositiveEndExpiredPressure().SetValue(1, PressureUnit.cmH2O);
            am.GetConfiguration().SetPrimaryGas(SEAnesthesiaMachine.PrimaryGas.Nitrogen);
            am.GetConfiguration().GetRespiratoryRate().SetValue(16, FrequencyUnit.Per_min);
            am.GetConfiguration().GetVentilatorPressure().SetValue(10.5, PressureUnit.cmH2O);
            driver.engine.ProcessAction(am);
            break;
        }
        }
    }
        //!
        //! Very Terse testing of the SWIG_Bindings
        //!
        //! We will simply test the ability
        //!   1. Create a logger and log to a file
        //!   2. Initialize a BioGearsEngine
        //!   3. Advance Model Time
        //!   4. Apply Actions to an exsiting BioGearsEngine
        //!   5. Create and Apply all BioGears Actions

        static void Main(string[] args)
        {
            var logger = new Logger("");

            logger.Warning("Perfect Now lets Try to compliate things with two modules!");

            var percent = new SEScalar0To1();

            percent.SetValue(0.1);

            logger.Info(String.Format("{0}", percent.GetValue()));

            var time = new SEScalarTime();

            time.SetValue(4, TimeUnit.s);
            logger.Info(String.Format("{0}", time.GetValue()));


            var engine = new BioGearsEngine(logger);

            engine.InitializeEngine("StandardMale.xml");
            engine.AdvanceModelTime();
            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);

            var eh = new BioGearsEventHandler();

            engine.SetEventHandler(eh);

            var acuteStress = new SEAcuteStress();

            acuteStress.GetSeverity().SetValue(.75);

            logger.Warning(String.Format("AcuteStress @ Severity {0}", acuteStress.GetSeverity().GetValue()));
            engine.ProcessAction(acuteStress);

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);

            var severity = acuteStress.GetSeverity();

            severity.SetValue(0.5);

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);

            SEBurnWound m_burnWound = new SEBurnWound();

            m_burnWound.GetTotalBodySurfaceArea().SetValue(50.0 / 100.0);
            engine.ProcessAction(m_burnWound);
            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);

            var m_substances = engine.GetSubstanceManager();
            var m_albumine   = m_substances.GetSubstance("Albumin");
            var m_saline     = m_substances.GetCompound("Saline");

            try {
                var m_SubstanceBolus     = new SESubstanceBolus(m_albumine);
                var m_SubstanceInfusion  = new SESubstanceInfusion(m_albumine);
                var m_SubstanceNasalDose = new SESubstanceNasalDose(m_albumine);
                var m_SubstanceOralDose  = new SESubstanceOralDose(m_albumine);
            } catch (global::System.Exception /*ex*/) {
                logger.Error("Definition of Albumin is missing.  Unable to test Substance Actions");
            }

            try {
                var m_SubstanceCompoundInfusion = new SESubstanceCompoundInfusion(m_saline);
            } catch (global::System.Exception /*ex*/) {
                logger.Error("Definition of Saline is missing.  Unable to test SubstanceCompound  Actions");
            }

            var m_TensionPneumothorax = new SETensionPneumothorax();
            var m_Tourniquet          = new SETourniquet();
            var m_Urinate             = new SEUrinate();
            var m_UseInhaler          = new SEUseInhaler();

            var  patient        = engine.GetPatient();
            bool isTacycardia   = patient.IsEventActive(CDM.enumPatientEvent.value.Tachycardia);
            bool isAlive        = patient.IsEventActive(CDM.enumPatientEvent.value.IrreversibleState);
            bool isKetoacidosis = patient.IsEventActive(CDM.enumPatientEvent.value.Ketoacidosis);

            logger.Warning(String.Format("AcuteStress @ Severity {0}", acuteStress.GetSeverity().GetValue()));

            //!
            //! Very Quick Example of how to use Data Tracks to Poll data
            //! Performance wise this should really only be used for non PhysiologyDataRequest
            //!
            var HeartRateRequest = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); HeartRateRequest.Set("HeartRate", FrequencyUnit.Per_min);
            var SystolicArterialPressureRequest  = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); SystolicArterialPressureRequest.Set("SystolicArterialPressure", PressureUnit.mmHg);
            var DiastolicArterialPressureRequest = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); DiastolicArterialPressureRequest.Set("DiastolicArterialPressure", PressureUnit.mmHg);
            var RespirationRateRequest           = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); RespirationRateRequest.Set("RespirationRate", FrequencyUnit.Per_min);
            var TidalVolumeRequest      = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); TidalVolumeRequest.Set("TidalVolume", VolumeUnit.mL);
            var TotalLungVolumeRequest  = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); TotalLungVolumeRequest.Set("TotalLungVolume", VolumeUnit.mL);
            var OxygenSaturationRequest = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); OxygenSaturationRequest.Set("OxygenSaturation");

            //TODO: Get Substance and GetSubstanceCompound need better exception handeling
            var oxygen        = engine.GetSubstanceManager().GetSubstance("Oxygen");
            var carbonDioxide = engine.GetSubstanceManager().GetSubstance("CarbonDioxide");

            //Final exonicus data requests
            var ecg = engine.GetEngineTrack().GetDataRequestManager().CreateEquipmentDataRequest(); ecg.SetDataRequestType("ECG"); ecg.Set("Lead3ElectricPotential", ElectricPotentialUnit.mV);
            var MeanUrineRequest        = engine.GetEngineTrack().GetDataRequestManager().CreatePhysiologyDataRequest(); MeanUrineRequest.Set("MeanUrineOutput", VolumePerTimeUnit.mL_Per_hr);
            var BrainVasculatureRequest = engine.GetEngineTrack().GetDataRequestManager().CreateLiquidCompartmentDataRequest(); BrainVasculatureRequest.Set("BrainVasculature", oxygen, "PartialPressure", PressureUnit.mmHg);
            var TracheaPartialPressure  = engine.GetEngineTrack().GetDataRequestManager().CreateGasCompartmentDataRequest(); TracheaPartialPressure.Set("Trachea", carbonDioxide, "PartialPressure", PressureUnit.mmHg);

            engine.GetEngineTrack().SetupRequests();

            var HeartRate = engine.GetEngineTrack().GetScalar(HeartRateRequest);
            var SystolicArterialPressure  = engine.GetEngineTrack().GetScalar(HeartRateRequest);
            var DiastolicArterialPressure = engine.GetEngineTrack().GetScalar(DiastolicArterialPressureRequest);
            var RespirationRate           = engine.GetEngineTrack().GetScalar(RespirationRateRequest);
            var TidalVolume        = engine.GetEngineTrack().GetScalar(TidalVolumeRequest);
            var TotalLungVolume    = engine.GetEngineTrack().GetScalar(TotalLungVolumeRequest);
            var OxygenSaturation   = engine.GetEngineTrack().GetScalar(OxygenSaturationRequest);
            var PartialPressure    = engine.GetEngineTrack().GetScalar(BrainVasculatureRequest);
            var CO2PartialPressure = engine.GetEngineTrack().GetScalar(TracheaPartialPressure);
            var Urine   = engine.GetEngineTrack().GetScalar(MeanUrineRequest);
            var ecgData = engine.GetEngineTrack().GetScalar(ecg);


            apply_acute_respiratory_distress(engine);

            engine.GetEngineTrack().PullData();
            logger.Info(HeartRate.ToString());
            logger.Info(SystolicArterialPressure.ToString());
            logger.Info(DiastolicArterialPressure.ToString());
            logger.Info(RespirationRate.ToString());
            logger.Info(TidalVolume.ToString());
            logger.Info(TotalLungVolume.ToString());
            logger.Info(OxygenSaturation.ToString());
            logger.Info(PartialPressure.ToString());
            logger.Info(CO2PartialPressure.ToString());
            logger.Info(Urine.ToString());
            logger.Info("ecg: \n");
            logger.Info(ecgData.ToString());



            //!
            //!  Just to test most actions we will apply and unapply every action in 2 second sperts
            //!
            apply_acute_stress(engine);
            engine.GetEngineTrack().PullData();
            apply_airway_obstruction(engine);
            engine.GetEngineTrack().PullData();
            apply_apnea(engine);
            engine.GetEngineTrack().PullData();
            apply_asthma_attack(engine);
            engine.GetEngineTrack().PullData();
            apply_brain_injury(engine);
            engine.GetEngineTrack().PullData();
            apply_breath_hold(engine);
            engine.GetEngineTrack().PullData();
            apply_bronchoconstriction(engine);
            engine.GetEngineTrack().PullData();
            apply_burn_wound(engine);
            engine.GetEngineTrack().PullData();
            apply_cardiac_arrest(engine);
            engine.GetEngineTrack().PullData();

            logger.Info(HeartRate.ToString());
            logger.Info(SystolicArterialPressure.ToString());
            logger.Info(DiastolicArterialPressure.ToString());
            logger.Info(RespirationRate.ToString());
            logger.Info(TidalVolume.ToString());
            logger.Info(TotalLungVolume.ToString());
            logger.Info(OxygenSaturation.ToString());

            apply_chest_compression(engine);
            engine.GetEngineTrack().PullData();
            apply_chest_compression_force(engine);
            engine.GetEngineTrack().PullData();
            apply_chest_compression_force_scale(engine);
            engine.GetEngineTrack().PullData();
            apply_chest_occlusive_dressing(engine);
            engine.GetEngineTrack().PullData();
            apply_conscious_respiration(engine);
            engine.GetEngineTrack().PullData();
            apply_consume_nutrients(engine);
            engine.GetEngineTrack().PullData();
            apply_exercise(engine);
            engine.GetEngineTrack().PullData();
            apply_cycling_exercise(engine);
            engine.GetEngineTrack().PullData();
            apply_generic_exercise(engine);
            engine.GetEngineTrack().PullData();
            apply_running_exercise(engine);
            engine.GetEngineTrack().PullData();
            apply_strength_exercise(engine);
            engine.GetEngineTrack().PullData();
            apply_hemorrhage(engine);
            engine.GetEngineTrack().PullData();
            apply_infection(engine);
            engine.GetEngineTrack().PullData();
            apply_intubation(engine);
            engine.GetEngineTrack().PullData();
            apply_mechanical_ventilation(engine);
            engine.GetEngineTrack().PullData();
            apply_needle_decompression(engine);
            engine.GetEngineTrack().PullData();
            apply_override(engine);
            engine.GetEngineTrack().PullData();
            apply_pain_stimulus(engine);
            engine.GetEngineTrack().PullData();
            apply_patient_assessment_request(engine);
            engine.GetEngineTrack().PullData();
            apply_pericadial_effusion(engine);
            engine.GetEngineTrack().PullData();

            logger.Info(HeartRate.ToString());
            logger.Info(SystolicArterialPressure.ToString());
            logger.Info(DiastolicArterialPressure.ToString());
            logger.Info(RespirationRate.ToString());
            logger.Info(TidalVolume.ToString());
            logger.Info(TotalLungVolume.ToString());
            logger.Info(OxygenSaturation.ToString());

            apply_pulmonary_shunt(engine);
            engine.GetEngineTrack().PullData();
            apply_sleep(engine);

            engine.GetEngineTrack().PullData();
            logger.Info(HeartRate.ToString());
            logger.Info(SystolicArterialPressure.ToString());
            logger.Info(DiastolicArterialPressure.ToString());
            logger.Info(RespirationRate.ToString());
            logger.Info(TidalVolume.ToString());
            logger.Info(TotalLungVolume.ToString());
            logger.Info(OxygenSaturation.ToString());

            var AMConfig = new SEAnesthesiaMachineConfiguration(engine.GetSubstanceManager());
            var config   = AMConfig.GetConfiguration();

            config.SetConnection(CDM.enumAnesthesiaMachineConnection.value.Mask);
            config.GetInletFlow().SetValue(2.0, VolumePerTimeUnit.L_Per_min);
            config.GetInspiratoryExpiratoryRatio().SetValue(.5);
            config.GetOxygenFraction().SetValue(.5);
            config.SetOxygenSource(CDM.enumAnesthesiaMachineOxygenSource.value.Wall);
            config.GetPositiveEndExpiredPressure().SetValue(0.0, PressureUnit.cmH2O);
            config.SetPrimaryGas(CDM.enumAnesthesiaMachinePrimaryGas.value.Nitrogen);
            config.GetReliefValvePressure().SetValue(20.0, PressureUnit.cmH2O);
            config.GetRespiratoryRate().SetValue(12, FrequencyUnit.Per_min);
            config.GetVentilatorPressure().SetValue(0.0, PressureUnit.cmH2O);
            config.GetOxygenBottleOne().GetVolume().SetValue(660.0, VolumeUnit.L);
            config.GetOxygenBottleTwo().GetVolume().SetValue(660.0, VolumeUnit.L);
            engine.ProcessAction(AMConfig);

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);
            config.GetInletFlow().SetValue(5.0, VolumePerTimeUnit.L_Per_min);
            config.GetPositiveEndExpiredPressure().SetValue(3.0, PressureUnit.cmH2O);
            config.GetVentilatorPressure().SetValue(22.0, PressureUnit.cmH2O);
            engine.ProcessAction(AMConfig);

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);
            config.GetInspiratoryExpiratoryRatio().SetValue(1.0);
            config.GetPositiveEndExpiredPressure().SetValue(1.0, PressureUnit.cmH2O);
            config.GetRespiratoryRate().SetValue(18.0, FrequencyUnit.Per_min);
            config.GetVentilatorPressure().SetValue(10.0, PressureUnit.cmH2O);
            engine.ProcessAction(AMConfig);

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);
            var AMleak = new SEMaskLeak();

            AMleak.GetSeverity().SetValue(0.5);
            engine.ProcessAction(AMleak);
            engine.GetLogger().Info("Removing the mask leak.");

            engine.AdvanceModelTimeBy(2.0, TimeUnit.s);
            var AMpressureloss = new SEOxygenWallPortPressureLoss();

            AMpressureloss.SetActive(true);
            engine.ProcessAction(AMpressureloss);
            engine.GetLogger().Info("Testing the oxygen pressure loss failure mode. The oxygen pressure from the wall source is dropping.");

            AMpressureloss.SetActive(false);
            engine.ProcessAction(AMpressureloss);
            engine.GetLogger().Info("Removing the wall oxygen pressure loss action.");
            engine.AdvanceModelTimeBy(2, TimeUnit.s);

            engine.SaveStateToFile("*****@*****.**");

            Console.Write("Simulation Finished Press any key to continue");
            var testString = Console.ReadLine();
        }