mirror of https://github.com/arendst/Tasmota.git
Merge pull request #14876 from gemu2015/scripter_fix
fix break, add spi
This commit is contained in:
commit
04fa5f99ec
|
@ -373,6 +373,17 @@ struct GVARS {
|
||||||
int16_t strind;
|
int16_t strind;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_SPI
|
||||||
|
struct SCRIPT_SPI {
|
||||||
|
int8_t sclk;
|
||||||
|
int8_t mosi;
|
||||||
|
int8_t miso;
|
||||||
|
int8_t cs[4];
|
||||||
|
SPIClass *spip;
|
||||||
|
SPISettings settings;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define NUM_RES 0xfe
|
#define NUM_RES 0xfe
|
||||||
#define STR_RES 0xfd
|
#define STR_RES 0xfd
|
||||||
|
@ -454,6 +465,10 @@ struct SCRIPT_MEM {
|
||||||
#endif
|
#endif
|
||||||
float retval;
|
float retval;
|
||||||
char *retstr;
|
char *retstr;
|
||||||
|
#ifdef USE_SCRIPT_SPI
|
||||||
|
struct SCRIPT_SPI spi;
|
||||||
|
#endif
|
||||||
|
|
||||||
} glob_script_mem;
|
} glob_script_mem;
|
||||||
|
|
||||||
|
|
||||||
|
@ -4005,6 +4020,96 @@ extern char *SML_GetSVal(uint32_t index);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
#endif //USE_SCRIPT_SERIAL
|
#endif //USE_SCRIPT_SERIAL
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_SPI
|
||||||
|
if (!strncmp(lp, "spi(", 4)) {
|
||||||
|
lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0);
|
||||||
|
uint8_t sel = fvar;
|
||||||
|
uint8_t index;
|
||||||
|
switch (sel) {
|
||||||
|
case 0:
|
||||||
|
// set bus pins
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
glob_script_mem.spi.sclk = fvar;
|
||||||
|
|
||||||
|
if (glob_script_mem.spi.sclk < 0) {
|
||||||
|
// attach to existing Tasmota SPI
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
fvar *= 1000000;
|
||||||
|
glob_script_mem.spi.settings = SPISettings(fvar, MSBFIRST, SPI_MODE0);
|
||||||
|
|
||||||
|
if (TasmotaGlobal.spi_enabled) {
|
||||||
|
#ifdef EPS8266
|
||||||
|
SPI.begin();
|
||||||
|
glob_script_mem.spi.spip = &SPI;
|
||||||
|
#endif // EPS8266
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
if (glob_script_mem.spi.sclk == -1) {
|
||||||
|
SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1);
|
||||||
|
glob_script_mem.spi.spip = &SPI;
|
||||||
|
} else {
|
||||||
|
glob_script_mem.spi.spip = new SPIClass(HSPI);
|
||||||
|
glob_script_mem.spi.spip->begin(Pin(GPIO_SPI_CLK, 1), Pin(GPIO_SPI_MISO, 1), Pin(GPIO_SPI_MOSI, 1), -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ESP32
|
||||||
|
} else {
|
||||||
|
AddLog(LOG_LEVEL_INFO, PSTR("error: spi pins not defined"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pinMode(glob_script_mem.spi.sclk , OUTPUT);
|
||||||
|
digitalWrite(glob_script_mem.spi.sclk , 0);
|
||||||
|
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
glob_script_mem.spi.mosi = fvar;
|
||||||
|
if (glob_script_mem.spi.mosi >= 0) {
|
||||||
|
pinMode(glob_script_mem.spi.mosi , OUTPUT);
|
||||||
|
digitalWrite(glob_script_mem.spi.mosi , 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
glob_script_mem.spi.miso = fvar;
|
||||||
|
if (glob_script_mem.spi.miso >= 0) {
|
||||||
|
pinMode(glob_script_mem.spi.miso , INPUT_PULLUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Is_gpio_used(glob_script_mem.spi.mosi) || Is_gpio_used(glob_script_mem.spi.miso)
|
||||||
|
|| Is_gpio_used(glob_script_mem.spi.sclk) ) {
|
||||||
|
AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
// set cs
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
index = fvar;
|
||||||
|
index &= 3;
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
glob_script_mem.spi.cs[index] = fvar;
|
||||||
|
pinMode(glob_script_mem.spi.cs[index] , OUTPUT);
|
||||||
|
digitalWrite(glob_script_mem.spi.cs[index] , 1);
|
||||||
|
if (Is_gpio_used(glob_script_mem.spi.cs[index])) {
|
||||||
|
AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
// transfer bytes
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
uint8_t index = fvar;
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
uint32_t val = fvar;
|
||||||
|
lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0);
|
||||||
|
script_sspi_trans(index & 3, val, fvar);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = 0;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
#endif // USE_SCRIPT_SPI
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
|
@ -5402,7 +5507,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) {
|
||||||
} else {
|
} else {
|
||||||
glob_script_mem.retstr = 0;
|
glob_script_mem.retstr = 0;
|
||||||
}
|
}
|
||||||
section = 0;
|
section = 99;
|
||||||
goto next_line;
|
goto next_line;
|
||||||
} else if (!strncmp(lp, "break", 5)) {
|
} else if (!strncmp(lp, "break", 5)) {
|
||||||
lp += 5;
|
lp += 5;
|
||||||
|
@ -5413,7 +5518,8 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) {
|
||||||
}
|
}
|
||||||
floop = 0;
|
floop = 0;
|
||||||
} else {
|
} else {
|
||||||
section = 0;
|
section = 99;
|
||||||
|
// leave immediately
|
||||||
}
|
}
|
||||||
goto next_line;
|
goto next_line;
|
||||||
} else if (!strncmp(lp, "dp", 2) && isdigit(*(lp + 2))) {
|
} else if (!strncmp(lp, "dp", 2) && isdigit(*(lp + 2))) {
|
||||||
|
@ -5973,6 +6079,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) {
|
||||||
}
|
}
|
||||||
// next line
|
// next line
|
||||||
next_line:
|
next_line:
|
||||||
|
if (section == 99) return 0;
|
||||||
if (*lp==SCRIPT_EOL) {
|
if (*lp==SCRIPT_EOL) {
|
||||||
lp++;
|
lp++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -5990,6 +6097,55 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_SPI
|
||||||
|
// transfer 1-3 bytes
|
||||||
|
uint32_t script_sspi_trans(uint32_t cs_index, uint32_t val, uint32_t size) {
|
||||||
|
uint32_t out = 0;
|
||||||
|
|
||||||
|
digitalWrite(glob_script_mem.spi.cs[cs_index], 0);
|
||||||
|
|
||||||
|
if (glob_script_mem.spi.sclk < 0) {
|
||||||
|
// use existing hardware spi
|
||||||
|
glob_script_mem.spi.spip->beginTransaction(glob_script_mem.spi.settings);
|
||||||
|
if (size == 1) {
|
||||||
|
out = glob_script_mem.spi.spip->transfer(val);
|
||||||
|
}
|
||||||
|
if (size == 2) {
|
||||||
|
out = glob_script_mem.spi.spip->transfer16(val);
|
||||||
|
}
|
||||||
|
if (size == 3) {
|
||||||
|
out = glob_script_mem.spi.spip->transfer(val >> 16);
|
||||||
|
out <<= 16;
|
||||||
|
out |= glob_script_mem.spi.spip->transfer16(val);
|
||||||
|
}
|
||||||
|
//SPI.transferBytes();
|
||||||
|
glob_script_mem.spi.spip->endTransaction();
|
||||||
|
digitalWrite(glob_script_mem.spi.cs[cs_index], 1);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < 1 || size > 3) size = 1;
|
||||||
|
uint32_t bit = 1 << ((size * 8) - 1);
|
||||||
|
while (bit) {
|
||||||
|
digitalWrite(glob_script_mem.spi.sclk, 0);
|
||||||
|
if (glob_script_mem.spi.mosi >= 0) {
|
||||||
|
if (val & bit) digitalWrite(glob_script_mem.spi.mosi, 1);
|
||||||
|
else digitalWrite(glob_script_mem.spi.mosi, 0);
|
||||||
|
}
|
||||||
|
digitalWrite(glob_script_mem.spi.sclk, 1);
|
||||||
|
if (glob_script_mem.spi.miso >= 0) {
|
||||||
|
if (digitalRead(glob_script_mem.spi.miso)) {
|
||||||
|
out |= bit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bit >>= 1;
|
||||||
|
}
|
||||||
|
digitalWrite(glob_script_mem.spi.cs[cs_index], 1);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
#endif // USE_SCRIPT_SPI
|
||||||
|
|
||||||
#ifdef USE_SCRIPT_SERIAL
|
#ifdef USE_SCRIPT_SERIAL
|
||||||
bool Script_Close_Serial() {
|
bool Script_Close_Serial() {
|
||||||
if (glob_script_mem.sp) {
|
if (glob_script_mem.sp) {
|
||||||
|
@ -6004,7 +6160,7 @@ bool Script_Close_Serial() {
|
||||||
#endif //USE_SCRIPT_SERIAL
|
#endif //USE_SCRIPT_SERIAL
|
||||||
|
|
||||||
bool Is_gpio_used(uint8_t gpiopin) {
|
bool Is_gpio_used(uint8_t gpiopin) {
|
||||||
if ((gpiopin < nitems(TasmotaGlobal.gpio_pin)) && (TasmotaGlobal.gpio_pin[gpiopin] > 0)) {
|
if (gpiopin >= 0 && (gpiopin < nitems(TasmotaGlobal.gpio_pin)) && (TasmotaGlobal.gpio_pin[gpiopin] > 0)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue