Mark Bruijn
/
DashboardV4
dashboardv4solarboat
Fork of mbed_blinky by
main.cpp@16:21658c9e697c, 2017-05-02 (annotated)
- Committer:
- Marrkk_92
- Date:
- Tue May 02 17:25:18 2017 +0000
- Revision:
- 16:21658c9e697c
- Parent:
- 4:81cea7a352b0
- Child:
- 17:f8d3d1f0d8d1
dashboard_SBT_v4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Marrkk_92 | 16:21658c9e697c | 1 | #include "mbed.h" |
Marrkk_92 | 16:21658c9e697c | 2 | #include "oled_driver.h" |
Marrkk_92 | 16:21658c9e697c | 3 | |
Marrkk_92 | 16:21658c9e697c | 4 | #define MENU_TIMEOUT_TIME 50.0 //menu timeout in seconds [s] |
Marrkk_92 | 16:21658c9e697c | 5 | #define MAX_POWER_IN 1500 //max power in for power bars [W] |
Marrkk_92 | 16:21658c9e697c | 6 | #define MAX_POWER_OUT 2000 //max power out for power bars [W] |
Marrkk_92 | 16:21658c9e697c | 7 | #define MAX_TEMP_MOTOR 80 //alert when exceeding temp ['C] |
Marrkk_92 | 16:21658c9e697c | 8 | #define MAX_TEMP_BATTERY 60 //alert when exceeding temp ['C] |
Marrkk_92 | 16:21658c9e697c | 9 | #define MAX_REVERSE_VELOCITY 20 //max velocity for allowing reverse [km/h] |
Marrkk_92 | 16:21658c9e697c | 10 | #define MIN_SOLAR_PANEL_VOLTAGE 30 //min voltage provided by solar panels [V] |
Marrkk_92 | 16:21658c9e697c | 11 | #define MIN_FLY_VELOCITY 15 //min velocity to request fly [km/h] |
Marrkk_92 | 16:21658c9e697c | 12 | #define BATTERY_LOW_ALERT 10 //min battery percentage [%, min] |
Marrkk_92 | 16:21658c9e697c | 13 | |
Marrkk_92 | 16:21658c9e697c | 14 | //digital and analog inputs |
Marrkk_92 | 16:21658c9e697c | 15 | DigitalIn reverse_button(D14); |
Marrkk_92 | 16:21658c9e697c | 16 | DigitalIn menu_button(D15); |
Marrkk_92 | 16:21658c9e697c | 17 | DigitalIn fly_button(D12); |
Marrkk_92 | 16:21658c9e697c | 18 | AnalogIn analog_throttle(A5); |
dan | 0:7dec7e9ac085 | 19 | |
Marrkk_92 | 16:21658c9e697c | 20 | //global variables |
Marrkk_92 | 16:21658c9e697c | 21 | int battery_percentage_left = 0; |
Marrkk_92 | 16:21658c9e697c | 22 | int battery_minutes_left = 0; |
Marrkk_92 | 16:21658c9e697c | 23 | int race_percentage_left = 0; |
Marrkk_92 | 16:21658c9e697c | 24 | int race_minutes_left = 0; |
Marrkk_92 | 16:21658c9e697c | 25 | int race_minutes_done = 0; |
Marrkk_92 | 16:21658c9e697c | 26 | int throttle_power = 0; |
Marrkk_92 | 16:21658c9e697c | 27 | int advised_throttle_power = 0; |
Marrkk_92 | 16:21658c9e697c | 28 | int power_in = 0; |
Marrkk_92 | 16:21658c9e697c | 29 | int power_out = 0; |
Marrkk_92 | 16:21658c9e697c | 30 | int voltage_in = 0; |
Marrkk_92 | 16:21658c9e697c | 31 | int motor_temperature = 0; |
Marrkk_92 | 16:21658c9e697c | 32 | int battery_temperature = 0; |
Marrkk_92 | 16:21658c9e697c | 33 | int velocity = 0; |
Marrkk_92 | 16:21658c9e697c | 34 | int rpm_motor = 0; |
Marrkk_92 | 16:21658c9e697c | 35 | int checkIfButtonPressed(int current_menu); |
Marrkk_92 | 16:21658c9e697c | 36 | int battery_voltage = 0; |
Marrkk_92 | 16:21658c9e697c | 37 | int current_menu = 0; |
Marrkk_92 | 16:21658c9e697c | 38 | time_t start = time(0); |
Marrkk_92 | 16:21658c9e697c | 39 | void readEssentials(); |
Marrkk_92 | 16:21658c9e697c | 40 | bool menu_button_pressed = true; |
Marrkk_92 | 16:21658c9e697c | 41 | bool reverse_button_pressed = true; |
Marrkk_92 | 16:21658c9e697c | 42 | bool fly_request = true; |
Marrkk_92 | 16:21658c9e697c | 43 | bool transmitting = false; |
Marrkk_92 | 16:21658c9e697c | 44 | bool reverse = false; |
Marrkk_92 | 16:21658c9e697c | 45 | |
Marrkk_92 | 16:21658c9e697c | 46 | int main() |
Marrkk_92 | 16:21658c9e697c | 47 | { |
Marrkk_92 | 16:21658c9e697c | 48 | powerOnOLED(1); |
Marrkk_92 | 16:21658c9e697c | 49 | powerOnOLED(2); |
Marrkk_92 | 16:21658c9e697c | 50 | powerOnOLED(3); |
Marrkk_92 | 16:21658c9e697c | 51 | |
Marrkk_92 | 16:21658c9e697c | 52 | clearDisplay(1); |
Marrkk_92 | 16:21658c9e697c | 53 | clearDisplay(2); |
Marrkk_92 | 16:21658c9e697c | 54 | clearDisplay(3); |
Marrkk_92 | 16:21658c9e697c | 55 | |
Marrkk_92 | 16:21658c9e697c | 56 | welcomeScreen(); |
Marrkk_92 | 16:21658c9e697c | 57 | |
Marrkk_92 | 16:21658c9e697c | 58 | while(1) { |
Marrkk_92 | 16:21658c9e697c | 59 | |
Marrkk_92 | 16:21658c9e697c | 60 | //listen to menu button |
Marrkk_92 | 16:21658c9e697c | 61 | current_menu = checkIfButtonPressed(current_menu); |
Marrkk_92 | 16:21658c9e697c | 62 | //listen to steering wheel at all time |
Marrkk_92 | 16:21658c9e697c | 63 | readEssentials(); |
Marrkk_92 | 16:21658c9e697c | 64 | //check for errors at all time |
Marrkk_92 | 16:21658c9e697c | 65 | checkForErrors(current_menu, velocity, battery_temperature, motor_temperature, MAX_TEMP_MOTOR, MAX_TEMP_BATTERY, battery_percentage_left, battery_minutes_left, BATTERY_LOW_ALERT); |
Marrkk_92 | 16:21658c9e697c | 66 | |
Marrkk_92 | 16:21658c9e697c | 67 | switch (current_menu) { |
dan | 0:7dec7e9ac085 | 68 | |
Marrkk_92 | 16:21658c9e697c | 69 | case 0: |
Marrkk_92 | 16:21658c9e697c | 70 | //circular display (1) |
Marrkk_92 | 16:21658c9e697c | 71 | //updateProgressCircle(1, race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 72 | race_minutes_done = time(0)/60; //TODO give starting point |
Marrkk_92 | 16:21658c9e697c | 73 | showRaceMinutesDone(race_minutes_done); |
Marrkk_92 | 16:21658c9e697c | 74 | showRaceMinutesLeft(race_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 75 | showRacePercentageLeft(race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 76 | |
Marrkk_92 | 16:21658c9e697c | 77 | //main display (2) |
Marrkk_92 | 16:21658c9e697c | 78 | displayTime(); |
Marrkk_92 | 16:21658c9e697c | 79 | checkTransmitter(transmitting); |
Marrkk_92 | 16:21658c9e697c | 80 | displayVelocity(velocity); |
Marrkk_92 | 16:21658c9e697c | 81 | displayThrottle(throttle_power, reverse); |
Marrkk_92 | 16:21658c9e697c | 82 | displayAdvisedThrottle(advised_throttle_power); |
Marrkk_92 | 16:21658c9e697c | 83 | updatePowerBars(power_out, power_in, MAX_POWER_OUT, MAX_POWER_IN); |
Marrkk_92 | 16:21658c9e697c | 84 | |
Marrkk_92 | 16:21658c9e697c | 85 | //circular display (3) |
Marrkk_92 | 16:21658c9e697c | 86 | //updateProgressCircle(3, battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 87 | showBatteryMinutesLeft(battery_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 88 | showBatteryPercentageLeft(battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 89 | break; |
Marrkk_92 | 16:21658c9e697c | 90 | |
Marrkk_92 | 16:21658c9e697c | 91 | case 1: |
Marrkk_92 | 16:21658c9e697c | 92 | //circular display (1) |
Marrkk_92 | 16:21658c9e697c | 93 | //updateProgressCircle(1, race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 94 | race_minutes_done = time(0)/60; //TODO give starting point |
Marrkk_92 | 16:21658c9e697c | 95 | showRaceMinutesDone(race_minutes_done); |
Marrkk_92 | 16:21658c9e697c | 96 | showRaceMinutesLeft(race_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 97 | showRacePercentageLeft(race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 98 | |
Marrkk_92 | 16:21658c9e697c | 99 | //circular display (3) |
Marrkk_92 | 16:21658c9e697c | 100 | //updateProgressCircle(3, battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 101 | showBatteryMinutesLeft(battery_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 102 | showBatteryPercentageLeft(battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 103 | break; |
Marrkk_92 | 16:21658c9e697c | 104 | |
Marrkk_92 | 16:21658c9e697c | 105 | case 2: |
Marrkk_92 | 16:21658c9e697c | 106 | //circular display (1) |
Marrkk_92 | 16:21658c9e697c | 107 | //updateProgressCircle(1, race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 108 | race_minutes_done = time(0)/60; //TODO give starting point |
Marrkk_92 | 16:21658c9e697c | 109 | showRaceMinutesDone(race_minutes_done); |
Marrkk_92 | 16:21658c9e697c | 110 | showRaceMinutesLeft(race_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 111 | showRacePercentageLeft(race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 112 | |
Marrkk_92 | 16:21658c9e697c | 113 | //main display (2) |
Marrkk_92 | 16:21658c9e697c | 114 | displayData1(rpm_motor, battery_temperature, motor_temperature, voltage_in, power_out, power_in); |
Marrkk_92 | 16:21658c9e697c | 115 | |
Marrkk_92 | 16:21658c9e697c | 116 | //circular display (3) |
Marrkk_92 | 16:21658c9e697c | 117 | //updateProgressCircle(3, battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 118 | showBatteryMinutesLeft(battery_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 119 | showBatteryPercentageLeft(battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 120 | break; |
Marrkk_92 | 16:21658c9e697c | 121 | |
Marrkk_92 | 16:21658c9e697c | 122 | case 3: |
Marrkk_92 | 16:21658c9e697c | 123 | //circular display (1) |
Marrkk_92 | 16:21658c9e697c | 124 | //updateProgressCircle(1, race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 125 | race_minutes_done = time(0)/60; //TODO give starting point |
Marrkk_92 | 16:21658c9e697c | 126 | showRaceMinutesDone(race_minutes_done); |
Marrkk_92 | 16:21658c9e697c | 127 | showRaceMinutesLeft(race_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 128 | showRacePercentageLeft(race_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 129 | |
Marrkk_92 | 16:21658c9e697c | 130 | //main display (2) |
Marrkk_92 | 16:21658c9e697c | 131 | displayData2(battery_voltage, battery_temperature, motor_temperature, voltage_in, power_out, power_in); |
Marrkk_92 | 16:21658c9e697c | 132 | |
Marrkk_92 | 16:21658c9e697c | 133 | //circular display (3) |
Marrkk_92 | 16:21658c9e697c | 134 | //updateProgressCircle(3, battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 135 | showBatteryMinutesLeft(battery_minutes_left); |
Marrkk_92 | 16:21658c9e697c | 136 | showBatteryPercentageLeft(battery_percentage_left); |
Marrkk_92 | 16:21658c9e697c | 137 | break; |
Marrkk_92 | 16:21658c9e697c | 138 | default: |
Marrkk_92 | 16:21658c9e697c | 139 | //empty, catch |
Marrkk_92 | 16:21658c9e697c | 140 | break; |
Marrkk_92 | 16:21658c9e697c | 141 | } |
stevep | 4:81cea7a352b0 | 142 | } |
dan | 0:7dec7e9ac085 | 143 | } |
Marrkk_92 | 16:21658c9e697c | 144 | |
Marrkk_92 | 16:21658c9e697c | 145 | int checkIfButtonPressed(int current_menu) |
Marrkk_92 | 16:21658c9e697c | 146 | { |
Marrkk_92 | 16:21658c9e697c | 147 | //--------------MENU BUTTON-------------------- |
Marrkk_92 | 16:21658c9e697c | 148 | if (menu_button == 0 && menu_button_pressed == false) { |
Marrkk_92 | 16:21658c9e697c | 149 | menu_button_pressed = true; |
Marrkk_92 | 16:21658c9e697c | 150 | start = time(0); |
Marrkk_92 | 16:21658c9e697c | 151 | current_menu++; |
Marrkk_92 | 16:21658c9e697c | 152 | if (current_menu > 3) current_menu = 0; |
Marrkk_92 | 16:21658c9e697c | 153 | clearDisplay(1); |
Marrkk_92 | 16:21658c9e697c | 154 | clearDisplay(2); |
Marrkk_92 | 16:21658c9e697c | 155 | clearDisplay(3); |
Marrkk_92 | 16:21658c9e697c | 156 | } else if (menu_button == 1) menu_button_pressed = false; |
Marrkk_92 | 16:21658c9e697c | 157 | //timeout for back to home screen |
Marrkk_92 | 16:21658c9e697c | 158 | double seconds_since_start = difftime(time(0), start); |
Marrkk_92 | 16:21658c9e697c | 159 | if (current_menu != 0 && seconds_since_start > MENU_TIMEOUT_TIME) { |
Marrkk_92 | 16:21658c9e697c | 160 | current_menu = 0; |
Marrkk_92 | 16:21658c9e697c | 161 | clearDisplay(1); |
Marrkk_92 | 16:21658c9e697c | 162 | clearDisplay(2); |
Marrkk_92 | 16:21658c9e697c | 163 | clearDisplay(3); |
Marrkk_92 | 16:21658c9e697c | 164 | } |
Marrkk_92 | 16:21658c9e697c | 165 | |
Marrkk_92 | 16:21658c9e697c | 166 | //--------------REVERSE BUTTON-------------------- |
Marrkk_92 | 16:21658c9e697c | 167 | if (reverse_button == 0 && reverse_button_pressed == false) { |
Marrkk_92 | 16:21658c9e697c | 168 | reverse_button_pressed = true; |
Marrkk_92 | 16:21658c9e697c | 169 | if (velocity < MAX_REVERSE_VELOCITY) reverse = !reverse; |
Marrkk_92 | 16:21658c9e697c | 170 | } else if (reverse_button == 1) reverse_button_pressed = false; |
Marrkk_92 | 16:21658c9e697c | 171 | |
Marrkk_92 | 16:21658c9e697c | 172 | //--------------FLY BUTTON-------------------- |
Marrkk_92 | 16:21658c9e697c | 173 | if (fly_button == 0 && fly_request == false) { |
Marrkk_92 | 16:21658c9e697c | 174 | fly_request = true; |
Marrkk_92 | 16:21658c9e697c | 175 | if (velocity > MIN_FLY_VELOCITY) fly_request = !fly_request; |
Marrkk_92 | 16:21658c9e697c | 176 | } else if (fly_button == 1) fly_request = false; |
Marrkk_92 | 16:21658c9e697c | 177 | |
Marrkk_92 | 16:21658c9e697c | 178 | //return for menu |
Marrkk_92 | 16:21658c9e697c | 179 | return current_menu; |
Marrkk_92 | 16:21658c9e697c | 180 | } |
Marrkk_92 | 16:21658c9e697c | 181 | |
Marrkk_92 | 16:21658c9e697c | 182 | void readEssentials() |
Marrkk_92 | 16:21658c9e697c | 183 | { |
Marrkk_92 | 16:21658c9e697c | 184 | //get current throttle set + adjust params -------- DEBUG |
Marrkk_92 | 16:21658c9e697c | 185 | throttle_power = 1000*analog_throttle; |
Marrkk_92 | 16:21658c9e697c | 186 | |
Marrkk_92 | 16:21658c9e697c | 187 | |
Marrkk_92 | 16:21658c9e697c | 188 | power_out = 1.5*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 189 | power_in = 1.9*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 190 | velocity = 0.2*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 191 | battery_minutes_left = 0.1*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 192 | battery_percentage_left = 0.15*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 193 | motor_temperature = 0.5*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 194 | battery_temperature = 0.2*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 195 | battery_voltage = 300.1*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 196 | rpm_motor = throttle_power; |
Marrkk_92 | 16:21658c9e697c | 197 | voltage_in = 200.1*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 198 | race_minutes_left = 0.13*throttle_power; |
Marrkk_92 | 16:21658c9e697c | 199 | race_percentage_left = 100*race_minutes_done/(race_minutes_left+race_minutes_done); |
Marrkk_92 | 16:21658c9e697c | 200 | if (throttle_power > 3) transmitting = true; |
Marrkk_92 | 16:21658c9e697c | 201 | else transmitting = false; |
Marrkk_92 | 16:21658c9e697c | 202 | } |