Once I found out about putting the .clang-format file in the sketch directory I experimented and the BreakBeforeBraces: Allman
style of braces, ie a new line before braces, suited how I normally format code so I tested it in 2.0 rc1 and it did what I wanted, but I cannot recall having tried it beyond a trivial sketch, and certainly not with such a long line of function definition. I found the problem when trying the formatting on a much larger sketch, the function definition of which is what I gave as my example
Here is the ino.cpp file for the failed compile after Auto Format
#include <Arduino.h>
#line 1 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
MatrixPanel_I2S_DMA *display = nullptr;
int PANEL_RES_X = 64; // Number of pixels wide of each INDIVIDUAL panel module.
int PANEL_RES_Y = 64; // Number of pixels tall of each INDIVIDUAL panel module.
int PANEL_CHAIN = 1; // Total number of panels chained one to another
uint16_t blackTile = display->color565(0, 0, 0); // black
uint16_t frameColour = display->color565(0, 0, 255); // blue
uint16_t textColour = display->color565(255, 255, 255); // white
enum directions
{
RIGHT,
LEFT,
UP,
DOWN,
NONE
};
byte oppositeDirections[] = {LEFT, RIGHT, DOWN, UP};
const byte tileSize = 9;
const int wait = 100;
const byte numOfBlocksX = 4;
const byte numOfBlocksY = 4;
struct blockData
{
byte topLeftX;
byte topLeftY;
byte open = NONE;
bool filled = true;
int tileNumber;
};
const char tileLetters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
blockData blocks[numOfBlocksX][numOfBlocksY];
#line 43 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void setup();
#line 57 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void loop();
#line 104 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void slideBlock(byte blockX, byte blockY, int dir);
#line 166 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void setupMatrix();
#line 181 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void drawBoard();
#line 206 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void drawTile(int x, int y);
#line 213 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void clearOpens();
#line 224 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void findEmptyBlock(int &blockX, int &blockY);
#line 240 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void updateOpens();
#line 275 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void showTileLetter(int x, int y, char letter);
#line 283 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void blankTile(int x, int y);
#line 288 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void drawTileFrame(int x, int y);
#line 43 "C:\\Users\\Bob2\\Documents\\Arduino\\__matrix-panel\\_blockslide\\blockSlide44\\blockSlide44.ino"
void setup()
{
Serial.begin(115200);
setupMatrix();
display->setBrightness8(32); // 0-255
blocks[numOfBlocksX - 1][numOfBlocksY - 1].filled =
false; // start with bottom/right empty
blocks[numOfBlocksX - 1][numOfBlocksY - 1].open = NONE;
blocks[numOfBlocksX - 1][numOfBlocksY - 1].tileNumber =
-1; // tile number for empty tile
drawBoard();
delay(2000);
}
void loop()
{
static byte prevDirection;
int blockX;
int blockY;
findEmptyBlock(blockX, blockY); // note - pass by reference
byte openDirections[4]; // test 4 directions around empty block
byte openCount = 0;
if (blockX > 0) // not at the left
{
openDirections[openCount++] = RIGHT;
}
if (blockX < numOfBlocksX - 1) // not at the right
{
openDirections[openCount++] = LEFT;
}
if (blockY > 0) // not at the top
{
openDirections[openCount++] = DOWN;
}
if (blockY < numOfBlocksY - 1) // not at the bottom
{
openDirections[openCount++] = UP;
}
byte direction = openDirections[random(openCount)];
if (direction != oppositeDirections[prevDirection]) // prevent bounces
{
switch (direction)
{
case RIGHT:
blockX--;
break;
case LEFT:
blockX++;
break;
case UP:
blockY++;
break;
case DOWN:
blockY--;
break;
};
slideBlock(blockX, blockY, direction);
prevDirection = direction;
}
}
void slideBlock(byte blockX, byte blockY, int dir)
{
static int rightCount = 0;
static int leftCount = 0;
static int upCount = 0;
static int downCount = 0;
switch (dir)
{
case RIGHT:
for (int x = blocks[blockX][blockY].topLeftX;
x < blocks[blockX][blockY].topLeftX + tileSize; x++)
{
blankTile(x, blocks[blockX][blockY].topLeftY);
drawTileFrame(x + 1, blocks[blockX][blockY].topLeftY);
showTileLetter(x, blocks[blockX][blockY].topLeftY,
tileLetters[blocks[blockX][blockY].tileNumber]);
delay(wait);
}
updateOpenAndFilled(blockX, blockY, blockX + 1, blockY);
break;
//
case LEFT:
for (int x = blocks[blockX][blockY].topLeftX;
x > blocks[blockX][blockY].topLeftX - tileSize; x--)
{
blankTile(x, blocks[blockX][blockY].topLeftY);
drawTileFrame(x - 1, blocks[blockX][blockY].topLeftY);
showTileLetter(x - 2, blocks[blockX][blockY].topLeftY,
tileLetters[blocks[blockX][blockY].tileNumber]);
delay(wait);
}
updateOpenAndFilled(blockX, blockY, blockX - 1, blockY);
break;
//
case UP:
for (int y = blocks[blockX][blockY].topLeftY;
y > blocks[blockX][blockY].topLeftY - tileSize; y--)
{
blankTile(blocks[blockX][blockY].topLeftX, y);
drawTileFrame(blocks[blockX][blockY].topLeftX, y - 1);
showTileLetter(blocks[blockX][blockY].topLeftX - 1, y - 1,
tileLetters[blocks[blockX][blockY].tileNumber]);
delay(wait);
}
updateOpenAndFilled(blockX, blockY, blockX, blockY - 1);
break;
//
case DOWN:
for (int y = blocks[blockX][blockY].topLeftY;
y < blocks[blockX][blockY].topLeftY + tileSize; y++)
{
blankTile(blocks[blockX][blockY].topLeftX, y);
drawTileFrame(blocks[blockX][blockY].topLeftX, y + 1);
showTileLetter(blocks[blockX][blockY].topLeftX - 1, y + 1,
tileLetters[blocks[blockX][blockY].tileNumber]);
delay(wait);
}
updateOpenAndFilled(blockX, blockY, blockX, blockY + 1);
break;
};
}
void setupMatrix()
{
HUB75_I2S_CFG mxconfig(PANEL_RES_X, // module width
PANEL_RES_Y, // module height
PANEL_CHAIN // Chain length
);
mxconfig.gpio.e = 18;
mxconfig.clkphase = false;
mxconfig.driver = HUB75_I2S_CFG::FM6126A;
mxconfig.double_buff = true;
display = new MatrixPanel_I2S_DMA(mxconfig);
display->begin();
display->clearScreen();
}
void drawBoard()
{
byte tileNumber = 0;
display->drawRect(0, 0, tileSize * numOfBlocksX + 2,
tileSize * numOfBlocksX + 2, frameColour);
for (int blockY = 0; blockY < numOfBlocksY; blockY++)
{
for (int blockX = 0; blockX < numOfBlocksX; blockX++)
{
blocks[blockX][blockY].tileNumber = tileNumber++;
blocks[blockX][blockY].topLeftX = blockX * tileSize + 1;
blocks[blockX][blockY].topLeftY = blockY * tileSize + 1;
if (blocks[blockX][blockY].filled)
{
drawTile(blocks[blockX][blockY].topLeftX,
blocks[blockX][blockY].topLeftY);
showTileLetter(blocks[blockX][blockY].topLeftX - 1,
blocks[blockX][blockY].topLeftY,
tileLetters[blocks[blockX][blockY].tileNumber]);
}
}
}
updateOpens();
}
void drawTile(int x, int y)
{
display->fillRect(x, y, tileSize, tileSize, blackTile);
display->drawRect(x, y, tileSize, tileSize, frameColour);
delay(wait);
}
void clearOpens()
{
for (int blockY = 0; blockY < numOfBlocksY; blockY++)
{
for (int blockX = 0; blockX < numOfBlocksX; blockX++)
{
blocks[blockX][blockY].open = NONE; // remove current open flag
}
}
}
void findEmptyBlock(int &blockX, int &blockY) // NOTE - pass by reference
{
for (int y = 0; y < numOfBlocksY; y++)
{
for (int x = 0; x < numOfBlocksX; x++)
{
if (blocks[x][y].filled == false) // found the empty tile
{
blockX = x;
blockY = y;
return;
}
}
}
}
void updateOpens()
{
clearOpens();
int blockX;
;
int blockY;
findEmptyBlock(blockX, blockY); // note - pass by reference
if (blockX == 0)
{
blocks[blockX + 1][blockY].open = LEFT;
}
else if (blockX == numOfBlocksX - 1)
{
blocks[blockX - 1][blockY].open = RIGHT;
}
else
{
blocks[blockX + 1][blockY].open = LEFT;
blocks[blockX - 1][blockY].open = RIGHT;
}
if (blockY == 0)
{
blocks[blockX][blockY + 1].open = UP;
}
else if (blockY == numOfBlocksY - 1)
{
blocks[blockX][blockY - 1].open = DOWN;
}
else
{
blocks[blockX][blockY - 1].open = DOWN;
blocks[blockX][blockY + 1].open = UP;
}
}
void showTileLetter(int x, int y, char letter)
{
display->setTextSize(0);
display->setTextColor(textColour);
display->setCursor(x + 3, y + 1);
display->print(letter);
}
void blankTile(int x, int y)
{
display->fillRect(x, y, tileSize, tileSize, blackTile);
}
void drawTileFrame(int x, int y)
{
display->drawRect(x, y, tileSize, tileSize, frameColour);
}
void updateOpenAndFilled(int sourceBlockX, int sourceBlockY, int destBlockX,
int destBlockY)
{
blocks[destBlockX][destBlockY].filled = true; // destination is filled
blocks[sourceBlockX][sourceBlockY].filled = false; // source block is now
// empty
blocks[destBlockX][destBlockY].tileNumber =
blocks[sourceBlockX][sourceBlockY].tileNumber;
blocks[sourceBlockX][sourceBlockY].tileNumber =
-1; // no tile number on empty tile
updateOpens();
}