mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-03 17:54:16 +01:00
V7.3: more LCD bugfxes
This commit is contained in:
parent
8486e64bb6
commit
cac5392a07
@ -4,8 +4,8 @@
|
||||
This project represents a community-driven effort to provide
|
||||
an easy to build and easy to modify cartridge dumper.
|
||||
|
||||
Date: 18.11.2021
|
||||
Version: 7.2
|
||||
Date: 29.11.2021
|
||||
Version: 7.3
|
||||
|
||||
SD lib: https://github.com/greiman/SdFat
|
||||
OLED lib: https://github.com/adafruit/Adafruit_SSD1306
|
||||
@ -45,7 +45,7 @@
|
||||
|
||||
**********************************************************************************/
|
||||
|
||||
char ver[5] = "7.2";
|
||||
char ver[5] = "7.3";
|
||||
|
||||
/******************************************
|
||||
Libraries
|
||||
@ -643,8 +643,6 @@ void aboutScreen() {
|
||||
wait_serial();
|
||||
resetArduino();
|
||||
#endif
|
||||
setColor_RGB(random(0, 255), random(0, 255), random(0, 255));
|
||||
delay(random(50, 100));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1196,7 +1194,7 @@ void blinkLED() {
|
||||
#if (defined(enable_OLED) || defined(enable_serial))
|
||||
PORTB ^= (1 << 4);
|
||||
#elif defined(enable_LCD)
|
||||
PORTB ^= (1 << 7);
|
||||
//PORTB ^= (1 << 7);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1227,6 +1225,9 @@ int checkButton() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (reading == buttonState) {
|
||||
return 0;
|
||||
}
|
||||
// Check if button has changed
|
||||
else {
|
||||
if (reading != lastButtonState) {
|
||||
@ -1777,7 +1778,7 @@ unsigned char questionBox_OLED(const __FlashStringHelper * question, char answer
|
||||
Filebrowser Module
|
||||
*****************************************/
|
||||
void fileBrowser(const __FlashStringHelper * browserTitle) {
|
||||
char fileNames[30][FILENAME_LENGTH];
|
||||
char fileNames[7][FILENAME_LENGTH];
|
||||
int currFile;
|
||||
filebrowse = 1;
|
||||
|
||||
@ -1804,25 +1805,17 @@ browserstart:
|
||||
print_Error(F("SD Error"), true);
|
||||
}
|
||||
|
||||
// Read in File as long as there are files
|
||||
while (myFile.openNext(&myDir, O_READ) && (currFile < 29)) {
|
||||
|
||||
// Get name of file
|
||||
myFile.getName(nameStr, FILENAME_LENGTH);
|
||||
|
||||
// Count files in directory
|
||||
while (myFile.openNext(&myDir, O_READ)) {
|
||||
// Ignore if hidden
|
||||
if (myFile.isHidden()) {
|
||||
}
|
||||
// Indicate a directory.
|
||||
else if (myFile.isDir()) {
|
||||
// Copy full dirname into fileNames
|
||||
snprintf(fileNames[currFile], FILENAME_LENGTH, "%s%s", "/", nameStr);
|
||||
currFile++;
|
||||
}
|
||||
// It's just a file
|
||||
else if (myFile.isFile()) {
|
||||
// Copy full filename into fileNames
|
||||
snprintf(fileNames[currFile], FILENAME_LENGTH, "%s", nameStr);
|
||||
currFile++;
|
||||
}
|
||||
myFile.close();
|
||||
@ -1872,9 +1865,45 @@ page:
|
||||
wait();
|
||||
}
|
||||
|
||||
// Open filepath directory
|
||||
if (!myDir.open(filePath)) {
|
||||
display_Clear();
|
||||
print_Error(F("SD Error"), true);
|
||||
}
|
||||
|
||||
int countFile = 0;
|
||||
byte i = 0;
|
||||
// Cycle through all files
|
||||
while ((myFile.openNext(&myDir, O_READ)) && (i < 8)) {
|
||||
// Get name of file
|
||||
myFile.getName(nameStr, FILENAME_LENGTH);
|
||||
|
||||
// Ignore if hidden
|
||||
if (myFile.isHidden()) {
|
||||
}
|
||||
// Directory
|
||||
else if (myFile.isDir()) {
|
||||
if (countFile == ((currPage - 1) * 7 + i)) {
|
||||
snprintf(fileNames[i], FILENAME_LENGTH, "%s%s", "/", nameStr);
|
||||
i++;
|
||||
}
|
||||
countFile++;
|
||||
}
|
||||
// File
|
||||
else if (myFile.isFile()) {
|
||||
if (countFile == ((currPage - 1) * 7 + i)) {
|
||||
snprintf(fileNames[i], FILENAME_LENGTH, "%s", nameStr);
|
||||
i++;
|
||||
}
|
||||
countFile++;
|
||||
}
|
||||
myFile.close();
|
||||
}
|
||||
myDir.close();
|
||||
|
||||
for (byte i = 0; i < 8; i++ ) {
|
||||
// Copy short string into fileOptions
|
||||
snprintf( answers[i], FILEOPTS_LENGTH, "%s", fileNames[ ((currPage - 1) * 7 + i)] );
|
||||
snprintf( answers[i], FILEOPTS_LENGTH, "%s", fileNames[i] );
|
||||
}
|
||||
|
||||
// Create menu with title and 1-7 options to choose from
|
||||
@ -1901,31 +1930,31 @@ page:
|
||||
switch (answer)
|
||||
{
|
||||
case 0:
|
||||
strncpy(fileName, fileNames[0 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[0], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
strncpy(fileName, fileNames[1 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[1], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
strncpy(fileName, fileNames[2 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[2], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
strncpy(fileName, fileNames[3 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[3], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
strncpy(fileName, fileNames[4 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[4], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
strncpy(fileName, fileNames[5 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[5], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
strncpy(fileName, fileNames[6 + ((currPage - 1) * 7)], FILENAME_LENGTH - 1);
|
||||
strncpy(fileName, fileNames[6], FILENAME_LENGTH - 1);
|
||||
break;
|
||||
|
||||
//case 7:
|
||||
|
@ -1126,7 +1126,8 @@ unsigned char* getNES20HeaderBytesFromDatabaseRow(const char* crctest) {
|
||||
Config Functions
|
||||
*****************************************/
|
||||
void setMapper() {
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
// OLED
|
||||
#if defined(enable_OLED)
|
||||
chooseMapper:
|
||||
// Read stored mapper
|
||||
EEPROM_readAnything(7, newmapper);
|
||||
@ -1140,19 +1141,18 @@ chooseMapper:
|
||||
// Cycle through al 3 digits
|
||||
for (byte digit = 0; digit < 3; digit++) {
|
||||
while (1) {
|
||||
display.clearDisplay();
|
||||
display.setCursor(0, 0);
|
||||
display.println("Select Mapper:");
|
||||
display_Clear();
|
||||
println_Msg("Select Mapper:");
|
||||
display.setCursor(23, 20);
|
||||
display.println(hundreds);
|
||||
println_Msg(hundreds);
|
||||
display.setCursor(43, 20);
|
||||
display.println(tens);
|
||||
println_Msg(tens);
|
||||
display.setCursor(63, 20);
|
||||
display.println(units);
|
||||
display.println("");
|
||||
display.println(F("Press to Change"));
|
||||
display.println(F("Hold to Select"));
|
||||
#ifdef enable_OLED
|
||||
println_Msg(units);
|
||||
println_Msg("");
|
||||
println_Msg(F("Press to Change"));
|
||||
println_Msg(F("Hold to Select"));
|
||||
|
||||
if (digit == 0) {
|
||||
display.drawLine(20, 30, 30, 30, WHITE);
|
||||
display.drawLine(40, 30, 50, 30, BLACK);
|
||||
@ -1168,30 +1168,7 @@ chooseMapper:
|
||||
display.drawLine(40, 30, 50, 30, BLACK);
|
||||
display.drawLine(60, 30, 70, 30, WHITE);
|
||||
}
|
||||
#else
|
||||
if (digit == 0) {
|
||||
display.setDrawColor(1);
|
||||
display.drawLine(20, 30, 30, 30);
|
||||
display.setDrawColor(0);
|
||||
display.drawLine(40, 30, 50, 30);
|
||||
display.drawLine(60, 30, 70, 30);
|
||||
}
|
||||
else if (digit == 1) {
|
||||
display.setDrawColor(0);
|
||||
display.drawLine(20, 30, 30, 30);
|
||||
display.setDrawColor(1);
|
||||
display.drawLine(40, 30, 50, 30);
|
||||
display.setDrawColor(0);
|
||||
display.drawLine(60, 30, 70, 30);
|
||||
}
|
||||
else if (digit == 2) {
|
||||
display.setDrawColor(0);
|
||||
display.drawLine(20, 30, 30, 30);
|
||||
display.drawLine(40, 30, 50, 30);
|
||||
display.setDrawColor(1);
|
||||
display.drawLine(60, 30, 70, 30);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Check Button
|
||||
1 click
|
||||
2 doubleClick
|
||||
@ -1258,15 +1235,11 @@ chooseMapper:
|
||||
else if (b == 3) {
|
||||
break;
|
||||
}
|
||||
#ifdef enable_OLED
|
||||
|
||||
display.display();
|
||||
#else
|
||||
display.updateDisplay();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
display.clearDisplay();
|
||||
display.setCursor(0, 0);
|
||||
display_Clear();
|
||||
|
||||
newmapper = hundreds * 100 + tens * 10 + units;
|
||||
|
||||
@ -1281,16 +1254,74 @@ chooseMapper:
|
||||
if (!validMapper) {
|
||||
errorLvl = 1;
|
||||
display.println("Mapper not supported");
|
||||
#ifdef enable_OLED
|
||||
display.display();
|
||||
#else
|
||||
display.updateDisplay();
|
||||
#endif
|
||||
wait();
|
||||
goto chooseMapper;
|
||||
}
|
||||
#endif
|
||||
#ifdef enable_serial
|
||||
|
||||
// LCD
|
||||
#elif defined(enable_LCD)
|
||||
int i = 0;
|
||||
|
||||
display_Clear();
|
||||
mapselect = pgm_read_byte(mapsize + i * 7);
|
||||
print_Msg(F("Mapper: "));
|
||||
println_Msg(mapselect);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
display_Update();
|
||||
|
||||
while (1) {
|
||||
int b = checkButton();
|
||||
|
||||
if (b == 2) { // Previous Mapper
|
||||
if (i == 0)
|
||||
i = mapcount - 1;
|
||||
else
|
||||
i--;
|
||||
|
||||
display_Clear();
|
||||
mapselect = pgm_read_byte(mapsize + i * 7);
|
||||
print_Msg(F("Mapper: "));
|
||||
println_Msg(mapselect);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
display_Update();
|
||||
}
|
||||
|
||||
else if (b == 1) { // Next Mapper
|
||||
if (i == (mapcount - 1))
|
||||
i = 0;
|
||||
else
|
||||
i++;
|
||||
|
||||
display_Clear();
|
||||
mapselect = pgm_read_byte(mapsize + i * 7);
|
||||
print_Msg(F("Mapper: "));
|
||||
println_Msg(mapselect);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
display_Update();
|
||||
}
|
||||
|
||||
else if (b == 3) { // Long Press - Execute
|
||||
newmapper = mapselect;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
display.setCursor(0, 56 + 8);
|
||||
print_Msg(F("MAPPER "));
|
||||
print_Msg(newmapper);
|
||||
println_Msg(F(" SELECTED"));
|
||||
display_Update();
|
||||
delay(1000);
|
||||
|
||||
// Serial Monitor
|
||||
#elif defined(enable_serial)
|
||||
setmapper:
|
||||
String newmap;
|
||||
mapfound = false;
|
||||
@ -1356,26 +1387,55 @@ void setPRGSize() {
|
||||
else {
|
||||
b = 0;
|
||||
int i = prglo;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("PRG Size: "));
|
||||
println_Msg(PRG[i]);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
display_Update();
|
||||
|
||||
while (1) {
|
||||
display_Clear();
|
||||
print_Msg(F("PRG Size: "));
|
||||
println_Msg(PRG[i]);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press to Change"));
|
||||
println_Msg(F("Hold to Select"));
|
||||
display_Update();
|
||||
b = checkButton();
|
||||
|
||||
if (b == doubleclick) { // Previous
|
||||
if (i == prglo)
|
||||
i = prghi;
|
||||
else
|
||||
i--;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("PRG Size: "));
|
||||
println_Msg(PRG[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
if (b == press) { // Next
|
||||
if (i == prghi)
|
||||
i = prglo;
|
||||
else
|
||||
i++;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("PRG Size: "));
|
||||
println_Msg(PRG[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
if (b == hold) { // Long Press - Execute
|
||||
newprgsize = i;
|
||||
@ -1390,8 +1450,8 @@ void setPRGSize() {
|
||||
println_Msg(F("K"));
|
||||
display_Update();
|
||||
delay(1000);
|
||||
#endif
|
||||
#ifdef enable_serial
|
||||
|
||||
#elif defined(enable_serial)
|
||||
if (prglo == prghi)
|
||||
newprgsize = prglo;
|
||||
else {
|
||||
@ -1431,27 +1491,63 @@ void setCHRSize() {
|
||||
else {
|
||||
b = 0;
|
||||
int i = chrlo;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("CHR Size: "));
|
||||
println_Msg(CHR[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
while (1) {
|
||||
display_Clear();
|
||||
print_Msg(F("CHR Size: "));
|
||||
println_Msg(CHR[i]);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press to Change"));
|
||||
println_Msg(F("Hold to Select"));
|
||||
display_Update();
|
||||
b = checkButton();
|
||||
|
||||
if (b == doubleclick) { // Previous
|
||||
if (i == chrlo)
|
||||
i = chrhi;
|
||||
else
|
||||
i--;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("CHR Size: "));
|
||||
println_Msg(CHR[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
|
||||
if (b == press) { // Next
|
||||
if (i == chrhi)
|
||||
i = chrlo;
|
||||
else
|
||||
i++;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("CHR Size: "));
|
||||
println_Msg(CHR[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
|
||||
if (b == hold) { // Long Press - Execute
|
||||
newchrsize = i;
|
||||
break;
|
||||
@ -1464,8 +1560,8 @@ void setCHRSize() {
|
||||
println_Msg(F("K"));
|
||||
display_Update();
|
||||
delay(1000);
|
||||
#endif
|
||||
#ifdef enable_serial
|
||||
|
||||
#elif defined(enable_serial)
|
||||
if (chrlo == chrhi)
|
||||
newchrsize = chrlo;
|
||||
else {
|
||||
@ -1505,42 +1601,108 @@ void setRAMSize() {
|
||||
else {
|
||||
b = 0;
|
||||
int i = 0;
|
||||
while (1) {
|
||||
display_Clear();
|
||||
print_Msg(F("RAM Size: "));
|
||||
if (mapper == 0)
|
||||
println_Msg(RAM[i] / 4);
|
||||
else if (mapper == 16)
|
||||
println_Msg(RAM[i] * 32);
|
||||
else if (mapper == 19) {
|
||||
if (i == 2)
|
||||
println_Msg(F("128"));
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
}
|
||||
else if ((mapper == 159) || (mapper == 80))
|
||||
println_Msg(RAM[i] * 16);
|
||||
else if (mapper == 82)
|
||||
println_Msg(i * 5);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("RAM Size: "));
|
||||
if (mapper == 0)
|
||||
println_Msg(RAM[i] / 4);
|
||||
else if (mapper == 16)
|
||||
println_Msg(RAM[i] * 32);
|
||||
else if (mapper == 19) {
|
||||
if (i == 2)
|
||||
println_Msg(F("128"));
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press to Change"));
|
||||
println_Msg(F("Hold to Select"));
|
||||
display_Update();
|
||||
}
|
||||
else if ((mapper == 159) || (mapper == 80))
|
||||
println_Msg(RAM[i] * 16);
|
||||
else if (mapper == 82)
|
||||
println_Msg(i * 5);
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
while (1) {
|
||||
b = checkButton();
|
||||
|
||||
if (b == doubleclick) { // Previous Mapper
|
||||
if (i == 0)
|
||||
i = ramhi;
|
||||
else
|
||||
i--;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("RAM Size: "));
|
||||
if (mapper == 0)
|
||||
println_Msg(RAM[i] / 4);
|
||||
else if (mapper == 16)
|
||||
println_Msg(RAM[i] * 32);
|
||||
else if (mapper == 19) {
|
||||
if (i == 2)
|
||||
println_Msg(F("128"));
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
}
|
||||
else if ((mapper == 159) || (mapper == 80))
|
||||
println_Msg(RAM[i] * 16);
|
||||
else if (mapper == 82)
|
||||
println_Msg(i * 5);
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
|
||||
if (b == press) { // Next
|
||||
if (i == ramhi)
|
||||
i = 0;
|
||||
else
|
||||
i++;
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("RAM Size: "));
|
||||
if (mapper == 0)
|
||||
println_Msg(RAM[i] / 4);
|
||||
else if (mapper == 16)
|
||||
println_Msg(RAM[i] * 32);
|
||||
else if (mapper == 19) {
|
||||
if (i == 2)
|
||||
println_Msg(F("128"));
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
}
|
||||
else if ((mapper == 159) || (mapper == 80))
|
||||
println_Msg(RAM[i] * 16);
|
||||
else if (mapper == 82)
|
||||
println_Msg(i * 5);
|
||||
else
|
||||
println_Msg(RAM[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to change"));
|
||||
println_Msg(F("Press right to select"));
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to change"));
|
||||
println_Msg(F("Press to select"));
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
|
||||
if (b == hold) { // Long Press - Execute
|
||||
newramsize = i;
|
||||
break;
|
||||
@ -1585,8 +1747,8 @@ void setRAMSize() {
|
||||
}
|
||||
display_Update();
|
||||
delay(1000);
|
||||
#endif
|
||||
#ifdef enable_serial
|
||||
|
||||
#elif defined(enable_serial)
|
||||
if (ramlo == ramhi)
|
||||
newramsize = ramlo;
|
||||
else {
|
||||
|
Loading…
Reference in New Issue
Block a user