Skip to content

Works with drawJpg of lovyanGFX but not with drawJpg of M5Stack_JpgLoopAnime #3

@genisgen

Description

@genisgen

素晴らしいライブラリ、ありがとうございます。

さて高速化のために、lovyanGFXのdrawJpgをM5Stack_JpgLoopAnimeのdrawJpgに
置き換えてみたのですが、表示される画像が色付き砂嵐になります。
置き換え前は、きれいに画像が表示されてました。
どこが悪いか、お知らせいただけませんでしょうか。

以下のソースコード全体のうち、
置き換えした部分を抜きだすと、次のようになります。

...
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();

}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions