Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
GHVentilatorMbed.hpp@10:09fe2b1474bf, 2020-04-11 (annotated)
- 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?
User | Revision | Line number | New 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 |