Redesign GPIO to 16-bit

This commit is contained in:
Theo Arends 2020-09-29 14:08:48 +02:00
parent 46cbe13e9b
commit 805f93cfab
6 changed files with 117 additions and 77 deletions

View File

@ -1142,6 +1142,27 @@ void TemplateConvert(uint8_t template8[], uint16_t template16[]) {
template16[i] = GpioConvert(template8[i]);
}
template16[(sizeof(mytmplt) / 2) -2] = Adc0Convert(template8[sizeof(mytmplt8285) -1]);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("FNC: TemplateConvert"));
AddLogBuffer(LOG_LEVEL_DEBUG, template8, sizeof(mytmplt8285));
AddLogBufferSize(LOG_LEVEL_DEBUG, (uint8_t*)template16, sizeof(mytmplt) / 2, 2);
}
void ConvertGpios(void) {
if (Settings.user_template8.flag != 255) {
// Convert 8-bit user template
TemplateConvert((uint8_t*)&Settings.user_template8, (uint16_t*)&Settings.user_template);
Settings.user_template8.flag = 255;
for (uint32_t i = 0; i < sizeof(Settings.my_gp8.io); i++) {
Settings.my_gp.io[i] = GpioConvert(Settings.my_gp8.io[i]);
}
Settings.my_gp.io[(sizeof(myio) / 2) -1] = Adc0Convert(Settings.my_adc0);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("FNC: ConvertGpios"));
AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&Settings.my_gp8.io, sizeof(myio8));
AddLogBufferSize(LOG_LEVEL_DEBUG, (uint8_t *)&Settings.my_gp.io, sizeof(myio) / 2, 2);
}
}
#endif // ESP8266
@ -1247,28 +1268,29 @@ void GetInternalTemplate(void* ptr, uint32_t module, uint32_t option) {
memcpy_P(&template8, &kModules8285[module_template - TMP_WEMOS], sizeof(template8));
}
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&template8, sizeof(mytmplt));
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&template8, sizeof(mytmplt8285));
// template16 = GPIO 0,1,2,3,4,5,9,10,12,13,14,15,16,Adc,Flg
uint16_t template16[(sizeof(mytmplt) / 2)] = { GPIO_NONE };
TemplateConvert(template8, template16);
uint32_t index = 0;
uint32_t size = sizeof(mycfgio); // template16[module_template].gp
uint32_t size = sizeof(mycfgio); // template16[module_template].gp
switch (option) {
case 2: {
index = sizeof(template16) -2; // template16[module_template].flag
index = (sizeof(mytmplt) / 2) -1; // template16[module_template].flag
size = 2;
break;
}
case 3: {
size = sizeof(template16); // template16[module_template]
size = sizeof(mytmplt); // template16[module_template]
break;
}
}
memcpy(ptr, &template16[index], size);
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)ptr, size);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("FNC: GetInternalTemplate option %d"), option);
AddLogBufferSize(LOG_LEVEL_DEBUG, (uint8_t *)ptr, size / 2, 2);
}
#endif // ESP8266
@ -1356,7 +1378,7 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio)
// if (!is_8285 && !Settings.flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's
if ((WEMOS == Settings.module) && !Settings.flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's
if ((pin == 9) || (pin == 10)) {
if ((9 == pin) || (10 == pin)) {
return GPIO_NONE; // Disable possible flash GPIO9 and GPIO10
}
}
@ -1366,6 +1388,11 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio)
bool ValidGPIO(uint32_t pin, uint32_t gpio)
{
#ifdef ESP8266
#ifdef USE_ADC_VCC
if (17 == pin) { return false; } // ADC0 = GPIO17
#endif
#endif
return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins
}
@ -1465,6 +1492,9 @@ bool JsonTemplate(const char* dataBuf)
if (obj[D_JSON_GPIO].success()) {
#ifdef ESP8266
if (!obj[D_JSON_GPIO][13].success()) { // Old template
AddLog_P(LOG_LEVEL_DEBUG, PSTR("TPL: Converting template ..."));
uint8_t template8[sizeof(mytmplt8285)] = { GPIO_NONE };
for (uint32_t i = 0; i < ARRAY_SIZE(template8) -1; i++) {
template8[i] = obj[D_JSON_GPIO][i] | 0;

View File

@ -90,16 +90,14 @@ void ButtonInit(void)
Button.present++;
pinMode(Pin(GPIO_KEY1, i), bitRead(Button.no_pullup_mask, i) ? INPUT : ((16 == Pin(GPIO_KEY1, i)) ? INPUT_PULLDOWN_16 : INPUT_PULLUP));
}
/*
#ifdef ESP8266
#ifndef USE_ADC_VCC
else if ((99 == Button.adc) && ((ADC0_BUTTON == my_adc0) || (ADC0_BUTTON_INV == my_adc0))) {
else if ((99 == Button.adc) && AdcButtonPresent(0)) {
Button.present++;
Button.adc = i;
}
#endif // USE_ADC_VCC
#endif // ESP8266
*/
}
}
@ -169,14 +167,7 @@ void ButtonHandler(void)
#ifndef USE_ADC_VCC
if (Button.adc == button_index) {
button_present = 1;
/*
if (ADC0_BUTTON_INV == my_adc0) {
button = (AdcRead(1) < 128);
}
else if (ADC0_BUTTON == my_adc0) {
button = (AdcRead(1) > 128);
}
*/
button = AdcGetButton(0);
}
#endif // USE_ADC_VCC
#else // ESP32

View File

@ -1477,11 +1477,7 @@ void GpioInit(void)
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DBG: Used GPIOs %d"), GPIO_SENSOR_END);
#ifdef ESP8266
if (Settings.user_template8.flag != 255) {
// Convert 8-bit user template
TemplateConvert((uint8_t*)&Settings.user_template8, (uint16_t*)&Settings.user_template);
Settings.user_template8.flag = 255;
}
ConvertGpios();
#endif // ESP8266
for (uint32_t i = 0; i < ARRAY_SIZE(Settings.user_template.gp.io); i++) {

View File

@ -596,19 +596,6 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_ETH_PHY_MDC),
AGPIO(GPIO_ETH_PHY_MDIO), // Ethernet
#endif
#endif // ESP32
#ifdef USE_ADC
#ifdef ESP8266
AGPIO(GPIO_ADC_INPUT), // Analog inputs
AGPIO(GPIO_ADC_TEMP), // Thermistor
AGPIO(GPIO_ADC_LIGHT), // Light sensor
AGPIO(GPIO_ADC_BUTTON), // Button
AGPIO(GPIO_ADC_BUTTON_INV),
AGPIO(GPIO_ADC_RANGE), // Range
AGPIO(GPIO_ADC_CT_POWER), // Current
AGPIO(GPIO_ADC_JOY), // Joystick
#else // ESP32
AGPIO(GPIO_ADC_INPUT) + MAX_ADCS, // Analog inputs
AGPIO(GPIO_ADC_TEMP) + MAX_ADCS, // Thermistor
AGPIO(GPIO_ADC_LIGHT) + MAX_ADCS, // Light sensor
@ -617,10 +604,23 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_ADC_RANGE) + MAX_ADCS, // Range
AGPIO(GPIO_ADC_CT_POWER) + MAX_ADCS, // Current
AGPIO(GPIO_ADC_JOY) + MAX_ADCS, // Joystick
#endif // ESP8266 or ESP32
#endif // USE_ADC
#endif // ESP32
};
#ifdef ESP8266
const uint16_t kAdcNiceList[] PROGMEM = {
GPIO_NONE, // Not used
AGPIO(GPIO_ADC_INPUT), // Analog inputs
AGPIO(GPIO_ADC_TEMP), // Thermistor
AGPIO(GPIO_ADC_LIGHT), // Light sensor
AGPIO(GPIO_ADC_BUTTON), // Button
AGPIO(GPIO_ADC_BUTTON_INV),
AGPIO(GPIO_ADC_RANGE), // Range
AGPIO(GPIO_ADC_CT_POWER), // Current
AGPIO(GPIO_ADC_JOY), // Joystick
};
#endif // ESP8266
/*********************************************************************************************\
* ATTENTION: No user changeable features beyond this point - do not add templates !!!
\*********************************************************************************************/

View File

@ -486,13 +486,14 @@ const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM =
"if(8==i){j=12;}"
"sk(g[i],j);" // Set GPIO
"j++;"
"}"
"g=o.shift();"; // FLAG
"}";
// "g=o.shift();"; // FLAG
const char HTTP_SCRIPT_TEMPLATE3[] PROGMEM =
"\";"
"sk(g&15," STR(ADC0_PIN) ");" // Set ADC0
"g>>=4;";
"sk(g[13]," STR(ADC0_PIN) ");"; // Set ADC0
// "g>>=4;";
const char HTTP_SCRIPT_TEMPLATE4[] PROGMEM =
"g=o.shift();" // FLAG
"for(i=0;i<" STR(GPIO_FLAG_USED) ";i++){"
"p=(g>>i)&1;"
"eb('c'+i).checked=p;" // Set FLAG checkboxes
@ -1760,16 +1761,19 @@ void HandleTemplateConfiguration(void)
WSContentSend_P(HTTP_SCRIPT_TEMPLATE2);
//#ifdef ESP8266
// WSContentSend_P(PSTR("os=\""));
// for (uint32_t i = 0; i < ADC0_END; i++) { // FLAG: }2'0'>None (0)}3}2'17'>Analog (17)}3...
// if (1 == i) {
// WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE, ADC0_USER, D_SENSOR_USER, ADC0_USER); // }2'15'>User (15)}3
// }
#ifdef ESP8266
WSContentSend_P(PSTR("os=\""));
for (uint32_t i = 0; i < ARRAY_SIZE(kAdcNiceList); i++) { // FLAG: }2'0'>None}3}2'17'>Analog}3...
if (1 == i) {
WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, AGPIO(GPIO_USER), D_SENSOR_USER); // }2'15'>User}3
}
// WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE, i, GetTextIndexed(stemp, sizeof(stemp), i, kAdc0Names), i);
// }
// WSContentSend_P(HTTP_SCRIPT_TEMPLATE3);
//#endif // ESP8266
uint32_t ridx = pgm_read_word(kAdcNiceList + i) & 0xFFE0;
uint32_t midx = BGPIO(ridx);
WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, ridx, GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames));
}
WSContentSend_P(HTTP_SCRIPT_TEMPLATE3);
#endif // ESP8266
WSContentSend_P(HTTP_SCRIPT_TEMPLATE4);
for (uint32_t i = 0; i < sizeof(kModuleNiceList); i++) { // "}2'%d'>%s (%d)}3" - "}2'0'>Sonoff Basic (1)}3"
@ -1797,15 +1801,15 @@ void HandleTemplateConfiguration(void)
// ((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? " style='width:200px'" : "", i);
//#else // ESP32
#ifdef ESP8266
WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>%s%d</font></b></td><td%s><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT),
(17==i) ? PSTR(D_ADC) : PSTR(D_GPIO), (17==i) ? 0 : i,
(0==i) ? " style='width:150px'" : "", i, i);
#else // ESP32
//#ifdef ESP8266
// WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>%s%d</font></b></td><td%s><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
// ((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT),
// (17==i) ? PSTR(D_ADC) : PSTR(D_GPIO), (17==i) ? 0 : i,
// (0==i) ? " style='width:150px'" : "", i, i);
//#else // ESP32
WSContentSend_P(PSTR("<tr><td><b><font color='#%06x'>" D_GPIO "%d</font></b></td><td%s><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? " style='width:150px'" : "", i, i);
#endif // ESP8266
//#endif // ESP8266
WSContentSend_P(PSTR("<td style='width:50px'><select id='h%d'></select></td></tr>"), i);
}
}
@ -1864,7 +1868,7 @@ void TemplateSaveSettings(void)
//#endif // ESP32
for (uint32_t i = 0; i < GPIO_FLAG_USED; i++) {
snprintf_P(webindex, sizeof(webindex), PSTR("c%d"), i);
uint32_t state = Webserver->hasArg(webindex) << i +4; // FLAG
uint32_t state = Webserver->hasArg(webindex) << i; // FLAG
flag += state;
}
WebGetArg("g99", tmp, sizeof(tmp)); // BASE
@ -1950,15 +1954,23 @@ void HandleModuleConfiguration(void)
}
}
//#ifdef ESP8266
//#ifndef USE_ADC_VCC
// WSContentSend_P(PSTR("os=\""));
// for (uint32_t j = 0; j < ADC0_END; j++) {
// WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE, j, GetTextIndexed(stemp, sizeof(stemp), j, kAdc0Names), j);
// }
// WSContentSend_P(PSTR("\";sk(%d," STR(ADC0_PIN) ");"), Settings.my_adc0);
//#endif // USE_ADC_VCC
//#endif // ESP8266
#ifdef ESP8266
#ifndef USE_ADC_VCC
WSContentSend_P(PSTR("os=\""));
/*
for (uint32_t j = 0; j < ADC0_END; j++) {
WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE, j, GetTextIndexed(stemp, sizeof(stemp), j, kAdc0Names), j);
}
WSContentSend_P(PSTR("\";sk(%d," STR(ADC0_PIN) ");"), Settings.my_adc0);
*/
for (uint32_t i = 0; i < ARRAY_SIZE(kAdcNiceList); i++) { // FLAG: }2'0'>None}3}2'17'>Analog}3...
uint32_t ridx = pgm_read_word(kAdcNiceList + i) & 0xFFE0;
uint32_t midx = BGPIO(ridx);
WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, ridx, GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames));
}
WSContentSend_P(PSTR("\";sk(%d," STR(ADC0_PIN) ");"), Settings.my_gp.io[(sizeof(myio) / 2) -1]);
#endif // USE_ADC_VCC
#endif // ESP8266
WSContentSend_P(PSTR("}wl(sl);"));
@ -1974,15 +1986,15 @@ void HandleModuleConfiguration(void)
// (WEMOS==my_module_type)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :((9==i)||(10==i))? sesp8285 :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i);
//#else // ESP32
#ifdef ESP8266
WSContentSend_P(PSTR("<tr><td style='width:116px'>%s <b>%s%d</b></td><td style='width:150px'><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
(WEMOS==my_module_type)?stemp:"",
(17==i) ? PSTR(D_ADC) : PSTR(D_GPIO), (17==i) ? 0 : i,
i, i);
#else // ESP32
//#ifdef ESP8266
// WSContentSend_P(PSTR("<tr><td style='width:116px'>%s <b>%s%d</b></td><td style='width:150px'><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
// (WEMOS==my_module_type)?stemp:"",
// (17==i) ? PSTR(D_ADC) : PSTR(D_GPIO), (17==i) ? 0 : i,
// i, i);
//#else // ESP32
WSContentSend_P(PSTR("<tr><td style='width:116px'>%s <b>" D_GPIO "%d</b></td><td style='width:150px'><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
(WEMOS==my_module_type)?stemp:"", i, i, i);
#endif
//#endif
WSContentSend_P(PSTR("<td style='width:50px'><select id='h%d'></select></td></tr>"), i);
//#endif // ESP8266
}

View File

@ -1,5 +1,5 @@
/*
xsns_02_analog_esp32.ino - ESP32 ADC support for Tasmota
xsns_02_analog.ino - ADC support for Tasmota
Copyright (C) 2020 Theo Arends
@ -17,7 +17,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifdef ESP32
#ifdef USE_ADC
/*********************************************************************************************\
* ADC support for up to 8 channels on GPIO32 to GPIO39
@ -250,6 +249,19 @@ void AdcEvery250ms(void) {
}
#endif // USE_RULES
bool AdcButtonPresent(uint32_t idx) {
return ((ADC_BUTTON == Adc[idx].type) || (ADC_BUTTON_INV == Adc[idx].type));
}
uint8_t AdcGetButton(uint32_t idx) {
if (ADC_BUTTON_INV == Adc[idx].type) {
return (AdcRead(Adc[idx].pin, 1) < 128);
}
else if (ADC_BUTTON == Adc[idx].type) {
return (AdcRead(Adc[idx].pin, 1) > 128);
}
}
uint16_t AdcGetLux(uint32_t idx) {
int adc = AdcRead(Adc[idx].pin, 2);
// Source: https://www.allaboutcircuits.com/projects/design-a-luxmeter-using-a-light-dependent-resistor/
@ -584,4 +596,3 @@ bool Xsns02(uint8_t function) {
}
#endif // USE_ADC
//#endif // ESP32