dashboardv4solarboat

Dependencies:   mbed

Fork of mbed_blinky by Mbed

Revision:
16:21658c9e697c
Parent:
4:81cea7a352b0
Child:
17:f8d3d1f0d8d1
--- a/main.cpp	Wed Jan 18 13:46:04 2017 +0000
+++ b/main.cpp	Tue May 02 17:25:18 2017 +0000
@@ -1,12 +1,202 @@
-#include "mbed.h"
+#include "mbed.h"              
+#include "oled_driver.h"            
+
+#define MENU_TIMEOUT_TIME       50.0            //menu timeout in seconds                   [s]
+#define MAX_POWER_IN            1500            //max power in for power bars               [W]
+#define MAX_POWER_OUT           2000            //max power out for power bars              [W]
+#define MAX_TEMP_MOTOR          80              //alert when exceeding temp                 ['C]
+#define MAX_TEMP_BATTERY        60              //alert when exceeding temp                 ['C]
+#define MAX_REVERSE_VELOCITY    20              //max velocity for allowing reverse         [km/h]
+#define MIN_SOLAR_PANEL_VOLTAGE 30              //min voltage provided by solar panels      [V]
+#define MIN_FLY_VELOCITY        15              //min velocity to request fly               [km/h]
+#define BATTERY_LOW_ALERT       10              //min battery percentage                    [%, min]
+
+//digital and analog inputs
+DigitalIn reverse_button(D14);
+DigitalIn menu_button(D15);
+DigitalIn fly_button(D12);   
+AnalogIn analog_throttle(A5);      
 
-DigitalOut myled(LED1);
+//global variables
+int battery_percentage_left = 0;
+int battery_minutes_left = 0;
+int race_percentage_left = 0;
+int race_minutes_left = 0;
+int race_minutes_done = 0;
+int throttle_power = 0;
+int advised_throttle_power = 0;
+int power_in = 0;
+int power_out = 0;
+int voltage_in = 0;
+int motor_temperature = 0;
+int battery_temperature = 0;
+int velocity = 0;
+int rpm_motor = 0;
+int checkIfButtonPressed(int current_menu);
+int battery_voltage = 0;
+int current_menu = 0;
+time_t start = time(0);
+void readEssentials();
+bool menu_button_pressed = true;
+bool reverse_button_pressed = true;
+bool fly_request = true;
+bool transmitting = false;
+bool reverse = false;
+
+int main()
+{
+    powerOnOLED(1);
+    powerOnOLED(2);
+    powerOnOLED(3);
+
+    clearDisplay(1);
+    clearDisplay(2);
+    clearDisplay(3);
+
+    welcomeScreen();
+
+    while(1) {
+
+        //listen to menu button
+        current_menu = checkIfButtonPressed(current_menu);
+        //listen to steering wheel at all time
+        readEssentials();
+        //check for errors at all time
+        checkForErrors(current_menu, velocity, battery_temperature, motor_temperature, MAX_TEMP_MOTOR, MAX_TEMP_BATTERY, battery_percentage_left, battery_minutes_left, BATTERY_LOW_ALERT);
+        
+        switch (current_menu) {
 
-int main() {
-    while(1) {
-        myled = 1;
-        wait(0.2);
-        myled = 0;
-        wait(0.2);
+            case 0:
+                //circular display (1)
+                //updateProgressCircle(1, race_percentage_left);
+                race_minutes_done = time(0)/60;         //TODO give starting point
+                showRaceMinutesDone(race_minutes_done);
+                showRaceMinutesLeft(race_minutes_left);
+                showRacePercentageLeft(race_percentage_left);
+                
+                //main display (2)
+                displayTime();
+                checkTransmitter(transmitting);
+                displayVelocity(velocity);
+                displayThrottle(throttle_power, reverse);
+                displayAdvisedThrottle(advised_throttle_power);
+                updatePowerBars(power_out, power_in, MAX_POWER_OUT, MAX_POWER_IN);
+                
+                //circular display (3)
+                //updateProgressCircle(3, battery_percentage_left);
+                showBatteryMinutesLeft(battery_minutes_left);
+                showBatteryPercentageLeft(battery_percentage_left);
+            break;
+                
+            case 1:
+                //circular display (1)
+                //updateProgressCircle(1, race_percentage_left);
+                race_minutes_done = time(0)/60;         //TODO give starting point
+                showRaceMinutesDone(race_minutes_done);
+                showRaceMinutesLeft(race_minutes_left);
+                showRacePercentageLeft(race_percentage_left);
+                
+                //circular display (3)
+                //updateProgressCircle(3, battery_percentage_left);
+                showBatteryMinutesLeft(battery_minutes_left);
+                showBatteryPercentageLeft(battery_percentage_left);
+            break;
+            
+            case 2:
+                //circular display (1)
+                //updateProgressCircle(1, race_percentage_left);
+                race_minutes_done = time(0)/60;         //TODO give starting point
+                showRaceMinutesDone(race_minutes_done);
+                showRaceMinutesLeft(race_minutes_left);
+                showRacePercentageLeft(race_percentage_left);
+                
+                //main display (2)
+                displayData1(rpm_motor, battery_temperature, motor_temperature, voltage_in, power_out, power_in);
+                
+                //circular display (3)
+                //updateProgressCircle(3, battery_percentage_left);
+                showBatteryMinutesLeft(battery_minutes_left);
+                showBatteryPercentageLeft(battery_percentage_left);
+            break;
+
+            case 3:
+                //circular display (1)
+                //updateProgressCircle(1, race_percentage_left);
+                race_minutes_done = time(0)/60;         //TODO give starting point
+                showRaceMinutesDone(race_minutes_done);
+                showRaceMinutesLeft(race_minutes_left);
+                showRacePercentageLeft(race_percentage_left);
+                
+                //main display (2)
+                displayData2(battery_voltage, battery_temperature, motor_temperature, voltage_in, power_out, power_in);
+                
+                //circular display (3)
+                //updateProgressCircle(3, battery_percentage_left);
+                showBatteryMinutesLeft(battery_minutes_left);
+                showBatteryPercentageLeft(battery_percentage_left);
+            break;
+            default:
+                //empty, catch
+            break;
+        }
     }
 }
+
+int checkIfButtonPressed(int current_menu)
+{
+    //--------------MENU BUTTON--------------------
+    if (menu_button == 0 && menu_button_pressed == false) {
+        menu_button_pressed = true;
+        start = time(0);
+        current_menu++;
+        if (current_menu > 3) current_menu = 0;
+        clearDisplay(1);
+        clearDisplay(2);
+        clearDisplay(3);
+    } else if (menu_button == 1) menu_button_pressed = false;
+    //timeout for back to home screen
+    double seconds_since_start = difftime(time(0), start);
+    if (current_menu != 0 && seconds_since_start > MENU_TIMEOUT_TIME) {
+        current_menu = 0;
+        clearDisplay(1);
+        clearDisplay(2);
+        clearDisplay(3);
+    }
+
+    //--------------REVERSE BUTTON--------------------
+    if (reverse_button == 0 && reverse_button_pressed == false) {
+        reverse_button_pressed = true;
+        if (velocity < MAX_REVERSE_VELOCITY) reverse = !reverse;
+    } else if (reverse_button == 1) reverse_button_pressed = false;
+
+    //--------------FLY BUTTON--------------------
+    if (fly_button == 0 && fly_request == false) {
+        fly_request = true;
+        if (velocity > MIN_FLY_VELOCITY) fly_request = !fly_request;
+    } else if (fly_button == 1) fly_request = false;
+
+    //return for menu
+    return current_menu;
+}
+
+void readEssentials()
+{
+    //get current throttle set + adjust params  -------- DEBUG
+    throttle_power = 1000*analog_throttle;
+    
+    
+    power_out = 1.5*throttle_power;
+    power_in = 1.9*throttle_power;
+    velocity = 0.2*throttle_power;
+    battery_minutes_left = 0.1*throttle_power;
+    battery_percentage_left = 0.15*throttle_power;
+    motor_temperature = 0.5*throttle_power;
+    battery_temperature = 0.2*throttle_power;
+    battery_voltage = 300.1*throttle_power;
+    rpm_motor = throttle_power;
+    voltage_in = 200.1*throttle_power;
+    race_minutes_left = 0.13*throttle_power; 
+    race_percentage_left = 100*race_minutes_done/(race_minutes_left+race_minutes_done);
+    if (throttle_power > 3) transmitting = true;
+    else transmitting = false;
+}