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@40:1668630544c7, 2016-06-15 (annotated)
- Committer:
- joran
- Date:
- Wed Jun 15 07:25:53 2016 +0000
- Revision:
- 40:1668630544c7
- Parent:
- 35:c9261391a995
- Child:
- 41:dce2c29f49cd
Do not raise alarm for temp if we are heating, do not raise alarm for salt if we are pumping. I might have broken testing.
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 | 10:fd4670ec0806 | 8 | #include "AlarmController.h" |
sbouber1 | 12:c51f3aba84fe | 9 | #include "MockSensorController.h" |
sbouber1 | 28:f4a4ee58d57e | 10 | #include "PIDController.h" |
6366295 | 0:dab140a197e0 | 11 | |
6366295 | 0:dab140a197e0 | 12 | #include "mbed.h" |
sbouber1 | 9:b3674516729d | 13 | #include "rtos.h" |
sbouber1 | 13:1323e2c0b697 | 14 | #include "testing.h" |
sbouber1 | 9:b3674516729d | 15 | |
sbouber1 | 11:1a0a8fd74bc0 | 16 | #define MAIN_THREAD_DELAY_MS 1000 |
6366295 | 0:dab140a197e0 | 17 | |
sbouber1 | 13:1323e2c0b697 | 18 | int main(); |
sbouber1 | 13:1323e2c0b697 | 19 | int test_main(); |
sbouber1 | 13:1323e2c0b697 | 20 | int real_main(); |
sbouber1 | 13:1323e2c0b697 | 21 | |
sbouber1 | 13:1323e2c0b697 | 22 | |
sbouber1 | 12:c51f3aba84fe | 23 | |
sbouber1 | 12:c51f3aba84fe | 24 | |
sbouber1 | 12:c51f3aba84fe | 25 | MOCK(temp_mock, 20.0+0.01*i) |
sbouber1 | 12:c51f3aba84fe | 26 | MOCK(salt_mock, 3.0+0.001*i) |
sbouber1 | 12:c51f3aba84fe | 27 | MOCK(prox_mock, 10.0f) |
sbouber1 | 12:c51f3aba84fe | 28 | |
sbouber1 | 13:1323e2c0b697 | 29 | |
sbouber1 | 13:1323e2c0b697 | 30 | int main() { |
sbouber1 | 13:1323e2c0b697 | 31 | return MAIN(); |
sbouber1 | 13:1323e2c0b697 | 32 | } |
sbouber1 | 13:1323e2c0b697 | 33 | |
sbouber1 | 19:ee89eabe1fa2 | 34 | extern int test_main(); |
sbouber1 | 13:1323e2c0b697 | 35 | |
sbouber1 | 13:1323e2c0b697 | 36 | int real_main() |
6366295 | 0:dab140a197e0 | 37 | { |
sbouber1 | 10:fd4670ec0806 | 38 | std::vector<void *> controllers; |
6366295 | 0:dab140a197e0 | 39 | |
sbouber1 | 10:fd4670ec0806 | 40 | // ----------------------------------------------------------------------------- |
sbouber1 | 10:fd4670ec0806 | 41 | /* THE FOLLOWING CONTROLLERS CAN BE THREADED BY SETTING THE FIRST ARG TO TRUE */ |
sbouber1 | 10:fd4670ec0806 | 42 | /* THE SECOND ARG SPECIFIES THE DELAY AFTER EACH UPDATE, ONLY WHEN THREADED */ |
sbouber1 | 10:fd4670ec0806 | 43 | // ----------------------------------------------------------------------------- |
sbouber1 | 12:c51f3aba84fe | 44 | |
sbouber1 | 12:c51f3aba84fe | 45 | //TemperatureController temperature(false,0); |
sbouber1 | 12:c51f3aba84fe | 46 | MockSensorController temperature(false,0,temp_mock); |
sbouber1 | 10:fd4670ec0806 | 47 | controllers.push_back((void*)&temperature); |
sbouber1 | 9:b3674516729d | 48 | |
sbouber1 | 12:c51f3aba84fe | 49 | //ProximityController proximity(false,0); |
sbouber1 | 12:c51f3aba84fe | 50 | MockSensorController proximity(false,0,prox_mock); |
sbouber1 | 10:fd4670ec0806 | 51 | controllers.push_back((void*)&proximity); |
sbouber1 | 9:b3674516729d | 52 | |
sbouber1 | 12:c51f3aba84fe | 53 | //SalinityController salt(false,0); |
sbouber1 | 12:c51f3aba84fe | 54 | MockSensorController salt(false,0,salt_mock); |
sbouber1 | 10:fd4670ec0806 | 55 | controllers.push_back((void *)&salt); |
sbouber1 | 10:fd4670ec0806 | 56 | |
joran | 40:1668630544c7 | 57 | PIDController pidc(false,0,&temperature,&salt,&proximity); |
joran | 40:1668630544c7 | 58 | controllers.push_back((void *)&pidc); |
joran | 40:1668630544c7 | 59 | |
joran | 40:1668630544c7 | 60 | AlarmController alarm(false,0,&temperature,&salt,&proximity, &pidc); |
sbouber1 | 10:fd4670ec0806 | 61 | controllers.push_back((void *)&alarm); |
sbouber1 | 28:f4a4ee58d57e | 62 | |
joran | 40:1668630544c7 | 63 | |
sbouber1 | 10:fd4670ec0806 | 64 | // ----------------------------------------------------------------------------- |
sbouber1 | 9:b3674516729d | 65 | |
sbouber1 | 9:b3674516729d | 66 | |
sbouber1 | 10:fd4670ec0806 | 67 | // Only the main thread calls the LCDController, it doesn't matter if there is a small delay |
joran | 6:067e999b9c6e | 68 | LCDController lcd; |
sbouber1 | 10:fd4670ec0806 | 69 | lcd.splash(); |
sbouber1 | 9:b3674516729d | 70 | |
sbouber1 | 9:b3674516729d | 71 | float s = 0.0; |
sbouber1 | 9:b3674516729d | 72 | float t = 0.0; |
sbouber1 | 10:fd4670ec0806 | 73 | float d = 0.0; |
sbouber1 | 10:fd4670ec0806 | 74 | |
sbouber1 | 10:fd4670ec0806 | 75 | int i = 0; |
sbouber1 | 9:b3674516729d | 76 | |
sbouber1 | 9:b3674516729d | 77 | while(1) { |
sbouber1 | 10:fd4670ec0806 | 78 | |
sbouber1 | 11:1a0a8fd74bc0 | 79 | Thread::wait(MAIN_THREAD_DELAY_MS); |
sbouber1 | 10:fd4670ec0806 | 80 | |
sbouber1 | 10:fd4670ec0806 | 81 | vector<void *>::iterator v = controllers.begin(); |
sbouber1 | 10:fd4670ec0806 | 82 | while(v != controllers.end()) { |
sbouber1 | 11:1a0a8fd74bc0 | 83 | |
sbouber1 | 11:1a0a8fd74bc0 | 84 | // Get the next controller |
sbouber1 | 10:fd4670ec0806 | 85 | Controller *c = ((Controller *)*v); |
sbouber1 | 11:1a0a8fd74bc0 | 86 | |
sbouber1 | 10:fd4670ec0806 | 87 | if(!c->is_threaded()) |
sbouber1 | 10:fd4670ec0806 | 88 | cout << "Running " << c->get_name() << " from main loop" << "\r\n"; |
sbouber1 | 11:1a0a8fd74bc0 | 89 | |
sbouber1 | 11:1a0a8fd74bc0 | 90 | // The controller only updates here if it's not threaded |
sbouber1 | 10:fd4670ec0806 | 91 | c->run(); |
sbouber1 | 11:1a0a8fd74bc0 | 92 | |
sbouber1 | 11:1a0a8fd74bc0 | 93 | // Advance to the next controller |
sbouber1 | 10:fd4670ec0806 | 94 | v++; |
sbouber1 | 10:fd4670ec0806 | 95 | } |
sbouber1 | 10:fd4670ec0806 | 96 | |
sbouber1 | 11:1a0a8fd74bc0 | 97 | // if the alarm controller detected a dangerous situation then update lcd and exit |
sbouber1 | 11:1a0a8fd74bc0 | 98 | // TODO maybe signal threads to terminate |
sbouber1 | 10:fd4670ec0806 | 99 | if(alarm.is_error()) { |
sbouber1 | 11:1a0a8fd74bc0 | 100 | lcd.error(alarm.get_error_message()); |
sbouber1 | 10:fd4670ec0806 | 101 | break; |
sbouber1 | 10:fd4670ec0806 | 102 | } |
sbouber1 | 9:b3674516729d | 103 | |
sbouber1 | 9:b3674516729d | 104 | t = temperature.getValue(); |
sbouber1 | 10:fd4670ec0806 | 105 | d = proximity.getValue(); |
sbouber1 | 10:fd4670ec0806 | 106 | s = salt.getValue(); |
sbouber1 | 9:b3674516729d | 107 | |
sbouber1 | 9:b3674516729d | 108 | printf("Grabbing temperature value from main thread: %f\r\n", t); |
sbouber1 | 10:fd4670ec0806 | 109 | printf("Grabbing salinity value from main thread: %f\r\n", s); |
sbouber1 | 10:fd4670ec0806 | 110 | printf("Grabbing distance value from main thread: %f\r\n", d); |
sbouber1 | 10:fd4670ec0806 | 111 | |
sbouber1 | 9:b3674516729d | 112 | |
sbouber1 | 11:1a0a8fd74bc0 | 113 | // Show either temperature and salinity or the water level given by the proximity controller |
sbouber1 | 10:fd4670ec0806 | 114 | if(i++ % 2) |
sbouber1 | 10:fd4670ec0806 | 115 | lcd.updateScreen(t, s); |
sbouber1 | 10:fd4670ec0806 | 116 | else |
sbouber1 | 10:fd4670ec0806 | 117 | lcd.updateScreen(d); |
sbouber1 | 9:b3674516729d | 118 | |
6366295 | 0:dab140a197e0 | 119 | } |
sbouber1 | 35:c9261391a995 | 120 | |
sbouber1 | 35:c9261391a995 | 121 | return 1; |
6366295 | 0:dab140a197e0 | 122 | } |