6 Commits

Author SHA1 Message Date
37123a43e8 Alternate color of testing view rows 2022-03-14 14:30:33 +01:00
fc65d22450 Rename driver/testing pages to views 2022-03-14 14:06:52 +01:00
4de2baa867 Don't clear display periodically 2022-03-13 21:07:44 +01:00
c6c0fa987e Update CAN
There are only 7 RX mailboxes available, so one of the filters won't
work.
2022-03-13 21:06:05 +01:00
d0afcb6da4 Add .git-blame-ignore-revs
You can use this file 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
2022-03-13 20:33:59 +01:00
41d3bd907e 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
2022-03-13 20:30:14 +01:00
17 changed files with 2355 additions and 2319 deletions

8
.editorconfig Normal file
View File

@ -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

2
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,2 @@
# Format everything
41d3bd907e65b484876859b767328e5d81181911

View File

@ -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;
@ -48,13 +46,14 @@ 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_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);
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++) {

View File

@ -1,14 +1,26 @@
#include "FT18_STW_DISPLAY.h"
#include "Arduino.h"
#include "EDIPTFT.h"
#include "FT_2018_STW_CAN.h"
#include "FT18_STW_INIT.h"
#include "FT18_STW_DISPLAY.h"
#include "FT_2018_STW_CAN.h"
String pad_left(String orig, int len, char pad_char) {
String result = {orig};
for (int i = orig.length(); i < len; i++) {
result = pad_char + result;
}
return result;
}
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"};
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};
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');
@ -18,6 +30,8 @@ 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');
int testing_page = 0;
void init_display() {
pinMode(writeprotect, OUTPUT);
digitalWrite(writeprotect, HIGH);
@ -51,7 +65,7 @@ String get_value(Value val) {
}
return String(Vehicle_data.gear);
case VAL_RPM:
return String(Vehicle_data.revol);
return String(Vehicle_data.revol / 2);
case VAL_TT_FL:
return "00";
case VAL_TT_FR:
@ -61,7 +75,8 @@ String get_value(Value val) {
case VAL_TT_RR:
return "11";
case VAL_LAPTIME:
return "93.13";
return String(
Vehicle_data.lap_time_sec + Vehicle_data.lap_time_msec / 1000.0, 2);
case VAL_UBATT:
return String(0.0706949 * Vehicle_data.u_batt, 2);
case VAL_TMOT:
@ -142,7 +157,8 @@ bool check_alarms() {
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) {
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) {
@ -155,9 +171,12 @@ bool check_alarms() {
if (alarm_active) {
String alarm_text = "";
if (poil_alarm) alarm_text += "PO";
if (tmot_alarm) alarm_text += "TM";
if (toil_alarm) alarm_text += "TO";
if (poil_alarm)
alarm_text += "PO";
if (tmot_alarm)
alarm_text += "TM";
if (toil_alarm)
alarm_text += "TO";
alarm(alarm_text);
}
@ -169,11 +188,14 @@ bool check_enc_displays() {
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");
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) {
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();
@ -196,7 +218,7 @@ bool check_display(uint8_t& val_old, uint8_t val_new, bool& active, uint32_t& be
}
void update_display() {
static DisplayPage page = PAGE_DRIVER;
static DisplayView view = VIEW_DRIVER;
static uint32_t last_cleared;
static bool cleared = true;
@ -215,42 +237,37 @@ void update_display(){
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
// debounced rises to ensure we don't keep toggling between the views
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);
view = (DisplayView)((view + 1) % (VIEW_LAST + 1));
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 (view == VIEW_DRIVER) {
if (cleared) {
redraw_page_driver();
redraw_view_driver();
cleared = false;
} else {
update_page_driver();
update_view_driver();
}
} else {
if (cleared) {
redraw_page_testing();
redraw_view_testing();
cleared = false;
} else {
update_page_testing();
update_view_testing();
}
}
}
void alarm(String textstr) {
uint8_t x = 1;;
uint8_t x = 1;
;
char text[7];
textstr.toCharArray(text, 7);
tft.setTextSize(8, 8);
@ -280,7 +297,9 @@ void alarm(String textstr){
}
}
void redraw_page_driver() {
void redraw_view_driver() {
tft.setTextColor(EA_WHITE, EA_TRANSPARENT);
// Boxes
tft.drawLine(0, 110, 320, 110);
tft.drawLine(120, 0, 120, 110);
@ -300,7 +319,7 @@ void redraw_page_driver() {
rr_box.redraw();
}
void update_page_driver() {
void update_view_driver() {
static Value left_box_value = VAL_FIRST_LEFT_BOX;
if (Stw_data.button4_rises > 0) {
Stw_data.button4_rises--;
@ -310,6 +329,7 @@ void update_page_driver() {
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) {
@ -329,14 +349,72 @@ void update_page_driver() {
rr_box.update_value(90);
}
void redraw_page_testing() {
void redraw_view_testing() {
tft.clear();
tft.setTextFont(EA_FONT7X12);
tft.setTextSize(2, 2);
int start = 10 * testing_page;
tft.setTextColor(EA_WHITE, EA_BLACK);
for (int i = start; i <= min(VAL_LAST, start + 9); i += 2) {
redraw_label_testing(i, EA_BLACK);
}
tft.setTextColor(EA_WHITE, EA_DARKGREY);
for (int i = start + 1; i <= min(VAL_LAST, start + 9); i += 2) {
redraw_label_testing(i, EA_DARKGREY);
}
void update_page_testing() {}
update_view_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)
void update_view_testing() {
if (Stw_data.button4_rises > 0) {
Stw_data.button4_rises--;
testing_page++;
if (testing_page * 10 > VAL_LAST) {
testing_page = 0;
}
redraw_view_testing();
}
if (Stw_data.button1_rises > 0) {
Stw_data.button1_rises--;
testing_page--;
if (testing_page < 0) {
testing_page = VAL_LAST / 10;
}
redraw_view_testing();
}
tft.setTextFont(EA_FONT7X12);
tft.setTextSize(2, 2);
int start = 10 * testing_page;
tft.setTextColor(EA_WHITE, EA_BLACK);
for (int i = start; i <= min(VAL_LAST, start + 9); i += 2) {
update_value_testing(i);
}
tft.setTextColor(EA_WHITE, EA_DARKGREY);
for (int i = start + 1; i <= min(VAL_LAST, start + 9); i += 2) {
update_value_testing(i);
}
}
void redraw_label_testing(int i, uint8_t color) {
String text = get_label((Value)i) + ":";
int y = (i % 10) * 24;
tft.drawRectf(0, y, 320, y + 23, color);
tft.drawText(10, y, 'L', text.c_str());
}
void update_value_testing(int i) {
String text = pad_left(get_value((Value)i), 5);
int y = (i % 10) * 24;
tft.drawText(310, y, 'R', 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{""} {}
@ -377,8 +455,11 @@ void DataBox::redraw_label() {
}
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} {}
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) {
@ -392,12 +473,7 @@ void TireTempBox::update_value(int val_new) {
} 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;
}
String val_str = pad_left(String(val_new), 3);
DataBox::update_value(val_str);
}
}

View File

@ -1,7 +1,7 @@
#include "Arduino.h"
#include "EDIPTFT.h"
#include "FT_2018_STW_CAN.h"
#include "FT18_STW_INIT.h"
#include "FT_2018_STW_CAN.h"
#ifndef FT18_STW_DISPLAY_h
#define FT18_STW_DISPLAY_h
@ -12,7 +12,6 @@
#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)
@ -22,20 +21,36 @@
#define TOIL_ALARM_TIME 10000 // ms
#define ENC_DISPLAY_TIME 1000 // ms
enum DisplayPage {PAGE_DRIVER, PAGE_TESTING};
#define DISPLAY_PAGES 2
String pad_left(String orig, int len, char pad_char = ' ');
enum DisplayView { VIEW_DRIVER, VIEW_TESTING, VIEW_LAST = VIEW_TESTING };
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
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);
@ -44,12 +59,15 @@ 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);
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();
void redraw_view_driver();
void update_view_driver();
void redraw_view_testing();
void update_view_testing();
void redraw_label_testing(int i, uint8_t bg_color);
void update_value_testing(int i);
class DataBox {
public:
@ -80,8 +98,8 @@ protected:
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);
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);

View File

@ -7,9 +7,11 @@
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};
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};
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;

View File

@ -32,7 +32,6 @@
#define enc2PinB 41
#define enc2PinS 39
// define Drehzahlgrenzen TODOOOO
#define RPM_THRES_1 1000
#define RPM_THRES_2 6000
@ -45,13 +44,11 @@
#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
{
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
@ -60,9 +57,11 @@ typedef struct
uint8_t buttonState4; // 1 Bit 5
// bool CAN_toggle;
// bool CAN_check;
//uint8_t i; //Index linker Drehschalter
// uint8_t i; //Index
// linker Drehschalter
uint8_t buttonStateEnc1; // button
//uint8_t br; //test mode : mittlere Drehschalter position
// 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
@ -75,8 +74,7 @@ typedef struct
uint8_t enc2_rises;
} stw_data_type;
typedef struct
{
typedef struct {
uint8_t e_thro; // E-Drossel
uint8_t g_auto; // Auto-Shift
uint8_t gear; // Gang
@ -94,12 +92,11 @@ typedef struct
uint8_t speed_fl;
uint8_t speed_fr;
uint8_t speed;
uint8_t lap_time_sec;
uint8_t lap_time_msec;
} vehicle_data_type;
extern volatile stw_data_type Stw_data;
extern volatile vehicle_data_type Vehicle_data;
#endif

View File

@ -1,8 +1,8 @@
#include "FT18e_STW_DISPLAY.h"
#include "Arduino.h"
#include "EDIPTFT.h"
#include "FT_2018e_STW_CAN.h"
#include "FT18e_STW_INIT.h"
#include "FT18e_STW_DISPLAY.h"
#include "FT_2018e_STW_CAN.h"
EDIPTFT tft(true, false);
String bezeichnungen[] = {"Batterieleistung", "Moment", "Batterietemp"};
@ -26,7 +26,8 @@ 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};
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;
@ -34,8 +35,7 @@ bool poilbool = true;
bool tmotbool = true;
bool toilbool = true;
void init_display()
{
void init_display() {
pinMode(writeprotect, OUTPUT);
digitalWrite(writeprotect, HIGH);
pinMode(reset, OUTPUT);
@ -48,8 +48,8 @@ void init_display()
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);
// 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;
@ -70,24 +70,15 @@ void init_display()
// delay(2000);
}
double get_value(int a)
{
return 0;
}
double get_value(int a) { return 0; }
void update_display()
{
if (!tft.disconnected)
{
void update_display() {
if (!tft.disconnected) {
tft.cursorOn(false);
if (modealt != Stw_data.mode || modetimer == true)
{
if (modealt != Stw_data.mode || modetimer == true) {
display_mode();
}
else
{
if (clearcounter >= 56)
{
} else {
if (clearcounter >= 56) {
tft.clear();
clearcounter = 0;
}
@ -96,10 +87,8 @@ void update_display()
}
}
void display_mode()
{
if (modealt != Stw_data.mode)
{
void display_mode() {
if (modealt != Stw_data.mode) {
tft.clear();
tft.setTextSize(6, 8);
tft.setDisplayColor(EA_WHITE, EA_RED);
@ -116,54 +105,43 @@ void display_mode()
modecounter = 0;
modealt = Stw_data.mode;
modetimer = true;
}
else if (modecounter >= 255)
{
} else if (modecounter >= 255) {
tft.setDisplayColor(EA_WHITE, EA_BLACK);
tft.setTextColor(EA_WHITE, EA_BLACK);
tft.clear();
modetimer = false;
}
else
{
} else {
modecounter += 1;
delay(5);
}
}
void alarm(String textstr)
{
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)
{
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++)
{
for (int j = 0; j < 16; j++) {
digitalWrite(led_s[j], HIGH);
}
delay(100);
if (!tft.disconnected)
{
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++)
{
for (int j = 0; j < 16; j++) {
digitalWrite(led_s[j], LOW);
}
delay(100);
if (Stw_data.button_ll & Stw_data.button_rr)
{
if (Stw_data.button_ll & Stw_data.button_rr) {
x = 0;
tft.setTextColor(EA_WHITE, EA_BLACK);
}

View File

@ -1,7 +1,7 @@
#include "Arduino.h"
#include "EDIPTFT.h"
#include "FT_2018e_STW_CAN.h"
#include "FT18e_STW_INIT.h"
#include "FT_2018e_STW_CAN.h"
#ifndef FT18e_STW_DISPLAY_h
#define FT18e_STW_DISPLAY_h

View File

@ -1,14 +1,16 @@
#include "Arduino.h"
#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};
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};
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;
@ -18,10 +20,8 @@ RotaryEncoder encoder2(enc2PinA, enc2PinB, 1, 1, 50);
// functions
///////////////////////////////////////////////////
void set_pins()
{
for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++)
{
void set_pins() {
for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++) {
pinMode(led[thisLed], OUTPUT);
}
pinMode(l, OUTPUT);
@ -42,40 +42,30 @@ void set_pins()
enc1PinANow = LOW;
enc2PinALast = LOW;
enc2PinANow = LOW;
for (int i = 0; i < sizeof(buttons) / sizeof(*buttons); i++)
{
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()
{
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()
{
void read_rotary() {
int enc2 = encoder2.readEncoder();
if (enc2 != 0)
{
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)
{
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)
{
} else if (Stw_data.mode == 5 and enc2 > 0) {
Stw_data.mode = 1;
}
else
{
} else {
Stw_data.mode = Stw_data.mode + enc2;
}
val2 = 0;

View File

@ -51,8 +51,7 @@ void set_pins(void);
void read_buttons(void);
void read_rotary(void); // read rotary switches
typedef struct
{
typedef struct {
bool button_ll; // Left side, left button
bool button_lr; // Left side, right button
bool button_rl; // Right side, left button
@ -63,8 +62,7 @@ typedef struct
} stw_data_type;
struct InverterData
{
struct InverterData {
bool ready;
bool derating;
bool warning;
@ -75,8 +73,7 @@ struct InverterData
bool ts_active;
};
typedef struct
{
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

View File

@ -2,30 +2,34 @@
FT_2018_STW_CAN.cpp
*/
#include "FT_2018_STW_CAN.h"
#include "Arduino.h"
#include "DueTimer.h"
#include "due_can.h"
#include "FT_2018_STW_CAN.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};
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.setNumTXBoxes(1); // reserves mailbox 0 for tx only 8 mailboxes are
// available (the other 7 mailboxes are for rx)
Can0.watchFor(CAN_ID_BCU_APS_BRAKE);
Can0.watchFor(CAN_ID_BCU_ETC);
Can0.watchFor(CAN_ID_BCU_SHIFT_CTRL);
Can0.watchFor(CAN_ID_BCU_LAP_TIME);
Can0.watchFor(CAN_ID_MS4_IGN_REV_ATH);
Can0.watchFor(CAN_ID_MS4_SPEED);
Can0.watchFor(CAN_ID_MS4_ETC);
Can0.watchFor(CAN_ID_MS4_STATES_TEMP_PRESS);
Can0.setGeneralCallback(Receive_Can_0);
Timer3.attachInterrupt(Send_0x110); // set send interrupt
Timer3.start(10000); // Calls every 10ms
}
@ -60,9 +64,13 @@ void Send_0x110(){
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
case CAN_ID_BCU_APS_BRAKE: {
Vehicle_data.p_brake_front = temp_message->data.byte[1];
Vehicle_data.p_brake_rear = temp_message->data.byte[2];
break;
}
case CAN_ID_BCU_ETC: { // eDrossel error bit
Vehicle_data.e_thro = (temp_message->data.byte[0] & 0xF0); // bit 4-7
if (temp_message->data.byte[0] & 0x80) {
Stw_data.error_type = 1; //"pc_error";
@ -76,84 +84,42 @@ void Receive_Can_0(CAN_FRAME *temp_message){
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;
case CAN_ID_BCU_SHIFT_CTRL: { // autoshift+gear
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);
case CAN_ID_BCU_LAP_TIME: { // lap time
Vehicle_data.lap_time_sec = temp_message->data.byte[1];
Vehicle_data.lap_time_msec = temp_message->data.byte[1];
}
case CAN_ID_MS4_IGN_REV_ATH: { // rpm
Vehicle_data.revol =
(temp_message->data.byte[5] | temp_message->data.byte[4] << 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
case CAN_ID_MS4_SPEED: { // 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];
case CAN_ID_MS4_ETC: { // battery voltage
Vehicle_data.u_batt = temp_message->data.byte[6];
break;
}*/
case 0x500:{
Vehicle_data.p_brake_front = temp_message->data.byte[1];
Vehicle_data.p_brake_rear = temp_message->data.byte[2];
}
case CAN_ID_MS4_STATES_TEMP_PRESS: { // temp und p
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;
}
}
@ -171,7 +137,9 @@ void update_LED(){
// 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 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.
@ -184,7 +152,8 @@ void update_LED(){
/*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
//analogWrite(leds[j], STW_data.br); //nur eine der zwei
zeilen
}
delay(100);
for (int j = 0; j < 10; j++){

View File

@ -2,10 +2,21 @@
FT_2018_STW_CAN.h
*/
#pragma once
#include "Arduino.h"
#include "DueTimer.h"
#include "due_can.h"
#define CAN_ID_BCU_APS_BRAKE 0x500
#define CAN_ID_BCU_ETC 0x502
#define CAN_ID_BCU_SHIFT_CTRL 0x504
#define CAN_ID_BCU_LAP_TIME 0x570
#define CAN_ID_MS4_IGN_REV_ATH 0x773
#define CAN_ID_MS4_SPEED 0x775
#define CAN_ID_MS4_ETC 0x779
#define CAN_ID_MS4_STATES_TEMP_PRESS 0x77A
void Init_Can_0();
void Send_0x110();
void Receive_Can_0(CAN_FRAME *frame);

View File

@ -2,22 +2,23 @@
FT_2018_STW_CAN.cpp
*/
#include "FT_2018e_STW_CAN.h"
#include "Arduino.h"
#include "DueTimer.h"
#include "due_can.h"
#include "FT_2018e_STW_CAN.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};
int leds[] = {led1, led2, led3, led4, led5, led6, led7, led8,
led9, led10, led11, led12, led13, led14, led15, led16};
void Init_Can_0()
{
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.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);
@ -27,8 +28,7 @@ void Init_Can_0()
Timer3.start(10000); // Calls every 10ms
}
void Send_0x110()
{
void Send_0x110() {
read_buttons();
read_rotary();
can_0_msg.id = 0x110;
@ -47,10 +47,8 @@ void Send_0x110()
Can0.sendFrame(can_0_msg);
}
void Receive_Can_0(CAN_FRAME *temp_message)
{
switch (temp_message->id)
{
void Receive_Can_0(CAN_FRAME *temp_message) {
switch (temp_message->id) {
case CAN_CELL_STATS_ID:
process_cell_stats(temp_message);
break;
@ -70,21 +68,18 @@ void Receive_Can_0(CAN_FRAME *temp_message)
}
}
void process_cell_stats(CAN_FRAME *frame)
{
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)
{
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)
{
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;
@ -92,8 +87,7 @@ void process_cooling_stats(CAN_FRAME *frame)
Vehicle_data.t_mot_r = data->motor_r_temp;
}
void process_inverter_stats(CAN_FRAME *frame)
{
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;
@ -109,9 +103,9 @@ void process_inverter_stats(CAN_FRAME *frame)
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);
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;

View File

@ -31,32 +31,28 @@ void process_cooling_stats(CAN_FRAME *frame);
void process_inverter_stats(CAN_FRAME *frame);
void update_LED(void);
struct CellStats
{
struct CellStats {
uint16_t sum_cell_voltage;
int16_t max_cell_temp;
uint16_t max_cell_voltage;
uint16_t min_cell_voltage;
};
struct BatteryStats
{
struct BatteryStats {
uint16_t battery_current;
uint16_t pre_air_voltage;
uint16_t post_air_voltage;
uint16_t battery_power;
};
struct CoolingStats
{
struct CoolingStats {
int16_t water_pressure;
int16_t water_temp;
int16_t motor_l_temp;
int16_t motor_r_temp;
};
struct InverterStats
{
struct InverterStats {
uint8_t status;
uint8_t _reserved;
uint16_t temp;

View File

@ -25,56 +25,40 @@
#include "Arduino.h"
#define DEBUG false
EDIPTFT::EDIPTFT(boolean smallprotocol, boolean 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)
{
while (loop == 0) {
if (bytesAvailable() != 0) {
loop = 1;
}
if(t_start + 100 < millis())
{
if (t_start + 100 < millis()) {
// Serial.println("Error: waited to long!");
loop = 1;
}
}
}
char EDIPTFT::waitandreadByte() {
waitBytesAvailable();
char result = readByte();
return (result);
}
unsigned char EDIPTFT::bytesAvailable() {
return SERIAL_DEV.available();
//ÄNDERN
}
void EDIPTFT::sendData(char* data, char len) {
/*for(int i=0; i < len; i++) {
@ -95,8 +79,7 @@ void EDIPTFT::sendData(char* data, char len) {
if (_smallprotocol) {
sendSmall(data, len);
}
else {
} else {
unsigned char i;
for (i = 0; i < len; i++) {
sendByte(data[i]);
@ -104,7 +87,6 @@ void EDIPTFT::sendData(char* data, char len) {
}
}
void EDIPTFT::sendSmall(char* data, char len) {
if (disconnected) {
return;
@ -130,12 +112,12 @@ void EDIPTFT::sendSmall(char* data, char len) {
if (bytesAvailable() > 0) {
char x = readByte();
// Serial.print(uint16_t(x));
if (x == ACK) ok = 1;
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;
@ -163,38 +144,30 @@ void EDIPTFT::sendSmallDC2(char* data, char len) {
sendByte(bcc);
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();
@ -204,12 +177,9 @@ unsigned char EDIPTFT::datainBuffer() {
return result;
}
int EDIPTFT::readBuffer(char* data) { // return void
unsigned char len, i; // char in 17er
char command [] = {
0x01, 'S'
};
char command[] = {0x01, 'S'};
sendSmallDC2(command, sizeof(command));
waitandreadByte();
len = waitandreadByte();
@ -222,101 +192,101 @@ int EDIPTFT::readBuffer(char* data) { //return void
return len; // zeile nicht vorhanden
}
void EDIPTFT::clear() { // vgl 17er
this->deleteDisplay();
this->removeTouchArea(0, 1);
}
void EDIPTFT::deleteDisplay() {
char command [] = {
27, 'D', 'L'
};
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'};
sendData(command, sizeof(command));
}
else {
} else {
char command[] = {27, 'T', 'A'};
sendData(command, sizeof(command));
}
}
void EDIPTFT::loadImage(int x1, int y1, int nr) {
char command [] = {27, 'U', 'I',
char command[] = {
27,
'U',
'I',
#if COORD_SIZE == 1
(char)x1, (char)y1,
(char)x1,
(char)y1,
#else
lowByte(x1), highByte(x1), lowByte(y1), highByte(y1),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
#endif
nr};
nr
};
sendData(command, sizeof(command));
}
void EDIPTFT::cursorOn(boolean on) {
if (on) {
char command[] = {27, 'T', 'C', 1};
sendData(command, sizeof(command));
}
else {
} 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};
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) {
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,
27,
'B',
dir,
no,
#if COORD_SIZE == 1
x1, y1, x2, y2,
x1,
y1,
x2,
y2,
#else
lowByte(x1), highByte(x1), lowByte(y1), highByte(y1),
lowByte(x2), highByte(x2), lowByte(y2), highByte(y2),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
lowByte(x2),
highByte(x2),
lowByte(y2),
highByte(y2),
#endif
char(sv),
char(ev),
@ -327,113 +297,87 @@ void EDIPTFT::defineBargraph(char dir, char no, int x1, int y1, int x2, int y2,
// 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
};
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) {
void EDIPTFT::defineInstrument(char no, int x1, int y1, char image, char angle,
char sv, char ev) {
char command[] = {
27, 'I', 'P', no,
27,
'I',
'P',
no,
#if COORD_SIZE == 1
x1, y1,
x1,
y1,
#else
lowByte(x1), highByte(x1), lowByte(y1), highByte(y1),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
#endif
image, angle, sv, ev
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));
}
@ -444,14 +388,12 @@ void EDIPTFT::setTextSize(int xsize, int ysize){
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) {
void EDIPTFT::drawText(uint16_t x1, uint16_t y1, char justification,
const char* text) {
// nicht const 17//
byte len = strlen(text);
byte i;
@ -470,14 +412,13 @@ void EDIPTFT::drawText(uint16_t x1, uint16_t y1, char justification, const char*
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,111 +427,179 @@ 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',
27,
'G',
'D',
#if COORD_SIZE == 1
x1, y1, x2, y2
x1,
y1,
x2,
y2
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2)
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',
27,
'G',
'R',
#if COORD_SIZE == 1
x1, y1, x2, y2
x1,
y1,
x2,
y2
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2)
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',
27,
'R',
'F',
#if COORD_SIZE == 1
x1, y1, x2, y2,
x1,
y1,
x2,
y2,
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2),
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.print(x1);
Serial.print(", ");
Serial.print(y1);
Serial.print(", ");
Serial.print(x2);
Serial.print(", ");
Serial.println(y2);
char command[] = {
27, 'R', 'L',
27,
'R',
'L',
#if COORD_SIZE == 1
x1, y1, x2, y2
x1,
y1,
x2,
y2
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2),
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
byte len = strlen(text);
byte i;
char helper[len + 6 + 4 * COORD_SIZE]; // len+13 17
char command[] = {
27, 'A', 'T',
27,
'A',
'T',
#if COORD_SIZE == 1
x1, y1, x2, y2,
x1,
y1,
x2,
y2,
#else
lowByte(x1), highByte(x1), lowByte(y1), highByte(y1),
lowByte(x2), highByte(x2), lowByte(y2), highByte(y2),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
lowByte(x2),
highByte(x2),
lowByte(y2),
highByte(y2),
#endif
down, up
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
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',
27,
'A',
'K',
#if COORD_SIZE == 1
x1, y1, x2, y2,
x1,
y1,
x2,
y2,
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
lowByte(x2),
highByte(x2),
lowByte(y2),
highByte(y2),
#endif
down, up
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];
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);
@ -598,135 +607,123 @@ void EDIPTFT::defineTouchSwitch(int x, int y, int img, char downcode,
byte n = 6 + 2 * COORD_SIZE;
char helper[len + n + 1];
char command[] = {
27, 'A', 'J',
27,
'A',
'J',
#if COORD_SIZE == 1
x, y,
x,
y,
#else
lowByte(x), highByte(x), lowByte(y), highByte(y),
lowByte(x),
highByte(x),
lowByte(y),
highByte(y),
#endif
img, downcode, upcode
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
};
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 command[] = {
27, 'A', 'M',
27,
'A',
'M',
#if COORD_SIZE == 1
x1, y1, x2, y2,
x1,
y1,
x2,
y2,
#else
lowByte(x1),highByte(x1),lowByte(y1),highByte(y1),
lowByte(x2),highByte(x2),lowByte(y2),highByte(y2),
lowByte(x1),
highByte(x1),
lowByte(y1),
highByte(y1),
lowByte(x2),
highByte(x2),
lowByte(y2),
highByte(y2),
#endif
downcode, upcode, mnucode
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));
}

View File

@ -208,8 +208,8 @@ class EDIPTFT {
void deleteBargraph(char no, char n1);
// Instrument
void defineInstrument(char no, int x1, int y1, char image,
char angle, char sv, char ev);
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);
@ -266,7 +266,8 @@ class EDIPTFT {
* 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);
void drawTextInRect(int x1, int y1, int x2, int y2, uint8_t align,
const char* text);
// Rectangle and Line
void setLineColor(char fg, char bg);
@ -309,8 +310,8 @@ class EDIPTFT {
* \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);
void defineTouchKey(int x1, int y1, int x2, int y2, char down, char up,
const char* text);
/*! \brief Define touch switch
*
@ -324,8 +325,8 @@ class EDIPTFT {
* \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);
void defineTouchSwitch(int x1, int y1, int x2, int y2, char down, char up,
const char* text);
/*! \brief Define touch switch with image
*
@ -339,8 +340,8 @@ class EDIPTFT {
* \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 defineTouchSwitch(int x, int y, int img, char downcode, char upcode,
const char* text);
/*! \brief Set touch switch
*
@ -352,8 +353,7 @@ class EDIPTFT {
*/
void setTouchSwitch(char code, char value);
void setTouchkeyColors(char n1, char n2, char n3,
char s1, char s2, char s3);
void setTouchkeyColors(char n1, char n2, char n3, char s1, char s2, char s3);
/*! \brief Label font
*
@ -406,21 +406,23 @@ class EDIPTFT {
/*! \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
* 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);
void defineTouchMenu(int x1, int y1, int x2, int y2, char downcode,
char upcode, char mnucode, const char* text);
/*! \brief Send *open* signal after a Menu open request has been sent from TFT.
/*! \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.