getPinMode()

written for another thread but might be generic usable

tested on UNO only

//
//    FILE: getPinMode.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: getPinMode
//    DATE: 2014-05-11
//     URL:
//
// Released to the public domain
//

int getPinMode(uint8_t pin)
{
  uint8_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  volatile uint8_t *reg, *out;

  if (port == NOT_A_PIN) return -1;

  // JWS: can I let the optimizer do this?
  reg = portModeRegister(port);
  out = portOutputRegister(port);

  if ((~*reg & bit) == bit) // INPUT OR PULLUP
  {
    if ((~*out & bit)  == bit) return INPUT;
    else return INPUT_PULLUP;
  }
  return OUTPUT;
}

void setup() 
{
  Serial.begin(115200);
  Serial.println("Start ");

  pinMode(13, INPUT);
  int a = getPinMode(13);
  Serial.println(INPUT, DEC);
  Serial.println(a, DEC);

  pinMode(13, INPUT_PULLUP);
  int b = getPinMode(13);
  Serial.println(INPUT_PULLUP, DEC);
  Serial.println(b, DEC);

  pinMode(13, OUTPUT);
  int c = getPinMode(13);
  Serial.println(OUTPUT, DEC);
  Serial.println(c, DEC);
}

void loop() 
{
}