Skip to content

Commit c756a12

Browse files
authored
fix buffer size calculation for ESP8266 (0.15 edition) (#4951)
* fix buffer size calculation for ESP8266 also adds proper global buffer calculation and RMT/I2S channel calculation thx to @blazoncek
1 parent 4cee975 commit c756a12

File tree

2 files changed

+92
-95
lines changed

2 files changed

+92
-95
lines changed

wled00/bus_wrapper.h

Lines changed: 91 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,54 +1217,54 @@ class PolyBus {
12171217
switch (busType) {
12181218
case I_NONE: break;
12191219
#ifdef ESP8266
1220-
case I_8266_U0_NEO_3: size = (static_cast<B_8266_U0_NEO_3*>(busPtr))->PixelsSize()*2; break;
1221-
case I_8266_U1_NEO_3: size = (static_cast<B_8266_U1_NEO_3*>(busPtr))->PixelsSize()*2; break;
1220+
case I_8266_U0_NEO_3: size = (static_cast<B_8266_U0_NEO_3*>(busPtr))->PixelsSize(); break;
1221+
case I_8266_U1_NEO_3: size = (static_cast<B_8266_U1_NEO_3*>(busPtr))->PixelsSize(); break;
12221222
case I_8266_DM_NEO_3: size = (static_cast<B_8266_DM_NEO_3*>(busPtr))->PixelsSize()*5; break;
1223-
case I_8266_BB_NEO_3: size = (static_cast<B_8266_BB_NEO_3*>(busPtr))->PixelsSize()*2; break;
1224-
case I_8266_U0_NEO_4: size = (static_cast<B_8266_U0_NEO_4*>(busPtr))->PixelsSize()*2; break;
1225-
case I_8266_U1_NEO_4: size = (static_cast<B_8266_U1_NEO_4*>(busPtr))->PixelsSize()*2; break;
1223+
case I_8266_BB_NEO_3: size = (static_cast<B_8266_BB_NEO_3*>(busPtr))->PixelsSize(); break;
1224+
case I_8266_U0_NEO_4: size = (static_cast<B_8266_U0_NEO_4*>(busPtr))->PixelsSize(); break;
1225+
case I_8266_U1_NEO_4: size = (static_cast<B_8266_U1_NEO_4*>(busPtr))->PixelsSize(); break;
12261226
case I_8266_DM_NEO_4: size = (static_cast<B_8266_DM_NEO_4*>(busPtr))->PixelsSize()*5; break;
1227-
case I_8266_BB_NEO_4: size = (static_cast<B_8266_BB_NEO_4*>(busPtr))->PixelsSize()*2; break;
1228-
case I_8266_U0_400_3: size = (static_cast<B_8266_U0_400_3*>(busPtr))->PixelsSize()*2; break;
1229-
case I_8266_U1_400_3: size = (static_cast<B_8266_U1_400_3*>(busPtr))->PixelsSize()*2; break;
1227+
case I_8266_BB_NEO_4: size = (static_cast<B_8266_BB_NEO_4*>(busPtr))->PixelsSize(); break;
1228+
case I_8266_U0_400_3: size = (static_cast<B_8266_U0_400_3*>(busPtr))->PixelsSize(); break;
1229+
case I_8266_U1_400_3: size = (static_cast<B_8266_U1_400_3*>(busPtr))->PixelsSize(); break;
12301230
case I_8266_DM_400_3: size = (static_cast<B_8266_DM_400_3*>(busPtr))->PixelsSize()*5; break;
1231-
case I_8266_BB_400_3: size = (static_cast<B_8266_BB_400_3*>(busPtr))->PixelsSize()*2; break;
1232-
case I_8266_U0_TM1_4: size = (static_cast<B_8266_U0_TM1_4*>(busPtr))->PixelsSize()*2; break;
1233-
case I_8266_U1_TM1_4: size = (static_cast<B_8266_U1_TM1_4*>(busPtr))->PixelsSize()*2; break;
1231+
case I_8266_BB_400_3: size = (static_cast<B_8266_BB_400_3*>(busPtr))->PixelsSize(); break;
1232+
case I_8266_U0_TM1_4: size = (static_cast<B_8266_U0_TM1_4*>(busPtr))->PixelsSize(); break;
1233+
case I_8266_U1_TM1_4: size = (static_cast<B_8266_U1_TM1_4*>(busPtr))->PixelsSize(); break;
12341234
case I_8266_DM_TM1_4: size = (static_cast<B_8266_DM_TM1_4*>(busPtr))->PixelsSize()*5; break;
1235-
case I_8266_BB_TM1_4: size = (static_cast<B_8266_BB_TM1_4*>(busPtr))->PixelsSize()*2; break;
1236-
case I_8266_U0_TM2_3: size = (static_cast<B_8266_U0_TM2_3*>(busPtr))->PixelsSize()*2; break;
1237-
case I_8266_U1_TM2_3: size = (static_cast<B_8266_U1_TM2_3*>(busPtr))->PixelsSize()*2; break;
1235+
case I_8266_BB_TM1_4: size = (static_cast<B_8266_BB_TM1_4*>(busPtr))->PixelsSize(); break;
1236+
case I_8266_U0_TM2_3: size = (static_cast<B_8266_U0_TM2_3*>(busPtr))->PixelsSize(); break;
1237+
case I_8266_U1_TM2_3: size = (static_cast<B_8266_U1_TM2_3*>(busPtr))->PixelsSize(); break;
12381238
case I_8266_DM_TM2_3: size = (static_cast<B_8266_DM_TM2_3*>(busPtr))->PixelsSize()*5; break;
1239-
case I_8266_BB_TM2_3: size = (static_cast<B_8266_BB_TM2_3*>(busPtr))->PixelsSize()*2; break;
1240-
case I_8266_U0_UCS_3: size = (static_cast<B_8266_U0_UCS_3*>(busPtr))->PixelsSize()*2; break;
1241-
case I_8266_U1_UCS_3: size = (static_cast<B_8266_U1_UCS_3*>(busPtr))->PixelsSize()*2; break;
1239+
case I_8266_BB_TM2_3: size = (static_cast<B_8266_BB_TM2_3*>(busPtr))->PixelsSize(); break;
1240+
case I_8266_U0_UCS_3: size = (static_cast<B_8266_U0_UCS_3*>(busPtr))->PixelsSize(); break;
1241+
case I_8266_U1_UCS_3: size = (static_cast<B_8266_U1_UCS_3*>(busPtr))->PixelsSize(); break;
12421242
case I_8266_DM_UCS_3: size = (static_cast<B_8266_DM_UCS_3*>(busPtr))->PixelsSize()*5; break;
1243-
case I_8266_BB_UCS_3: size = (static_cast<B_8266_BB_UCS_3*>(busPtr))->PixelsSize()*2; break;
1244-
case I_8266_U0_UCS_4: size = (static_cast<B_8266_U0_UCS_4*>(busPtr))->PixelsSize()*2; break;
1245-
case I_8266_U1_UCS_4: size = (static_cast<B_8266_U1_UCS_4*>(busPtr))->PixelsSize()*2; break;
1243+
case I_8266_BB_UCS_3: size = (static_cast<B_8266_BB_UCS_3*>(busPtr))->PixelsSize(); break;
1244+
case I_8266_U0_UCS_4: size = (static_cast<B_8266_U0_UCS_4*>(busPtr))->PixelsSize(); break;
1245+
case I_8266_U1_UCS_4: size = (static_cast<B_8266_U1_UCS_4*>(busPtr))->PixelsSize(); break;
12461246
case I_8266_DM_UCS_4: size = (static_cast<B_8266_DM_UCS_4*>(busPtr))->PixelsSize()*5; break;
1247-
case I_8266_BB_UCS_4: size = (static_cast<B_8266_BB_UCS_4*>(busPtr))->PixelsSize()*2; break;
1248-
case I_8266_U0_APA106_3: size = (static_cast<B_8266_U0_APA106_3*>(busPtr))->PixelsSize()*2; break;
1249-
case I_8266_U1_APA106_3: size = (static_cast<B_8266_U1_APA106_3*>(busPtr))->PixelsSize()*2; break;
1247+
case I_8266_BB_UCS_4: size = (static_cast<B_8266_BB_UCS_4*>(busPtr))->PixelsSize(); break;
1248+
case I_8266_U0_APA106_3: size = (static_cast<B_8266_U0_APA106_3*>(busPtr))->PixelsSize(); break;
1249+
case I_8266_U1_APA106_3: size = (static_cast<B_8266_U1_APA106_3*>(busPtr))->PixelsSize(); break;
12501250
case I_8266_DM_APA106_3: size = (static_cast<B_8266_DM_APA106_3*>(busPtr))->PixelsSize()*5; break;
1251-
case I_8266_BB_APA106_3: size = (static_cast<B_8266_BB_APA106_3*>(busPtr))->PixelsSize()*2; break;
1252-
case I_8266_U0_FW6_5: size = (static_cast<B_8266_U0_FW6_5*>(busPtr))->PixelsSize()*2; break;
1253-
case I_8266_U1_FW6_5: size = (static_cast<B_8266_U1_FW6_5*>(busPtr))->PixelsSize()*2; break;
1251+
case I_8266_BB_APA106_3: size = (static_cast<B_8266_BB_APA106_3*>(busPtr))->PixelsSize(); break;
1252+
case I_8266_U0_FW6_5: size = (static_cast<B_8266_U0_FW6_5*>(busPtr))->PixelsSize(); break;
1253+
case I_8266_U1_FW6_5: size = (static_cast<B_8266_U1_FW6_5*>(busPtr))->PixelsSize(); break;
12541254
case I_8266_DM_FW6_5: size = (static_cast<B_8266_DM_FW6_5*>(busPtr))->PixelsSize()*5; break;
1255-
case I_8266_BB_FW6_5: size = (static_cast<B_8266_BB_FW6_5*>(busPtr))->PixelsSize()*2; break;
1256-
case I_8266_U0_2805_5: size = (static_cast<B_8266_U0_2805_5*>(busPtr))->PixelsSize()*2; break;
1257-
case I_8266_U1_2805_5: size = (static_cast<B_8266_U1_2805_5*>(busPtr))->PixelsSize()*2; break;
1255+
case I_8266_BB_FW6_5: size = (static_cast<B_8266_BB_FW6_5*>(busPtr))->PixelsSize(); break;
1256+
case I_8266_U0_2805_5: size = (static_cast<B_8266_U0_2805_5*>(busPtr))->PixelsSize(); break;
1257+
case I_8266_U1_2805_5: size = (static_cast<B_8266_U1_2805_5*>(busPtr))->PixelsSize(); break;
12581258
case I_8266_DM_2805_5: size = (static_cast<B_8266_DM_2805_5*>(busPtr))->PixelsSize()*5; break;
1259-
case I_8266_BB_2805_5: size = (static_cast<B_8266_BB_2805_5*>(busPtr))->PixelsSize()*2; break;
1260-
case I_8266_U0_TM1914_3: size = (static_cast<B_8266_U0_TM1914_3*>(busPtr))->PixelsSize()*2; break;
1261-
case I_8266_U1_TM1914_3: size = (static_cast<B_8266_U1_TM1914_3*>(busPtr))->PixelsSize()*2; break;
1259+
case I_8266_BB_2805_5: size = (static_cast<B_8266_BB_2805_5*>(busPtr))->PixelsSize(); break;
1260+
case I_8266_U0_TM1914_3: size = (static_cast<B_8266_U0_TM1914_3*>(busPtr))->PixelsSize(); break;
1261+
case I_8266_U1_TM1914_3: size = (static_cast<B_8266_U1_TM1914_3*>(busPtr))->PixelsSize(); break;
12621262
case I_8266_DM_TM1914_3: size = (static_cast<B_8266_DM_TM1914_3*>(busPtr))->PixelsSize()*5; break;
1263-
case I_8266_BB_TM1914_3: size = (static_cast<B_8266_BB_TM1914_3*>(busPtr))->PixelsSize()*2; break;
1264-
case I_8266_U0_SM16825_5: size = (static_cast<B_8266_U0_SM16825_5*>(busPtr))->PixelsSize()*2; break;
1265-
case I_8266_U1_SM16825_5: size = (static_cast<B_8266_U1_SM16825_5*>(busPtr))->PixelsSize()*2; break;
1263+
case I_8266_BB_TM1914_3: size = (static_cast<B_8266_BB_TM1914_3*>(busPtr))->PixelsSize(); break;
1264+
case I_8266_U0_SM16825_5: size = (static_cast<B_8266_U0_SM16825_5*>(busPtr))->PixelsSize(); break;
1265+
case I_8266_U1_SM16825_5: size = (static_cast<B_8266_U1_SM16825_5*>(busPtr))->PixelsSize(); break;
12661266
case I_8266_DM_SM16825_5: size = (static_cast<B_8266_DM_SM16825_5*>(busPtr))->PixelsSize()*5; break;
1267-
case I_8266_BB_SM16825_5: size = (static_cast<B_8266_BB_SM16825_5*>(busPtr))->PixelsSize()*2; break;
1267+
case I_8266_BB_SM16825_5: size = (static_cast<B_8266_BB_SM16825_5*>(busPtr))->PixelsSize(); break;
12681268
#endif
12691269
#ifdef ARDUINO_ARCH_ESP32
12701270
// RMT buses (front + back + small system managed RMT)
@@ -1316,68 +1316,65 @@ class PolyBus {
13161316
case I_NONE: size = 0; break;
13171317
#ifdef ESP8266
13181318
// UART methods have front + back buffers + small UART
1319-
case I_8266_U0_NEO_4: size = (size + count)*2; break; // 4 channels
1320-
case I_8266_U1_NEO_4: size = (size + count)*2; break; // 4 channels
1321-
case I_8266_BB_NEO_4: size = (size + count)*2; break; // 4 channels
1322-
case I_8266_U0_TM1_4: size = (size + count)*2; break; // 4 channels
1323-
case I_8266_U1_TM1_4: size = (size + count)*2; break; // 4 channels
1324-
case I_8266_BB_TM1_4: size = (size + count)*2; break; // 4 channels
1325-
case I_8266_U0_UCS_3: size *= 4; break; // 16 bit
1326-
case I_8266_U1_UCS_3: size *= 4; break; // 16 bit
1327-
case I_8266_BB_UCS_3: size *= 4; break; // 16 bit
1328-
case I_8266_U0_UCS_4: size = (size + count)*2*2; break; // 16 bit 4 channels
1329-
case I_8266_U1_UCS_4: size = (size + count)*2*2; break; // 16 bit 4 channels
1330-
case I_8266_BB_UCS_4: size = (size + count)*2*2; break; // 16 bit 4 channels
1331-
case I_8266_U0_FW6_5: size = (size + 2*count)*2; break; // 5 channels
1332-
case I_8266_U1_FW6_5: size = (size + 2*count)*2; break; // 5channels
1333-
case I_8266_BB_FW6_5: size = (size + 2*count)*2; break; // 5 channels
1334-
case I_8266_U0_2805_5: size = (size + 2*count)*2; break; // 5 channels
1335-
case I_8266_U1_2805_5: size = (size + 2*count)*2; break; // 5 channels
1336-
case I_8266_BB_2805_5: size = (size + 2*count)*2; break; // 5 channels
1337-
case I_8266_U0_SM16825_5: size = (size + 2*count)*2*2; break; // 16 bit 5 channels
1338-
case I_8266_U1_SM16825_5: size = (size + 2*count)*2*2; break; // 16 bit 5 channels
1339-
case I_8266_BB_SM16825_5: size = (size + 2*count)*2*2; break; // 16 bit 5 channels
1340-
// DMA methods have front + DMA buffer = ((1+(3+1)) * channels)
1341-
case I_8266_DM_NEO_3: size *= 5; break;
1342-
case I_8266_DM_NEO_4: size = (size + count)*5; break;
1343-
case I_8266_DM_400_3: size *= 5; break;
1344-
case I_8266_DM_TM1_4: size = (size + count)*5; break;
1345-
case I_8266_DM_TM2_3: size *= 5; break;
1346-
case I_8266_DM_UCS_3: size *= 2*5; break;
1347-
case I_8266_DM_UCS_4: size = (size + count)*2*5; break;
1348-
case I_8266_DM_APA106_3: size *= 5; break;
1349-
case I_8266_DM_FW6_5: size = (size + 2*count)*5; break;
1350-
case I_8266_DM_2805_5: size = (size + 2*count)*5; break;
1351-
case I_8266_DM_TM1914_3: size *= 5; break;
1319+
case I_8266_U0_NEO_4 : // fallthrough
1320+
case I_8266_U1_NEO_4 : // fallthrough
1321+
case I_8266_BB_NEO_4 : // fallthrough
1322+
case I_8266_U0_TM1_4 : // fallthrough
1323+
case I_8266_U1_TM1_4 : // fallthrough
1324+
case I_8266_BB_TM1_4 : size = (size + count); break; // 4 channels
1325+
case I_8266_U0_UCS_3 : // fallthrough
1326+
case I_8266_U1_UCS_3 : // fallthrough
1327+
case I_8266_BB_UCS_3 : size *= 2; break; // 16 bit
1328+
case I_8266_U0_UCS_4 : // fallthrough
1329+
case I_8266_U1_UCS_4 : // fallthrough
1330+
case I_8266_BB_UCS_4 : size = (size + count)*2; break; // 16 bit 4 channels
1331+
case I_8266_U0_FW6_5 : // fallthrough
1332+
case I_8266_U1_FW6_5 : // fallthrough
1333+
case I_8266_BB_FW6_5 : // fallthrough
1334+
case I_8266_U0_2805_5 : // fallthrough
1335+
case I_8266_U1_2805_5 : // fallthrough
1336+
case I_8266_BB_2805_5 : size = (size + 2*count); break; // 5 channels
1337+
case I_8266_U0_SM16825_5: // fallthrough
1338+
case I_8266_U1_SM16825_5: // fallthrough
1339+
case I_8266_BB_SM16825_5: size = (size + 2*count)*2; break; // 16 bit 5 channels
1340+
// DMA methods have front + DMA buffer = ((1+(3+1)) * channels; exact value is a bit of mistery - needs a dig into NPB)
1341+
case I_8266_DM_NEO_3 : // fallthrough
1342+
case I_8266_DM_400_3 : // fallthrough
1343+
case I_8266_DM_TM2_3 : // fallthrough
1344+
case I_8266_DM_APA106_3 : // fallthrough
1345+
case I_8266_DM_TM1914_3 : size *= 5; break;
1346+
case I_8266_DM_NEO_4 : // fallthrough
1347+
case I_8266_DM_TM1_4 : size = (size + count)*5; break;
1348+
case I_8266_DM_UCS_3 : size *= 2*5; break;
1349+
case I_8266_DM_UCS_4 : size = (size + count)*2*5; break;
1350+
case I_8266_DM_FW6_5 : // fallthrough
1351+
case I_8266_DM_2805_5 : size = (size + 2*count)*5; break;
13521352
case I_8266_DM_SM16825_5: size = (size + 2*count)*2*5; break;
1353-
#endif
1354-
#ifdef ARDUINO_ARCH_ESP32
1355-
// RMT buses (1x front and 1x back buffer)
1356-
case I_32_RN_NEO_4: size = (size + count)*2; break;
1357-
case I_32_RN_TM1_4: size = (size + count)*2; break;
1358-
case I_32_RN_UCS_3: size *= 2*2; break;
1359-
case I_32_RN_UCS_4: size = (size + count)*2*2; break;
1360-
case I_32_RN_FW6_5: size = (size + 2*count)*2; break;
1361-
case I_32_RN_2805_5: size = (size + 2*count)*2; break;
1362-
case I_32_RN_SM16825_5: size = (size + 2*count)*2*2; break;
1363-
// I2S1 bus or paralell buses (individual 1x front and 1 DMA (3x or 4x pixel count) or common back DMA buffers)
1353+
#else
1354+
// RMT buses (1x front and 1x back buffer, does not include small RMT buffer)
1355+
case I_32_RN_NEO_4 : // fallthrough
1356+
case I_32_RN_TM1_4 : size = (size + count)*2; break; // 4 channels
1357+
case I_32_RN_UCS_3 : size *= 2*2; break; // 16bit
1358+
case I_32_RN_UCS_4 : size = (size + count)*2*2; break; // 16bit, 4 channels
1359+
case I_32_RN_FW6_5 : // fallthrough
1360+
case I_32_RN_2805_5 : size = (size + 2*count)*2; break; // 5 channels
1361+
case I_32_RN_SM16825_5: size = (size + 2*count)*2*2; break; // 16bit, 5 channels
1362+
// I2S1 bus or paralell I2S1 buses (1x front, does not include DMA buffer which is front*cadence, a bit(?) more for LCD)
13641363
#ifndef CONFIG_IDF_TARGET_ESP32C3
1365-
case I_32_I2_NEO_3: size *= 4; break;
1366-
case I_32_I2_NEO_4: size = (size + count)*4; break;
1367-
case I_32_I2_400_3: size *= 4; break;
1368-
case I_32_I2_TM1_4: size = (size + count)*4; break;
1369-
case I_32_I2_TM2_3: size *= 4; break;
1370-
case I_32_I2_UCS_3: size *= 2*4; break;
1371-
case I_32_I2_UCS_4: size = (size + count)*2*4; break;
1372-
case I_32_I2_APA106_3: size *= 4; break;
1373-
case I_32_I2_FW6_5: size = (size + 2*count)*4; break;
1374-
case I_32_I2_2805_5: size = (size + 2*count)*4; break;
1375-
case I_32_I2_TM1914_3: size *= 4; break;
1376-
case I_32_I2_SM16825_5: size = (size + 2*count)*2*4; break;
1364+
case I_32_I2_NEO_3 : // fallthrough
1365+
case I_32_I2_400_3 : // fallthrough
1366+
case I_32_I2_TM2_3 : // fallthrough
1367+
case I_32_I2_APA106_3 : break; // do nothing, I2S uses single buffer + DMA buffer
1368+
case I_32_I2_NEO_4 : // fallthrough
1369+
case I_32_I2_TM1_4 : size = (size + count); break; // 4 channels
1370+
case I_32_I2_UCS_3 : size *= 2; break; // 16 bit
1371+
case I_32_I2_UCS_4 : size = (size + count)*2; break; // 16 bit, 4 channels
1372+
case I_32_I2_FW6_5 : // fallthrough
1373+
case I_32_I2_2805_5 : size = (size + 2*count); break; // 5 channels
1374+
case I_32_I2_SM16825_5: size = (size + 2*count)*2; break; // 16 bit, 5 channels
13771375
#endif
1376+
default : size *= 2; break; // everything else uses 2 buffers
13781377
#endif
1379-
// everything else uses 2 buffers
1380-
default: size *= 2; break;
13811378
}
13821379
return size;
13831380
}

wled00/data/settings_leds.htm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@
198198
let dbl = 0;
199199
let ch = 3*hasRGB(t) + hasW(t) + hasCCT(t);
200200
let mul = 1;
201+
if (d.Sf.LD.checked) dbl = len * ch; // global buffer
201202
if (isDig(t)) {
202203
if (is16b(t)) len *= 2; // 16 bit LEDs
203204
if (maxM < 10000 && d.getElementsByName("L0"+n)[0].value == 3) { //8266 DMA uses 5x the mem
@@ -206,7 +207,6 @@
206207
if (maxM >= 10000) { //ESP32 RMT uses double buffer?
207208
mul = 2;
208209
}
209-
if (d.Sf.LD.checked) dbl = len * ch; // double buffering
210210
}
211211
return len * ch * mul + dbl;
212212
}

0 commit comments

Comments
 (0)