mirror of https://github.com/arendst/Tasmota.git
display touch interface unified
This commit is contained in:
parent
0cc8b72879
commit
a7fb362e1c
|
@ -546,7 +546,7 @@ void Arduino_ST7789::DisplayOnff(int8_t on) {
|
||||||
writecommand(ST7789_DISPON); //Display on
|
writecommand(ST7789_DISPON); //Display on
|
||||||
if (_bp>=0) {
|
if (_bp>=0) {
|
||||||
#ifdef ST7789_DIMMER
|
#ifdef ST7789_DIMMER
|
||||||
ledcWrite(ESP32_PWM_CHANNEL,255);
|
ledcWrite(ESP32_PWM_CHANNEL,dimmer);
|
||||||
#else
|
#else
|
||||||
digitalWrite(_bp,HIGH);
|
digitalWrite(_bp,HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
@ -564,7 +564,8 @@ void Arduino_ST7789::DisplayOnff(int8_t on) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// dimmer 0-100
|
// dimmer 0-100
|
||||||
void Arduino_ST7789::dim(uint8_t dimmer) {
|
void Arduino_ST7789::dim(uint8_t dim) {
|
||||||
|
dimmer = dim;
|
||||||
if (dimmer>15) dimmer=15;
|
if (dimmer>15) dimmer=15;
|
||||||
dimmer=((float)dimmer/15.0)*255.0;
|
dimmer=((float)dimmer/15.0)*255.0;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
|
|
|
@ -161,7 +161,7 @@ class Arduino_ST7789 : public Renderer {
|
||||||
boolean _hwSPI;
|
boolean _hwSPI;
|
||||||
boolean _SPI9bit;
|
boolean _SPI9bit;
|
||||||
boolean _DCbit;
|
boolean _DCbit;
|
||||||
|
uint8_t dimmer;
|
||||||
int8_t _cs, _dc, _rst, _sid, _sclk, _bp;
|
int8_t _cs, _dc, _rst, _sid, _sclk, _bp;
|
||||||
|
|
||||||
#if defined(USE_FAST_IO)
|
#if defined(USE_FAST_IO)
|
||||||
|
|
|
@ -41,7 +41,7 @@ int FT5206_Class::begin(TwoWire &port, uint8_t addr)
|
||||||
}
|
}
|
||||||
_readByte(FT5206_CHIPID_REG, 1, &val);
|
_readByte(FT5206_CHIPID_REG, 1, &val);
|
||||||
//Serial.printf("chip id %d\n",val );
|
//Serial.printf("chip id %d\n",val );
|
||||||
if ((val != FT6206_CHIPID) && (val != FT6236_CHIPID) && (val != FT6236U_CHIPID) && (val != FT5206U_CHIPID)) {
|
if ((val != FT6206_CHIPID) && (val != FT6236_CHIPID) && (val != FT6236U_CHIPID) && (val != FT5206U_CHIPID) && (val != FT5316_CHIPID) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_init = true;
|
_init = true;
|
||||||
|
|
|
@ -49,6 +49,8 @@ github:https://github.com/lewisxhe/FT5206_Library
|
||||||
#define FT6236U_CHIPID 0x64
|
#define FT6236U_CHIPID 0x64
|
||||||
#define FT5206U_CHIPID 0x64
|
#define FT5206U_CHIPID 0x64
|
||||||
|
|
||||||
|
#define FT5316_CHIPID 0x0a
|
||||||
|
|
||||||
#define DEVIDE_MODE 0x00
|
#define DEVIDE_MODE 0x00
|
||||||
#define TD_STATUS 0x02
|
#define TD_STATUS 0x02
|
||||||
#define TOUCH1_XH 0x03
|
#define TOUCH1_XH 0x03
|
||||||
|
|
|
@ -519,4 +519,5 @@ void VButton::xdrawButton(bool inverted) {
|
||||||
wr_redir=0;
|
wr_redir=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* END OF FILE */
|
/* END OF FILE */
|
||||||
|
|
|
@ -46,9 +46,23 @@ private:
|
||||||
uint8_t font;
|
uint8_t font;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint8_t data;
|
||||||
|
struct {
|
||||||
|
uint8_t spare0 : 1;
|
||||||
|
uint8_t spare1 : 1;
|
||||||
|
uint8_t spare2 : 1;
|
||||||
|
uint8_t spare3 : 1;
|
||||||
|
uint8_t disable : 1;
|
||||||
|
uint8_t on_off : 1;
|
||||||
|
uint8_t is_pushbutton : 1;
|
||||||
|
uint8_t is_virtual : 1;
|
||||||
|
};
|
||||||
|
} TButton_State;
|
||||||
|
|
||||||
class VButton : public Adafruit_GFX_Button {
|
class VButton : public Adafruit_GFX_Button {
|
||||||
public:
|
public:
|
||||||
uint8_t vpower;
|
TButton_State vpower;
|
||||||
void xdrawButton(bool inverted);
|
void xdrawButton(bool inverted);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -300,12 +300,35 @@ struct T_INDEX {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct M_FILT {
|
struct M_FILT {
|
||||||
|
#ifdef LARGE_ARRAYS
|
||||||
|
uint16_t numvals;
|
||||||
|
uint16_t index;
|
||||||
|
#else
|
||||||
uint8_t numvals;
|
uint8_t numvals;
|
||||||
uint8_t index;
|
uint8_t index;
|
||||||
|
#endif // LARGE_ARRAYS
|
||||||
float maccu;
|
float maccu;
|
||||||
float rbuff[1];
|
float rbuff[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef LARGE_ARRAYS
|
||||||
|
#undef AND_FILT_MASK
|
||||||
|
#undef OR_FILT_MASK
|
||||||
|
#define AND_FILT_MASK 0x7fff
|
||||||
|
#define OR_FILT_MASK 0x8000
|
||||||
|
#undef MAX_ARRAY_SIZE
|
||||||
|
#define MAX_ARRAY_SIZE 1000
|
||||||
|
#else
|
||||||
|
#undef AND_FILT_MASK
|
||||||
|
#undef OR_FILT_MASK
|
||||||
|
#define AND_FILT_MASK 0x7f
|
||||||
|
#define OR_FILT_MASK 0x80
|
||||||
|
#undef MAX_ARRAY_SIZE
|
||||||
|
#define MAX_ARRAY_SIZE 127
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
struct {
|
struct {
|
||||||
|
@ -462,6 +485,8 @@ void RulesTeleperiod(void) {
|
||||||
#define SCRIPT_SKIP_SPACES while (*lp==' ' || *lp=='\t') lp++;
|
#define SCRIPT_SKIP_SPACES while (*lp==' ' || *lp=='\t') lp++;
|
||||||
#define SCRIPT_SKIP_EOL while (*lp==SCRIPT_EOL) lp++;
|
#define SCRIPT_SKIP_EOL while (*lp==SCRIPT_EOL) lp++;
|
||||||
|
|
||||||
|
float *Get_MFAddr(uint8_t index,uint16_t *len,uint16_t *ipos);
|
||||||
|
|
||||||
// allocates all variables and presets them
|
// allocates all variables and presets them
|
||||||
int16_t Init_Scripter(void) {
|
int16_t Init_Scripter(void) {
|
||||||
char *script;
|
char *script;
|
||||||
|
@ -543,12 +568,16 @@ char *script;
|
||||||
if ((*lp=='m' || *lp=='M') && *(lp+1)==':') {
|
if ((*lp=='m' || *lp=='M') && *(lp+1)==':') {
|
||||||
uint8_t flg=*lp;
|
uint8_t flg=*lp;
|
||||||
lp+=2;
|
lp+=2;
|
||||||
|
if (*lp=='p' && *(lp+1)==':') {
|
||||||
|
vtypes[vars].bits.is_permanent=1;
|
||||||
|
lp+=2;
|
||||||
|
}
|
||||||
if (flg=='M') mfilt[numflt].numvals=8;
|
if (flg=='M') mfilt[numflt].numvals=8;
|
||||||
else mfilt[numflt].numvals=5;
|
else mfilt[numflt].numvals=5;
|
||||||
vtypes[vars].bits.is_filter=1;
|
vtypes[vars].bits.is_filter=1;
|
||||||
mfilt[numflt].index=0;
|
mfilt[numflt].index=0;
|
||||||
if (flg=='M') {
|
if (flg=='M') {
|
||||||
mfilt[numflt].numvals|=0x80;
|
mfilt[numflt].numvals|=OR_FILT_MASK;
|
||||||
}
|
}
|
||||||
vtypes[vars].index=numflt;
|
vtypes[vars].index=numflt;
|
||||||
numflt++;
|
numflt++;
|
||||||
|
@ -587,9 +616,13 @@ char *script;
|
||||||
while (*op==' ') op++;
|
while (*op==' ') op++;
|
||||||
if (isdigit(*op)) {
|
if (isdigit(*op)) {
|
||||||
// lenght define follows
|
// lenght define follows
|
||||||
uint8_t flen=atoi(op);
|
uint16_t flen=atoi(op);
|
||||||
mfilt[numflt-1].numvals&=0x80;
|
if (flen>MAX_ARRAY_SIZE) {
|
||||||
mfilt[numflt-1].numvals|=flen&0x7f;
|
// limit array size
|
||||||
|
flen=MAX_ARRAY_SIZE;
|
||||||
|
}
|
||||||
|
mfilt[numflt-1].numvals&=OR_FILT_MASK;
|
||||||
|
mfilt[numflt-1].numvals|=flen&AND_FILT_MASK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,11 +668,11 @@ char *script;
|
||||||
|
|
||||||
uint16_t fsize=0;
|
uint16_t fsize=0;
|
||||||
for (count=0; count<numflt; count++) {
|
for (count=0; count<numflt; count++) {
|
||||||
fsize+=sizeof(struct M_FILT)+((mfilt[count].numvals&0x7f)-1)*sizeof(float);
|
fsize+=sizeof(struct M_FILT)+((mfilt[count].numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
|
|
||||||
// now copy vars to memory
|
// now copy vars to memory
|
||||||
uint16_t script_mem_size=
|
uint32_t script_mem_size=
|
||||||
// number and number shadow vars
|
// number and number shadow vars
|
||||||
(sizeof(float)*nvars)+
|
(sizeof(float)*nvars)+
|
||||||
(sizeof(float)*nvars)+
|
(sizeof(float)*nvars)+
|
||||||
|
@ -733,7 +766,7 @@ char *script;
|
||||||
for (count=0; count<numflt; count++) {
|
for (count=0; count<numflt; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
mflp->numvals=mfilt[count].numvals;
|
mflp->numvals=mfilt[count].numvals;
|
||||||
mp+=sizeof(struct M_FILT)+((mfilt[count].numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mfilt[count].numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
|
|
||||||
glob_script_mem.numvars=vars;
|
glob_script_mem.numvars=vars;
|
||||||
|
@ -760,12 +793,21 @@ char *script;
|
||||||
for (uint8_t count=0; count<glob_script_mem.numvars; count++) {
|
for (uint8_t count=0; count<glob_script_mem.numvars; count++) {
|
||||||
if (vtp[count].bits.is_permanent && !vtp[count].bits.is_string) {
|
if (vtp[count].bits.is_permanent && !vtp[count].bits.is_string) {
|
||||||
uint8_t index=vtp[count].index;
|
uint8_t index=vtp[count].index;
|
||||||
if (!isnan(*fp)) {
|
if (vtp[count].bits.is_filter) {
|
||||||
glob_script_mem.fvars[index]=*fp;
|
// preset array
|
||||||
|
uint16_t len=0;
|
||||||
|
float *fa=Get_MFAddr(index,&len,0);
|
||||||
|
while (len--) {
|
||||||
|
*fa++=*fp++;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
*fp=glob_script_mem.fvars[index];
|
if (!isnan(*fp)) {
|
||||||
|
glob_script_mem.fvars[index]=*fp;
|
||||||
|
} else {
|
||||||
|
*fp=glob_script_mem.fvars[index];
|
||||||
|
}
|
||||||
|
fp++;
|
||||||
}
|
}
|
||||||
fp++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sp=(char*)fp;
|
sp=(char*)fp;
|
||||||
|
@ -947,7 +989,7 @@ void ws2812_set_array(float *array ,uint32_t len, uint32_t offset) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float median_array(float *array,uint8_t len) {
|
float median_array(float *array,uint16_t len) {
|
||||||
uint8_t ind[len];
|
uint8_t ind[len];
|
||||||
uint8_t mind=0,index=0,flg;
|
uint8_t mind=0,index=0,flg;
|
||||||
float min=FLT_MAX;
|
float min=FLT_MAX;
|
||||||
|
@ -975,45 +1017,48 @@ float median_array(float *array,uint8_t len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float *Get_MFAddr(uint8_t index,uint8_t *len,uint8_t *ipos) {
|
float *Get_MFAddr(uint8_t index,uint16_t *len,uint16_t *ipos) {
|
||||||
*len=0;
|
*len=0;
|
||||||
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
||||||
for (uint8_t count=0; count<MAXFILT; count++) {
|
for (uint8_t count=0; count<MAXFILT; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
if (count==index) {
|
if (count==index) {
|
||||||
*len=mflp->numvals&0x7f;
|
*len=mflp->numvals&AND_FILT_MASK;
|
||||||
if (ipos) *ipos=mflp->index;
|
if (ipos) *ipos=mflp->index;
|
||||||
return mflp->rbuff;
|
return mflp->rbuff;
|
||||||
}
|
}
|
||||||
mp+=sizeof(struct M_FILT)+((mflp->numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mflp->numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float Get_MFVal(uint8_t index,uint8_t bind) {
|
float Get_MFVal(uint8_t index,int16_t bind) {
|
||||||
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
||||||
for (uint8_t count=0; count<MAXFILT; count++) {
|
for (uint8_t count=0; count<MAXFILT; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
if (count==index) {
|
if (count==index) {
|
||||||
uint8_t maxind=mflp->numvals&0x7f;
|
uint16_t maxind=mflp->numvals&AND_FILT_MASK;
|
||||||
if (!bind) {
|
if (!bind) {
|
||||||
return mflp->index;
|
return mflp->index;
|
||||||
}
|
}
|
||||||
|
if (bind<0) {
|
||||||
|
return maxind;
|
||||||
|
}
|
||||||
if (bind<1 || bind>maxind) bind=maxind;
|
if (bind<1 || bind>maxind) bind=maxind;
|
||||||
return mflp->rbuff[bind-1];
|
return mflp->rbuff[bind-1];
|
||||||
}
|
}
|
||||||
mp+=sizeof(struct M_FILT)+((mflp->numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mflp->numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Set_MFVal(uint8_t index,uint8_t bind,float val) {
|
void Set_MFVal(uint8_t index,uint16_t bind,float val) {
|
||||||
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
uint8_t *mp=(uint8_t*)glob_script_mem.mfilt;
|
||||||
for (uint8_t count=0; count<MAXFILT; count++) {
|
for (uint8_t count=0; count<MAXFILT; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
if (count==index) {
|
if (count==index) {
|
||||||
uint8_t maxind=mflp->numvals&0x7f;
|
uint16_t maxind=mflp->numvals&AND_FILT_MASK;
|
||||||
if (!bind) {
|
if (!bind) {
|
||||||
mflp->index=val;
|
mflp->index=val;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1022,7 +1067,7 @@ void Set_MFVal(uint8_t index,uint8_t bind,float val) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mp+=sizeof(struct M_FILT)+((mflp->numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mflp->numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1032,15 +1077,15 @@ float Get_MFilter(uint8_t index) {
|
||||||
for (uint8_t count=0; count<MAXFILT; count++) {
|
for (uint8_t count=0; count<MAXFILT; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
if (count==index) {
|
if (count==index) {
|
||||||
if (mflp->numvals&0x80) {
|
if (mflp->numvals&OR_FILT_MASK) {
|
||||||
// moving average
|
// moving average
|
||||||
return mflp->maccu/(mflp->numvals&0x7f);
|
return mflp->maccu/(mflp->numvals&AND_FILT_MASK);
|
||||||
} else {
|
} else {
|
||||||
// median, sort array indices
|
// median, sort array indices
|
||||||
return median_array(mflp->rbuff,mflp->numvals);
|
return median_array(mflp->rbuff,mflp->numvals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mp+=sizeof(struct M_FILT)+((mflp->numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mflp->numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1050,13 +1095,13 @@ void Set_MFilter(uint8_t index, float invar) {
|
||||||
for (uint8_t count=0; count<MAXFILT; count++) {
|
for (uint8_t count=0; count<MAXFILT; count++) {
|
||||||
struct M_FILT *mflp=(struct M_FILT*)mp;
|
struct M_FILT *mflp=(struct M_FILT*)mp;
|
||||||
if (count==index) {
|
if (count==index) {
|
||||||
if (mflp->numvals&0x80) {
|
if (mflp->numvals&OR_FILT_MASK) {
|
||||||
// moving average
|
// moving average
|
||||||
mflp->maccu-=mflp->rbuff[mflp->index];
|
mflp->maccu-=mflp->rbuff[mflp->index];
|
||||||
mflp->maccu+=invar;
|
mflp->maccu+=invar;
|
||||||
mflp->rbuff[mflp->index]=invar;
|
mflp->rbuff[mflp->index]=invar;
|
||||||
mflp->index++;
|
mflp->index++;
|
||||||
if (mflp->index>=(mflp->numvals&0x7f)) mflp->index=0;
|
if (mflp->index>=(mflp->numvals&AND_FILT_MASK)) mflp->index=0;
|
||||||
} else {
|
} else {
|
||||||
// median
|
// median
|
||||||
mflp->rbuff[mflp->index]=invar;
|
mflp->rbuff[mflp->index]=invar;
|
||||||
|
@ -1065,7 +1110,7 @@ void Set_MFilter(uint8_t index, float invar) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mp+=sizeof(struct M_FILT)+((mflp->numvals&0x7f)-1)*sizeof(float);
|
mp+=sizeof(struct M_FILT)+((mflp->numvals&AND_FILT_MASK)-1)*sizeof(float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2140,7 +2185,7 @@ chknext:
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (index>glob_script_mem.si_num) {
|
if (index>glob_script_mem.si_num) {
|
||||||
fvar=glob_script_mem.si_num;
|
index=glob_script_mem.si_num;
|
||||||
}
|
}
|
||||||
strlcpy(str,glob_script_mem.last_index_string+(index*glob_script_mem.max_ssize),glob_script_mem.max_ssize);
|
strlcpy(str,glob_script_mem.last_index_string+(index*glob_script_mem.max_ssize),glob_script_mem.max_ssize);
|
||||||
}
|
}
|
||||||
|
@ -2691,7 +2736,7 @@ chknext:
|
||||||
if (index<1 || index>MAXBUTTONS) index=1;
|
if (index<1 || index>MAXBUTTONS) index=1;
|
||||||
index--;
|
index--;
|
||||||
if (buttons[index]) {
|
if (buttons[index]) {
|
||||||
fvar=buttons[index]->vpower&0x80;
|
fvar=buttons[index]->vpower.on_off;
|
||||||
} else {
|
} else {
|
||||||
fvar=-1;
|
fvar=-1;
|
||||||
}
|
}
|
||||||
|
@ -2807,7 +2852,7 @@ chknext:
|
||||||
#if defined(USE_TTGO_WATCH) && defined(USE_FT5206)
|
#if defined(USE_TTGO_WATCH) && defined(USE_FT5206)
|
||||||
if (!strncmp(vname,"wtch(",5)) {
|
if (!strncmp(vname,"wtch(",5)) {
|
||||||
lp=GetNumericResult(lp+5,OPER_EQU,&fvar,0);
|
lp=GetNumericResult(lp+5,OPER_EQU,&fvar,0);
|
||||||
fvar=FT5206_touched(fvar);
|
fvar=Touch_Status(fvar);
|
||||||
lp++;
|
lp++;
|
||||||
len=0;
|
len=0;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -3430,7 +3475,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
|
||||||
int16_t Run_script_sub(const char *type, int8_t tlen, JsonObject *jo) {
|
int16_t Run_script_sub(const char *type, int8_t tlen, JsonObject *jo) {
|
||||||
uint8_t vtype=0,sindex,xflg,floop=0,globvindex,fromscriptcmd=0;
|
uint8_t vtype=0,sindex,xflg,floop=0,globvindex,fromscriptcmd=0;
|
||||||
char *lp_next;
|
char *lp_next;
|
||||||
int8_t globaindex,saindex;
|
int16_t globaindex,saindex;
|
||||||
struct T_INDEX ind;
|
struct T_INDEX ind;
|
||||||
uint8_t operand,lastop,numeric=1,if_state[IF_NEST],if_exe[IF_NEST],if_result[IF_NEST],and_or,ifstck=0;
|
uint8_t operand,lastop,numeric=1,if_state[IF_NEST],if_exe[IF_NEST],if_result[IF_NEST],and_or,ifstck=0;
|
||||||
if_state[ifstck]=0;
|
if_state[ifstck]=0;
|
||||||
|
@ -3762,7 +3807,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonObject *jo) {
|
||||||
if ((vtype&STYPE)==0) {
|
if ((vtype&STYPE)==0) {
|
||||||
// numeric result
|
// numeric result
|
||||||
if (glob_script_mem.type[ind.index].bits.is_filter) {
|
if (glob_script_mem.type[ind.index].bits.is_filter) {
|
||||||
uint8_t len=0;
|
uint16_t len=0;
|
||||||
float *fa=Get_MFAddr(index,&len,0);
|
float *fa=Get_MFAddr(index,&len,0);
|
||||||
//Serial.printf(">> 2 %d\n",(uint32_t)*fa);
|
//Serial.printf(">> 2 %d\n",(uint32_t)*fa);
|
||||||
if (fa && len) ws2812_set_array(fa,len,fvar);
|
if (fa && len) ws2812_set_array(fa,len,fvar);
|
||||||
|
@ -4175,12 +4220,26 @@ void Scripter_save_pvars(void) {
|
||||||
for (uint8_t count=0; count<glob_script_mem.numvars; count++) {
|
for (uint8_t count=0; count<glob_script_mem.numvars; count++) {
|
||||||
if (vtp[count].bits.is_permanent && !vtp[count].bits.is_string) {
|
if (vtp[count].bits.is_permanent && !vtp[count].bits.is_string) {
|
||||||
uint8_t index=vtp[count].index;
|
uint8_t index=vtp[count].index;
|
||||||
mlen+=sizeof(float);
|
if (vtp[count].bits.is_filter) {
|
||||||
if (mlen>PMEM_SIZE) {
|
// save array
|
||||||
vtp[count].bits.is_permanent=0;
|
uint16_t len=0;
|
||||||
return;
|
float *fa=Get_MFAddr(index,&len,0);
|
||||||
|
mlen+=sizeof(float)*len;
|
||||||
|
if (mlen>glob_script_mem.script_pram_size) {
|
||||||
|
vtp[count].bits.is_permanent=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (len--) {
|
||||||
|
*fp++=*fa++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mlen+=sizeof(float);
|
||||||
|
if (mlen>glob_script_mem.script_pram_size) {
|
||||||
|
vtp[count].bits.is_permanent=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*fp++=glob_script_mem.fvars[index];
|
||||||
}
|
}
|
||||||
*fp++=glob_script_mem.fvars[index];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
char *cp=(char*)fp;
|
char *cp=(char*)fp;
|
||||||
|
@ -4190,7 +4249,7 @@ void Scripter_save_pvars(void) {
|
||||||
char *sp=glob_script_mem.glob_snp+(index*glob_script_mem.max_ssize);
|
char *sp=glob_script_mem.glob_snp+(index*glob_script_mem.max_ssize);
|
||||||
uint8_t slen=strlen(sp);
|
uint8_t slen=strlen(sp);
|
||||||
mlen+=slen+1;
|
mlen+=slen+1;
|
||||||
if (mlen>PMEM_SIZE) {
|
if (mlen>glob_script_mem.script_pram_size) {
|
||||||
vtp[count].bits.is_permanent=0;
|
vtp[count].bits.is_permanent=0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6013,6 +6072,9 @@ const char SCRIPT_MSG_GOPT4[] PROGMEM =
|
||||||
const char SCRIPT_MSG_GOPT5[] PROGMEM =
|
const char SCRIPT_MSG_GOPT5[] PROGMEM =
|
||||||
"new Date(0,1,1,%d,%d)";
|
"new Date(0,1,1,%d,%d)";
|
||||||
|
|
||||||
|
const char SCRIPT_MSG_GOPT6[] PROGMEM =
|
||||||
|
"title:'%s',isStacked:false,vAxis:{viewWindow:{min:%d,max:%d}}%s";
|
||||||
|
|
||||||
const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'";
|
const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'";
|
||||||
|
|
||||||
#define GLIBS_MAIN 1<<0
|
#define GLIBS_MAIN 1<<0
|
||||||
|
@ -6022,11 +6084,11 @@ const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'";
|
||||||
|
|
||||||
#define MAX_GARRAY 4
|
#define MAX_GARRAY 4
|
||||||
|
|
||||||
char *gc_get_arrays(char *lp, float **arrays, uint8_t *ranum, uint8_t *rentries, uint8_t *ipos) {
|
char *gc_get_arrays(char *lp, float **arrays, uint8_t *ranum, uint16_t *rentries, uint16_t *ipos) {
|
||||||
struct T_INDEX ind;
|
struct T_INDEX ind;
|
||||||
uint8_t vtype;
|
uint8_t vtype;
|
||||||
uint8 entries=0;
|
uint16 entries=0;
|
||||||
uint8_t cipos=0;
|
uint16_t cipos=0;
|
||||||
|
|
||||||
uint8_t anum=0;
|
uint8_t anum=0;
|
||||||
while (anum<MAX_GARRAY) {
|
while (anum<MAX_GARRAY) {
|
||||||
|
@ -6042,9 +6104,9 @@ uint8_t cipos=0;
|
||||||
//Serial.printf("numeric %d - %d \n",ind.index,index);
|
//Serial.printf("numeric %d - %d \n",ind.index,index);
|
||||||
if (glob_script_mem.type[ind.index].bits.is_filter) {
|
if (glob_script_mem.type[ind.index].bits.is_filter) {
|
||||||
//Serial.printf("numeric array\n");
|
//Serial.printf("numeric array\n");
|
||||||
uint8_t len=0;
|
uint16_t len=0;
|
||||||
float *fa=Get_MFAddr(index,&len,&cipos);
|
float *fa=Get_MFAddr(index,&len,&cipos);
|
||||||
//Serial.printf(">> 2 %d\n",(uint32_t)*fa);
|
//Serial.printf(">> 2 %d\n",len);
|
||||||
if (fa && len>=entries) {
|
if (fa && len>=entries) {
|
||||||
if (!entries) {
|
if (!entries) {
|
||||||
entries = len;
|
entries = len;
|
||||||
|
@ -6295,12 +6357,12 @@ void ScriptWebShow(char mc) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (mc=='w') {
|
if (mc=='w') {
|
||||||
WSContentSend_PD(PSTR("%s"),tmp);
|
WSContentSend_PD(PSTR("%s"),lin);
|
||||||
} else {
|
} else {
|
||||||
if (optflg) {
|
if (optflg) {
|
||||||
WSContentSend_PD(PSTR("<div>%s</div>"),tmp);
|
WSContentSend_PD(PSTR("<div>%s</div>"),lin);
|
||||||
} else {
|
} else {
|
||||||
WSContentSend_PD(PSTR("{s}%s{e}"),tmp);
|
WSContentSend_PD(PSTR("{s}%s{e}"),lin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6388,8 +6450,8 @@ exgc:
|
||||||
|
|
||||||
float *arrays[MAX_GARRAY];
|
float *arrays[MAX_GARRAY];
|
||||||
uint8_t anum=0;
|
uint8_t anum=0;
|
||||||
uint8 entries=0;
|
uint16_t entries=0;
|
||||||
uint8 ipos=0;
|
uint16_t ipos=0;
|
||||||
lp=gc_get_arrays(lp, &arrays[0], &anum, &entries, &ipos);
|
lp=gc_get_arrays(lp, &arrays[0], &anum, &entries, &ipos);
|
||||||
|
|
||||||
if (anum>nanum) {
|
if (anum>nanum) {
|
||||||
|
@ -6434,10 +6496,19 @@ exgc:
|
||||||
lp=GetStringResult(lp,OPER_EQU,label,0);
|
lp=GetStringResult(lp,OPER_EQU,label,0);
|
||||||
SCRIPT_SKIP_SPACES
|
SCRIPT_SKIP_SPACES
|
||||||
|
|
||||||
int8_t todflg=-1;
|
int16_t divflg=1;
|
||||||
|
int16_t todflg=-1;
|
||||||
if (!strncmp(label,"cnt",3)) {
|
if (!strncmp(label,"cnt",3)) {
|
||||||
todflg=atoi(&label[3]);
|
todflg=atoi(&label[3]);
|
||||||
if (todflg>=entries) todflg=entries-1;
|
if (todflg>=entries) todflg=entries-1;
|
||||||
|
} else {
|
||||||
|
uint16 segments=1;
|
||||||
|
for (uint32_t cnt=0; cnt<strlen(label); cnt++) {
|
||||||
|
if (label[cnt]=='|') {
|
||||||
|
segments++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
divflg=entries/segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t aind=ipos;
|
uint32_t aind=ipos;
|
||||||
|
@ -6452,7 +6523,7 @@ exgc:
|
||||||
todflg=0;
|
todflg=0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GetTextIndexed(lbl, sizeof(lbl), aind, label);
|
GetTextIndexed(lbl, sizeof(lbl), aind/divflg, label);
|
||||||
}
|
}
|
||||||
WSContentSend_PD(lbl);
|
WSContentSend_PD(lbl);
|
||||||
WSContentSend_PD("',");
|
WSContentSend_PD("',");
|
||||||
|
@ -6495,6 +6566,17 @@ exgc:
|
||||||
lp=GetNumericResult(lp,OPER_EQU,&max2,0);
|
lp=GetNumericResult(lp,OPER_EQU,&max2,0);
|
||||||
SCRIPT_SKIP_SPACES
|
SCRIPT_SKIP_SPACES
|
||||||
snprintf_P(options,sizeof(options),SCRIPT_MSG_GOPT3,header,(uint32_t)max1,(uint32_t)max2,func);
|
snprintf_P(options,sizeof(options),SCRIPT_MSG_GOPT3,header,(uint32_t)max1,(uint32_t)max2,func);
|
||||||
|
} else {
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
if (*lp!=')') {
|
||||||
|
float max1;
|
||||||
|
lp=GetNumericResult(lp,OPER_EQU,&max1,0);
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
float max2;
|
||||||
|
lp=GetNumericResult(lp,OPER_EQU,&max2,0);
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
snprintf_P(options,sizeof(options),SCRIPT_MSG_GOPT6,header,(uint32_t)max1,(uint32_t)max2,func);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctype=='g') {
|
if (ctype=='g') {
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#define XDRV_13 13
|
#define XDRV_13 13
|
||||||
|
|
||||||
#include <renderer.h>
|
#include <renderer.h>
|
||||||
#include <FT6236.h>
|
|
||||||
|
|
||||||
Renderer *renderer;
|
Renderer *renderer;
|
||||||
|
|
||||||
|
@ -757,7 +756,28 @@ void DisplayText(void)
|
||||||
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
case 'b':
|
case 'b':
|
||||||
{ int16_t num,gxp,gyp,gxs,gys,outline,fill,textcolor,textsize;
|
{ int16_t num,gxp,gyp,gxs,gys,outline,fill,textcolor,textsize; uint8_t dflg=1;
|
||||||
|
if (*cp=='e' || *cp=='d') {
|
||||||
|
// enable disable
|
||||||
|
uint8_t dis=0;
|
||||||
|
if (*cp=='d') dis=1;
|
||||||
|
cp++;
|
||||||
|
var=atoiv(cp,&num);
|
||||||
|
num=num%MAXBUTTONS;
|
||||||
|
cp+=var;
|
||||||
|
if (buttons[num]) {
|
||||||
|
buttons[num]->vpower.disable=dis;
|
||||||
|
if (!dis) {
|
||||||
|
if (buttons[num]->vpower.is_virtual) buttons[num]->xdrawButton(buttons[num]->vpower.on_off);
|
||||||
|
else buttons[num]->xdrawButton(bitRead(power,num));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*cp=='-') {
|
||||||
|
cp++;
|
||||||
|
dflg=0;
|
||||||
|
}
|
||||||
var=atoiv(cp,&num);
|
var=atoiv(cp,&num);
|
||||||
cp+=var;
|
cp+=var;
|
||||||
cp++;
|
cp++;
|
||||||
|
@ -797,16 +817,23 @@ void DisplayText(void)
|
||||||
if (renderer) {
|
if (renderer) {
|
||||||
buttons[num]= new VButton();
|
buttons[num]= new VButton();
|
||||||
if (buttons[num]) {
|
if (buttons[num]) {
|
||||||
buttons[num]->vpower=bflags;
|
|
||||||
buttons[num]->initButtonUL(renderer,gxp,gyp,gxs,gys,renderer->GetColorFromIndex(outline),\
|
buttons[num]->initButtonUL(renderer,gxp,gyp,gxs,gys,renderer->GetColorFromIndex(outline),\
|
||||||
renderer->GetColorFromIndex(fill),renderer->GetColorFromIndex(textcolor),bbuff,textsize);
|
renderer->GetColorFromIndex(fill),renderer->GetColorFromIndex(textcolor),bbuff,textsize);
|
||||||
if (!bflags) {
|
if (!bflags) {
|
||||||
// power button
|
// power button
|
||||||
buttons[num]->xdrawButton(bitRead(power,num));
|
if (dflg) buttons[num]->xdrawButton(bitRead(power,num));
|
||||||
|
buttons[num]->vpower.is_virtual=0;
|
||||||
} else {
|
} else {
|
||||||
// virtual button
|
// virtual button
|
||||||
buttons[num]->vpower&=0x7f;
|
buttons[num]->vpower.is_virtual=1;
|
||||||
buttons[num]->xdrawButton(buttons[num]->vpower&0x80);
|
if (bflags==2) {
|
||||||
|
// push
|
||||||
|
buttons[num]->vpower.is_pushbutton=1;
|
||||||
|
} else {
|
||||||
|
// toggle
|
||||||
|
buttons[num]->vpower.is_pushbutton=0;
|
||||||
|
}
|
||||||
|
if (dflg) buttons[num]->xdrawButton(buttons[num]->vpower.on_off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2019,7 +2046,146 @@ void AddValue(uint8_t num,float fval) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif // USE_GRAPH
|
||||||
|
|
||||||
|
#ifdef USE_FT5206
|
||||||
|
|
||||||
|
// touch panel controller
|
||||||
|
#undef FT5206_address
|
||||||
|
#define FT5206_address 0x38
|
||||||
|
|
||||||
|
#include <FT5206.h>
|
||||||
|
FT5206_Class *touchp;
|
||||||
|
TP_Point pLoc;
|
||||||
|
|
||||||
|
|
||||||
|
extern VButton *buttons[];
|
||||||
|
bool FT5206_found;
|
||||||
|
|
||||||
|
bool Touch_Init(TwoWire &i2c) {
|
||||||
|
FT5206_found = false;
|
||||||
|
touchp = new FT5206_Class();
|
||||||
|
if (touchp->begin(i2c, FT5206_address)) {
|
||||||
|
I2cSetActiveFound(FT5206_address, "FT5206");
|
||||||
|
FT5206_found = true;
|
||||||
|
}
|
||||||
|
return FT5206_found;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Touch_Status(uint32_t sel) {
|
||||||
|
if (FT5206_found) {
|
||||||
|
switch (sel) {
|
||||||
|
case 0:
|
||||||
|
return touchp->touched();
|
||||||
|
case 1:
|
||||||
|
return pLoc.x;
|
||||||
|
case 2:
|
||||||
|
return pLoc.y;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
|
void Touch_MQTT(uint8_t index, const char *cp) {
|
||||||
|
ResponseTime_P(PSTR(",\"FT5206\":{\"%s%d\":\"%d\"}}"), cp, index+1, buttons[index]->vpower.on_off);
|
||||||
|
MqttPublishTeleSensor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Touch_RDW_BUTT(uint32_t count, uint32_t pwr) {
|
||||||
|
buttons[count]->xdrawButton(pwr);
|
||||||
|
if (pwr) buttons[count]->vpower.on_off = 1;
|
||||||
|
else buttons[count]->vpower.on_off = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check digitizer hit
|
||||||
|
void Touch_Check(void(*rotconvert)(int16_t *x, int16_t *y)) {
|
||||||
|
uint16_t temp;
|
||||||
|
uint8_t rbutt=0;
|
||||||
|
uint8_t vbutt=0;
|
||||||
|
|
||||||
|
|
||||||
|
if (touchp->touched()) {
|
||||||
|
// did find a hit
|
||||||
|
pLoc = touchp->getPoint(0);
|
||||||
|
|
||||||
|
if (renderer) {
|
||||||
|
|
||||||
|
rotconvert(&pLoc.x, &pLoc.y);
|
||||||
|
|
||||||
|
//AddLog_P2(LOG_LEVEL_INFO, PSTR("touch %d - %d"), pLoc.x, pLoc.y);
|
||||||
|
// now must compare with defined buttons
|
||||||
|
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
||||||
|
if (buttons[count] && !buttons[count]->vpower.disable) {
|
||||||
|
if (buttons[count]->contains(pLoc.x, pLoc.y)) {
|
||||||
|
// did hit
|
||||||
|
buttons[count]->press(true);
|
||||||
|
if (buttons[count]->justPressed()) {
|
||||||
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
|
uint8_t pwr=bitRead(power, rbutt);
|
||||||
|
if (!SendKey(KEY_BUTTON, rbutt+1, POWER_TOGGLE)) {
|
||||||
|
ExecuteCommandPower(rbutt+1, POWER_TOGGLE, SRC_BUTTON);
|
||||||
|
Touch_RDW_BUTT(count, !pwr);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// virtual button
|
||||||
|
const char *cp;
|
||||||
|
if (!buttons[count]->vpower.is_pushbutton) {
|
||||||
|
// toggle button
|
||||||
|
buttons[count]->vpower.on_off ^= 1;
|
||||||
|
cp="TBT";
|
||||||
|
} else {
|
||||||
|
// push button
|
||||||
|
buttons[count]->vpower.on_off = 1;
|
||||||
|
cp="PBT";
|
||||||
|
}
|
||||||
|
buttons[count]->xdrawButton(buttons[count]->vpower.on_off);
|
||||||
|
Touch_MQTT(count,cp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
|
rbutt++;
|
||||||
|
} else {
|
||||||
|
vbutt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no hit
|
||||||
|
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
||||||
|
if (buttons[count]) {
|
||||||
|
buttons[count]->press(false);
|
||||||
|
if (buttons[count]->justReleased()) {
|
||||||
|
if (buttons[count]->vpower.is_virtual) {
|
||||||
|
if (buttons[count]->vpower.is_pushbutton) {
|
||||||
|
// push button
|
||||||
|
buttons[count]->vpower.on_off = 0;
|
||||||
|
Touch_MQTT(count,"PBT");
|
||||||
|
buttons[count]->xdrawButton(buttons[count]->vpower.on_off);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
|
// check if power button stage changed
|
||||||
|
uint8_t pwr = bitRead(power, rbutt);
|
||||||
|
uint8_t vpwr = buttons[count]->vpower.on_off;
|
||||||
|
if (pwr != vpwr) {
|
||||||
|
Touch_RDW_BUTT(count, pwr);
|
||||||
|
}
|
||||||
|
rbutt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pLoc.x = 0;
|
||||||
|
pLoc.y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // USE_TOUCH_BUTTONS
|
||||||
|
#endif // USE_FT5206
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
|
|
|
@ -27,18 +27,12 @@
|
||||||
#define COLORED 1
|
#define COLORED 1
|
||||||
#define UNCOLORED 0
|
#define UNCOLORED 0
|
||||||
|
|
||||||
// touch panel controller
|
|
||||||
#define FT6236_address 0x38
|
|
||||||
|
|
||||||
// using font 8 is opional (num=3)
|
// using font 8 is opional (num=3)
|
||||||
// very badly readable, but may be useful for graphs
|
// very badly readable, but may be useful for graphs
|
||||||
#define USE_TINY_FONT
|
#define USE_TINY_FONT
|
||||||
|
|
||||||
|
|
||||||
#include <ILI9488.h>
|
#include <ILI9488.h>
|
||||||
#include <FT6236.h>
|
|
||||||
|
|
||||||
TouchLocation ili9488_pLoc;
|
|
||||||
uint8_t ili9488_ctouch_counter = 0;
|
uint8_t ili9488_ctouch_counter = 0;
|
||||||
|
|
||||||
// currently fixed
|
// currently fixed
|
||||||
|
@ -47,13 +41,7 @@ uint8_t ili9488_ctouch_counter = 0;
|
||||||
extern uint8_t *buffer;
|
extern uint8_t *buffer;
|
||||||
extern uint8_t color_type;
|
extern uint8_t color_type;
|
||||||
ILI9488 *ili9488;
|
ILI9488 *ili9488;
|
||||||
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
|
||||||
extern VButton *buttons[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern const uint16_t picture[];
|
extern const uint16_t picture[];
|
||||||
uint8_t FT6236_found;
|
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
@ -126,30 +114,52 @@ void ILI9488_InitDriver()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
color_type = COLOR_COLOR;
|
color_type = COLOR_COLOR;
|
||||||
// start digitizer with fixed adress
|
// start digitizer
|
||||||
|
#ifdef USE_FT5206
|
||||||
if (I2cEnabled(XI2C_38) && I2cSetDevice(FT6236_address)) {
|
Touch_Init(Wire);
|
||||||
FT6236begin(FT6236_address);
|
#endif
|
||||||
FT6236_found=1;
|
|
||||||
I2cSetActiveFound(FT6236_address, "FT6236");
|
|
||||||
} else {
|
|
||||||
FT6236_found=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_FT5206
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
void ILI9488_MQTT(uint8_t count,const char *cp) {
|
|
||||||
ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7);
|
void ILI9488_RotConvert(int16_t *x, int16_t *y) {
|
||||||
MqttPublishTeleSensor();
|
int16_t temp;
|
||||||
|
if (renderer) {
|
||||||
|
uint8_t rot=renderer->getRotation();
|
||||||
|
switch (rot) {
|
||||||
|
case 0:
|
||||||
|
temp=*y;
|
||||||
|
*y=renderer->height()-*x;
|
||||||
|
*x=temp;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
temp=*y;
|
||||||
|
*y=*x;
|
||||||
|
*x=renderer->width()-temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ILI9488_RDW_BUTT(uint32_t count,uint32_t pwr) {
|
// check digitizer hit
|
||||||
buttons[count]->xdrawButton(pwr);
|
void ILI9488_CheckTouch(void) {
|
||||||
if (pwr) buttons[count]->vpower|=0x80;
|
ili9488_ctouch_counter++;
|
||||||
else buttons[count]->vpower&=0x7f;
|
if (2 == ili9488_ctouch_counter) {
|
||||||
|
// every 100 ms should be enough
|
||||||
|
ili9488_ctouch_counter = 0;
|
||||||
|
Touch_Check(ILI9488_RotConvert);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif // USE_TOUCH_BUTTONS
|
||||||
|
#endif // USE_FT5206
|
||||||
|
|
||||||
|
/*
|
||||||
// check digitizer hit
|
// check digitizer hit
|
||||||
void FT6236Check() {
|
void FT6236Check() {
|
||||||
uint16_t temp;
|
uint16_t temp;
|
||||||
|
@ -181,12 +191,11 @@ if (2 == ili9488_ctouch_counter) {
|
||||||
// now must compare with defined buttons
|
// now must compare with defined buttons
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
||||||
if (buttons[count]) {
|
if (buttons[count]) {
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
if (buttons[count]->contains(ili9488_pLoc.x,ili9488_pLoc.y)) {
|
if (buttons[count]->contains(ili9488_pLoc.x,ili9488_pLoc.y)) {
|
||||||
// did hit
|
// did hit
|
||||||
buttons[count]->press(true);
|
buttons[count]->press(true);
|
||||||
if (buttons[count]->justPressed()) {
|
if (buttons[count]->justPressed()) {
|
||||||
if (!bflags) {
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
uint8_t pwr=bitRead(power,rbutt);
|
||||||
if (!SendKey(KEY_BUTTON, rbutt+1, POWER_TOGGLE)) {
|
if (!SendKey(KEY_BUTTON, rbutt+1, POWER_TOGGLE)) {
|
||||||
ExecuteCommandPower(rbutt+1, POWER_TOGGLE, SRC_BUTTON);
|
ExecuteCommandPower(rbutt+1, POWER_TOGGLE, SRC_BUTTON);
|
||||||
|
@ -195,21 +204,21 @@ if (2 == ili9488_ctouch_counter) {
|
||||||
} else {
|
} else {
|
||||||
// virtual button
|
// virtual button
|
||||||
const char *cp;
|
const char *cp;
|
||||||
if (bflags==1) {
|
if (!buttons[count]->vpower.is_pushbutton) {
|
||||||
// toggle button
|
// toggle button
|
||||||
buttons[count]->vpower^=0x80;
|
buttons[count]->vpower.on_off^=1;
|
||||||
cp="TBT";
|
cp="TBT";
|
||||||
} else {
|
} else {
|
||||||
// push button
|
// push button
|
||||||
buttons[count]->vpower|=0x80;
|
buttons[count]->vpower.on_off=1;
|
||||||
cp="PBT";
|
cp="PBT";
|
||||||
}
|
}
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
buttons[count]->xdrawButton(buttons[count]->vpower.on_off);
|
||||||
ILI9488_MQTT(count,cp);
|
ILI9488_MQTT(count,cp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!bflags) {
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
rbutt++;
|
rbutt++;
|
||||||
} else {
|
} else {
|
||||||
vbutt++;
|
vbutt++;
|
||||||
|
@ -221,23 +230,21 @@ if (2 == ili9488_ctouch_counter) {
|
||||||
// no hit
|
// no hit
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
||||||
if (buttons[count]) {
|
if (buttons[count]) {
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
buttons[count]->press(false);
|
buttons[count]->press(false);
|
||||||
if (buttons[count]->justReleased()) {
|
if (buttons[count]->justReleased()) {
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
if (buttons[count]->vpower.is_virtual) {
|
||||||
if (bflags>0) {
|
if (buttons[count]->vpower.is_pushbutton) {
|
||||||
if (bflags>1) {
|
|
||||||
// push button
|
// push button
|
||||||
buttons[count]->vpower&=0x7f;
|
buttons[count]->vpower.on_off=0;
|
||||||
ILI9488_MQTT(count,"PBT");
|
ILI9488_MQTT(count,"PBT");
|
||||||
}
|
}
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
buttons[count]->xdrawButton(buttons[count]->vpower.on_off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!bflags) {
|
if (!buttons[count]->vpower.is_virtual) {
|
||||||
// check if power button stage changed
|
// check if power button stage changed
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
uint8_t pwr=bitRead(power,rbutt);
|
||||||
uint8_t vpwr=(buttons[count]->vpower&0x80)>>7;
|
uint8_t vpwr=buttons[count]->vpower.on_off;
|
||||||
if (pwr!=vpwr) {
|
if (pwr!=vpwr) {
|
||||||
ILI9488_RDW_BUTT(count,pwr);
|
ILI9488_RDW_BUTT(count,pwr);
|
||||||
}
|
}
|
||||||
|
@ -251,6 +258,8 @@ if (2 == ili9488_ctouch_counter) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // USE_TOUCH_BUTTONS
|
#endif // USE_TOUCH_BUTTONS
|
||||||
|
*/
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
|
@ -270,7 +279,9 @@ bool Xdsp08(uint8_t function)
|
||||||
break;
|
break;
|
||||||
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
if (FT6236_found) FT6236Check();
|
if (FT5206_found) {
|
||||||
|
ILI9488_CheckTouch();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,29 +27,17 @@
|
||||||
#define COLORED 1
|
#define COLORED 1
|
||||||
#define UNCOLORED 0
|
#define UNCOLORED 0
|
||||||
|
|
||||||
// touch panel controller
|
|
||||||
#define FT5316_address 0x38
|
|
||||||
|
|
||||||
// using font 8 is opional (num=3)
|
// using font 8 is opional (num=3)
|
||||||
// very badly readable, but may be useful for graphs
|
// very badly readable, but may be useful for graphs
|
||||||
#define USE_TINY_FONT
|
#define USE_TINY_FONT
|
||||||
|
|
||||||
#include <RA8876.h>
|
#include <RA8876.h>
|
||||||
#include <FT6236.h>
|
|
||||||
|
|
||||||
TouchLocation ra8876_pLoc;
|
|
||||||
uint8_t ra8876_ctouch_counter = 0;
|
uint8_t ra8876_ctouch_counter = 0;
|
||||||
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
|
||||||
extern VButton *buttons[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern uint8_t *buffer;
|
extern uint8_t *buffer;
|
||||||
extern uint8_t color_type;
|
extern uint8_t color_type;
|
||||||
RA8876 *ra8876;
|
RA8876 *ra8876;
|
||||||
|
|
||||||
uint8_t FT5316_found;
|
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
void RA8876_InitDriver()
|
void RA8876_InitDriver()
|
||||||
{
|
{
|
||||||
|
@ -114,147 +102,41 @@ void RA8876_InitDriver()
|
||||||
#endif
|
#endif
|
||||||
color_type = COLOR_COLOR;
|
color_type = COLOR_COLOR;
|
||||||
|
|
||||||
if (I2cEnabled(XI2C_39) && I2cSetDevice(FT5316_address)) {
|
#ifdef USE_FT5206
|
||||||
FT6236begin(FT5316_address);
|
Touch_Init(Wire);
|
||||||
FT5316_found=1;
|
#endif
|
||||||
I2cSetActiveFound(FT5316_address, "FT5316");
|
|
||||||
} else {
|
|
||||||
FT5316_found=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
|
||||||
void RA8876_MQTT(uint8_t count,const char *cp) {
|
|
||||||
ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7);
|
|
||||||
MqttPublishTeleSensor();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RA8876_RDW_BUTT(uint32_t count,uint32_t pwr) {
|
#ifdef USE_FT5206
|
||||||
buttons[count]->xdrawButton(pwr);
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
if (pwr) buttons[count]->vpower|=0x80;
|
|
||||||
else buttons[count]->vpower&=0x7f;
|
// no rotation support
|
||||||
|
void RA8876_RotConvert(int16_t *x, int16_t *y) {
|
||||||
|
int16_t temp;
|
||||||
|
if (renderer) {
|
||||||
|
*x=*x*renderer->width()/800;
|
||||||
|
*y=*y*renderer->height()/480;
|
||||||
|
|
||||||
|
*x = renderer->width() - *x;
|
||||||
|
*y = renderer->height() - *y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check digitizer hit
|
// check digitizer hit
|
||||||
void FT5316Check() {
|
void RA8876_CheckTouch(void) {
|
||||||
uint16_t temp;
|
ra8876_ctouch_counter++;
|
||||||
uint8_t rbutt=0,vbutt=0;
|
if (2 == ra8876_ctouch_counter) {
|
||||||
ra8876_ctouch_counter++;
|
// every 100 ms should be enough
|
||||||
if (2 == ra8876_ctouch_counter) {
|
ra8876_ctouch_counter = 0;
|
||||||
// every 100 ms should be enough
|
Touch_Check(RA8876_RotConvert);
|
||||||
ra8876_ctouch_counter=0;
|
|
||||||
// panel has 800x480
|
|
||||||
if (FT6236readTouchLocation(&ra8876_pLoc,1)) {
|
|
||||||
ra8876_pLoc.x=ra8876_pLoc.x*RA8876_TFTWIDTH/800;
|
|
||||||
ra8876_pLoc.y=ra8876_pLoc.y*RA8876_TFTHEIGHT/480;
|
|
||||||
// did find a hit
|
|
||||||
|
|
||||||
if (renderer) {
|
|
||||||
|
|
||||||
// rotation not supported
|
|
||||||
ra8876_pLoc.x=RA8876_TFTWIDTH-ra8876_pLoc.x;
|
|
||||||
ra8876_pLoc.y=RA8876_TFTHEIGHT-ra8876_pLoc.y;
|
|
||||||
|
|
||||||
/*
|
|
||||||
uint8_t rot=renderer->getRotation();
|
|
||||||
switch (rot) {
|
|
||||||
case 0:
|
|
||||||
//temp=pLoc.y;
|
|
||||||
pLoc.x=renderer->width()-pLoc.x;
|
|
||||||
pLoc.y=renderer->height()-pLoc.y;
|
|
||||||
//pLoc.x=temp;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
temp=pLoc.y;
|
|
||||||
pLoc.y=pLoc.x;
|
|
||||||
pLoc.x=renderer->width()-temp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
//AddLog_P2(LOG_LEVEL_INFO, PSTR(">> %d,%d"),ra8876_pLoc.x,ra8876_pLoc.y);
|
|
||||||
|
|
||||||
|
|
||||||
//Serial.printf("loc x: %d , loc y: %d\n",pLoc.x,pLoc.y);
|
|
||||||
|
|
||||||
// now must compare with defined buttons
|
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
|
||||||
if (buttons[count]) {
|
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
if (buttons[count]->contains(ra8876_pLoc.x,ra8876_pLoc.y)) {
|
|
||||||
// did hit
|
|
||||||
buttons[count]->press(true);
|
|
||||||
if (buttons[count]->justPressed()) {
|
|
||||||
if (!bflags) {
|
|
||||||
// real button
|
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
|
||||||
if (!SendKey(KEY_BUTTON, rbutt+1, POWER_TOGGLE)) {
|
|
||||||
ExecuteCommandPower(rbutt+1, POWER_TOGGLE, SRC_BUTTON);
|
|
||||||
RA8876_RDW_BUTT(count,!pwr);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// virtual button
|
|
||||||
const char *cp;
|
|
||||||
if (bflags==1) {
|
|
||||||
// toggle button
|
|
||||||
buttons[count]->vpower^=0x80;
|
|
||||||
cp="TBT";
|
|
||||||
} else {
|
|
||||||
// push button
|
|
||||||
buttons[count]->vpower|=0x80;
|
|
||||||
cp="PBT";
|
|
||||||
}
|
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
|
||||||
RA8876_MQTT(count,cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!bflags) {
|
|
||||||
rbutt++;
|
|
||||||
} else {
|
|
||||||
vbutt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// no hit
|
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
|
||||||
if (buttons[count]) {
|
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
buttons[count]->press(false);
|
|
||||||
if (buttons[count]->justReleased()) {
|
|
||||||
if (bflags>0) {
|
|
||||||
if (bflags>1) {
|
|
||||||
// push button
|
|
||||||
buttons[count]->vpower&=0x7f;
|
|
||||||
RA8876_MQTT(count,"PBT");
|
|
||||||
}
|
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!bflags) {
|
|
||||||
// check if power button stage changed
|
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
|
||||||
uint8_t vpwr=(buttons[count]->vpower&0x80)>>7;
|
|
||||||
if (pwr!=vpwr) {
|
|
||||||
RA8876_RDW_BUTT(count,pwr);
|
|
||||||
}
|
|
||||||
rbutt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ra8876_pLoc.x=0;
|
|
||||||
ra8876_pLoc.y=0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
#endif // USE_TOUCH_BUTTONS
|
||||||
#endif // USE_TOUCH_BUTTONS
|
#endif // USE_FT5206
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void testall() {
|
void testall() {
|
||||||
ra8876->clearScreen(0);
|
ra8876->clearScreen(0);
|
||||||
|
@ -452,8 +334,8 @@ bool Xdsp10(uint8_t function)
|
||||||
result = true;
|
result = true;
|
||||||
break;
|
break;
|
||||||
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_FT5206
|
||||||
if (FT5316_found) FT5316Check();
|
if (FT5206_found) RA8876_CheckTouch();
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//#ifdef USE_SPI
|
||||||
#ifdef USE_SPI
|
#ifdef USE_SPI
|
||||||
#ifdef USE_DISPLAY
|
#ifdef USE_DISPLAY
|
||||||
#ifdef USE_DISPLAY_ST7789
|
#ifdef USE_DISPLAY_ST7789
|
||||||
|
@ -50,12 +51,6 @@ extern uint8_t color_type;
|
||||||
Arduino_ST7789 *st7789;
|
Arduino_ST7789 *st7789;
|
||||||
|
|
||||||
#ifdef USE_FT5206
|
#ifdef USE_FT5206
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
|
||||||
extern VButton *buttons[];
|
|
||||||
#endif
|
|
||||||
FT5206_Class *touchp;
|
|
||||||
uint8_t FT5206_found;
|
|
||||||
TP_Point st7789_pLoc;
|
|
||||||
uint8_t st7789_ctouch_counter = 0;
|
uint8_t st7789_ctouch_counter = 0;
|
||||||
#endif // USE_FT5206
|
#endif // USE_FT5206
|
||||||
|
|
||||||
|
@ -142,155 +137,51 @@ void ST7789_InitDriver()
|
||||||
#define SDA_2 23
|
#define SDA_2 23
|
||||||
#define SCL_2 32
|
#define SCL_2 32
|
||||||
Wire1.begin(SDA_2, SCL_2, 400000);
|
Wire1.begin(SDA_2, SCL_2, 400000);
|
||||||
touchp = new FT5206_Class();
|
Touch_Init(Wire1);
|
||||||
if (touchp->begin(Wire1, FT5206_address)) {
|
|
||||||
FT5206_found=1;
|
|
||||||
//I2cSetDevice(FT5206_address);
|
|
||||||
I2cSetActiveFound(FT5206_address, "FT5206");
|
|
||||||
} else {
|
|
||||||
FT5206_found=0;
|
|
||||||
}
|
|
||||||
#endif // USE_FT5206
|
#endif // USE_FT5206
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
#ifdef USE_FT5206
|
#ifdef USE_FT5206
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
void ST7789_MQTT(uint8_t count,const char *cp) {
|
|
||||||
ResponseTime_P(PSTR(",\"ST7789\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7);
|
|
||||||
MqttPublishTeleSensor();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t FT5206_touched(uint32_t sel) {
|
void ST7789_RotConvert(int16_t *x, int16_t *y) {
|
||||||
if (touchp) {
|
int16_t temp;
|
||||||
switch (sel) {
|
if (renderer) {
|
||||||
|
uint8_t rot=renderer->getRotation();
|
||||||
|
switch (rot) {
|
||||||
case 0:
|
case 0:
|
||||||
return touchp->touched();
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
return st7789_pLoc.x;
|
temp=*y;
|
||||||
|
*y=renderer->height()-*x;
|
||||||
|
*x=temp;
|
||||||
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
return st7789_pLoc.y;
|
*x=renderer->width()-*x;
|
||||||
|
*y=renderer->height()-*y;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
temp=*y;
|
||||||
|
*y=*x;
|
||||||
|
*x=renderer->width()-temp;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ST7789_RDW_BUTT(uint32_t count,uint32_t pwr) {
|
|
||||||
buttons[count]->xdrawButton(pwr);
|
|
||||||
if (pwr) buttons[count]->vpower|=0x80;
|
|
||||||
else buttons[count]->vpower&=0x7f;
|
|
||||||
}
|
|
||||||
// check digitizer hit
|
// check digitizer hit
|
||||||
void FT5206Check() {
|
void ST7789_CheckTouch() {
|
||||||
uint16_t temp;
|
|
||||||
uint8_t rbutt=0,vbutt=0;
|
|
||||||
st7789_ctouch_counter++;
|
st7789_ctouch_counter++;
|
||||||
if (2 == st7789_ctouch_counter) {
|
if (2 == st7789_ctouch_counter) {
|
||||||
// every 100 ms should be enough
|
// every 100 ms should be enough
|
||||||
st7789_ctouch_counter=0;
|
st7789_ctouch_counter = 0;
|
||||||
|
Touch_Check(ST7789_RotConvert);
|
||||||
if (touchp->touched()) {
|
|
||||||
// did find a hit
|
|
||||||
st7789_pLoc = touchp->getPoint(0);
|
|
||||||
if (renderer) {
|
|
||||||
uint8_t rot=renderer->getRotation();
|
|
||||||
switch (rot) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
temp=st7789_pLoc.y;
|
|
||||||
st7789_pLoc.y=renderer->height()-st7789_pLoc.x;
|
|
||||||
st7789_pLoc.x=temp;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
st7789_pLoc.x=renderer->width()-st7789_pLoc.x;
|
|
||||||
st7789_pLoc.y=renderer->height()-st7789_pLoc.y;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
temp=st7789_pLoc.y;
|
|
||||||
st7789_pLoc.y=st7789_pLoc.x;
|
|
||||||
st7789_pLoc.x=renderer->width()-temp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//AddLog_P2(LOG_LEVEL_INFO, PSTR("touch %d - %d"), st7789_pLoc.x, st7789_pLoc.y);
|
|
||||||
// now must compare with defined buttons
|
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
|
||||||
if (buttons[count]) {
|
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
if (buttons[count]->contains(st7789_pLoc.x,st7789_pLoc.y)) {
|
|
||||||
// did hit
|
|
||||||
buttons[count]->press(true);
|
|
||||||
if (buttons[count]->justPressed()) {
|
|
||||||
if (!bflags) {
|
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
|
||||||
if (!SendKey(KEY_BUTTON, rbutt+1, POWER_TOGGLE)) {
|
|
||||||
ExecuteCommandPower(rbutt+1, POWER_TOGGLE, SRC_BUTTON);
|
|
||||||
ST7789_RDW_BUTT(count,!pwr);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// virtual button
|
|
||||||
const char *cp;
|
|
||||||
if (bflags==1) {
|
|
||||||
// toggle button
|
|
||||||
buttons[count]->vpower^=0x80;
|
|
||||||
cp="TBT";
|
|
||||||
} else {
|
|
||||||
// push button
|
|
||||||
buttons[count]->vpower|=0x80;
|
|
||||||
cp="PBT";
|
|
||||||
}
|
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
|
||||||
ST7789_MQTT(count,cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!bflags) {
|
|
||||||
rbutt++;
|
|
||||||
} else {
|
|
||||||
vbutt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// no hit
|
|
||||||
for (uint8_t count=0; count<MAXBUTTONS; count++) {
|
|
||||||
if (buttons[count]) {
|
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
buttons[count]->press(false);
|
|
||||||
if (buttons[count]->justReleased()) {
|
|
||||||
uint8_t bflags=buttons[count]->vpower&0x7f;
|
|
||||||
if (bflags>0) {
|
|
||||||
if (bflags>1) {
|
|
||||||
// push button
|
|
||||||
buttons[count]->vpower&=0x7f;
|
|
||||||
ST7789_MQTT(count,"PBT");
|
|
||||||
}
|
|
||||||
buttons[count]->xdrawButton(buttons[count]->vpower&0x80);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!bflags) {
|
|
||||||
// check if power button stage changed
|
|
||||||
uint8_t pwr=bitRead(power,rbutt);
|
|
||||||
uint8_t vpwr=(buttons[count]->vpower&0x80)>>7;
|
|
||||||
if (pwr!=vpwr) {
|
|
||||||
ST7789_RDW_BUTT(count,pwr);
|
|
||||||
}
|
|
||||||
rbutt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
st7789_pLoc.x=0;
|
|
||||||
st7789_pLoc.y=0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif // USE_TOUCH_BUTTONS
|
#endif // USE_TOUCH_BUTTONS
|
||||||
#endif // USE_FT5206
|
#endif // USE_FT5206
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
@ -317,7 +208,7 @@ bool Xdsp12(uint8_t function)
|
||||||
#ifdef USE_FT5206
|
#ifdef USE_FT5206
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
if (FT5206_found) {
|
if (FT5206_found) {
|
||||||
FT5206Check();
|
ST7789_CheckTouch();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif // USE_FT5206
|
#endif // USE_FT5206
|
||||||
|
|
Loading…
Reference in New Issue