sd-append-esp32

nazarijtipusak080/esp32-sd-card-read-write-append/sd-append-esp32

The node allows the ESP32 controller to write files to the SD card. Data is added to existing content. IT IS IMPORTANT THAT THE FILE NAME MUST BEGIN WITH A "/" CHARACTER. OTHERWISE OPENING OR CREATING THE FILE WILL BE A NODE ERROR.
sd-append-esp32
@/sd-append-esp32
The node allows the ESP32 controller to write files to the SD card. Data is added to existing content. IT IS IMPORTANT THAT THE FILE NAME MUST BEGIN WITH A "/" CHARACTER. OTHERWISE OPENING OR CREATING THE FILE WILL BE A NODE ERROR.
CSport
CS (chip select) pin the SD card reader is connected to. Also known as SS (slave select).
FILEstring
File name to append to
LINEstring
Line to append
Wpulse
Perform file open, write, flush, close cycle
sd-append-esp32
CS
FILE
LINE
W
DONE
DONEpulse
Fires when write is done
To use the node in your project you should have the nazarijtipusak080/esp32-sd-card-read-write-append library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

#pragma XOD evaluate_on_pin disable
#pragma XOD evaluate_on_pin enable input_W
#pragma XOD error_raise enable

//{{#global}}
#include <FS.h>
#include <SD.h>
#include <SPI.h>
//{{/global}}

node {
    bool begun;

    void evaluate(Context ctx) {
        if (!isInputDirty<input_W>(ctx))
            return;

        if (!begun) {
            // Ініціалізація SPI та SD
            auto csPin = getValue<input_CS>(ctx);
            SPI.begin(18, 19, 23, csPin); // SCK, MISO, MOSI, CS
            begun = SD.begin(csPin);
        }

       if (!begun) {
            // Помилка ініціалізації
            raiseError(ctx);
            return;
        }

        // Отримання імені файлу
        char filename[16] = { 0 };
        dump(getValue<input_FILE>(ctx), filename);

        // Спроба відкрити файл для запису
        File file = SD.open(filename, FILE_APPEND);
        if (!file) {
            // Помилка відкриття файлу
           begun = false;
            raiseError(ctx);
            return;
        }

        // Запис рядка у файл
        XString line = getValue<input_LINE>(ctx);
        size_t lastWriteSize;
        for (auto it = line.iterate(); it; ++it) {
            lastWriteSize = file.print(*it);
            if (lastWriteSize == 0) {
                // Помилка запису
               begun = false;
                raiseError(ctx);
                return;
            }
        }

        // Додати новий рядок та завершити
        file.print('\n');
        file.flush();
        file.close();

        // Передати сигнал про завершення
        emitValue<output_DONE>(ctx, 1);
    }
}