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