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:
Sun Jun 19 22:21:08 2016 +0000
Revision:
57:8dc3192ff150
Parent:
55:ee80f248919d
Child:
59:614f713fb48b
update

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"
6366295 0:dab140a197e0 11
6366295 0:dab140a197e0 12 #include "mbed.h"
sbouber1 9:b3674516729d 13
sbouber1 57:8dc3192ff150 14 extern int testMain();
sbouber1 57:8dc3192ff150 15 int realMain();
sbouber1 13:1323e2c0b697 16
sbouber1 13:1323e2c0b697 17 int main() {
sbouber1 55:ee80f248919d 18 // Either test_main() or real_main() depending on TEST_MODE define in settings.h
sbouber1 13:1323e2c0b697 19 return MAIN();
sbouber1 13:1323e2c0b697 20 }
sbouber1 13:1323e2c0b697 21
sbouber1 13:1323e2c0b697 22
sbouber1 57:8dc3192ff150 23 int realMain() {
sbouber1 55:ee80f248919d 24
sbouber1 57:8dc3192ff150 25 // Collection of all controllers updated in the main loop, updated in the order they were added
sbouber1 10:fd4670ec0806 26 std::vector<void *> controllers;
6366295 0:dab140a197e0 27
sbouber1 10:fd4670ec0806 28 // -----------------------------------------------------------------------------
sbouber1 10:fd4670ec0806 29 /* THE FOLLOWING CONTROLLERS CAN BE THREADED BY SETTING THE FIRST ARG TO TRUE */
sbouber1 10:fd4670ec0806 30 /* THE SECOND ARG SPECIFIES THE DELAY AFTER EACH UPDATE, ONLY WHEN THREADED */
sbouber1 10:fd4670ec0806 31 // -----------------------------------------------------------------------------
sbouber1 12:c51f3aba84fe 32
sbouber1 57:8dc3192ff150 33 TemperatureController temperature(false, 0);
sbouber1 10:fd4670ec0806 34 controllers.push_back((void*)&temperature);
sbouber1 9:b3674516729d 35
sbouber1 57:8dc3192ff150 36 ProximityController proximity(false, 0);
sbouber1 10:fd4670ec0806 37 controllers.push_back((void*)&proximity);
sbouber1 9:b3674516729d 38
sbouber1 57:8dc3192ff150 39 SalinityController salt(false, 0);
sbouber1 57:8dc3192ff150 40 controllers.push_back((void *)&salt);
sbouber1 10:fd4670ec0806 41
sbouber1 57:8dc3192ff150 42 // Add alarms to monitor sensor values
sbouber1 57:8dc3192ff150 43 SensorAlarmController temp_alarm = SensorAlarmController(false, 0, &temperature,
sbouber1 57:8dc3192ff150 44 TEMP_MIN_CRIT, TEMP_MIN_UNDESIRED, TEMP_MAX_CRIT, TEMP_MAX_UNDESIRED);
sbouber1 57:8dc3192ff150 45 controllers.push_back((void *)&temp_alarm);
sbouber1 57:8dc3192ff150 46
sbouber1 57:8dc3192ff150 47 SensorAlarmController salt_alarm = SensorAlarmController(false, 0, &salt,
sbouber1 57:8dc3192ff150 48 SALT_MIN_CRIT, SALT_MIN_UNDESIRED, SALT_MAX_CRIT, SALT_MAX_UNDESIRED);
sbouber1 57:8dc3192ff150 49 controllers.push_back((void *)&salt_alarm);
joran 40:1668630544c7 50
sbouber1 57:8dc3192ff150 51 SensorAlarmController prox_alarm = SensorAlarmController(false, 0, &proximity,
sbouber1 57:8dc3192ff150 52 VOLUME_MIN_CRIT, VOLUME_MIN_UNDESIRED, VOLUME_MAX_CRIT, VOLUME_MAX_UNDESIRED);
sbouber1 57:8dc3192ff150 53 controllers.push_back((void *)&prox_alarm);
sbouber1 57:8dc3192ff150 54
sbouber1 57:8dc3192ff150 55 // PIDController last, as alarms should update first
sbouber1 57:8dc3192ff150 56 PIDController pidc(false, 0, &temperature,&salt,&proximity);
sbouber1 57:8dc3192ff150 57 controllers.push_back((void *)&pidc);
sbouber1 55:ee80f248919d 58
sbouber1 10:fd4670ec0806 59 // -----------------------------------------------------------------------------
sbouber1 9:b3674516729d 60
sbouber1 9:b3674516729d 61
sbouber1 55:ee80f248919d 62 // Show the splash screen indicating the system is starting up
sbouber1 55:ee80f248919d 63 LCDController::splash();
sbouber1 10:fd4670ec0806 64
sbouber1 55:ee80f248919d 65 int i = 0;
sbouber1 9:b3674516729d 66
sbouber1 55:ee80f248919d 67 // Loop forever, only breaks when an alarm triggers
sbouber1 9:b3674516729d 68 while(1) {
sbouber1 10:fd4670ec0806 69
sbouber1 55:ee80f248919d 70 // Wait for a specified amount of time after each iteration
sbouber1 11:1a0a8fd74bc0 71 Thread::wait(MAIN_THREAD_DELAY_MS);
sbouber1 10:fd4670ec0806 72
sbouber1 55:ee80f248919d 73 // Iterate over all available Controllers
sbouber1 10:fd4670ec0806 74 vector<void *>::iterator v = controllers.begin();
sbouber1 10:fd4670ec0806 75 while(v != controllers.end()) {
sbouber1 11:1a0a8fd74bc0 76
sbouber1 11:1a0a8fd74bc0 77 // Get the next controller
sbouber1 10:fd4670ec0806 78 Controller *c = ((Controller *)*v);
sbouber1 11:1a0a8fd74bc0 79
sbouber1 10:fd4670ec0806 80 if(!c->is_threaded())
sbouber1 10:fd4670ec0806 81 cout << "Running " << c->get_name() << " from main loop" << "\r\n";
sbouber1 11:1a0a8fd74bc0 82
sbouber1 11:1a0a8fd74bc0 83 // The controller only updates here if it's not threaded
sbouber1 10:fd4670ec0806 84 c->run();
sbouber1 11:1a0a8fd74bc0 85
sbouber1 11:1a0a8fd74bc0 86 // Advance to the next controller
sbouber1 10:fd4670ec0806 87 v++;
sbouber1 10:fd4670ec0806 88 }
sbouber1 10:fd4670ec0806 89
sbouber1 55:ee80f248919d 90 // If the alarm controller detected a dangerous situation then update lcd and possibly exit
sbouber1 57:8dc3192ff150 91 // TODO move LCD updating to alarm controller
sbouber1 57:8dc3192ff150 92 if(temp_alarm.isError() || salt_alarm.isError() || prox_alarm.isError()) {
sbouber1 57:8dc3192ff150 93 //LCDController::error(alarm.get_error_message());
sbouber1 55:ee80f248919d 94 #ifdef HALT_ON_ALARM
sbouber1 10:fd4670ec0806 95 break;
sbouber1 55:ee80f248919d 96 #endif
sbouber1 55:ee80f248919d 97 }
sbouber1 9:b3674516729d 98
sbouber1 9:b3674516729d 99
sbouber1 55:ee80f248919d 100 //Show temperature, salinity and volume of the water tank on the PC if connected through serial
sbouber1 55:ee80f248919d 101 cout << "Temperature value: " << temperature.getValue() << "\r\n";
sbouber1 55:ee80f248919d 102 cout << "Salinity value: " << salt.getValue() << "\r\n";
sbouber1 55:ee80f248919d 103 cout << "Volume value: " << proximity.getValue() << "\r\n";
sbouber1 55:ee80f248919d 104
sbouber1 11:1a0a8fd74bc0 105 // Show either temperature and salinity or the water level given by the proximity controller
sbouber1 10:fd4670ec0806 106 if(i++ % 2)
sbouber1 55:ee80f248919d 107 LCDController::updateScreen(temperature.getValue(), salt.getValue(), &pidc);
sbouber1 10:fd4670ec0806 108 else
sbouber1 55:ee80f248919d 109 LCDController::updateScreen(proximity.getValue());
sbouber1 9:b3674516729d 110
6366295 0:dab140a197e0 111 }
sbouber1 35:c9261391a995 112
sbouber1 35:c9261391a995 113 return 1;
6366295 0:dab140a197e0 114 }