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@72:f8c4f731f0fe, 2016-06-21 (annotated)
- Committer:
- sbouber1
- Date:
- Tue Jun 21 13:48:28 2016 +0000
- Revision:
- 72:f8c4f731f0fe
- Parent:
- 71:38bb6bf09933
- Child:
- 74:05f2188cfc0b
pid controller does not run when prox alarm is active (overflow/underflow)
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 | 71:38bb6bf09933 | 25 | |
sbouber1 | 57:8dc3192ff150 | 26 | // Collection of all controllers updated in the main loop, updated in the order they were added |
sbouber1 | 10:fd4670ec0806 | 27 | std::vector<void *> controllers; |
6366295 | 0:dab140a197e0 | 28 | |
sbouber1 | 10:fd4670ec0806 | 29 | // ----------------------------------------------------------------------------- |
sbouber1 | 10:fd4670ec0806 | 30 | /* THE FOLLOWING CONTROLLERS CAN BE THREADED BY SETTING THE FIRST ARG TO TRUE */ |
sbouber1 | 10:fd4670ec0806 | 31 | /* THE SECOND ARG SPECIFIES THE DELAY AFTER EACH UPDATE, ONLY WHEN THREADED */ |
sbouber1 | 10:fd4670ec0806 | 32 | // ----------------------------------------------------------------------------- |
sbouber1 | 12:c51f3aba84fe | 33 | |
sbouber1 | 57:8dc3192ff150 | 34 | TemperatureController temperature(false, 0); |
sbouber1 | 10:fd4670ec0806 | 35 | controllers.push_back((void*)&temperature); |
sbouber1 | 9:b3674516729d | 36 | |
sbouber1 | 57:8dc3192ff150 | 37 | ProximityController proximity(false, 0); |
sbouber1 | 10:fd4670ec0806 | 38 | controllers.push_back((void*)&proximity); |
sbouber1 | 9:b3674516729d | 39 | |
sbouber1 | 57:8dc3192ff150 | 40 | SalinityController salt(false, 0); |
sbouber1 | 57:8dc3192ff150 | 41 | controllers.push_back((void *)&salt); |
sbouber1 | 10:fd4670ec0806 | 42 | |
sbouber1 | 57:8dc3192ff150 | 43 | // Add alarms to monitor sensor values |
sbouber1 | 72:f8c4f731f0fe | 44 | /*SensorAlarmController temp_alarm = SensorAlarmController(false, 0, &temperature, |
sbouber1 | 57:8dc3192ff150 | 45 | TEMP_MIN_CRIT, TEMP_MIN_UNDESIRED, TEMP_MAX_CRIT, TEMP_MAX_UNDESIRED); |
sbouber1 | 64:735009c4c8aa | 46 | temp_alarm.setUndesiredErrorMsg("Temp undes!"); |
sbouber1 | 64:735009c4c8aa | 47 | temp_alarm.setCriticalErrorMsg("Temp crit!"); |
sbouber1 | 57:8dc3192ff150 | 48 | controllers.push_back((void *)&temp_alarm); |
sbouber1 | 57:8dc3192ff150 | 49 | |
sbouber1 | 57:8dc3192ff150 | 50 | SensorAlarmController salt_alarm = SensorAlarmController(false, 0, &salt, |
sbouber1 | 57:8dc3192ff150 | 51 | SALT_MIN_CRIT, SALT_MIN_UNDESIRED, SALT_MAX_CRIT, SALT_MAX_UNDESIRED); |
sbouber1 | 64:735009c4c8aa | 52 | salt_alarm.setUndesiredErrorMsg("Salt undes!"); |
sbouber1 | 64:735009c4c8aa | 53 | salt_alarm.setCriticalErrorMsg("Salt crit!"); |
sbouber1 | 57:8dc3192ff150 | 54 | controllers.push_back((void *)&salt_alarm); |
sbouber1 | 72:f8c4f731f0fe | 55 | */ |
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 | 72:f8c4f731f0fe | 103 | /*if(temp_alarm.isError() || salt_alarm.isError() || prox_alarm.isError()) { |
sbouber1 | 59:614f713fb48b | 104 | |
sbouber1 | 72:f8c4f731f0fe | 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 | 72:f8c4f731f0fe | 109 | else*/ |
sbouber1 | 72:f8c4f731f0fe | 110 | |
sbouber1 | 72:f8c4f731f0fe | 111 | if(prox_alarm.isError()) { |
sbouber1 | 64:735009c4c8aa | 112 | LCDController::showError(prox_alarm.getErrorMessage().c_str()); |
sbouber1 | 59:614f713fb48b | 113 | |
sbouber1 | 55:ee80f248919d | 114 | #ifdef HALT_ON_ALARM |
sbouber1 | 10:fd4670ec0806 | 115 | break; |
sbouber1 | 55:ee80f248919d | 116 | #endif |
sbouber1 | 71:38bb6bf09933 | 117 | } |
sbouber1 | 72:f8c4f731f0fe | 118 | |
sbouber1 | 72:f8c4f731f0fe | 119 | if(!prox_alarm.isActive()) |
sbouber1 | 72:f8c4f731f0fe | 120 | pidc.run(); |
sbouber1 | 9:b3674516729d | 121 | |
sbouber1 | 9:b3674516729d | 122 | |
sbouber1 | 55:ee80f248919d | 123 | //Show temperature, salinity and volume of the water tank on the PC if connected through serial |
sbouber1 | 55:ee80f248919d | 124 | cout << "Temperature value: " << temperature.getValue() << "\r\n"; |
sbouber1 | 55:ee80f248919d | 125 | cout << "Salinity value: " << salt.getValue() << "\r\n"; |
sbouber1 | 55:ee80f248919d | 126 | cout << "Volume value: " << proximity.getValue() << "\r\n"; |
sbouber1 | 55:ee80f248919d | 127 | |
sbouber1 | 11:1a0a8fd74bc0 | 128 | // Show either temperature and salinity or the water level given by the proximity controller |
sbouber1 | 10:fd4670ec0806 | 129 | if(i++ % 2) |
sbouber1 | 55:ee80f248919d | 130 | LCDController::updateScreen(temperature.getValue(), salt.getValue(), &pidc); |
sbouber1 | 10:fd4670ec0806 | 131 | else |
sbouber1 | 55:ee80f248919d | 132 | LCDController::updateScreen(proximity.getValue()); |
sbouber1 | 9:b3674516729d | 133 | |
6366295 | 0:dab140a197e0 | 134 | } |
sbouber1 | 35:c9261391a995 | 135 | |
sbouber1 | 35:c9261391a995 | 136 | return 1; |
6366295 | 0:dab140a197e0 | 137 | } |