Kabuki Starship / Mbed 2 deprecated GHVentilator

Dependencies:   mbed SickBayTek

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