• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

чтение bmp столбиками на littleFS

Junkie

Member
Здравствуйте. как известно bmp файл пишется строка за строкой начиная с нижних строк к верхним, в случае 24бит формата это будут просто данные RGB и их легко считать.

C:
        uint32_t rsiz = w * 3;
        if (rsiz % 4 != 0) rsiz += 4 - (rsiz % 4); //выравниваем размер буфера до кратных 4
        char row[rsiz];
        
        f.seek(offset, SeekSet); //переходим на начало данных
        for (int j = 0; j < h; j++)
        {
            f.readBytes(row, rsiz); //читаем всю строку
            for (int i = 0; i < w; i++) //выводим на ленту
            {
                byte bB = row[i * 3];
                byte bG = row[i * 3 + 1];
                byte bR = row[i * 3 + 2];
                led_setpx(i, bR, bG, bB);
            }
        }
Я отображаю его на адресной ленте, все работает отлично, но картинки нужно заранее поворачивать боком, что лишняя морока, теперь пробуем прочесть файл по столбикам

C:
        for (int j = 0; j < w; j++)
            {
                for (int i = 0; i < h; i++)
                {
                    if (i == 0)
                        f.seek(h.offset + i * rsiz + j * 3, SeekSet);
                    else
                        f.seek(rsiz - 3, SeekCur);
                    uint8_t color[3];
                    f.read(color, 3);
                    led_setpx(i, color[2], color[1], color[0]);
                }
            }
теперь приходится скакать по строчкам с помощью f.seek, эта функция замедляет чтение почти в два раза.

Можно ли что-то придумать? может какую-нибудь хитрую буферизацию? правда памяти у esp8266 на такое не хватит.

У кого есть идеи?

Может пока не убежали считать соседний столбик в буфер, а потом на следующем шаге пока он отрисовывает читаем уже половинку следующего столбика, и после отрисовки придется дочитать только вторую половину, но затем опять понадобится вычитать сразу два
 

pvvx

Активный участник сообщества
Чтение Flash у ESP8266 достаточно быстрое и если bmp файл писать без всяких FS, а просто в кольцевые буфера, то скорости хватит с лихвой. Тем более читать Flash можно и через кэш, обычным memcpy(), но учесть align(4) и обращение по 4 байтам (32 битным словам). Тогда и не требуется сброс кэща после каждого обращения к Flash.
Всё это не относиться к Arduino. Там тяжелые процедуры чтения/записи Flash, да и прочего.
PS: вы боритесь с чужеродной системой, не годящейся для вашей задачи.
 

pvvx

Активный участник сообщества
Максимально что можно сделать в выбранной вами среде библиотек - писать файл в FS уже построчно, в нужном формате для последовательного чтения.
 

Junkie

Member
так и подумал, начал разбирать гиф формат, но чтоб хранить раскодированные данные не хватит озу, и хотел их сложить в отдельный файл в готовом на вывод виде, потом пришла идея так же и бмп файлы перебрать и сделать файлы с нужным порядком значений, флеш памяти достаточно чтобы уместить и гору картинок и их буферные файлы.
 
Сверху Снизу