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

Committer:
sbouber1
Date:
Wed Jun 22 11:18:20 2016 +0000
Revision:
75:763f3f0a311c
Parent:
74:05f2188cfc0b
Child:
76:5896b298b8bd
ready to test in production mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sbouber1 10:fd4670ec0806 1 #include <vector>
sbouber1 10:fd4670ec0806 2 #include <iostream>
sbouber1 10:fd4670ec0806 3
6366295 0:dab140a197e0 4 #include "SalinityController.h"
6366295 0:dab140a197e0 5 #include "TemperatureController.h"
joran 6:067e999b9c6e 6 #include "LCDController.h"
sbouber1 9:b3674516729d 7 #include "ProximityController.h"
sbouber1 57:8dc3192ff150 8 #include "SensorAlarmController.h"
sbouber1 28:f4a4ee58d57e 9 #include "PIDController.h"
sbouber1 55:ee80f248919d 10 #include "settings.h"
sbouber1 74:05f2188cfc0b 11 #include "testing.h"
sbouber1 74:05f2188cfc0b 12 #include "MockSensorController.h"
6366295 0:dab140a197e0 13 #include "mbed.h"
sbouber1 9:b3674516729d 14
sbouber1 57:8dc3192ff150 15 extern int testMain();
sbouber1 57:8dc3192ff150 16 int realMain();
sbouber1 13:1323e2c0b697 17
sbouber1 13:1323e2c0b697 18 int main() {
sbouber1 55:ee80f248919d 19 // Either test_main() or real_main() depending on TEST_MODE define in settings.h
sbouber1 13:1323e2c0b697 20 return MAIN();
sbouber1 13:1323e2c0b697 21 }
sbouber1 13:1323e2c0b697 22
sbouber1 13:1323e2c0b697 23
sbouber1 57:8dc3192ff150 24 int realMain() {
sbouber1 55:ee80f248919d 25
sbouber1 71:38bb6bf09933 26
sbouber1 57:8dc3192ff150 27 // Collection of all controllers updated in the main loop, updated in the order they were added
sbouber1 10:fd4670ec0806 28 std::vector<void *> controllers;
6366295 0:dab140a197e0 29
sbouber1 10:fd4670ec0806 30 // -----------------------------------------------------------------------------
sbouber1 10:fd4670ec0806 31 /* THE FOLLOWING CONTROLLERS CAN BE THREADED BY SETTING THE FIRST ARG TO TRUE */
sbouber1 10:fd4670ec0806 32 /* THE SECOND ARG SPECIFIES THE DELAY AFTER EACH UPDATE, ONLY WHEN THREADED */
sbouber1 10:fd4670ec0806 33 // -----------------------------------------------------------------------------
sbouber1 12:c51f3aba84fe 34
sbouber1 57:8dc3192ff150 35 TemperatureController temperature(false, 0);
sbouber1 10:fd4670ec0806 36 controllers.push_back((void*)&temperature);
sbouber1 9:b3674516729d 37
sbouber1 57:8dc3192ff150 38 ProximityController proximity(false, 0);
sbouber1 10:fd4670ec0806 39 controllers.push_back((void*)&proximity);
sbouber1 9:b3674516729d 40
sbouber1 75:763f3f0a311c 41 SalinityController salt(false, 0);
sbouber1 57:8dc3192ff150 42 controllers.push_back((void *)&salt);
sbouber1 10:fd4670ec0806 43
sbouber1 57:8dc3192ff150 44 // Add alarms to monitor sensor values
sbouber1 75:763f3f0a311c 45 SensorAlarmController temp_alarm = SensorAlarmController(false, 0, &temperature,
sbouber1 57:8dc3192ff150 46 TEMP_MIN_CRIT, TEMP_MIN_UNDESIRED, TEMP_MAX_CRIT, TEMP_MAX_UNDESIRED);
sbouber1 64:735009c4c8aa 47 temp_alarm.setUndesiredErrorMsg("Temp undes!");
sbouber1 64:735009c4c8aa 48 temp_alarm.setCriticalErrorMsg("Temp crit!");
sbouber1 57:8dc3192ff150 49 controllers.push_back((void *)&temp_alarm);
sbouber1 57:8dc3192ff150 50
sbouber1 57:8dc3192ff150 51 SensorAlarmController salt_alarm = SensorAlarmController(false, 0, &salt,
sbouber1 57:8dc3192ff150 52 SALT_MIN_CRIT, SALT_MIN_UNDESIRED, SALT_MAX_CRIT, SALT_MAX_UNDESIRED);
sbouber1 64:735009c4c8aa 53 salt_alarm.setUndesiredErrorMsg("Salt undes!");
sbouber1 64:735009c4c8aa 54 salt_alarm.setCriticalErrorMsg("Salt crit!");
sbouber1 57:8dc3192ff150 55 controllers.push_back((void *)&salt_alarm);
joran 40:1668630544c7 56
sbouber1 57:8dc3192ff150 57 SensorAlarmController prox_alarm = SensorAlarmController(false, 0, &proximity,
sbouber1 57:8dc3192ff150 58 VOLUME_MIN_CRIT, VOLUME_MIN_UNDESIRED, VOLUME_MAX_CRIT, VOLUME_MAX_UNDESIRED);
sbouber1 64:735009c4c8aa 59 prox_alarm.setUndesiredErrorMsg("Vol undes!");
sbouber1 64:735009c4c8aa 60 prox_alarm.setCriticalErrorMsg("Vol crit!");
sbouber1 57:8dc3192ff150 61 controllers.push_back((void *)&prox_alarm);
sbouber1 71:38bb6bf09933 62
sbouber1 57:8dc3192ff150 63 // PIDController last, as alarms should update first
sbouber1 57:8dc3192ff150 64 PIDController pidc(false, 0, &temperature,&salt,&proximity);
sbouber1 55:ee80f248919d 65
sbouber1 10:fd4670ec0806 66 // -----------------------------------------------------------------------------
sbouber1 9:b3674516729d 67
sbouber1 9:b3674516729d 68
sbouber1 71:38bb6bf09933 69 // TESTING STUFF
sbouber1 71:38bb6bf09933 70 //Thread::wait(5000);
sbouber1 71:38bb6bf09933 71 //while(1)
sbouber1 71:38bb6bf09933 72 // pidc.doTestingStuff(35);
sbouber1 71:38bb6bf09933 73
sbouber1 55:ee80f248919d 74 // Show the splash screen indicating the system is starting up
sbouber1 55:ee80f248919d 75 LCDController::splash();
sbouber1 10:fd4670ec0806 76
sbouber1 55:ee80f248919d 77 int i = 0;
sbouber1 9:b3674516729d 78
sbouber1 55:ee80f248919d 79 // Loop forever, only breaks when an alarm triggers
sbouber1 9:b3674516729d 80 while(1) {
sbouber1 10:fd4670ec0806 81
sbouber1 55:ee80f248919d 82 // Wait for a specified amount of time after each iteration
sbouber1 11:1a0a8fd74bc0 83 Thread::wait(MAIN_THREAD_DELAY_MS);
sbouber1 10:fd4670ec0806 84
sbouber1 55:ee80f248919d 85 // Iterate over all available Controllers
sbouber1 10:fd4670ec0806 86 vector<void *>::iterator v = controllers.begin();
sbouber1 10:fd4670ec0806 87 while(v != controllers.end()) {
sbouber1 11:1a0a8fd74bc0 88
sbouber1 11:1a0a8fd74bc0 89 // Get the next controller
sbouber1 10:fd4670ec0806 90 Controller *c = ((Controller *)*v);
sbouber1 11:1a0a8fd74bc0 91
sbouber1 61:6b5c2ddcea0c 92 if(!c->isThreaded())
sbouber1 61:6b5c2ddcea0c 93 cout << "Running " << c->getName() << " from main loop" << "\r\n";
sbouber1 11:1a0a8fd74bc0 94
sbouber1 11:1a0a8fd74bc0 95 // The controller only updates here if it's not threaded
sbouber1 10:fd4670ec0806 96 c->run();
sbouber1 11:1a0a8fd74bc0 97
sbouber1 11:1a0a8fd74bc0 98 // Advance to the next controller
sbouber1 10:fd4670ec0806 99 v++;
sbouber1 10:fd4670ec0806 100 }
sbouber1 10:fd4670ec0806 101
sbouber1 55:ee80f248919d 102 // If the alarm controller detected a dangerous situation then update lcd and possibly exit
sbouber1 75:763f3f0a311c 103 if(temp_alarm.isError() || salt_alarm.isError() || prox_alarm.isError()) {
sbouber1 59:614f713fb48b 104
sbouber1 75:763f3f0a311c 105 if(temp_alarm.isError())
sbouber1 64:735009c4c8aa 106 LCDController::showError(temp_alarm.getErrorMessage().c_str());
sbouber1 59:614f713fb48b 107 else if(salt_alarm.isError())
sbouber1 64:735009c4c8aa 108 LCDController::showError(salt_alarm.getErrorMessage().c_str());
sbouber1 75:763f3f0a311c 109 else
sbouber1 64:735009c4c8aa 110 LCDController::showError(prox_alarm.getErrorMessage().c_str());
sbouber1 59:614f713fb48b 111
sbouber1 55:ee80f248919d 112 #ifdef HALT_ON_ALARM
sbouber1 10:fd4670ec0806 113 break;
sbouber1 55:ee80f248919d 114 #endif
sbouber1 71:38bb6bf09933 115 }
sbouber1 72:f8c4f731f0fe 116
sbouber1 74:05f2188cfc0b 117 if(!prox_alarm.isActive()) {
sbouber1 74:05f2188cfc0b 118 printf("Running pidcontroller!\r\n");
sbouber1 72:f8c4f731f0fe 119 pidc.run();
sbouber1 74:05f2188cfc0b 120 } else {
sbouber1 74:05f2188cfc0b 121 printf("Not running pidcontroller, prox alarm is active!\r\n");
sbouber1 74:05f2188cfc0b 122 }
sbouber1 9:b3674516729d 123
sbouber1 9:b3674516729d 124
sbouber1 55:ee80f248919d 125 //Show temperature, salinity and volume of the water tank on the PC if connected through serial
sbouber1 55:ee80f248919d 126 cout << "Temperature value: " << temperature.getValue() << "\r\n";
sbouber1 55:ee80f248919d 127 cout << "Salinity value: " << salt.getValue() << "\r\n";
sbouber1 55:ee80f248919d 128 cout << "Volume value: " << proximity.getValue() << "\r\n";
sbouber1 55:ee80f248919d 129
sbouber1 11:1a0a8fd74bc0 130 // Show either temperature and salinity or the water level given by the proximity controller
sbouber1 10:fd4670ec0806 131 if(i++ % 2)
sbouber1 55:ee80f248919d 132 LCDController::updateScreen(temperature.getValue(), salt.getValue(), &pidc);
sbouber1 10:fd4670ec0806 133 else
sbouber1 55:ee80f248919d 134 LCDController::updateScreen(proximity.getValue());
sbouber1 9:b3674516729d 135
6366295 0:dab140a197e0 136 }
sbouber1 35:c9261391a995 137
sbouber1 35:c9261391a995 138 return 1;
6366295 0:dab140a197e0 139 }