scriptsize cmd (#21139)

This commit is contained in:
gemu 2024-04-11 15:36:27 +02:00 committed by GitHub
parent e98ce29fea
commit d5ee89677b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -366,11 +366,14 @@ enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD,SCRIPT_EVENT_HANDLED,SML_JSON_ENABLE,S
#ifdef USE_UFILESYS #ifdef USE_UFILESYS
extern uint8_t ufs_type; extern uint8_t ufs_type;
extern FS *ufsp; extern FS *ufsp;
extern FS *ffsp;
#ifndef UFSYS_SIZE #ifndef UFSYS_SIZE
#define UFSYS_SIZE 8192 #define UFSYS_SIZE 8192
#endif #endif
#define SSIZE_PSTORE (uint16_t *) (glob_script_mem.script_pram + glob_script_mem.script_pram_size - 2)
#define FAT_SCRIPT_NAME "/script.txt" #define FAT_SCRIPT_NAME "/script.txt"
#endif // USE_UFILESYS #endif // USE_UFILESYS
@ -717,6 +720,8 @@ typedef struct {
uint8_t tasm_cmd_activ = 0; uint8_t tasm_cmd_activ = 0;
uint16_t ufs_script_size;
} SCRIPT_MEM; } SCRIPT_MEM;
SCRIPT_MEM glob_script_mem; SCRIPT_MEM glob_script_mem;
@ -1603,6 +1608,24 @@ TS_FLOAT *Get_MFAddr(uint8_t index, uint16_t *len, uint16_t *ipos) {
return 0; return 0;
} }
#ifdef USE_UFILESYS
FS *script_file_path(char *path) {
if (!strncmp_P(path, PSTR("/ffs/"), 5)) {
memmove(path, path + 4, strlen(path) + 1);
return ffsp;
}
if (!strncmp_P(path, PSTR("/sdfs/"), 6)) {
memmove(path, path + 5, strlen(path) + 1);
return ufsp;
}
if (path[0] != '/') {
memmove(path + 1, path, strlen(path) + 1);
path[0] = '/';
}
return ufsp;
}
#endif
char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char *sp, struct GVARS *gv); char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char *sp, struct GVARS *gv);
char *get_array_by_name(char *lp, TS_FLOAT **fp, uint16_t *alen, uint16_t *ipos); char *get_array_by_name(char *lp, TS_FLOAT **fp, uint16_t *alen, uint16_t *ipos);
@ -3413,6 +3436,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
if (!strncmp_XP(lp, XPSTR("fo("), 3)) { if (!strncmp_XP(lp, XPSTR("fo("), 3)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); lp = GetStringArgument(lp + 3, OPER_EQU, str, 0);
FS *cfp = script_file_path(str);
while (*lp == ' ') lp++; while (*lp == ' ') lp++;
uint8_t mode = 0; uint8_t mode = 0;
if ((*lp == 'r') || (*lp == 'w') || (*lp == 'a')) { if ((*lp == 'r') || (*lp == 'w') || (*lp == 'a')) {
@ -3439,7 +3463,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
#ifdef DEBUG_FS #ifdef DEBUG_FS
AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for read %d"), cnt); AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for read %d"), cnt);
#endif #endif
glob_script_mem.files[cnt] = ufsp->open(str, FS_FILE_READ); glob_script_mem.files[cnt] = cfp->open(str, FS_FILE_READ);
if (glob_script_mem.files[cnt].isDirectory()) { if (glob_script_mem.files[cnt].isDirectory()) {
glob_script_mem.files[cnt].rewindDirectory(); glob_script_mem.files[cnt].rewindDirectory();
glob_script_mem.file_flags[cnt].is_dir = 1; glob_script_mem.file_flags[cnt].is_dir = 1;
@ -3449,12 +3473,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
} }
else { else {
if (mode == 1) { if (mode == 1) {
glob_script_mem.files[cnt] = ufsp->open(str,FS_FILE_WRITE); glob_script_mem.files[cnt] = cfp->open(str,FS_FILE_WRITE);
#ifdef DEBUG_FS #ifdef DEBUG_FS
AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for write %d"), cnt); AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for write %d"), cnt);
#endif #endif
} else { } else {
glob_script_mem.files[cnt] = ufsp->open(str,FS_FILE_APPEND); glob_script_mem.files[cnt] = cfp->open(str,FS_FILE_APPEND);
#ifdef DEBUG_FS #ifdef DEBUG_FS
AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for append %d"), cnt); AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for append %d"), cnt);
#endif #endif
@ -3660,7 +3684,8 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
if (!strncmp_XP(lp, XPSTR("fd("), 3)) { if (!strncmp_XP(lp, XPSTR("fd("), 3)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); lp = GetStringArgument(lp + 3, OPER_EQU, str, 0);
ufsp->remove(str); FS *cfp = script_file_path(str);
cfp->remove(str);
goto nfuncexit; goto nfuncexit;
} }
#ifdef USE_UFILESYS #ifdef USE_UFILESYS
@ -3728,7 +3753,8 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
if (!strncmp_XP(lp, XPSTR("fmd("), 4)) { if (!strncmp_XP(lp, XPSTR("fmd("), 4)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); lp = GetStringArgument(lp + 4, OPER_EQU, str, 0);
fvar = ufsp->mkdir(str); FS *cfp = script_file_path(str);
fvar = cfp->mkdir(str);
goto nfuncexit; goto nfuncexit;
} }
if (!strncmp_XP(lp, XPSTR("fmt("), 4)) { if (!strncmp_XP(lp, XPSTR("fmt("), 4)) {
@ -3743,13 +3769,15 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
if (!strncmp_XP(lp, XPSTR("frd("), 4)) { if (!strncmp_XP(lp, XPSTR("frd("), 4)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); lp = GetStringArgument(lp + 4, OPER_EQU, str, 0);
fvar = ufsp->rmdir(str); FS *cfp = script_file_path(str);
fvar = cfp->rmdir(str);
goto nfuncexit; goto nfuncexit;
} }
if (!strncmp_XP(lp, XPSTR("fx("), 3)) { if (!strncmp_XP(lp, XPSTR("fx("), 3)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); lp = GetStringArgument(lp + 3, OPER_EQU, str, 0);
if (ufsp->exists(str)) fvar = 1; FS *cfp = script_file_path(str);
if (cfp->exists(str)) fvar = 1;
else fvar = 0; else fvar = 0;
goto nfuncexit; goto nfuncexit;
} }
@ -3768,8 +3796,8 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
char fn_to[SCRIPT_MAX_SBSIZE]; char fn_to[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp, OPER_EQU, fn_to, 0); lp = GetStringArgument(lp, OPER_EQU, fn_to, 0);
SCRIPT_SKIP_SPACES SCRIPT_SKIP_SPACES
FS *cfp = script_file_path(fn_from);
fvar = ufsp->rename(fn_from, fn_to); fvar = cfp->rename(fn_from, fn_to);
goto nfuncexit; goto nfuncexit;
} }
@ -4521,14 +4549,40 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
uint8_t selector = fvar; uint8_t selector = fvar;
switch (selector) { switch (selector) {
case 0: case 0:
// start streaming {
char url[SCRIPT_MAX_SBSIZE]; // start streaming
lp = GetStringArgument(lp, OPER_EQU, url, 0); char url[SCRIPT_MAX_SBSIZE];
TS_FLOAT xp, yp, scale ; lp = GetStringArgument(lp, OPER_EQU, url, 0);
lp = GetNumericArgument(lp, OPER_EQU, &xp, 0); TS_FLOAT xp, yp, scale ;
lp = GetNumericArgument(lp, OPER_EQU, &yp, 0); lp = GetNumericArgument(lp, OPER_EQU, &xp, 0);
lp = GetNumericArgument(lp, OPER_EQU, &scale, 0); lp = GetNumericArgument(lp, OPER_EQU, &yp, 0);
fvar = fetch_jpg(0, url, xp, yp, scale); lp = GetNumericArgument(lp, OPER_EQU, &scale, 0);
fvar = fetch_jpg(0, url, xp, yp, scale);
}
break;
case 1:
{
char file[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp, OPER_EQU, file, 0);
File fp;
FS *cfp = script_file_path(file);
fp = cfp->open(file, FS_FILE_READ);
if (fp) {
uint32_t size = fp.size();
uint8_t *mem = (uint8_t *)special_malloc(size);
if (mem) {
uint8_t res = fp.read(mem, size);
uint16_t xsize;
uint16_t ysize;
get_jpeg_size(mem, size, &xsize, &ysize);
xsize &= 0x7ff;
ysize &= 0x7ff;
fvar = (xsize << 11) | ysize;
free(mem);
fp.close();
}
}
}
break; break;
default: default:
// other cmds // other cmds
@ -5899,13 +5953,14 @@ extern char *SML_GetSVal(uint32_t index);
#endif //USE_TOUCH_BUTTONS #endif //USE_TOUCH_BUTTONS
#endif //USE_DISPLAY #endif //USE_DISPLAY
uint32_t directRead(uint32_t pin);
void directWriteLow(uint32_t pin);
void directWriteHigh(uint32_t pin);
void directModeInput(uint32_t pin);
void directModeOutput(uint32_t pin);
#if 0 #if 0
/*
uint32_t tmod_directRead(uint32_t pin);
void tmod_directWriteLow(uint32_t pin);
void tmod_directWriteHigh(uint32_t pin);
void tmod_directModeInput(uint32_t pin);
void tmod_directModeOutput(uint32_t pin);
*/
if (!strncmp_XP(lp, XPSTR("test("), 5)) { if (!strncmp_XP(lp, XPSTR("test("), 5)) {
lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv);
uint32_t sel = fvar; uint32_t sel = fvar;
@ -5914,19 +5969,19 @@ void directModeOutput(uint32_t pin);
switch (sel) { switch (sel) {
case 0: case 0:
fvar = directRead(pin); fvar = tmod_directRead(pin);
break; break;
case 1: case 1:
directWriteLow(pin); tmod_directWriteLow(pin);
break; break;
case 2: case 2:
directWriteHigh(pin); tmod_directWriteHigh(pin);
break; break;
case 3: case 3:
directModeInput(pin); tmod_directModeInput(pin);
break; break;
case 4: case 4:
directModeOutput(pin); tmod_directModeOutput(pin);
break; break;
} }
@ -8765,7 +8820,7 @@ void Scripter_save_pvars(void) {
uint16_t len = 0; uint16_t len = 0;
TS_FLOAT *fa = Get_MFAddr(index, &len, 0); TS_FLOAT *fa = Get_MFAddr(index, &len, 0);
mlen += sizeof(TS_FLOAT) * len; mlen += sizeof(TS_FLOAT) * len;
if (mlen>glob_script_mem.script_pram_size) { if (mlen > glob_script_mem.script_pram_size) {
vtp[count].bits.is_permanent = 0; vtp[count].bits.is_permanent = 0;
return; return;
} }
@ -8774,7 +8829,7 @@ void Scripter_save_pvars(void) {
} }
} else { } else {
mlen += sizeof(TS_FLOAT); mlen += sizeof(TS_FLOAT);
if (mlen>glob_script_mem.script_pram_size) { if (mlen > glob_script_mem.script_pram_size) {
vtp[count].bits.is_permanent = 0; vtp[count].bits.is_permanent = 0;
return; return;
} }
@ -8789,7 +8844,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>glob_script_mem.script_pram_size) { if (mlen > glob_script_mem.script_pram_size) {
vtp[count].bits.is_permanent = 0; vtp[count].bits.is_permanent = 0;
return; return;
} }
@ -9934,14 +9989,18 @@ void execute_script(char *script) {
#define D_CMND_SCRIPT "Script" #define D_CMND_SCRIPT "Script"
#define D_CMND_SUBSCRIBE "Subscribe" #define D_CMND_SUBSCRIBE "Subscribe"
#define D_CMND_UNSUBSCRIBE "Unsubscribe" #define D_CMND_UNSUBSCRIBE "Unsubscribe"
#define D_CMND_BUFFERSIZE "ScriptSize"
enum ScriptCommands { CMND_SCRIPT,CMND_SUBSCRIBE, CMND_UNSUBSCRIBE, CMND_BSIZE, CMND_SUBTEST};
enum ScriptCommands { CMND_SCRIPT,CMND_SUBSCRIBE, CMND_UNSUBSCRIBE, CMND_SUBTEST};
const char kScriptCommands[] PROGMEM = D_CMND_SCRIPT "|" D_CMND_SUBSCRIBE "|" D_CMND_UNSUBSCRIBE const char kScriptCommands[] PROGMEM = D_CMND_SCRIPT "|" D_CMND_SUBSCRIBE "|" D_CMND_UNSUBSCRIBE
#ifdef USE_UFILESYS
"|" D_CMND_BUFFERSIZE
#endif
#ifdef DEBUG_MQTT_EVENT #ifdef DEBUG_MQTT_EVENT
"|" "SUBTEST" "|" "SUBTEST"
#endif #endif
; ;
bool ScriptCommand(void) { bool ScriptCommand(void) {
char command[CMDSZ]; char command[CMDSZ];
bool serviced = true; bool serviced = true;
@ -10045,7 +10104,20 @@ bool ScriptCommand(void) {
serviced = true; serviced = true;
#endif #endif
#endif //SUPPORT_MQTT_EVENT #endif //SUPPORT_MQTT_EVENT
} #ifdef USE_UFILESYS
#ifndef NO_SCRIPT_VARBSIZE
} else if (CMND_BSIZE == command_code) {
// set script buffer size
if (XdrvMailbox.payload >= 1000) {
*SSIZE_PSTORE = XdrvMailbox.payload;
TasmotaGlobal.restart_flag = 2;
}
Response_P(PSTR("{\"script buffer\":%d}"), *SSIZE_PSTORE);
serviced = true;
#endif
#endif
}
return serviced; return serviced;
} }
@ -11019,7 +11091,7 @@ char *gc_get_arrays(char *lp, TS_FLOAT **arrays, uint8_t *ranum, uint16_t *rentr
char *gc_get_arrays(char *lp, TS_FLOAT **arrays, uint8_t *ranum, uint16_t *rentries, uint16_t *ipos) { char *gc_get_arrays(char *lp, TS_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;
uint16 entries = 0; uint16_t entries = 0;
uint16_t cipos = 0; uint16_t cipos = 0;
uint8_t anum = 0; uint8_t anum = 0;
@ -12037,7 +12109,7 @@ exgc:
todflg = -2; todflg = -2;
lp += 4; lp += 4;
} }
uint16 segments = 1; uint16_t segments = 1;
for (uint32_t cnt = 0; cnt < strlen(lp); cnt++) { for (uint32_t cnt = 0; cnt < strlen(lp); cnt++) {
if (lp[cnt] == '|') { if (lp[cnt] == '|') {
segments++; segments++;
@ -13291,20 +13363,35 @@ bool Xdrv10(uint32_t function) {
#ifdef USE_UFILESYS #ifdef USE_UFILESYS
if (ufs_type) { if (ufs_type) {
#ifndef NO_SCRIPT_VARBSIZE
glob_script_mem.script_pram = (uint8_t*)Settings->rules[0];
glob_script_mem.script_pram_size = MAX_SCRIPT_SIZE;
uint16_t sbsize = *SSIZE_PSTORE;
if (sbsize > UFSYS_SIZE) {
sbsize = UFSYS_SIZE;
}
if (sbsize < 1000) {
sbsize = UFSYS_SIZE;
}
glob_script_mem.ufs_script_size = sbsize;
#else
glob_script_mem.ufs_script_size = UFSYS_SIZE;
#endif
// we have a file system // we have a file system
AddLog(LOG_LEVEL_INFO,PSTR("SCR: ufilesystem found")); AddLog(LOG_LEVEL_INFO,PSTR("SCR: ufilesystem found"));
char *script; char *script;
script = (char*)special_malloc(UFSYS_SIZE + 4); script = (char*)special_malloc(glob_script_mem.ufs_script_size + 4);
if (!script) break; if (!script) break;
memset(script, 0, UFSYS_SIZE); memset(script, 0, glob_script_mem.ufs_script_size);
glob_script_mem.script_ram = script; glob_script_mem.script_ram = script;
glob_script_mem.script_size = UFSYS_SIZE; glob_script_mem.script_size = glob_script_mem.ufs_script_size;
if (ufsp->exists(FAT_SCRIPT_NAME)) { if (ufsp->exists(FAT_SCRIPT_NAME)) {
File file = ufsp->open(FAT_SCRIPT_NAME, FS_FILE_READ); File file = ufsp->open(FAT_SCRIPT_NAME, FS_FILE_READ);
file.read((uint8_t*)script, UFSYS_SIZE); file.read((uint8_t*)script, glob_script_mem.ufs_script_size);
file.close(); file.close();
} }
script[UFSYS_SIZE - 1] = 0; script[glob_script_mem.ufs_script_size - 1] = 0;
// use rules storage for permanent vars // use rules storage for permanent vars
glob_script_mem.script_pram = (uint8_t*)Settings->rules[0]; glob_script_mem.script_pram = (uint8_t*)Settings->rules[0];
glob_script_mem.script_pram_size = MAX_SCRIPT_SIZE; glob_script_mem.script_pram_size = MAX_SCRIPT_SIZE;