//Author: Cheeng Shu Chin
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
typedef String (*cmd_func_ptr)();
typedef String (*funcp)(String);
typedef struct
{
String cmd;
cmd_func_ptr func;
} command;
String cmd,cmdlck;
volatile int int0=0;
volatile int int1=0;
int dbg=1;
cmd_func_ptr func;
command commands[] =
{
{"echo", &echo},
{"unknown", &unknown},
{"pinmode", &pinmode},
{"digitalwrite", &digitalwrite},
{"digitalread", &digitalread},
{"analogread", &analogread},
{"analoreference", &analogreference},
{"analogwrite", &analogwrite},
{"tones", &tones},
{"notones", ¬ones},
{"shiftout", &shiftout},
{"shiftin", &shiftin},
{"pulsein", &pulsein},
{"attachinterrupt", &attachinterrupt},
{"detachinterrupt", &detachinterrupt},
{"cinterrupts", &cinterrupts},
{"nocinterrupts", &nocinterrupts},
{"debug", &debug},
{"pycall", &pycall},
{"test", &test},
{"nop", &nop},
};
String rdata(String cstr)
{
readagain:
if (dbg>0)
{
reply(cstr);
}else{
reply("?");
}
String cst = "";
while(Serial.available()>0)
{
cst += byte(Serial.read());
}
if (cst.equalsIgnoreCase("!"))
{
sprintln("cmd = "+cmdlck);
goto readagain;
}
return cst;
}
void reply(String cst)
{
loopagain:
if (int0 != 0)
{
sprintln("!INT0 ?");
int0 = 0;
goto loopagain;
}
if (int1 != 0)
{
sprintln("!INT1 ?");
int1 = 0;
goto loopagain;
}
sprintln(cst);
while(Serial.available()<1)
{
}
}
String nop()
{
return "";
}
String test()
{
int intp=str2int(rdata("interrupts ?"));
if (intp == 0)
{
int0 = !int0;
}
if (intp == 1)
{
int1 = !int1;
}
return "";
}
String debug()
{
dbg=str2int(rdata("debug ?"));
return "";
}
String unknown()
{
return "unkown command: " + cmd;
}
void sprint(String cst)
{
Serial.print(cst);
}
void sprintln(String cst)
{
Serial.println(cst);
}
int str2int(String dt)
{
char str[dt.length()+1];
dt.toCharArray(str,dt.length()+1);
return atoi(str);
}
String pinmode()
{
int pin=str2int(rdata("pin ?"));
int mode=str2int(rdata("mode ?"));
pinMode(pin,mode);
return "";
}
String digitalwrite()
{
int pin=str2int(rdata("pin ?"));
int value=str2int(rdata("value ?"));
digitalWrite(pin,value);
return "";
}
String digitalread()
{
int pin=str2int(rdata("pin ?"));
return digitalRead(pin);
}
String analogreference()
{
int pin=str2int(rdata("type ?"));
analogReference(pin);
return "";
}
String analogwrite()
{
int pin=str2int(rdata("pin ?"));
int value=str2int(rdata("value ?"));
analogWrite(pin, value);
return "";
}
String analogread()
{
int pin=str2int(rdata("pin ?"));
return analogRead(pin);
}
String tones()
{
int pin=str2int(rdata("pin ?"));
int frequency=str2int(rdata("frequency ?"));
int duration=str2int(rdata("duration ?"));
tone(pin, frequency, duration);
return "";
}
String notones()
{
int pin=str2int(rdata("pin ?"));
noTone(pin);
return "";
}
String shiftout()
{
int dataPin=str2int(rdata("dataPin ?"));
int clockPin=str2int(rdata("clockPin ?"));
int bitOrder=str2int(rdata("bitOrder ?"));
int value=str2int(rdata("value ?"));
shiftOut(dataPin, clockPin, bitOrder, value);
return "";
}
String shiftin()
{
int dataPin=str2int(rdata("dataPin ?"));
int clockPin=str2int(rdata("clockPin ?"));
int bitOrder=str2int(rdata("bitOrder ?"));
return shiftIn(dataPin, clockPin, bitOrder);
}
String pulsein()
{
int pin=str2int(rdata("pin ?"));
int value=str2int(rdata("value ?"));
int timeout=str2int(rdata("timeout ?"));
return pulseIn(pin, value, timeout);
}
String attachinterrupt()
{
int interrupt=str2int(rdata("interrupt ?"));
if (interrupt == 0)
{
attachInterrupt(interrupt, pycallback0, CHANGE);
}
if (interrupt == 1)
{
attachInterrupt(interrupt, pycallback1, CHANGE);
}
return "";
}
void pycallback0()
{
int0 = !int0;
}
void pycallback1()
{
int1 = !int1;
}
String detachinterrupt()
{
int interrupt=str2int(rdata("interrupt ?"));
detachInterrupt(interrupt);
return "";
}
String cinterrupts()
{
interrupts();
return "";
}
String nocinterrupts()
{
noInterrupts();
return "";
}
String echo()
{
return rdata(cmd+" ?");
}
String pycall()
{
String fc=rdata("Func ?");
return funcparser(fc);
}
String funcparser(String cmdc)
{
byte i = 0;
func = &unknown;
for(i = 0; i != ARRAY_SIZE(commands); ++i)
{
if (commands[i].cmd.equalsIgnoreCase(cmdc))
{
func = commands[i].func;
break;
}
}
return func();
}
void setup()
{
Serial.begin(115200);
}
void loop()
{
cmdlck = "";
cmd = rdata("?");
cmdlck = cmd;
sprintln(funcparser(cmd));
}
Diff to Previous Revision
--- revision 1 2010-12-26 11:58:02
+++ revision 2 2010-12-26 12:14:33
@@ -1,3 +1,4 @@
+//Author: Cheeng Shu Chin
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
typedef String (*cmd_func_ptr)();
typedef String (*funcp)(String);