Kabuki Starship / Mbed 2 deprecated GHVentilator

Dependencies:   mbed SickBayTek

Committer:
kabukistarship
Date:
Sat Apr 11 08:48:28 2020 +0000
Revision:
10:09fe2b1474bf
Parent:
GHVentilatorTargetMbed.hpp@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 9:256989faeb3b 1 /** Gravity Hookah Ventilator @version 0.x
kabukistarship 9:256989faeb3b 2 @link https://github.com/KabukiStarship/SickBay.git
kabukistarship 10:09fe2b1474bf 3 @file /SBVentilator/Firmware/TargetMbed.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 #pragma once
kabukistarship 10:09fe2b1474bf 10 #ifndef SBVentilatorMbed
kabukistarship 10:09fe2b1474bf 11 #define SBVentilatorMbed
kabukistarship 10:09fe2b1474bf 12 #include <_KabukiTek.hpp>
kabukistarship 10:09fe2b1474bf 13 #include <BMP280.hpp>
kabukistarship 10:09fe2b1474bf 14 #include <BExprI2CMbed.hpp>
kabukistarship 10:09fe2b1474bf 15 using namespace _;
kabukistarship 10:09fe2b1474bf 16
kabukistarship 10:09fe2b1474bf 17 #include "SBVentilator.hpp"
kabukistarship 9:256989faeb3b 18
kabukistarship 9:256989faeb3b 19 #define SickBayDebug 1
kabukistarship 9:256989faeb3b 20 #define Platform PlatformMbed
kabukistarship 10:09fe2b1474bf 21 #define SBVentilatorChannelCount 4
kabukistarship 9:256989faeb3b 22
kabukistarship 9:256989faeb3b 23 namespace SickBay {
kabukistarship 9:256989faeb3b 24
kabukistarship 9:256989faeb3b 25
kabukistarship 9:256989faeb3b 26 DigitalOut Blower(D2),
kabukistarship 9:256989faeb3b 27 Status(D3),
kabukistarship 9:256989faeb3b 28 Channel1Valve (D4);
kabukistarship 10:09fe2b1474bf 29 DigitalIn ChannelFlowSensor (D5);
kabukistarship 9:256989faeb3b 30 DigitalOut Channel2Valve (D6);
kabukistarship 10:09fe2b1474bf 31 DigitalIn Channel2FlowSensor (D7);
kabukistarship 9:256989faeb3b 32 DigitalOut Channel3Valve (D8);
kabukistarship 10:09fe2b1474bf 33 DigitalIn Channel3FlowSensor (D9);
kabukistarship 9:256989faeb3b 34 DigitalOut Channel4Valve (D10);
kabukistarship 10:09fe2b1474bf 35 DigitalIn Channel4FlowSensor (D11);
kabukistarship 9:256989faeb3b 36
kabukistarship 10:09fe2b1474bf 37 void SBVentilator::BlowerTurnOff() {
kabukistarship 9:256989faeb3b 38 Blower = LLLow;
kabukistarship 9:256989faeb3b 39 }
kabukistarship 9:256989faeb3b 40
kabukistarship 10:09fe2b1474bf 41 void SBVentilator::BlowerTurnOn() {
kabukistarship 9:256989faeb3b 42 Blower = LLHigh;
kabukistarship 9:256989faeb3b 43 }
kabukistarship 9:256989faeb3b 44
kabukistarship 10:09fe2b1474bf 45 bool SBVentilator::IsOverPressure () { return Pressure > PressureMax; }
kabukistarship 9:256989faeb3b 46
kabukistarship 10:09fe2b1474bf 47 bool SBVentilator::IsUnderPressure () { return Pressure < PressureMax; }
kabukistarship 9:256989faeb3b 48
kabukistarship 10:09fe2b1474bf 49 void SBVentilator::Channel1ValveSet (int Value) {
kabukistarship 9:256989faeb3b 50 Channel1Valve = Value;
kabukistarship 9:256989faeb3b 51 }
kabukistarship 9:256989faeb3b 52
kabukistarship 10:09fe2b1474bf 53 void SBVentilator::Channel2ValveSet (int Value) {
kabukistarship 9:256989faeb3b 54 Channel2Valve = Value;
kabukistarship 9:256989faeb3b 55 }
kabukistarship 10:09fe2b1474bf 56 void SBVentilator::Channel3ValveSet (int Value) {
kabukistarship 9:256989faeb3b 57 Channel3Valve = Value;
kabukistarship 9:256989faeb3b 58 }
kabukistarship 10:09fe2b1474bf 59 void SBVentilator::Channel4ValveSet (int Value) {
kabukistarship 9:256989faeb3b 60 Channel4Valve = Value;
kabukistarship 9:256989faeb3b 61 }
kabukistarship 10:09fe2b1474bf 62 #if SBVentilatorChannelCount >= 2
kabukistarship 9:256989faeb3b 63 #endif
kabukistarship 10:09fe2b1474bf 64 #if SBVentilatorChannelCount >= 3
kabukistarship 9:256989faeb3b 65 #endif
kabukistarship 10:09fe2b1474bf 66 #if SBVentilatorChannelCount >= 4
kabukistarship 9:256989faeb3b 67 #endif
kabukistarship 9:256989faeb3b 68
kabukistarship 10:09fe2b1474bf 69 void SBVentilator::Run(){
kabukistarship 10:09fe2b1474bf 70 DPrintIndent (100, "Starting SBVentilator...\r\n\r\n");
kabukistarship 9:256989faeb3b 71
kabukistarship 9:256989faeb3b 72 enum {
kabukistarship 9:256989faeb3b 73 TicksSecond = 250,
kabukistarship 9:256989faeb3b 74 TicksCalibrate = TicksSecond * 10, //< Calibrate for 10 seconds.
kabukistarship 9:256989faeb3b 75 };
kabukistarship 10:09fe2b1474bf 76 DPrintf("\nInitalizing system with %d ticks per second.", TicksSecond);
kabukistarship 9:256989faeb3b 77 float ChamberPressureHysteresis = 1.25f, //< +/-25% goes up and down half-way.
kabukistarship 9:256989faeb3b 78 PatientPressureHysteresis = 1.01f; //< + 1% over 1 atmosphere.
kabukistarship 9:256989faeb3b 79
kabukistarship 9:256989faeb3b 80 I2C Bus(A4, A5);
kabukistarship 10:09fe2b1474bf 81 int BMP280Address = BMP280::AddressDefault;
kabukistarship 9:256989faeb3b 82
kabukistarship 10:09fe2b1474bf 83 // Pressure sensor for the air tank.
kabukistarship 10:09fe2b1474bf 84 BMP280 Atmosphere0;
kabukistarship 10:09fe2b1474bf 85 Atmosphere0.Init(EvaluateI2C, &Bus, BMP280Address);
kabukistarship 10:09fe2b1474bf 86 Pressure = Atmosphere0.Pressure ();
kabukistarship 10:09fe2b1474bf 87 Temperature = Atmosphere0.Temperature ();
kabukistarship 9:256989faeb3b 88 // Atmoshperic sensor to Patient 1.
kabukistarship 10:09fe2b1474bf 89 BMP280 Atmosphere1;
kabukistarship 10:09fe2b1474bf 90 Atmosphere1.Init(EvaluateI2C, &Bus, BMP280Address + 1);
kabukistarship 10:09fe2b1474bf 91 Channels[0].Pressure = Atmosphere1.Pressure ();
kabukistarship 10:09fe2b1474bf 92 Channels[0].Temperature = Atmosphere1.Temperature ();
kabukistarship 10:09fe2b1474bf 93 #if SBVentilatorChannelCount >= 2
kabukistarship 9:256989faeb3b 94 // Atmoshperic sensor to Patient 2.
kabukistarship 10:09fe2b1474bf 95 BMP280 Atmosphere2;
kabukistarship 10:09fe2b1474bf 96 Atmosphere2.Init (EvaluateI2C, &Bus, BMP280Address + 2);
kabukistarship 10:09fe2b1474bf 97 Channels[1].Pressure = Atmosphere2.Pressure ();
kabukistarship 10:09fe2b1474bf 98 Channels[1].Temperature = Atmosphere2.Temperature ();
kabukistarship 9:256989faeb3b 99 #endif
kabukistarship 10:09fe2b1474bf 100 #if SBVentilatorChannelCount >= 3
kabukistarship 9:256989faeb3b 101 // Atmoshperic sensor to Patient 3.
kabukistarship 10:09fe2b1474bf 102 BMP280 Atmosphere3;
kabukistarship 10:09fe2b1474bf 103 Atmosphere3.Init(EvaluateI2C, &Bus, BMP280Address + 3);
kabukistarship 10:09fe2b1474bf 104 Channels[2].Pressure = Atmosphere3.Pressure ();
kabukistarship 10:09fe2b1474bf 105 Channels[2].Temperature = Atmosphere3.Temperature ();
kabukistarship 9:256989faeb3b 106 #endif
kabukistarship 10:09fe2b1474bf 107 #if SBVentilatorChannelCount >= 4
kabukistarship 9:256989faeb3b 108 // Atmoshperic sensor to Patient 4.
kabukistarship 10:09fe2b1474bf 109 BMP280 Atmosphere4;
kabukistarship 10:09fe2b1474bf 110 Atmosphere4.Init (EvaluateI2C, &Bus, BMP280Address + 4);
kabukistarship 10:09fe2b1474bf 111 Channels[3].Pressure = Atmosphere4.Pressure ();
kabukistarship 10:09fe2b1474bf 112 Channels[3].Temperature = Atmosphere4.Temperature ();
kabukistarship 9:256989faeb3b 113 #endif
kabukistarship 9:256989faeb3b 114
kabukistarship 9:256989faeb3b 115 Init (TicksSecond, TicksPEEP,
kabukistarship 9:256989faeb3b 116 ChamberPressureHysteresis, PatientPressureHysteresis);
kabukistarship 9:256989faeb3b 117
kabukistarship 9:256989faeb3b 118 // Make sure you don't start the UpdateTicker until everything is setup to
kabukistarship 9:256989faeb3b 119 // enter the Configuration State.
kabukistarship 9:256989faeb3b 120 Ticker UpdateTicker; //< The x times per second update ticker.
kabukistarship 10:09fe2b1474bf 121 UpdateTicker.attach (callback(this, &SBVentilator::Update),
kabukistarship 9:256989faeb3b 122 1.0f / float (TicksSecond));
kabukistarship 9:256989faeb3b 123
kabukistarship 10:09fe2b1474bf 124 while (1) { // Poll the sensors.
kabukistarship 10:09fe2b1474bf 125 Temperature = Atmosphere0.Temperature ();
kabukistarship 10:09fe2b1474bf 126 Pressure = Atmosphere0.Pressure();
kabukistarship 9:256989faeb3b 127
kabukistarship 10:09fe2b1474bf 128 SBVentilatorChannel* Channel = &Channels[0];
kabukistarship 10:09fe2b1474bf 129 Channel->Temperature = Atmosphere1.Temperature ();
kabukistarship 10:09fe2b1474bf 130 Channel->Pressure = Atmosphere1.Pressure();
kabukistarship 9:256989faeb3b 131 Channel = &Channels[1];
kabukistarship 10:09fe2b1474bf 132 #if SBVentilatorChannelCount >= 2
kabukistarship 10:09fe2b1474bf 133 Channel->Temperature = Atmosphere2.Temperature ();
kabukistarship 10:09fe2b1474bf 134 Channel->Pressure = Atmosphere2.Pressure();
kabukistarship 9:256989faeb3b 135 #endif
kabukistarship 9:256989faeb3b 136 Channel = &Channels[2];
kabukistarship 10:09fe2b1474bf 137 #if SBVentilatorChannelCount >= 3
kabukistarship 10:09fe2b1474bf 138 Channel->Temperature = Atmosphere3.Temperature ();
kabukistarship 10:09fe2b1474bf 139 Channel->Pressure = Atmosphere3.Pressure();
kabukistarship 9:256989faeb3b 140 #endif
kabukistarship 9:256989faeb3b 141 Channel = &Channels[3];
kabukistarship 10:09fe2b1474bf 142 #if SBVentilatorChannelCount >= 4
kabukistarship 10:09fe2b1474bf 143 Channel->Temperature = Atmosphere4.Temperature ();
kabukistarship 10:09fe2b1474bf 144 Channel->Pressure = Atmosphere4.Pressure();
kabukistarship 9:256989faeb3b 145 #endif
kabukistarship 9:256989faeb3b 146 }
kabukistarship 9:256989faeb3b 147 }
kabukistarship 9:256989faeb3b 148 /*
kabukistarship 9:256989faeb3b 149 void RemoteTicksSecondSetHandle(Arguments* input, Reply* output) {
kabukistarship 9:256989faeb3b 150 // Arguments are already parsed into argv array of char*
kabukistarship 9:256989faeb3b 151 DDPrintf("Object name = %s\n",input->obj_name);
kabukistarship 9:256989faeb3b 152 DPrintf("Method name = %s\n",input->method_name);
kabukistarship 9:256989faeb3b 153 for (int i=0; i < input->argc; i++)
kabukistarship 9:256989faeb3b 154 DPrintf("argv[%1d] = %s \n",i,input->argv[i]);
kabukistarship 9:256989faeb3b 155
kabukistarship 9:256989faeb3b 156 // Alternatively the arguments can be recovered as the types expected
kabukistarship 9:256989faeb3b 157 // by repeated calls to getArg()
kabukistarship 9:256989faeb3b 158 int arg0 = input->getArg<int>(); // Expecting argv[0] to be int
kabukistarship 9:256989faeb3b 159 DPrintf("Expecting argv[0] to be int = %d\n",arg0);
kabukistarship 9:256989faeb3b 160 int arg1 = input->getArg<int>(); // Expecting argv[1] to be int
kabukistarship 9:256989faeb3b 161 DPrintf("Expecting argv[1] to be int = %d\n",arg1);
kabukistarship 9:256989faeb3b 162
kabukistarship 9:256989faeb3b 163 // The output parameter string is generated by calls to putData, which separates them with spaces.
kabukistarship 9:256989faeb3b 164 output->putData(arg0);
kabukistarship 9:256989faeb3b 165 output->putData(arg1);
kabukistarship 9:256989faeb3b 166 }
kabukistarship 9:256989faeb3b 167
kabukistarship 9:256989faeb3b 168 void HandleTicksInhaleExhaleSet(Arguments* input, Reply* output) {
kabukistarship 9:256989faeb3b 169 DPrintf("\n? Object name=\"%s\" method_name=\"%s\" <",input->obj_name,input->method_name);
kabukistarship 9:256989faeb3b 170 for (int i=0; i < input->argc; i++)
kabukistarship 9:256989faeb3b 171 DPrintf("argv[%1d] = %s \n",i,input->argv[i]);
kabukistarship 9:256989faeb3b 172
kabukistarship 9:256989faeb3b 173 int Index = input->getArg<int>();
kabukistarship 9:256989faeb3b 174 int TicksInhale = input->getArg<int>();
kabukistarship 9:256989faeb3b 175 int TicksExhale = input->getArg<int>();
kabukistarship 9:256989faeb3b 176
kabukistarship 9:256989faeb3b 177 // The output parameter string is generated by calls to putData, which separates them with spaces.
kabukistarship 9:256989faeb3b 178 output->putData(Channel->TicksInhaleExhaleSet(TicksInhale, TicksExhale));
kabukistarship 9:256989faeb3b 179 }
kabukistarship 9:256989faeb3b 180
kabukistarship 9:256989faeb3b 181
kabukistarship 9:256989faeb3b 182 RPCFunction TicksSecondSet(&HandleTicksSecondSet, "TicksSecondSet"),
kabukistarship 9:256989faeb3b 183 InhaleExhaleTicksSet(&HandleTicksInhaleExhaleSet, "InhaleTicksSet");
kabukistarship 9:256989faeb3b 184 */
kabukistarship 9:256989faeb3b 185 } //< namespace SickBay
kabukistarship 9:256989faeb3b 186 #endif