Use numbers on IR Remote with a buffer (To enroll fingerprints)

Hi! I have an Adafruit Fingerprint Sensor and an IR Reciever.

I'm trying to use my IR remote (which has numbers 0 - 9 on it) to enroll fingerprint IDs. So, it would ask for an ID, and I could use the remote to enroll the ID, without the use of the serial monitor, or a PC. Here's my code.

/***************************************************
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

#include <IRLib2.h>
#include <IRLibAll.h>
#include <IRLibDecodeBase.h>
#include <IRLibGlobals.h>
#include <IRLibRecvBase.h>
#include <IRLibRecvLoop.h>

int RECV_PIN = 4;

IRrecv IR_Receiver(4);//receiver on pin 4
IRdecode IR_Decoder;//Decoder object

uint8_t id;

uint8_t getFingerprintEnroll();

// Software serial for when you dont have a hardware serial port
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// On Leonardo/Micro/Yun, use pins 8 & 9. On Mega, just grab a hardware serialport
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2);

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
//Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);


void setup()
{
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(500);

  Serial.begin(9600);
  Serial.println("Adafruit Fingerprint sensor enrollment");

  // set the data rate for the sensor serial port
  finger.begin(57600);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1);
  }
  Serial.println("Enabling IRin");
  IR_Receiver.enableIRIn();
  Serial.println("Enabled IRin");

}


uint8_t readnumber(void) {
  uint8_t num = 0;
  boolean validnum = false;
  while (1) {
    char c = getnumber();
    if (isdigit(c)) {
       num *= 10;
       num += c - '0';
       validnum = true;
    } else if (validnum) {
      return num;
    }
  }
  }


uint8_t getnumber(void) {
  if (IR_Receiver.getResults()) {
    IR_Decoder.decode();
    switch (IR_Decoder.value) {
      case 0xFF6897: //1
        IR_Receiver.enableIRIn();
        return 1;
        break;

      case 0xFF9867: //2
        IR_Receiver.enableIRIn();
        return 2;
        break;

      case 0xFFB04F: //3
        IR_Receiver.enableIRIn();
        return 3;
        break;

      case 0xFF30CF: //4
        IR_Receiver.enableIRIn();
        return 4;
        break;

      case 0xFF18E7: //5
        IR_Receiver.enableIRIn();
        return 5;
        break;

      case 0xFF7A85: //6
        IR_Receiver.enableIRIn();
        return 6;
        break;

      case 0xFF10EF: //7
        IR_Receiver.enableIRIn();
        return 7;
        break;

      case 0xFF38C7: //8
        IR_Receiver.enableIRIn();
        return 8;
        break;

      case 0xFF5AA5: //9
        IR_Receiver.enableIRIn();
        return 9;
        break;

      case 0xFF4AB5: //0
        IR_Receiver.enableIRIn();
        return 0;
        break;
    }
    IR_Receiver.enableIRIn();
  }
}

void loop()                     // run over and over again
{
  Serial.println("Ready to enroll a fingerprint! Please Type in the ID # you want to save this finger as...");
  id = readnumber();
  Serial.print("Enrolling ID #");
  Serial.println(id);

  while (!  getFingerprintEnroll() );
}

uint8_t getFingerprintEnroll() {

  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        break;
      case FINGERPRINT_NOFINGER:
        Serial.println(".");
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        break;
      case FINGERPRINT_NOFINGER:
        Serial.print(".");
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK converted!
  Serial.print("Creating model for #");  Serial.println(id);

  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  Serial.print("ID "); Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }
}

The code says "ready to enroll" but when I hit a number on the IR Remote, nothing more happens. Help with this code would be greatly appreciated! (It's just a modified version of the enroll sketch)

Serial.print() statements in readnumber() might provide a clue.

Are you pressing a non-digit key after the digit keys?

getnumber() promises to return a value. What does it actually return if you press something other than 0 to 9?

uint8_t getnumber(void) {
...
    switch (IR_Decoder.value) {
      case 0xFF6897: //1
        IR_Receiver.enableIRIn();
        return 1;               <-------- return uint8_t 1
        break;
uint8_t readnumber(void) {
  uint8_t num = 0;
  boolean validnum = false;
  while (1) {
    char c = getnumber();
    if (isdigit(c)) {           <--------- 1 != '1'
       num *= 10;
       num += c - '0';
       validnum = true;
    } else if (validnum) {
      return num;
    }
  }
  }

TBH, it isn't a great sketch for so many reasons...

PaulS:
Are you pressing a non-digit key after the digit keys?

No... wouldn't that screw it up? :o

stupid-questions:
No... wouldn't that screw it up? :o

  boolean validnum = false;
  while (1) {
    char c = getnumber();
    if (isdigit(c)) {
       validnum = true;
    } else if (validnum) {
      return num;
    }
  }

Under what circumstances will you break out of the infinite while loop?

You haven't indicated that you read my previous post - did you see the two comments in the code?

No... wouldn't that screw it up?

Assuming that you correct the issues that have been pointed out, and that you press some digit keys first, no.

If you properly indented your code and put the { on new lines, the code in readnumber() looks like this:

  uint8_t num = 0;
  boolean validnum = false;
  while (1)
  {
    char c = getnumber();
    if (isdigit(c))
    {
        num *= 10;
        num += c - '0';
        validnum = true;
    }
    else if (validnum)
    {
       return num;
    }
  }

Suppose you press '1', '3', 'D'.

The first key press is '1', which is a digit, so validnum (stupid to not use camelCase) is set to true, and num becomes 1.
The next key is also a digit, so validnum is set to true, and num becomes 13.
The next key is NOT a digit, so validnum is tested. Since it is true, you return 13.

If you never press a non-digit key, you'll never exit the loop/function.