diff --git a/CMakeLists.txt b/CMakeLists.txt index 325d3d2..35a455f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,9 @@ add_executable(hybridapi src/labsland/simulations/watertanksimulation.cpp src/deusto/door.cpp src/deusto/watertankDeusto.cpp + src/deusto/watertankDeustoTemperature.cpp + src/deusto/wiperDeusto.cpp + src/deusto/wiper2BitDeusto.cpp src/rhlab/butterfly.cpp src/rhlab/matrix.cpp src/rhlab/morse.cpp diff --git a/server/hybridapi/static/simulations/watertankDeusto.zip b/server/hybridapi/static/simulations/watertankDeusto.zip new file mode 100644 index 0000000..0211cc0 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeusto.zip differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature.zip b/server/hybridapi/static/simulations/watertankDeustoTemperature.zip new file mode 100644 index 0000000..92808a5 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature.zip differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/favicon.ico b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/favicon.ico new file mode 100644 index 0000000..07db393 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/favicon.ico differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/fullscreen-button.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/fullscreen-button.png new file mode 100644 index 0000000..e7b6496 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/fullscreen-button.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-dark.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-dark.png new file mode 100644 index 0000000..d01612f Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-dark.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-light.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-light.png new file mode 100644 index 0000000..593a329 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-empty-light.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-dark.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-dark.png new file mode 100644 index 0000000..c432c86 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-dark.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-light.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-light.png new file mode 100644 index 0000000..e683131 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/progress-bar-full-light.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/style.css b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/style.css new file mode 100644 index 0000000..4d402f4 --- /dev/null +++ b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/style.css @@ -0,0 +1,16 @@ +body { padding: 0; margin: 0 } +#unity-container { position: absolute } +#unity-container.unity-desktop { left: 50%; top: 50%; transform: translate(-50%, -50%) } +#unity-container.unity-mobile { width: 100%; height: 100% } +#unity-canvas { background: #231F20 } +.unity-mobile #unity-canvas { width: 100%; height: 100% } +#unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none } +#unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center } +#unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; margin-left: 6.5px; background: url('progress-bar-empty-dark.png') no-repeat center } +#unity-progress-bar-full { width: 0%; height: 18px; margin-top: 10px; background: url('progress-bar-full-dark.png') no-repeat center } +#unity-footer { position: relative } +.unity-mobile #unity-footer { display: none } +#unity-webgl-logo { float:left; width: 204px; height: 38px; background: url('webgl-logo.png') no-repeat center } +#unity-build-title { float: right; margin-right: 10px; line-height: 38px; font-family: arial; font-size: 18px } +#unity-fullscreen-button { float: right; width: 38px; height: 38px; background: url('fullscreen-button.png') no-repeat center } +#unity-warning { position: absolute; left: 50%; top: 5%; transform: translate(-50%); background: white; padding: 10px; display: none } diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-dark.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-dark.png new file mode 100644 index 0000000..2c33238 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-dark.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-light.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-light.png new file mode 100644 index 0000000..9f0ab84 Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/unity-logo-light.png differ diff --git a/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/webgl-logo.png b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/webgl-logo.png new file mode 100644 index 0000000..338b1ae Binary files /dev/null and b/server/hybridapi/static/simulations/watertankDeustoTemperature/TemplateData/webgl-logo.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto.zip b/server/hybridapi/static/simulations/wiper2BitDeusto.zip new file mode 100644 index 0000000..f0bd4b5 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto.zip differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/favicon.ico b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/favicon.ico new file mode 100644 index 0000000..07db393 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/favicon.ico differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/fullscreen-button.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/fullscreen-button.png new file mode 100644 index 0000000..e7b6496 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/fullscreen-button.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-dark.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-dark.png new file mode 100644 index 0000000..d01612f Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-dark.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-light.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-light.png new file mode 100644 index 0000000..593a329 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-empty-light.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-dark.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-dark.png new file mode 100644 index 0000000..c432c86 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-dark.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-light.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-light.png new file mode 100644 index 0000000..e683131 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/progress-bar-full-light.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/style.css b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/style.css new file mode 100644 index 0000000..4d402f4 --- /dev/null +++ b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/style.css @@ -0,0 +1,16 @@ +body { padding: 0; margin: 0 } +#unity-container { position: absolute } +#unity-container.unity-desktop { left: 50%; top: 50%; transform: translate(-50%, -50%) } +#unity-container.unity-mobile { width: 100%; height: 100% } +#unity-canvas { background: #231F20 } +.unity-mobile #unity-canvas { width: 100%; height: 100% } +#unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none } +#unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center } +#unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; margin-left: 6.5px; background: url('progress-bar-empty-dark.png') no-repeat center } +#unity-progress-bar-full { width: 0%; height: 18px; margin-top: 10px; background: url('progress-bar-full-dark.png') no-repeat center } +#unity-footer { position: relative } +.unity-mobile #unity-footer { display: none } +#unity-webgl-logo { float:left; width: 204px; height: 38px; background: url('webgl-logo.png') no-repeat center } +#unity-build-title { float: right; margin-right: 10px; line-height: 38px; font-family: arial; font-size: 18px } +#unity-fullscreen-button { float: right; width: 38px; height: 38px; background: url('fullscreen-button.png') no-repeat center } +#unity-warning { position: absolute; left: 50%; top: 5%; transform: translate(-50%); background: white; padding: 10px; display: none } diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-dark.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-dark.png new file mode 100644 index 0000000..2c33238 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-dark.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-light.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-light.png new file mode 100644 index 0000000..9f0ab84 Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/unity-logo-light.png differ diff --git a/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/webgl-logo.png b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/webgl-logo.png new file mode 100644 index 0000000..338b1ae Binary files /dev/null and b/server/hybridapi/static/simulations/wiper2BitDeusto/TemplateData/webgl-logo.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto.zip b/server/hybridapi/static/simulations/wiperDeusto.zip new file mode 100644 index 0000000..bd32e13 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto.zip differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/favicon.ico b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/favicon.ico new file mode 100644 index 0000000..07db393 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/favicon.ico differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/fullscreen-button.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/fullscreen-button.png new file mode 100644 index 0000000..e7b6496 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/fullscreen-button.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-dark.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-dark.png new file mode 100644 index 0000000..d01612f Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-dark.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-light.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-light.png new file mode 100644 index 0000000..593a329 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-empty-light.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-dark.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-dark.png new file mode 100644 index 0000000..c432c86 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-dark.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-light.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-light.png new file mode 100644 index 0000000..e683131 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/progress-bar-full-light.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/style.css b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/style.css new file mode 100644 index 0000000..4d402f4 --- /dev/null +++ b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/style.css @@ -0,0 +1,16 @@ +body { padding: 0; margin: 0 } +#unity-container { position: absolute } +#unity-container.unity-desktop { left: 50%; top: 50%; transform: translate(-50%, -50%) } +#unity-container.unity-mobile { width: 100%; height: 100% } +#unity-canvas { background: #231F20 } +.unity-mobile #unity-canvas { width: 100%; height: 100% } +#unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none } +#unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center } +#unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; margin-left: 6.5px; background: url('progress-bar-empty-dark.png') no-repeat center } +#unity-progress-bar-full { width: 0%; height: 18px; margin-top: 10px; background: url('progress-bar-full-dark.png') no-repeat center } +#unity-footer { position: relative } +.unity-mobile #unity-footer { display: none } +#unity-webgl-logo { float:left; width: 204px; height: 38px; background: url('webgl-logo.png') no-repeat center } +#unity-build-title { float: right; margin-right: 10px; line-height: 38px; font-family: arial; font-size: 18px } +#unity-fullscreen-button { float: right; width: 38px; height: 38px; background: url('fullscreen-button.png') no-repeat center } +#unity-warning { position: absolute; left: 50%; top: 5%; transform: translate(-50%); background: white; padding: 10px; display: none } diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-dark.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-dark.png new file mode 100644 index 0000000..2c33238 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-dark.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-light.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-light.png new file mode 100644 index 0000000..9f0ab84 Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/unity-logo-light.png differ diff --git a/server/hybridapi/static/simulations/wiperDeusto/TemplateData/webgl-logo.png b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/webgl-logo.png new file mode 100644 index 0000000..338b1ae Binary files /dev/null and b/server/hybridapi/static/simulations/wiperDeusto/TemplateData/webgl-logo.png differ diff --git a/server/simulations/watertankDeusto.yml b/server/simulations/watertankDeusto.yml index 06f88dc..afe62ad 100644 --- a/server/simulations/watertankDeusto.yml +++ b/server/simulations/watertankDeusto.yml @@ -5,6 +5,6 @@ iframe: height: 700 gpios: sim2dut: - labels: [ lowSensor, midSensor, highSensor, pump1Hot, pump2Hot ] + labels: [ lowSensor, midSensor, highSensor ] dut2sim: labels: [ pump1Bit0, pump1Bit1, pump2Bit0, pump2Bit1 ] diff --git a/server/simulations/watertankDeustoTemperature.yml b/server/simulations/watertankDeustoTemperature.yml new file mode 100644 index 0000000..3172852 --- /dev/null +++ b/server/simulations/watertankDeustoTemperature.yml @@ -0,0 +1,10 @@ +name: Watertank +description: This is a watertank simulation +iframe: + url: watertankDeustoTemperature/index.html + height: 700 +gpios: + sim2dut: + labels: [ lowSensor, midSensor, highSensor, pump1Hot, pump2Hot ] + dut2sim: + labels: [ pump1Bit0, pump1Bit1, pump2Bit0, pump2Bit1 ] diff --git a/server/simulations/wiper2BitDeusto.yml b/server/simulations/wiper2BitDeusto.yml new file mode 100644 index 0000000..ebe3326 --- /dev/null +++ b/server/simulations/wiper2BitDeusto.yml @@ -0,0 +1,10 @@ +name: Wiper +description: This is a wiper simulation +iframe: + url: wiper2BitDeusto/index.html + height: 700 +gpios: + sim2dut: + labels: [ rainSensor, rightSenson, leftSensor, mButton, pButton] + dut2sim: + labels: [ move1, move2 ] diff --git a/server/simulations/wiperDeusto.yml b/server/simulations/wiperDeusto.yml new file mode 100644 index 0000000..936ae83 --- /dev/null +++ b/server/simulations/wiperDeusto.yml @@ -0,0 +1,10 @@ +name: Wiper +description: This is a wiper simulation +iframe: + url: wiperDeusto/index.html + height: 700 +gpios: + sim2dut: + labels: [ rainSensor, rightSenson, leftSensor, mButton, pButton ] + dut2sim: + labels: [ move ] diff --git a/src-stdcpp/main.cpp b/src-stdcpp/main.cpp index 633616e..cc3ca54 100644 --- a/src-stdcpp/main.cpp +++ b/src-stdcpp/main.cpp @@ -14,6 +14,9 @@ #include "rhlab/morse.h" #include "deusto/door.h" #include "deusto/watertankDeusto.h" +#include "deusto/watertankDeustoTemperature.h" +#include "deusto/wiperDeusto.h" +#include "deusto/wiper2BitDeusto.h" #include "labsland/simulations/utils/communicatorfiles.h" #include "labsland/simulations/targetdevicefiles.h" #include "labsland/utils/timemanagerstd.h" @@ -116,6 +119,12 @@ int main(int argc, char * argv[]) { runner = new ConcreteSimulationRunner(configuration, mode); } else if (simulation == "watertankDeusto") { runner = new ConcreteSimulationRunner(configuration, mode); + } else if (simulation == "watertankDeustoTemperature") { + runner = new ConcreteSimulationRunner(configuration, mode); + }else if (simulation == "wiperDeusto") { + runner = new ConcreteSimulationRunner(configuration, mode); + }else if (simulation == "wiper2BitDeusto") { + runner = new ConcreteSimulationRunner(configuration, mode); } else if (simulation == "morse") { runner = new ConcreteSimulationRunner< RHLab::Morse::MorseSimulation, RHLab::Morse::MorseData, RHLab::Morse::MorseRequest>(configuration, mode); } diff --git a/src/deusto/watertankDeusto.cpp b/src/deusto/watertankDeusto.cpp index 2f9d89f..6a297aa 100644 --- a/src/deusto/watertankDeusto.cpp +++ b/src/deusto/watertankDeusto.cpp @@ -7,7 +7,7 @@ void WatertankDeustoSimulation::initialize() { this->targetDevice->initializeSimulation( - {"lowSensorActive", "midSensorActive", "highSensorActive", "pump1Hot", "pump2Hot"}, + {"lowSensorActive", "midSensorActive", "highSensorActive"}, {"pump1Bit0","pump1Bit1", "pump2Bit0", "pump2Bit1"} ); @@ -25,7 +25,6 @@ setReportWhenMarked(true); } - int error[4][3] = {{ 0, 1, 0 },{ 1, 0, 0 },{ 1, 0, 1 },{ 1, 1, 0 }}; void WatertankDeustoSimulation::update(double delta) { this->log() << "Updating simulation. Delta: " << delta << std::endl; @@ -40,16 +39,6 @@ double addedWater = 0; - if (mState.pump1Temperature>=85) mState.pump1Hot = true; - else mState.pump1Hot = false; - if (mState.pump2Temperature>=85) mState.pump2Hot = true; - else mState.pump2Hot = false; - - if (mState.pump1Temperature>=100) mState.pump1Broken = true; - else mState.pump1Broken = false; - if (mState.pump2Temperature>=100) mState.pump2Broken = true; - else mState.pump2Broken = false; - mState.pump1ActiveBit0 = this->targetDevice->getGpio("pump1Bit0"); mState.pump1ActiveBit1 = this->targetDevice->getGpio("pump1Bit1"); @@ -58,37 +47,19 @@ this->log() << "Pumps: pump1: " << mState.pump1ActiveBit0 << mState.pump1ActiveBit1 << "; pump2: " << mState.pump2ActiveBit0 << mState.pump2ActiveBit1 << std::endl; - if(mState.pump1ActiveBit0 || mState.pump1ActiveBit1) { - if(mState.pump1Temperature<100) mState.pump1Temperature += 3 * delta; - else mState.pump1Temperature = 100; - - if (!mState.pump1Broken) { - if (mState.pump1ActiveBit0 == 1 && mState.pump1ActiveBit1 == 1) { - addedWater += 2 * PUMP1_FLOWRATE * delta; - } else { - addedWater += PUMP1_FLOWRATE * delta; - } - } - }else{ - if(mState.pump1Temperature>0) mState.pump1Temperature -= 6 * delta; - else mState.pump1Temperature = 0; + + if (mState.pump1ActiveBit0 == 1 && mState.pump1ActiveBit1 == 1) { + addedWater += 2 * PUMP1_FLOWRATE * delta; + } else if(mState.pump1ActiveBit0 == 0 && mState.pump1ActiveBit1 == 1){ + addedWater += PUMP1_FLOWRATE * delta; } - - if(mState.pump2ActiveBit0 || mState.pump2ActiveBit1) { - if(mState.pump2Temperature<100) mState.pump2Temperature += 3 * delta; - else mState.pump2Temperature = 100; - - if (!mState.pump2Broken) { - if (mState.pump2ActiveBit0 == 1 && mState.pump2ActiveBit1 == 1) { - addedWater += 2 * PUMP2_FLOWRATE * delta; - } else { - addedWater += PUMP2_FLOWRATE * delta; - } - } - }else{ - if(mState.pump2Temperature>0) mState.pump2Temperature -= 6 * delta; - else mState.pump2Temperature = 0; + + if (mState.pump2ActiveBit0 == 1 && mState.pump2ActiveBit1 == 1) { + addedWater += 2 * PUMP2_FLOWRATE * delta; + } else if(mState.pump2ActiveBit0 == 0 && mState.pump2ActiveBit1 == 1){ + addedWater += PUMP2_FLOWRATE * delta; } + float removedWater = 0; removedWater = mCurrentDemandFlowrate * delta; @@ -130,8 +101,6 @@ this->targetDevice->setGpio("lowSensorActive", mState.lowSensorActive); this->targetDevice->setGpio("midSensorActive", mState.midSensorActive); this->targetDevice->setGpio("highSensorActive", mState.highSensorActive); - this->targetDevice->setGpio("pump1Hot", mState.pump1Hot); - this->targetDevice->setGpio("pump2Hot", mState.pump2Hot); this->log() << "of: " << request.outputFlow << "; err: " << request.makeError << "; res: " << request.resetError << std::endl; diff --git a/src/deusto/watertankDeusto.h b/src/deusto/watertankDeusto.h index 571c484..f4e6975 100644 --- a/src/deusto/watertankDeusto.h +++ b/src/deusto/watertankDeusto.h @@ -22,17 +22,12 @@ bool lowSensorActive; bool midSensorActive; bool highSensorActive; - bool pump1Hot; - bool pump2Hot; - bool pump1Broken; - bool pump2Broken; std::string serialize() const { std::stringstream stream; - stream << level << "&" << totalVolume << "&" << volume << "&" << pump1ActiveBit0 << pump1ActiveBit1 << "&" << pump2ActiveBit0 << pump2ActiveBit1 << "&" << - pump1Temperature << "&" << pump2Temperature << "&" << currentLoad << "&" << lowSensorActive << "&" << - midSensorActive << "&" << highSensorActive << "&"<< pump1Hot << "&" << pump2Hot << "&" << - pump1Broken << "&" << pump2Broken << "&"; + stream << level << "&" << pump1ActiveBit0 << pump1ActiveBit1 << "&" << pump2ActiveBit0 << pump2ActiveBit1 << "&" << + pump1Temperature << "&" << pump2Temperature << "&" << lowSensorActive << "&" << + midSensorActive << "&" << highSensorActive << "&"; return stream.str(); } }; @@ -68,7 +63,8 @@ const float PUMP2_FLOWRATE = 2000; float mCurrentDemandFlowrate = 0; - + + int error[4][3] = {{ 0, 1, 0 },{ 1, 0, 0 },{ 1, 0, 1 },{ 1, 1, 0 }}; bool makeError = false; bool resetError = false; bool isBroken = false; diff --git a/src/deusto/watertankDeustoTemperature.cpp b/src/deusto/watertankDeustoTemperature.cpp new file mode 100644 index 0000000..0d8dd23 --- /dev/null +++ b/src/deusto/watertankDeustoTemperature.cpp @@ -0,0 +1,142 @@ + #include + #include + #include + #include "watertankDeustoTemperature.h" + + + void WatertankDeustoTemperatureSimulation::initialize() { + + this->targetDevice->initializeSimulation( + {"lowSensorActive", "midSensorActive", "highSensorActive", "pump1Hot", "pump2Hot"}, + {"pump1Bit0","pump1Bit1", "pump2Bit0", "pump2Bit1"} + ); + + float radius = WATERTANK_DIAMETER / 2; + mState.totalVolume = M_PI * radius * radius * WATERTANK_HEIGHT * 1000; + + mState.volume = mState.totalVolume / 2; + mState.level = 0.9; + + mState.pump1ActiveBit0 = false; + mState.pump1ActiveBit1 = false; + mState.pump2ActiveBit0 = false; + mState.pump2ActiveBit1 = false; + + setReportWhenMarked(true); + } + + void WatertankDeustoTemperatureSimulation::update(double delta) { + + this->log() << "Updating simulation. Delta: " << delta << std::endl; + + WatertankDeustoTemperatureRequest request; + bool requestWasRead = readRequest(request); + if (requestWasRead) { + mCurrentDemandFlowrate = request.outputFlow; + makeError = request.makeError; + resetError = request.resetError; + } + + double addedWater = 0; + + if (mState.pump1Temperature>=90) mState.pump1Hot = true; + else if (mState.pump1Hot && mState.pump1Temperature<=30)mState.pump1Hot = false; + if (mState.pump2Temperature>=90) mState.pump2Hot = true; + else if(mState.pump2Hot && mState.pump2Temperature<=30) mState.pump2Hot = false; + + if (mState.pump1Temperature>=100) mState.pump1Broken = true; + else mState.pump1Broken = false; + if (mState.pump2Temperature>=100) mState.pump2Broken = true; + else mState.pump2Broken = false; + + mState.pump1ActiveBit0 = this->targetDevice->getGpio("pump1Bit0"); + mState.pump1ActiveBit1 = this->targetDevice->getGpio("pump1Bit1"); + + mState.pump2ActiveBit0 = this->targetDevice->getGpio("pump2Bit0"); + mState.pump2ActiveBit1 = this->targetDevice->getGpio("pump2Bit1"); + + this->log() << "Pumps: pump1: " << mState.pump1ActiveBit0 << mState.pump1ActiveBit1 << "; pump2: " << mState.pump2ActiveBit0 << mState.pump2ActiveBit1 << std::endl; + + if(mState.pump1ActiveBit0 || mState.pump1ActiveBit1) { + if(mState.pump1Temperature<100) mState.pump1Temperature += 3 * delta; + else mState.pump1Temperature = 100; + + if (!mState.pump1Broken) { + if (mState.pump1ActiveBit0 == 1 && mState.pump1ActiveBit1 == 1) { + addedWater += 2 * PUMP1_FLOWRATE * delta; + } else if(mState.pump1ActiveBit0 == 0 && mState.pump1ActiveBit1 == 1){ + addedWater += PUMP1_FLOWRATE * delta; + } + } + }else{ + if(mState.pump1Temperature>0) mState.pump1Temperature -= 6 * delta; + else mState.pump1Temperature = 0; + } + + if(mState.pump2ActiveBit0 || mState.pump2ActiveBit1) { + if(mState.pump2Temperature<100) mState.pump2Temperature += 3 * delta; + else mState.pump2Temperature = 100; + + if (!mState.pump2Broken) { + if (mState.pump2ActiveBit0 == 1 && mState.pump2ActiveBit1 == 1) { + addedWater += 2 * PUMP2_FLOWRATE * delta; + } else if(mState.pump2ActiveBit0 == 0 && mState.pump2ActiveBit1 == 1){ + addedWater += PUMP2_FLOWRATE * delta; + } + } + }else{ + if(mState.pump2Temperature>0) mState.pump2Temperature -= 6 * delta; + else mState.pump2Temperature = 0; + } + + float removedWater = 0; + removedWater = mCurrentDemandFlowrate * delta; + + this->log() << "Old volume: " << mState.volume << "; adding: " << addedWater << "; removing (flow rate=" << mCurrentDemandFlowrate << "): " << removedWater << std::endl; + + mState.volume = mState.volume + addedWater - removedWater; + if (mState.volume < 0) { + mState.volume = 0; + } + if (mState.volume > mState.totalVolume) { + mState.volume = mState.totalVolume; + } + + mState.level = mState.volume / mState.totalVolume; + + if(resetError && isBroken){ + isBroken = false; + } + if(makeError && !isBroken){ + + isBroken = true; + int randomError = rand() % 4; + + mState.lowSensorActive = error[randomError][2]; + mState.midSensorActive = error[randomError][1]; + mState.highSensorActive = error[randomError][0]; + } + + this->log() << "New volume: " << mState.volume << "; which is level=" << mState.level << std::endl; + if(!isBroken) + { + mState.lowSensorActive = mState.level >= 0.20; + mState.midSensorActive = mState.level >= 0.50; + mState.highSensorActive = mState.level >= 0.80; + } + this->log() << "Sensors: Low (0.2): " << mState.lowSensorActive << "; Mid (0.5): " << mState.midSensorActive << "; High (0.8): " << mState.highSensorActive << std::endl; + + this->targetDevice->setGpio("lowSensorActive", mState.lowSensorActive); + this->targetDevice->setGpio("midSensorActive", mState.midSensorActive); + this->targetDevice->setGpio("highSensorActive", mState.highSensorActive); + this->targetDevice->setGpio("pump1Hot", mState.pump1Hot); + this->targetDevice->setGpio("pump2Hot", mState.pump2Hot); + + this->log() << "of: " << request.outputFlow << "; err: " << request.makeError << "; res: " << request.resetError << std::endl; + + requestReportState(); + } + + + + \ No newline at end of file diff --git a/src/deusto/watertankDeustoTemperature.h b/src/deusto/watertankDeustoTemperature.h new file mode 100644 index 0000000..b912d6e --- /dev/null +++ b/src/deusto/watertankDeustoTemperature.h @@ -0,0 +1,87 @@ + #ifndef HYBRIDAPI_WATERTANKDEUSTO_TEMPERATURE_H + #define HYBRIDAPI_WATERTANKDEUSTO_TEMPERATURE_H + + #include "../labsland/simulations/simulation.h" + #include + #include + #include + #include + + struct WatertankDeustoTemperatureData : public BaseOutputDataType { + + float level; + float totalVolume; + float volume; + bool pump1ActiveBit0; + bool pump1ActiveBit1; + bool pump2ActiveBit0; + bool pump2ActiveBit1; + float pump1Temperature; + float pump2Temperature; + float currentLoad; + bool lowSensorActive; + bool midSensorActive; + bool highSensorActive; + bool pump1Hot; + bool pump2Hot; + bool pump1Broken; + bool pump2Broken; + + std::string serialize() const { + std::stringstream stream; + stream << level << "&" << pump1ActiveBit0 << pump1ActiveBit1 << "&" << pump2ActiveBit0 << pump2ActiveBit1 << "&" << + pump1Temperature << "&" << pump2Temperature << "&" << lowSensorActive << "&" << + midSensorActive << "&" << highSensorActive << "&"<< pump1Hot << "&" << pump2Hot << "&" << + pump1Broken << "&" << pump2Broken << "&"; + return stream.str(); + } + }; + + struct WatertankDeustoTemperatureRequest : public BaseInputDataType { + float outputFlow; + bool makeError; + bool resetError; + bool deserialize(std::string const & input) { + std::string data = input; + std::replace(data.begin(), data.end(), '&', ' '); + std::replace(data.begin(), data.end(), ',', '.'); + std::stringstream stream(data); + int errorInt, resetInt; + if (!(stream >> outputFlow >> errorInt >> resetInt)) { + return false; + } + makeError = (errorInt != 0); + resetError = (resetInt != 0) && !makeError; + + return true; + } + }; + + + class WatertankDeustoTemperatureSimulation : public Simulation { + private: + + const float WATERTANK_HEIGHT = 6.0f; + const float WATERTANK_DIAMETER = 4.0f; + + const float PUMP1_FLOWRATE = 2000; + const float PUMP2_FLOWRATE = 2000; + + float mCurrentDemandFlowrate = 0; + int error[4][3] = {{ 0, 1, 0 },{ 1, 0, 0 },{ 1, 0, 1 },{ 1, 1, 0 }}; + bool makeError = false; + bool resetError = false; + bool isBroken = false; + + public: + + WatertankDeustoTemperatureSimulation() = default; + + virtual void update(double delta) override; + + virtual void initialize() override; + }; + + + #endif + \ No newline at end of file diff --git a/src/deusto/wiper2BitDeusto.cpp b/src/deusto/wiper2BitDeusto.cpp new file mode 100644 index 0000000..a26e720 --- /dev/null +++ b/src/deusto/wiper2BitDeusto.cpp @@ -0,0 +1,40 @@ +#include +#include +#include "wiper2BitDeusto.h" + +void Wiper2BitDeustoSimulation::initialize() +{ + + this->targetDevice->initializeSimulation( + {"rainSensor", "rightSensor", "leftSensor", "mButton", "pButton"}, + {"move1", "move2"}); + + setReportWhenMarked(true); +} + +void Wiper2BitDeustoSimulation::update(double delta) +{ + + this->log() << "Updating simulation. Delta: " << delta << std::endl; + + Wiper2BitDeustoRequest request; + bool requestWasRead = readRequest(request); + + mState.move1 = this->targetDevice->getGpio("move1"); + mState.move2 = this->targetDevice->getGpio("move2"); + + this->log() << std::endl << "Move: " << mState.move1 << std::endl; + + if (requestWasRead) { + this->log() << "Input:" << std::endl + << " RainSensor: " << request.rainSensor << "; RightSensor: " << request.rightSensor << "; LeftSensor: " << request.leftSensor << std::endl; + + this->targetDevice->setGpio("rainSensor", request.rainSensor); + this->targetDevice->setGpio("rightSensor", request.rightSensor); + this->targetDevice->setGpio("leftSensor", request.leftSensor); + this->targetDevice->setGpio("mButton", request.mButton); + this->targetDevice->setGpio("pButton", request.pButton); + } + + requestReportState(); +} diff --git a/src/deusto/wiper2BitDeusto.h b/src/deusto/wiper2BitDeusto.h new file mode 100644 index 0000000..79c635b --- /dev/null +++ b/src/deusto/wiper2BitDeusto.h @@ -0,0 +1,69 @@ +#ifndef HYBRIDAPI_WIPER_2BIT_H +#define HYBRIDAPI_WIPER_2BIT_H + +#include "../labsland/simulations/simulation.h" +#include +#include +#include +#include + +struct Wiper2BitDeustoData : public BaseOutputDataType +{ + + bool move1; + bool move2; + + std::string serialize() const + { + std::stringstream stream; + stream << move1 << "&" << move2 << "&"; + return stream.str(); + } +}; + +struct Wiper2BitDeustoRequest : public BaseInputDataType +{ + bool rainSensor; + bool leftSensor; + bool rightSensor; + bool mButton; + bool pButton; + + + bool deserialize(std::string const &input) + { + std::stringstream stream(input); + std::string segment; + std::vector segments; + + while (std::getline(stream, segment, '&')) + { + segments.push_back(segment); + } + + if (segments.size() != 5) { + return false; + } + + rainSensor = (segments[0] == "1"); + leftSensor = (segments[1] == "1"); + rightSensor = (segments[2] == "1"); + mButton = (segments[3] == "1"); + pButton = (segments[4] == "1"); + + return true; + } +}; + +class Wiper2BitDeustoSimulation : public Simulation +{ + +public: + Wiper2BitDeustoSimulation() = default; + + virtual void update(double delta) override; + + virtual void initialize() override; +}; + +#endif diff --git a/src/deusto/wiperDeusto.cpp b/src/deusto/wiperDeusto.cpp new file mode 100644 index 0000000..1f93603 --- /dev/null +++ b/src/deusto/wiperDeusto.cpp @@ -0,0 +1,39 @@ +#include +#include +#include "wiperDeusto.h" + +void WiperDeustoSimulation::initialize() +{ + + this->targetDevice->initializeSimulation( + {"rainSensor", "rightSensor", "leftSensor", "mButton", "pButton"}, + {"move"}); + + setReportWhenMarked(true); +} + +void WiperDeustoSimulation::update(double delta) +{ + + this->log() << "Updating simulation. Delta: " << delta << std::endl; + + WiperDeustoRequest request; + bool requestWasRead = readRequest(request); + + mState.move = this->targetDevice->getGpio("move"); + + this->log() << std::endl << "Move: " << mState.move << std::endl; + + if (requestWasRead) { + this->log() << "Input:" << std::endl + << " RainSensor: " << request.rainSensor << "; RightSensor: " << request.rightSensor << "; LeftSensor: " << request.leftSensor << std::endl; + + this->targetDevice->setGpio("rainSensor", request.rainSensor); + this->targetDevice->setGpio("rightSensor", request.rightSensor); + this->targetDevice->setGpio("leftSensor", request.leftSensor); + this->targetDevice->setGpio("mButton", request.mButton); + this->targetDevice->setGpio("pButton", request.pButton); + } + + requestReportState(); +} diff --git a/src/deusto/wiperDeusto.h b/src/deusto/wiperDeusto.h new file mode 100644 index 0000000..f61c952 --- /dev/null +++ b/src/deusto/wiperDeusto.h @@ -0,0 +1,68 @@ +#ifndef HYBRIDAPI_WIPER_H +#define HYBRIDAPI_WIPER_H + +#include "../labsland/simulations/simulation.h" +#include +#include +#include +#include + +struct WiperDeustoData : public BaseOutputDataType +{ + + bool move; + + std::string serialize() const + { + std::stringstream stream; + stream << move << "&"; + return stream.str(); + } +}; + +struct WiperDeustoRequest : public BaseInputDataType +{ + bool rainSensor; + bool leftSensor; + bool rightSensor; + bool mButton; + bool pButton; + + + bool deserialize(std::string const &input) + { + std::stringstream stream(input); + std::string segment; + std::vector segments; + + while (std::getline(stream, segment, '&')) + { + segments.push_back(segment); + } + + if (segments.size() != 5) { + return false; + } + + rainSensor = (segments[0] == "1"); + leftSensor = (segments[1] == "1"); + rightSensor = (segments[2] == "1"); + mButton = (segments[3] == "1"); + pButton = (segments[4] == "1"); + + return true; + } +}; + +class WiperDeustoSimulation : public Simulation +{ + +public: + WiperDeustoSimulation() = default; + + virtual void update(double delta) override; + + virtual void initialize() override; +}; + +#endif