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@57:8dc3192ff150, 2016-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |