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.
GHVentilatorTargetMbed.hpp@9:256989faeb3b, 2020-04-10 (annotated)
- 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?
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 | 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 |