From 41d3bd907e65b484876859b767328e5d81181911 Mon Sep 17 00:00:00 2001 From: Jasper Date: Sun, 13 Mar 2022 20:30:14 +0100 Subject: [PATCH] Format everything The next commit will add this to a `.git-blame-ignore-revs` file which you can use to ignore this commit when running git blame. Simply run git blame --ignore-revs-file .git-blame-ignore-revs [...] Or configure git to persistently ignore the commit: git config blame.ignoreRevsFile .git-blame-ignore-revs --- .editorconfig | 8 + include/debug.h | 21 +- lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.cpp | 849 ++++++++++---------- lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.h | 207 ++--- lib/FT18_STW_INIT/FT18_STW_INIT.cpp | 286 +++---- lib/FT18_STW_INIT/FT18_STW_INIT.h | 204 +++-- lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.cpp | 318 ++++---- lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.h | 50 +- lib/FT18e_STW_INIT/FT18e_STW_INIT.cpp | 156 ++-- lib/FT18e_STW_INIT/FT18e_STW_INIT.h | 191 +++-- lib/FT_2018_STW_CAN/FT_2018_STW_CAN.cpp | 550 ++++++------- lib/FT_2018_STW_CAN/FT_2018_STW_CAN.h | 22 +- lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.cpp | 280 ++++--- lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.h | 124 ++- lib/arduino-ediptft-master/EDIPTFT.cpp | 723 +++++++++-------- lib/arduino-ediptft-master/EDIPTFT.h | 666 +++++++-------- 16 files changed, 2336 insertions(+), 2319 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..23e23ee --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true + +[*.{cpp,c,h,hpp}] +indent_style = space +indent_size = 4 \ No newline at end of file diff --git a/include/debug.h b/include/debug.h index 58aa341..3ef44f1 100644 --- a/include/debug.h +++ b/include/debug.h @@ -13,9 +13,7 @@ struct FaultStatusRegisters { uint32_t SHCSR; }; -enum class FaultType { - HardFault, MemManage, BusFault, UsageFault -}; +enum class FaultType { HardFault, MemManage, BusFault, UsageFault }; struct FlashDump { FaultType type; @@ -43,22 +41,23 @@ const FlashDump *flash_dump_get_fault(uint32_t n); void uart_wait_for_txrdy(); size_t uart_write(uint8_t c); -size_t uart_print(const char* str); +size_t uart_print(const char *str); size_t uart_print_hex(uint32_t x); -void print_dumped_faults(bool in_irq=false); -void print_stacked_registers(const uint32_t *stack, bool in_irq=false); -void print_fault_registers(const FaultStatusRegisters *fsr, bool in_irq=false); +void print_dumped_faults(bool in_irq = false); +void print_stacked_registers(const uint32_t *stack, bool in_irq = false); +void print_fault_registers(const FaultStatusRegisters *fsr, + bool in_irq = false); FaultStatusRegisters get_current_fsr(); -const char* get_fault_type_name(FaultType type); -void fault_handler(uint32_t *stack_addr, FaultType fault_type, - const int *leds, unsigned n_leds); +const char *get_fault_type_name(FaultType type); +void fault_handler(uint32_t *stack_addr, FaultType fault_type, const int *leds, + unsigned n_leds); void inline busy_wait(size_t iterations) { for (size_t i = 0; i < iterations; i++) { // Does nothing, but ensures the compiler doesn't optimize the loop away. - __ASM ("" ::: "memory"); + __ASM("" ::: "memory"); } } \ No newline at end of file diff --git a/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.cpp b/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.cpp index a5877c7..b29b3b0 100644 --- a/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.cpp +++ b/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.cpp @@ -1,412 +1,441 @@ -#include "Arduino.h" -#include "EDIPTFT.h" -#include "FT_2018_STW_CAN.h" -#include "FT18_STW_INIT.h" -#include "FT18_STW_DISPLAY.h" - -EDIPTFT tft(true,false); -String bezeichnungen[]={"T_mot","T_oil","P_oil","% fa","U_batt","P_wat","T_air", - "P_b_front","P_b_rear","Error Type","Speed_fl","Speed_fr","Speed"}; -//"Drehzahl","P_fuel","Index" -int led_s[] = {led1,led2,led3,led4,led5,led6,led7,led8,led9,led10,led11,led12,led13,led14,led15,led16}; - -DataBox gear_box(121, 0, 199, 94, 160, 0, EA_SWISS30B, 4, 4, 'C'); -DataBox left_box(0, 0, 119, 94, 110, 12, EA_FONT7X12, 3, 8, 'R'); -DataBox right_box(201, 0, 320, 94, 310, 12, EA_FONT7X12, 3, 8, 'R'); -TireTempBox fl_box(80, 130, 156, 176, 118, 124, EA_FONT7X12, 3, 5, 'C'); -TireTempBox fr_box(164, 130, 240, 176, 202, 124, EA_FONT7X12, 3, 5, 'C'); -TireTempBox rl_box(80, 184, 156, 230, 118, 178, EA_FONT7X12, 3, 5, 'C'); -TireTempBox rr_box(164, 184, 240, 230, 202, 178, EA_FONT7X12, 3, 5, 'C'); - -void init_display() { - pinMode(writeprotect, OUTPUT); - digitalWrite(writeprotect, HIGH); - pinMode(reset, OUTPUT); - pinMode(disp_cs, OUTPUT); - pinMode(MOSI, OUTPUT); - pinMode(MISO, OUTPUT); - digitalWrite(disp_cs, HIGH); - digitalWrite(MOSI, HIGH); - digitalWrite(MISO, HIGH); - digitalWrite(reset, LOW); - digitalWrite(reset,HIGH); - tft.begin(115200); // start display communication - tft.cursorOn(false); - tft.terminalOn(false); - tft.setDisplayColor(EA_WHITE,EA_BLACK); - tft.setTextColor(EA_WHITE,EA_TRANSPARENT); - tft.setTextSize(5,8); - tft.clear(); - - gear_box.update_label(get_label(VAL_GEAR)); - left_box.update_label(get_label(VAL_FIRST_LEFT_BOX)); - right_box.update_label(get_label(VAL_RPM)); -} - -String get_value(Value val) { - switch (val) { - case VAL_GEAR: - if (Vehicle_data.gear == 0) { - return "N"; - } - return String(Vehicle_data.gear); - case VAL_RPM: - return String(Vehicle_data.revol); - case VAL_TT_FL: - return "00"; - case VAL_TT_FR: - return "01"; - case VAL_TT_RL: - return "10"; - case VAL_TT_RR: - return "11"; - case VAL_LAPTIME: - return "93.13"; - case VAL_UBATT: - return String(0.0706949 * Vehicle_data.u_batt, 2); - case VAL_TMOT: - return String(Vehicle_data.t_mot - 40); - case VAL_TAIR: - return String(Vehicle_data.t_air - 40); - case VAL_TOIL: - return String(Vehicle_data.t_oil - 40); - case VAL_ERR_TYPE: - return String(Stw_data.error_type); - case VAL_PWAT: - return String(0.0514*Vehicle_data.p_wat, 2); - case VAL_POIL: - return String(0.0514*Vehicle_data.p_oil, 2); - case VAL_PBF: - return String(Vehicle_data.p_brake_front); - case VAL_PBR: - return String(Vehicle_data.p_brake_rear); - case VAL_SPEED_FL: - return String(Vehicle_data.speed_fl); - case VAL_SPEED_FR: - return String(Vehicle_data.speed_fr); - case VAL_SPEED: - return String(Vehicle_data.speed); - default: - return "???"; - } -} - -String get_label(Value val) { - switch (val) { - case VAL_GEAR: - return "GEAR"; - case VAL_RPM: - return "RPM"; - case VAL_TT_FL: - return "TEMP FL"; - case VAL_TT_FR: - return "TEMP FR"; - case VAL_TT_RL: - return "TEMP RL"; - case VAL_TT_RR: - return "TEMP RR"; - case VAL_LAPTIME: - return "LAPTIME"; - case VAL_UBATT: - return "BATT VOLTAGE"; - case VAL_TMOT: - return "TEMP ENG"; - case VAL_TAIR: - return "TEMP AIR"; - case VAL_TOIL: - return "TEMP OIL"; - case VAL_ERR_TYPE: - return "ERROR TYPE"; - case VAL_PWAT: - return "PRESS WAT"; - case VAL_POIL: - return "PRESS OIL"; - case VAL_PBF: - return "PRESS BRAKE F"; - case VAL_PBR: - return "PRESS BRAKE R"; - case VAL_SPEED_FL: - return "SPEED FL"; - case VAL_SPEED_FR: - return "SPEED FR"; - case VAL_SPEED: - return "SPEED"; - default: - return "???"; - } -} - -bool check_alarms() { - static uint32_t poil_last_valid, tmot_last_valid, toil_last_valid; - uint32_t now = millis(); - if (Vehicle_data.p_oil >= POIL_ALARM_THRESH || Vehicle_data.speed == 0) { - poil_last_valid = now; - } - if (Vehicle_data.t_mot <= TMOT_ALARM_THRESH || Vehicle_data.t_mot == TMOT_SAFE_VALUE) { - tmot_last_valid = now; - } - if (Vehicle_data.t_oil <= TOIL_ALARM_THRESH) { - toil_last_valid = now; - } - bool poil_alarm = now - poil_last_valid >= POIL_ALARM_TIME; - bool tmot_alarm = now - tmot_last_valid >= TMOT_ALARM_TIME; - bool toil_alarm = now - toil_last_valid >= TOIL_ALARM_TIME; - bool alarm_active = poil_alarm || tmot_alarm || toil_alarm; - - if (alarm_active) { - String alarm_text = ""; - if (poil_alarm) alarm_text += "PO"; - if (tmot_alarm) alarm_text += "TM"; - if (toil_alarm) alarm_text += "TO"; - alarm(alarm_text); - } - - return alarm_active; -} - -bool check_enc_displays() { - static uint8_t trc_old, mode_old; - static bool display_trc, display_mode; - static uint32_t display_trc_begin, display_mode_begin; - - return check_display(trc_old, Stw_data.trc, display_trc, display_trc_begin, "ARB") || - check_display(mode_old, Stw_data.mode, display_mode, display_mode_begin, "MODE"); -} - -bool check_display(uint8_t& val_old, uint8_t val_new, bool& active, uint32_t& begin, const String& title) { - if (val_old != val_new) { - active = true; - begin = millis(); - val_old = val_new; - tft.clear(); - tft.fillDisplayColor(EA_RED); - tft.setTextColor(EA_WHITE, EA_RED); - tft.setTextSize(7,8); - String text = title + ":" + val_new; - char text_arr[16]; - text.toCharArray(text_arr, 16); - tft.drawText(15, 68, 'C', text_arr); - } else if (active && millis() - begin > ENC_DISPLAY_TIME) { - tft.setTextColor(EA_WHITE, EA_TRANSPARENT); - tft.clear(); - active = false; - } - - return active; -} - -void update_display(){ - static DisplayPage page = PAGE_DRIVER; - static uint32_t last_cleared; - static bool cleared = true; - - if (check_alarms()) { - cleared = true; - return; - } - if (tft.disconnected) { - return; - } - - if (check_enc_displays()) { - cleared = true; - return; - } - - uint32_t now = millis(); - // Both buttons have to be pressed at the same time, but we also use the - // debounced rises to ensure we don't keep toggling between the pages - if (Stw_data.buttonState1 && Stw_data.buttonState4 && - (Stw_data.button1_rises > 0|| Stw_data.button4_rises > 0)){ - Stw_data.button1_rises = 0; - Stw_data.button4_rises = 0; - page = (DisplayPage) ((page + 1) % DISPLAY_PAGES); - tft.clear(); - last_cleared = now; - cleared = true; - } - - if (now - last_cleared >= DISP_CLEAR_INTERVAL) { - tft.clear(); - last_cleared = now; - cleared = true; - } - - if (page == PAGE_DRIVER) { - if (cleared) { - redraw_page_driver(); - cleared = false; - } else { - update_page_driver(); - } - } else { - if (cleared) { - redraw_page_testing(); - cleared = false; - } else { - update_page_testing(); - } - } -} - -void alarm(String textstr){ - uint8_t x = 1;; - char text[7]; - textstr.toCharArray(text,7); - tft.setTextSize(8,8); - while(x==1){ - if(!tft.disconnected){ - tft.setTextColor(EA_BLACK,EA_RED); - tft.fillDisplayColor(EA_RED); - tft.drawText(5,68,'L',text); - } - for (int j = 0; j < 16; j++){ - digitalWrite(led_s[j], HIGH); - } - delay(100); - if(!tft.disconnected){ - tft.setTextColor(EA_BLACK,EA_WHITE); - tft.fillDisplayColor(EA_WHITE); - tft.drawText(5,68,'L',text); - } - for (int j = 0; j < 16; j++){ - digitalWrite(led_s[j], LOW); - } - delay(100); - if(Stw_data.buttonState1 & Stw_data.buttonState4){ - x=0; - tft.setTextColor(EA_WHITE,EA_TRANSPARENT); - } - } -} - -void redraw_page_driver() { - // Boxes - tft.drawLine(0, 110, 320, 110); - tft.drawLine(120, 0, 120, 110); - tft.drawLine(200, 0, 200, 110); - - // Tire temperature cross - tft.drawLine(80, 180, 240, 180); - tft.drawLine(160, 130, 160, 230); - - // Boxes - gear_box.redraw(); - left_box.redraw(); - right_box.redraw(); - fl_box.redraw(); - fr_box.redraw(); - rl_box.redraw(); - rr_box.redraw(); -} - -void update_page_driver() { - static Value left_box_value = VAL_FIRST_LEFT_BOX; - if (Stw_data.button4_rises > 0) { - Stw_data.button4_rises--; - if (left_box_value == VAL_LAST) { - left_box_value = VAL_FIRST_LEFT_BOX; - } else { - left_box_value = (Value) (left_box_value + 1); - } - left_box.update_label(get_label(left_box_value)); - if (Stw_data.button1_rises > 0) { - Stw_data.button1_rises--; - if (left_box_value == VAL_FIRST_LEFT_BOX) { - left_box_value = VAL_LAST; - } else { - left_box_value = (Value) (left_box_value - 1); - } - left_box.update_label(get_label(left_box_value)); - } - - gear_box.update_value(get_value(VAL_GEAR)); - left_box.update_value(get_value(left_box_value)); - right_box.update_value(get_value(VAL_RPM)); - fl_box.update_value(2); - fr_box.update_value(55); - rl_box.update_value(65); - rr_box.update_value(90); -} - -void redraw_page_testing() { +#include "FT18_STW_DISPLAY.h" +#include "Arduino.h" +#include "EDIPTFT.h" +#include "FT18_STW_INIT.h" +#include "FT_2018_STW_CAN.h" + +EDIPTFT tft(true, false); +String bezeichnungen[] = {"T_mot", "T_oil", "P_oil", "% fa", + "U_batt", "P_wat", "T_air", "P_b_front", + "P_b_rear", "Error Type", "Speed_fl", "Speed_fr", + "Speed"}; +//"Drehzahl","P_fuel","Index" +int led_s[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; + +DataBox gear_box(121, 0, 199, 94, 160, 0, EA_SWISS30B, 4, 4, 'C'); +DataBox left_box(0, 0, 119, 94, 110, 12, EA_FONT7X12, 3, 8, 'R'); +DataBox right_box(201, 0, 320, 94, 310, 12, EA_FONT7X12, 3, 8, 'R'); +TireTempBox fl_box(80, 130, 156, 176, 118, 124, EA_FONT7X12, 3, 5, 'C'); +TireTempBox fr_box(164, 130, 240, 176, 202, 124, EA_FONT7X12, 3, 5, 'C'); +TireTempBox rl_box(80, 184, 156, 230, 118, 178, EA_FONT7X12, 3, 5, 'C'); +TireTempBox rr_box(164, 184, 240, 230, 202, 178, EA_FONT7X12, 3, 5, 'C'); + +void init_display() { + pinMode(writeprotect, OUTPUT); + digitalWrite(writeprotect, HIGH); + pinMode(reset, OUTPUT); + pinMode(disp_cs, OUTPUT); + pinMode(MOSI, OUTPUT); + pinMode(MISO, OUTPUT); + digitalWrite(disp_cs, HIGH); + digitalWrite(MOSI, HIGH); + digitalWrite(MISO, HIGH); + digitalWrite(reset, LOW); + digitalWrite(reset, HIGH); + tft.begin(115200); // start display communication + tft.cursorOn(false); + tft.terminalOn(false); + tft.setDisplayColor(EA_WHITE, EA_BLACK); + tft.setTextColor(EA_WHITE, EA_TRANSPARENT); + tft.setTextSize(5, 8); + tft.clear(); + + gear_box.update_label(get_label(VAL_GEAR)); + left_box.update_label(get_label(VAL_FIRST_LEFT_BOX)); + right_box.update_label(get_label(VAL_RPM)); +} + +String get_value(Value val) { + switch (val) { + case VAL_GEAR: + if (Vehicle_data.gear == 0) { + return "N"; + } + return String(Vehicle_data.gear); + case VAL_RPM: + return String(Vehicle_data.revol); + case VAL_TT_FL: + return "00"; + case VAL_TT_FR: + return "01"; + case VAL_TT_RL: + return "10"; + case VAL_TT_RR: + return "11"; + case VAL_LAPTIME: + return "93.13"; + case VAL_UBATT: + return String(0.0706949 * Vehicle_data.u_batt, 2); + case VAL_TMOT: + return String(Vehicle_data.t_mot - 40); + case VAL_TAIR: + return String(Vehicle_data.t_air - 40); + case VAL_TOIL: + return String(Vehicle_data.t_oil - 40); + case VAL_ERR_TYPE: + return String(Stw_data.error_type); + case VAL_PWAT: + return String(0.0514 * Vehicle_data.p_wat, 2); + case VAL_POIL: + return String(0.0514 * Vehicle_data.p_oil, 2); + case VAL_PBF: + return String(Vehicle_data.p_brake_front); + case VAL_PBR: + return String(Vehicle_data.p_brake_rear); + case VAL_SPEED_FL: + return String(Vehicle_data.speed_fl); + case VAL_SPEED_FR: + return String(Vehicle_data.speed_fr); + case VAL_SPEED: + return String(Vehicle_data.speed); + default: + return "???"; + } +} + +String get_label(Value val) { + switch (val) { + case VAL_GEAR: + return "GEAR"; + case VAL_RPM: + return "RPM"; + case VAL_TT_FL: + return "TEMP FL"; + case VAL_TT_FR: + return "TEMP FR"; + case VAL_TT_RL: + return "TEMP RL"; + case VAL_TT_RR: + return "TEMP RR"; + case VAL_LAPTIME: + return "LAPTIME"; + case VAL_UBATT: + return "BATT VOLTAGE"; + case VAL_TMOT: + return "TEMP ENG"; + case VAL_TAIR: + return "TEMP AIR"; + case VAL_TOIL: + return "TEMP OIL"; + case VAL_ERR_TYPE: + return "ERROR TYPE"; + case VAL_PWAT: + return "PRESS WAT"; + case VAL_POIL: + return "PRESS OIL"; + case VAL_PBF: + return "PRESS BRAKE F"; + case VAL_PBR: + return "PRESS BRAKE R"; + case VAL_SPEED_FL: + return "SPEED FL"; + case VAL_SPEED_FR: + return "SPEED FR"; + case VAL_SPEED: + return "SPEED"; + default: + return "???"; + } +} + +bool check_alarms() { + static uint32_t poil_last_valid, tmot_last_valid, toil_last_valid; + uint32_t now = millis(); + if (Vehicle_data.p_oil >= POIL_ALARM_THRESH || Vehicle_data.speed == 0) { + poil_last_valid = now; + } + if (Vehicle_data.t_mot <= TMOT_ALARM_THRESH || + Vehicle_data.t_mot == TMOT_SAFE_VALUE) { + tmot_last_valid = now; + } + if (Vehicle_data.t_oil <= TOIL_ALARM_THRESH) { + toil_last_valid = now; + } + bool poil_alarm = now - poil_last_valid >= POIL_ALARM_TIME; + bool tmot_alarm = now - tmot_last_valid >= TMOT_ALARM_TIME; + bool toil_alarm = now - toil_last_valid >= TOIL_ALARM_TIME; + bool alarm_active = poil_alarm || tmot_alarm || toil_alarm; + + if (alarm_active) { + String alarm_text = ""; + if (poil_alarm) + alarm_text += "PO"; + if (tmot_alarm) + alarm_text += "TM"; + if (toil_alarm) + alarm_text += "TO"; + alarm(alarm_text); + } + + return alarm_active; +} + +bool check_enc_displays() { + static uint8_t trc_old, mode_old; + static bool display_trc, display_mode; + static uint32_t display_trc_begin, display_mode_begin; + + return check_display(trc_old, Stw_data.trc, display_trc, display_trc_begin, + "ARB") || + check_display(mode_old, Stw_data.mode, display_mode, + display_mode_begin, "MODE"); +} + +bool check_display(uint8_t& val_old, uint8_t val_new, bool& active, + uint32_t& begin, const String& title) { + if (val_old != val_new) { + active = true; + begin = millis(); + val_old = val_new; + tft.clear(); + tft.fillDisplayColor(EA_RED); + tft.setTextColor(EA_WHITE, EA_RED); + tft.setTextSize(7, 8); + String text = title + ":" + val_new; + char text_arr[16]; + text.toCharArray(text_arr, 16); + tft.drawText(15, 68, 'C', text_arr); + } else if (active && millis() - begin > ENC_DISPLAY_TIME) { + tft.setTextColor(EA_WHITE, EA_TRANSPARENT); + tft.clear(); + active = false; + } + + return active; +} + +void update_display() { + static DisplayPage page = PAGE_DRIVER; + static uint32_t last_cleared; + static bool cleared = true; + + if (check_alarms()) { + cleared = true; + return; + } + if (tft.disconnected) { + return; + } + + if (check_enc_displays()) { + cleared = true; + return; + } + + uint32_t now = millis(); + // Both buttons have to be pressed at the same time, but we also use the + // debounced rises to ensure we don't keep toggling between the pages + if (Stw_data.buttonState1 && Stw_data.buttonState4 && + (Stw_data.button1_rises > 0 || Stw_data.button4_rises > 0)) { + Stw_data.button1_rises = 0; + Stw_data.button4_rises = 0; + page = (DisplayPage)((page + 1) % DISPLAY_PAGES); + tft.clear(); + last_cleared = now; + cleared = true; + } + + if (now - last_cleared >= DISP_CLEAR_INTERVAL) { + tft.clear(); + last_cleared = now; + cleared = true; + } + + if (page == PAGE_DRIVER) { + if (cleared) { + redraw_page_driver(); + cleared = false; + } else { + update_page_driver(); + } + } else { + if (cleared) { + redraw_page_testing(); + cleared = false; + } else { + update_page_testing(); + } + } +} + +void alarm(String textstr) { + uint8_t x = 1; + ; + char text[7]; + textstr.toCharArray(text, 7); + tft.setTextSize(8, 8); + while (x == 1) { + if (!tft.disconnected) { + tft.setTextColor(EA_BLACK, EA_RED); + tft.fillDisplayColor(EA_RED); + tft.drawText(5, 68, 'L', text); + } + for (int j = 0; j < 16; j++) { + digitalWrite(led_s[j], HIGH); + } + delay(100); + if (!tft.disconnected) { + tft.setTextColor(EA_BLACK, EA_WHITE); + tft.fillDisplayColor(EA_WHITE); + tft.drawText(5, 68, 'L', text); + } + for (int j = 0; j < 16; j++) { + digitalWrite(led_s[j], LOW); + } + delay(100); + if (Stw_data.buttonState1 & Stw_data.buttonState4) { + x = 0; + tft.setTextColor(EA_WHITE, EA_TRANSPARENT); + } + } +} + +void redraw_page_driver() { + // Boxes + tft.drawLine(0, 110, 320, 110); + tft.drawLine(120, 0, 120, 110); + tft.drawLine(200, 0, 200, 110); + + // Tire temperature cross + tft.drawLine(80, 180, 240, 180); + tft.drawLine(160, 130, 160, 230); + + // Boxes + gear_box.redraw(); + left_box.redraw(); + right_box.redraw(); + fl_box.redraw(); + fr_box.redraw(); + rl_box.redraw(); + rr_box.redraw(); +} + +void update_page_driver() { + static Value left_box_value = VAL_FIRST_LEFT_BOX; + if (Stw_data.button4_rises > 0) { + Stw_data.button4_rises--; + if (left_box_value == VAL_LAST) { + left_box_value = VAL_FIRST_LEFT_BOX; + } else { + left_box_value = (Value)(left_box_value + 1); + } + left_box.update_label(get_label(left_box_value)); + } + if (Stw_data.button1_rises > 0) { + Stw_data.button1_rises--; + if (left_box_value == VAL_FIRST_LEFT_BOX) { + left_box_value = VAL_LAST; + } else { + left_box_value = (Value)(left_box_value - 1); + } + left_box.update_label(get_label(left_box_value)); + } + + gear_box.update_value(get_value(VAL_GEAR)); + left_box.update_value(get_value(left_box_value)); + right_box.update_value(get_value(VAL_RPM)); + fl_box.update_value(2); + fr_box.update_value(55); + rl_box.update_value(65); + rr_box.update_value(90); +} + +void redraw_page_testing() { + tft.setTextFont(EA_FONT7X12); + tft.setTextSize(2, 2); + for (int i = 0; i <= min(VAL_LAST, 9); i++) { + String text = get_label((Value)i) + ":"; + int x = (i < 10) ? 10 : 170; + tft.drawText(x, (i % 10) * 24, 'L', text.c_str()); + } +} + +void update_page_testing() { + // tft.setTextFont(EA_FONT7X12); + // tft.setTextSize(2, 2); + // for (int i = 0; i < min(VALUES, 20); i++) { + // String text = get_value((Value) i); + // int x = (i < 10) ? 10 : 170; + // tft.drawText(10, (i % 10) * 24, 'L', text.c_str()); + // } +} + +DataBox::DataBox(int x1, int y1, int x2, int y2, int text_x, int text_y, + int font, int size_x, int size_y, uint8_t justification) + : x1{x1}, y1{y1}, x2{x2}, y2{y2}, text_x{text_x}, text_y{text_y}, + font{font}, size_x{size_x}, size_y{size_y}, + justification{justification}, value{""}, label{""} {} + +void DataBox::update_value(String val_new) { + if (!val_new.equals(value)) { + value = val_new; + redraw_value(); + } +} + +void DataBox::update_label(String label_new) { + if (!label_new.equals(label)) { + label = label_new; + redraw_label(); + } +} + +void DataBox::redraw() { + redraw_value(); + redraw_label(); +} + +void DataBox::redraw_value() { + tft.setTextFont(font); + tft.setTextSize(size_x, size_y); + Serial.println("Redrawing value:"); + tft.clearRect(x1, y1, x2, y2); + tft.drawText(text_x, text_y, justification, value.c_str()); +} + +void DataBox::redraw_label() { + tft.setTextFont(EA_FONT7X12); + tft.setTextSize(1, 1); + Serial.println("Redrawing label:"); + tft.clearRect(x1, y2 + 1, x2, y2 + 13); + tft.drawText((x1 + x2) / 2, y2 + 1, 'C', label.c_str()); +} + +TireTempBox::TireTempBox(int x1, int y1, int x2, int y2, int text_x, int text_y, + int font, int size_x, int size_y, + uint8_t justification) + : DataBox{x1, y1, x2, y2, text_x, + text_y, font, size_x, size_y, justification}, + num_value{-1} {} + +void TireTempBox::update_value(int val_new) { + if (val_new != num_value) { + num_value = val_new; + if (val_new < TT_THRESH1) { + color = TT_COL0; + } else if (val_new < TT_THRESH2) { + color = TT_COL1; + } else if (val_new < TT_THRESH3) { + color = TT_COL2; + } else { + color = TT_COL3; + } + String val_str = String(val_new); + if (val_str.length() == 1) { + val_str = " " + val_str; + } else if (val_str.length() == 2) { + val_str = " " + val_str; + } + DataBox::update_value(val_str); + } +} + +void TireTempBox::redraw_value() { + tft.setTextFont(font); + tft.setTextSize(size_x, size_y); + tft.drawRectf(x1, y1, x2, y2, color); + tft.drawText(text_x, text_y, justification, value.c_str()); +} -} - -void update_page_testing() {} - -DataBox::DataBox(int x1, int y1, int x2, int y2, int text_x, int text_y, int font, - int size_x, int size_y, uint8_t justification) - : x1{x1}, y1{y1}, x2{x2}, y2{y2}, text_x{text_x}, text_y{text_y}, - font{font}, size_x{size_x}, size_y{size_y}, - justification{justification}, value{""}, label{""} {} - -void DataBox::update_value(String val_new) { - if (!val_new.equals(value)) { - value = val_new; - redraw_value(); - } -} - -void DataBox::update_label(String label_new) { - if (!label_new.equals(label)) { - label = label_new; - redraw_label(); - } -} - -void DataBox::redraw() { - redraw_value(); - redraw_label(); -} - -void DataBox::redraw_value() { - tft.setTextFont(font); - tft.setTextSize(size_x, size_y); - Serial.println("Redrawing value:"); - tft.clearRect(x1, y1, x2, y2); - tft.drawText(text_x, text_y, justification, value.c_str()); -} - -void DataBox::redraw_label() { - tft.setTextFont(EA_FONT7X12); - tft.setTextSize(1, 1); - Serial.println("Redrawing label:"); - tft.clearRect(x1, y2 + 1, x2, y2 + 13); - tft.drawText((x1 + x2) / 2, y2 + 1, 'C', label.c_str()); -} - -TireTempBox::TireTempBox(int x1, int y1, int x2, int y2, int text_x, int text_y, - int font, int size_x, int size_y, uint8_t justification) - : DataBox{x1, y1, x2, y2, text_x, text_y, font, size_x, size_y, justification}, num_value{-1} {} - -void TireTempBox::update_value(int val_new) { - if (val_new != num_value) { - num_value = val_new; - if (val_new < TT_THRESH1) { - color = TT_COL0; - } else if (val_new < TT_THRESH2) { - color = TT_COL1; - } else if (val_new < TT_THRESH3) { - color = TT_COL2; - } else { - color = TT_COL3; - } - String val_str = String(val_new); - if (val_str.length() == 1) { - val_str = " " + val_str; - } else if (val_str.length() == 2) { - val_str = " " + val_str; - } - DataBox::update_value(val_str); - } -} - -void TireTempBox::redraw_value() { - tft.setTextFont(font); - tft.setTextSize(size_x, size_y); - tft.drawRectf(x1, y1, x2, y2, color); - tft.drawText(text_x, text_y, justification, value.c_str()); -} - void TireTempBox::redraw_label() {} \ No newline at end of file diff --git a/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.h b/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.h index 81956b1..6cc8666 100644 --- a/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.h +++ b/lib/FT18_STW_DISPLAY/FT18_STW_DISPLAY.h @@ -1,96 +1,113 @@ -#include "Arduino.h" -#include "EDIPTFT.h" -#include "FT_2018_STW_CAN.h" -#include "FT18_STW_INIT.h" -#ifndef FT18_STW_DISPLAY_h -#define FT18_STW_DISPLAY_h - -#define MOSI 75 -#define MISO 74 -#define CLK 76 -#define disp_cs 42 -#define reset 43 -#define writeprotect 52 - - -#define POIL_ALARM_THRESH ((uint32_t) (0.1 / 0.0514)) -#define POIL_ALARM_TIME 20000 // ms -#define TMOT_ALARM_THRESH (40 + 105) -#define TMOT_SAFE_VALUE (40 + 200) -#define TMOT_ALARM_TIME 20000 // ms -#define TOIL_ALARM_THRESH (40 + 150) -#define TOIL_ALARM_TIME 10000 // ms -#define ENC_DISPLAY_TIME 1000 // ms - -enum DisplayPage {PAGE_DRIVER, PAGE_TESTING}; -#define DISPLAY_PAGES 2 - -enum Value { - VAL_GEAR, VAL_RPM, VAL_TT_FL, VAL_TT_FR, VAL_TT_RL, VAL_TT_RR, VAL_LAPTIME, - VAL_UBATT, VAL_TMOT, VAL_TAIR, VAL_TOIL, VAL_ERR_TYPE, VAL_PWAT, VAL_POIL, - VAL_PBF, VAL_PBR, VAL_SPEED_FL, VAL_SPEED_FR, VAL_SPEED, - VAL_FIRST_LEFT_BOX = VAL_LAPTIME, VAL_LAST = VAL_SPEED -}; -String get_value(Value val); -String get_label(Value val); - -#define DISP_CLEAR_INTERVAL 5000 // ms - -void init_display(void); -void update_display(void); -void display_trc(void); -void display_mode(void); -void alarm(String text); - -bool check_alarms(); -bool check_enc_displays(); -bool check_display(uint8_t& val_old, uint8_t val_new, bool& active, uint32_t& begin, const String& title); - -void redraw_page_driver(); -void update_page_driver(); -void redraw_page_testing(); -void update_page_testing(); - -class DataBox { -public: - DataBox(int x1, int y1, int x2, int y2, int text_x, int text_y, int font, - int size_x, int size_y, uint8_t justification); - - void update_value(String val_new); - void update_label(String label_new); - - void redraw(); - virtual void redraw_value(); - virtual void redraw_label(); - -protected: - int x1, y1, x2, y2, text_x, text_y, font, size_x, size_y; - uint8_t justification; - String value; - String label; -}; - -#define TT_COL0 EA_LIGHTBLUE -#define TT_COL1 EA_GREEN -#define TT_COL2 EA_ORANGE -#define TT_COL3 EA_RED -#define TT_THRESH1 50 -#define TT_THRESH2 60 -#define TT_THRESH3 70 - -class TireTempBox : public DataBox { -public: - TireTempBox(int x1, int y1, int x2, int y2, int text_x, int text_y, - int font, int size_x, int size_y, uint8_t justification); - - void update_value(int val_new); - - void redraw_value() override; - void redraw_label() override; - -private: - int color; - int num_value; -}; - +#include "Arduino.h" +#include "EDIPTFT.h" +#include "FT18_STW_INIT.h" +#include "FT_2018_STW_CAN.h" +#ifndef FT18_STW_DISPLAY_h +#define FT18_STW_DISPLAY_h + +#define MOSI 75 +#define MISO 74 +#define CLK 76 +#define disp_cs 42 +#define reset 43 +#define writeprotect 52 + +#define POIL_ALARM_THRESH ((uint32_t)(0.1 / 0.0514)) +#define POIL_ALARM_TIME 20000 // ms +#define TMOT_ALARM_THRESH (40 + 105) +#define TMOT_SAFE_VALUE (40 + 200) +#define TMOT_ALARM_TIME 20000 // ms +#define TOIL_ALARM_THRESH (40 + 150) +#define TOIL_ALARM_TIME 10000 // ms +#define ENC_DISPLAY_TIME 1000 // ms + +enum DisplayPage { PAGE_DRIVER, PAGE_TESTING }; +#define DISPLAY_PAGES 2 + +enum Value { + VAL_GEAR, + VAL_RPM, + VAL_TT_FL, + VAL_TT_FR, + VAL_TT_RL, + VAL_TT_RR, + VAL_LAPTIME, + VAL_UBATT, + VAL_TMOT, + VAL_TAIR, + VAL_TOIL, + VAL_ERR_TYPE, + VAL_PWAT, + VAL_POIL, + VAL_PBF, + VAL_PBR, + VAL_SPEED_FL, + VAL_SPEED_FR, + VAL_SPEED, + VAL_FIRST_LEFT_BOX = VAL_LAPTIME, + VAL_LAST = VAL_SPEED +}; +String get_value(Value val); +String get_label(Value val); + +#define DISP_CLEAR_INTERVAL 5000 // ms + +void init_display(void); +void update_display(void); +void display_trc(void); +void display_mode(void); +void alarm(String text); + +bool check_alarms(); +bool check_enc_displays(); +bool check_display(uint8_t& val_old, uint8_t val_new, bool& active, + uint32_t& begin, const String& title); + +void redraw_page_driver(); +void update_page_driver(); +void redraw_page_testing(); +void update_page_testing(); + +class DataBox { +public: + DataBox(int x1, int y1, int x2, int y2, int text_x, int text_y, int font, + int size_x, int size_y, uint8_t justification); + + void update_value(String val_new); + void update_label(String label_new); + + void redraw(); + virtual void redraw_value(); + virtual void redraw_label(); + +protected: + int x1, y1, x2, y2, text_x, text_y, font, size_x, size_y; + uint8_t justification; + String value; + String label; +}; + +#define TT_COL0 EA_LIGHTBLUE +#define TT_COL1 EA_GREEN +#define TT_COL2 EA_ORANGE +#define TT_COL3 EA_RED +#define TT_THRESH1 50 +#define TT_THRESH2 60 +#define TT_THRESH3 70 + +class TireTempBox : public DataBox { +public: + TireTempBox(int x1, int y1, int x2, int y2, int text_x, int text_y, int font, + int size_x, int size_y, uint8_t justification); + + void update_value(int val_new); + + void redraw_value() override; + void redraw_label() override; + +private: + int color; + int num_value; +}; + #endif \ No newline at end of file diff --git a/lib/FT18_STW_INIT/FT18_STW_INIT.cpp b/lib/FT18_STW_INIT/FT18_STW_INIT.cpp index eec551a..563e28a 100644 --- a/lib/FT18_STW_INIT/FT18_STW_INIT.cpp +++ b/lib/FT18_STW_INIT/FT18_STW_INIT.cpp @@ -1,142 +1,144 @@ -#include "FT18_STW_INIT.h" - -#include -#include -#include - -volatile stw_data_type Stw_data = {0}; //alles mit 0 initialisieren -volatile vehicle_data_type Vehicle_data = {0}; //alles mit 0 initialisieren -bool enc1PinALast,enc1PinANow,enc2PinALast,enc2PinANow; -int led[] = {led1,led2,led3,led4,led5,led6,led7,led8,led9,led10,led11,led12,led13,led14,led15,led16}; -bool entprell; -int buttons[] = {button1,button2,button3,button4,button5,button6,enc1PinS,enc2PinS}; -constexpr size_t N_BUTTONS = sizeof(buttons)/sizeof(buttons[0]); -Bounce2::Button debouncer[N_BUTTONS]; -double val = 0; -double val2 = 0; -RotaryEncoder encoder(enc1PinA,enc1PinB,1,1,50); -RotaryEncoder encoder2(enc2PinA,enc2PinB,1,1,50); -/////////////////////////////////////////////////// -// functions -/////////////////////////////////////////////////// - -void set_pins(){ - pinMode (l,OUTPUT); - for (int thisLed = 0; thisLed < sizeof(led)/sizeof(int); thisLed++) { - pinMode(led[thisLed], OUTPUT); - } - pinMode(enc1PinA, INPUT); - pinMode(enc1PinB, INPUT); - pinMode(enc2PinA, INPUT); - pinMode(enc2PinB, INPUT); - enc1PinALast=LOW; - enc1PinANow=LOW; - enc2PinALast=LOW; - enc2PinANow=LOW; - for(int i = 0; i < N_BUTTONS; i++){ - debouncer[i].attach(buttons[i], INPUT); - debouncer[i].interval(10); - } -} - -void read_buttons(){ - for (int i = 0; i < N_BUTTONS; i++) { - debouncer[i].update(); - } - - // These are only used to send them out via CAN, so they only need to be - // high once. - Stw_data.Stw_neutral = debouncer[1].rose(); - Stw_data.Stw_auto_shift = debouncer[2].rose(); - Stw_data.Stw_shift_down = debouncer[4].rose(); - Stw_data.Stw_shift_up = debouncer[5].rose(); - - Stw_data.buttonState1 = debouncer[0].isPressed(); - Stw_data.buttonState4 = debouncer[3].isPressed(); - Stw_data.buttonStateEnc1 = debouncer[6].isPressed(); - Stw_data.buttonStateEnc2 = debouncer[7].isPressed(); - if (debouncer[0].rose()) { - Stw_data.button1_rises++; - } - if (debouncer[3].rose()) { - Stw_data.button4_rises++; - } - if (debouncer[6].rose()) { - Stw_data.enc1_rises++; - } - if (debouncer[7].rose()) { - Stw_data.enc2_rises++; - } -} - -void read_rotary(){ - int enc = encoder.readEncoder(); - int enc2 = encoder2.readEncoder(); - if(enc != 0){ - val = val +0.5*enc; - if (val==1 or val ==-1){ - if(Stw_data.trc==0 and enc<0){ - Stw_data.trc = 11; - }else if(Stw_data.trc==11 and enc>0){ - Stw_data.trc=0; - }else{ - Stw_data.trc = Stw_data.trc + enc; - } - val = 0; - } - } - /*enc1PinANow = digitalRead(enc1PinA); - enc2PinANow = digitalRead(enc2PinA); - if ((enc1PinALast == LOW) && (enc1PinANow == HIGH)) { - if (digitalRead(enc1PinB) == HIGH) { - if(Stw_data.trc==0){ - Stw_data.trc = 5; - }else{ - Stw_data.trc--; - } - }else { - if(Stw_data.trc==5){ - Stw_data.trc=0; - }else{ - Stw_data.trc++; - } - } - } - enc1PinALast = enc1PinANow; - /*if (Stw_data.buttonStateEnc1 == HIGH){ - digitalWrite(led[Stw_data.i], HIGH); - }*/ - if(enc2 != 0){ - val2 = val2 +0.5*enc2; - if(val2==1 or val2==-1){ - if((Stw_data.mode==1 or Stw_data.mode==0) and enc2<0){ - Stw_data.mode = 5; - }else if(Stw_data.mode==5 and enc2>0){ - Stw_data.mode=1; - }else{ - Stw_data.mode = Stw_data.mode + enc2; - } - val2=0; - } - } - /*if ((enc2PinALast == LOW) && (enc2PinANow == HIGH)) { - //if(enc2PinALast != enc2PinANow){ - if (digitalRead(enc2PinB) == HIGH) { - if(Stw_data.i==0){ - Stw_data.i = sizeof(led)/sizeof(int)-1; - }else{ - Stw_data.i--; - } - }else { - if(Stw_data.i==sizeof(led)/sizeof(int)-1){ - Stw_data.i=0; - }else{ - Stw_data.i++; - } - } - } - enc2PinALast = enc2PinANow;*/ - /*if (Stw_data.buttonStateEnc2 == HIGH){ - digitalWrite(led[Stw_data.i], HIGH); - }*/ -} +#include "FT18_STW_INIT.h" + +#include +#include +#include + +volatile stw_data_type Stw_data = {0}; // alles mit 0 initialisieren +volatile vehicle_data_type Vehicle_data = {0}; // alles mit 0 initialisieren +bool enc1PinALast, enc1PinANow, enc2PinALast, enc2PinANow; +int led[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; +bool entprell; +int buttons[] = {button1, button2, button3, button4, + button5, button6, enc1PinS, enc2PinS}; +constexpr size_t N_BUTTONS = sizeof(buttons) / sizeof(buttons[0]); +Bounce2::Button debouncer[N_BUTTONS]; +double val = 0; +double val2 = 0; +RotaryEncoder encoder(enc1PinA, enc1PinB, 1, 1, 50); +RotaryEncoder encoder2(enc2PinA, enc2PinB, 1, 1, 50); +/////////////////////////////////////////////////// +// functions +/////////////////////////////////////////////////// + +void set_pins() { + pinMode(l, OUTPUT); + for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++) { + pinMode(led[thisLed], OUTPUT); + } + pinMode(enc1PinA, INPUT); + pinMode(enc1PinB, INPUT); + pinMode(enc2PinA, INPUT); + pinMode(enc2PinB, INPUT); + enc1PinALast = LOW; + enc1PinANow = LOW; + enc2PinALast = LOW; + enc2PinANow = LOW; + for (int i = 0; i < N_BUTTONS; i++) { + debouncer[i].attach(buttons[i], INPUT); + debouncer[i].interval(10); + } +} + +void read_buttons() { + for (int i = 0; i < N_BUTTONS; i++) { + debouncer[i].update(); + } + + // These are only used to send them out via CAN, so they only need to be + // high once. + Stw_data.Stw_neutral = debouncer[1].rose(); + Stw_data.Stw_auto_shift = debouncer[2].rose(); + Stw_data.Stw_shift_down = debouncer[4].rose(); + Stw_data.Stw_shift_up = debouncer[5].rose(); + + Stw_data.buttonState1 = debouncer[0].isPressed(); + Stw_data.buttonState4 = debouncer[3].isPressed(); + Stw_data.buttonStateEnc1 = debouncer[6].isPressed(); + Stw_data.buttonStateEnc2 = debouncer[7].isPressed(); + if (debouncer[0].rose()) { + Stw_data.button1_rises++; + } + if (debouncer[3].rose()) { + Stw_data.button4_rises++; + } + if (debouncer[6].rose()) { + Stw_data.enc1_rises++; + } + if (debouncer[7].rose()) { + Stw_data.enc2_rises++; + } +} + +void read_rotary() { + int enc = encoder.readEncoder(); + int enc2 = encoder2.readEncoder(); + if (enc != 0) { + val = val + 0.5 * enc; + if (val == 1 or val == -1) { + if (Stw_data.trc == 0 and enc < 0) { + Stw_data.trc = 11; + } else if (Stw_data.trc == 11 and enc > 0) { + Stw_data.trc = 0; + } else { + Stw_data.trc = Stw_data.trc + enc; + } + val = 0; + } + } + /*enc1PinANow = digitalRead(enc1PinA); + enc2PinANow = digitalRead(enc2PinA); + if ((enc1PinALast == LOW) && (enc1PinANow == HIGH)) { + if (digitalRead(enc1PinB) == HIGH) { + if(Stw_data.trc==0){ + Stw_data.trc = 5; + }else{ + Stw_data.trc--; + } + }else { + if(Stw_data.trc==5){ + Stw_data.trc=0; + }else{ + Stw_data.trc++; + } + } + } + enc1PinALast = enc1PinANow; + /*if (Stw_data.buttonStateEnc1 == HIGH){ + digitalWrite(led[Stw_data.i], HIGH); + }*/ + if (enc2 != 0) { + val2 = val2 + 0.5 * enc2; + if (val2 == 1 or val2 == -1) { + if ((Stw_data.mode == 1 or Stw_data.mode == 0) and enc2 < 0) { + Stw_data.mode = 5; + } else if (Stw_data.mode == 5 and enc2 > 0) { + Stw_data.mode = 1; + } else { + Stw_data.mode = Stw_data.mode + enc2; + } + val2 = 0; + } + } + /*if ((enc2PinALast == LOW) && (enc2PinANow == HIGH)) { + //if(enc2PinALast != enc2PinANow){ + if (digitalRead(enc2PinB) == HIGH) { + if(Stw_data.i==0){ + Stw_data.i = sizeof(led)/sizeof(int)-1; + }else{ + Stw_data.i--; + } + }else { + if(Stw_data.i==sizeof(led)/sizeof(int)-1){ + Stw_data.i=0; + }else{ + Stw_data.i++; + } + } + } + enc2PinALast = enc2PinANow;*/ + /*if (Stw_data.buttonStateEnc2 == HIGH){ + digitalWrite(led[Stw_data.i], HIGH); + }*/ +} diff --git a/lib/FT18_STW_INIT/FT18_STW_INIT.h b/lib/FT18_STW_INIT/FT18_STW_INIT.h index df82997..03a593a 100644 --- a/lib/FT18_STW_INIT/FT18_STW_INIT.h +++ b/lib/FT18_STW_INIT/FT18_STW_INIT.h @@ -1,105 +1,101 @@ -#include "Arduino.h" -#ifndef FT18_STW_Init -#define FT18_STW_Init - -#define l 78 //test_led -#define led1 12//PD8 -#define led2 11//PD7 -#define led3 9//PC21 -#define led4 8//PC22 -#define led5 7//PC23 -#define led6 6//PC24 -#define led7 5//PC25 -#define led8 4//PC26 und PA29 -#define led9 3//PC28 -#define led10 2//PB25 -#define led11 10//PC29 und PA28 -#define led12 22//PB26 -#define led13 19//PA10 -#define led14 13//PB27 -#define led15 17//PA12 -#define led16 18//PA11 -#define button1 48//bl -#define button2 47//gl -#define button3 44//gr -#define button4 46//br -#define button5 45//sl -#define button6 49//sr -#define enc1PinA 37 -#define enc1PinB 38 -#define enc1PinS 35 -#define enc2PinA 40 -#define enc2PinB 41 -#define enc2PinS 39 - - -// define Drehzahlgrenzen TODOOOO - #define RPM_THRES_1 1000 - #define RPM_THRES_2 6000 - #define RPM_THRES_3 7000 - #define RPM_THRES_4 8000 - #define RPM_THRES_5 10000 - #define RPM_THRES_6 14000 - #define RPM_THRES_7 17000 - #define RPM_THRES_8 18000 - #define RPM_THRES_9 20000 - #define RPM_THRES_10 20000 - - -void set_pins(void); -void read_buttons(void); -void read_rotary(void); // read rotary switches - -typedef struct - { - uint8_t Stw_shift_up; // 1 Bit 0 - uint8_t Stw_shift_down; // 1 Bit 1 - uint8_t Stw_neutral; // 1 Bit 2 - uint8_t Stw_auto_shift; // 1 Bit 3 - uint8_t buttonState1; // 1 Bit 4 - uint8_t buttonState4; // 1 Bit 5 - //bool CAN_toggle; - //bool CAN_check; - //uint8_t i; //Index linker Drehschalter - uint8_t buttonStateEnc1; // button - //uint8_t br; //test mode : mittlere Drehschalter position - uint8_t buttonStateEnc2; //button - uint8_t displayindex; //index für Displayanzeige - uint8_t error_type; //Extrainfos über Error-LED - uint8_t trc; - uint8_t mode; - - uint8_t button1_rises; - uint8_t button4_rises; - uint8_t enc1_rises; - uint8_t enc2_rises; - } stw_data_type; - - typedef struct - { - uint8_t e_thro; // E-Drossel - uint8_t g_auto; // Auto-Shift - uint8_t gear; // Gang - uint16_t revol; // Drehzahl - uint8_t t_oil; // Öl-Motor-Temperatur - uint8_t t_mot; // Wasser-Motor-Temperatur - uint8_t t_air; // LLK-Temperatur - uint8_t u_batt; // Batteriespannung - uint8_t rev_lim; // Drehzahllimit Bit - uint8_t p_wat; - uint8_t p_fuel; - uint8_t p_oil; - uint8_t p_brake_front; - uint8_t p_brake_rear; - uint8_t speed_fl; - uint8_t speed_fr; - uint8_t speed; - - } vehicle_data_type; - - - extern volatile stw_data_type Stw_data; - extern volatile vehicle_data_type Vehicle_data; - - +#include "Arduino.h" +#ifndef FT18_STW_Init +#define FT18_STW_Init + +#define l 78 // test_led +#define led1 12 // PD8 +#define led2 11 // PD7 +#define led3 9 // PC21 +#define led4 8 // PC22 +#define led5 7 // PC23 +#define led6 6 // PC24 +#define led7 5 // PC25 +#define led8 4 // PC26 und PA29 +#define led9 3 // PC28 +#define led10 2 // PB25 +#define led11 10 // PC29 und PA28 +#define led12 22 // PB26 +#define led13 19 // PA10 +#define led14 13 // PB27 +#define led15 17 // PA12 +#define led16 18 // PA11 +#define button1 48 // bl +#define button2 47 // gl +#define button3 44 // gr +#define button4 46 // br +#define button5 45 // sl +#define button6 49 // sr +#define enc1PinA 37 +#define enc1PinB 38 +#define enc1PinS 35 +#define enc2PinA 40 +#define enc2PinB 41 +#define enc2PinS 39 + +// define Drehzahlgrenzen TODOOOO +#define RPM_THRES_1 1000 +#define RPM_THRES_2 6000 +#define RPM_THRES_3 7000 +#define RPM_THRES_4 8000 +#define RPM_THRES_5 10000 +#define RPM_THRES_6 14000 +#define RPM_THRES_7 17000 +#define RPM_THRES_8 18000 +#define RPM_THRES_9 20000 +#define RPM_THRES_10 20000 + +void set_pins(void); +void read_buttons(void); +void read_rotary(void); // read rotary switches + +typedef struct { + uint8_t Stw_shift_up; // 1 Bit 0 + uint8_t Stw_shift_down; // 1 Bit 1 + uint8_t Stw_neutral; // 1 Bit 2 + uint8_t Stw_auto_shift; // 1 Bit 3 + uint8_t buttonState1; // 1 Bit 4 + uint8_t buttonState4; // 1 Bit 5 + // bool CAN_toggle; + // bool CAN_check; + // uint8_t i; //Index + // linker Drehschalter + uint8_t buttonStateEnc1; // button + // uint8_t br; //test mode : mittlere + // Drehschalter position + uint8_t buttonStateEnc2; // button + uint8_t displayindex; // index für Displayanzeige + uint8_t error_type; // Extrainfos über Error-LED + uint8_t trc; + uint8_t mode; + + uint8_t button1_rises; + uint8_t button4_rises; + uint8_t enc1_rises; + uint8_t enc2_rises; +} stw_data_type; + +typedef struct { + uint8_t e_thro; // E-Drossel + uint8_t g_auto; // Auto-Shift + uint8_t gear; // Gang + uint16_t revol; // Drehzahl + uint8_t t_oil; // Öl-Motor-Temperatur + uint8_t t_mot; // Wasser-Motor-Temperatur + uint8_t t_air; // LLK-Temperatur + uint8_t u_batt; // Batteriespannung + uint8_t rev_lim; // Drehzahllimit Bit + uint8_t p_wat; + uint8_t p_fuel; + uint8_t p_oil; + uint8_t p_brake_front; + uint8_t p_brake_rear; + uint8_t speed_fl; + uint8_t speed_fr; + uint8_t speed; + +} vehicle_data_type; + +extern volatile stw_data_type Stw_data; +extern volatile vehicle_data_type Vehicle_data; + #endif \ No newline at end of file diff --git a/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.cpp b/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.cpp index 94079a9..6b3c6b4 100644 --- a/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.cpp +++ b/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.cpp @@ -1,171 +1,149 @@ -#include "Arduino.h" -#include "EDIPTFT.h" -#include "FT_2018e_STW_CAN.h" -#include "FT18e_STW_INIT.h" -#include "FT18e_STW_DISPLAY.h" - -EDIPTFT tft(true, false); -String bezeichnungen[] = {"Batterieleistung", "Moment", "Batterietemp"}; -//"T_mot","T_oil","P_oil","% fa","U_batt","P_wat","T_air", -//"P_b_front","P_b_rear","Error Type","Speed_fl","Speed_fr","Speed"}; -//"Drehzahl","P_fuel","Index" -int vergleichsindex; -int sizeaalt; -int sizeaneu; -int sizebalt; -int sizebneu; -int sizecalt; -int sizecneu; -int sizedalt; -int sizedneu; -int sizeealt; -int sizeeneu; -uint8_t clearcounter = 56; -uint8_t modealt = Stw_data.mode; -uint8_t trccounter; // = Stw_data.trc; -uint8_t modecounter; // = Stw_data.mode; -bool trctimer; -bool modetimer; -int led_s[] = {led1, led2, led3, led4, led5, led6, led7, led8, led9, led10, led11, led12, led13, led14, led15, led16}; -unsigned long poiltimer; -unsigned long tmottimer; -unsigned long toiltimer; -bool poilbool = true; -bool tmotbool = true; -bool toilbool = true; - -void init_display() -{ - pinMode(writeprotect, OUTPUT); - digitalWrite(writeprotect, HIGH); - pinMode(reset, OUTPUT); - pinMode(disp_cs, OUTPUT); - pinMode(MOSI, OUTPUT); - pinMode(MISO, OUTPUT); - //pinMode(CLK, INPUT); - digitalWrite(disp_cs, HIGH); - digitalWrite(MOSI, HIGH); - digitalWrite(MISO, HIGH); - digitalWrite(reset, LOW); - //edip.smallProtoSelect(7); - //edip.setNewColor(EA_GREY, 0xe3, 0xe3,0xe3); // redefine r-g-b-values of EA_GREY - //edip.drawImage(0,50,FASTTUBE_LOGO_PNG); - digitalWrite(reset, HIGH); - tft.begin(115200); // start display communication - /*int h = 20; - char charh[2]; - String strh = String(h); - strh.toCharArray(charh,2); - tft.DisplayLight(charh);*/ - tft.cursorOn(false); - tft.terminalOn(false); - tft.setDisplayColor(EA_WHITE, EA_BLACK); - tft.setTextColor(EA_WHITE, EA_BLACK); - //tft.setTextFont('4'); - tft.setTextSize(5, 8); - tft.clear(); - //tft.displayLight('30'); - tft.drawText(0, 14, 'C', "FaSTTUBe"); //draw some text - //tft.loadImage(0,0,1); - //delay(2000); -} - -double get_value(int a) -{ - return 0; -} - -void update_display() -{ - if (!tft.disconnected) - { - tft.cursorOn(false); - if (modealt != Stw_data.mode || modetimer == true) - { - display_mode(); - } - else - { - if (clearcounter >= 56) - { - tft.clear(); - clearcounter = 0; - } - clearcounter += 1; - } - } -} - -void display_mode() -{ - if (modealt != Stw_data.mode) - { - tft.clear(); - tft.setTextSize(6, 8); - tft.setDisplayColor(EA_WHITE, EA_RED); - tft.setTextColor(EA_WHITE, EA_RED); - char modeanzeige[7]; - String str = String("MODE:"); - str += String(Stw_data.mode); - str.toCharArray(modeanzeige, 7); - tft.drawText(0, 0, 'L', " "); - tft.drawText(0, 60, 'L', " "); - tft.drawText(0, 120, 'L', " "); - tft.drawText(0, 180, 'L', " "); - tft.drawText(15, 68, 'L', modeanzeige); - modecounter = 0; - modealt = Stw_data.mode; - modetimer = true; - } - else if (modecounter >= 255) - { - tft.setDisplayColor(EA_WHITE, EA_BLACK); - tft.setTextColor(EA_WHITE, EA_BLACK); - tft.clear(); - modetimer = false; - } - else - { - modecounter += 1; - delay(5); - } -} - -void alarm(String textstr) -{ - uint8_t x = 1; - ; - char text[7]; - textstr.toCharArray(text, 7); - tft.setTextSize(8, 8); - while (x == 1) - { - if (!tft.disconnected) - { - tft.setTextColor(EA_BLACK, EA_RED); - tft.fillDisplayColor(EA_RED); - tft.drawText(5, 68, 'L', text); - } - for (int j = 0; j < 16; j++) - { - digitalWrite(led_s[j], HIGH); - } - delay(100); - if (!tft.disconnected) - { - tft.setTextColor(EA_BLACK, EA_WHITE); - tft.fillDisplayColor(EA_WHITE); - tft.drawText(5, 68, 'L', text); - } - for (int j = 0; j < 16; j++) - { - digitalWrite(led_s[j], LOW); - } - delay(100); - if (Stw_data.button_ll & Stw_data.button_rr) - { - x = 0; - tft.setTextColor(EA_WHITE, EA_BLACK); - } - } +#include "FT18e_STW_DISPLAY.h" +#include "Arduino.h" +#include "EDIPTFT.h" +#include "FT18e_STW_INIT.h" +#include "FT_2018e_STW_CAN.h" + +EDIPTFT tft(true, false); +String bezeichnungen[] = {"Batterieleistung", "Moment", "Batterietemp"}; +//"T_mot","T_oil","P_oil","% fa","U_batt","P_wat","T_air", +//"P_b_front","P_b_rear","Error Type","Speed_fl","Speed_fr","Speed"}; +//"Drehzahl","P_fuel","Index" +int vergleichsindex; +int sizeaalt; +int sizeaneu; +int sizebalt; +int sizebneu; +int sizecalt; +int sizecneu; +int sizedalt; +int sizedneu; +int sizeealt; +int sizeeneu; +uint8_t clearcounter = 56; +uint8_t modealt = Stw_data.mode; +uint8_t trccounter; // = Stw_data.trc; +uint8_t modecounter; // = Stw_data.mode; +bool trctimer; +bool modetimer; +int led_s[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; +unsigned long poiltimer; +unsigned long tmottimer; +unsigned long toiltimer; +bool poilbool = true; +bool tmotbool = true; +bool toilbool = true; + +void init_display() { + pinMode(writeprotect, OUTPUT); + digitalWrite(writeprotect, HIGH); + pinMode(reset, OUTPUT); + pinMode(disp_cs, OUTPUT); + pinMode(MOSI, OUTPUT); + pinMode(MISO, OUTPUT); + // pinMode(CLK, INPUT); + digitalWrite(disp_cs, HIGH); + digitalWrite(MOSI, HIGH); + digitalWrite(MISO, HIGH); + digitalWrite(reset, LOW); + // edip.smallProtoSelect(7); + // edip.setNewColor(EA_GREY, 0xe3, 0xe3,0xe3); // redefine r-g-b-values + // of EA_GREY edip.drawImage(0,50,FASTTUBE_LOGO_PNG); + digitalWrite(reset, HIGH); + tft.begin(115200); // start display communication + /*int h = 20; + char charh[2]; + String strh = String(h); + strh.toCharArray(charh,2); + tft.DisplayLight(charh);*/ + tft.cursorOn(false); + tft.terminalOn(false); + tft.setDisplayColor(EA_WHITE, EA_BLACK); + tft.setTextColor(EA_WHITE, EA_BLACK); + // tft.setTextFont('4'); + tft.setTextSize(5, 8); + tft.clear(); + // tft.displayLight('30'); + tft.drawText(0, 14, 'C', "FaSTTUBe"); // draw some text + // tft.loadImage(0,0,1); + // delay(2000); +} + +double get_value(int a) { return 0; } + +void update_display() { + if (!tft.disconnected) { + tft.cursorOn(false); + if (modealt != Stw_data.mode || modetimer == true) { + display_mode(); + } else { + if (clearcounter >= 56) { + tft.clear(); + clearcounter = 0; + } + clearcounter += 1; + } + } +} + +void display_mode() { + if (modealt != Stw_data.mode) { + tft.clear(); + tft.setTextSize(6, 8); + tft.setDisplayColor(EA_WHITE, EA_RED); + tft.setTextColor(EA_WHITE, EA_RED); + char modeanzeige[7]; + String str = String("MODE:"); + str += String(Stw_data.mode); + str.toCharArray(modeanzeige, 7); + tft.drawText(0, 0, 'L', " "); + tft.drawText(0, 60, 'L', " "); + tft.drawText(0, 120, 'L', " "); + tft.drawText(0, 180, 'L', " "); + tft.drawText(15, 68, 'L', modeanzeige); + modecounter = 0; + modealt = Stw_data.mode; + modetimer = true; + } else if (modecounter >= 255) { + tft.setDisplayColor(EA_WHITE, EA_BLACK); + tft.setTextColor(EA_WHITE, EA_BLACK); + tft.clear(); + modetimer = false; + } else { + modecounter += 1; + delay(5); + } +} + +void alarm(String textstr) { + uint8_t x = 1; + ; + char text[7]; + textstr.toCharArray(text, 7); + tft.setTextSize(8, 8); + while (x == 1) { + if (!tft.disconnected) { + tft.setTextColor(EA_BLACK, EA_RED); + tft.fillDisplayColor(EA_RED); + tft.drawText(5, 68, 'L', text); + } + for (int j = 0; j < 16; j++) { + digitalWrite(led_s[j], HIGH); + } + delay(100); + if (!tft.disconnected) { + tft.setTextColor(EA_BLACK, EA_WHITE); + tft.fillDisplayColor(EA_WHITE); + tft.drawText(5, 68, 'L', text); + } + for (int j = 0; j < 16; j++) { + digitalWrite(led_s[j], LOW); + } + delay(100); + if (Stw_data.button_ll & Stw_data.button_rr) { + x = 0; + tft.setTextColor(EA_WHITE, EA_BLACK); + } + } } \ No newline at end of file diff --git a/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.h b/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.h index 94d645d..f887b58 100644 --- a/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.h +++ b/lib/FT18e_STW_DISPLAY/FT18e_STW_DISPLAY.h @@ -1,26 +1,26 @@ -#include "Arduino.h" -#include "EDIPTFT.h" -#include "FT_2018e_STW_CAN.h" -#include "FT18e_STW_INIT.h" -#ifndef FT18e_STW_DISPLAY_h -#define FT18e_STW_DISPLAY_h - -#define EA_BLACK 1 -#define EA_RED 3 -#define EA_GREY 10 -#define EA_WHITE 8 - -#define MOSI 75 -#define MISO 74 -#define CLK 76 -#define disp_cs 42 -#define reset 43 -#define writeprotect 52 - -void init_display(void); -void update_display(void); -double get_value(int a); -void display_mode(void); -void alarm(String text); - +#include "Arduino.h" +#include "EDIPTFT.h" +#include "FT18e_STW_INIT.h" +#include "FT_2018e_STW_CAN.h" +#ifndef FT18e_STW_DISPLAY_h +#define FT18e_STW_DISPLAY_h + +#define EA_BLACK 1 +#define EA_RED 3 +#define EA_GREY 10 +#define EA_WHITE 8 + +#define MOSI 75 +#define MISO 74 +#define CLK 76 +#define disp_cs 42 +#define reset 43 +#define writeprotect 52 + +void init_display(void); +void update_display(void); +double get_value(int a); +void display_mode(void); +void alarm(String text); + #endif \ No newline at end of file diff --git a/lib/FT18e_STW_INIT/FT18e_STW_INIT.cpp b/lib/FT18e_STW_INIT/FT18e_STW_INIT.cpp index c369779..653fe04 100644 --- a/lib/FT18e_STW_INIT/FT18e_STW_INIT.cpp +++ b/lib/FT18e_STW_INIT/FT18e_STW_INIT.cpp @@ -1,84 +1,74 @@ -#include "Arduino.h" -#include "FT18e_STW_INIT.h" -#include "Bounce2.h" -#include "RotaryEncoder.h" - -volatile stw_data_type Stw_data = {0}; //alles mit 0 initialisieren -volatile vehicle_data_type Vehicle_data = {0}; //alles mit 0 initialisieren -bool enc1PinALast, enc1PinANow, enc2PinALast, enc2PinANow; -int led[] = {led1, led2, led3, led4, led5, led6, led7, led8, led9, led10, led11, led12, led13, led14, led15, led16}; -bool entprell; -int buttons[] = {PIN_BUTTON_LL, PIN_BUTTON_LR, PIN_BUTTON_RL, PIN_BUTTON_RR, enc1PinS, enc2PinS}; -Bounce debouncer[8]; -double val = 0; -double val2 = 0; -RotaryEncoder encoder(enc1PinA, enc1PinB, 1, 1, 50); -RotaryEncoder encoder2(enc2PinA, enc2PinB, 1, 1, 50); -/////////////////////////////////////////////////// -// functions -/////////////////////////////////////////////////// - -void set_pins() -{ - for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++) - { - pinMode(led[thisLed], OUTPUT); - } - pinMode(l, OUTPUT); - /*pinMode(button1, INPUT); - pinMode(button2, INPUT); - pinMode(button3, INPUT); - pinMode(button4, INPUT); - pinMode(button5, INPUT); - pinMode(button6, INPUT);*/ - pinMode(enc1PinA, INPUT); - pinMode(enc1PinB, INPUT); - //pinMode(enc1PinS, INPUT); - pinMode(enc2PinA, INPUT); - pinMode(enc2PinB, INPUT); - //pinMode(enc2PinS, INPUT); - //Stw_data.i=0; - enc1PinALast = LOW; - enc1PinANow = LOW; - enc2PinALast = LOW; - enc2PinANow = LOW; - for (int i = 0; i < sizeof(buttons) / sizeof(*buttons); i++) - { - pinMode(buttons[i], INPUT); - debouncer[i].attach(buttons[i]); - debouncer[i].interval(10); - } -} - -void read_buttons() -{ - Stw_data.button_ll = digitalRead(PIN_BUTTON_LL); - Stw_data.button_lr = digitalRead(PIN_BUTTON_LR); - Stw_data.button_rl = digitalRead(PIN_BUTTON_RL); - Stw_data.button_rr = digitalRead(PIN_BUTTON_RR); -} - -void read_rotary() -{ - int enc2 = encoder2.readEncoder(); - if (enc2 != 0) - { - val2 = val2 + 0.5 * enc2; - if (val2 == 1 or val2 == -1) - { - if ((Stw_data.mode == 1 or Stw_data.mode == 0) and enc2 < 0) - { - Stw_data.mode = 5; - } - else if (Stw_data.mode == 5 and enc2 > 0) - { - Stw_data.mode = 1; - } - else - { - Stw_data.mode = Stw_data.mode + enc2; - } - val2 = 0; - } - } +#include "FT18e_STW_INIT.h" +#include "Arduino.h" +#include "Bounce2.h" +#include "RotaryEncoder.h" + +volatile stw_data_type Stw_data = {0}; // alles mit 0 initialisieren +volatile vehicle_data_type Vehicle_data = {0}; // alles mit 0 initialisieren +bool enc1PinALast, enc1PinANow, enc2PinALast, enc2PinANow; +int led[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; +bool entprell; +int buttons[] = {PIN_BUTTON_LL, PIN_BUTTON_LR, PIN_BUTTON_RL, + PIN_BUTTON_RR, enc1PinS, enc2PinS}; +Bounce debouncer[8]; +double val = 0; +double val2 = 0; +RotaryEncoder encoder(enc1PinA, enc1PinB, 1, 1, 50); +RotaryEncoder encoder2(enc2PinA, enc2PinB, 1, 1, 50); +/////////////////////////////////////////////////// +// functions +/////////////////////////////////////////////////// + +void set_pins() { + for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++) { + pinMode(led[thisLed], OUTPUT); + } + pinMode(l, OUTPUT); + /*pinMode(button1, INPUT); + pinMode(button2, INPUT); + pinMode(button3, INPUT); + pinMode(button4, INPUT); + pinMode(button5, INPUT); + pinMode(button6, INPUT);*/ + pinMode(enc1PinA, INPUT); + pinMode(enc1PinB, INPUT); + // pinMode(enc1PinS, INPUT); + pinMode(enc2PinA, INPUT); + pinMode(enc2PinB, INPUT); + // pinMode(enc2PinS, INPUT); + // Stw_data.i=0; + enc1PinALast = LOW; + enc1PinANow = LOW; + enc2PinALast = LOW; + enc2PinANow = LOW; + for (int i = 0; i < sizeof(buttons) / sizeof(*buttons); i++) { + pinMode(buttons[i], INPUT); + debouncer[i].attach(buttons[i]); + debouncer[i].interval(10); + } +} + +void read_buttons() { + Stw_data.button_ll = digitalRead(PIN_BUTTON_LL); + Stw_data.button_lr = digitalRead(PIN_BUTTON_LR); + Stw_data.button_rl = digitalRead(PIN_BUTTON_RL); + Stw_data.button_rr = digitalRead(PIN_BUTTON_RR); +} + +void read_rotary() { + int enc2 = encoder2.readEncoder(); + if (enc2 != 0) { + val2 = val2 + 0.5 * enc2; + if (val2 == 1 or val2 == -1) { + if ((Stw_data.mode == 1 or Stw_data.mode == 0) and enc2 < 0) { + Stw_data.mode = 5; + } else if (Stw_data.mode == 5 and enc2 > 0) { + Stw_data.mode = 1; + } else { + Stw_data.mode = Stw_data.mode + enc2; + } + val2 = 0; + } + } } \ No newline at end of file diff --git a/lib/FT18e_STW_INIT/FT18e_STW_INIT.h b/lib/FT18e_STW_INIT/FT18e_STW_INIT.h index 7f6bfb2..8c15e5b 100644 --- a/lib/FT18e_STW_INIT/FT18e_STW_INIT.h +++ b/lib/FT18e_STW_INIT/FT18e_STW_INIT.h @@ -1,98 +1,95 @@ -#include "Arduino.h" -#ifndef FT18e_STW_Init -#define FT18e_STW_Init - -#define l 78 //test_led -#define led1 12 //PD8 -#define led2 11 //PD7 -#define led3 9 //PC21 -#define led4 8 //PC22 -#define led5 7 //PC23 -#define led6 6 //PC24 -#define led7 5 //PC25 -#define led8 4 //PC26 und PA29 -#define led9 3 //PC28 -#define led10 2 //PB25 -#define led11 10 //PC29 und PA28 -#define led12 22 //PB26 -#define led13 19 //PA10 -#define led14 13 //PB27 -#define led15 17 //PA12 -#define led16 18 //PA11 -#define enc1PinA 37 -#define enc1PinB 38 -#define enc1PinS 35 -#define enc2PinA 40 -#define enc2PinB 41 -#define enc2PinS 39 - -constexpr int PIN_BUTTON_LL = 47; -constexpr int PIN_BUTTON_LR = 48; -constexpr int PIN_BUTTON_RL = 46; -constexpr int PIN_BUTTON_RR = 44; - -constexpr int16_t RPM_THRESH_1 = 1000; -constexpr int16_t RPM_THRESH_2 = 4000; -constexpr int16_t RPM_THRESH_3 = 6000; -constexpr int16_t RPM_THRESH_4 = 8000; -constexpr int16_t RPM_THRESH_5 = 10000; -constexpr int16_t RPM_THRESH_6 = 12000; -constexpr int16_t RPM_THRESH_7 = 14000; -constexpr int16_t RPM_THRESH_8 = 16000; -constexpr int16_t RPM_THRESH_9 = 18000; -constexpr int16_t RPM_THRESH_10 = 20000; - -constexpr int16_t LED_THRESH_T_MOT = 7000; // 1/100°C -constexpr int16_t LED_THRESH_T_INV = 6000; // 1/100°C -constexpr int16_t LED_THRESH_T_BAT = 5000; // 1/100°C -constexpr uint16_t LED_THRESH_U_BATT = 350; // 1/100V - -void set_pins(void); -void read_buttons(void); -void read_rotary(void); // read rotary switches - -typedef struct -{ - bool button_ll; // Left side, left button - bool button_lr; // Left side, right button - bool button_rl; // Right side, left button - bool button_rr; // Right side, right button - uint8_t mode; - uint8_t displayindex; //index für Displayanzeige - uint8_t error_type; //Extrainfos über Error-LED - -} stw_data_type; - -struct InverterData -{ - bool ready; - bool derating; - bool warning; - bool error; - bool on; - bool precharge; - bool ams_emerg; - bool ts_active; -}; - -typedef struct -{ - uint16_t u_cell_min; // Minimale Zellspannung - uint16_t u_batt; // Batteriespannung (pre-AIR-voltage) - int16_t t_mot_l; // Motor-Wasser-Temperatur Links - int16_t t_mot_r; // Motor-Wasser-Temperatur Rechts - int16_t t_cell_max; // Maximale Zelltemperatur - int16_t t_inv; - int16_t t_wat; - int16_t p_wat; - uint8_t speed; - InverterData inverter; - bool rev_lim; // Drehzahllimit Bit - int16_t revol; // Drehzahl - int16_t wheel_speed; -} vehicle_data_type; - -extern volatile stw_data_type Stw_data; -extern volatile vehicle_data_type Vehicle_data; - +#include "Arduino.h" +#ifndef FT18e_STW_Init +#define FT18e_STW_Init + +#define l 78 // test_led +#define led1 12 // PD8 +#define led2 11 // PD7 +#define led3 9 // PC21 +#define led4 8 // PC22 +#define led5 7 // PC23 +#define led6 6 // PC24 +#define led7 5 // PC25 +#define led8 4 // PC26 und PA29 +#define led9 3 // PC28 +#define led10 2 // PB25 +#define led11 10 // PC29 und PA28 +#define led12 22 // PB26 +#define led13 19 // PA10 +#define led14 13 // PB27 +#define led15 17 // PA12 +#define led16 18 // PA11 +#define enc1PinA 37 +#define enc1PinB 38 +#define enc1PinS 35 +#define enc2PinA 40 +#define enc2PinB 41 +#define enc2PinS 39 + +constexpr int PIN_BUTTON_LL = 47; +constexpr int PIN_BUTTON_LR = 48; +constexpr int PIN_BUTTON_RL = 46; +constexpr int PIN_BUTTON_RR = 44; + +constexpr int16_t RPM_THRESH_1 = 1000; +constexpr int16_t RPM_THRESH_2 = 4000; +constexpr int16_t RPM_THRESH_3 = 6000; +constexpr int16_t RPM_THRESH_4 = 8000; +constexpr int16_t RPM_THRESH_5 = 10000; +constexpr int16_t RPM_THRESH_6 = 12000; +constexpr int16_t RPM_THRESH_7 = 14000; +constexpr int16_t RPM_THRESH_8 = 16000; +constexpr int16_t RPM_THRESH_9 = 18000; +constexpr int16_t RPM_THRESH_10 = 20000; + +constexpr int16_t LED_THRESH_T_MOT = 7000; // 1/100°C +constexpr int16_t LED_THRESH_T_INV = 6000; // 1/100°C +constexpr int16_t LED_THRESH_T_BAT = 5000; // 1/100°C +constexpr uint16_t LED_THRESH_U_BATT = 350; // 1/100V + +void set_pins(void); +void read_buttons(void); +void read_rotary(void); // read rotary switches + +typedef struct { + bool button_ll; // Left side, left button + bool button_lr; // Left side, right button + bool button_rl; // Right side, left button + bool button_rr; // Right side, right button + uint8_t mode; + uint8_t displayindex; // index für Displayanzeige + uint8_t error_type; // Extrainfos über Error-LED + +} stw_data_type; + +struct InverterData { + bool ready; + bool derating; + bool warning; + bool error; + bool on; + bool precharge; + bool ams_emerg; + bool ts_active; +}; + +typedef struct { + uint16_t u_cell_min; // Minimale Zellspannung + uint16_t u_batt; // Batteriespannung (pre-AIR-voltage) + int16_t t_mot_l; // Motor-Wasser-Temperatur Links + int16_t t_mot_r; // Motor-Wasser-Temperatur Rechts + int16_t t_cell_max; // Maximale Zelltemperatur + int16_t t_inv; + int16_t t_wat; + int16_t p_wat; + uint8_t speed; + InverterData inverter; + bool rev_lim; // Drehzahllimit Bit + int16_t revol; // Drehzahl + int16_t wheel_speed; +} vehicle_data_type; + +extern volatile stw_data_type Stw_data; +extern volatile vehicle_data_type Vehicle_data; + #endif \ No newline at end of file diff --git a/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.cpp b/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.cpp index 986d6be..0ff59ff 100644 --- a/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.cpp +++ b/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.cpp @@ -1,269 +1,281 @@ -/* -FT_2018_STW_CAN.cpp -*/ - -#include "Arduino.h" -#include "DueTimer.h" -#include "due_can.h" -#include "FT_2018_STW_CAN.h" -#include "FT18_STW_INIT.h" - -CAN_FRAME can_0_msg; -//can_1_msg.id = 0x110; -int can_0_temp_data = 0; -int leds[] = {led1,led2,led3,led4,led5,led6,led7,led8,led9,led10,led11,led12,led13,led14,led15,led16}; - - -void Init_Can_0(){ - Can0.begin(1000000); // set CAN0 baud to 1kbit/s and don`t use enable pin! - Can0.setNumTXBoxes(1); // reserves mailbox 0 for tx only 8 mailboxes are available (the other 7 mailboxes are for rx) - Can0.watchFor(0x502); // set CAN RX filter for ID 0x502 and reserves mailbox 1 for rx - Can0.watchFor(0x504); - Can0.watchFor(0x500); - Can0.watchFor(0x773); // set CAN RX filter for ID 0x773 and reserves mailbox 3 for rx - Can0.watchFor(0x775); -// Can0.watchFor(0x777); // set CAN RX filter for ID 0x777 and reserves mailbox 5 for rx - Can0.watchFor(0x779); // set CAN RX filter for ID 0x779 and reserves mailbox 6 for rx - Can0.watchFor(0x77A); - Can0.setGeneralCallback(Receive_Can_0); - Timer3.attachInterrupt(Send_0x110); // set send interrupt - Timer3.start(10000); // Calls every 10ms -} - -void Send_0x110(){ - read_buttons(); - read_rotary(); - can_0_msg.id = 0x110; - can_0_msg.fid = 0; - can_0_msg.rtr = 0; - can_0_msg.priority = 0; - can_0_msg.length = 2; - can_0_msg.extended = 0; - can_0_temp_data = 0; - can_0_temp_data |= Stw_data.Stw_shift_up & 0b00000001; - can_0_temp_data |= Stw_data.Stw_shift_down << 1 & 0b00000010; - can_0_temp_data |= Stw_data.Stw_neutral << 2 & 0b00000100; - can_0_temp_data |= Stw_data.Stw_auto_shift << 3 & 0b00001000; - can_0_temp_data |= Stw_data.buttonStateEnc1 << 5 & 0b00100000; //pitlane - can_0_msg.data.byte[0] = can_0_temp_data; - can_0_msg.data.byte[1] = Stw_data.trc & 0b00001111; - can_0_msg.data.byte[2] = Stw_data.mode & 0b00000111; - if ((Stw_data.Stw_auto_shift << 3 & 0b00001000)){ - if(Vehicle_data.g_auto){ - Vehicle_data.g_auto = false; - }else{ - Vehicle_data.g_auto = true; - } - } - Can0.sendFrame(can_0_msg); -} - -void Receive_Can_0(CAN_FRAME *temp_message){ - switch (temp_message->id) { - //g_auto - case 0x502:{ // eDrossel error bit - Vehicle_data.e_thro = (temp_message->data.byte[0] & 0x80) | (temp_message->data.byte[0] & 0x40) | (temp_message->data.byte[0] & 0x20) | (temp_message->data.byte[0] & 0x10); // bit 4-7 - - if(temp_message->data.byte[0] & 0x80){ - Stw_data.error_type = 1;//"pc_error"; - } - if(temp_message->data.byte[0] & 0x40){ - Stw_data.error_type = 2;//"bse_error"; - } - if(temp_message->data.byte[0] & 0x20){ - Stw_data.error_type = 3;//"aps_error"; - } - if(temp_message->data.byte[0] & 0x10){ - Stw_data.error_type = 4;//"etb_error"; - } - //can_1_temp_data |= g_etb_e << 4; - //can_1_temp_data |= g_aps_e << 5; - //can_1_temp_data |= g_bse_e << 6; - //can_1_temp_data |= g_pc_e << 7; - break; - } - case 0x504:{ //autoshift+gear - //Vehicle_data.g_auto = (temp_message->data.byte[1]) >> 4; - Vehicle_data.gear = (temp_message->data.byte[1]) >> 5; - break; - } - case 0x773:{ // rpm - Vehicle_data.revol = (temp_message->data.byte[4] | temp_message->data.byte[3] << 8); - break; - } - case 0x779:{ // battery voltage - Vehicle_data.u_batt = temp_message->data.byte[6]; - break; - } - /*case 0x77A: // revolution limit bit - Vehicle_data.rev_lim = (temp_message->data.byte[3] & 0x20) >> 4; - switch(temp_message->data.byte[0]) { - case 0x02: // temp. intercooler - Vehicle_data.t_air = temp_message->data.byte[7]; - break; - case 0x05: // temp. water - Vehicle_data.t_mot = temp_message->data.byte[4]; - break; - case 0x04: // temp. oil - Vehicle_data.t_oil = temp_message->data.byte[5]; - case 0x01: { - Vehicle_data.p_wat = temp_message->data.byte[6]; - Vehicle_data.p_fuel = temp_message->data.byte[7]; - Vehicle_data.p_oil = temp_message->data.byte[5]; - break; - } - } - break;*/ - case 0x77A:{//temp und p - //g_ms4_idle_b = (temp_message->data.byte[2] & 0b10000000) >> 7; - //g_ms4_engine_status = (temp_message->data.byte[3] & 0b01000000) >> 6; - //g_ms4_ignoff_b = (temp_message->data.byte[3] & 0b10000000) >> 7; - // Serial.println("CAN 77A"); - // for (int i = 0; i < 8; i++) { - // Serial.print('['); - // Serial.print(i); - // Serial.print("] "); - // Serial.println(temp_message->data.byte[i], HEX); - // } - - if ( temp_message->data.byte[0] == 1){ - Vehicle_data.p_oil = temp_message->data.byte[5]; - Vehicle_data.p_fuel = temp_message->data.byte[7]; - } - else if ( temp_message->data.byte[0] == 2){ - Vehicle_data.t_air = temp_message->data.byte[7]; - } - else if ( temp_message->data.byte[0] == 4){ - Vehicle_data.t_oil = temp_message->data.byte[5]; - } - else if ( temp_message->data.byte[0] == 5){ - Vehicle_data.t_mot = temp_message->data.byte[4]; - } - break; - } - case 0x775:{//speed - Vehicle_data.speed_fl = 2*(temp_message->data.byte[2]); - Vehicle_data.speed_fr = 2*(temp_message->data.byte[3]); - Vehicle_data.speed = (Vehicle_data.speed_fl+Vehicle_data.speed_fr)/2; - break; - } - /*case 0x777:{//m4_gear - Vehicle_data.gear = temp_message->data.byte[0]; - break; - }*/ - case 0x500:{ - Vehicle_data.p_brake_front = temp_message->data.byte[1]; - Vehicle_data.p_brake_rear = temp_message->data.byte[2]; - break; - } - } -} - -void update_LED(){ -//Copyright Michael Dietzel -//m.dietzel@fasttube.de -//Edit Michael Witt 05-2015 -//m.witt@fasttube.de - -//EDIT BAHA ZARROUKI 05-2107 -//z.baha@fasttube.de - -// alle Werte als Hex-Werte angegeben - bool t_oil = (Vehicle_data.t_oil - 40) >= 0x96; // 150°C temp.oil - bool t_air = (Vehicle_data.t_air - 40) >= 0x3C; // 60°C temp.llk - bool t_mot = ((Vehicle_data.t_mot - 40) >= 0x69) and ((Vehicle_data.t_mot - 40)!=0xC8); // 105°C temp.water und !=200 - - bool g_auto = Vehicle_data.g_auto; - bool u_batt = Vehicle_data.u_batt <= 0xB1; // 12.5V batt.spann. - bool e_dros = Vehicle_data.e_thro; // error-bit - - bool rev_lim = Vehicle_data.rev_lim; - - uint16_t rev = Vehicle_data.revol; - - /*if(Vehicle_data.rev_lim){ - for (int j = 0; j < 10; j++){ - digitalWrite(leds[j], HIGH); - //analogWrite(leds[j], STW_data.br); //nur eine der zwei zeilen - } - delay(100); - for (int j = 0; j < 10; j++){ - digitalWrite(leds[j], LOW); - } - delay(100); - }else{*/ - /*uint8_t helligkeit = 20; - if(RPM_THRES_1 <= rev){ - analogWrite(led1, helligkeit); - }else{ - analogWrite(led1, 0); - } - if(RPM_THRES_2 <= rev){ - analogWrite(led2, helligkeit); - }else{ - analogWrite(led2, 0); - } - if(RPM_THRES_3 <= rev){ - analogWrite(led3, helligkeit); - }else{ - analogWrite(led3, 0); - } - if(RPM_THRES_4 <= rev){ - analogWrite(led4, helligkeit); - }else{ - analogWrite(led4, 0); - } - if(RPM_THRES_5 <= rev){ - analogWrite(led5, helligkeit); - }else{ - analogWrite(led5, 0); - } - if(RPM_THRES_6 <= rev){ - analogWrite(led6, helligkeit); - }else{ - analogWrite(led6, 0); - } - if(RPM_THRES_7 <= rev){ - analogWrite(led7, helligkeit); - }else{ - analogWrite(led7, 0); - } - if(RPM_THRES_8 <= rev){ - analogWrite(led8, helligkeit); - }else{ - analogWrite(led8, 0); - } - if(RPM_THRES_9 <= rev){ - analogWrite(led9, helligkeit); - }else{ - analogWrite(led9, 0); - } - if(RPM_THRES_10 <= rev){ - analogWrite(led10, helligkeit); - }else{ - analogWrite(led10, 0); - }*/ - digitalWrite(led1, RPM_THRES_1 <= rev); - digitalWrite(led2, RPM_THRES_2 <= rev); - digitalWrite(led3, RPM_THRES_3 <= rev); - digitalWrite(led4, RPM_THRES_4 <= rev); - digitalWrite(led5, RPM_THRES_5 <= rev); - digitalWrite(led6, RPM_THRES_6 <= rev); - digitalWrite(led7, RPM_THRES_7 <= rev); - digitalWrite(led8, RPM_THRES_8 <= rev); - digitalWrite(led9, RPM_THRES_9 <= rev); - digitalWrite(led10, RPM_THRES_10 <= rev); - - digitalWrite(led11, t_mot); // rot, links, oben - digitalWrite(led12, t_air); // rot, links, mitte - digitalWrite(led13, t_oil); // rot, links, unten - - digitalWrite(led14, e_dros); // rot, rechts, oben - digitalWrite(led15, u_batt); // rot rechts, mitte - digitalWrite(led16, g_auto); // blau rechts, unten - /*if(Vehicle_data.g_auto){ - digitalWrite(led16, HIGH); - }else{ - digitalWrite(led16, LOW); - }*/ -} +/* +FT_2018_STW_CAN.cpp +*/ + +#include "FT_2018_STW_CAN.h" +#include "Arduino.h" +#include "DueTimer.h" +#include "FT18_STW_INIT.h" +#include "due_can.h" + +CAN_FRAME can_0_msg; +// can_1_msg.id = 0x110; +int can_0_temp_data = 0; +int leds[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; + +void Init_Can_0() { + Can0.begin(1000000); // set CAN0 baud to 1kbit/s and don`t use enable pin! + Can0.setNumTXBoxes(1); // reserves mailbox 0 for tx only 8 mailboxes are + // available (the other 7 mailboxes are for rx) + Can0.watchFor( + 0x502); // set CAN RX filter for ID 0x502 and reserves mailbox 1 for rx + Can0.watchFor(0x504); + Can0.watchFor(0x500); + Can0.watchFor( + 0x773); // set CAN RX filter for ID 0x773 and reserves mailbox 3 for rx + Can0.watchFor(0x775); + // Can0.watchFor(0x777); // set CAN RX filter + //for ID 0x777 and reserves mailbox 5 for rx + Can0.watchFor( + 0x779); // set CAN RX filter for ID 0x779 and reserves mailbox 6 for rx + Can0.watchFor(0x77A); + Can0.setGeneralCallback(Receive_Can_0); + Timer3.attachInterrupt(Send_0x110); // set send interrupt + Timer3.start(10000); // Calls every 10ms +} + +void Send_0x110() { + read_buttons(); + read_rotary(); + can_0_msg.id = 0x110; + can_0_msg.fid = 0; + can_0_msg.rtr = 0; + can_0_msg.priority = 0; + can_0_msg.length = 2; + can_0_msg.extended = 0; + can_0_temp_data = 0; + can_0_temp_data |= Stw_data.Stw_shift_up & 0b00000001; + can_0_temp_data |= Stw_data.Stw_shift_down << 1 & 0b00000010; + can_0_temp_data |= Stw_data.Stw_neutral << 2 & 0b00000100; + can_0_temp_data |= Stw_data.Stw_auto_shift << 3 & 0b00001000; + can_0_temp_data |= Stw_data.buttonStateEnc1 << 5 & 0b00100000; // pitlane + can_0_msg.data.byte[0] = can_0_temp_data; + can_0_msg.data.byte[1] = Stw_data.trc & 0b00001111; + can_0_msg.data.byte[2] = Stw_data.mode & 0b00000111; + if ((Stw_data.Stw_auto_shift << 3 & 0b00001000)) { + if (Vehicle_data.g_auto) { + Vehicle_data.g_auto = false; + } else { + Vehicle_data.g_auto = true; + } + } + Can0.sendFrame(can_0_msg); +} + +void Receive_Can_0(CAN_FRAME *temp_message) { + switch (temp_message->id) { + // g_auto + case 0x502: { // eDrossel error bit + Vehicle_data.e_thro = (temp_message->data.byte[0] & 0x80) | + (temp_message->data.byte[0] & 0x40) | + (temp_message->data.byte[0] & 0x20) | + (temp_message->data.byte[0] & 0x10); // bit 4-7 + + if (temp_message->data.byte[0] & 0x80) { + Stw_data.error_type = 1; //"pc_error"; + } + if (temp_message->data.byte[0] & 0x40) { + Stw_data.error_type = 2; //"bse_error"; + } + if (temp_message->data.byte[0] & 0x20) { + Stw_data.error_type = 3; //"aps_error"; + } + if (temp_message->data.byte[0] & 0x10) { + Stw_data.error_type = 4; //"etb_error"; + } + // can_1_temp_data |= g_etb_e << 4; + // can_1_temp_data |= g_aps_e << 5; + // can_1_temp_data |= g_bse_e << 6; + // can_1_temp_data |= g_pc_e << 7; + break; + } + case 0x504: { // autoshift+gear + // Vehicle_data.g_auto = + // (temp_message->data.byte[1]) + // >> 4; + Vehicle_data.gear = (temp_message->data.byte[1]) >> 5; + break; + } + case 0x773: { // rpm + Vehicle_data.revol = + (temp_message->data.byte[4] | temp_message->data.byte[3] << 8); + break; + } + case 0x779: { // battery voltage + Vehicle_data.u_batt = temp_message->data.byte[6]; + break; + } + /*case 0x77A: // revolution limit bit + Vehicle_data.rev_lim = + (temp_message->data.byte[3] & 0x20) >> 4; + switch(temp_message->data.byte[0]) { + case 0x02: // temp. intercooler + Vehicle_data.t_air = + temp_message->data.byte[7]; break; case 0x05: // temp. water + Vehicle_data.t_mot = + temp_message->data.byte[4]; break; case 0x04: // temp. oil + Vehicle_data.t_oil = + temp_message->data.byte[5]; case 0x01: { + Vehicle_data.p_wat = + temp_message->data.byte[6]; Vehicle_data.p_fuel = + temp_message->data.byte[7]; Vehicle_data.p_oil = + temp_message->data.byte[5]; break; + } + } + break;*/ + case 0x77A: { // temp und p + // g_ms4_idle_b = (temp_message->data.byte[2] & + // 0b10000000) + // >> 7; g_ms4_engine_status = (temp_message->data.byte[3] & + // 0b01000000) >> 6; g_ms4_ignoff_b = + // (temp_message->data.byte[3] & 0b10000000) >> 7; + // Serial.println("CAN 77A"); + // for (int i = 0; i < 8; i++) { + // Serial.print('['); + // Serial.print(i); + // Serial.print("] "); + // Serial.println(temp_message->data.byte[i], HEX); + // } + + if (temp_message->data.byte[0] == 1) { + Vehicle_data.p_oil = temp_message->data.byte[5]; + Vehicle_data.p_fuel = temp_message->data.byte[7]; + } else if (temp_message->data.byte[0] == 2) { + Vehicle_data.t_air = temp_message->data.byte[7]; + } else if (temp_message->data.byte[0] == 4) { + Vehicle_data.t_oil = temp_message->data.byte[5]; + } else if (temp_message->data.byte[0] == 5) { + Vehicle_data.t_mot = temp_message->data.byte[4]; + } + break; + } + case 0x775: { // speed + Vehicle_data.speed_fl = 2 * (temp_message->data.byte[2]); + Vehicle_data.speed_fr = 2 * (temp_message->data.byte[3]); + Vehicle_data.speed = (Vehicle_data.speed_fl + Vehicle_data.speed_fr) / 2; + break; + } + /*case 0x777:{//m4_gear + Vehicle_data.gear = + temp_message->data.byte[0]; break; + }*/ + case 0x500: { + Vehicle_data.p_brake_front = temp_message->data.byte[1]; + Vehicle_data.p_brake_rear = temp_message->data.byte[2]; + break; + } + } +} + +void update_LED() { + // Copyright Michael Dietzel + // m.dietzel@fasttube.de + // Edit Michael Witt 05-2015 + // m.witt@fasttube.de + + // EDIT BAHA ZARROUKI 05-2107 + // z.baha@fasttube.de + + // alle Werte als Hex-Werte angegeben + bool t_oil = (Vehicle_data.t_oil - 40) >= 0x96; // 150°C temp.oil + bool t_air = (Vehicle_data.t_air - 40) >= 0x3C; // 60°C temp.llk + bool t_mot = + ((Vehicle_data.t_mot - 40) >= 0x69) and + ((Vehicle_data.t_mot - 40) != 0xC8); // 105°C temp.water und !=200 + + bool g_auto = Vehicle_data.g_auto; + bool u_batt = Vehicle_data.u_batt <= 0xB1; // 12.5V batt.spann. + bool e_dros = Vehicle_data.e_thro; // error-bit + + bool rev_lim = Vehicle_data.rev_lim; + + uint16_t rev = Vehicle_data.revol; + + /*if(Vehicle_data.rev_lim){ + for (int j = 0; j < 10; j++){ + digitalWrite(leds[j], HIGH); + //analogWrite(leds[j], STW_data.br); //nur eine der zwei + zeilen + } + delay(100); + for (int j = 0; j < 10; j++){ + digitalWrite(leds[j], LOW); + } + delay(100); + }else{*/ + /*uint8_t helligkeit = 20; + if(RPM_THRES_1 <= rev){ + analogWrite(led1, helligkeit); + }else{ + analogWrite(led1, 0); + } + if(RPM_THRES_2 <= rev){ + analogWrite(led2, helligkeit); + }else{ + analogWrite(led2, 0); + } + if(RPM_THRES_3 <= rev){ + analogWrite(led3, helligkeit); + }else{ + analogWrite(led3, 0); + } + if(RPM_THRES_4 <= rev){ + analogWrite(led4, helligkeit); + }else{ + analogWrite(led4, 0); + } + if(RPM_THRES_5 <= rev){ + analogWrite(led5, helligkeit); + }else{ + analogWrite(led5, 0); + } + if(RPM_THRES_6 <= rev){ + analogWrite(led6, helligkeit); + }else{ + analogWrite(led6, 0); + } + if(RPM_THRES_7 <= rev){ + analogWrite(led7, helligkeit); + }else{ + analogWrite(led7, 0); + } + if(RPM_THRES_8 <= rev){ + analogWrite(led8, helligkeit); + }else{ + analogWrite(led8, 0); + } + if(RPM_THRES_9 <= rev){ + analogWrite(led9, helligkeit); + }else{ + analogWrite(led9, 0); + } + if(RPM_THRES_10 <= rev){ + analogWrite(led10, helligkeit); + }else{ + analogWrite(led10, 0); + }*/ + digitalWrite(led1, RPM_THRES_1 <= rev); + digitalWrite(led2, RPM_THRES_2 <= rev); + digitalWrite(led3, RPM_THRES_3 <= rev); + digitalWrite(led4, RPM_THRES_4 <= rev); + digitalWrite(led5, RPM_THRES_5 <= rev); + digitalWrite(led6, RPM_THRES_6 <= rev); + digitalWrite(led7, RPM_THRES_7 <= rev); + digitalWrite(led8, RPM_THRES_8 <= rev); + digitalWrite(led9, RPM_THRES_9 <= rev); + digitalWrite(led10, RPM_THRES_10 <= rev); + + digitalWrite(led11, t_mot); // rot, links, oben + digitalWrite(led12, t_air); // rot, links, mitte + digitalWrite(led13, t_oil); // rot, links, unten + + digitalWrite(led14, e_dros); // rot, rechts, oben + digitalWrite(led15, u_batt); // rot rechts, mitte + digitalWrite(led16, g_auto); // blau rechts, unten + /*if(Vehicle_data.g_auto){ + digitalWrite(led16, HIGH); + }else{ + digitalWrite(led16, LOW); + }*/ +} diff --git a/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.h b/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.h index 57124cd..23d65b4 100644 --- a/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.h +++ b/lib/FT_2018_STW_CAN/FT_2018_STW_CAN.h @@ -1,12 +1,12 @@ -/* -FT_2018_STW_CAN.h -*/ - -#include "Arduino.h" -#include "DueTimer.h" -#include "due_can.h" - -void Init_Can_0(); -void Send_0x110(); -void Receive_Can_0(CAN_FRAME *frame); +/* +FT_2018_STW_CAN.h +*/ + +#include "Arduino.h" +#include "DueTimer.h" +#include "due_can.h" + +void Init_Can_0(); +void Send_0x110(); +void Receive_Can_0(CAN_FRAME *frame); void update_LED(void); \ No newline at end of file diff --git a/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.cpp b/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.cpp index c537b16..724cb93 100644 --- a/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.cpp +++ b/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.cpp @@ -1,143 +1,137 @@ -/* -FT_2018_STW_CAN.cpp -*/ - -#include "Arduino.h" -#include "DueTimer.h" -#include "due_can.h" -#include "FT_2018e_STW_CAN.h" -#include "FT18e_STW_INIT.h" - -CAN_FRAME can_0_msg; -//can_1_msg.id = 0x110; -int can_0_temp_data = 0; -int leds[] = {led1, led2, led3, led4, led5, led6, led7, led8, led9, led10, led11, led12, led13, led14, led15, led16}; - -void Init_Can_0() -{ - Serial.begin(9600); - Can0.begin(1000000); // set CAN0 baud to 1kbit/s and don`t use enable pin! - Can0.setNumTXBoxes(1); // reserves mailbox 0 for tx only 8 mailboxes are available (the other 7 mailboxes are for rx) - Can0.watchFor(CAN_CELL_STATS_ID); - Can0.watchFor(CAN_BATTERY_STATS_ID); - Can0.watchFor(CAN_COOLING_STATS_ID); - Can0.watchFor(CAN_INVERTER_STATS_ID); - Can0.setGeneralCallback(Receive_Can_0); - Timer3.attachInterrupt(Send_0x110); // set send interrupt - Timer3.start(10000); // Calls every 10ms -} - -void Send_0x110() -{ - read_buttons(); - read_rotary(); - can_0_msg.id = 0x110; - can_0_msg.fid = 0; - can_0_msg.rtr = 0; - can_0_msg.priority = 0; - can_0_msg.length = 2; - can_0_msg.extended = 0; - can_0_temp_data = 0; - can_0_temp_data |= Stw_data.button_ll << 0; - can_0_temp_data |= Stw_data.button_lr << 1; - can_0_temp_data |= Stw_data.button_rl << 2; - can_0_temp_data |= Stw_data.button_rr << 3; - can_0_msg.data.byte[0] = can_0_temp_data; - can_0_msg.data.byte[1] = Stw_data.mode; - Can0.sendFrame(can_0_msg); -} - -void Receive_Can_0(CAN_FRAME *temp_message) -{ - switch (temp_message->id) - { - case CAN_CELL_STATS_ID: - process_cell_stats(temp_message); - break; - case CAN_BATTERY_STATS_ID: - process_battery_stats(temp_message); - break; - case CAN_COOLING_STATS_ID: - process_cooling_stats(temp_message); - break; - case CAN_INVERTER_STATS_ID: - process_inverter_stats(temp_message); - break; - default: - // TODO: How to handle this in the car? - Serial.print("ERROR: Unknown CAN ID: "); - Serial.println(temp_message->id); - } -} - -void process_cell_stats(CAN_FRAME *frame) -{ - CellStats *data = (CellStats *)&frame->data; - Vehicle_data.t_cell_max = data->max_cell_temp; - Vehicle_data.u_cell_min = data->min_cell_voltage; -} - -void process_battery_stats(CAN_FRAME *frame) -{ - BatteryStats *data = (BatteryStats *)&frame->data; - Vehicle_data.u_batt = data->pre_air_voltage; -} - -void process_cooling_stats(CAN_FRAME *frame) -{ - CoolingStats *data = (CoolingStats *)&frame->data; - Vehicle_data.p_wat = data->water_pressure; - Vehicle_data.t_wat = data->water_temp; - Vehicle_data.t_mot_l = data->motor_l_temp; - Vehicle_data.t_mot_r = data->motor_r_temp; -} - -void process_inverter_stats(CAN_FRAME *frame) -{ - InverterStats *data = (InverterStats *)&frame->data; - uint8_t status = data->status; - Vehicle_data.inverter.ready = status & CAN_INVERTER_STATS_READY; - Vehicle_data.inverter.derating = status & CAN_INVERTER_STATS_DERATING; - Vehicle_data.inverter.warning = status & CAN_INVERTER_STATS_WARNING; - Vehicle_data.inverter.error = status & CAN_INVERTER_STATS_ERROR; - Vehicle_data.inverter.on = status & CAN_INVERTER_STATS_ON; - Vehicle_data.inverter.precharge = status & CAN_INVERTER_STATS_PRECHARGE; - Vehicle_data.inverter.ams_emerg = status & CAN_INVERTER_STATS_AMS_EMERG; - Vehicle_data.inverter.ts_active = status & CAN_INVERTER_STATS_TS_ACTIVE; - Vehicle_data.t_inv = data->temp; - Vehicle_data.revol = data->velocity; - Vehicle_data.wheel_speed = data->wheel_speed; -} - -void update_LED() -{ - bool t_mot = (Vehicle_data.t_mot_l > LED_THRESH_T_MOT) || (Vehicle_data.t_mot_r > LED_THRESH_T_MOT); - bool t_inv = Vehicle_data.t_inv > LED_THRESH_T_INV; - bool t_bat = Vehicle_data.t_cell_max > LED_THRESH_T_BAT; - - bool precharge_active = !Vehicle_data.inverter.precharge; - bool derating = Vehicle_data.inverter.derating; - bool u_batt = Vehicle_data.u_cell_min < LED_THRESH_U_BATT; - - digitalWrite(led11, t_mot); // rot, links, oben - digitalWrite(led12, t_inv); // rot, links, mitte - digitalWrite(led13, t_bat); // rot, links, unten - - digitalWrite(led14, precharge_active); // rot, rechts, oben - digitalWrite(led15, derating); // rot rechts, mitte - digitalWrite(led16, u_batt); // blau rechts, unten - - bool rev_lim = Vehicle_data.rev_lim; - - int16_t rev = Vehicle_data.revol; - digitalWrite(led1, RPM_THRESH_1 <= rev); - digitalWrite(led2, RPM_THRESH_2 <= rev); - digitalWrite(led3, RPM_THRESH_3 <= rev); - digitalWrite(led4, RPM_THRESH_4 <= rev); - digitalWrite(led5, RPM_THRESH_5 <= rev); - digitalWrite(led6, RPM_THRESH_6 <= rev); - digitalWrite(led7, RPM_THRESH_7 <= rev); - digitalWrite(led8, RPM_THRESH_8 <= rev); - digitalWrite(led9, RPM_THRESH_9 <= rev); - digitalWrite(led10, RPM_THRESH_10 <= rev); -} +/* +FT_2018_STW_CAN.cpp +*/ + +#include "FT_2018e_STW_CAN.h" +#include "Arduino.h" +#include "DueTimer.h" +#include "FT18e_STW_INIT.h" +#include "due_can.h" + +CAN_FRAME can_0_msg; +// can_1_msg.id = 0x110; +int can_0_temp_data = 0; +int leds[] = {led1, led2, led3, led4, led5, led6, led7, led8, + led9, led10, led11, led12, led13, led14, led15, led16}; + +void Init_Can_0() { + Serial.begin(9600); + Can0.begin(1000000); // set CAN0 baud to 1kbit/s and don`t use enable pin! + Can0.setNumTXBoxes(1); // reserves mailbox 0 for tx only 8 mailboxes are + // available (the other 7 mailboxes are for rx) + Can0.watchFor(CAN_CELL_STATS_ID); + Can0.watchFor(CAN_BATTERY_STATS_ID); + Can0.watchFor(CAN_COOLING_STATS_ID); + Can0.watchFor(CAN_INVERTER_STATS_ID); + Can0.setGeneralCallback(Receive_Can_0); + Timer3.attachInterrupt(Send_0x110); // set send interrupt + Timer3.start(10000); // Calls every 10ms +} + +void Send_0x110() { + read_buttons(); + read_rotary(); + can_0_msg.id = 0x110; + can_0_msg.fid = 0; + can_0_msg.rtr = 0; + can_0_msg.priority = 0; + can_0_msg.length = 2; + can_0_msg.extended = 0; + can_0_temp_data = 0; + can_0_temp_data |= Stw_data.button_ll << 0; + can_0_temp_data |= Stw_data.button_lr << 1; + can_0_temp_data |= Stw_data.button_rl << 2; + can_0_temp_data |= Stw_data.button_rr << 3; + can_0_msg.data.byte[0] = can_0_temp_data; + can_0_msg.data.byte[1] = Stw_data.mode; + Can0.sendFrame(can_0_msg); +} + +void Receive_Can_0(CAN_FRAME *temp_message) { + switch (temp_message->id) { + case CAN_CELL_STATS_ID: + process_cell_stats(temp_message); + break; + case CAN_BATTERY_STATS_ID: + process_battery_stats(temp_message); + break; + case CAN_COOLING_STATS_ID: + process_cooling_stats(temp_message); + break; + case CAN_INVERTER_STATS_ID: + process_inverter_stats(temp_message); + break; + default: + // TODO: How to handle this in the car? + Serial.print("ERROR: Unknown CAN ID: "); + Serial.println(temp_message->id); + } +} + +void process_cell_stats(CAN_FRAME *frame) { + CellStats *data = (CellStats *)&frame->data; + Vehicle_data.t_cell_max = data->max_cell_temp; + Vehicle_data.u_cell_min = data->min_cell_voltage; +} + +void process_battery_stats(CAN_FRAME *frame) { + BatteryStats *data = (BatteryStats *)&frame->data; + Vehicle_data.u_batt = data->pre_air_voltage; +} + +void process_cooling_stats(CAN_FRAME *frame) { + CoolingStats *data = (CoolingStats *)&frame->data; + Vehicle_data.p_wat = data->water_pressure; + Vehicle_data.t_wat = data->water_temp; + Vehicle_data.t_mot_l = data->motor_l_temp; + Vehicle_data.t_mot_r = data->motor_r_temp; +} + +void process_inverter_stats(CAN_FRAME *frame) { + InverterStats *data = (InverterStats *)&frame->data; + uint8_t status = data->status; + Vehicle_data.inverter.ready = status & CAN_INVERTER_STATS_READY; + Vehicle_data.inverter.derating = status & CAN_INVERTER_STATS_DERATING; + Vehicle_data.inverter.warning = status & CAN_INVERTER_STATS_WARNING; + Vehicle_data.inverter.error = status & CAN_INVERTER_STATS_ERROR; + Vehicle_data.inverter.on = status & CAN_INVERTER_STATS_ON; + Vehicle_data.inverter.precharge = status & CAN_INVERTER_STATS_PRECHARGE; + Vehicle_data.inverter.ams_emerg = status & CAN_INVERTER_STATS_AMS_EMERG; + Vehicle_data.inverter.ts_active = status & CAN_INVERTER_STATS_TS_ACTIVE; + Vehicle_data.t_inv = data->temp; + Vehicle_data.revol = data->velocity; + Vehicle_data.wheel_speed = data->wheel_speed; +} + +void update_LED() { + bool t_mot = (Vehicle_data.t_mot_l > LED_THRESH_T_MOT) || + (Vehicle_data.t_mot_r > LED_THRESH_T_MOT); + bool t_inv = Vehicle_data.t_inv > LED_THRESH_T_INV; + bool t_bat = Vehicle_data.t_cell_max > LED_THRESH_T_BAT; + + bool precharge_active = !Vehicle_data.inverter.precharge; + bool derating = Vehicle_data.inverter.derating; + bool u_batt = Vehicle_data.u_cell_min < LED_THRESH_U_BATT; + + digitalWrite(led11, t_mot); // rot, links, oben + digitalWrite(led12, t_inv); // rot, links, mitte + digitalWrite(led13, t_bat); // rot, links, unten + + digitalWrite(led14, precharge_active); // rot, rechts, oben + digitalWrite(led15, derating); // rot rechts, mitte + digitalWrite(led16, u_batt); // blau rechts, unten + + bool rev_lim = Vehicle_data.rev_lim; + + int16_t rev = Vehicle_data.revol; + digitalWrite(led1, RPM_THRESH_1 <= rev); + digitalWrite(led2, RPM_THRESH_2 <= rev); + digitalWrite(led3, RPM_THRESH_3 <= rev); + digitalWrite(led4, RPM_THRESH_4 <= rev); + digitalWrite(led5, RPM_THRESH_5 <= rev); + digitalWrite(led6, RPM_THRESH_6 <= rev); + digitalWrite(led7, RPM_THRESH_7 <= rev); + digitalWrite(led8, RPM_THRESH_8 <= rev); + digitalWrite(led9, RPM_THRESH_9 <= rev); + digitalWrite(led10, RPM_THRESH_10 <= rev); +} diff --git a/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.h b/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.h index 8a7cea1..5af3e31 100644 --- a/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.h +++ b/lib/FT_2018e_STW_CAN/FT_2018e_STW_CAN.h @@ -1,65 +1,61 @@ -/* -FT_2018e_STW_CAN.h -*/ - -#pragma once - -#include "Arduino.h" -#include "DueTimer.h" -#include "due_can.h" - -constexpr uint32_t CAN_CELL_STATS_ID = 0x101; -constexpr uint32_t CAN_BATTERY_STATS_ID = 0x102; -constexpr uint32_t CAN_COOLING_STATS_ID = 0x103; -constexpr uint32_t CAN_INVERTER_STATS_ID = 0x104; - -constexpr uint8_t CAN_INVERTER_STATS_READY = (1 << 0); -constexpr uint8_t CAN_INVERTER_STATS_DERATING = (1 << 1); -constexpr uint8_t CAN_INVERTER_STATS_WARNING = (1 << 2); -constexpr uint8_t CAN_INVERTER_STATS_ERROR = (1 << 3); -constexpr uint8_t CAN_INVERTER_STATS_ON = (1 << 4); -constexpr uint8_t CAN_INVERTER_STATS_PRECHARGE = (1 << 5); -constexpr uint8_t CAN_INVERTER_STATS_AMS_EMERG = (1 << 6); -constexpr uint8_t CAN_INVERTER_STATS_TS_ACTIVE = (1 << 7); - -void Init_Can_0(); -void Send_0x110(); -void Receive_Can_0(CAN_FRAME *frame); -void process_cell_stats(CAN_FRAME *frame); -void process_battery_stats(CAN_FRAME *frame); -void process_cooling_stats(CAN_FRAME *frame); -void process_inverter_stats(CAN_FRAME *frame); -void update_LED(void); - -struct CellStats -{ - uint16_t sum_cell_voltage; - int16_t max_cell_temp; - uint16_t max_cell_voltage; - uint16_t min_cell_voltage; -}; - -struct BatteryStats -{ - uint16_t battery_current; - uint16_t pre_air_voltage; - uint16_t post_air_voltage; - uint16_t battery_power; -}; - -struct CoolingStats -{ - int16_t water_pressure; - int16_t water_temp; - int16_t motor_l_temp; - int16_t motor_r_temp; -}; - -struct InverterStats -{ - uint8_t status; - uint8_t _reserved; - uint16_t temp; - int16_t velocity; - int16_t wheel_speed; +/* +FT_2018e_STW_CAN.h +*/ + +#pragma once + +#include "Arduino.h" +#include "DueTimer.h" +#include "due_can.h" + +constexpr uint32_t CAN_CELL_STATS_ID = 0x101; +constexpr uint32_t CAN_BATTERY_STATS_ID = 0x102; +constexpr uint32_t CAN_COOLING_STATS_ID = 0x103; +constexpr uint32_t CAN_INVERTER_STATS_ID = 0x104; + +constexpr uint8_t CAN_INVERTER_STATS_READY = (1 << 0); +constexpr uint8_t CAN_INVERTER_STATS_DERATING = (1 << 1); +constexpr uint8_t CAN_INVERTER_STATS_WARNING = (1 << 2); +constexpr uint8_t CAN_INVERTER_STATS_ERROR = (1 << 3); +constexpr uint8_t CAN_INVERTER_STATS_ON = (1 << 4); +constexpr uint8_t CAN_INVERTER_STATS_PRECHARGE = (1 << 5); +constexpr uint8_t CAN_INVERTER_STATS_AMS_EMERG = (1 << 6); +constexpr uint8_t CAN_INVERTER_STATS_TS_ACTIVE = (1 << 7); + +void Init_Can_0(); +void Send_0x110(); +void Receive_Can_0(CAN_FRAME *frame); +void process_cell_stats(CAN_FRAME *frame); +void process_battery_stats(CAN_FRAME *frame); +void process_cooling_stats(CAN_FRAME *frame); +void process_inverter_stats(CAN_FRAME *frame); +void update_LED(void); + +struct CellStats { + uint16_t sum_cell_voltage; + int16_t max_cell_temp; + uint16_t max_cell_voltage; + uint16_t min_cell_voltage; +}; + +struct BatteryStats { + uint16_t battery_current; + uint16_t pre_air_voltage; + uint16_t post_air_voltage; + uint16_t battery_power; +}; + +struct CoolingStats { + int16_t water_pressure; + int16_t water_temp; + int16_t motor_l_temp; + int16_t motor_r_temp; +}; + +struct InverterStats { + uint8_t status; + uint8_t _reserved; + uint16_t temp; + int16_t velocity; + int16_t wheel_speed; }; \ No newline at end of file diff --git a/lib/arduino-ediptft-master/EDIPTFT.cpp b/lib/arduino-ediptft-master/EDIPTFT.cpp index 66a1168..c2207b0 100644 --- a/lib/arduino-ediptft-master/EDIPTFT.cpp +++ b/lib/arduino-ediptft-master/EDIPTFT.cpp @@ -1,4 +1,4 @@ - // +// // Library for controlling Electronic Assembly eDIPTFT displays // // Copyright (c) 2013 Stefan Gofferje. All rights reserved. @@ -24,69 +24,53 @@ #include "EDIPTFT.h" #include "Arduino.h" #define DEBUG false - EDIPTFT::EDIPTFT(boolean smallprotocol, boolean disconnected) - : _smallprotocol{smallprotocol}, disconnected{disconnected} {} + : _smallprotocol{smallprotocol}, disconnected{disconnected} {} +void EDIPTFT::begin(long baud) { SERIAL_DEV.begin(baud); } -void EDIPTFT::begin(long baud) { - SERIAL_DEV.begin(baud); -} - - -void EDIPTFT::sendByte(char data) { - SERIAL_DEV.write(data); -} - - -char EDIPTFT::readByte() { - return SERIAL_DEV.read(); -} +void EDIPTFT::sendByte(char data) { SERIAL_DEV.write(data); } +char EDIPTFT::readByte() { return SERIAL_DEV.read(); } void EDIPTFT::waitBytesAvailable() { - const uint32_t t_start = millis(); - char loop = 0; - while (loop == 0) - { - if (bytesAvailable() != 0){ - loop = 1; - } - if(t_start + 100 < millis()) - { - //Serial.println("Error: waited to long!"); - loop =1; - } + const uint32_t t_start = millis(); + char loop = 0; + while (loop == 0) { + if (bytesAvailable() != 0) { + loop = 1; + } + if (t_start + 100 < millis()) { + // Serial.println("Error: waited to long!"); + loop = 1; + } } } - char EDIPTFT::waitandreadByte() { waitBytesAvailable(); char result = readByte(); - return(result); + return (result); } - unsigned char EDIPTFT::bytesAvailable() { - return SERIAL_DEV.available(); - //ÄNDERN + return SERIAL_DEV.available(); + //ÄNDERN } - void EDIPTFT::sendData(char* data, char len) { - + /*for(int i=0; i < len; i++) { Serial.print(data[i]); } Serial.print('\n'); Serial.println(len);*/ - + if (DEBUG) { unsigned char i; for (i = 0; i < len; i++) { - //Serial.print(byte(data[i]), HEX); + // Serial.print(byte(data[i]), HEX); SERIAL_DEV.print(byte(data[i]), HEX); SERIAL_DEV.print(" "); } @@ -95,16 +79,14 @@ void EDIPTFT::sendData(char* data, char len) { if (_smallprotocol) { sendSmall(data, len); - } - else { + } else { unsigned char i; - for(i=0; i < len; i++) { + for (i = 0; i < len; i++) { sendByte(data[i]); } } } - void EDIPTFT::sendSmall(char* data, char len) { if (disconnected) { return; @@ -121,21 +103,21 @@ void EDIPTFT::sendSmall(char* data, char len) { sendByte(len); bcc = bcc + len; - for(i=0; i < len; i++) { + for (i = 0; i < len; i++) { sendByte(data[i]); bcc = bcc + data[i]; } sendByte(bcc); waitBytesAvailable(); if (bytesAvailable() > 0) { - char x = readByte(); - //Serial.print(uint16_t(x)); - if (x == ACK) ok = 1; + char x = readByte(); + // Serial.print(uint16_t(x)); + if (x == ACK) + ok = 1; else { ok = 0; } - } - else { + } else { delay(200); ok = 0; } @@ -146,7 +128,6 @@ void EDIPTFT::sendSmall(char* data, char len) { } } - void EDIPTFT::sendSmallDC2(char* data, char len) { unsigned char i, bcc; char ok = 0; @@ -156,307 +137,268 @@ void EDIPTFT::sendSmallDC2(char* data, char len) { sendByte(0x12); bcc = 0x12; - for(i=0; i < len; i++) { + for (i = 0; i < len; i++) { sendByte(data[i]); bcc = bcc + data[i]; } sendByte(bcc); - waitBytesAvailable(); //delay(6); im 17er + waitBytesAvailable(); // delay(6); im 17er if (bytesAvailable() > 0) { - if (readByte() == ACK) ok = 1; - else ok = 0; - } - else { + if (readByte() == ACK) + ok = 1; + else + ok = 0; + } else { delay(200); ok = 0; } } } - void EDIPTFT::smallProtoSelect(char address) { - char command [] = { - 0x03, 'A', 'S', address - }; + char command[] = {0x03, 'A', 'S', address}; sendSmallDC2(command, sizeof(command)); } - void EDIPTFT::smallProtoDeselect(char address) { - char command [] = { - 0x03, 'A', 'D', address - }; + char command[] = {0x03, 'A', 'D', address}; sendSmallDC2(command, sizeof(command)); } - unsigned char EDIPTFT::datainBuffer() { unsigned char result; - char command [] = { - 0x01, 'I' - }; + char command[] = {0x01, 'I'}; sendSmallDC2(command, sizeof(command)); waitandreadByte(); waitandreadByte(); - result=waitandreadByte(); + result = waitandreadByte(); waitandreadByte(); waitandreadByte(); return result; } - -int EDIPTFT::readBuffer(char* data) { //return void - unsigned char len, i; // char in 17er - char command [] = { - 0x01, 'S' - }; - sendSmallDC2(command, sizeof(command)); - waitandreadByte(); - len=waitandreadByte(); - char result[len]; - for (i = 0; i < len; i++) { - result[i] = waitandreadByte(); - } - memcpy(data, result, len); - waitandreadByte(); - return len; //zeile nicht vorhanden +int EDIPTFT::readBuffer(char* data) { // return void + unsigned char len, i; // char in 17er + char command[] = {0x01, 'S'}; + sendSmallDC2(command, sizeof(command)); + waitandreadByte(); + len = waitandreadByte(); + char result[len]; + for (i = 0; i < len; i++) { + result[i] = waitandreadByte(); + } + memcpy(data, result, len); + waitandreadByte(); + return len; // zeile nicht vorhanden } - -void EDIPTFT::clear() { //vgl 17er +void EDIPTFT::clear() { // vgl 17er this->deleteDisplay(); this->removeTouchArea(0, 1); } - void EDIPTFT::deleteDisplay() { - char command [] = { - 27, 'D', 'L' - }; - sendData(command, sizeof(command)); + char command[] = {27, 'D', 'L'}; + sendData(command, sizeof(command)); } - void EDIPTFT::invert() { - char command [] = { - 27, 'D', 'I' - }; + char command[] = {27, 'D', 'I'}; sendData(command, sizeof(command)); } - void EDIPTFT::setDisplayColor(char fg, char bg) { - char command [] = { - 27, 'F', 'D', fg, bg - }; + char command[] = {27, 'F', 'D', fg, bg}; sendData(command, sizeof(command)); } - void EDIPTFT::fillDisplayColor(char bg) { - char command [] = { - 27, 'D', 'F', bg - }; + char command[] = {27, 'D', 'F', bg}; sendData(command, sizeof(command)); } - void EDIPTFT::terminalOn(boolean on) { if (on) { - char command [] = {27, 'T', 'E'}; + char command[] = {27, 'T', 'E'}; sendData(command, sizeof(command)); - } - else { - char command [] = {27, 'T', 'A'}; + } else { + char command[] = {27, 'T', 'A'}; sendData(command, sizeof(command)); } } - void EDIPTFT::loadImage(int x1, int y1, int nr) { - char command [] = {27, 'U', 'I', - #if COORD_SIZE == 1 - (char)x1, (char)y1, - #else - lowByte(x1), highByte(x1), lowByte(y1), highByte(y1), - #endif - nr}; - sendData(command, sizeof(command)); + char command[] = { + 27, + 'U', + 'I', +#if COORD_SIZE == 1 + (char)x1, + (char)y1, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), +#endif + nr + }; + sendData(command, sizeof(command)); } - void EDIPTFT::cursorOn(boolean on) { if (on) { - char command [] = {27, 'T', 'C', 1}; + char command[] = {27, 'T', 'C', 1}; sendData(command, sizeof(command)); - } - else { - char command [] = {27, 'T', 'C', 0}; + } else { + char command[] = {27, 'T', 'C', 0}; sendData(command, sizeof(command)); } } - void EDIPTFT::setCursor(char col, char row) { - char command [] = {27, 'T', 'P', col, row}; + char command[] = {27, 'T', 'P', col, row}; sendData(command, sizeof(command)); } void EDIPTFT::displayLight(char no) { - char command [] = { - 27, 'Y', 'H', no - }; + char command[] = {27, 'Y', 'H', no}; sendData(command, sizeof(command)); } -void EDIPTFT::defineBargraph(char dir, char no, int x1, int y1, int x2, int y2, byte sv, byte ev, char type, char mst) { - char command [] = { - 27, 'B', dir, no, - #if COORD_SIZE == 1 - x1, y1, x2, y2, - #else - lowByte(x1), highByte(x1), lowByte(y1), highByte(y1), - lowByte(x2), highByte(x2), lowByte(y2), highByte(y2), - #endif +void EDIPTFT::defineBargraph(char dir, char no, int x1, int y1, int x2, int y2, + byte sv, byte ev, char type, char mst) { + char command[] = { + 27, + 'B', + dir, + no, +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif char(sv), char(ev), type, mst }; sendData(command, sizeof(command)); - //mst fehlt 17 + // mst fehlt 17 } - void EDIPTFT::updateBargraph(char no, char val) { - char command [] = { - 27, 'B', 'A', no, val - }; + char command[] = {27, 'B', 'A', no, val}; sendData(command, sizeof(command)); } - void EDIPTFT::setBargraphColor(char no, char fg, char bg, char fr) { - char command [] = { - 27, 'F', 'B', no, fg, bg, fr - }; + char command[] = {27, 'F', 'B', no, fg, bg, fr}; sendData(command, sizeof(command)); } - void EDIPTFT::linkBargraphLight(char no) { - char command [] = { - 27, 'Y', 'B', no - }; + char command[] = {27, 'Y', 'B', no}; sendData(command, sizeof(command)); } - void EDIPTFT::makeBargraphTouch(char no) { - char command [] = { - 27, 'A', 'B', no - }; + char command[] = {27, 'A', 'B', no}; sendData(command, sizeof(command)); } - -void EDIPTFT::deleteBargraph(char no,char n1) { - char command [] = { - 27, 'B', 'D', no, n1 - }; +void EDIPTFT::deleteBargraph(char no, char n1) { + char command[] = {27, 'B', 'D', no, n1}; sendData(command, sizeof(command)); } - -void EDIPTFT::defineInstrument(char no, int x1, int y1, char image, char angle, char sv, char ev) { - char command [] = { - 27, 'I', 'P', no, - #if COORD_SIZE == 1 - x1, y1, - #else - lowByte(x1), highByte(x1), lowByte(y1), highByte(y1), - #endif - image, angle, sv, ev +void EDIPTFT::defineInstrument(char no, int x1, int y1, char image, char angle, + char sv, char ev) { + char command[] = { + 27, + 'I', + 'P', + no, +#if COORD_SIZE == 1 + x1, + y1, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), +#endif + image, + angle, + sv, + ev }; sendData(command, sizeof(command)); } - void EDIPTFT::updateInstrument(char no, char val) { - char command [] = { - 27, 'I', 'A', no, val - }; + char command[] = {27, 'I', 'A', no, val}; sendData(command, sizeof(command)); } - void EDIPTFT::redrawInstrument(char no) { - char command [] = { - 27, 'I', 'N', no - }; + char command[] = {27, 'I', 'N', no}; sendData(command, sizeof(command)); } - void EDIPTFT::deleteInstrument(char no, char n1, char n2) { - char command [] = { - 27, 'B', 'D', no, n1, n2 - }; + char command[] = {27, 'B', 'D', no, n1, n2}; sendData(command, sizeof(command)); } - void EDIPTFT::setLineColor(char fg, char bg) { - char command [] = { - 27, 'F', 'G', fg, bg - }; + char command[] = {27, 'F', 'G', fg, bg}; sendData(command, sizeof(command)); } - void EDIPTFT::setLineThick(char x, char y) { - char command [] = { - 27, 'G', 'Z', x, y - }; + char command[] = {27, 'G', 'Z', x, y}; sendData(command, sizeof(command)); } - void EDIPTFT::setTextColor(char fg, char bg) { - char command [] = { - 27, 'F', 'Z', fg, bg - }; + char command[] = {27, 'F', 'Z', fg, bg}; sendData(command, sizeof(command)); } - void EDIPTFT::setTextFont(char font) { - char command [] = { - 27, 'Z', 'F', font - }; + char command[] = {27, 'Z', 'F', font}; sendData(command, sizeof(command)); } -void EDIPTFT::setTextSize(int xsize, int ysize){ - char command[] = {27, 'Z', 'Z', xsize, ysize}; - sendData(command,sizeof(command)); +void EDIPTFT::setTextSize(int xsize, int ysize) { + char command[] = {27, 'Z', 'Z', xsize, ysize}; + sendData(command, sizeof(command)); } void EDIPTFT::setTextAngle(char angle) { // 0 = 0°, 1 = 90°, 2 = 180°, 3 = 270° - char command [] = { - 27, 'Z', 'W', angle - }; + char command[] = {27, 'Z', 'W', angle}; sendData(command, sizeof(command)); } - -void EDIPTFT::drawText(uint16_t x1, uint16_t y1, char justification, const char* text) { - //nicht const 17// +void EDIPTFT::drawText(uint16_t x1, uint16_t y1, char justification, + const char* text) { + // nicht const 17// byte len = strlen(text); byte i; - char helper [3 + 4 + len + 1]; - helper[0] = 27; //esc + char helper[3 + 4 + len + 1]; + helper[0] = 27; // esc helper[1] = 'Z'; helper[2] = justification; helper[3] = x1 & 0xFF; @@ -464,20 +406,19 @@ void EDIPTFT::drawText(uint16_t x1, uint16_t y1, char justification, const char* helper[5] = y1 & 0xFF; helper[6] = (y1 >> 8) & 0xFF; for (i = 0; i <= len; i++) { - helper[i + 7] = text[i]; + helper[i + 7] = text[i]; } - + sendData(helper, sizeof(helper)); } - -void EDIPTFT::drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align, const char* text) { +void EDIPTFT::drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align, + const char* text) { int len_text = strlen(text); int len = 3 + 8 + 1 + len_text + 1; - char data[len] = { - 27, 'Z', 'B', lowByte(x1), highByte(x1), lowByte(y1), highByte(y1), - lowByte(x2), highByte(x2), lowByte(y2), highByte(y2), align - }; + char data[len] = {27, 'Z', 'B', lowByte(x1), + highByte(x1), lowByte(y1), highByte(y1), lowByte(x2), + highByte(x2), lowByte(y2), highByte(y2), align}; for (int i = 0; i < len_text; i++) { data[3 + 8 + 1 + i] = text[i]; } @@ -486,247 +427,303 @@ void EDIPTFT::drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align, cons sendData(data, len); } - void EDIPTFT::drawLine(int x1, int y1, int x2, int y2) { - char command [] = { - 27,'G','D', - #if COORD_SIZE == 1 - x1, y1, x2, y2 - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2) - #endif + char command[] = { + 27, + 'G', + 'D', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2 +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2) +#endif }; sendData(command, sizeof(command)); } - void EDIPTFT::drawRect(int x1, int y1, int x2, int y2) { - char command [] = { - 27,'G','R', - #if COORD_SIZE == 1 - x1, y1, x2, y2 - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2) - #endif + char command[] = { + 27, + 'G', + 'R', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2 +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2) +#endif }; sendData(command, sizeof(command)); } - void EDIPTFT::drawRectf(int x1, int y1, int x2, int y2, char color) { - char command [] = { - 27,'R','F', - #if COORD_SIZE == 1 - x1, y1, x2, y2, - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2), - #endif + char command[] = { + 27, + 'R', + 'F', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif color }; sendData(command, sizeof(command)); } - void EDIPTFT::clearRect(int x1, int y1, int x2, int y2) { Serial.print("Clearing "); - Serial.print(x1); Serial.print(", "); - Serial.print(y1); Serial.print(", "); - Serial.print(x2); Serial.print(", "); - Serial.println(y2); - char command [] = { - 27, 'R', 'L', - #if COORD_SIZE == 1 - x1, y1, x2, y2 - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2), - #endif + Serial.print(x1); + Serial.print(", "); + Serial.print(y1); + Serial.print(", "); + Serial.print(x2); + Serial.print(", "); + Serial.println(y2); + char command[] = { + 27, + 'R', + 'L', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2 +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif }; sendData(command, sizeof(command)); } - void EDIPTFT::defineTouchKey(int x1, int y1, int x2, int y2, char down, char up, - const char* text) { //text nicht const 17 + const char* text) { // text nicht const 17 byte len = strlen(text); byte i; - char helper [len + 6 + 4 * COORD_SIZE];//len+13 17 - char command [] = { - 27, 'A', 'T', - #if COORD_SIZE == 1 - x1, y1, x2, y2, - #else - lowByte(x1), highByte(x1), lowByte(y1), highByte(y1), - lowByte(x2), highByte(x2), lowByte(y2), highByte(y2), - #endif - down, up + char helper[len + 6 + 4 * COORD_SIZE]; // len+13 17 + char command[] = { + 27, + 'A', + 'T', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif + down, + up }; - for (i = 0; i < (5 + 4 * COORD_SIZE); i++) helper[i] = command[i];//i<=12 17 - for (i = 0; i <= len+1; i++) helper[i + 5 + 4 * COORD_SIZE] = text[i];//i<=len 17 - sendData(helper, sizeof(helper));//size len+14 17 + for (i = 0; i < (5 + 4 * COORD_SIZE); i++) + helper[i] = command[i]; // i<=12 17 + for (i = 0; i <= len + 1; i++) + helper[i + 5 + 4 * COORD_SIZE] = text[i]; // i<=len 17 + sendData(helper, sizeof(helper)); // size len+14 17 } - -void EDIPTFT::defineTouchSwitch(int x1, int y1, int x2, int y2, - char down, char up, const char* text) {//const nicht 17 +void EDIPTFT::defineTouchSwitch(int x1, int y1, int x2, int y2, char down, + char up, const char* text) { // const nicht 17 byte len = strlen(text); byte i; - char helper [len + 6 + 4 * COORD_SIZE];//len+13 17 - char command [] = { - 27, 'A', 'K', - #if COORD_SIZE == 1 - x1, y1, x2, y2, - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2), - #endif - down, up + char helper[len + 6 + 4 * COORD_SIZE]; // len+13 17 + char command[] = { + 27, + 'A', + 'K', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif + down, + up }; - for (i = 0; i < 5 + 4 * COORD_SIZE; i++) helper[i] = command[i]; - for (i = 0; i <= len; i++) helper[i + 5 + 4 * COORD_SIZE] = text[i]; - sendData(helper, sizeof(helper));//size len+14 + for (i = 0; i < 5 + 4 * COORD_SIZE; i++) + helper[i] = command[i]; + for (i = 0; i <= len; i++) + helper[i + 5 + 4 * COORD_SIZE] = text[i]; + sendData(helper, sizeof(helper)); // size len+14 } - void EDIPTFT::defineTouchSwitch(int x, int y, int img, char downcode, char upcode, const char* text) { byte len = strlen(text); byte i; byte n = 6 + 2 * COORD_SIZE; - char helper [len + n + 1]; - char command [] = { - 27, 'A', 'J', - #if COORD_SIZE == 1 - x, y, - #else - lowByte(x), highByte(x), lowByte(y), highByte(y), - #endif - img, downcode, upcode + char helper[len + n + 1]; + char command[] = { + 27, + 'A', + 'J', +#if COORD_SIZE == 1 + x, + y, +#else + lowByte(x), + highByte(x), + lowByte(y), + highByte(y), +#endif + img, + downcode, + upcode }; - for (i = 0; i < n; i++) helper[i] = command[i]; - for (i = 0; i <= len; i++) helper[i + n] = text[i]; + for (i = 0; i < n; i++) + helper[i] = command[i]; + for (i = 0; i <= len; i++) + helper[i + n] = text[i]; sendData(helper, sizeof(helper)); } - -void EDIPTFT::setTouchSwitch(char code,char value) { - char command [] = { - 27, 'A', 'P', code, value - }; +void EDIPTFT::setTouchSwitch(char code, char value) { + char command[] = {27, 'A', 'P', code, value}; sendData(command, sizeof(command)); } - -void EDIPTFT::setTouchkeyColors( - char n1, char n2, char n3, char s1, char s2, char s3) { - char command [] = { - 27, 'F', 'E', n1, n2, n3, s1, s2, s3 - }; +void EDIPTFT::setTouchkeyColors(char n1, char n2, char n3, char s1, char s2, + char s3) { + char command[] = {27, 'F', 'E', n1, n2, n3, s1, s2, s3}; sendData(command, sizeof(command)); } - void EDIPTFT::setTouchkeyFont(char font) { - char command [] = { - 27, 'A', 'F', font - }; + char command[] = {27, 'A', 'F', font}; sendData(command, sizeof(command)); } - void EDIPTFT::setTouchkeyLabelColors(char nf, char sf) { - char command [] = { - 27, 'F', 'A', nf, sf - }; + char command[] = {27, 'F', 'A', nf, sf}; sendData(command, sizeof(command)); } - void EDIPTFT::setTouchGroup(char group) { - char command [] = { - 27, 'A', 'R', group - }; + char command[] = {27, 'A', 'R', group}; sendData(command, sizeof(command)); } - void EDIPTFT::removeTouchArea(char code, char n1) { - char command [] = { - 27, 'A', 'L', code, n1 - }; + char command[] = {27, 'A', 'L', code, n1}; sendData(command, sizeof(command)); } - void EDIPTFT::callMacro(uint nr) { - char command[] = { - 27, 'M', 'N', nr - }; + char command[] = {27, 'M', 'N', nr}; sendData(command, sizeof(command)); } - void EDIPTFT::callTouchMacro(uint nr) { - char command[] = { - 27, 'M', 'T', nr - }; + char command[] = {27, 'M', 'T', nr}; sendData(command, sizeof(command)); } - void EDIPTFT::callMenuMacro(uint nr) { - char command[] = { - 27, 'M', 'M', nr - }; + char command[] = {27, 'M', 'M', nr}; sendData(command, sizeof(command)); } - -void EDIPTFT::defineTouchMenu(int x1, int y1, int x2, int y2, - char downcode, char upcode, char mnucode, const char *text) { +void EDIPTFT::defineTouchMenu(int x1, int y1, int x2, int y2, char downcode, + char upcode, char mnucode, const char* text) { byte len = strlen(text); byte n = 6 + 4 * COORD_SIZE; - char helper [len + n + 1]; + char helper[len + n + 1]; - char command [] = { - 27, 'A', 'M', - #if COORD_SIZE == 1 - x1, y1, x2, y2, - #else - lowByte(x1),highByte(x1),lowByte(y1),highByte(y1), - lowByte(x2),highByte(x2),lowByte(y2),highByte(y2), - #endif - downcode, upcode, mnucode + char command[] = { + 27, + 'A', + 'M', +#if COORD_SIZE == 1 + x1, + y1, + x2, + y2, +#else + lowByte(x1), + highByte(x1), + lowByte(y1), + highByte(y1), + lowByte(x2), + highByte(x2), + lowByte(y2), + highByte(y2), +#endif + downcode, + upcode, + mnucode }; - for (int i = 0; i < n; i++) helper[i] = command[i]; - for (int i = 0; i <= len; i++) helper[i + n] = text[i]; + for (int i = 0; i < n; i++) + helper[i] = command[i]; + for (int i = 0; i <= len; i++) + helper[i + n] = text[i]; sendData(helper, sizeof(helper)); } - void EDIPTFT::openTouchMenu() { - char command [] = { - 27, 'N', 'T', 2 - }; + char command[] = {27, 'N', 'T', 2}; sendData(command, sizeof(command)); } - void EDIPTFT::setMenuFont(char font) { - char command [] = { - 27, 'N', 'F', font - }; + char command[] = {27, 'N', 'F', font}; sendData(command, sizeof(command)); } - void EDIPTFT::setTouchMenuAutomation(bool val) { char n1 = val ? 1 : 0; - char command [] = { - 27, 'N', 'T', n1 - }; + char command[] = {27, 'N', 'T', n1}; sendData(command, sizeof(command)); } \ No newline at end of file diff --git a/lib/arduino-ediptft-master/EDIPTFT.h b/lib/arduino-ediptft-master/EDIPTFT.h index 5a0cd89..954501f 100644 --- a/lib/arduino-ediptft-master/EDIPTFT.h +++ b/lib/arduino-ediptft-master/EDIPTFT.h @@ -26,15 +26,15 @@ #include "Arduino.h" -//Devices +// Devices #define EDIP128 1 #define EDIP160 1 #define EDIP240 1 #define EDIP320 2 -//Set your device +// Set your device #define DEVICE EDIP320 -#define COORD_SIZE DEVICE //Byte count for coordinates +#define COORD_SIZE DEVICE // Byte count for coordinates #define SERIAL_DEV Serial3 #define EA_TRANSPARENT 0 @@ -72,382 +72,384 @@ #define uint unsigned int class EDIPTFT { - public: - EDIPTFT(boolean smallprotocol=true, boolean disconnected=false); - boolean disconnected; +public: + EDIPTFT(boolean smallprotocol = true, boolean disconnected = false); + boolean disconnected; - void begin(long baud=115200); + void begin(long baud = 115200); - // helper functions - char readByte(); - char waitandreadByte(); - unsigned char datainBuffer(); - int readBuffer(char* data); - void smallProtoSelect(char address); - void smallProtoDeselect(char address); - void sendData(char* data, char len); + // helper functions + char readByte(); + char waitandreadByte(); + unsigned char datainBuffer(); + int readBuffer(char* data); + void smallProtoSelect(char address); + void smallProtoDeselect(char address); + void sendData(char* data, char len); - // Basic display functions - /*! \brief Clear display - * - * Clear display contents (all pixels off) and remove touch areas - */ - void clear(); + // Basic display functions + /*! \brief Clear display + * + * Clear display contents (all pixels off) and remove touch areas + */ + void clear(); - /*! \brief Delete display - * - * Delete display contents (all pixels off). Touch areas are still active. - */ - void deleteDisplay(); + /*! \brief Delete display + * + * Delete display contents (all pixels off). Touch areas are still active. + */ + void deleteDisplay(); - /*! \brief Invert display - * - * Invert display contents (invert all pixels) - */ - void invert(); + /*! \brief Invert display + * + * Invert display contents (invert all pixels) + */ + void invert(); - void setDisplayColor(char fg, char bg); + void setDisplayColor(char fg, char bg); - void fillDisplayColor(char bg); + void fillDisplayColor(char bg); - /*! \brief Terminal on - * - * Terminal display is switched on if \a on is true - * - * \param on determine if terminal is switched on - */ - void terminalOn(boolean on); + /*! \brief Terminal on + * + * Terminal display is switched on if \a on is true + * + * \param on determine if terminal is switched on + */ + void terminalOn(boolean on); - /*! \brief Load internal image - * - * Load internal image with the \a nr (0..255) from the *EEPROM* memory to - * \a x1, \a y1 - * - * \param x1 x position of image on the display - * \param y1 y position of image on the display - * \param nr number of the image on the *EEPROM* - */ - void loadImage(int x1, int y1, int nr); + /*! \brief Load internal image + * + * Load internal image with the \a nr (0..255) from the *EEPROM* memory to + * \a x1, \a y1 + * + * \param x1 x position of image on the display + * \param y1 y position of image on the display + * \param nr number of the image on the *EEPROM* + */ + void loadImage(int x1, int y1, int nr); - /*! \brief Cursor on/off - * - * Switch cursor on/off - * - * \param on `n1=0`: cursor is invisible, `n1=1`: cursor flashes - */ - void cursorOn(boolean on); + /*! \brief Cursor on/off + * + * Switch cursor on/off + * + * \param on `n1=0`: cursor is invisible, `n1=1`: cursor flashes + */ + void cursorOn(boolean on); - /*! \brief Position cursor - * - * origin upper-left corner `(1, 1)` - * - * \param col new cursor column - * \param row new cursor row - */ - void setCursor(char col, char row); + /*! \brief Position cursor + * + * origin upper-left corner `(1, 1)` + * + * \param col new cursor column + * \param row new cursor row + */ + void setCursor(char col, char row); - void displayLight(char no); - // Bargraph - /*! \brief Define bargraph - * - * Define bargraph to form the rectangle enclosing the - * bargraph. \a sv and \a ev are the values for `0%` and `100%`. - * - * \param dir direction ('L'eft, 'R'ight, 'O'up, 'U'down) - * \param no bargraph number `1..32` - * \param x1 upper left x coordinate - * \param y1 upper left y coordinate - * \param x2 lower right x coordinate - * \param y2 lower right y coordinate - * \param sv start value (0%) - * \param ev end value (100%) + void displayLight(char no); + // Bargraph + /*! \brief Define bargraph + * + * Define bargraph to form the rectangle enclosing the + * bargraph. \a sv and \a ev are the values for `0%` and `100%`. + * + * \param dir direction ('L'eft, 'R'ight, 'O'up, 'U'down) + * \param no bargraph number `1..32` + * \param x1 upper left x coordinate + * \param y1 upper left y coordinate + * \param x2 lower right x coordinate + * \param y2 lower right y coordinate + * \param sv start value (0%) + * \param ev end value (100%) - * \param type set the style of the bargraph:\n - * `type=0`: pattern bar, \a mst=bar pattern,\n - * `type=1`: pattern bar in rectangle, \a mst=bar pattern,\n - * `type=2`: pattern line, \a mst=line width,\n - * `type=3`: pattern line in rectangle, \a mst=line width - * - * \param mst additional parameter for type specification - */ - void defineBargraph(char dir, char no, int x1, int y1, int x2, int y2, - byte sv, byte ev, char type, char mst); + * \param type set the style of the bargraph:\n + * `type=0`: pattern bar, \a mst=bar pattern,\n + * `type=1`: pattern bar in rectangle, \a mst=bar pattern,\n + * `type=2`: pattern line, \a mst=line width,\n + * `type=3`: pattern line in rectangle, \a mst=line width + * + * \param mst additional parameter for type specification + */ + void defineBargraph(char dir, char no, int x1, int y1, int x2, int y2, + byte sv, byte ev, char type, char mst); - /*! \brief Update bargraph - * - * Set and draw the bargraph *no* to the new *value* - * - * \param no number of the bargraph `1..32` - * \param val new value of the bargraph - */ - void updateBargraph(char no, char val); + /*! \brief Update bargraph + * + * Set and draw the bargraph *no* to the new *value* + * + * \param no number of the bargraph `1..32` + * \param val new value of the bargraph + */ + void updateBargraph(char no, char val); - void setBargraphColor(char no, char fg, char bg, char fr); + void setBargraphColor(char no, char fg, char bg, char fr); - /*! \brief Set bargraph by touch - * - * The bargraph with number *no* is defined for input by touch panel - * - * \param no number of the bargraph `1..32` - */ - void makeBargraphTouch(char no); + /*! \brief Set bargraph by touch + * + * The bargraph with number *no* is defined for input by touch panel + * + * \param no number of the bargraph `1..32` + */ + void makeBargraphTouch(char no); - void linkBargraphLight(char no); + void linkBargraphLight(char no); - /*! \brief Delete bargraph - * - * The definition of the bargraph with number *no* becomes invalid. If the - * bargraph was defined as input with touch, the touchfield will also be - * deleted. - * - * \param no number of the bargraph `1..32` - * \param n1 additional parameter\n - * `n1=0`: bargraph remains visible\n - * `n1=1`: bargraph is deleted - */ - void deleteBargraph(char no, char n1); + /*! \brief Delete bargraph + * + * The definition of the bargraph with number *no* becomes invalid. If the + * bargraph was defined as input with touch, the touchfield will also be + * deleted. + * + * \param no number of the bargraph `1..32` + * \param n1 additional parameter\n + * `n1=0`: bargraph remains visible\n + * `n1=1`: bargraph is deleted + */ + void deleteBargraph(char no, char n1); - // Instrument - void defineInstrument(char no, int x1, int y1, char image, - char angle, char sv, char ev); - void updateInstrument(char no, char val); - void redrawInstrument(char no); - void deleteInstrument(char no, char n1, char n2); + // Instrument + void defineInstrument(char no, int x1, int y1, char image, char angle, + char sv, char ev); + void updateInstrument(char no, char val); + void redrawInstrument(char no); + void deleteInstrument(char no, char n1, char n2); - // Text - void setTextColor(char fg, char bg); + // Text + void setTextColor(char fg, char bg); - /*! \brief Set font - * - * Set font with the number *font* - * - * \param font font number `font=0..15`, use font defines here - */ - void setTextFont(char font); - - void setTextSize(int xsize, int ysize); + /*! \brief Set font + * + * Set font with the number *font* + * + * \param font font number `font=0..15`, use font defines here + */ + void setTextFont(char font); - /*! \brief Set text angle - * - * Set text output angle - * - * \param angle text output angle\n - `angle=0`: 0° - `angle=1`: 90° - */ - void setTextAngle(char angle); + void setTextSize(int xsize, int ysize); - /*! \brief Draw text on display - * - * Draw a *text* on screen. Several lines are separated by the character `|` - * ($7C). - * * place text between `~`: characters flash on/off - * * place text between `@`: characters flash inversely - * * use `\\` as to escape special characters - * - * \param x1: x coordinate - * \param y1: y coordinate - * \param justification set text justification to `L`(eft), `R`(ight), - * `C`(enter) - * \param text text to draw on display - */ - void drawText(uint16_t x1, uint16_t y1, char justification, const char* text); + /*! \brief Set text angle + * + * Set text output angle + * + * \param angle text output angle\n + `angle=0`: 0° + `angle=1`: 90° + */ + void setTextAngle(char angle); - /*! \brief Draw text on display in an area - * - * Draw a *text* on screen. Several lines are separated by the character `|` - * ($7C). - * * place text between `~`: characters flash on/off - * * place text between `@`: characters flash inversely - * * use `\\` as to escape special characters - * - * \param align set alignment in the rectangle. 1 = top left, 2 = top - * center, 3 = top right, 4 = center left, 5 = center, 6 = center right, 7 = - * bottom left, 8 = bottom center, 9 = bottom right. - * \param text text to draw on display - */ - void drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align, const char* text); + /*! \brief Draw text on display + * + * Draw a *text* on screen. Several lines are separated by the character `|` + * ($7C). + * * place text between `~`: characters flash on/off + * * place text between `@`: characters flash inversely + * * use `\\` as to escape special characters + * + * \param x1: x coordinate + * \param y1: y coordinate + * \param justification set text justification to `L`(eft), `R`(ight), + * `C`(enter) + * \param text text to draw on display + */ + void drawText(uint16_t x1, uint16_t y1, char justification, const char* text); - // Rectangle and Line - void setLineColor(char fg, char bg); + /*! \brief Draw text on display in an area + * + * Draw a *text* on screen. Several lines are separated by the character `|` + * ($7C). + * * place text between `~`: characters flash on/off + * * place text between `@`: characters flash inversely + * * use `\\` as to escape special characters + * + * \param align set alignment in the rectangle. 1 = top left, 2 = top + * center, 3 = top right, 4 = center left, 5 = center, 6 = center right, 7 = + * bottom left, 8 = bottom center, 9 = bottom right. + * \param text text to draw on display + */ + void drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align, + const char* text); - /*! \brief Point size/line thickness - * - * \param x x-point size (1..15) - * \param y y-point size (1..15) - */ - void setLineThick(char x, char y); + // Rectangle and Line + void setLineColor(char fg, char bg); - /*! \brief Draw straight line - * - * Draw straight line from point *x1*, *y1* to point *x2*, *y2* - */ - void drawLine(int x1, int y1, int x2, int y2); + /*! \brief Point size/line thickness + * + * \param x x-point size (1..15) + * \param y y-point size (1..15) + */ + void setLineThick(char x, char y); - /*! \brief Draw rectangle - * - * Draw four straight lines as a rectangle from *x1*, *y1* to *x2*, *y2* - */ - void drawRect(int x1, int y1, int x2, int y2); + /*! \brief Draw straight line + * + * Draw straight line from point *x1*, *y1* to point *x2*, *y2* + */ + void drawLine(int x1, int y1, int x2, int y2); - void drawRectf(int x1, int y1, int x2, int y2, char color); + /*! \brief Draw rectangle + * + * Draw four straight lines as a rectangle from *x1*, *y1* to *x2*, *y2* + */ + void drawRect(int x1, int y1, int x2, int y2); - /*! \brief Clear rectangular area */ - void clearRect(int x1, int y1, int x2, int y2); + void drawRectf(int x1, int y1, int x2, int y2, char color); - // Touch keys + /*! \brief Clear rectangular area */ + void clearRect(int x1, int y1, int x2, int y2); - /*! \brief Define touch key - * - * Key remains pressed as long as there is contact. The area from *x1*, *y1* - * to *x2*, *y2* is drawn with actual border and defined as a key. - * The label is drawn with the current touch font. The first character - * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). - * Multiline texts are separated by the character `|`. - * - * \param down return/touchmacro (1-255) if pressed - * \param up return/touchmacro (1-255) if released - * \param text label of the touch key - */ - void defineTouchKey(int x1, int y1, int x2, int y2, - char down, char up, const char* text); + // Touch keys - /*! \brief Define touch switch - * - * Status of the switch toggles after each contact. The area from *x1*, *y1* - * to *x2*, *y2* is drawn with actual border and defined as a key. - * The label is drawn with the current touch font. The first character - * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). - * Multiline texts are separated by the character `|`. - * - * \param down return/touchmacro (1-255) if pressed - * \param up return/touchmacro (1-255) if released - * \param text label of the touch key - */ - void defineTouchSwitch(int x1, int y1, int x2, int y2, - char down, char up, const char* text); + /*! \brief Define touch key + * + * Key remains pressed as long as there is contact. The area from *x1*, *y1* + * to *x2*, *y2* is drawn with actual border and defined as a key. + * The label is drawn with the current touch font. The first character + * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). + * Multiline texts are separated by the character `|`. + * + * \param down return/touchmacro (1-255) if pressed + * \param up return/touchmacro (1-255) if released + * \param text label of the touch key + */ + void defineTouchKey(int x1, int y1, int x2, int y2, char down, char up, + const char* text); - /*! \brief Define touch switch with image - * - * Status of the switch toggles after each contact. Image number *img* is - * loaded to *x*, *y* and defined as a switch. - * The label is drawn with the current touch font. The first character - * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). - * Multiline texts are separated by the character `|`. - * - * \param down return/touchmacro (1-255) if pressed - * \param up return/touchmacro (1-255) if released - * \param text label of the touch switch - */ - void defineTouchSwitch(int x, int y, int img, char downcode, - char upcode, const char* text); + /*! \brief Define touch switch + * + * Status of the switch toggles after each contact. The area from *x1*, *y1* + * to *x2*, *y2* is drawn with actual border and defined as a key. + * The label is drawn with the current touch font. The first character + * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). + * Multiline texts are separated by the character `|`. + * + * \param down return/touchmacro (1-255) if pressed + * \param up return/touchmacro (1-255) if released + * \param text label of the touch key + */ + void defineTouchSwitch(int x1, int y1, int x2, int y2, char down, char up, + const char* text); - /*! \brief Set touch switch - * - * Set the status of the touch switch with the return code *code* - * to *value*. - * - * \param code Return code of the switch - * \param value `value=0`: OFF, `value=1`: ON - */ - void setTouchSwitch(char code,char value); + /*! \brief Define touch switch with image + * + * Status of the switch toggles after each contact. Image number *img* is + * loaded to *x*, *y* and defined as a switch. + * The label is drawn with the current touch font. The first character + * determines the alignment of the text (`L`(eft), `R`(ight), `C`(enter)). + * Multiline texts are separated by the character `|`. + * + * \param down return/touchmacro (1-255) if pressed + * \param up return/touchmacro (1-255) if released + * \param text label of the touch switch + */ + void defineTouchSwitch(int x, int y, int img, char downcode, char upcode, + const char* text); - void setTouchkeyColors(char n1, char n2, char n3, - char s1, char s2, char s3); + /*! \brief Set touch switch + * + * Set the status of the touch switch with the return code *code* + * to *value*. + * + * \param code Return code of the switch + * \param value `value=0`: OFF, `value=1`: ON + */ + void setTouchSwitch(char code, char value); - /*! \brief Label font - * - * Apply font with number *font* for touch key labels - */ - void setTouchkeyFont(char font); + void setTouchkeyColors(char n1, char n2, char n3, char s1, char s2, char s3); - void setTouchkeyLabelColors(char nf,char sf); + /*! \brief Label font + * + * Apply font with number *font* for touch key labels + */ + void setTouchkeyFont(char font); - /*! \brief Radio group for switches - * - * `group=0`: newly defined switches don't belong to a group - * `group=1..255`: newly defined switches are assigned to the group with - * the given number - * Only one switch in a group is active at once. All others are deactivated. - * For switches only the *down code* is applicable. The *up code* will be - * ignored. - */ - void setTouchGroup(char group); + void setTouchkeyLabelColors(char nf, char sf); - /*! \brief Delete toch area by up- or downcode - * - * The touch area with the return code is removed from the touch query - * - * \param code the code of the touch area (code=0: all touch areas) - * \param n1 n1==0: the area remains visible on the display, - * n1==1: the area is deleted - */ - void removeTouchArea(char code,char n1); + /*! \brief Radio group for switches + * + * `group=0`: newly defined switches don't belong to a group + * `group=1..255`: newly defined switches are assigned to the group with + * the given number + * Only one switch in a group is active at once. All others are deactivated. + * For switches only the *down code* is applicable. The *up code* will be + * ignored. + */ + void setTouchGroup(char group); - // Macro Calls - /*! \brief Run macro - * - * Call the (normal) macro with number *nr* (max. 7 levels). - */ - void callMacro(uint nr); + /*! \brief Delete toch area by up- or downcode + * + * The touch area with the return code is removed from the touch query + * + * \param code the code of the touch area (code=0: all touch areas) + * \param n1 n1==0: the area remains visible on the display, + * n1==1: the area is deleted + */ + void removeTouchArea(char code, char n1); - /*! \brief Run touch macro - * - * Call touch macro with number *nr* (max. 7 levels) - */ - void callTouchMacro(uint nr); + // Macro Calls + /*! \brief Run macro + * + * Call the (normal) macro with number *nr* (max. 7 levels). + */ + void callMacro(uint nr); - /*! \brief Run menu macro - * - * Call menu macro with number *nr* (max. 7 levels) - */ - void callMenuMacro(uint nr); + /*! \brief Run touch macro + * + * Call touch macro with number *nr* (max. 7 levels) + */ + void callTouchMacro(uint nr); - /*! \brief Define touch key with menu function - * - * Define the area from *x1*, *y1* to *x2*, *y2* as a menu key. - * The first character determines the direction in which the menu opens (R=right,L=left,O=up,U=down) - * The second character determines the alignment of the touch text (C=center,L=left-,R=right justified) - * The menu items are separated by the character '|' ($7C,dec:124) (e.g. "UCkey|item1|item2|item3". - * The key text is written with the current touch font and the menu items are written with the current menu font. The background of the menu is saved automatically. - * \param downcode `1-255` return/touchmacro if pressed - * \param upcode `1-255` return/touchmacro if released - * \param mnucode return/menumacro+(item nr - 1) after selection of a - * menu item - * \param text string with the key text and menu items - */ - void defineTouchMenu(int x1, int y1, int x2, int y2, - char downcode, char upcode, char mnucode, - const char *text); + /*! \brief Run menu macro + * + * Call menu macro with number *nr* (max. 7 levels) + */ + void callMenuMacro(uint nr); - /*! \brief Send *open* signal after a Menu open request has been sent from TFT. - * - * If a touch menu is not set to open automatically the TFT sends a - * request 'ESC T 0'. This function sends 'ESC N T 2' to open the menu. - */ - void openTouchMenu(); + /*! \brief Define touch key with menu function + * + * Define the area from *x1*, *y1* to *x2*, *y2* as a menu key. + * The first character determines the direction in which the menu opens + * (R=right,L=left,O=up,U=down) The second character determines the alignment + * of the touch text (C=center,L=left-,R=right justified) The menu items are + * separated by the character '|' ($7C,dec:124) (e.g. + * "UCkey|item1|item2|item3". The key text is written with the current touch + * font and the menu items are written with the current menu font. The + * background of the menu is saved automatically. \param downcode `1-255` + * return/touchmacro if pressed \param upcode `1-255` return/touchmacro if + * released \param mnucode return/menumacro+(item nr - 1) after selection of a + * menu item + * \param text string with the key text and menu items + */ + void defineTouchMenu(int x1, int y1, int x2, int y2, char downcode, + char upcode, char mnucode, const char* text); - /*! \brief Set menu font - * - * Set font with number *font* (`0..15`) for menu display - */ - void setMenuFont(char font); + /*! \brief Send *open* signal after a Menu open request has been sent from + * TFT. + * + * If a touch menu is not set to open automatically the TFT sends a + * request 'ESC T 0'. This function sends 'ESC N T 2' to open the menu. + */ + void openTouchMenu(); - /*! \brief enable/disable touchmenu automation - * - * if val==true touch menu opens automatically, if val==false touchmenu - * doesn' t open automatically, instead a request is sent to the - * host computer, which can then open the menu with openTouchMenu() - */ - void setTouchMenuAutomation(bool val); + /*! \brief Set menu font + * + * Set font with number *font* (`0..15`) for menu display + */ + void setMenuFont(char font); - private: - boolean _smallprotocol; - int _counter; - unsigned char bytesAvailable(); - void waitBytesAvailable(); - void sendByte(char data); - void sendSmall(char* data, char len); - void sendSmallDC2(char* data, char len); + /*! \brief enable/disable touchmenu automation + * + * if val==true touch menu opens automatically, if val==false touchmenu + * doesn' t open automatically, instead a request is sent to the + * host computer, which can then open the menu with openTouchMenu() + */ + void setTouchMenuAutomation(bool val); + +private: + boolean _smallprotocol; + int _counter; + unsigned char bytesAvailable(); + void waitBytesAvailable(); + void sendByte(char data); + void sendSmall(char* data, char len); + void sendSmallDC2(char* data, char len); }; #endif