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

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?

UserRevisionLine numberNew 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 }