P4 LED Panel 1/32 s

that p3 64x32 and have scan 1/32s
I have some problems using this panel

panel cut in middle at panel
color must be RED become green

https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/53a9be78-c899-4656-82f2-2f72d2063595
here my code
`#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"
//************************************************************ Display Config Declaration
#define double_buffer
#define PANEL_RES_X 64  // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32  // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 2   // Total number of panels chained one to another
MatrixPanel_I2S_DMA* dma_display = nullptr;
#define FONT_SIZE 2.85 // Text will be FONT_SIZE x 8 pixels tall.
int delayBetweeenAnimations = 35; // How fast it scrolls, Smaller == faster
int scrollXMove = -1; //If positive it would scroll right
int textXPosition = PANEL_RES_X * PANEL_CHAIN;    // Number of pixels wide of each INDIVIDUAL panel module.
// Will start one pixel off screen
int textYPosition = PANEL_RES_Y / 2 - (FONT_SIZE * 8 / 2); // This will center the text
// For scrolling Text
unsigned long isAnimationDue;
String text ="Restek";
uint16_t myBLACK = dma_display->color565(0, 0, 0);
uint16_t myWHITE = dma_display->color565(255, 255, 255);
uint16_t myRED = dma_display->color565(255, 0, 0);
uint16_t myGREEN = dma_display->color565(0, 255, 0);
uint16_t myBLUE = dma_display->color565(0, 0, 255);
// Will be used in getTextBounds.
int16_t xOne, yOne;
uint16_t w, h;
void setup() {
Serial.begin(115200);
// Configurations for Display
HUB75_I2S_CFG mxconfig(
PANEL_RES_X,  // module width
PANEL_RES_Y,  // module height
PANEL_CHAIN   // Chain length
);
mxconfig.double_buff = true;
mxconfig.gpio.e = 32;
//  mxconfig.clkphase = false;
//  mxconfig.driver = HUB75_I2S_CFG::FM6124;
// Display Setup
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->begin();
dma_display->setBrightness8(255);  //0-255
dma_display->fillScreen(myBLACK);
dma_display->setTextSize(FONT_SIZE);
dma_display->setTextWrap(false); // N.B!! Don't wrap at end of line
dma_display->setTextColor(myRED); // Can change the colour here
}
void loop(){
unsigned long now = millis();
if (now > isAnimationDue)
{
// This tells the code to update the second buffer
dma_display->flipDMABuffer();
// This sets the timer for when we should scroll again.
isAnimationDue = now + delayBetweeenAnimations;

textXPosition += scrollXMove;

// Checking if the very right of the text off screen to the left
dma_display->getTextBounds(text, textXPosition, textYPosition, &xOne, &yOne, &w, &h);
if (textXPosition + w <= 0)
{
  textXPosition = dma_display->width();
}

dma_display->setCursor(textXPosition, textYPosition);

// The display has to do less updating if you only black out the area
// the text is
//dma_display->fillScreen(myBLACK);
dma_display->fillRect(0, textYPosition, dma_display->width(), FONT_SIZE * 8, myBLACK);
dma_display->print(text);

}
}`
as any one have suggest for fix this

this panel using DP5125D
please help me mr mrfaptastic

Can you test with another library as well? Like PxMatrix library.
If you have same issues then you have defective panel.
You can easily workaround the red/green issue by just swapping the pins around in the config.

actually, when I use 64x64 px, the panel can display not cutting like my video.
I've using PxMatrix and it's same
and I've read documentation of PxMatrix, that's library just for one panel
so i've don't know what I should I do for this think

https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA/issues/516
its same like this

If the label "32scan" is not a mistake, it is something completely new among the HUB75 panels.
All the panels I had to deal with had a scan factor of no more than half the height. That is, for a 64x32 matrix, the scan should be 16 or less.
Your matrix is some new type and I don’t know any libraries that support such panels.

for your information mr
my panel have led driver IC DP5125D
i tried to find datasheet but I didn't found it
once again when I use 64x64 px, the panel can display not cutting like my video
https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA/issues/516
its same like this

when i change panel Y from 32 to 64
display not cutting but it will be cutting when I define Panel Y become 32

i've try scan cordinate using this code
`#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"
//************************************************************ Display Config Declaration
#define double_buffer
#define PANEL_RES_X 64  // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32  // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 1   // Total number of panels chained one to another
MatrixPanel_I2S_DMA* dma_display = nullptr;
uint16_t myBLACK;
uint16_t myWHITE;
uint16_t myRED;
uint16_t myGREEN;
uint16_t myBLUE;
void setup() {
Serial.begin(115200);
// Configurations for Display
HUB75_I2S_CFG mxconfig(
PANEL_RES_X,  // module width
PANEL_RES_Y,  // module height
PANEL_CHAIN   // Chain length
);
mxconfig.double_buff = true;
mxconfig.gpio.e = 32;
mxconfig.clkphase = false;
// Display Setup
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->begin();
dma_display->setBrightness8(255);  //0-255
// Define colors
myBLACK = dma_display->color565(0, 0, 0);
myWHITE = dma_display->color565(255, 255, 255);
myRED = dma_display->color565(255, 0, 0);
myGREEN = dma_display->color565(0, 255, 0);
myBLUE = dma_display->color565(0, 0, 255);
// Print dot at each coordinate
for (int y = 0; y < PANEL_RES_Y; y++) {
for (int x = 0; x < PANEL_RES_X * PANEL_CHAIN; x++) {
dma_display->drawPixel(x, y, myRED);
// Print coordinates
Serial.print("(");
Serial.print(x);
Serial.print(",");
Serial.print(y);
Serial.print(") ");
delay(100); // Delay 500ms before printing the next dot
}
Serial.println(); // Move to the next line after each row
}
}
void loop() {
// Nothing here, just printing dots in setup()
}
`
here's debug

here's in visual led matrix
for red color I can fix it but for coordinate i need help
thanks

is sombody can help me
i still stuck

I am in doubt that anybody can help without having the panel for tests.
How many such panels do you have? Perhaps buying a different model could be a solution?

@board707 actualy i just wonder how to fix this code by my self but I still stuck , i can't buying for solution because it new feature led but still no code cant explain this what this happen
i need help Mr @board707
if you don't mine i will send my email to you, and we can solve it together if you don't mind

Unfortunately, I do not use ESP32 with HUB75 RGB matrices.
If you don’t have to use ESP32, we can try your panel with boards based on Pico RP2040 or STM32 controllers.

https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/63b1c265-f553-4b4e-939c-0f776665b895
i found another condition
my HUB75 have pin a,b,c,d and pin E
in another hub75 they don't have pin E
so I tried to measure the voltage in pin E there is no signal, different from the another pin a,b,c, and d have voltage 1.12v a data
I hope this data can we figure it out together

my HUB75 have pin a,b,c,d and pin E
in another hub75 they don't have pin E

There is no magic in it. It depends only on number of scan lines. Panels with 16 scans and less doesn't need a E line.

i know but my p4 led panel matrix need pin e, cause 32 scans
what I would do for this

my p4 led panel

"P4" says nothing about panel type, please be more specific and use informative labels - for example "64x32 s32 panel". And "p4" is completely unnecessary for it :)

my hub is different

There is no difference in the fact that your HUB has E pin. This is common to all 32s panels

yes i have it
this panel will full https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA/issues/516 same like this

#516
its same like this

So the panel works? What is your problem?

it cut my content display when it parallel that why I ask how can be to solve this for multi panel

not work for 64x32

Please understand that technically your panel is not a 64x32, it is a half of 64x64 panel. So you have to setup and use it as 64x64. Do not try to setup it as 64x32 - nothing will come of this.
If you need a several panels, chained horizontally, you can setup it as chain of 64x64 panels - it should work. If you need a several horizontal rows of panels - the setup is slightly different. You need to connect R0 G0 B0 lines to corresponding pins of upper row of panels, and R1 G1 B1 lines to R0 G0 B0 pins of lower row

yes that why i ask how to try it 64x32 because when I want to print something that cut even I use 64x64 and been chain panel it cause set 64x64 my panel thing is one panel not chain panel
you said about R0G0B0
can you tell me how to set up that ?

that why i ask how to try it 64x32

as 64x32 no way. use it as 64x64

even I use 64x64 and been chain panel it cause set 64x64 my panel thing is one panel not chain panel

I don't understand... Do you use a google translate?

yes i use translator app
i know its not helping but I just share my problem
I still want use 64x32 code and I try figure it out to found it
event you said 64x64 code, I think there is way to use 64x32 panel without problem and that solution is change library code
that's why I ask
thank you

I think there is way to use 64x32 panel without problem and that solution is change library code
that's why I ask

Do you expect that somebody will redesign the library for you? - as I said before, for this one at least need to have such a panel.
More realistic if you would try to edit the code yourself and then offer a PR with your changes.

However, the simplest thing is to use the panel as 64x64, as I described above. This does not require editing the library

Could you test this code with two 64x32 panels chained and show the video?
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

//************************************************************ Display Config Declaration

#define PANEL_RES_X 64  // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32  // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 2   // Total number of panels chained one to another

MatrixPanel_I2S_DMA* dma_display = nullptr;

uint16_t myBLACK;
uint16_t myWHITE;
uint16_t myRED;
uint16_t myGREEN;
uint16_t myBLUE;

void setup() {
  Serial.begin(115200);

  // Configurations for Display
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X,  // module width
    PANEL_RES_Y,  // module height
    PANEL_CHAIN   // Chain length
  );

  mxconfig.double_buff = true;
  mxconfig.gpio.e = 32;
  mxconfig.clkphase = false;

  // Display Setup
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);
  dma_display->begin();
  dma_display->setBrightness8(255);  //0-255

  // Define colors
  myBLACK = dma_display->color565(0, 0, 0);
  myWHITE = dma_display->color565(255, 255, 255);
  myRED = dma_display->color565(255, 0, 0);
  myGREEN = dma_display->color565(0, 255, 0);
  myBLUE = dma_display->color565(0, 0, 255);

  // Print dot at each coordinate
  for (int y = 0; y < PANEL_RES_Y; y++) {
    for (int x = 0; x < PANEL_RES_X * PANEL_CHAIN; x++) {
      dma_display->drawPixel(x, y, myRED);
     delay(30); // Delay 500ms before printing the next dot
    }
    Serial.println(); // Move to the next line after each row
  }
}

void loop() {
  // Nothing here, just printing dots in setup()
}

here is video
https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/f11ce173-7d83-47e6-845d-750efda85f22
something happens when the left panel should display pixels but none appear instead the one on the right appears
i don't know, When we want to display red, what appears instead is a green pixel
maybe need to set the initial value for red

Thank you

When we want to display red, what appears instead is a green pixel

Perhaps the panel just gas a color channels mixed? Did you try to output a green, red, blue?

I've tried changing colors
When I want green, blue appears instead
When I want blue, red appears instead
    #define R1_PIN_DEFAULT  25
    #define G1_PIN_DEFAULT  26
    #define B1_PIN_DEFAULT  27
    #define R2_PIN_DEFAULT  14
    #define G2_PIN_DEFAULT  12
    #define B2_PIN_DEFAULT  13

    #define A_PIN_DEFAULT   23
    #define B_PIN_DEFAULT   22
    #define C_PIN_DEFAULT   5
    #define D_PIN_DEFAULT   19
    #define E_PIN_DEFAULT   32 // IMPORTANT: Change to a valid pin if using a 64x64px panel. 32

    #define LAT_PIN_DEFAULT 21
    #define OE_PIN_DEFAULT  33
    #define CLK_PIN_DEFAULT 18

I used this pin and PIN E need request because when E still -1 that panel doesn't work
my senior use stm32 and he give me some code like this
#if MATRIX_SCANROW==MATRIX_SCANROWS_32
		row = y;
//		lines = x;

		if (x < MATRIX_PANEL_WIDTH)
		{
			lines = x;
		}
		else if (x < (MATRIX_PANEL_WIDTH * 2))
		{
			lines = (x % MATRIX_PANEL_WIDTH) + MATRIX_PANEL_WIDTH;
			busNumber = 1;
		}
		else
		{
			lines = (x % MATRIX_PANEL_WIDTH) + MATRIX_PANEL_WIDTH;
		}
#endif	//if MATRIX_SCANROW==MATRIX_SCANROWS_32

he said we need virtual matrix for this condition
and color condition change from 0b001 to 0b100 (I still didn't get it from this initial)

When I want green, blue appears instead
When I want blue, red appears instead

So your panels has a different color order, like GBR instead of RGB. It all.

he said we need virtual matrix for this condition

Virtual matrix can't resolve the pin E problem.

currently, i have 3 panels right now
https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/fa583019-5c19-4945-a32a-8f0b29f79371
I just add one panel and just change color become blue

Please chain a three panels and run the code from this post  again

result same like last video

currently, i have 3 panels right now
video4.mp4
I just add one panel and just change color become blue

I think we need a virtual matrix with double height
 HUB75_I2S_CFG mxconfig(
    PANEL_RES_X,            // DO NOT CHANGE THIS
    PANEL_RES_Y*2,            // DO NOT CHANGE THIS
    NUM_ROWS * NUM_COLS         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

and use coordinates transform something like this:
if ( coords.x & 64) {
  coords.x -= 64;
  coords.y +=32;
}

I'm sorry, I've try 3 times, the code doesn't display anything just blank
here I write code for virtual matrix which you have suggested
/* Use a custom Virtual Display class to re-map co-ordinates such that they draw
   correctly on a 32x16 1/4 Scan panel (or chain of such panels).
*/
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

/* ================================================== */
// Define custom class derived from VirtualMatrixPanel
class EightPxBasePanel : public VirtualMatrixPanel
{
  public:
    using VirtualMatrixPanel::VirtualMatrixPanel; // inherit VirtualMatrixPanel's constructor(s)

  protected:

    VirtualCoords getCoords(int16_t x, int16_t y);  // custom getCoords() method for specific pixel mapping

};

inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

if ( coords.x & 64) {
  coords.x -= 64;
  coords.y +=32;
}
}
/* ================================================== */
// Panel configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 1 // Number of INDIVIDUAL PANELS per ROW

// ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS

// Change this to your needs, for details on VirtualPanel pls read the PDF!
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_TOP_RIGHT_DOWN

// placeholder for the matrix object
MatrixPanel_I2S_DMA *dma_display = nullptr;

// placeholder for the virtual display object
EightPxBasePanel   *FourScanPanel = nullptr;

/******************************************************************************
   Setup!
 ******************************************************************************/
void setup()
{
  delay(250);

  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println("*         1/32 Scan Panel Demonstration              *");
  Serial.println("*****************************************************");

  /*
       // 62x32 1/8 Scan Panels don't have a D and E pin!

       HUB75_I2S_CFG::i2s_pins _pins = {
        R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
        A_PIN, B_PIN, C_PIN, D_PIN, E_PIN,
        LAT_PIN, OE_PIN, CLK_PIN
       };
  */
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X / 2 ,            // DO NOT CHANGE THIS
    PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
    NUM_ROWS * NUM_COLS         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

  mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right.

  //mxconfig.driver   = HUB75_I2S_CFG::FM6126A;     // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object

  // OK, now we can create our matrix object
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);

  // let's adjust default brightness to about 75%
  dma_display->setBrightness8(255);    // range is 0-255, 0 - 0%, 255 - 100%

  // Allocate memory and start DMA display
  if ( not dma_display->begin() )
    Serial.println("****** !KABOOM! I2S memory allocation failed ***********");

  dma_display->clearScreen();
  delay(500);

  // create FourScanPanellay object based on our newly created dma_display object
  FourScanPanel = new EightPxBasePanel ((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y,    VIRTUAL_MATRIX_CHAIN_TYPE);

  // THE IMPORTANT BIT BELOW!
  // FOUR_SCAN_16PX_HIGH
  // FOUR_SCAN_32PX_HIGH
// **** You don't need to set PhysicalPanelScanRate when use your own virtual panel class
  //FourScanPanel->setPhysicalPanelScanRate(FOUR_SCAN_16PX_HIGH);
}

// Test the pixel mapping - fill the panel pixel by pixel
void loop() {

  for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < FourScanPanel->width(); j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 0, 0));
      delay(30);
    }
  }

  delay(2000);
  dma_display->clearScreen();

} // end loop

hi @board707
I am so sorry to disturb you, any suggestions what should I do now?

I don't see anything incorrect in your code.
Try to change this:
 HUB75_I2S_CFG mxconfig(
    PANEL_RES_X ,            // DO NOT CHANGE THIS
    PANEL_RES_Y*2,            // DO NOT CHANGE THIS
    NUM_ROWS * NUM_COLS         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

I've tried it and the dot matrix doesn't appear, even by changing the color it doesn't appear

Could you test again your code that produce a video2 from this message https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/issues/540#issuecomment-2149701599 ?
If it still works, please show that code in full.

actualy i never using that code
i just using
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

//************************************************************ Display Config Declaration

#define PANEL_RES_X 64  // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32  // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 1   // Total number of panels chained one to another

MatrixPanel_I2S_DMA* dma_display = nullptr;

uint16_t myBLACK;
uint16_t myWHITE;
uint16_t myRED;
uint16_t myGREEN;
uint16_t myBLUE;

void setup() {
  Serial.begin(115200);

  // Configurations for Display
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X,  // module width
    PANEL_RES_Y,  // module height
    PANEL_CHAIN   // Chain length
  );

  mxconfig.double_buff = true;
  mxconfig.gpio.e = 32;
  mxconfig.clkphase = false;

  // Display Setup
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);
  dma_display->begin();
  dma_display->setBrightness8(255);  //0-255

  // Define colors
  myBLACK = dma_display->color565(0, 0, 0);
  myWHITE = dma_display->color565(255, 255, 255);
  myRED = dma_display->color565(255, 0, 0);
  myGREEN = dma_display->color565(0, 255, 0);
  myBLUE = dma_display->color565(0, 0, 255);

  // Print dot at each coordinate
  for (int y = 0; y < PANEL_RES_Y; y++) {
    for (int x = 0; x < PANEL_RES_X * PANEL_CHAIN; x++) {
      dma_display->drawPixel(x, y, myRED);
      // Print coordinates
      Serial.print("(");
      Serial.print(x);
      Serial.print(",");
      Serial.print(y);
      Serial.print(") ");
      delay(100); // Delay 500ms before printing the next dot
    }
    Serial.println(); // Move to the next line after each row
  }
}

void loop() {
  // Nothing here, just printing dots in setup()
}

I meant  your comment below:

when i change panel y become times 2 (32*2 =64)

   PANEL_RES_Y*2,            // DO NOT CHANGE THIS

when i use this he be come full dot in this display

And as illustration to it you shown a video2.mp4 file where the first panel fulfilled completely.

actually that is just my suggestion to change that but I haven't done it yet

video2.mp4 is when panel_res_y = 64

//************************************************************ Display Config Declaration
#define PANEL_RES_X 64  // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32  // Number of pixels tall of each INDIVIDUAL panel module.
#define PANEL_CHAIN 1   // Total number of panels chained one to another

I don't understand why it is nothing on the panel. Perhaps it might not work correctly - but at least a few leds should be on.
Please test again tour connections.
If the problem is not with the connections, then I don't know how else to help you.
Where are you from?

i from indonesia
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

/* Use a custom Virtual Display class to re-map co-ordinates such that they draw
   correctly on a 32x16 1/4 Scan panel (or chain of such panels).
*/
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

/* ================================================== */
// Define custom class derived from VirtualMatrixPanel
class EightPxBasePanel : public VirtualMatrixPanel
{
  public:
    using VirtualMatrixPanel::VirtualMatrixPanel; // inherit VirtualMatrixPanel's constructor(s)

  protected:

    VirtualCoords getCoords(int16_t x, int16_t y);  // custom getCoords() method for specific pixel mapping

};

inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

  if ( coords.x & 64) {
    coords.x -= 64;
    coords.y +=32;
  }
}
/* ================================================== */
// Panel configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 1 // Number of INDIVIDUAL PANELS per ROW

// ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS

// Change this to your needs, for details on VirtualPanel pls read the PDF!
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_TOP_RIGHT_DOWN

// placeholder for the matrix object
MatrixPanel_I2S_DMA *dma_display = nullptr;

// placeholder for the virtual display object
EightPxBasePanel   *FourScanPanel = nullptr;

/******************************************************************************
   Setup!
 ******************************************************************************/
void setup()
{
  delay(250);

  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println("*         1/32 Scan Panel Demonstration              *");
  Serial.println("*****************************************************");

  /*
       // 62x32 1/8 Scan Panels don't have a D and E pin!

       HUB75_I2S_CFG::i2s_pins _pins = {
        R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
        A_PIN, B_PIN, C_PIN, D_PIN, E_PIN,
        LAT_PIN, OE_PIN, CLK_PIN
       };
  */
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X ,            // DO NOT CHANGE THIS
    PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
    NUM_ROWS * NUM_COLS         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

  mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right.
  mxconfig.gpio.e = 32;
  //mxconfig.driver   = HUB75_I2S_CFG::FM6126A;     // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object

  // OK, now we can create our matrix object
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);

  // let's adjust default brightness to about 75%
  dma_display->setBrightness8(255);    // range is 0-255, 0 - 0%, 255 - 100%

  // Allocate memory and start DMA display
  if ( not dma_display->begin() )
    Serial.println("****** !KABOOM! I2S memory allocation failed ***********");

  dma_display->clearScreen();
  delay(500);

  // create FourScanPanellay object based on our newly created dma_display object
  FourScanPanel = new EightPxBasePanel ((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, VIRTUAL_MATRIX_CHAIN_TYPE);

  // THE IMPORTANT BIT BELOW!
  // FOUR_SCAN_16PX_HIGH
  // FOUR_SCAN_32PX_HIGH
// **** You don't need to set PhysicalPanelScanRate when use your own virtual panel class
  //FourScanPanel->setPhysicalPanelScanRate(FOUR_SCAN_16PX_HIGH);
}

// Test the pixel mapping - fill the panel pixel by pixel
void loop() {

  for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < FourScanPanel->width(); j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 255, 255));
      // Print coordinates
        Serial.print("(");
        Serial.print(j);
        Serial.print(",");
        Serial.print(i);
        Serial.print(") ");
      delay(30);
    }
  }

  delay(2000);
  dma_display->clearScreen();

} // end loop

please read my code is something wrong ?
actually when I try using

I'll take a look and write later

https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/5811b9d0-5185-4ff2-b8b2-6707a2cf852d
i remove

if ( coords.x & 64) {
coords.x -= 64;
coords.y +=32;
}

and this what i got
but when I didn't remove it panel is blank

Please show a full code

here is full code
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

/* Use a custom Virtual Display class to re-map co-ordinates such that they draw
   correctly on a 32x16 1/4 Scan panel (or chain of such panels).
*/
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

/* ================================================== */
// Define custom class derived from VirtualMatrixPanel
class EightPxBasePanel : public VirtualMatrixPanel
{
  public:
    using VirtualMatrixPanel::VirtualMatrixPanel; // inherit VirtualMatrixPanel's constructor(s)

  protected:

    VirtualCoords getCoords(int16_t x, int16_t y);  // custom getCoords() method for specific pixel mapping

};

inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

  // if ( coords.x & 64) {
  //   coords.x -= 64;
  //   coords.y +=32;
  // }
}
/* ================================================== */
// Panel configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW
#define PANEL_CHAIN NUM_ROWS*NUM_COLS

// ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS

// Change this to your needs, for details on VirtualPanel pls read the PDF!
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_TOP_RIGHT_DOWN

// placeholder for the matrix object
MatrixPanel_I2S_DMA *dma_display = nullptr;

// placeholder for the virtual display object
EightPxBasePanel   *FourScanPanel = nullptr;

/******************************************************************************
   Setup!
 ******************************************************************************/
void setup()
{
  delay(250);

  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println("*         1/32 Scan Panel Demonstration              *");
  Serial.println("*****************************************************");

  /*
       // 62x32 1/8 Scan Panels don't have a D and E pin!

       HUB75_I2S_CFG::i2s_pins _pins = {
        R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
        A_PIN, B_PIN, C_PIN, D_PIN, E_PIN,
        LAT_PIN, OE_PIN, CLK_PIN
       };
  */
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X ,            // DO NOT CHANGE THIS
    PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
    PANEL_CHAIN         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

  mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right.
  mxconfig.gpio.e = 32;
  //mxconfig.driver   = HUB75_I2S_CFG::FM6126A;     // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object

  // OK, now we can create our matrix object
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);

  // let's adjust default brightness to about 75%
  dma_display->setBrightness8(192);    // range is 0-255, 0 - 0%, 255 - 100%

  // Allocate memory and start DMA display
  if ( not dma_display->begin() )
    Serial.println("****** !KABOOM! I2S memory allocation failed ***********");

  // create FourScanPanellay object based on our newly created dma_display object
  FourScanPanel = new EightPxBasePanel ((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, VIRTUAL_MATRIX_CHAIN_TYPE);

  dma_display->clearScreen();
  delay(500);
  // THE IMPORTANT BIT BELOW!
  // FOUR_SCAN_16PX_HIGH
  // FOUR_SCAN_32PX_HIGH
// **** You don't need to set PhysicalPanelScanRate when use your own virtual panel class
  //FourScanPanel->setPhysicalPanelScanRate(FOUR_SCAN_16PX_HIGH);
}

// Test the pixel mapping - fill the panel pixel by pixel
void loop() {

  for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < FourScanPanel->width(); j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 255, 255));
      // Print coordinates
        Serial.print("(");
        Serial.print(j);
        Serial.print(",");
        Serial.print(i);
        Serial.print(") ");
      delay(30);
    }
  }

  delay(2000);
  dma_display->clearScreen();

} // end loop

I just use 1 panel for code, The second panel should do the same thing but instead, it is blank

HUB75_I2S_CFG mxconfig(
PANEL_RES_X ,            // DO NOT CHANGE THIS
PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
PANEL_CHAIN         // DO NOT CHANGE THIS
//,_pins            // Uncomment to enable custom pins
);

I still save this config

I may have found a bug, try this
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

/* Use a custom Virtual Display class to re-map co-ordinates such that they draw
   correctly on a 32x16 1/4 Scan panel (or chain of such panels).
*/
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

/* ================================================== */
// Define custom class derived from VirtualMatrixPanel
class EightPxBasePanel : public VirtualMatrixPanel
{
  public:
    using VirtualMatrixPanel::VirtualMatrixPanel; // inherit VirtualMatrixPanel's constructor(s)

  protected:

    VirtualCoords getCoords(int16_t x, int16_t y);  // custom getCoords() method for specific pixel mapping

};

inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

   if ( coords.x & 64) {
     coords.x -= 64;
     coords.y +=32;
   }
return coords;

}
/* ================================================== */
// Panel configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 1 // Number of INDIVIDUAL PANELS per ROW
#define PANEL_CHAIN NUM_ROWS*NUM_COLS

// ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS

// Change this to your needs, for details on VirtualPanel pls read the PDF!
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_TOP_RIGHT_DOWN

// placeholder for the matrix object
MatrixPanel_I2S_DMA *dma_display = nullptr;

// placeholder for the virtual display object
EightPxBasePanel   *FourScanPanel = nullptr;

/******************************************************************************
   Setup!
 ******************************************************************************/
void setup()
{
  delay(250);

  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println("*         1/32 Scan Panel Demonstration              *");
  Serial.println("*****************************************************");

  /*
       // 62x32 1/8 Scan Panels don't have a D and E pin!

       HUB75_I2S_CFG::i2s_pins _pins = {
        R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
        A_PIN, B_PIN, C_PIN, D_PIN, E_PIN,
        LAT_PIN, OE_PIN, CLK_PIN
       };
  */
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X  ,            // DO NOT CHANGE THIS
    PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
    PANEL_CHAIN         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

  mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right.
  mxconfig.gpio.e = 32;
  //mxconfig.driver   = HUB75_I2S_CFG::FM6126A;     // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object

  // OK, now we can create our matrix object
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);

  // let's adjust default brightness to about 75%
  dma_display->setBrightness8(192);    // range is 0-255, 0 - 0%, 255 - 100%

  // Allocate memory and start DMA display
  if ( not dma_display->begin() )
    Serial.println("****** !KABOOM! I2S memory allocation failed ***********");

  // create FourScanPanellay object based on our newly created dma_display object
  FourScanPanel = new EightPxBasePanel ((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, VIRTUAL_MATRIX_CHAIN_TYPE);

  dma_display->clearScreen();
  delay(500);
  // THE IMPORTANT BIT BELOW!
  // FOUR_SCAN_16PX_HIGH
  // FOUR_SCAN_32PX_HIGH
// **** You don't need to set PhysicalPanelScanRate when use your own virtual panel class
  //FourScanPanel->setPhysicalPanelScanRate(FOUR_SCAN_16PX_HIGH);
}

// Test the pixel mapping - fill the panel pixel by pixel
void loop() {

  for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < FourScanPanel->width(); j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 255, 255));

      delay(30);
    }
  }

  delay(2000);
  dma_display->clearScreen();

} // end loop

the result it is same like my video

video5.mp4

At least now it show something...

@mjmokhtar
I apologize for so many failed tests - but I think you understand how difficult it is to configure the panel remotely without being able to test it live. So if you want to get the result, we will have to do a few more tests.

you don't have to apologize about failed tests, I really appreciate you help me doing this remote,
is the issue something about parallel i2s ?

is the issue something about parallel i2s ?

What is the issue? The video5 is not wrong, it exactly as it should be.
Are you ready to next test?
Please edit the last code changing the getCoords() this way:
inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

   if ( coords.x & 64) {
     coords.x -= 64;
     coords.y +=32;
   }
  coords.x -= (coords.x / (2 * PANEL_RES_X)) * PANEL_RES_X;
return coords;

}

please setup the screen as horizontal row of 3 panels:
#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 3 // Number of INDIVIDUAL PANELS per ROW

here is the result
the matrixs  just prints in left matrix center and right becomes blank
https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/assets/108962994/8ca6fbc9-d8f7-4611-a9aa-0c3896a659b7

Sorry by asking that - don't you forget to setup a screen as 3x1 panels?
Or try to change the cycle in loop:
for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < 192; j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 255, 255));

      delay(30);
    }
  }

Thank you

yes, the result same like video6

Sorry, I have no more ideas yet

maybe you right
virtual library doesn't work for this panel

No, I do not think so. A virtual library is no different from a regular one.
The problem is that your matrix has a complex line connection scheme that we couldn’t figure out.

i think
panel design support for first image (vertical)
but we want to change become horizontal
and also the RGB pin is different

When I want green, blue appears instead
When I want blue, red appears instead
when I want red, led become green

panel design support for first image (vertical)
but we want to change become horizontal

I tried to take this into account in the code...

From the beginning,
Do You have pictures of the back of your panel, connector HUB75 (or whatever it has) and some chips to know about?
The code You share, it's the full code?
Thanks in advance, I hope to help You...

here is a pic of back my panel

It uses hub75 the chip(ic) shown in the picture, I don't know if ic have another bit trigger or same as other

for code yes it's full code

The code You share, it's the full code?

hope you can help me Mr @davemaster

for code yes it's full code

The code You share, it's the full code?

hope you can help me Mr @davemaster

Hi,
Are You using any HAT? How are You connecting the ESP32, what ESP32 board is it? Pictures talk more than 1000 words...

i just created my prototype hat (shield)

     #define R1_PIN_DEFAULT  25
    #define G1_PIN_DEFAULT  26
    #define B1_PIN_DEFAULT  27
    #define R2_PIN_DEFAULT  14
    #define G2_PIN_DEFAULT  12
    #define B2_PIN_DEFAULT  13

    #define A_PIN_DEFAULT   23
    #define B_PIN_DEFAULT   22
    #define C_PIN_DEFAULT   5
    #define D_PIN_DEFAULT   19
    #define E_PIN_DEFAULT   32 // IMPORTANT: Change to a valid pin if using a 64x64px panel. 32

    #define LAT_PIN_DEFAULT 21
    #define OE_PIN_DEFAULT  33
    #define CLK_PIN_DEFAULT 18

I've using those pins esp32 for this test

I use:

THE DOIT ESP32 DEVKIT V1
I'll try your code at this moment of tranquility... but the day after tomorrow, I will be enable to wire the ESP32 Board for test with a panel; one of mine: 32x32, 32x16, 64x64, 64x32, will see

this full pic back of panel

hope u can help me Mr @davemaster
thank you

Thank you
Could you test previous code (below) again, but now for 2x1 panel configuration?
#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h"

/* Use a custom Virtual Display class to re-map co-ordinates such that they draw
   correctly on a 32x16 1/4 Scan panel (or chain of such panels).
*/
#include "ESP32-VirtualMatrixPanel-I2S-DMA.h"

/* ================================================== */
// Define custom class derived from VirtualMatrixPanel
class EightPxBasePanel : public VirtualMatrixPanel
{
  public:
    using VirtualMatrixPanel::VirtualMatrixPanel; // inherit VirtualMatrixPanel's constructor(s)

  protected:

    VirtualCoords getCoords(int16_t x, int16_t y);  // custom getCoords() method for specific pixel mapping

};

inline VirtualCoords EightPxBasePanel ::getCoords(int16_t x, int16_t y) {

  coords = VirtualMatrixPanel::getCoords(x, y); // first call base class method to update coords for chaining approach

  if ( coords.x == -1 || coords.y == -1 ) { // Co-ordinates go from 0 to X-1 remember! width() and height() are out of range!
    return coords;
  }

   if ( coords.x & 64) {
     coords.x -= 64;
     coords.y +=32;
   }
return coords;

}
/* ================================================== */
// Panel configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS
#define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW
#define PANEL_CHAIN NUM_ROWS*NUM_COLS

// ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS

// Change this to your needs, for details on VirtualPanel pls read the PDF!
#define SERPENT true
#define TOPDOWN false
#define VIRTUAL_MATRIX_CHAIN_TYPE CHAIN_TOP_RIGHT_DOWN

// placeholder for the matrix object
MatrixPanel_I2S_DMA *dma_display = nullptr;

// placeholder for the virtual display object
EightPxBasePanel   *FourScanPanel = nullptr;

/******************************************************************************
   Setup!
 ******************************************************************************/
void setup()
{
  delay(250);

  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println("*         1/32 Scan Panel Demonstration              *");
  Serial.println("*****************************************************");

  /*
       // 62x32 1/8 Scan Panels don't have a D and E pin!

       HUB75_I2S_CFG::i2s_pins _pins = {
        R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN,
        A_PIN, B_PIN, C_PIN, D_PIN, E_PIN,
        LAT_PIN, OE_PIN, CLK_PIN
       };
  */
  HUB75_I2S_CFG mxconfig(
    PANEL_RES_X  ,            // DO NOT CHANGE THIS
    PANEL_RES_Y * 2,            // DO NOT CHANGE THIS
    PANEL_CHAIN         // DO NOT CHANGE THIS
    //,_pins            // Uncomment to enable custom pins
  );

  mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right.
  mxconfig.gpio.e = 32;
  //mxconfig.driver   = HUB75_I2S_CFG::FM6126A;     // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object

  // OK, now we can create our matrix object
  dma_display = new MatrixPanel_I2S_DMA(mxconfig);

  // let's adjust default brightness to about 75%
  dma_display->setBrightness8(192);    // range is 0-255, 0 - 0%, 255 - 100%

  // Allocate memory and start DMA display
  if ( not dma_display->begin() )
    Serial.println("****** !KABOOM! I2S memory allocation failed ***********");

  // create FourScanPanellay object based on our newly created dma_display object
  FourScanPanel = new EightPxBasePanel ((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, VIRTUAL_MATRIX_CHAIN_TYPE);

  dma_display->clearScreen();
  delay(500);
  // THE IMPORTANT BIT BELOW!
  // FOUR_SCAN_16PX_HIGH
  // FOUR_SCAN_32PX_HIGH
// **** You don't need to set PhysicalPanelScanRate when use your own virtual panel class
  //FourScanPanel->setPhysicalPanelScanRate(FOUR_SCAN_16PX_HIGH);
}

// Test the pixel mapping - fill the panel pixel by pixel
void loop() {

  for (int i = 0; i < FourScanPanel->height(); i++)
  {
    for (int j = 0; j < FourScanPanel->width(); j++)
    {

      FourScanPanel->drawPixel(j, i, FourScanPanel->color565(255, 255, 255));

      delay(30);
    }
  }

  delay(2000);
  dma_display->clearScreen();

} // end loop

Hi again,
What version of esp32 board are You using?

I have the one Up

i'm using esp32 version 2.0.16

i'm using esp32 version 2.0.16

All this, for have synchronized dev environments

By the way, had you changed the default wiring come with the github version?

yes, i have changed the default wiring

fix.zip
here is my code mr @davemaster
file .ino was not change u can copy my full from this https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/issues/540#issuecomment-2156357505

this full pic back of panel

do you have same panels mr @davemaster

this full pic back of panel

do you have same panels mr @davemaster

I CAN'T see the panel picture

@davemaster can you see it

Well, here are right now the 4:30 AM, let me rest and I will try to wire my esp32 DEVKIT v1 to one of those panels.. Yours is a 32S, A-B-C-D-E lines for rows, I think I have one similar... See You tomorrow late

Greetings,
Finally, I finished my connection, and take a time to remember some nightmares when a programmer  uses another programmer code.

I'm setting the E-pin as -1, not necessary for the panels I have (64x32 or 32x32). But for the 64x64 I have (x2 units) I put E-pin in 33 pin of my ESP32 Devkit V1
As advice, ALWAYS, ALWAYS use the original examples FIRST; DON'T CHANGE anything... but in my case, I have to change the code for fit my connections... In the begining of the examples files, there are an explanation of HOW TO CUSTOM your connections.
// 0)YOUR redefined pin configuration

#define R1  2
#define G1  23
#define BL1  4
#define R2  16
#define G2  27
#define BL2  17

#define CH_A   5
#define CH_B   18
#define CH_C   19
#define CH_D   21
#define CH_E   -1//GPIO_NUM_33
#define LAT 26
#define OE  25

#define CLK 22

// 1) Include key virtual display library
#include <ESP32-VirtualMatrixPanel-I2S-DMA.h>

// 2) Set configuration
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.

#define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS; FOR TRY, ONLY 1
#define NUM_COLS 1 // Number of INDIVIDUAL PANELS per ROW; FOR TRY, ONLY 1
#define PANEL_CHAIN NUM_ROWS*NUM_COLS    // total number of panels chained one to

//LINES BELOW, in setup function...
 ******************************************************************************/
void setup() {

  delay(2000);
  Serial.begin(115200);
  Serial.println(""); Serial.println(""); Serial.println("");
  Serial.println("*****************************************************");
  Serial.println(" HELLO !");
  Serial.println("*****************************************************");

  /******************************************************************************
   * Create physical DMA panel class AND virtual (chained) display class.
   ******************************************************************************/
  /*
    The configuration for MatrixPanel_I2S_DMA object is held in HUB75_I2S_CFG structure,
    All options has it's predefined default values. So we can create a new structure and redefine only the options we need
    Please refer to the '2_PatternPlasma.ino' example for detailed example of how to use the MatrixPanel_I2S_DMA configuration
  */

  //Another way of creating config structure
    //Custom pin mapping for all pins
    HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK};
    HUB75_I2S_CFG mxconfig(
                    PANEL_RES_X,    // module width
                    PANEL_RES_Y,    // module height
                    PANEL_CHAIN,    // chain length
                    _pins           // pin mapping
    );

The result:

![ChainedPanels Example - with one 64x32 RGB Panel](https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/assets/1075807/dd3b0399-800d-485c-b37a-49f9093ad4d0)

@davemaster
Thank you
But I as far I see the result is for standard 64x32 panel.
I don't understand what it has to do with @mjmokhtar 64x32 s32 panel?

yes mr @board707
actually, my panel size is 64x32 but it have 32 scan
mr @davemaster i guest using a standard panel which is 16 scan

actually, my panel size is 64x32 but it have 32 scan

It makes the things completely different from 64x32 s16 and 64x64 s32.

yes mr @board707 actually, my panel size is 64x32 but it have 32 scan mr @davemaster i guest using a standard panel which is 16 scan

Yes, difference, what You need to drive 32S ?  check this link

Then  learn, for fast solution, you can get a linsn board, I have RV908 and works great, easy and FAST... check it out

Then learn...

I'm learning.
Honesty speaking, I understand quite a lot about this topic.... I can configure almost any panel with a scan of s2, s4, s8 ... just by video, without direct tests.
But I couldn’t manage @mjmokhtar's panel because this is the first time I’ve encountered a matrix of this type.
I did expect you to help with something more ... interesting. than standard example

But, here, if you're up to... the solution is HERE ....

I have no 32S panels... if I have.... better get only 1/16 1/4 1/8
But for your fortune, I'm working in an schematic for a  giant panel (with normal parts, no tiny or smd) 512x256 resolution; and I will try that 32S....
good luck

the solution is HERE

There's nothing in the link that might help. There is only general information about the operation of DMD panels, which have long been known to everyone.

the solution is HERE

There's nothing in the link that might help. There is only general information about the operation of DMD panels, which have long been known to everyone. it seems to me, that you just don't understand the problem; it is not a difficult to manage a 32s panels, the problem is works with matrix where scan is equal to height. So your giant panel is unlikely to help if you use standard 32s modules there.

I'm working in an schematic for a giant panel (with normal parts,

Are you going to make it from individual LEDs (may be ws2812) or from ready-made HUB75 modules?

Is possible, there the solution, need to build the software/fpga by yourself...
my panel will be made using RGB 5mm LEDs, no those ws281
2

Is possible, there the solution, need to build the software/fpga by yourself...

Definitely
It’s not a problem to write your own code, and there’s no need for a fpga as I think.
The problem is that I don’t have these panels, @mjmokhtar  has them.
So we hoped that you could solve this problem remotely :)

may be if I have a panel alike.... but..

yes mr @board707 actually, my panel size is 64x32 but it have 32 scan mr @davemaster i guest using a standard panel which is 16 scan

https://youtu.be/InhCc_-RBb4?si=MDNALST6I_vV8lEq&t=145

yes mr @board707 actually, my panel size is 64x32 but it have 32 scan mr @davemaster i guest using a standard panel which is 16 scan

https://youtu.be/InhCc_-RBb4?si=MDNALST6I_vV8lEq&t=145

i don't know how to used that lib

@davemaster
Are you trolling us? The video is talking about a 32scan panel with 64 height, but @mjmokhtar  has a panel with 32 height.
Don't you understand the difference?
The working with 128x64 32s panel is obvious,  this is something that any beginner can do.

@davemaster
Let me explain. The difference between these two cases is fundamental. The Hub75 standard contains two separate color channels, one on pins R0 G0 B0 and the other on R1 G1 B1. This means that the top and bottom halves of the panel work in parallel. With this scheme, the number of matrix scans CANNOT be more than half the height.
And in the @mjmokhtar's  matrix, the number of scans is equal to the height. That is, the operating principle of this matrix is completely different and incompatible with any existing library.

@davemaster Let me explain. The difference between these two cases is fundamental. The Hub75 standard contains two separate color channels, one on pins R0 G0 B0 and the other on R1 G1 B1. This means that the top and bottom halves of the panel work in parallel. With this scheme, the number of matrix scans CANNOT be more than half the height. And in the @mjmokhtar's matrix, the number of scans is equal to the height. That is, the operating principle of this matrix is completely different and incompatible with any existing library.

that is correct because when I change this code from '2' becomes '1'
#ifndef MATRIX_ROWS_IN_PARALLEL
 #define MATRIX_ROWS_IN_PARALLEL     2
#endif

that will be full when i print dot matrix

@davemaster Are you trolling us? The video is talking about a 32scan panel with 64 height, but @mjmokhtar has a panel with 32 height. You still don't understand the difference?

thanks, my mistake

@davemaster Let me explain. The difference between these two cases is fundamental. The Hub75 standard contains two separate color channels, one on pins R0 G0 B0 and the other on R1 G1 B1. This means that the top and bottom halves of the panel work in parallel. With this scheme, the number of matrix scans CANNOT be more than half the height. And in the @mjmokhtar's matrix, the number of scans is equal to the height. That is, the operating principle of this matrix is completely different and incompatible with any existing library.

that is correct because when I change this code from '2' becomes '1'
#ifndef MATRIX_ROWS_IN_PARALLEL
 #define MATRIX_ROWS_IN_PARALLEL     2
#endif

that will be full when i print dot matrix

Where did You bought that panel, can You share the link? Thanks in advance

I bought it at a local shop
@davemaster
The writing on the back of this item seems to be from China and the factory name is charming
p4 led dot matrix panel 64x32 32s


Prints command to the user

This tiny change enables the user, too easily run the command locally for debugging purposes.
Also increases understanding, if configuration was successful.
🙌

@liaogz82 thanks for the quick reply! I improved the log a bit, to make it easier to read. Hope you find the time to have a look. 🙌

thanks @friederbluemle I shall merge the change.
the minor release to rubygems will be done next week as I have errands to run


About the config file

First of all, I think the model is very cool. So I really want to run the offered model by myself.
But when I run the command : "python -m demo_video --vid_path demo_data/penn_action-2278.mp4", there is a erroe :''[!] You need to specify load_path to load a pretrained model''.
I think it may need a config file. So would you mind offer the config file to me? Thanks very much.

Pass the pretrained model path using --load_path models/hmmr_model.ckpt-2699068

Thanks for answering. And would you tell me  what to input next ?

Make sure that you've downloaded the pretrained models and then point the path to one of the checkpoints in the models folder

I am so glad to get your answer.
I have found a small problem which I want to tell you.
In the website 'http://angjookanazawa.com/cachedir/hmmr/hmmr_models.tar.gz', I installed the flies below.

There are not 'hmmr_model.ckpt-2699068' which you write in readme.md:
'# Run on a single video:
python -m demo_video --vid_path demo_data/penn_action-2278.mp4 --load_path models/hmmr_model.ckpt-2699068'
When I run demo_video.py , the error is 'NotFoundError (see above for traceback): Key resnet_v2_50/block1/unit_1/bottleneck_v2/conv1/BatchNorm/beta not found in checkpoint'
Thanks for reading at last.

Should be ckpt 1119816 then. I'll update the README


tests: Make test-js-with-node handling smarter.

Added support for passing a filename without .js suffix.
This then fixed the issue of no complaints for invalid test
files.
Fixes #8579.
Testing Plan:
Run the following:

./tools/test-js-with-node unread
./tools/test-js-with-node unread.js
./tools/test-js-with-node doesnotexist
./tools/test-js-with-node unread doesnotexist

For the non-existent case, the script should (1) return a non-zero exit status and (2) report failure, not "SUCCESS".  While it's nice to show the specific error earlier (and it'd be even better if it used some red color on that line), the top-level reporting of whether it's an error is more important.
(zulip-py3-venv) tabbott@zaset:~/zulip$ ./tools/test-js-with-node unread doesnotexist
Starting node tests...
doesnotexist does not exist
running tests for unread
To see more output, open var/test-js-with-node/index.html
Test(s) passed. SUCCESS!
(zulip-py3-venv) tabbott@zaset:~/zulip$ echo $?
0

BTW while you're at it, we might want to make the successful output of test-js-with-node --coverage less spammy too.

For running with --coverage, please keep at least the lines below in the success case:
Writing coverage reports at [/srv/zulip/var/node-coverage]

Success: All enforced fully covered files still have 100% test coverage!
Success: There are no fully covered files that are not enforced yet!

View coverage reports at http://<IP_ADDRESS>:9991/node-coverage/index.html

For the last line I'm curious if people really view them through the dev server.  I just open them through File/Open in the browser.

@showell I had been imagining we'd end up with something like the test-backend, which basically only has the "View coverage reports at http://<IP_ADDRESS>:9991/node-coverage/index.html" part on a happy clean run.
I think we want those checks, certainly; I just don't think we need output when everything is correct.

I like the extra output that makes it clear I've passed coverage, but that's just my opinion, I see the other side.
And it kinda irks me that we suggest to people to run a dev server to see the test results, when they're right there in the file system.  (It would be a different story if the test server had some kind of nice dashboard for finding test results that you always had open.)
Having said all that, we can go super streamlined and see how that feels, and we can always move back toward the center later.

While I agree a file:// URL would work in some cases, the reason I don't like suggesting the local filesystem path, is that (1) it doesn't work directly with Vagrant (since we don't know what the path is on the host filesystem), and (2) it doesn't work with the remote dev server (since it's a different filesystem).
I think we might be able to do something like "Coverage passes!  Report at " to make that part explicit.

For me the ideal thing is to communicate both the local location and the web-served location.

@lonerz do you have a chance to work more on this?

@timabbott will get to it tomorrow most likely

@timabbott @showell sorry for the wait. Updated the PR. Now, invalid files will just throw an error early.

@showell updated my code!

@showell updated.

Merged, thanks @lonerz!


Feature FindNodeFast Result Limit

We do not need that many responses with FindNodeFast as with FindNode, since the
reposes can be ordered by distance. We can set a lower limit for these, making it fit into fewer UDP packets.
based on https://github.com/codex-storage/nim-codex-dht/pull/93, merge after that (please avoid squashing).

You can base this commit on top of the branch for #93, so it won't show the commits in #93...

You can base this commit on top of the branch for #93, so it won't show the commits in #93...

Tried that in the past. I seem to remember a few issues with that approach:

either later you forget to change it to master, and thus merge on the wrong branch,
or, you remember to change it, but than that change invalidates a few things (approvals, checks, etc.) leading to more complications.
At least, this is how I remember it.


Creating graph or mesh should be marked unsafe

The problem
All partition functions in METIS will cause undefined behavior if given not well formed CSR graphs.
For example:
#[test]
fn segfault() {
    let adjncy = &mut [1, 9999];
    let xadj = &mut [0, 2];
    let part = &mut [0];
    Graph::new(1, 1, xadj, adjncy).part_recursive(part).unwrap();
}

This is expected as METIS does unchecked array indexing using values in adjncy in many places.
Because of this, the API is unsound and should be changed.
How can this be fixed
According to the Rust API Guidelines, the way to fix this and keep the signatures the same will be to add a validation function that checks every value of adjncy that it is less than xadj.len() - 1. The current implementations could be moved to an _unchecked version of the function.
impl Graph {
    fn new(...) -> Result<Graph> {
        Graph::validiate(...)?;
        unsafe { Graph::new_unchecked(...) }
    }
    unsafe fn new_unchecked(...) -> Graph {
        // current implemtation
        // maybe it includes existing asserts?
    }
}

// same process with Mesh

Good catch! Thanks for the comprehensive bug report. Your fix looks good but is a breaking change. We could raise the error in part_recursive and part_kway that already return a Result, but I guess it's better to return the error as early as possible? I will push a fix and this will go into v0.2.

Actually, there is an issue. We cannot do any meaningful check in Graph::new, because doing so requires knowing the numbering used: https://docs.rs/metis/latest/metis/option/enum.Numbering.html.
This is a pretty weird feature IMO, and I don't know anyone who uses this (let alone with these rust bindings). On the other hand, I don't want to be too opinionated and would rather keep the API close to metis.h.
So we can either

raise the error late in part_recursive and part_kway. The check happens at every partition call, but it does not break the API.
raise the error in Graph::new. It breaks the API and we'd have to drop the numbering feature, but the error is raised early and the check is done only once.

This is a pretty weird feature IMO, and I don't know anyone who uses this (let alone with these rust bindings). On the other hand, I don't want to be too opinionated and would rather keep the API close to metis.h.

I do not think a lot of Rust users use numbering starting from 1.

So we can either
* raise the error late in `part_recursive` and `part_kway`. The check happens at every partition call, but it does not break the API.

* raise the error in `Graph::new`. It breaks the API and we'd have to drop the numbering feature, but the error is raised early and the check is done only once.

Please do the second option. Not having Fortran arrays is not a problem. It will also avoid a lot of bugs playing with offsets (my personal experience dealing with offset in Scotch).

I do not think a lot of Rust users use numbering starting from 1.

This is true. At least all CSR crates that I know of start from 0 (sprs, nalgebra-sparse and russell_sparse).

It will also avoid a lot of bugs playing with offsets (my personal experience dealing with offset in Scotch).

METIS plays pretty safe and decrements all values from xadj and adjncy by 1 before partitioning ^1. This is a pain for us however because it's not thread safe and requires mutable refs everywhere.
If we prevent Fortran numbering maybe we could use shared references instead and reopen #8. However METIS could still be mutating input values in other places.
https://github.com/KarypisLab/METIS/blob/e0f1b88b8efcb24ffa0ec55eabb78fbe61e58ae7/libmetis/fortran.c#L16-L28

Just to add my 2cts, I was experiencing spurious segfaults and heap corruption. I spent a considerable amount of time debugging the issue, only to find out that it was my input that was causing the problem.
The cause turned out to be that I was passing a weight of 0 for some edges. I meticulously verified my data, but this was something I overlooked and I figured it out when re-reading the METIS API documentation. It would've been a life saver if this was checked by the crate 😄.
I would therefore opt for the first option, raising the error on the part_* calls, because then you'll be able check additional data (in my case, the edge weights) as well.

I think we have to do a lot better at checking data before calling Metis, that is kind of fragile depending on user input. Raising errors should be generalized to all functions, with unchecked versions as well.
We should not panic.
As we speak about API changes, we should think about not having the partitioning function tied to the Graph structure and perhaps use a builder pattern to construct the data.

I've been doing a lot of investigation into the METIS source in my efforts to port it to Rust and there are a whole bunch of other subtle ways you can cause undefined behavior. For example, graphs with degree that is "too large" will overflow the index in a way that is very difficult to predict (for example, in kwayrefine.c). There doesn't seem to be a safe way of doing it short of forcing METIS itself to do a ton more checks.

I'm usually a fan of "don't let perfect be the enemy of good enough", so I would opt for adding the checks even if we can't cover them all. However, then calling the variant with the checks 'safe' is a different question altogether, as technically it still isn't. But still better than the current situation, though...

Yeah. If only there was a clear specification of what METIS accepts as input (whether CSR indices are sorted, value ranges, etc. the manual doesn't specify these if i remember correctly), then we could do those checks in a "safe" wrapper. But the manual is pretty light on details, and with every change upstream can add another way to trigger undefined behavior. Technically {Graph,Mesh}::part_* & mesh_to_dual must be marked unsafe then, even with the checks.
As Cédric said we can also do the checks/raise errors early in all set_* functions. That would double the API size (with unchecked variants) but allow the Graph and Mesh structures to be reused without doing all the checks.
A "good" thing about this is that we don't have to add all the checks at once. Once the API is fixed they can be added incrementally i think, at least if all functions return a Result, something like:
impl<'a> Graph<'a> {
    pub fn new(...) -> Result<Self, ...> { ... }
    pub unsafe fn new_unchecked(...) -> Self { ... }

    // could also take `self`, but then the user must
    // be able to retrieve the graph from the error type
    pub fn set_*(&mut self, ...) -> Result<&mut Self, ...> { ... }
    pub unsafe fn set_*_unchecked(&mut self, ...) -> &mut Self { ... }

    // Take a &mut self instead of owned so that
    // Graph can be reused without doing all the checks
    pub unsafe fn part_*(&mut self, ...) -> Result<...> { ... }

    // no need for part_*_unchecked, if all checks
    // happen in set_* and new? we can always
    // add it later without breaking compatiblity
}

// same with Mesh

pub unsafe fn mesh_to_dual(...) -> Result<Dual, ...> { ... }

I currently don't have time to continue work on #13 so feel free to take it from there if you want to.


Delete is not implemented

Delete file is not implemented, and should not be marked as working. See issue: #378

This is just a documentation hotfix, so will merge now


Implement indicator for virtual desktops

Description of the new feature / enhancement
I think it would be good to have an indicator on the taskbar that can only show the sequence number of the virtual desktop currently in it. In addition, the total number of virtual desktops can be shown as small at the bottom right of that taskbar icon. Like 3/5 for example.

Scenario when this would be used?
I'm having a hard time using the Virtual Desktops feature in Windows 11. Namely, when switching between multiple virtual desktops, I am confused about which virtual desktop I am on. That's why I think it would be nice to have an indicator that can at least be put on the taskbar and only show numbers (or I don't know how other people's ideas would be).
Supporting information
No response
Additional information
Also there's a Feedback Hub link: https://aka.ms/AAe3fae

Upvoted.
xref #12246 as it kinda is related if you squint your eyes.

/dup #12246 based on further clarification from that author


Wilder Wild mixin incompatibility

Describe the bug
The use of ModifyArgs in Wilder Wild's LiquidBlockRendererMixin isn't transformed correctly.
Steps to reproduce

Launch the game?

Logs
https://gist.github.com/Treetrain1/9c1ed3ab35283d2dfc23cf46549dfc99
Additional context
Originally discussed in #377
The game doesn't crash with later versions of Wilder Wild, however the issue still remains.
Wilder Wild source for reference
(Has since changed, appending require = 0)
@ModifyArgs(method = "tesselate", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/block/LiquidBlockRenderer;vertex(Lcom/mojang/blaze3d/vertex/VertexConsumer;DDDFFFFFI)V", ordinal = 8))
	private void wilderWild$sideTextureBottom1(Args args) {
		if (this.wilderWild$isWater) {
			this.wilderWild$u0 = this.waterOverlay.getU0();
			this.wilderWild$u1 = this.waterOverlay.getU1();
			this.wilderWild$v0 = this.waterOverlay.getV0();
			this.wilderWild$v1 = this.waterOverlay.getV1();
			args.set(7, this.wilderWild$u0);
			args.set(8, this.wilderWild$v1);
		}
	}

Crashes in Connector Beta 28

Beta 28 is outdated, please update to beta 29

Rubidium and Embeddium Crash on Connector beta 29


[Masthead]: React - Custom data option not being displayed properly on storybook

Detailed description

Describe in detail the issue you're having.

When toggling the navigation data knob on the Masthead or DotcomShell storybook, the custom data is not appearing correctly. There should be subnav links displaying. The issue seems to be with storybook, maybe the select storybook knob?
When setting the custom data as default option in the storybook file, it renders as expected but once user toggles back from "default" to "custom", the custom data renders without the subnav links.

Solution is to create a new MH story.


AWS for Digital Twin

Hello Dear Authors,
Can the digital twin based your book be completed without AWS (to avoid any AWS cost) please? Local GPU and memory to be used? Will appreciate any info. Sincerely MI.

Hello @Mimran-colab ,
Without the deployment part, yes, you could run everything on your local GPU (if it has over 16GB VRAM) or just do inference with ~8 GB VRAM while using our pre-trained model available on Hugging Face


Register ChordalGraph v0.4.0

Hi Jie,
thanks for the update from LightGraphs to Graphs ! Could you please register ChordalGraph v0.4.0 so that it can be directly added from REPL ? Currently I believe only v0.2.0 is accessible.

Hi Adrien,
I have checked at https://juliahub.com/ui/Registrator, and ChordalGraph v0.4.0 was already registered. I don't see why only v0.2.0 is accessible.

Hi Jie,
thanks for checking, maybe I had conflicting versions of the package or maybe something changed since then : anyway I can confirm that the default added version is well v0.4.0 so I guess we can close this issue.


Contact form template

I would Like to create a contact form template .

Tech Stack?

Tech Stack?

HTML and CSS

Please finish the issue ASAP


s3fs rm with recursive set as true doesn't work as one would expected

Using  the s3fs rm with recursive set as true doesn't work as one would expected
When trying to delete any "directory" on s3 using the rm command the files instead the folder will be deleted, but the s3 directory will not be deleted.
Example:
using fs.rm(uri, recursive = True)
If I provide the s3 uri path root/dir_1/dir_2 --> only deletes the file and not the folders.
root/dir_1/dir_2/file_1 ---> only file_1 is deleted
Version Info:
Python: 3.11.1
s3fs = 2011.11.0

S3 does not have folders. You probably have a file with the same name as the original "folder", which it is reasonable not t have deleted.

@martindurant here is a similar example for rm code.
import s3fs
def main(s3_uri):

    fs = s3fs.S3FileSystem(anon=False)

    # print(fs.info(s3_uri))
    fs.rm(s3_uri)

# -----------------------------------------------------------------------------
if __name__ == '__main__':
    s3_uri = "s3://bucket-test-gh/test1/"
    main(s3_uri)

# -----------------------------------------------------------------------------

The command executes, but when i check the s3 folder the file still exists

@ianthomas23 , this could be seen as a follow-up to your work. The likely issue is the directory as a prefix versus a zero-length key.

if a prefix only, deleting that exact path will cause an error
if a zero key, the delete should be done, but right now rmdir is a no-op

So probably we should always attempt to delete directories as if they were keys, but allow it to fail silently. The exact same situation exists in gcsfs.

@martindurant Yes, there are a few issues that are in the same areas of recursive actions with and without directories and files existing that I will work through.

I think this is working as expected. If I add the following test
def test_issue_688(s3):
    dir = test_bucket_name + "/dir"
    file = dir + "/file"
    s3.touch(file)

    assert s3.exists(dir)
    assert s3.exists(file)

    s3.rm(dir, recursive=True)

    assert not s3.exists(dir)
    assert not s3.exists(file)

then it passes.
Without the recursive kwarg, i.e. s3.rm(dir) then it is a no-op, again as expected.
Unless I have misunderstood something here.

I am going to close this as I don't think any action is required. Feel free to reopen if there is still an issue.

Without the recursive kwarg, i.e. s3.rm(dir) then it is a no-op, again as expected.

I'm poking about here investigating silent errors and this statement rings huge warning bells! 🚨
If you call rm without the recursive flag on a directory which isn't empty I would absolutely expect/want a loud error.
From the Zen of Python:

Errors should never pass silently.

When I call rm on a directory my expectation is that the directory is removed or an error is raised, not that the call silently does nothing and the directory which I've requested to be removed is still there.

xref: https://github.com/fsspec/s3fs/issues/838

When I call rm on a directory my expectation is that the directory is removed or an error is raised

Agreed, rm on an existing (non-empty) directory should raise IsADirectoryError.


bug: The range sliders are not showing colors

From @rajeshwarpatlolla on July 9, 2016 15:14
Type: bug
Ionic Version: 1.x
Platform: all
The range type input sliders are not showing colors.
http://ionicframework.com/docs/components/#range

Copied from original issue: driftyco/ionic#7253

It seems like the code to do this in Chrome was removed with no workaround: https://github.com/driftyco/ionic/issues/5913#issuecomment-217012628
I'm not sure if we want to just document this? https://bugs.chromium.org/p/chromium/issues/detail?id=582301


Using postpositional & (control operator) rather than Start-Job results in different current location (working directory)

Steps to reproduce
Set-Location /

$j = $pwd & Receive-Job -AutoRemoveJob -Wait $j

$j = Start-Job { $pwd }; Receive-Job -AutoRemoveJob -Wait $j

Expected behavior
/    # on Windows: C:\
/

Actual behavior
/
/home/jdoe   # on Linux; on macOS: /User/jdoe; on Windows: C:\Users\jdoe\Documents

Environment data
PowerShell Core v6.0.0-beta.4 on macOS 10.12.5
PowerShell Core v6.0.0-beta.4 on Ubuntu 16.04.2 LTS
PowerShell Core v6.0.0-beta.4 on Microsoft Windows 10 Pro (64-bit; v10.0.15063)

This is by design. While & uses Start-Job under the covers, it is intended to mimic the *nix behavior which runs the background process in the current directory.

Understood. Please make sure that the difference is documented.

Speaking of mimicking *nix behavior, more things worth documenting:
From what I can tell, PowerShell's jobs are fundamentally different from Bash's (do tell if I'm missing something - I'm not too familiar with PS jobs):

They can only be run "batch"-style with no interactive user input supported (if you send a Bash script to the background with a PS job, for instance, and that script tries to read from (non-redirected) stdin, it will simply encounter EOF (nothing to read) and proceed with empty input. By contrast, Bash would "stop" (suspend) such a script, allowing it to be brought to the foreground via job control to then supply the input interactively.)

They never output directly to the invoking terminal.

Generally, PS has no equivalent to Bash's job control with respect to bringing jobs to the foreground / sending them to the background / "stopping" (suspending) and resuming them.


Implement file invalidation based on new hash value sent by SURFsharekit

Other Sharekit stuff we might do as well because we'll be testing Sharekit extensively anyway:

[x] Give Sharekit access to harvester for webhook purposes
[x] Use "owner" to extract provider for Sharekit in products
[x] Main file should be the "important" file if available
[x] Switch to edusources_acc and nppo_acc sets
[x] Copyright should be set per file
[x] Grab urlName to be title for links
[x] Purge resources when invalidating tasks

Had a look today, but hashes are not returned by the Sharekit API. So that makes it hard to use them. Will check with Dafne what happened here and put it on blocked for now @peterdubbeldsurf

Furthermore. Implementing this is not as easy as picking up the hashes. We use the hashes in the file SRN (SURF resource name). To uniquely identify files. Products need to be able to generate these SRN's to do lookups correctly. And this is easy when using the URL based hash inside the SRN, but more difficult if the used hash is generated outside of the harvester.
Instead I think we should opt to pick up the hashes and then create SRN's based on the URL like before, but trigger background tasks based on url as well as hash. For most systems URL and hash would correlate 1:1, but for Sharekit it may happen that URL and SRN stays the same while the hash changes and this would trigger background tasks. To make things more complicated we'll generate a hash for Sharekit files when dealing with links, because Sharekit doesn't generate those (probably, haven't seen the API responses yet). All tests related to the logic described here is expected to break with the new API responses. So that's going to take some time as well.
TL; DR: this will be a bit more work, but it adds hours not days. Will need to be tested thoroughly, because we're changing most file tasks triggers for all sources.

Can't give links importance in Sharekit


how stop print  /bin/sh: 1: aws: not found

I'm trying to train a lora and the only thing I see is printing is /bin/sh: 1: aws: not found
How do I stop this?

webdataset_path: file:<path to local dataset>
Don't forget the file: part if you are using local files like I did

There seems to be a bug where if you pass in multiple local paths into webdataset_path, it will throw an error. The example by @thojmr works, but
webdataset_path:
    - file:<path to local dataset>

Does not.


79 tx list

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

@mikheevm I think the height of the buttons has changed @mikheevm in the onboarding flow and the settings.

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

(1) The buttons when creating a safe seems quite thin:

(2) Feature request for the future: After changing the threshold, the UI didn't update automatically, I had to reload:

(3) No transactions would show up for me:

I triggered 2 for my Safe with threshold 2 https://pr129--safereact.review.gnosisdev.com/safes/0x108b0D610d97391E460e28B20c9C541154e4909b/

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

I think the “executor” label looks more like a button than a label right now. But no blocker from my side, we can test if others feel the same and/or tackle this at a later point. Maybe just having the text in blue without a background would work better. 🤔

The dropdown-arrow on the right side of the header is not quite centered relative to the round hover-background.

After commit 53dd7b0 transaction list was first shown properly in 1 owner case, but now it's back to showing "No transactions found for this safe" 😩

@germartinez please check 2) point in Tobias' comment
@tschubotz Is 3 still a thing? The transactions do show up for me.

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

@mikheevm Nope, 3) doesn't seem to be an issue anymore. txs show up nicely :)
I used Brave
Version 0.66.99 Chromium: 75.0.3770.100 (Official Build) (64-bit)

Yes, transactions show up again now.
However, one of my transactions shows up as a "Modify Safe Settings" whereas it was just a normal asset transfer.

Sendind Eth from the Safe to itself has type "Modify Safe Settings" instead of "Outgoing transfer". Sending a token from the Safe to itself has "Outgoing transfer"

omg that conflicts :see_no_evil:

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

@germartinez @lukasschor there issues should be fixed now, please re-review :)

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

@germartinez @lukasschor there issues should be fixed now, please re-review :)

Tested

tx with 1 owner
tx with >1 ownerchange owners and threshold

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com

Travis automatic deployment:
https://pr129--safereact.review.gnosisdev.com
Storybook book automatic deployment:
https://pr129--safereactstorybook.review.gnosisdev.com


Update README.md

Corrects pod file record.
Please submit your PR against the staging branch.

Result of Integration 1
Duration: 8 minutes and 41 seconds
Result: 1 error, failing state: build-errors

It's all very strange. I corrected only README.md file! Why "Buildasaur — Build error!"?

Thank you for updating the README file.
I just brought Buildasaur online last night and there's still a config error.  Nothing for you to worry about.

👍

Added in a different PR.


TmuxPaneCurrentCommand returns tmux

As the title says: TmuxPaneCurrentCommand returns tmux.
Vim 7.4, Linux Mint 17.3, tmux 2.0.
When i run: display-message -p '#{pane_current_command}'  from tmux command line it returns vim as expected when i am in vim pane, but when i run it from vim it returns tmux ?
Any suggestions?
Thanks

Actually i had the a similiar problem as this one : https://github.com/christoomey/vim-tmux-navigator/issues/97
The solution is as blittle said:
call s:TmuxCommand(args)
instead: https://github.com/christoomey/vim-tmux-navigator/blob/master/plugin/tmux_navigator.vim#L80


jdtls: Add workaround for textDocument version of 0

See https://github.com/eclipse/eclipse.jdt.ls/issues/1695

Can you squash?
Also @mfussenger I defer to you on this as the resident jdtls expert 😆

Looks okay to me.
To be complete it would also require a workaround for the rename operation, otherwise that will have the same problem.
Here's how it's done in nvim-jdtls: https://github.com/mfussenegger/nvim-jdtls/commit/ca5154f57df45230a3c4aa3b67cc49c516299edf

Thanks for your contribution! Please ping me if jdtls ever fixes this 😆


Fix luarocks build failures during installation

postgres-auth-server 1.0.0-0 depends on luaposix 34.0.1-1 (not installed)
Installing https://luarocks.org/luaposix-34.0.1-1.src.rock

build-aux/luke package="luaposix" version="34.0.1-1" PREFIX="/opt/postgres-auth-server/lua_modules/lib/luarocks/rocks-5.1/luaposix/34.0.1-1" LUA="/opt/openresty-rtmp/luajit/bin/luajit" LUA_INCDIR="/opt/openresty
-rtmp/luajit/include" CFLAGS="-O2 -fPIC" LIBFLAG="-shared" LIB_EXTENSION="so" OBJ_EXTENSION="o" INST_LIBDIR="/opt/postgres-auth-server/lua_modules/lib/luarocks/rocks-5.1/luaposix/34.0.1-1/lib" INST_LUADIR="/opt/
postgres-auth-server/lua_modules/lib/luarocks/rocks-5.1/luaposix/34.0.1-1/lua"
/usr/bin/env: ‘lua’: No such file or directory

Error: Failed installing dependency: https://luarocks.org/luaposix-34.0.1-1.src.rock - Build error: Failed building.

This PR should fix luarocks build issues that I've come across.

This was fixed with this https://github.com/jprjr/setup-openresty/commit/1657971f8e0b77be51ddb4e8a2644e709d36268e. No need for this PR.
Closing...

This was fixed with this https://github.com/jprjr/setup-openresty/commit/1657971f8e0b77be51ddb4e8a2644e709d36268e. No need for this PR.
Closing...


Disable listDragHandle

What is the proper way to disable the listDragHandle? I tried removing the property and setting it to null. When I do this the listDragHandle is removed but the itemDragHandle drags the whole list instead of just the item.
ListDragHandleIssue.webm

 canDrag: false
in DragAndDropList  nothing else.


basic fillp(), support for tabled palettes in pal(), support for custom menuitem()

I implemented a basic fillp that for now supports patterns in color+black or color+transparent, for now it's only applied to draw_shader, none of the new sprite patterns etc.. Also it doesn't set anything in the draw state since it's not implemented.
In addition I added support for palette in tables passed to pal() such as pal({1,2,3,4,5,6,7,8,9,10,...}) to remap multiple colors at once as I used it a lot in my games, and cleaned up a bit all shaders settings in pal()
I have a couple "in progress" things left to add, then I'll take a break to work on my next game and after that continue this so it supports at least my other games

Can you provide some test ROMs for these changes? It's admittedly been a while since I last actively made PICO-8 games.


New CVAT users are not assigned to a role

This means that if someone creates an account, they can't create a task until the superuser has put them in the "users" group.
I guess there's some config somewhere for putting new users into certain groups by default?

will try setting DJANGO_AUTH_DEFAULT_GROUPS to [ 'user' ]
https://github.com/Weed-AI/cvat/blob/ead475b13603dd529b49d8f4d07a8245862d96c3/cvat/settings/base.py#L228

that didn't work!

needed to be [ 'USER' ] 😖


Add policy to block deletion of resources with prevent-deletion label

Towards https://github.com/giantswarm/roadmap/issues/146
This PR introduces a new label giantswarm.io/prevent-deletion,  which can be applied to any resource. If a user tries to delete the resource with the new label the new Kyverno policies will prevent that and note that the label should be removed first.
This PR also updates ats, abs and pytest-helm-charts to the newest versions.
Checklist

[x] Update changelog in CHANGELOG.md.

Actually, this is not ready for review yet.
I just realized that we have a cluster policy that prevents us from using * to target all resources.
Therefore, we either have to specify a list of resources that the label works for or create a policy exception.

As discussed in the original issue, the policy now targets only specific resources defined in the values.yaml and not all.


[REQUEST] Adding Plugins (jellyfin-ani-sync and jellyfin-plugin-subtitleextract)

Project Website
https://github.com/vosmiic/jellyfin-ani-sync
https://github.com/jellyfin/jellyfin-plugin-subtitleextract
Project Description
🧩 Plugins

jellyfin-ani-sync - A scrobbler and playback sync tool.
jellyfin-plugin-subtitleextract - A Plugin to automatically extract embedded subtitles.

Thanks for your suggestion! I have added jellyfin-ani-sync (per #13) to the list. I didnt add jellyfin-plugin-subtitleextract` for now, as this is an official plugin and already shows up in Jellyfin under "Plugins".


Not necessarily an issue

https://github.com/GoogleChrome/chrome-app-samples/blob/master/samples/serial/espruino/main.js
I'm just curious how a connection is verified with the external device when you use
serial.connect(path, this.onConnectComplete.bind(this))
I get that there is a callback function that will throw a connection failure if there isn't a object passed back as an argument, but what has to happen on the other end for there to be a successful connection?  Just a closed circuit of any kind or does a microcontroller have to give a handshake or something?

The connection is not verified with the external device. There's no standard "handshake" for serial connections. serial.connect is successful if Chrome successfully opens the serial port and configures it with the given parameters. A device doesn't even have to be connected on the other end.

Would you know how I might be able to create an ArrayBuffer to assign true binary values (or if chrome.serial.send() will be able to accept anything other than an ArrayBuffer)?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8

I don't understand what you mean by "true binary values." The documentation you linked to describes how to set individual bytes of an ArrayBuffer which is likely what you want.
I suggest taking questions like this to StackOverflow.


Hide console in windows when launching process

This prevents the console window from appearing when the process is launched within Windows. For other architectures it is a noop.
Fixes #12 .

SGTM. Thank you


Service Module dev deployment based on GitHub Actions

Git action part is ready. Tested the script part locally and it works, dev side testing to do


#15071 Disable "Save" and "Cancel" buttons

during the update data process progress

updateNotInProgress -> canPersistData
Use asyncExec in persister job to avoid unneccessary blocks


Update set up and get started in DG

Updated setting up and getting started section in DG with picture.

Looks good to merge


404: We couldn't find the challenge...

I think this is relatively self explanatory.

Not really.
Which challenge where you trying to find?

On one of the very early challenges, "Waypoint: Size your Images" the page loads however at the top of the page (just below the header) there is a 404 error message saying there is no challenge with that name.
Here's the issue though, I didn't go looking for any challenge. I had just completed the previous challenge and so it automatically loaded the next challenge.

This looks like it happen on the old site. Please reopen if you are still running into the issue.


Awkward Spinner Behavior for Fast Actions

Describe the bug
When running a Spinner with a quick action, any output following the spinner's lifecycle is consistently pushed to the side.
To Reproduce
Here's a simple file that shows this weird behavior:
package main

import (
	"time"

	"github.com/charmbracelet/huh"
	"github.com/charmbracelet/huh/spinner"
)

func main() {
	spinner.New().Title("I'm not so quick..").Action(func() {
		time.Sleep(2 * time.Second)
	}).Run()
	huh.NewNote().Title("I'm right over here! Hit Enter to see the next spinner!").Run()

	spinner.New().Title("I'm too fast!").Action(func() {
		// No-op
	}).Run()
	huh.NewNote().Title("<- I swear there was a spinner here somewhere!").Run()
}

In this case, I've used a no-op action to showcase the behavior, but I've been able to replicate this in other projects where the action is occasionally faster than expected.
Expected behavior
I expected this to behave similarly to its equivalent counterpart, using context:
package main

import (
	"context"
	"time"

	"github.com/charmbracelet/huh"
	"github.com/charmbracelet/huh/spinner"
)

func main() {
	ctxSlow, cancelSlow := context.WithCancel(context.Background())

	go func() {
		time.Sleep(2 * time.Second)
		cancelSlow()
	}()
	spinner.New().Title("I'm not so quick..").Context(ctxSlow).Run()
	huh.NewNote().Title("I'm right over here! Hit Enter to see the next spinner!").Run()

	ctxFast, cancelFast := context.WithCancel(context.Background())

	go func() {
		// No-op
		cancelFast()
	}()

	spinner.New().Title("I'm too fast!").Context(ctxFast).Run()
	huh.NewNote().Title("There was a fast spinner here, but at least I'm not over there ->").Run()
}

(Unrelated to this issue, but I've only been using Go for ~3 weeks, if my examples are weird or I'm misusing contexts, please let me know :) )
Environment
My example gif was recorded using vhs on an M2 Macbook Air running Sonoma 14.2.1, but I've also been able to replicate this on Windows 10 machines.

This seems to have been fixed on main, or at least I cannot reproduce it with your example.
Closing, let me know otherwise!
Thanks for the issue! <3


Minor tokenization issue with lowercase 'i' + contraction

spaCy correctly tokenizes capital "I" + contraction ('d, 'm, 'll, 've) e.g.:
from spacy.en import English
nlp = English()
tok = nlp("I'm")
print([x.lower_ for x in tok])

 >>> ['i', "'m"]
but when the "I" is a lowercase ("i") it does not tokenize into two tokens:
from spacy.en import English
nlp = English()
tok = nlp("i'm")
print([x.lower_ for x in tok])

 >>> ["i'm"]
Not a big deal, and this may be the intent, since we don't know if the user meant capital "I", but I can't think of any problems that would happen if it tokenized the lowercase version into two.

Thanks, this is a gap in the tokenization special-case data. I'll fix this. It should also handle stuff like "im".

Fixed in version 0.70.


Document how to install the Streaming Integrator profile using AWS Cloud Formation.

Description:
Document how to install the Streaming Integrator profile using AWS Cloud Formation.
Suggested Labels:
Streaming-Integration docs
Affected Product Version:
EI 7.0.0
Link
https://github.com/wso2/docs-ei/blob/master/en/streaming-integrator/docs/setup/installing-Stream-Processor-Using-AWS-Cloud-Formation.md

Obsolete


replace the changes to ATNA that point at Gazelle, back to inline tables

https://gazelle.ihe.net/gss/audit-messages/list.seam

Complete for
ITI-18
ITI-10
ITI-21
ITI-22

@lynnfel do you think we should just do these four transactions, and see what happens? I could easily enough do a few more on friday, and more each week... Or we could just stick with these until we get some feedback and decide the next step in January. What do you think we should do?

will finish these after initial release to the public

ACTION: John to replicate the original ATNA tables in transactions
ITI-18
ITI-10
ITI-21
ITI-22
ACTION: Lynn to review for approval

the changes were done in the github commit AFTER
c412c3c7ab1d37d4e5a24cd9e8ce29665e917cbf
so that commit tag is what was there prior to the change to gazelle.