zhuhai-esp / LuatOS-C3-Video-Cast

ESP32-C3 LuatOS Board TFT Video Cast
19 stars 8 forks source link

Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway. #1

Open modi12jin opened 2 years ago

modi12jin commented 2 years ago

@huzongyao I have this problem on ubuntu22.04

截图 2022-10-21

Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.

截图 2022-10-22

modi12jin commented 2 years ago

ESP32S3_TCP-Video.ino

#include <TJpg_Decoder.h>
#include <WiFi.h>
#include "LovyanGFX_Driver.h"

#define TZ 8            // 中国时区为8
#define DST_MN 0        // 默认为0
#define TZ_MN ((TZ)*60) //时间换算
#define TZ_SEC ((TZ)*3600)
#define DST_SEC ((DST_MN)*60)

LGFX tft;
char buf[32] = {0};
unsigned long lastMs = 0;
long check1s = 0;
int serverPort = 8888;
WiFiServer server(serverPort);
u8_t *netBuf = NULL;
u8_t *bufEnd = NULL;
int tftSize = tft.width() * tft.height();
int bufSize = tftSize * 10;

void inline autoConfigWifi() {
  WiFi.mode(WIFI_MODE_STA);
  WiFi.begin();
  for (int i = 0; WiFi.status() != WL_CONNECTED && i < 100; i++) {
    delay(100);
  }
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.mode(WIFI_MODE_APSTA);
    WiFi.beginSmartConfig();
    while (WiFi.status() != WL_CONNECTED) {
      delay(100);
    }
    WiFi.stopSmartConfig();
    WiFi.mode(WIFI_MODE_STA);
  }
}

bool onJpgDecoded(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bmp) {
  for (int i = 0; i < w * h; i++) {
    u16_t code = bmp[i];
    bmp[i] = (code >> 8 | code << 8);
  }

  if (tft.getStartCount() == 0) {
    tft.endWrite();
  }
  tft.pushImageDMA(x, y, w, h, (lgfx::rgb565_t *)bmp);  

  return true;
}

void setup() {
  disableCore0WDT();
  Serial.begin(115200);
  Serial.println("Hello ESP32S3!!");
  tft.init();
  tft.initDMA();
  tft.startWrite();  
  tft.println("Start Config WiFi!");  
  autoConfigWifi();
  tft.println("Wifi Connected!");
  String ip = WiFi.localIP().toString();
  sprintf(buf, "%s:%d", ip.c_str(), serverPort);
  tft.println(buf);
  configTime(TZ_SEC, DST_SEC, "ntp.ntsc.ac.cn", "ntp1.aliyun.com");
  delay(2000);
  server.begin();
  netBuf = (u8_t *)malloc(bufSize);
  bufEnd = netBuf + bufSize;
  TJpgDec.setCallback(onJpgDecoded);
}

void inline readTCPJpeg() {
  WiFiClient client = server.available();
  if (client) {
    u8_t *pRead = netBuf;
    u8_t *pDecode = netBuf;
    while (client.connected()) {
      if (client.available()) {
        int capable = bufEnd - pRead;
        int batch = client.read(pRead, capable);
        if (batch == capable) {
          int copySize = bufEnd - pDecode;
          memcpy(netBuf, pDecode, copySize);
          pDecode = netBuf;
          pRead = netBuf + copySize;
        } else {
          pRead += batch;
        }
        if (pRead - pDecode > 1) {
          u8_t *pTail = pDecode;
          for (u8_t *p = pDecode; p < pRead - 1; p++) {
            u8_t *pFEnd = p + 1;
            u8_t *pFNext = p + 2;
            if ((*p) == 0xff && (*pFEnd) == 0xd9) {
              TJpgDec.drawJpg(0, 0, pTail, pFNext - pTail);
              pTail = pFNext;
            }
          }
          pDecode = pTail;
        }
      }
    }
  }
}

void loop() { readTCPJpeg(); }

LovyanGFX_Driver.h

#define LGFX_USE_V1
#include <LovyanGFX.hpp>

class LGFX : public lgfx::LGFX_Device {

  lgfx::Panel_ST7796 _panel_instance;

  lgfx::Bus_Parallel8 _bus_instance;

  lgfx::Light_PWM _light_instance;

public:
  LGFX(void) {
    {
      auto cfg = _bus_instance.config();

      cfg.port = 0;
      cfg.freq_write = 20000000;
      cfg.pin_wr = 47;  // WR を接続しているピン番号
      cfg.pin_rd = -1;  // RD を接続しているピン番号
      cfg.pin_rs = 0;   // RS(D/C)を接続しているピン番号
      cfg.pin_d0 = 9;   // D0を接続しているピン番号
      cfg.pin_d1 = 46;  // D1を接続しているピン番号
      cfg.pin_d2 = 3;   // D2を接続しているピン番号
      cfg.pin_d3 = 8;   // D3を接続しているピン番号
      cfg.pin_d4 = 18;  // D4を接続しているピン番号
      cfg.pin_d5 = 17;  // D5を接続しているピン番号
      cfg.pin_d6 = 16;  // D6を接続しているピン番号
      cfg.pin_d7 = 15;  // D7を接続しているピン番号

      _bus_instance.config(cfg);               // 設定値をバスに反映します。
      _panel_instance.setBus(&_bus_instance);  // バスをパネルにセットします。
    }

    {                                       // 表示パネル制御の設定を行います。
      auto cfg = _panel_instance.config();  // 表示パネル設定用の構造体を取得します。

      cfg.pin_cs = -1;    // CSが接続されているピン番号   (-1 = disable)
      cfg.pin_rst = 4;    // RSTが接続されているピン番号  (-1 = disable)
      cfg.pin_busy = -1;  // BUSYが接続されているピン番号 (-1 = disable)

      // ※ 以下の設定値はパネル毎に一般的な初期値が設定さ BUSYが接続されているピン番号 (-1 = disable)れていますので、不明な項目はコメントアウトして試してみてください。

      cfg.memory_width = 320;    // ドライバICがサポートしている最大の幅
      cfg.memory_height = 480;   // ドライバICがサポートしている最大の高さ
      cfg.panel_width = 320;     // 実際に表示可能な幅
      cfg.panel_height = 480;    // 実際に表示可能な高さ
      cfg.offset_x = 0;          // パネルのX方向オフセット量
      cfg.offset_y = 0;          // パネルのY方向オフセット量
      cfg.offset_rotation = 0;   //值在旋转方向的偏移0~7(4~7是倒置的)
      cfg.dummy_read_pixel = 8;  // 在读取像素之前读取的虚拟位数
      cfg.dummy_read_bits = 1;   // 读取像素以外的数据之前的虚拟读取位数
      cfg.readable = false;      // 如果可以读取数据,则设置为 true
      cfg.invert = true;         // 如果面板的明暗反转,则设置为 true
      cfg.rgb_order = false;     // 如果面板的红色和蓝色被交换,则设置为 true
      cfg.dlen_16bit = false;    // 对于以 16 位单位发送数据长度的面板,设置为 true
      cfg.bus_shared = false;    // 如果总线与 SD 卡共享,则设置为 true(使用 drawJpgFile 等执行总线控制)

      _panel_instance.config(cfg);
    }

    {                                       // バックライト制御の設定を行います。(必要なければ削除)
      auto cfg = _light_instance.config();  // バックライト設定用の構造体を取得します。

      cfg.pin_bl = 45;      // バックライトが接続されているピン番号
      cfg.invert = false;   // バックライトの輝度を反転させる場合 true
      cfg.freq = 44100;     // バックライトのPWM周波数
      cfg.pwm_channel = 1;  // 使用するPWMのチャンネル番号

      _light_instance.config(cfg);
      _panel_instance.setLight(&_light_instance);  // バックライトをパネルにセットします。
    }

    setPanel(&_panel_instance);  // 使用するパネルをセットします。
  }
};
modi12jin commented 2 years ago

/etc/gdm3/custom.conf #WaylandEnable=false 删除这个# reboot

截图 2022-10-22

截图 2022-10-22 09-49-35

50495_1666403762_hd

@huzongyao 屏幕并没有显示动画