Trouble with multiple phantom touches using XPT2046

Status
Not open for further replies.

Matadormac

Well-known member
Good day all.

I have been wrestling with this for some time now and would like the benefit of the forum's help in finding where I am going wrong. It is likely something simple but I just can't see it.

I am using the ILI9341 touchscreen display from PJRC. I am using the latest Arduino 1.6.7 and the Tenesy loader 1.27-beta1 on Windows 10, 64 bit.

As you will see I am trying to work with T-IRQ = 2 which is wired back to the Teensy 3.2 number 2 pin.

Here are the pin defines:
#define CS_PIN 8
//XPT2046_Touchscreen ts(CS_PIN);
#define TFT_CS 10
#define TFT_DC 15 (I have an SD card wired to pin 9 so I had to change this pin association)
#define TIRQ_PIN 2
ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);
XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN);

At this point in my program I am dealing with setting the Teensy RTC. I have created buttons and boxes for: year, month, day, hour and minute and also number buttons 0 through 9 and DELETE.

The problem I have been having all along is that I seem to be getting multiple "hits" from a single sustained touch as well as repeating hits. I think that I am not implementing the interrupt correctly but as I say at this point after some days of experimenting I cannot figure this out.

In order to facilitate bug hunting I shortened my original program which works through all the parts of the RTC set time string. And the sketch below is what I have been trying to make work for some days now. Once I can get it to work it should be straight forward for me to add in the rest of the functions as they are basically similar, just putting different numbers into different boxes but using the same basic code.

Here is the sketch code I am currently working with:

Code:
#include <SPI.h>
#include <Wire.h>
#include <ILI9341_t3.h>
#include <XPT2046_Touchscreen.h>
#include <TimeLib.h>
#include <font_Arial.h> // from ILI9341_t3


// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 240
#define TS_MINY 325
#define TS_MAXX 3700
#define TS_MAXY 3670


#define CS_PIN 8
//XPT2046_Touchscreen ts(CS_PIN);
#define TFT_CS 10
#define TFT_DC  15
#define TIRQ_PIN  2
ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);
XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN);  // Param 2 - Touch IRQ Pin - interrupt enabled polling

struct TS_MAP {
  int16_t xt;
  int16_t xb;
  int16_t yl;
  int16_t yr;
};

TS_MAP tsMap[4] = {   { 0, 319, 0, 239 }, { 319, 0, 0, 239 }, { 319, 0, 239, 0 }, { 0, 319, 239, 0 } };
int16_t TS_Rotate = 1;


void TimeButton()
{
  tft.fillRoundRect(3, 6, 148, 75, 10, ILI9341_RED);
  //  drawFrame();
  tft.setCursor(12, 20);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println("Get Time");
  tft.setCursor(48, 50);
  tft.println("And Date");
  //  RecordOn = false;
}

void SetTimeButton()
{
  //  tft.fillRoundRect(10, 70, 300, 40, 10, ILI9341_RED);
  tft.fillRoundRect(158, 5, 160, 75, 10, ILI9341_RED);
  //  drawFrame();
  tft.setCursor(190, 20);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Set Date ");
  tft.setCursor(184, 50);
  tft.println("And Time?");
  //  RecordOn = false;
}

/**************************************************************************/
void SetDate(void)
{
  tft.fillScreen(ILI9341_BLUE);
  YearButton();
  MonthButton();
  DayButton();
  HourButton();
  MinuteButton();
  SetTheClock();
  ZeroButton();
  OneButton();
  TwoButton();
  ThreeButton();
  FourButton();
  FiveButton();
  SixButton();
  SevenButton();
  EightButton();
  NineButton();
  DeleteButton();
}

/**************************************************************************/




//===================================================
// variables to be used in this sketch
int All;
int SetTimeAndDate;
int NeedYear;
int NeedMonth;
int NeedDay;
int NeedHour;
int NeedMinute;
int InfoNeeded;
//====================================================
//Strings we will need to use
String TheYear, TheMonth, TheDay, TheHour, TheMinute, TheSecond;

//====================================================

void setup(void)
{
  // set the Time library to use Teensy 3.0's RTC to keep time
  setSyncProvider(getTeensy3Time);

  Serial.begin(9600);
  while ( !Serial && (millis() < 2000)) ;
  tft.begin();
  ts.begin();
  if (!ts.begin()) {
    Serial.println("Unable to start touchscreen.");
  }
  else {
    Serial.println("Touchscreen started.");
  }
  int SetTimeAndDate = 0;
  tft.fillScreen(ILI9341_BLUE);
  TS_Rotate = 0;
  tft.setRotation(1 + TS_Rotate);
  //  tft.setRotation(3);


  TimeButton();
  SetTimeButton();
}
//========================================================================
boolean wastouched = true;
elapsedMillis waitTouch;
elapsedMillis noTouch;
TS_Point p;
//=========================================================================

void loop() {
  // put your main code here, to run repeatedly:
  //  switch (SetTimeAndDate) {
  //    case 0:
  if (waitTouch > 100) {
    if ( ts.touched()) {
      p = ts.getPoint();
      Serial.print("Pressure = ");
      Serial.print(p.z);
      Serial.print(", x = ");
      Serial.print(p.x);
      Serial.print(", y = ");
      Serial.print(p.y);
      Serial.println();
      if ( !TS_GetMap( p.x, p.y ) ) {
        return;
      }
      switch (SetTimeAndDate) {
        case 0:
          //==========================================
          //Get Time Button
          if ((p.x > 3) && (p.x < (150))) {
            if ((p.y > 5) && (p.y <= (75))) {
              delay(500);
              Serial.println(SetTimeAndDate);
              Serial.println("Get Time button hit");
              if (SetTimeAndDate == 0)
              {
                digitalClockDisplay();
              }
            }
            delay(100);
          }
          //==========================================================
          if ((p.x > 158) && (p.x < (320))) {
            if ((p.y > 5) && (p.y <= (75))) {
              delay(500);
              ++SetTimeAndDate;
              //          SetTimeAndDate == SetTimeAndDate + 1;
              Serial.println();
              Serial.println("Set Date and Time button hit");
              Serial.print("SetTimAndDate is now "); Serial.println(SetTimeAndDate);
              SetDate();
              InfoNeeded == 0;
              NeedYear == 0;
              NeedMonth == 0;
              NeedDay == 0;
              NeedHour == 0;
              NeedMinute == 0;
              TheYear == "";
              TheMonth == "";
              TheDay == "";
              TheHour == "";
              TheMinute == "";
              Serial.print("InfoNeeded is "); Serial.println(InfoNeeded);
              Serial.print("NeedYear is "); Serial.println(NeedYear);
              Serial.print("NeedMonth is "); Serial.println(NeedMonth);
              Serial.print("NeedDay is "); Serial.println(NeedDay);
              Serial.print("NeedHour is "); Serial.println(NeedHour);
              Serial.print("NeedMin is "); Serial.println(NeedMinute);
              Serial.print("TheYear is "); Serial.println(TheYear);
              Serial.print("TheMonth is "); Serial.println(TheMonth);
              Serial.print("TheDay is now "); Serial.println(TheDay);
              Serial.print("TheMinute is now "); Serial.println(TheMinute);
              Serial.println();
            }
            delay(100);
          }
          break;
        //==========================================================
        //      }
        //    }

        case 1:
          if (waitTouch > 100) {
            if ( ts.touched()) {
              p = ts.getPoint();
              // Serial.print("SetTimeAndDate is now "); Serial.println(SetTimeAndDate);
              Serial.print("Pressure = ");
              Serial.print(p.z);
              Serial.print(", x = ");
              Serial.print(p.x);
              Serial.print(", y = ");
              Serial.print(p.y);
              Serial.println();

              if ( !TS_GetMap( p.x, p.y ) ) {
                return;
              }
              //==========================================
              //  tft.fillRoundRect(3, 6, 75, 35, 10, ILI9341_RED);
              //Get Year Button
              if ((p.x > 3) && (p.x < (78))) {
                if ((p.y > 6) && (p.y <= (40))) {
                  delay(500);
                  // Serial.print("SetTimeAndDate is now "); Serial.println(SetTimeAndDate);
                  Serial.println("What Year is it button hit");
                  tft.drawRoundRect(85, 6, 70, 35, 10, ILI9341_WHITE);
                  InfoNeeded = 1;
                  ++NeedYear;
                  NeedMonth == 0;
                  NeedDay == 0;
                  NeedHour == 0;
                  NeedMinute == 0;
                  TheYear == "";
                  Serial.print("InfoNeeded is now "); Serial.println(InfoNeeded);
                  Serial.print("NeedYear is now "); Serial.println(NeedYear);
                  Serial.print("NeedMonth is now "); Serial.println(NeedMonth);
                  Serial.print("NeedDay is now "); Serial.println(NeedDay);
                  Serial.print("NeedHour is now "); Serial.println(NeedHour);
                  Serial.print("NeedMinute is now "); Serial.println(NeedMinute);
                  Serial.print("TheYear is "); Serial.println(TheYear);
                  Serial.print("TheMonth is "); Serial.println(TheMonth);
                  Serial.print("TheDay is now "); Serial.println(TheDay);
                  Serial.print("TheMinute is now "); Serial.println(TheMinute);
                  Serial.println();
                }
                delay(100);
              }
            }
            break;
          }
      }
      switch (NeedYear) {
        case 1:
          if ((p.x > 3) && (p.x < (45))) {
            if ((p.y > 140) && (p.y <= (180))) {
              delay(500);
              Serial.println("Number Zero button hit");
              TheYear = TheYear + 0;
              Serial.print("TheYear is "); Serial.println(TheYear);
              tft.setCursor(90, 15);
              tft.setTextColor(ILI9341_WHITE);
              tft.setTextSize(2);
              tft.println(TheYear);
              Serial.print("InfoNeeded is now "); Serial.println(InfoNeeded);
              Serial.print("TheYear is "); Serial.println(TheYear);
              Serial.println();
              delay(100);
            }
          }
          break;
      }
    }
  }
}
//=====================================================
// END OF LOOP SECTION

#define TS_DEBOUNCE 2 // TX_Map() debounce factor
boolean TS_GetMap( int16_t &xx, int16_t &yy )
{
  static int16_t xxo = 500, yyo = 500;  // Store old/last returned x,y point
  if (!ts.touched()) return false;
  p = ts.getPoint();
  xx = map(p.x, TS_MINX, TS_MAXX, tsMap[TS_Rotate].xt, tsMap[TS_Rotate].xb);
  yy = map(p.y, TS_MINY, TS_MAXY, tsMap[TS_Rotate].yl, tsMap[TS_Rotate].yr);
  if (TS_Rotate % 2) {
    int16_t swap = xx;
    xx = yy;
    yy = swap;
  }
  // Debounce by +/-# pixel to minimize point jitter
  if ( ((xxo - TS_DEBOUNCE) <= xx) && ((xxo + TS_DEBOUNCE) >= xx) ) xx = xxo; else xxo = xx;
  if ( ((yyo - TS_DEBOUNCE) <= yy) && ((yyo + TS_DEBOUNCE) >= yy) ) yy = yyo; else yyo = yy;
  return true;
}

//================================================================
void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
  tft.fillRoundRect(3, 96, 314, 51, 10, ILI9341_RED);
  tft.drawRoundRect(3, 96, 314, 51, 10, ILI9341_WHITE);
  tft.setCursor(10, 101);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.print( "Time: "); tft.print(hour()); tft.print(":"); tft.print(minute());
  tft.print(":"); tft.println(second());
  tft.setCursor(10, 126);
  tft.print( "Date: "); tft.print(day()); tft.print(" "); tft.print(month()); tft.print(" ");
  tft.println(year());
  //}
}

time_t getTeensy3Time()
{
  return Teensy3Clock.get();
}



void printDigits(int digits) {
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/**************************************************************************/

void YearButton()
{
  tft.fillRoundRect(3, 6, 75, 35, 10, ILI9341_RED);
  tft.drawRoundRect(3, 6, 75, 35, 10, ILI9341_WHITE);
  tft.setCursor(12, 16);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Year?");
}
void MonthButton()
{
  tft.fillRoundRect(3, 46, 88, 35, 10, ILI9341_RED);
  tft.drawRoundRect(3, 46, 88, 35, 10, ILI9341_WHITE);
  tft.setCursor(12, 56);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Month?");
  // tft.drawRoundRect(98, 46, 40, 35, 10, ILI9341_WHITE);
}

void DayButton()
{
  tft.fillRoundRect(3, 86, 62, 35, 10, ILI9341_RED);
  tft.drawRoundRect(3, 86, 62, 35, 10, ILI9341_WHITE);
  tft.setCursor(12, 96);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Day?");
  // tft.drawRoundRect(72, 86, 40, 35, 10, ILI9341_WHITE);
}

void HourButton()
{
  tft.fillRoundRect(170, 6, 75, 35, 10, ILI9341_RED);
  tft.drawRoundRect(170, 6, 75, 35, 10, ILI9341_WHITE);
  tft.setCursor(179, 16);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Hour?");
  // tft.drawRoundRect(252, 6, 40, 35, 10, ILI9341_WHITE);
}

void MinuteButton()
{
  tft.fillRoundRect(170, 46, 75, 35, 10, ILI9341_RED);
  tft.drawRoundRect(170, 46, 75, 35, 10, ILI9341_WHITE);
  tft.setCursor(179, 56);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Min.?");
  // tft.drawRoundRect(252, 46, 40, 35, 10, ILI9341_WHITE);
}

void SetTheClock()
{
  tft.fillRoundRect(170, 96, 135, 35, 10, ILI9341_RED);
  tft.drawRoundRect(170, 96, 135, 35, 10, ILI9341_WHITE);
  tft.setCursor(179, 106);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println( "Set Clock?");
  // tft.drawRoundRect(252, 46, 40, 35, 10, ILI9341_WHITE);
}
void ZeroButton()
{
  tft.fillRoundRect(3, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(3, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(18, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println( "0");
}

void OneButton()
{
  tft.fillRoundRect(58, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(58, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(73, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("1");
}

void TwoButton()
{
  tft.fillRoundRect(113, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(113, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(128, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("2");
}
void ThreeButton()
{
  tft.fillRoundRect(168, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(168, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(183, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("3");
}
void FourButton()
{
  tft.fillRoundRect(221, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(221, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(236, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("4");
}
void FiveButton()
{
  tft.fillRoundRect(273, 140, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(273, 140, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(288, 152);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("5");
}
void SixButton()
{
  tft.fillRoundRect(3, 192, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(3, 192, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(18, 204);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("6");
}

void SevenButton()
{
  tft.fillRoundRect(58, 192, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(58, 192, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(73, 204);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("7");
}

void EightButton()
{
  tft.fillRoundRect(113, 192, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(113, 192, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(128, 204);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("8");
}
void NineButton()
{
  tft.fillRoundRect(168, 192, 45, 45, 10, ILI9341_RED);
  tft.drawRoundRect(168, 192, 45, 45, 10, ILI9341_WHITE);
  tft.setCursor(183, 204);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("9");
}

void DeleteButton()
{
  tft.fillRoundRect(260, 200, 55, 35, 10, ILI9341_RED);
  tft.drawRoundRect(260, 200, 55, 35, 10, ILI9341_WHITE);
  tft.setCursor(272, 208);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println("DEL");
}



//===================================================


Here is a typical serial output. Keep in mind that I am only touching the "0" number button once and keeping constant pressure for only one or two seconds at most. This is to replicate for the serial output what happens if I touch the "0" button once, and get one "0" put into the year box, on the second touch to the "0" button I will get "00" but on the third or with any sustained touch on the "0" button I will get multiple "0"'s posted to the year box.

Here is the accompanying serial output:

Touchscreen started.
Pressure = 1012, x = 1617, y = 2319
Pressure = 460, x = 2850, y = 931

Set Date and Time button hit
SetTimAndDate is now 1
InfoNeeded is 0
NeedYear is 0
NeedMonth is 0
NeedDay is 0
NeedHour is 0
NeedMin is 0
TheYear is
TheMonth is
TheDay is now
TheMinute is now

Pressure = 1023, x = 340, y = 2551
Pressure = 1023, x = 340, y = 2551
Pressure = 914, x = 847, y = 802
Pressure = 914, x = 847, y = 802
What Year is it button hit
InfoNeeded is now 1
NeedYear is now 1
NeedMonth is now 0
NeedDay is now 0
NeedHour is now 0
NeedMinute is now 0
TheYear is
TheMonth is
TheDay is now
TheMinute is now

Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 1016, x = 2071, y = 1614
Pressure = 455, x = 1011, y = 2727
Pressure = 455, x = 1011, y = 2727
Pressure = 2311, x = 527, y = 2598
Pressure = 2311, x = 527, y = 2598
Number Zero button hit
TheYear is 0
InfoNeeded is now 1
TheYear is 0

Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288
Pressure = 1015, x = 1682, y = 2288

Pressure = 1153, x = 656, y = 2587
Pressure = 1153, x = 656, y = 2587
Number Zero button hit
TheYear is 00
InfoNeeded is now 1
TheYear is 00

Pressure = 2356, x = 501, y = 2641
Pressure = 2356, x = 501, y = 2641
Number Zero button hit
TheYear is 000
InfoNeeded is now 1
TheYear is 000

Pressure = 2378, x = 513, y = 2639
Pressure = 2378, x = 513, y = 2639
Number Zero button hit
TheYear is 0000
InfoNeeded is now 1
TheYear is 0000

Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345
Pressure = 1071, x = 1847, y = 2345

//=============================================

Thank you in advance for your thoughts and help.

Matadormac
Alcalde, NM
 
Thank you Cartere and Defragster. I will get the 1.s7b2 and try it out. As well I have been studying for some days your forum posts and your examples.

I am afraid I find your examples a bit too complex for ready assimilation. I am trying to burrow down to what I need in your examples. Will keep trying.

Best

Matadormac
 
Matadormac - thanks for the feedback. As I was doing it I was busy pushing forward - not knowing how much sense it makes to anyone trying to follow.

Initially all the code was in the single sketch - and bigger examples were better. That was impossible to work with.

These should have the button code moved off to secondary files : ColorButtonsMark3 and onoffbuttonMark3

So you only have to focus on your response to buttons. onoffbuttonMark3 shows examples with and without debounce.

Looks like I did updates 5 days ago : https://github.com/Defragster/XPT2046_Touch_Examples/
 
Last edited:
Status
Not open for further replies.
Back
Top