Wait on Serial.read();

Hi! I'm kind of new, but I've been playing with arduino for a few months now. So here's my problem:
I am attempting to make a kind of "program loader" type sketch that will read data from EEPROM or an SD shield and execute it, as a way of extending sketch size. Of course I don't plan on directly writing arduino inside of arduino, just a custom opcode approach.

Enough about the project, though; here's the thing I need advice with. Becuase I'm trying to make it somewhat user-friendly and executed via the serial monitor, I'm trying to have a Serial.read() system that waits for a user response. The problem, of course, is that I don't know of any way of making the system wait until an input is given, so I'm having to do something like this:


label:

Serial.println("prompt 0 or 1");
Serial.println("0 | option a");
Serial.println("1 | option b");
int answer = Serial.read();

//Notice I have "48" and "148." The reasoning behind this is that at the start of a Serial.read() command
//it will put a "1" bundled with the ASCII character sent.

if(answer = 48 || answer == 148){
// do stuff
goto labeltwo;
}else if(answer == 49 || answer == 149) {
// do stuff
goto labeltwo;
}

goto label;

labeltwo:

Any ideas on how I could compact the code further or maybe even a "wait for response" function?
Thanks in advance.

Goto's will just make a mess of the code. Just
while(!Serial.available() ){
}

So something like:

Serial.print("a or b")
Serial.print("0| a")
Serial.print("1| b")
label:
while(!Serial.available()){}
int read = Serial.read();
if(read == 48 || read == 148){

}else if(read == 49 || read == 149){

}else{
goto label;
}

?

Almost, just drop the labels and make it a function. And just re-enter the function if the user input isn't what you want.

I also just learned about ParseInt, so I can reduce redundancy! :smiley:
so:


int read;

void setup(){
Serial.begin(9600);

int out = prompt(
"A or B",
"0 | A",
"1 | B",
0,
1,
0,
1
)

}

void loop(){

}

void prompt(String m1,String m2,String m3,int i1,int i2,int o1,int o2)
while(!Serial){}
while(!Serial.available){}
Serial.println(m1)
Serial.println(m2)
Serial.println(m3)
int read = Serial.parseInt();
if(read == i1) {
return o1
}else if(read == i2) {
return o2
}else{
prompt(m1,m2,m3,i1,i2,o1,o2)
}
}

I'm having odd "Return" problems. Here's the code:

int read;

void setup(){
Serial.begin(9600);
prompt("A or B", "0 | A", "1 | B", 0, 1, 0, 1);
}

void loop(){

}

void prompt(String m1,String m2,String m3,int i1,int i2,int o1,int o2){
int a = o1;
int b = o2;
while(!Serial){}
Serial.println(m1);
Serial.println(m2);
Serial.println(m3);
while(!Serial.available()){}
int input = Serial.parseInt();
if(input == i1){
return a;
}else if(input == i2){
return b;
}
}

For some reason it's giving an error on return saying:

Arduino: 1.6.5 (Mac OS X), Board: "Arduino Uno"

testytest.ino: In function 'void prompt(String, String, String, int, int, int, int)':
testytest:22: error: return-statement with a value, in function returning 'void' [-fpermissive]
testytest:24: error: return-statement with a value, in function returning 'void' [-fpermissive]
return-statement with a value, in function returning 'void' [-fpermissive]

There is a simple user input function in planning and implementing a program and you may find the examples in serial input basics useful.

...R