...
MainClass jpgla;
...
LGFXili9341 display;
...
//display.drawJpg(loadjpg,sizePhoto,0,0,320,240,0,0,JPEG_DIV_NONE);
jpgla.drawJpg(loadjpg,sizePhoto);
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#define PORT 3333
#define ESP_WIFI_SSID "myssid"
//#define ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define ESP_WIFI_CHANNEL 1
#define MAX_STA_CONN 1
static const char *TAG = "wifi softAP";
#define LGFX_USE_V1
#include "LovyanGFX.hpp"
#define LGFX_AUTODETECT
#include "LGFX_AUTODETECT.hpp"
#include "MainClass.h"
MainClass jpgla;
class LGFXili9341 : public lgfx::LGFX_Device
{
lgfx::Panel_ILI9341 _panel_instance;
lgfx::Bus_SPI _bus_instance; // for SPI bus instance
lgfx::Light_PWM _light_instance; // for backlight control
public:
LGFXili9341(void)
{
{
// config. of the SPI bus
auto cfg = _bus_instance.config();
cfg.spi_host = SPI2_HOST; // or SPI3_HOST used to be VSPI_HOST or HSPI_HOST for ESP32
cfg.spi_mode = 0; // SPI mode
cfg.freq_write = 40000000; // SPI clock for sending (max. 80MHz) should be divisible 80MHz
cfg.freq_read = 16000000; // SPI clock for receiving
cfg.spi_3wire = false; // true if signals are received at MOSI pin
cfg.use_lock = true; // true if transaction-lock is used
cfg.dma_channel = SPI_DMA_CH_AUTO; // DMA channel (0=w/o DMA / 1=1ch / 2=2ch / SPI_DMA_CH_AUTO)
// should be SPI_DMA_CH_Auto for the latest ESP-IDF
cfg.pin_miso = -1; // pin no. for MISO / SDO (-1 = disable)
cfg.pin_sclk = 18; // pin no. for SCLK
cfg.pin_mosi = 19; // pin no. for MOSI / SDI
cfg.pin_dc = 23; // pin no. for D/C (-1 = disable)
_bus_instance.config(cfg); // config. values to the bus
_panel_instance.setBus(&_bus_instance); //set the bus to the panel
}
{
// config. of the panel
auto cfg = _panel_instance.config();
cfg.pin_rst = 5; // pin no. for RST (-1 = disable)
cfg.pin_cs = 33; // pin no. for CS (-1 = disable)
cfg.pin_busy = -1; // pin no. for BUSY (-1 = disable)
// for the following settings, if not sure, comment it out
cfg.memory_width = 240;
cfg.memory_height = 320;
cfg.panel_width = 240;
cfg.panel_height = 320;
cfg.offset_x = 0;
cfg.offset_y = 0;
cfg.offset_rotation = 0; // 0-7 (upside down for 4-7)
cfg.dummy_read_pixel = 8; // no. of bits of dummy read before reading pixels
cfg.dummy_read_bits = 1;
cfg.readable = true;
cfg.invert = false;
cfg.rgb_order = false;
cfg.dlen_16bit = false;
cfg.bus_shared = true;
_panel_instance.config(cfg);
}
{
// config. of backlight
auto cfg = _light_instance.config();
cfg.pin_bl = 26; // pin no. for backlight
cfg.invert = false;
cfg.freq = 44100; // PWM freq. for backlight
cfg.pwm_channel = 7; // channel no. for the backlight PWM
_light_instance.config(cfg);
_panel_instance.setLight(&_light_instance);
}
setPanel(&_panel_instance);
}
};
LGFXili9341 display;
//LGFX lcd;
#include "cam-data.h"
struct_message myData;
int sizePhoto = 0;
int nPackageTotal = 0;
int nPackageReceived = 0;
uint8_t* loadjpg;
int sizeReceivingPackage = sizePackage;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
nPackageReceived++;
// Note: packages may not come in order.
// ToDo: consider the case the next DATATYPE_N_PACKAGE coming before the last
if (myData.dataType == DATATYPE_N_PACKAGE){
sizePhoto = (myData.data[0] << 8) + myData.data[1];
nPackageTotal = sizePhoto / sizePackage + 2;
nPackageReceived = 1;
ESP_LOGI(TAG, "size of Photo: %d bytes", sizePhoto);
heap_caps_free(loadjpg);
loadjpg = (uint8_t*) heap_caps_malloc(sizePhoto, MALLOC_CAP_DEFAULT);
} else if (myData.dataType == DATATYPE_DATA){
if ( myData.packageNo < nPackageTotal) {
sizeReceivingPackage = sizePackage;
} else {
sizeReceivingPackage = sizePhoto - (nPackageTotal-2)*sizePackage;
}
ESP_LOGD(TAG, "received %dth package", myData.packageNo);
memcpy( &loadjpg[(myData.packageNo-2)*sizePackage], myData.data,
sizeReceivingPackage );
}
if (nPackageReceived == nPackageTotal){
ESP_LOGI(TAG, "received all the packages");
ESP_LOG_BUFFER_HEXDUMP(TAG, loadjpg, sizePhoto, ESP_LOG_DEBUG);
//display.drawJpg(loadjpg,sizePhoto,0,0,320,240,0,0,JPEG_DIV_NONE);
jpgla.drawJpg(loadjpg,sizePhoto);
}
}
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_id == WIFI_EVENT_AP_STACONNECTED) {
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
ESP_LOGI(TAG, "station " MACSTR " join, AID=%d",
MAC2STR(event->mac), event->aid);
} else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
ESP_LOGI(TAG, "station " MACSTR " leave, AID=%d",
MAC2STR(event->mac), event->aid);
}
}
void wifi_init_softap(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_ap();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
NULL));
wifi_config_t wifi_config = {};
strcpy( (char*)wifi_config.ap.ssid, ESP_WIFI_SSID);
wifi_config.ap.ssid_len = strlen(ESP_WIFI_SSID);
wifi_config.ap.channel = ESP_WIFI_CHANNEL;
wifi_config.ap.max_connection = MAX_STA_CONN;
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s channel:%d",
ESP_WIFI_SSID, ESP_WIFI_CHANNEL);
uint8_t rx_buffer[sizePackage+2];
int addr_family = AF_INET;
int ip_protocol = IPPROTO_IP;
struct sockaddr_in6 dest_addr;
while (1) {
struct sockaddr_in *dest_addr_ip4 = (struct sockaddr_in *)&dest_addr;
dest_addr_ip4->sin_addr.s_addr = htonl(INADDR_ANY);
dest_addr_ip4->sin_family = AF_INET;
dest_addr_ip4->sin_port = htons(PORT);
int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
if (sock < 0) {
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Socket created");
int err = bind(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
if (err < 0) {
ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno);
}
ESP_LOGI(TAG, "Socket bound, port %d", PORT);
while (1) {
ESP_LOGI(TAG, "Waiting for data");
int len = recv(sock, rx_buffer, sizeof(rx_buffer), 0);
if (len < 0) {
ESP_LOGE(TAG, "recvfrom failed: errno %d", errno);
break;
}
// Data received
else {
ESP_LOGI(TAG, "Received %d bytes", len);
OnDataRecv(NULL, rx_buffer, len);
}
}
if (sock != -1) {
ESP_LOGE(TAG, "Shutting down socket and restarting...");
shutdown(sock, 0);
close(sock);
}
}
}
extern "C" {
void app_main(void)
{
//Initialize NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
display.init();
display.begin();
display.setRotation(1);
display.setBrightness(255);
display.setColorDepth(24);
display.clear();
display.setCursor(10,10);
display.print("Hello LovyanGFX!");
jpgla.setup(&display);
display.startWrite();
/*
lcd.init();
lcd.begin();
lcd.setRotation(0);
if (lcd.width() < lcd.height())
lcd.setRotation(1);
lcd.setFont(&fonts::Font2);
lcd.println("WiFi begin.");
jpgla.setup(&lcd);
lcd.startWrite();
*/
ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
wifi_init_softap();
}
}
素晴らしいライブラリ、ありがとうございます。
さて高速化のために、lovyanGFXのdrawJpgをM5Stack_JpgLoopAnimeのdrawJpgに
置き換えてみたのですが、表示される画像が色付き砂嵐になります。
置き換え前は、きれいに画像が表示されてました。
どこが悪いか、お知らせいただけませんでしょうか。
以下のソースコード全体のうち、
置き換えした部分を抜きだすと、次のようになります。