Program for the water play project for the course Software Testing Practical 2016 given at the VU University
Dependencies: mbed DRV88255 TextLCD Ping mbed-rtos
main.cpp
- Committer:
- sbouber1
- Date:
- 2016-06-24
- Revision:
- 80:38e274c4dafa
- Parent:
- 78:a44ad011dd41
File content as of revision 80:38e274c4dafa:
#include <vector> #include <iostream> #include "SalinityController.h" #include "TemperatureController.h" #include "LCDController.h" #include "ProximityController.h" #include "SensorAlarmController.h" #include "PIDController.h" #include "settings.h" #include "testing.h" #include "MockSensorController.h" #include "mbed.h" extern int testMain(); int realMain(); int main() { // Either test_main() or real_main() depending on TEST_MODE define in settings.h return MAIN(); } int realMain() { // Collection of all controllers updated in the main loop, updated in the order they were added std::vector<void *> controllers; // ----------------------------------------------------------------------------- /* THE FOLLOWING CONTROLLERS CAN BE THREADED BY SETTING THE FIRST ARG TO TRUE */ /* THE SECOND ARG SPECIFIES THE DELAY AFTER EACH UPDATE, ONLY WHEN THREADED */ // ----------------------------------------------------------------------------- TemperatureController temperature(false, 0); controllers.push_back((void*)&temperature); ProximityController proximity(false, 0); controllers.push_back((void*)&proximity); SalinityController salt(false, 0); controllers.push_back((void *)&salt); // Add alarms to monitor sensor values SensorAlarmController temp_alarm = SensorAlarmController(false, 0, &temperature, TEMP_MIN_CRIT, TEMP_MIN_UNDESIRED, TEMP_MAX_CRIT, TEMP_MAX_UNDESIRED); temp_alarm.setUndesiredErrorMsg("Temp undes!"); temp_alarm.setCriticalErrorMsg("Temp crit!"); controllers.push_back((void *)&temp_alarm); SensorAlarmController salt_alarm = SensorAlarmController(false, 0, &salt, SALT_MIN_CRIT, SALT_MIN_UNDESIRED, SALT_MAX_CRIT, SALT_MAX_UNDESIRED); salt_alarm.setUndesiredErrorMsg("Salt undes!"); salt_alarm.setCriticalErrorMsg("Salt crit!"); controllers.push_back((void *)&salt_alarm); SensorAlarmController prox_alarm = SensorAlarmController(false, 0, &proximity, VOLUME_MIN_CRIT, VOLUME_MIN_UNDESIRED, VOLUME_MAX_CRIT, VOLUME_MAX_UNDESIRED); prox_alarm.setUndesiredErrorMsg("Vol undes!"); prox_alarm.setCriticalErrorMsg("Vol crit!"); controllers.push_back((void *)&prox_alarm); // PIDController last, as alarms should update first PIDController pidc(false, 0, &temperature,&salt,&proximity); // ----------------------------------------------------------------------------- // Show the splash screen indicating the system is starting up LCDController::splash(); int i = 0; // Loop forever, only breaks when an alarm triggers while(1) { // Wait for a specified amount of time after each iteration Thread::wait(MAIN_THREAD_DELAY_MS); // Iterate over all available Controllers vector<void *>::iterator v = controllers.begin(); while(v != controllers.end()) { // Get the next controller Controller *c = ((Controller *)*v); if(!c->isThreaded()) cout << "Running " << c->getName() << " from main loop" << "\r\n"; // The controller only updates here if it's not threaded c->run(); // Advance to the next controller v++; } // If the alarm controller detected a dangerous situation then update lcd and possibly exit if(temp_alarm.isError() || salt_alarm.isError() || prox_alarm.isError()) { if(temp_alarm.isError()) LCDController::showError(temp_alarm.getErrorMessage().c_str()); else if(salt_alarm.isError()) LCDController::showError(salt_alarm.getErrorMessage().c_str()); else LCDController::showError(prox_alarm.getErrorMessage().c_str()); #ifdef HALT_ON_ALARM break; #endif } if(!prox_alarm.isActive()) { printf("Running pidcontroller!\r\n"); pidc.run(); } else { printf("Not running pidcontroller, prox alarm is active!\r\n"); } //Show temperature, salinity and volume of the water tank on the PC if connected through serial cout << "Temperature value: " << temperature.getValue() << "\r\n"; cout << "Salinity value: " << salt.getValue() << "\r\n"; cout << "Volume value: " << proximity.getValue() << "\r\n"; // Show either temperature and salinity or the water level given by the proximity controller if(i++ % 2) LCDController::updateScreen(temperature.getValue(), salt.getValue(), &pidc); else LCDController::updateScreen(proximity.getValue()); } return 1; }