Kabuki Starship / SickBayTek

Dependencies:   KabukiTek

Dependents:   GHVentilator

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