「LED パネルキット AKBONE2022 で動画再生」
https://qiita.com/nanbuwks/items/2d71f9a12442f91e34ec
では SD カードから動画を読み込み、LEDパネルに出力しましたが、 LovyanGFX の PC エミュレータで同様に出力してみます。
画面出力サイズ
今回は、LEDパネルのサイズにあわせて、128x64のドットのスクリーンを仮想的に作ります。PC 画面上ではそれを縦横3倍にして、出力します。
準備
「LED パネルキット AKBONE2022 で動画再生」の記事のとおりにして、128x64.rgb を用意します。
ファイルを作業ディレクトリにコピーしておきます。
また、以下の内容の pc.hpp ファイルを作り、作業ディレクトリに保存しておきます。
#define delay(msec) SDL_Delay(msec)
#include <stdint.h>
#include <stdlib.h>
#include <string>
これは Arduino スケッチで使われているインクルードファイルや、delay 関数を使えるようにするためのものです。
スケッチ
LEDパネルキット用のものを元に、以下のようにしました。
かなり簡略化できています。
冒頭に、先程作った pc.hpp を読み込ませています。
#include "pc.hpp"
// video info
#define FRAME_W 128
#define FRAME_H 64
#define FRAMEBUFF_SIZE FRAME_W*FRAME_H*2
#define FILENAME "128x64.rgb"
auto buffer = (uint8_t*)malloc(FRAMEBUFF_SIZE);
//rgb565=buffer;
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// #define PANEL_64x32
#define PANEL_128x64
#include <LGFX_AUTODETECT.hpp>
LGFX gfx ( 128,64,4 );
void setup() {
Serial.begin(115200);
//gfx.setColorDepth(8);
gfx.init();
gfx.setBrightness(128);
gfx.setColorDepth(16);
// Serial.println("setup done");
delay(1000);
}
void loop() {
char filename[50];
int size;
while (1){
sprintf(filename,FILENAME);
//Serial.print(filename);
// File fp=SD.open(filename);
// File fp=SPIFFS.open(filename, "r");
FILE *fp;
fp = fopen(filename,"r");
if (!fp){
//Serial.println("---fail----");
continue;
}
// for ( int i=1; fp.available(); i++){
for ( int i=1; !feof(fp); i++){
// size = fp.read(buffer,FRAMEBUFF_SIZE);
size = fread(buffer,1,FRAMEBUFF_SIZE,fp);
// Serial.println(String(i)+" "+String(size) + "bytes " + String(millis()) + "ms ");
gfx.pushImage(0,0,FRAME_W,FRAME_H,(uint16_t *)buffer);
delay(40);
}
//fp.close();
fclose(fp);
}
}
Serial 関数はコメントアウト、またファイル入出力は元々のものをコメントアウトして、Cのスタンダードファイル入出力関数のものを別に足しています。
ここらへんの詳しい説明は後日・・・
実行
動画が表示されました。