Kabuki Starship / Mbed 2 deprecated GHVentilator

Dependencies:   mbed SickBayTek

Committer:
kabukistarship
Date:
Fri Apr 10 11:56:58 2020 +0000
Revision:
9:256989faeb3b
Child:
10:09fe2b1474bf
Change.GHVentilator.Firmware.Switch to Arduino and mbed compatible format. #74

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kabukistarship 9:256989faeb3b 1 /** Gravity Hookah Ventilator @version 0.x
kabukistarship 9:256989faeb3b 2 @link https://github.com/KabukiStarship/SickBay.git
kabukistarship 9:256989faeb3b 3 @file /GHVentilaorChannel.cpp
kabukistarship 9:256989faeb3b 4 @author Cale McCollough <https://cale-mccollough.github.io>
kabukistarship 9:256989faeb3b 5 @license Copyright 2020 (C) Kabuki Starship <kabukistarship.com>.
kabukistarship 9:256989faeb3b 6 This Source Code Form is subject to the terms of the Mozilla Public License,
kabukistarship 9:256989faeb3b 7 v. 2.0. If a copy of the MPL was not distributed with this file, you can obtain
kabukistarship 9:256989faeb3b 8 one at <https://mozilla.org/MPL/2.0/>. */
kabukistarship 9:256989faeb3b 9
kabukistarship 9:256989faeb3b 10 #include "GHVentilator.h"
kabukistarship 9:256989faeb3b 11 #include <mbedBug.h>
kabukistarship 9:256989faeb3b 12
kabukistarship 9:256989faeb3b 13 namespace SickBay {
kabukistarship 9:256989faeb3b 14
kabukistarship 9:256989faeb3b 15 GHVentilator::GHVentilator ():
kabukistarship 9:256989faeb3b 16 Status (1),
kabukistarship 9:256989faeb3b 17 Ticks (0),
kabukistarship 9:256989faeb3b 18 PressureMin (0),
kabukistarship 9:256989faeb3b 19 PressureMax (1) {}
kabukistarship 9:256989faeb3b 20
kabukistarship 9:256989faeb3b 21 void GHVentilator::Init (int TicksSecond,
kabukistarship 9:256989faeb3b 22 int TicksCalibration,
kabukistarship 9:256989faeb3b 23 float HysteresisChamber,
kabukistarship 9:256989faeb3b 24 float HysteresisPatient) {
kabukistarship 9:256989faeb3b 25 int InhaleTicksMax = TicksSecond * 6; //<
kabukistarship 9:256989faeb3b 26 this->Status = -1;
kabukistarship 9:256989faeb3b 27 this->Ticks = StateRising;
kabukistarship 9:256989faeb3b 28 this->TicksMonitor = TicksSecond;
kabukistarship 9:256989faeb3b 29 this->TicksSecond = TicksSecond;
kabukistarship 9:256989faeb3b 30 this->TicksInhaleMin = TicksSecond;
kabukistarship 9:256989faeb3b 31 this->TicksInhaleMax = InhaleTicksMax;
kabukistarship 9:256989faeb3b 32 this->TicksExhaleMin = TicksSecond;
kabukistarship 9:256989faeb3b 33 this->TicksExhaleMax = InhaleTicksMax * 3;
kabukistarship 9:256989faeb3b 34 this->TicksPEEP = TicksSecond * 5;
kabukistarship 9:256989faeb3b 35 this->TicksCalibration = TicksCalibration;
kabukistarship 9:256989faeb3b 36 this->PressureMin = Pressure;
kabukistarship 9:256989faeb3b 37 this->PressureMax = Pressure;
kabukistarship 9:256989faeb3b 38 this->HysteresisChamber = HysteresisChamber;
kabukistarship 9:256989faeb3b 39 this->HysteresisPatient = HysteresisPatient;
kabukistarship 9:256989faeb3b 40 int TicksInhale = 5 * TicksSecond,
kabukistarship 9:256989faeb3b 41 TicksExhale = 3 * TicksInhale;
kabukistarship 9:256989faeb3b 42
kabukistarship 9:256989faeb3b 43 for (int Index = ChannelCount - 1; Index > 0; --Index) {
kabukistarship 9:256989faeb3b 44 float Delta = float (Channels[Index].Pressure) * HysteresisPatient;
kabukistarship 9:256989faeb3b 45 Channels[Index].Init (this, TicksInhale, TicksExhale,
kabukistarship 9:256989faeb3b 46 static_cast<uint32_t>(Delta));
kabukistarship 9:256989faeb3b 47 }
kabukistarship 9:256989faeb3b 48 DPrintf("\nInitalized system with %d Ticks per Second.", TicksSecond);
kabukistarship 9:256989faeb3b 49 }
kabukistarship 9:256989faeb3b 50
kabukistarship 9:256989faeb3b 51 void GHVentilator::TicksPEEPSet (int NewTicksPEEP) {
kabukistarship 9:256989faeb3b 52 int TicksPEEPMin = TicksSecond >> 5; //< This divides by 2^5.
kabukistarship 9:256989faeb3b 53 if (NewTicksPEEP < TicksPEEPMin || NewTicksPEEP > TicksSecond) {
kabukistarship 9:256989faeb3b 54 DPrintf("\n > Error PEEP must be betwen 1/32 of a second to 1 second. <");
kabukistarship 9:256989faeb3b 55 return;
kabukistarship 9:256989faeb3b 56 }
kabukistarship 9:256989faeb3b 57 TicksPEEP = NewTicksPEEP;
kabukistarship 9:256989faeb3b 58 }
kabukistarship 9:256989faeb3b 59
kabukistarship 9:256989faeb3b 60 void GHVentilator::StateCalibrateEnter () {
kabukistarship 9:256989faeb3b 61 TurnOff ();
kabukistarship 9:256989faeb3b 62 BlowerTurnOn ();
kabukistarship 9:256989faeb3b 63 Status = StateCalibrate; //< Make sure to set this last.
kabukistarship 9:256989faeb3b 64 }
kabukistarship 9:256989faeb3b 65
kabukistarship 9:256989faeb3b 66 void GHVentilator::StateCalibrateExit () {
kabukistarship 9:256989faeb3b 67 PressureMax = Pressure;
kabukistarship 9:256989faeb3b 68 uint32_t HysteresisChamber = this->HysteresisChamber,
kabukistarship 9:256989faeb3b 69 PressureMid = (PressureMax - PressureMin) / 2;
kabukistarship 9:256989faeb3b 70 PressureMin = PressureMid - HysteresisChamber;
kabukistarship 9:256989faeb3b 71 PressureMax = PressureMid + HysteresisChamber;
kabukistarship 9:256989faeb3b 72 DPrintf ("\n? Done calibrating with PressureMin:%u and PressureMax%u. <",
kabukistarship 9:256989faeb3b 73 PressureMin, PressureMax);
kabukistarship 9:256989faeb3b 74 }
kabukistarship 9:256989faeb3b 75
kabukistarship 9:256989faeb3b 76 void GHVentilator::StateSinkingEnter () {
kabukistarship 9:256989faeb3b 77 Ticks = StateSinking;
kabukistarship 9:256989faeb3b 78 BlowerTurnOff ();
kabukistarship 9:256989faeb3b 79 }
kabukistarship 9:256989faeb3b 80
kabukistarship 9:256989faeb3b 81 void GHVentilator::StateRisingEnter () {
kabukistarship 9:256989faeb3b 82 Ticks = StateRising;
kabukistarship 9:256989faeb3b 83 BlowerTurnOn ();
kabukistarship 9:256989faeb3b 84 }
kabukistarship 9:256989faeb3b 85
kabukistarship 9:256989faeb3b 86 void GHVentilator::TurnOff () {
kabukistarship 9:256989faeb3b 87 BlowerTurnOff();
kabukistarship 9:256989faeb3b 88 Ticks = 0;
kabukistarship 9:256989faeb3b 89 Status = 0;
kabukistarship 9:256989faeb3b 90 Channel1ValveSet (LLLow);
kabukistarship 9:256989faeb3b 91 #if GHVentilatorChannelCount >= 2
kabukistarship 9:256989faeb3b 92 Channel2ValveSet (LLLow);
kabukistarship 9:256989faeb3b 93 #endif
kabukistarship 9:256989faeb3b 94 #if GHVentilatorChannelCount >= 3
kabukistarship 9:256989faeb3b 95 Channel3ValveSet (LLLow);
kabukistarship 9:256989faeb3b 96 #endif
kabukistarship 9:256989faeb3b 97 #if GHVentilatorChannelCount >= 4
kabukistarship 9:256989faeb3b 98 Channel4ValveSet (LLLow);
kabukistarship 9:256989faeb3b 99 #endif
kabukistarship 9:256989faeb3b 100 }
kabukistarship 9:256989faeb3b 101
kabukistarship 9:256989faeb3b 102 void GHVentilator::ChannelValveSet (GHVentilatorChannel* Channel, int Value) {
kabukistarship 9:256989faeb3b 103 if (Channel == &Channels[0]) Channel1ValveSet(Value);
kabukistarship 9:256989faeb3b 104 else if (Channel == &Channels[1]) Channel2ValveSet(Value);
kabukistarship 9:256989faeb3b 105 else if (Channel == &Channels[2]) Channel3ValveSet(Value);
kabukistarship 9:256989faeb3b 106 else if (Channel == &Channels[3]) Channel4ValveSet(Value);
kabukistarship 9:256989faeb3b 107 }
kabukistarship 9:256989faeb3b 108
kabukistarship 9:256989faeb3b 109 int GHVentilator::TicksInhaleExhaleSet (int Index,
kabukistarship 9:256989faeb3b 110 int TicksInhale,
kabukistarship 9:256989faeb3b 111 int TicksExhale) {
kabukistarship 9:256989faeb3b 112 if (Index < 0 || Index >= ChannelCount) return -1;
kabukistarship 9:256989faeb3b 113 if (TicksInhale <= TicksInhaleMax) return -2;
kabukistarship 9:256989faeb3b 114 if (TicksInhale >= TicksInhaleMin) return -3;
kabukistarship 9:256989faeb3b 115 if (Index >= ChannelCount) return 1;
kabukistarship 9:256989faeb3b 116 if (TicksExhale <= TicksExhaleMax) return 2;
kabukistarship 9:256989faeb3b 117 if (TicksExhale >= TicksExhaleMin) return 3;
kabukistarship 9:256989faeb3b 118 Channels[Index].TicksInhaleExhaleSet(TicksInhale, TicksExhale);
kabukistarship 9:256989faeb3b 119 return 0;
kabukistarship 9:256989faeb3b 120 }
kabukistarship 9:256989faeb3b 121
kabukistarship 9:256989faeb3b 122 void GHVentilator::Update() {
kabukistarship 9:256989faeb3b 123 int Tick = Ticks;
kabukistarship 9:256989faeb3b 124 if (Tick == 0) {
kabukistarship 9:256989faeb3b 125 int Status = this->Status;
kabukistarship 9:256989faeb3b 126 if (Status == 0) return; // We're in the Off State so do nothing.
kabukistarship 9:256989faeb3b 127 // We're in the Calibrating State
kabukistarship 9:256989faeb3b 128 if (++Status > TicksCalibration) {
kabukistarship 9:256989faeb3b 129 StateCalibrateExit ();
kabukistarship 9:256989faeb3b 130 return;
kabukistarship 9:256989faeb3b 131 }
kabukistarship 9:256989faeb3b 132 Status = Status;
kabukistarship 9:256989faeb3b 133 int Pressure = this->Pressure;
kabukistarship 9:256989faeb3b 134 if (Pressure >= PressureMax) {
kabukistarship 9:256989faeb3b 135 this->PressureMax = Pressure;
kabukistarship 9:256989faeb3b 136 }
kabukistarship 9:256989faeb3b 137 }
kabukistarship 9:256989faeb3b 138 else if (Tick <= StateSinking) {
kabukistarship 9:256989faeb3b 139 if (IsUnderPressure ()) StateSinkingEnter ();
kabukistarship 9:256989faeb3b 140 else Ticks = Ticks - 1;
kabukistarship 9:256989faeb3b 141 }
kabukistarship 9:256989faeb3b 142 else if (Tick >= StateRising) {
kabukistarship 9:256989faeb3b 143 if (IsOverPressure ()) StateSinkingEnter ();
kabukistarship 9:256989faeb3b 144 else Ticks = Ticks + 1;
kabukistarship 9:256989faeb3b 145 }
kabukistarship 9:256989faeb3b 146 // Check the Channels for state changes.
kabukistarship 9:256989faeb3b 147 for (int Index = ChannelCount - 1; Index >= 0; --Index) {
kabukistarship 9:256989faeb3b 148 GHVentilatorChannel* Channel = &Channels[Index];
kabukistarship 9:256989faeb3b 149 int Tick = Channel->Ticks;
kabukistarship 9:256989faeb3b 150 if (Tick <= GHVentilatorChannel::StateExhaling) {
kabukistarship 9:256989faeb3b 151 if (Tick < Channel->TicksExhale) Channel->Inhale ();
kabukistarship 9:256989faeb3b 152 else Channel->Ticks = Ticks - 1;
kabukistarship 9:256989faeb3b 153 }
kabukistarship 9:256989faeb3b 154 else if (Tick >= GHVentilatorChannel::StateInhaling) {
kabukistarship 9:256989faeb3b 155 int TicksExhale = Channel->TicksExhale;
kabukistarship 9:256989faeb3b 156 if (Tick > TicksExhale) {
kabukistarship 9:256989faeb3b 157 if (Tick > TicksExhale - TicksPEEP) {
kabukistarship 9:256989faeb3b 158 if (Channel->Pressure >= Channel->PressureReference)
kabukistarship 9:256989faeb3b 159 Channel->Inhale ();
kabukistarship 9:256989faeb3b 160 }
kabukistarship 9:256989faeb3b 161 }
kabukistarship 9:256989faeb3b 162 else Channels->Ticks = Ticks + 1;
kabukistarship 9:256989faeb3b 163 }
kabukistarship 9:256989faeb3b 164 else {
kabukistarship 9:256989faeb3b 165 return;
kabukistarship 9:256989faeb3b 166 }
kabukistarship 9:256989faeb3b 167 Ticks = Tick;
kabukistarship 9:256989faeb3b 168 }
kabukistarship 9:256989faeb3b 169 }
kabukistarship 9:256989faeb3b 170 } //< namespace SickBay
kabukistarship 9:256989faeb3b 171 #include "GHVentilatorChannel.hpp"