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@12:c51f3aba84fe, 2016-06-11 (annotated)
- Committer:
- sbouber1
- Date:
- Sat Jun 11 10:14:40 2016 +0000
- Revision:
- 12:c51f3aba84fe
- Parent:
- 11:1a0a8fd74bc0
- Child:
- 13:1323e2c0b697
mock sensors
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" |
6366295 | 0:dab140a197e0 | 11 | |
6366295 | 0:dab140a197e0 | 12 | #include "mbed.h" |
sbouber1 | 9:b3674516729d | 13 | #include "rtos.h" |
sbouber1 | 9:b3674516729d | 14 | |
sbouber1 | 11:1a0a8fd74bc0 | 15 | #define MAIN_THREAD_DELAY_MS 1000 |
6366295 | 0:dab140a197e0 | 16 | |
sbouber1 | 12:c51f3aba84fe | 17 | #define MOCK(N, F) static inline float N(int i) {return (F);} |
sbouber1 | 12:c51f3aba84fe | 18 | |
sbouber1 | 12:c51f3aba84fe | 19 | |
sbouber1 | 12:c51f3aba84fe | 20 | MOCK(temp_mock, 20.0+0.01*i) |
sbouber1 | 12:c51f3aba84fe | 21 | MOCK(salt_mock, 3.0+0.001*i) |
sbouber1 | 12:c51f3aba84fe | 22 | MOCK(prox_mock, 10.0f) |
sbouber1 | 12:c51f3aba84fe | 23 | |
6366295 | 0:dab140a197e0 | 24 | int main() |
6366295 | 0:dab140a197e0 | 25 | { |
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 | 12:c51f3aba84fe | 33 | //TemperatureController temperature(false,0); |
sbouber1 | 12:c51f3aba84fe | 34 | MockSensorController temperature(false,0,temp_mock); |
sbouber1 | 10:fd4670ec0806 | 35 | controllers.push_back((void*)&temperature); |
sbouber1 | 9:b3674516729d | 36 | |
sbouber1 | 12:c51f3aba84fe | 37 | //ProximityController proximity(false,0); |
sbouber1 | 12:c51f3aba84fe | 38 | MockSensorController proximity(false,0,prox_mock); |
sbouber1 | 10:fd4670ec0806 | 39 | controllers.push_back((void*)&proximity); |
sbouber1 | 9:b3674516729d | 40 | |
sbouber1 | 12:c51f3aba84fe | 41 | //SalinityController salt(false,0); |
sbouber1 | 12:c51f3aba84fe | 42 | MockSensorController salt(false,0,salt_mock); |
sbouber1 | 10:fd4670ec0806 | 43 | controllers.push_back((void *)&salt); |
sbouber1 | 10:fd4670ec0806 | 44 | |
sbouber1 | 10:fd4670ec0806 | 45 | AlarmController alarm(false,0,&temperature,&salt,&proximity); |
sbouber1 | 10:fd4670ec0806 | 46 | controllers.push_back((void *)&alarm); |
sbouber1 | 10:fd4670ec0806 | 47 | // ----------------------------------------------------------------------------- |
sbouber1 | 9:b3674516729d | 48 | |
sbouber1 | 9:b3674516729d | 49 | |
6366295 | 2:f6ebc225f232 | 50 | MotorController motor; |
sbouber1 | 10:fd4670ec0806 | 51 | |
sbouber1 | 10:fd4670ec0806 | 52 | // Only the main thread calls the LCDController, it doesn't matter if there is a small delay |
joran | 6:067e999b9c6e | 53 | LCDController lcd; |
sbouber1 | 10:fd4670ec0806 | 54 | lcd.splash(); |
sbouber1 | 9:b3674516729d | 55 | |
sbouber1 | 9:b3674516729d | 56 | float s = 0.0; |
sbouber1 | 9:b3674516729d | 57 | float t = 0.0; |
sbouber1 | 10:fd4670ec0806 | 58 | float d = 0.0; |
sbouber1 | 10:fd4670ec0806 | 59 | |
sbouber1 | 10:fd4670ec0806 | 60 | int i = 0; |
sbouber1 | 9:b3674516729d | 61 | |
sbouber1 | 9:b3674516729d | 62 | while(1) { |
sbouber1 | 10:fd4670ec0806 | 63 | |
sbouber1 | 11:1a0a8fd74bc0 | 64 | Thread::wait(MAIN_THREAD_DELAY_MS); |
sbouber1 | 10:fd4670ec0806 | 65 | |
sbouber1 | 10:fd4670ec0806 | 66 | vector<void *>::iterator v = controllers.begin(); |
sbouber1 | 10:fd4670ec0806 | 67 | while(v != controllers.end()) { |
sbouber1 | 11:1a0a8fd74bc0 | 68 | |
sbouber1 | 11:1a0a8fd74bc0 | 69 | // Get the next controller |
sbouber1 | 10:fd4670ec0806 | 70 | Controller *c = ((Controller *)*v); |
sbouber1 | 11:1a0a8fd74bc0 | 71 | |
sbouber1 | 10:fd4670ec0806 | 72 | if(!c->is_threaded()) |
sbouber1 | 10:fd4670ec0806 | 73 | cout << "Running " << c->get_name() << " from main loop" << "\r\n"; |
sbouber1 | 11:1a0a8fd74bc0 | 74 | |
sbouber1 | 11:1a0a8fd74bc0 | 75 | // The controller only updates here if it's not threaded |
sbouber1 | 10:fd4670ec0806 | 76 | c->run(); |
sbouber1 | 11:1a0a8fd74bc0 | 77 | |
sbouber1 | 11:1a0a8fd74bc0 | 78 | // Advance to the next controller |
sbouber1 | 10:fd4670ec0806 | 79 | v++; |
sbouber1 | 10:fd4670ec0806 | 80 | } |
sbouber1 | 10:fd4670ec0806 | 81 | |
sbouber1 | 11:1a0a8fd74bc0 | 82 | // if the alarm controller detected a dangerous situation then update lcd and exit |
sbouber1 | 11:1a0a8fd74bc0 | 83 | // TODO maybe signal threads to terminate |
sbouber1 | 10:fd4670ec0806 | 84 | if(alarm.is_error()) { |
sbouber1 | 11:1a0a8fd74bc0 | 85 | lcd.error(alarm.get_error_message()); |
sbouber1 | 10:fd4670ec0806 | 86 | break; |
sbouber1 | 10:fd4670ec0806 | 87 | } |
sbouber1 | 9:b3674516729d | 88 | |
sbouber1 | 9:b3674516729d | 89 | t = temperature.getValue(); |
sbouber1 | 10:fd4670ec0806 | 90 | d = proximity.getValue(); |
sbouber1 | 10:fd4670ec0806 | 91 | s = salt.getValue(); |
sbouber1 | 9:b3674516729d | 92 | |
sbouber1 | 9:b3674516729d | 93 | printf("Grabbing temperature value from main thread: %f\r\n", t); |
sbouber1 | 10:fd4670ec0806 | 94 | printf("Grabbing salinity value from main thread: %f\r\n", s); |
sbouber1 | 10:fd4670ec0806 | 95 | printf("Grabbing distance value from main thread: %f\r\n", d); |
sbouber1 | 10:fd4670ec0806 | 96 | |
sbouber1 | 9:b3674516729d | 97 | |
sbouber1 | 11:1a0a8fd74bc0 | 98 | // Show either temperature and salinity or the water level given by the proximity controller |
sbouber1 | 10:fd4670ec0806 | 99 | if(i++ % 2) |
sbouber1 | 10:fd4670ec0806 | 100 | lcd.updateScreen(t, s); |
sbouber1 | 10:fd4670ec0806 | 101 | else |
sbouber1 | 10:fd4670ec0806 | 102 | lcd.updateScreen(d); |
sbouber1 | 9:b3674516729d | 103 | |
6366295 | 0:dab140a197e0 | 104 | } |
6366295 | 0:dab140a197e0 | 105 | } |