Skip to content

Commit

Permalink
Merge pull request #28 from lovyan03/develop
Browse files Browse the repository at this point in the history
0.1.16
  • Loading branch information
lovyan03 authored Jul 22, 2020
2 parents 8ca789e + cdd0107 commit c1877bc
Show file tree
Hide file tree
Showing 19 changed files with 322 additions and 151 deletions.
81 changes: 60 additions & 21 deletions examples/HowToUse/2_spi_setting/2_spi_setting.ino
Original file line number Diff line number Diff line change
@@ -1,34 +1,48 @@
// How to set up the SPI with LovyanGFX
// LovyanGFX SPIバスおよび使用パネルの設定を伴う使い方

// ヘッダをincludeします。
#include <LovyanGFX.hpp>

#include <LovyanGFX.hpp>

// SPI設定用の構造体を用意します。
// 構造体の名称 "LGFX_Config" は変更しても構いませんが、
// 構造体の各メンバ変数の名前と型は例の通りにしてください。
// Create a structure for SPI configuration
// SPI設定用の構造体を作成します。

// for ESP32
struct LGFX_Config
{
// You can change the name of the structure from "LGFX_Config"
// But do not change the name and type of the members.
// 構造体の名称 "LGFX_Config" は変更しても構いませんが、
// 構造体の各メンバ変数の名前と型は例の通りにしてください。

// Select the type of SPI (VSPI_HOST or HSPI_HOST)
// 使用するSPIを VSPI_HOST または HSPI_HOST で設定します。
static constexpr spi_host_device_t spi_host = VSPI_HOST;

// Set the DMA channel number (1 or 2)
// If you don't want to use DMA, omit it or set it to 0.
// 使用するDMAチャンネルを 1か2で設定します。
// 使用しない場合は省略するか0を設定します。
static constexpr int dma_channel = 1;

// Set the SPI SCLK pin number
// SPIのSCLKのピン番号を設定します。
static constexpr int spi_sclk = 18;

// Set the SPI MOSI pin number
// SPIのMOSIのピン番号を設定します。
static constexpr int spi_mosi = 23;

// Set the SPI MISO pin number
// If you share the SPI bus with an SD card, be sure to set up MISO as well.
// If you don't want to use MISO, omit it or set it to -1.
// SPIのMISOのピン番号を設定します。
// SDカード等と共通のSPIバスを使う場合はMISOも必ず設定してください。
// 使わない場合は省略するか-1を設定します。
static constexpr int spi_miso = 19;

// Set the data length of SPI communication.
// If you want to use the LCD for RPi, set it to 16.
// SPI通信のデータ長を指定します。
// RaspberryPi用のLCD等を使用する場合に16を指定します。
// 省略時は 8 です。大抵のパネルは8ですので、基本的には省略してください。
Expand All @@ -40,7 +54,7 @@ struct LGFX_Config
struct LGFX_Config
{
// 使用するSPIのSERCOM番号を設定します。
static constexpr int sercom_index = 7;
static constexpr int sercom_index = 5;
// SERCOMのクロックソースを設定します。
// -1を指定した場合、クロックソースを設定せずに動作しますので別途設定を行ってください。
Expand All @@ -49,21 +63,24 @@ struct LGFX_Config
// 上記で設定したクロックソースの動作周波数を設定します。
// Harmony等で行った設定値をそのまま設定してください。
static constexpr int sercom_clkfreq = 120000000;
//static constexpr int sercom_clkfreq = F_CPU; // Seeeduino環境ではF_CPU定数でCPUクロック値が利用できます。
// SAMD51でのピン番号の設定はArduino向けの番号ではなく、SAMD51のポート+ピン番号で設定します。
// SPIのSCLKのピン番号を設定します。 PORTA=0x000 / PORTB=0x100 / PORTC=0x200 / PORTD=0x300…
static constexpr int spi_sclk = 0x0100 | 20; // PORTB 20 (PORTB=0x0100)
static constexpr int spi_sclk = 0x0100 | 3; // PORTB 3 (PORTB=0x0100)
// SPIのMOSIのピン番号を設定します。
static constexpr int spi_mosi = 0x0100 | 19; // PORTB 19 (PORTB=0x0100)
static constexpr int spi_mosi = 0x0100 | 2; // PORTB 2 (PORTB=0x0100)
// SPIのMISOのピン番号を設定します。
static constexpr int spi_miso = 0x0100 | 18; // PORTB 18 (PORTB=0x0100)
static constexpr int spi_miso = 0x0100 | 0; // PORTB 0 (PORTB=0x0100)
// SPIで使用するTX Padを設定します。
static constexpr SercomSpiTXPad pad_mosi = SPI_PAD_3_SCK_1; // PAD_SPI3_TX;
static constexpr SercomSpiTXPad pad_mosi = SPI_PAD_0_SCK_1; // PAD_SPI0_TX;
// SPIで使用するRX Padを設定します。
static constexpr SercomRXPad pad_miso = SERCOM_RX_PAD_2; // PAD_SPI3_RX;
static constexpr SercomRXPad pad_miso = SERCOM_RX_PAD_2; // PAD_SPI0_RX;
// SPI通信のデータ長を指定します。
// RaspberryPi用のLCD等を使用する場合に16を指定します。
Expand All @@ -72,11 +89,12 @@ struct LGFX_Config
};
//*/


// Create an LGFX_SPI instance with the configuration structure you just created as a template argument.
// 用意した設定用の構造体を、LGFX_SPIクラスにテンプレート引数として設定し、インスタンスを作成します。
static lgfx::LGFX_SPI<LGFX_Config> lcd;


// Create an instance of the Panel class. Comment out the description of the panel you want to use.
// Panelクラスのインスタンスを作成します。使用するパネルにあった記述をコメントアウトしてください。
//static lgfx::Panel_HX8357B panel;
//static lgfx::Panel_HX8357D panel;
Expand All @@ -93,102 +111,123 @@ static lgfx::Panel_ILI9342 panel;

void setup(void)
{

// Assign various setting values to the panel class.
// パネルクラスに各種設定値を代入していきます。
// (LCD一体型製品のパネルクラスを選択した場合は、
// 製品に合った初期値が設定されているので設定は不要です)

// Set the SPI clock for normal write operation.
// 通常動作時のSPIクロックを設定します。
// ESP32のSPIは80MHzを整数で割った値のみ使用可能です。
// 設定した値に一番近い設定可能な値が使用されます。
panel.freq_write = 20000000;

// Set the SPI clock for fill write operation.
// It may work even if you set the clock higher than freq_write.
// 単色の塗り潰し処理時のSPIクロックを設定します。
// 基本的にはfreq_writeと同じ値を設定しますが、
// より高い値を設定しても動作する場合があります。
panel.freq_fill = 27000000;

// Set the SPI clock for read operation.
// LCDから画素データを読取る際のSPIクロックを設定します。
panel.freq_read = 16000000;

// Set the SPI mode. (0~3)
// SPI通信モードを0~3から設定します。
panel.spi_mode = 0;

// Set the SPI mode when read operation. (0~3)
// データ読み取り時のSPI通信モードを0~3から設定します。
panel.spi_mode_read = 0;

// Sets the number of dummy bits for pixel readout.
// 画素読出し時のダミービット数を設定します。
// 画素読出しでビットずれが起きる場合に調整してください。
panel.len_dummy_read_pixel = 8;

// データの読取りが可能なパネルの場合はtrueを、不可の場合はfalseを設定します。
// Set the readability of the data. If reading of the data is not possible, set false.
// データの読取りの可否を設定します。読取り不可の場合はfalseを設定します。
// ※ CSピンのないST7789等はfalseにしてください。
// 省略時はtrueになります。
panel.spi_read = true;

// Set to "true" for a panel that uses MOSI pins to read data.
// データの読取りMOSIピンで行うパネルの場合はtrueを設定します。
// 省略時はfalseになります。
panel.spi_3wire = false;

// Set the SPI CS pin number.
// LCDのCSを接続したピン番号を設定します。
// 使わない場合は省略するか-1を設定します。
panel.spi_cs = 14;

// LCDのDCを接続したピン番号を設定します。
// Set the SPI D/C pin number.
// LCDのD/Cを接続したピン番号を設定します。
panel.spi_dc = 27;

// Set the reset pin number.
// LCDのRSTを接続したピン番号を設定します。
// 使わない場合は省略するか-1を設定します。
panel.gpio_rst = 33;

// Set the backlight pin number.
// LCDのバックライトを接続したピン番号を設定します。
// 使わない場合は省略するか-1を設定します。
panel.gpio_bl = 32;

// Set the backlight control PWM channel number.
// バックライト使用時、輝度制御に使用するPWMチャンネル番号を設定します。
// PWM輝度制御を使わない場合は省略するか-1を設定します。
panel.pwm_ch_bl = 7;

// Set the backlight level (rue=turns on HIGH / false=turns on LOW)
// バックライト点灯時の出力レベルがローかハイかを設定します。
// 省略時は true。true=HIGHで点灯 / false=LOWで点灯になります。
panel.backlight_level = true;

// Set the panel color inversion.
// invertDisplayの初期値を設定します。trueを設定すると反転します。
// 省略時は false。画面の色が反転している場合は設定を変更してください。
panel.invert = false;

// Set the RGB/BGR color order.
// パネルの色順がを設定します。 RGB=true / BGR=false
// 省略時はfalse。赤と青が入れ替わっている場合は設定を変更してください。
panel.rgb_order = false;

// LCDコントローラのメモリ上のピクセル数(幅と高さ)を設定します。
// Set the internal memory size of the LCD driver.
// LCDドライバチップ内のメモリサイズ(幅と高さ)を設定します。
// 設定が合っていない場合、setRotationを使用した際の座標がずれます。
// (例:ST7735は 132x162 / 128x160 / 132x132 の3通りが存在します)
panel.memory_width = 320;
panel.memory_height = 240;

// Set the size of the pixels that can be displayed on the LCD panel.
// パネルが実際に表示可能なピクセル数(幅と高さ)を設定します。
// 省略時はパネルクラスのデフォルト値が使用されます。
panel.panel_width = 320;
panel.panel_height = 240;

// Set the number of offset pixels.
// パネルのオフセット量を設定します。
// 省略時はパネルクラスのデフォルト値が使用されます。
panel.offset_x = 0;
panel.offset_y = 0;

// Set the default rotation number.
// setRotationの初期化直後の値を設定します。
panel.rotation = 0;

// Set the number of rotation offset number.
// setRotationを使用した時の向きを変更したい場合、offset_rotationを設定します。
// setRotation(0)での向きを 1の時の向きにしたい場合、 1を設定します。
panel.offset_rotation = 0;


// 設定を終えたら、LGFXのsetPanel関数でパネルのポインタを渡します
// After setting up, you can pass the panel pointer to the lcd.setPanel function.
// 設定を終えたら、lcdのsetPanel関数でパネルのポインタを渡します
lcd.setPanel(&panel);

// SPIバスの初期化とパネルの初期化を実行すると使用可能になります。
// Initializing the SPI bus and panel will make it available.
// SPIバスとパネルの初期化を実行すると使用可能になります。
lcd.init();


Expand Down
40 changes: 37 additions & 3 deletions examples/Sprite/CollisionCircles/CollisionCircles.ino
Original file line number Diff line number Diff line change
Expand Up @@ -243,17 +243,51 @@ void setup(void)
lcd.begin();
lcd.setBrightness(160);
lcd.startWrite();
if (lcd.width() < lcd.height()) lcd.setRotation(lcd.getRotation() ^ 1);

auto lcd_width = lcd.width();
auto lcd_height = lcd.height();

for (std::uint32_t i = 0; i < 2; ++i)
{
_sprites[i].setColorDepth(8);
_sprites[i].createSprite(lcd_width, lcd_height);
_sprites[i].setTextSize(2);
_sprites[i].setTextFont(&fonts::Font0);
_sprites[i].setColorDepth(8);
}

bool fail = false;
for (std::uint32_t i = 0; !fail && i < 2; ++i)
{
fail = !_sprites[i].createSprite(lcd_width, lcd_height);
}

if (fail)
{
fail = false;
for (std::uint32_t i = 0; !fail && i < 2; ++i)
{
_sprites[i].setPsram(true);
fail = !_sprites[i].createSprite(lcd_width, lcd_height);
}

if (fail)
{
fail = false;
if (lcd_width > 320) lcd_width = 320;
if (lcd_height > 240) lcd_height = 240;

for (std::uint32_t i = 0; !fail && i < 2; ++i)
{
_sprites[i].setPsram(true);
fail = !_sprites[i].createSprite(lcd_width, lcd_height);
}
if (fail)
{
lcd.print("createSprite fail...");
delay(3000);
}
}
}

_width = lcd_width << SHIFTSIZE;
_height = lcd_height << SHIFTSIZE;

Expand Down
27 changes: 19 additions & 8 deletions examples/Sprite/MovingCircles/MovingCircles.ino
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ static int_fast16_t sprite_height;

void setup(void)
{
lcd.init();

#if defined(ARDUINO_M5Stick_C)
AXP192 axp;
axp.begin();
#endif

lcd.init();

lcd_width = lcd.width();
lcd_height = lcd.height();
obj_info_t *a;
Expand All @@ -67,11 +67,22 @@ void setup(void)
a->r = 8 + (i & 0x07);
}

sprite_height = (lcd_height + 2) / 3;
for (std::uint32_t i = 0; i < 2; ++i)
{
sprites[i].createSprite(lcd_width, sprite_height);
sprites[i].setFont(&fonts::Font2);
uint32_t div = 2;
for (;;) {
sprite_height = (lcd_height + div - 1) / div;
bool fail = false;
for (std::uint32_t i = 0; !fail && i < 2; ++i)
{
sprites[i].setColorDepth(lcd.getColorDepth());
sprites[i].setFont(&fonts::Font2);
fail = !sprites[i].createSprite(lcd_width, sprite_height);
}
if (!fail) break;
for (std::uint32_t i = 0; i < 2; ++i)
{
sprites[i].deleteSprite();
}
++div;
}
lcd.startWrite();
lcd.setAddrWindow(0, 0, lcd_width, lcd_height);
Expand Down Expand Up @@ -102,7 +113,7 @@ void loop(void)
sprites[flip].setTextColor(TFT_WHITE);
sprites[flip].printf("obj:%d fps:%d", obj_count, fps);
}
std::int32_t len = sprites[flip].bufferLength() >> 1;
std::uint32_t len = sprite_height * lcd_width;
if (y + sprite_height > lcd_height) {
len = (lcd_height - y) * lcd_width;
}
Expand Down
5 changes: 1 addition & 4 deletions examples/Sprite/MovingIcons/Alert.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>

// Icon width and height
const uint16_t alertWidth = 32;
const uint16_t alertHeight = 32;

const unsigned short alert[1024] PROGMEM={
static constexpr unsigned short alert[1024] ={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0xAC66,0xEDE8,0xFE69,0xC4C6,0x2901,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xBCC6,0xFE68,0xFE68,0xFE6A,0xFE68,0xEDE8,0x18A1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
Expand Down
5 changes: 1 addition & 4 deletions examples/Sprite/MovingIcons/Close.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>

// Icon width and height
const uint16_t closeWidth = 32;
const uint16_t closeHeight = 32;

const unsigned short closeX[1024] PROGMEM={
static constexpr unsigned short closeX[1024] ={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30C3,0x4124,0x61C7,0x61C7,0x4124,0x30E3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x48E3,0xA249,0xEB8E,0xFCB2,0xFD14,0xFD75,0xFD96,0xFD34,0xFCF3,0xEBEF,0xA28A,0x4904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x58E3,0xC228,0xFC10,0xFD34,0xFE18,0xFE59,0xFE79,0xFE9A,0xFE9A,0xFE9A,0xFE9A,0xFE59,0xFD75,0xFC51,0xC28A,0x5904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
Expand Down
5 changes: 1 addition & 4 deletions examples/Sprite/MovingIcons/Info.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>

// Icon width and height
const uint16_t infoWidth = 32;
const uint16_t infoHeight = 32;

const unsigned short info[1024] PROGMEM={
static constexpr unsigned short info[1024] ={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x4A69,0x8C71,0xA514,0xBDF7,0xBDF7,0xA514,0x8C71,0x4A69,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39E7,0x9CF3,0xEF7D,0xF79E,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xF79E,0xEF7D,0x9CF3,0x39E7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
Expand Down
Loading

0 comments on commit c1877bc

Please sign in to comment.