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:
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?

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"
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 }