refactor: update SPIFFS initialization and partition sizes; enhance WiFi setup
This commit is contained in:
		@@ -63,7 +63,7 @@ jobs:
 | 
				
			|||||||
        # Create release files
 | 
					        # Create release files
 | 
				
			||||||
        cp spiffs.bin filaman_spiffs.bin
 | 
					        cp spiffs.bin filaman_spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create full binary
 | 
					        # Create full binary with correct partition offsets
 | 
				
			||||||
        echo "Creating full binary..."
 | 
					        echo "Creating full binary..."
 | 
				
			||||||
        esptool.py --chip esp32 merge_bin \
 | 
					        esptool.py --chip esp32 merge_bin \
 | 
				
			||||||
          --fill-flash-size 4MB \
 | 
					          --fill-flash-size 4MB \
 | 
				
			||||||
@@ -71,10 +71,10 @@ jobs:
 | 
				
			|||||||
          --flash_freq 40m \
 | 
					          --flash_freq 40m \
 | 
				
			||||||
          --flash_size 4MB \
 | 
					          --flash_size 4MB \
 | 
				
			||||||
          -o filaman_full.bin \
 | 
					          -o filaman_full.bin \
 | 
				
			||||||
          0x0000 bootloader.bin \
 | 
					          0x1000 bootloader.bin \
 | 
				
			||||||
          0x8000 partitions.bin \
 | 
					          0x8000 partitions.bin \
 | 
				
			||||||
          0x10000 firmware.bin \
 | 
					          0x10000 firmware.bin \
 | 
				
			||||||
          0x390000 spiffs.bin
 | 
					          0x310000 spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Verify file sizes
 | 
					        # Verify file sizes
 | 
				
			||||||
        echo "File sizes:"
 | 
					        echo "File sizes:"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@ jobs:
 | 
				
			|||||||
        # Create release files
 | 
					        # Create release files
 | 
				
			||||||
        cp spiffs.bin filaman_spiffs.bin
 | 
					        cp spiffs.bin filaman_spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create full binary
 | 
					        # Create full binary with correct partition offsets
 | 
				
			||||||
        echo "Creating full binary..."
 | 
					        echo "Creating full binary..."
 | 
				
			||||||
        esptool.py --chip esp32 merge_bin \
 | 
					        esptool.py --chip esp32 merge_bin \
 | 
				
			||||||
          --fill-flash-size 4MB \
 | 
					          --fill-flash-size 4MB \
 | 
				
			||||||
@@ -60,10 +60,10 @@ jobs:
 | 
				
			|||||||
          --flash_freq 40m \
 | 
					          --flash_freq 40m \
 | 
				
			||||||
          --flash_size 4MB \
 | 
					          --flash_size 4MB \
 | 
				
			||||||
          -o filaman_full.bin \
 | 
					          -o filaman_full.bin \
 | 
				
			||||||
          0x0000 bootloader.bin \
 | 
					          0x1000 bootloader.bin \
 | 
				
			||||||
          0x8000 partitions.bin \
 | 
					          0x8000 partitions.bin \
 | 
				
			||||||
          0x10000 firmware.bin \
 | 
					          0x10000 firmware.bin \
 | 
				
			||||||
          0x390000 spiffs.bin
 | 
					          0x310000 spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Verify file sizes
 | 
					        # Verify file sizes
 | 
				
			||||||
        echo "File sizes:"
 | 
					        echo "File sizes:"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,190 +1,116 @@
 | 
				
			|||||||
<!-- head --><!DOCTYPE html>
 | 
					<!DOCTYPE html>
 | 
				
			||||||
<html lang="en">
 | 
					<html lang="en">
 | 
				
			||||||
<head>
 | 
					<head>
 | 
				
			||||||
    <meta charset="UTF-8">
 | 
					    <meta charset="UTF-8">
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
				
			||||||
    <title>FilaMan - Filament Management Tool</title>
 | 
					    <title>FilaMan - Firmware Update</title>
 | 
				
			||||||
    <link rel="icon" type="image/png" href="/favicon.ico">
 | 
					 | 
				
			||||||
    <link rel="stylesheet" href="style.css">
 | 
					    <link rel="stylesheet" href="style.css">
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					        .debug-log {
 | 
				
			||||||
 | 
					            background: #f5f5f5;
 | 
				
			||||||
 | 
					            border: 1px solid #ddd;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					            margin: 10px 0;
 | 
				
			||||||
 | 
					            font-family: monospace;
 | 
				
			||||||
 | 
					            max-height: 200px;
 | 
				
			||||||
 | 
					            overflow-y: auto;
 | 
				
			||||||
 | 
					            display: none;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
    <div class="navbar">
 | 
					 | 
				
			||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					 | 
				
			||||||
            <img src="/logo.png" alt="FilaMan Logo" class="logo">
 | 
					 | 
				
			||||||
            <div class="logo-text">
 | 
					 | 
				
			||||||
                <h1>FilaMan<span class="version">v1.2.92</span></h1>
 | 
					 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        <nav style="display: flex; gap: 1rem;">
 | 
					 | 
				
			||||||
            <a href="/">Start</a>
 | 
					 | 
				
			||||||
            <a href="/waage">Scale</a>
 | 
					 | 
				
			||||||
            <a href="/spoolman">Spoolman/Bambu</a>
 | 
					 | 
				
			||||||
            <a href="/about">About</a>
 | 
					 | 
				
			||||||
            <a href="/upgrade">Upgrade</a>
 | 
					 | 
				
			||||||
        </nav>
 | 
					 | 
				
			||||||
        <div class="status-container">
 | 
					 | 
				
			||||||
            <div class="status-item">
 | 
					 | 
				
			||||||
                <span class="status-dot" id="bambuDot"></span>B
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
            <div class="status-item">
 | 
					 | 
				
			||||||
                <span class="status-dot" id="spoolmanDot"></span>S
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
            <div class="ram-status" id="ramStatus"></div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<!-- head -->
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    <div class="content">
 | 
					    <div class="content">
 | 
				
			||||||
        <h1>Firmware Upgrade</h1>
 | 
					        <h1>Firmware Update</h1>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        <div class="warning">
 | 
					        <div class="warning">
 | 
				
			||||||
            <strong>Warning:</strong> Please do not turn off or restart the device during the update. 
 | 
					            <strong>Warning:</strong> Do not power off the device during update.
 | 
				
			||||||
            The device will restart automatically after the update.
 | 
					 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="update-form">
 | 
					        <form id="updateForm">
 | 
				
			||||||
            <form id="updateForm" enctype='multipart/form-data'>
 | 
					            <input type="file" name="update" accept=".bin">
 | 
				
			||||||
                <input type='file' name='update' accept='.bin' required>
 | 
					            <button type="submit">Update Firmware</button>
 | 
				
			||||||
                <input type='submit' value='Start Firmware Update'>
 | 
					 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="progress-container">
 | 
					        <div class="progress" style="display: none;">
 | 
				
			||||||
            <div class="progress-bar">0%</div>
 | 
					            <div class="progress-bar"></div>
 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
            <div class="status"></div>
 | 
					            <div class="status"></div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="debug-log"></div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <script>
 | 
					    <script>
 | 
				
			||||||
        // Hide status indicators during update
 | 
					        const form = document.getElementById('updateForm');
 | 
				
			||||||
        const statusContainer = document.querySelector('.status-container');
 | 
					        const progress = document.querySelector('.progress');
 | 
				
			||||||
        if (statusContainer) {
 | 
					        const progressBar = document.querySelector('.progress-bar');
 | 
				
			||||||
            statusContainer.style.display = 'none';
 | 
					        const status = document.querySelector('.status');
 | 
				
			||||||
 | 
					        const debugLog = document.querySelector('.debug-log');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function log(message) {
 | 
				
			||||||
 | 
					            debugLog.style.display = 'block';
 | 
				
			||||||
 | 
					            const time = new Date().toLocaleTimeString();
 | 
				
			||||||
 | 
					            debugLog.innerHTML += `[${time}] ${message}<br>`;
 | 
				
			||||||
 | 
					            debugLog.scrollTop = debugLog.scrollHeight;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Größenbeschränkung für Upload
 | 
					        form.addEventListener('submit', async (e) => {
 | 
				
			||||||
        const MAX_FILE_SIZE = 4000000; // 4MB
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        async function checkMagicByte(file) {
 | 
					 | 
				
			||||||
            return new Promise((resolve, reject) => {
 | 
					 | 
				
			||||||
                const reader = new FileReader();
 | 
					 | 
				
			||||||
                reader.onload = () => {
 | 
					 | 
				
			||||||
                    const arr = new Uint8Array(reader.result);
 | 
					 | 
				
			||||||
                    // Prüfe auf Magic Byte 0xE9 für ESP32 Firmware
 | 
					 | 
				
			||||||
                    resolve(arr[0] === 0xE9);
 | 
					 | 
				
			||||||
                };
 | 
					 | 
				
			||||||
                reader.onerror = () => reject(reader.error);
 | 
					 | 
				
			||||||
                reader.readAsArrayBuffer(file.slice(0, 1));
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        document.getElementById('updateForm').addEventListener('submit', async (e) => {
 | 
					 | 
				
			||||||
            e.preventDefault();
 | 
					            e.preventDefault();
 | 
				
			||||||
            const form = e.target;
 | 
					 | 
				
			||||||
            const file = form.update.files[0];
 | 
					            const file = form.update.files[0];
 | 
				
			||||||
            if (!file) {
 | 
					            if (!file) {
 | 
				
			||||||
                alert('Please select a firmware file.');
 | 
					                alert('Please select a file');
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (file.size > MAX_FILE_SIZE) {
 | 
					            log(`Selected file: ${file.name} (${file.size} bytes)`);
 | 
				
			||||||
                alert('File too large. Maximum size is 4MB.');
 | 
					            
 | 
				
			||||||
                return;
 | 
					            // Aktiviere Fortschrittsanzeige
 | 
				
			||||||
            }
 | 
					            progress.style.display = 'block';
 | 
				
			||||||
 | 
					            form.style.display = 'none';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Erstelle FormData für den Upload
 | 
				
			||||||
 | 
					            const formData = new FormData();
 | 
				
			||||||
 | 
					            formData.append('update', file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Prüfe Magic Byte für normale Firmware-Dateien
 | 
					 | 
				
			||||||
            if (!file.name.endsWith('_spiffs.bin')) {
 | 
					 | 
				
			||||||
                try {
 | 
					 | 
				
			||||||
                    const isValidFirmware = await checkMagicByte(file);
 | 
					 | 
				
			||||||
                    if (!isValidFirmware) {
 | 
					 | 
				
			||||||
                        alert('Invalid firmware file. Missing ESP32 magic byte.');
 | 
					 | 
				
			||||||
                        return;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                } catch (error) {
 | 
					 | 
				
			||||||
                    console.error('Error checking magic byte:', error);
 | 
					 | 
				
			||||||
                    alert('Could not verify firmware file.');
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            const progress = document.querySelector('.progress-bar');
 | 
					 | 
				
			||||||
            const progressContainer = document.querySelector('.progress-container');
 | 
					 | 
				
			||||||
            const status = document.querySelector('.status');
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            progressContainer.style.display = 'block';
 | 
					 | 
				
			||||||
            status.style.display = 'none';
 | 
					 | 
				
			||||||
            status.className = 'status';
 | 
					 | 
				
			||||||
            form.querySelector('input[type=submit]').disabled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Chunk-basierter Upload mit Retry-Logik
 | 
					 | 
				
			||||||
            const chunkSize = 8192; // Optimale Chunk-Größe
 | 
					 | 
				
			||||||
            const maxRetries = 3;
 | 
					 | 
				
			||||||
            let offset = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            async function uploadChunk(chunk, retryCount = 0) {
 | 
					 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
 | 
					                log('Starting upload...');
 | 
				
			||||||
                const response = await fetch('/update', {
 | 
					                const response = await fetch('/update', {
 | 
				
			||||||
                    method: 'POST',
 | 
					                    method: 'POST',
 | 
				
			||||||
                        body: chunk,
 | 
					                    body: formData
 | 
				
			||||||
                        headers: {
 | 
					 | 
				
			||||||
                            'Content-Type': 'application/octet-stream',
 | 
					 | 
				
			||||||
                            'X-File-Name': file.name,
 | 
					 | 
				
			||||||
                            'X-Chunk-Offset': offset.toString(),
 | 
					 | 
				
			||||||
                            'X-Chunk-Size': chunk.size.toString(),
 | 
					 | 
				
			||||||
                            'X-Total-Size': file.size.toString()
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        timeout: 30000 // 30 Sekunden Timeout
 | 
					 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (!response.ok) {
 | 
					                log(`Server responded with status: ${response.status}`);
 | 
				
			||||||
                        const errorText = await response.text();
 | 
					
 | 
				
			||||||
                        throw new Error(errorText || response.statusText);
 | 
					                let result;
 | 
				
			||||||
 | 
					                const contentType = response.headers.get('content-type');
 | 
				
			||||||
 | 
					                log(`Response content-type: ${contentType}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (contentType && contentType.includes('application/json')) {
 | 
				
			||||||
 | 
					                    result = await response.json();
 | 
				
			||||||
 | 
					                    log('Received JSON response');
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    const text = await response.text();
 | 
				
			||||||
 | 
					                    log(`Received text response: ${text}`);
 | 
				
			||||||
 | 
					                    result = { success: response.ok, message: text };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                    return true;
 | 
					                log(`Update result: ${JSON.stringify(result)}`);
 | 
				
			||||||
                } catch (error) {
 | 
					 | 
				
			||||||
                    console.error(`Chunk upload failed (attempt ${retryCount + 1}):`, error);
 | 
					 | 
				
			||||||
                    if (retryCount < maxRetries) {
 | 
					 | 
				
			||||||
                        await new Promise(resolve => setTimeout(resolve, 1000)); // Warte 1 Sekunde vor Retry
 | 
					 | 
				
			||||||
                        return uploadChunk(chunk, retryCount + 1);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    throw error;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
            try {
 | 
					                if (response.ok && result.success) {
 | 
				
			||||||
                while (offset < file.size) {
 | 
					                    status.textContent = 'Update successful! Restarting...';
 | 
				
			||||||
                    const end = Math.min(offset + chunkSize, file.size);
 | 
					                    status.className = 'success';
 | 
				
			||||||
                    const chunk = file.slice(offset, end);
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    await uploadChunk(chunk);
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    offset = end;
 | 
					 | 
				
			||||||
                    const percentComplete = (offset / file.size) * 100;
 | 
					 | 
				
			||||||
                    progress.style.width = percentComplete + '%';
 | 
					 | 
				
			||||||
                    progress.textContent = Math.round(percentComplete) + '%';
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    // Kleine Pause zwischen den Chunks für bessere Stabilität
 | 
					 | 
				
			||||||
                    await new Promise(resolve => setTimeout(resolve, 100));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // Final success handler
 | 
					 | 
				
			||||||
                status.textContent = 'Update successful! Device will restart...';
 | 
					 | 
				
			||||||
                status.classList.add('success');
 | 
					 | 
				
			||||||
                status.style.display = 'block';
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
                // Warte auf Neustart und Redirect
 | 
					 | 
				
			||||||
                    setTimeout(() => {
 | 
					                    setTimeout(() => {
 | 
				
			||||||
                        window.location.href = '/';
 | 
					                        window.location.href = '/';
 | 
				
			||||||
                }, 20000);
 | 
					                    }, 5000);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    throw new Error(result.message || 'Update failed');
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            } catch (error) {
 | 
					            } catch (error) {
 | 
				
			||||||
                status.textContent = 'Update failed: ' + error.message;
 | 
					                log(`Error: ${error.message}`);
 | 
				
			||||||
                status.classList.add('error');
 | 
					                console.error('Update error:', error);
 | 
				
			||||||
                status.style.display = 'block';
 | 
					                status.textContent = `Error: ${error.message}`;
 | 
				
			||||||
                form.querySelector('input[type=submit]').disabled = false;
 | 
					                status.className = 'error';
 | 
				
			||||||
 | 
					                form.style.display = 'block';
 | 
				
			||||||
 | 
					                progress.style.display = 'none';
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    </script>
 | 
					    </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Name,   Type, SubType,    Offset,   Size,     Flags
 | 
					# Name,   Type, SubType,    Offset,   Size,     Flags
 | 
				
			||||||
nvs,      data, nvs,       0x9000,   0x5000,
 | 
					nvs,      data, nvs,       0x9000,   0x5000,
 | 
				
			||||||
otadata,  data, ota,       0xe000,   0x2000,
 | 
					otadata,  data, ota,       0xe000,   0x2000,
 | 
				
			||||||
app0,     app,  ota_0,     0x10000,  0x1C0000,
 | 
					app0,     app,  ota_0,     0x10000,  0x180000,
 | 
				
			||||||
app1,     app,  ota_1,     0x1D0000, 0x1C0000,
 | 
					app1,     app,  ota_1,     0x190000, 0x180000,
 | 
				
			||||||
spiffs,   data, spiffs,    0x390000, 0x60000,
 | 
					spiffs,   data, spiffs,    0x310000, 0xE0000,
 | 
				
			||||||
		
		
			
  | 
@@ -19,8 +19,10 @@ monitor_speed = 115200
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
lib_deps =
 | 
					lib_deps =
 | 
				
			||||||
    tzapu/WiFiManager @ ^2.0.17
 | 
					    tzapu/WiFiManager @ ^2.0.17
 | 
				
			||||||
    https://github.com/me-no-dev/ESPAsyncWebServer.git#master
 | 
					    #https://github.com/me-no-dev/ESPAsyncWebServer.git#master
 | 
				
			||||||
    me-no-dev/AsyncTCP @ ^1.1.1
 | 
					    #me-no-dev/AsyncTCP @ ^1.1.1
 | 
				
			||||||
 | 
					    mathieucarbou/ESPAsyncWebServer @ ^3.6.0
 | 
				
			||||||
 | 
					    esp32async/AsyncTCP @ ^3.3.5
 | 
				
			||||||
    bogde/HX711 @ ^0.7.5
 | 
					    bogde/HX711 @ ^0.7.5
 | 
				
			||||||
    adafruit/Adafruit SSD1306 @ ^2.5.13
 | 
					    adafruit/Adafruit SSD1306 @ ^2.5.13
 | 
				
			||||||
    adafruit/Adafruit GFX Library @ ^1.11.11
 | 
					    adafruit/Adafruit GFX Library @ ^1.11.11
 | 
				
			||||||
@@ -48,38 +50,14 @@ build_flags =
 | 
				
			|||||||
    -DCORE_DEBUG_LEVEL=3
 | 
					    -DCORE_DEBUG_LEVEL=3
 | 
				
			||||||
    -DCONFIG_ARDUHAL_LOG_COLORS=1
 | 
					    -DCONFIG_ARDUHAL_LOG_COLORS=1
 | 
				
			||||||
    -DOTA_DEBUG=1
 | 
					    -DOTA_DEBUG=1
 | 
				
			||||||
    -DARDUINO_RUNNING_CORE=1
 | 
					 | 
				
			||||||
    -DARDUINO_EVENT_RUNNING_CORE=1
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_PANIC_PRINT_REBOOT
 | 
					    -DCONFIG_ESP32_PANIC_PRINT_REBOOT
 | 
				
			||||||
    -DCONFIG_ARDUINO_OTA_READSIZE=8192
 | 
					    -DCONFIG_ARDUINO_OTA_READSIZE=8192
 | 
				
			||||||
    -DCONFIG_ASYNC_TCP_RUNNING_CORE=1
 | 
					    -DCONFIG_PARTITION_TABLE_OFFSET=0x8000
 | 
				
			||||||
    -DCONFIG_ASYNC_TCP_USE_WDT=0
 | 
					    -DCONFIG_PARTITION_TABLE_MD5=y
 | 
				
			||||||
    -DASYNC_TCP_USE_WDT=0
 | 
					    -DCONFIG_APP_ROLLBACK_ENABLE=1
 | 
				
			||||||
    -DCONFIG_LWIP_TCP_TMR_INTERVAL=25
 | 
					    -DSPIFFS_MAX_PARTITIONS=3
 | 
				
			||||||
    -DCONFIG_LWIP_TCP_MSS=1436
 | 
					    -DCONFIG_SPIFFS_LOG_BLOCK_SIZE=4096
 | 
				
			||||||
    -DCONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744
 | 
					    -DCONFIG_SPIFFS_CACHE=y
 | 
				
			||||||
    -DCONFIG_LWIP_TCP_WND_DEFAULT=5744
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_RCV_BUF_DEFAULT=11488
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_RECVMBOX_SIZE=64
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_MAX_SOCKETS=10
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_MAX_ACTIVE_TCP=16
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_MAX_LISTENING_TCP=16
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_MAXRTX=6
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_SYNMAXRTX=3
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_QUEUE_OOSEQ=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_OVERSIZE_MSS=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_RTO_TIME=1500
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_IPV6=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_STATS=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_USE_ONLY_LWIP_SELECT=1
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_NETIF_LOOPBACK=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_IRAM_OPTIMIZATION=1
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_TX_BA_WIN=6
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_RX_BA_WIN=6
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_WIFI_CSI_ENABLED=0
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
extra_scripts = 
 | 
					extra_scripts = 
 | 
				
			||||||
    scripts/extra_script.py
 | 
					    scripts/extra_script.py
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,23 @@
 | 
				
			|||||||
Import("env")
 | 
					Import("env")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					board_config = env.BoardConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Calculate SPIFFS size based on partition table
 | 
				
			||||||
 | 
					SPIFFS_START = 0x310000  # From partitions.csv
 | 
				
			||||||
 | 
					SPIFFS_SIZE = 0xE0000   # From partitions.csv
 | 
				
			||||||
 | 
					SPIFFS_PAGE = 256
 | 
				
			||||||
 | 
					SPIFFS_BLOCK = 4096
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					env.Replace(
 | 
				
			||||||
 | 
					    MKSPIFFSTOOL="mkspiffs",
 | 
				
			||||||
 | 
					    SPIFFSBLOCKSZ=SPIFFS_BLOCK,
 | 
				
			||||||
 | 
					    SPIFFSBLOCKSIZE=SPIFFS_BLOCK,
 | 
				
			||||||
 | 
					    SPIFFSSTART=SPIFFS_START,
 | 
				
			||||||
 | 
					    SPIFFSEND=SPIFFS_START + SPIFFS_SIZE,
 | 
				
			||||||
 | 
					    SPIFFSPAGESZ=SPIFFS_PAGE,
 | 
				
			||||||
 | 
					    SPIFFSSIZE=SPIFFS_SIZE
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Wiederverwendung der replace_version Funktion
 | 
					# Wiederverwendung der replace_version Funktion
 | 
				
			||||||
exec(open("./scripts/pre_build.py").read())
 | 
					exec(open("./scripts/pre_build.py").read())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
#include "commonFS.h"
 | 
					#include "commonFS.h"
 | 
				
			||||||
 | 
					#include <SPIFFS.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool saveJsonValue(const char* filename, const JsonDocument& doc) {
 | 
					bool saveJsonValue(const char* filename, const JsonDocument& doc) {
 | 
				
			||||||
    File file = SPIFFS.open(filename, "w");
 | 
					    File file = SPIFFS.open(filename, "w");
 | 
				
			||||||
@@ -35,23 +36,12 @@ bool loadJsonValue(const char* filename, JsonDocument& doc) {
 | 
				
			|||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool initializeSPIFFS() {
 | 
					void initializeSPIFFS() {
 | 
				
			||||||
    // Erster Versuch
 | 
					    if (!SPIFFS.begin(true, "/spiffs", 10, "spiffs")) {
 | 
				
			||||||
    if (SPIFFS.begin(true)) {
 | 
					        Serial.println("SPIFFS Mount Failed");
 | 
				
			||||||
        Serial.println("SPIFFS mounted successfully.");
 | 
					        return;
 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    Serial.printf("SPIFFS Total: %u bytes\n", SPIFFS.totalBytes());
 | 
				
			||||||
    // Formatierung versuchen
 | 
					    Serial.printf("SPIFFS Used: %u bytes\n", SPIFFS.usedBytes());
 | 
				
			||||||
    Serial.println("Failed to mount SPIFFS. Formatting...");
 | 
					    Serial.printf("SPIFFS Free: %u bytes\n", SPIFFS.totalBytes() - SPIFFS.usedBytes());
 | 
				
			||||||
    SPIFFS.format();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    // Zweiter Versuch nach Formatierung
 | 
					 | 
				
			||||||
    if (SPIFFS.begin(true)) {
 | 
					 | 
				
			||||||
        Serial.println("SPIFFS formatted and mounted successfully.");
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    Serial.println("SPIFFS initialization failed completely.");
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -7,6 +7,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool saveJsonValue(const char* filename, const JsonDocument& doc);
 | 
					bool saveJsonValue(const char* filename, const JsonDocument& doc);
 | 
				
			||||||
bool loadJsonValue(const char* filename, JsonDocument& doc);
 | 
					bool loadJsonValue(const char* filename, JsonDocument& doc);
 | 
				
			||||||
bool initializeSPIFFS();
 | 
					void initializeSPIFFS();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@
 | 
				
			|||||||
#define UPLOAD_TIMEOUT_MS 60000  // 60 Sekunden Timeout für den gesamten Upload
 | 
					#define UPLOAD_TIMEOUT_MS 60000  // 60 Sekunden Timeout für den gesamten Upload
 | 
				
			||||||
#define CHUNK_RESPONSE_TIMEOUT_MS 10000  // 10 Sekunden Timeout pro Chunk
 | 
					#define CHUNK_RESPONSE_TIMEOUT_MS 10000  // 10 Sekunden Timeout pro Chunk
 | 
				
			||||||
#define MAX_FAILED_CHUNKS 3  // Maximale Anzahl fehlgeschlagener Chunks bevor Abbruch
 | 
					#define MAX_FAILED_CHUNKS 3  // Maximale Anzahl fehlgeschlagener Chunks bevor Abbruch
 | 
				
			||||||
#define MAX_FILE_SIZE 4000000    // 4MB Limit
 | 
					#define MAX_FILE_SIZE 4194304    // 4MB Limit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool tasksAreStopped = false;
 | 
					static bool tasksAreStopped = false;
 | 
				
			||||||
static uint32_t lastChunkTime = 0;
 | 
					static uint32_t lastChunkTime = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,9 +8,11 @@
 | 
				
			|||||||
#include "scale.h"
 | 
					#include "scale.h"
 | 
				
			||||||
#include "esp_task_wdt.h"
 | 
					#include "esp_task_wdt.h"
 | 
				
			||||||
#include "ota.h"
 | 
					#include "ota.h"
 | 
				
			||||||
 | 
					#include <Update.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Cache-Control Header definieren
 | 
					// Cache-Control Header definieren
 | 
				
			||||||
#define CACHE_CONTROL "max-age=31536000" // Cache für 1 Jahr
 | 
					#define CACHE_CONTROL "max-age=31536000" // Cache für 1 Jahr
 | 
				
			||||||
 | 
					#define MAX_UPLOAD_SIZE 4194304  // 4MB maximale Upload-Größe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AsyncWebServer server(webserverPort);
 | 
					AsyncWebServer server(webserverPort);
 | 
				
			||||||
AsyncWebSocket ws("/ws");
 | 
					AsyncWebSocket ws("/ws");
 | 
				
			||||||
@@ -156,6 +158,10 @@ void sendAmsData(AsyncWebSocketClient *client) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void setupWebserver(AsyncWebServer &server) {
 | 
					void setupWebserver(AsyncWebServer &server) {
 | 
				
			||||||
 | 
					    // Konfiguriere Server für große Uploads
 | 
				
			||||||
 | 
					    server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){});
 | 
				
			||||||
 | 
					    server.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Lade die Spoolman-URL beim Booten
 | 
					    // Lade die Spoolman-URL beim Booten
 | 
				
			||||||
    spoolmanUrl = loadSpoolmanUrl();
 | 
					    spoolmanUrl = loadSpoolmanUrl();
 | 
				
			||||||
    Serial.print("Geladene Spoolman-URL: ");
 | 
					    Serial.print("Geladene Spoolman-URL: ");
 | 
				
			||||||
@@ -338,28 +344,72 @@ void setupWebserver(AsyncWebServer &server) {
 | 
				
			|||||||
        Serial.println("RFID.js gesendet");
 | 
					        Serial.println("RFID.js gesendet");
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Route for Firmware Update
 | 
					    // Vereinfachter Update-Handler
 | 
				
			||||||
    server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest *request) {
 | 
					    server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest *request) {
 | 
				
			||||||
        // During OTA, reduce memory usage
 | 
					 | 
				
			||||||
        ws.enable(false);  // Temporarily disable WebSocket
 | 
					 | 
				
			||||||
        ws.cleanupClients();
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        Serial.println("Request for /upgrade received");
 | 
					 | 
				
			||||||
        AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/upgrade.html.gz", "text/html");
 | 
					        AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/upgrade.html.gz", "text/html");
 | 
				
			||||||
        response->addHeader("Content-Encoding", "gzip");
 | 
					        response->addHeader("Content-Encoding", "gzip");
 | 
				
			||||||
        response->addHeader("Cache-Control", CACHE_CONTROL);
 | 
					        response->addHeader("Cache-Control", "no-store");
 | 
				
			||||||
        request->send(response);
 | 
					        request->send(response);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Update-Handler mit verbesserter Fehlerbehandlung
 | 
				
			||||||
    server.on("/update", HTTP_POST, 
 | 
					    server.on("/update", HTTP_POST, 
 | 
				
			||||||
        [](AsyncWebServerRequest *request) {
 | 
					        [](AsyncWebServerRequest *request) {
 | 
				
			||||||
            // The response will be sent from handleOTAUpload when the upload is complete
 | 
					            // Nach Update-Abschluss
 | 
				
			||||||
 | 
					            bool success = !Update.hasError();
 | 
				
			||||||
 | 
					            AsyncWebServerResponse *response = request->beginResponse(
 | 
				
			||||||
 | 
					                success ? 200 : 400,
 | 
				
			||||||
 | 
					                "application/json",
 | 
				
			||||||
 | 
					                success ? "{\"success\":true,\"message\":\"Update successful\"}" 
 | 
				
			||||||
 | 
					                       : "{\"success\":false,\"message\":\"Update failed\"}"
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            response->addHeader("Connection", "close");
 | 
				
			||||||
 | 
					            request->send(response);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if (success) {
 | 
				
			||||||
 | 
					                delay(500);
 | 
				
			||||||
 | 
					                ESP.restart();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
 | 
					        [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
 | 
				
			||||||
            // Free memory before handling update
 | 
					            static size_t updateSize = 0;
 | 
				
			||||||
            ws.enable(false);
 | 
					            static int command = 0;
 | 
				
			||||||
            ws.cleanupClients();
 | 
					
 | 
				
			||||||
            handleOTAUpload(request, filename, index, data, len, final);
 | 
					            if (!index) {
 | 
				
			||||||
 | 
					                updateSize = request->contentLength();
 | 
				
			||||||
 | 
					                command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH;
 | 
				
			||||||
 | 
					                Serial.printf("Update Start: %s\nSize: %u\nCommand: %d\n", filename.c_str(), updateSize, command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!Update.begin(updateSize, command)) {
 | 
				
			||||||
 | 
					                    Serial.printf("Update Begin Error: ");
 | 
				
			||||||
 | 
					                    Update.printError(Serial);
 | 
				
			||||||
 | 
					                    String errorMsg = String("Update begin failed: ") + Update.errorString();
 | 
				
			||||||
 | 
					                    request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (len) {
 | 
				
			||||||
 | 
					                if (Update.write(data, len) != len) {
 | 
				
			||||||
 | 
					                    Serial.printf("Update Write Error: ");
 | 
				
			||||||
 | 
					                    Update.printError(Serial);
 | 
				
			||||||
 | 
					                    String errorMsg = String("Write failed: ") + Update.errorString();
 | 
				
			||||||
 | 
					                    request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Serial.printf("Progress: %u/%u\r", index + len, updateSize);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (final) {
 | 
				
			||||||
 | 
					                if (!Update.end(true)) {
 | 
				
			||||||
 | 
					                    Serial.printf("Update End Error: ");
 | 
				
			||||||
 | 
					                    Update.printError(Serial);
 | 
				
			||||||
 | 
					                    String errorMsg = String("Update end failed: ") + Update.errorString();
 | 
				
			||||||
 | 
					                    request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Serial.printf("\nUpdate Success: %uB\n", index+len);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -379,3 +429,23 @@ void setupWebserver(AsyncWebServer &server) {
 | 
				
			|||||||
    server.begin();
 | 
					    server.begin();
 | 
				
			||||||
    Serial.println("Webserver gestartet");
 | 
					    Serial.println("Webserver gestartet");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Upload-Handler für alle Datei-Uploads
 | 
				
			||||||
 | 
					void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
 | 
				
			||||||
 | 
					    if (!filename.endsWith(".bin")) {
 | 
				
			||||||
 | 
					        request->send(400, "application/json", "{\"success\":false,\"message\":\"Invalid file type\"}");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (request->url() == "/update") {
 | 
				
			||||||
 | 
					        handleOTAUpload(request, filename, index, data, len, final);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Body-Handler für große Anfragen
 | 
				
			||||||
 | 
					void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {
 | 
				
			||||||
 | 
					    // Handler für große POST-Anfragen
 | 
				
			||||||
 | 
					    if (total > MAX_UPLOAD_SIZE) {
 | 
				
			||||||
 | 
					        request->send(413, "application/json", "{\"success\":false,\"message\":\"File too large\"}");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,8 +6,8 @@
 | 
				
			|||||||
#include "commonFS.h"
 | 
					#include "commonFS.h"
 | 
				
			||||||
#include "api.h"
 | 
					#include "api.h"
 | 
				
			||||||
#include <ArduinoJson.h>
 | 
					#include <ArduinoJson.h>
 | 
				
			||||||
#include <ESPAsyncWebServer.h>
 | 
					#include <Update.h>
 | 
				
			||||||
#include <AsyncWebSocket.h>
 | 
					#include <AsyncTCP.h>
 | 
				
			||||||
#include "bambu.h"
 | 
					#include "bambu.h"
 | 
				
			||||||
#include "nfc.h"
 | 
					#include "nfc.h"
 | 
				
			||||||
#include "scale.h"
 | 
					#include "scale.h"
 | 
				
			||||||
@@ -17,7 +17,13 @@ extern String spoolmanUrl;
 | 
				
			|||||||
extern AsyncWebServer server;
 | 
					extern AsyncWebServer server;
 | 
				
			||||||
extern AsyncWebSocket ws;
 | 
					extern AsyncWebSocket ws;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Server-Initialisierung und Handler
 | 
				
			||||||
 | 
					void initWebServer();
 | 
				
			||||||
 | 
					void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final);
 | 
				
			||||||
 | 
					void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total);
 | 
				
			||||||
void setupWebserver(AsyncWebServer &server);
 | 
					void setupWebserver(AsyncWebServer &server);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WebSocket-Funktionen
 | 
				
			||||||
void sendAmsData(AsyncWebSocketClient *client);
 | 
					void sendAmsData(AsyncWebSocketClient *client);
 | 
				
			||||||
void sendNfcData(AsyncWebSocketClient *client);
 | 
					void sendNfcData(AsyncWebSocketClient *client);
 | 
				
			||||||
void foundNfcTag(AsyncWebSocketClient *client, uint8_t success);
 | 
					void foundNfcTag(AsyncWebSocketClient *client, uint8_t success);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ bool wm_nonblocking = false;
 | 
				
			|||||||
void initWiFi() {
 | 
					void initWiFi() {
 | 
				
			||||||
    WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
 | 
					    WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
 | 
				
			||||||
    WiFi.setSleep(false); // disable sleep mode
 | 
					    WiFi.setSleep(false); // disable sleep mode
 | 
				
			||||||
 | 
					    esp_wifi_set_ps(WIFI_PS_NONE);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
    //esp_wifi_set_max_tx_power(72); // Setze maximale Sendeleistung auf 20dBm
 | 
					    //esp_wifi_set_max_tx_power(72); // Setze maximale Sendeleistung auf 20dBm
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user