Kabuki Starship / Mbed 2 deprecated GHVentilator

Dependencies:   mbed SickBayTek

Committer:
kabukistarship
Date:
Sat Apr 11 08:48:28 2020 +0000
Revision:
10:09fe2b1474bf
Parent:
9:256989faeb3b
Detail.Tek.Describe The SickBay Device firmware toolkit built with Kabuki Tek. #76

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kabukistarship 10:09fe2b1474bf 1 /** SickBay Tek @version 0.x
kabukistarship 9:256989faeb3b 2 @link https://github.com/KabukiStarship/SickBay.git
kabukistarship 10:09fe2b1474bf 3 @file /Firmware/Tek/SBVentilaorChannel.hpp
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 10:09fe2b1474bf 10 #include "SBVentilator.h"
kabukistarship 10:09fe2b1474bf 11 #include <_KabukiTek.hpp>
kabukistarship 9:256989faeb3b 12
kabukistarship 9:256989faeb3b 13 namespace SickBay {
kabukistarship 9:256989faeb3b 14
kabukistarship 10:09fe2b1474bf 15 SBVentilator::SBVentilator ():
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 10:09fe2b1474bf 21 void SBVentilator::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 }
kabukistarship 9:256989faeb3b 49
kabukistarship 10:09fe2b1474bf 50 void SBVentilator::TicksPEEPSet (int NewTicksPEEP) {
kabukistarship 9:256989faeb3b 51 int TicksPEEPMin = TicksSecond >> 5; //< This divides by 2^5.
kabukistarship 9:256989faeb3b 52 if (NewTicksPEEP < TicksPEEPMin || NewTicksPEEP > TicksSecond) {
kabukistarship 9:256989faeb3b 53 DPrintf("\n > Error PEEP must be betwen 1/32 of a second to 1 second. <");
kabukistarship 9:256989faeb3b 54 return;
kabukistarship 9:256989faeb3b 55 }
kabukistarship 9:256989faeb3b 56 TicksPEEP = NewTicksPEEP;
kabukistarship 9:256989faeb3b 57 }
kabukistarship 9:256989faeb3b 58
kabukistarship 10:09fe2b1474bf 59 void SBVentilator::StateCalibrateEnter () {
kabukistarship 9:256989faeb3b 60 TurnOff ();
kabukistarship 9:256989faeb3b 61 BlowerTurnOn ();
kabukistarship 9:256989faeb3b 62 Status = StateCalibrate; //< Make sure to set this last.
kabukistarship 9:256989faeb3b 63 }
kabukistarship 9:256989faeb3b 64
kabukistarship 10:09fe2b1474bf 65 void SBVentilator::StateCalibrateExit () {
kabukistarship 9:256989faeb3b 66 PressureMax = Pressure;
kabukistarship 9:256989faeb3b 67 uint32_t HysteresisChamber = this->HysteresisChamber,
kabukistarship 9:256989faeb3b 68 PressureMid = (PressureMax - PressureMin) / 2;
kabukistarship 9:256989faeb3b 69 PressureMin = PressureMid - HysteresisChamber;
kabukistarship 9:256989faeb3b 70 PressureMax = PressureMid + HysteresisChamber;
kabukistarship 9:256989faeb3b 71 DPrintf ("\n? Done calibrating with PressureMin:%u and PressureMax%u. <",
kabukistarship 9:256989faeb3b 72 PressureMin, PressureMax);
kabukistarship 9:256989faeb3b 73 }
kabukistarship 9:256989faeb3b 74
kabukistarship 10:09fe2b1474bf 75 void SBVentilator::StateSinkingEnter () {
kabukistarship 9:256989faeb3b 76 Ticks = StateSinking;
kabukistarship 9:256989faeb3b 77 BlowerTurnOff ();
kabukistarship 9:256989faeb3b 78 }
kabukistarship 9:256989faeb3b 79
kabukistarship 10:09fe2b1474bf 80 void SBVentilator::StateRisingEnter () {
kabukistarship 9:256989faeb3b 81 Ticks = StateRising;
kabukistarship 9:256989faeb3b 82 BlowerTurnOn ();
kabukistarship 9:256989faeb3b 83 }
kabukistarship 9:256989faeb3b 84
kabukistarship 10:09fe2b1474bf 85 void SBVentilator::TurnOff () {
kabukistarship 9:256989faeb3b 86 BlowerTurnOff();
kabukistarship 9:256989faeb3b 87 Ticks = 0;
kabukistarship 9:256989faeb3b 88 Status = 0;
kabukistarship 9:256989faeb3b 89 Channel1ValveSet (LLLow);
kabukistarship 10:09fe2b1474bf 90 #if SBVentilatorChannelCount >= 2
kabukistarship 9:256989faeb3b 91 Channel2ValveSet (LLLow);
kabukistarship 9:256989faeb3b 92 #endif
kabukistarship 10:09fe2b1474bf 93 #if SBVentilatorChannelCount >= 3
kabukistarship 9:256989faeb3b 94 Channel3ValveSet (LLLow);
kabukistarship 9:256989faeb3b 95 #endif
kabukistarship 10:09fe2b1474bf 96 #if SBVentilatorChannelCount >= 4
kabukistarship 9:256989faeb3b 97 Channel4ValveSet (LLLow);
kabukistarship 9:256989faeb3b 98 #endif
kabukistarship 9:256989faeb3b 99 }
kabukistarship 9:256989faeb3b 100
kabukistarship 10:09fe2b1474bf 101 void SBVentilator::ChannelValveSet (SBVentilatorChannel* Channel, int Value) {
kabukistarship 9:256989faeb3b 102 if (Channel == &Channels[0]) Channel1ValveSet(Value);
kabukistarship 9:256989faeb3b 103 else if (Channel == &Channels[1]) Channel2ValveSet(Value);
kabukistarship 9:256989faeb3b 104 else if (Channel == &Channels[2]) Channel3ValveSet(Value);
kabukistarship 9:256989faeb3b 105 else if (Channel == &Channels[3]) Channel4ValveSet(Value);
kabukistarship 9:256989faeb3b 106 }
kabukistarship 9:256989faeb3b 107
kabukistarship 10:09fe2b1474bf 108 int SBVentilator::TicksInhaleExhaleSet (int Index,
kabukistarship 9:256989faeb3b 109 int TicksInhale,
kabukistarship 9:256989faeb3b 110 int TicksExhale) {
kabukistarship 9:256989faeb3b 111 if (Index < 0 || Index >= ChannelCount) return -1;
kabukistarship 9:256989faeb3b 112 if (TicksInhale <= TicksInhaleMax) return -2;
kabukistarship 9:256989faeb3b 113 if (TicksInhale >= TicksInhaleMin) return -3;
kabukistarship 9:256989faeb3b 114 if (Index >= ChannelCount) return 1;
kabukistarship 9:256989faeb3b 115 if (TicksExhale <= TicksExhaleMax) return 2;
kabukistarship 9:256989faeb3b 116 if (TicksExhale >= TicksExhaleMin) return 3;
kabukistarship 9:256989faeb3b 117 Channels[Index].TicksInhaleExhaleSet(TicksInhale, TicksExhale);
kabukistarship 9:256989faeb3b 118 return 0;
kabukistarship 9:256989faeb3b 119 }
kabukistarship 9:256989faeb3b 120
kabukistarship 10:09fe2b1474bf 121 void SBVentilator::Update() {
kabukistarship 9:256989faeb3b 122 int Tick = Ticks;
kabukistarship 9:256989faeb3b 123 if (Tick == 0) {
kabukistarship 9:256989faeb3b 124 int Status = this->Status;
kabukistarship 9:256989faeb3b 125 if (Status == 0) return; // We're in the Off State so do nothing.
kabukistarship 9:256989faeb3b 126 // We're in the Calibrating State
kabukistarship 9:256989faeb3b 127 if (++Status > TicksCalibration) {
kabukistarship 9:256989faeb3b 128 StateCalibrateExit ();
kabukistarship 9:256989faeb3b 129 return;
kabukistarship 9:256989faeb3b 130 }
kabukistarship 9:256989faeb3b 131 Status = Status;
kabukistarship 9:256989faeb3b 132 int Pressure = this->Pressure;
kabukistarship 9:256989faeb3b 133 if (Pressure >= PressureMax) {
kabukistarship 9:256989faeb3b 134 this->PressureMax = Pressure;
kabukistarship 9:256989faeb3b 135 }
kabukistarship 9:256989faeb3b 136 }
kabukistarship 9:256989faeb3b 137 else if (Tick <= StateSinking) {
kabukistarship 9:256989faeb3b 138 if (IsUnderPressure ()) StateSinkingEnter ();
kabukistarship 9:256989faeb3b 139 else Ticks = Ticks - 1;
kabukistarship 9:256989faeb3b 140 }
kabukistarship 9:256989faeb3b 141 else if (Tick >= StateRising) {
kabukistarship 9:256989faeb3b 142 if (IsOverPressure ()) StateSinkingEnter ();
kabukistarship 9:256989faeb3b 143 else Ticks = Ticks + 1;
kabukistarship 9:256989faeb3b 144 }
kabukistarship 9:256989faeb3b 145 // Check the Channels for state changes.
kabukistarship 9:256989faeb3b 146 for (int Index = ChannelCount - 1; Index >= 0; --Index) {
kabukistarship 10:09fe2b1474bf 147 SBVentilatorChannel* Channel = &Channels[Index];
kabukistarship 9:256989faeb3b 148 int Tick = Channel->Ticks;
kabukistarship 10:09fe2b1474bf 149 if (Tick <= SBVentilatorChannel::StateExhaling) {
kabukistarship 9:256989faeb3b 150 if (Tick < Channel->TicksExhale) Channel->Inhale ();
kabukistarship 9:256989faeb3b 151 else Channel->Ticks = Ticks - 1;
kabukistarship 9:256989faeb3b 152 }
kabukistarship 10:09fe2b1474bf 153 else if (Tick >= SBVentilatorChannel::StateInhaling) {
kabukistarship 9:256989faeb3b 154 int TicksExhale = Channel->TicksExhale;
kabukistarship 9:256989faeb3b 155 if (Tick > TicksExhale) {
kabukistarship 9:256989faeb3b 156 if (Tick > TicksExhale - TicksPEEP) {
kabukistarship 9:256989faeb3b 157 if (Channel->Pressure >= Channel->PressureReference)
kabukistarship 9:256989faeb3b 158 Channel->Inhale ();
kabukistarship 9:256989faeb3b 159 }
kabukistarship 9:256989faeb3b 160 }
kabukistarship 9:256989faeb3b 161 else Channels->Ticks = Ticks + 1;
kabukistarship 9:256989faeb3b 162 }
kabukistarship 9:256989faeb3b 163 else {
kabukistarship 9:256989faeb3b 164 return;
kabukistarship 9:256989faeb3b 165 }
kabukistarship 9:256989faeb3b 166 Ticks = Tick;
kabukistarship 9:256989faeb3b 167 }
kabukistarship 9:256989faeb3b 168 }
kabukistarship 9:256989faeb3b 169 } //< namespace SickBay
kabukistarship 10:09fe2b1474bf 170 #include "SBVentilatorChannel.hpp"