I've got it working, but it's hideous. There's gotta be a better way to do this...
Interfaces with an EasyVR voice recognition module.
/* Copyright (C) 2015 Spence Konde. See the file LICENSE for copying permission. */ /* This module interfaces with EasyVR voice recognition onCom is called with two arguments, the option group, and the command returned. onTimeout is called with one argument, the option group. */ exports.connect = function(serial,onCm,onTo,onEr) { return new EasyVR(serial,onCm,onTo,onEr); }; function EasyVR(ser,onCm,onTo,onEr) { this.ser = ser; this.onCommand=onCm; this.onTimeout=onTo; this.onErr=onEr; this.ser.on('data',this.onWatch); this.vrstate=-1; this.stsr='o'; this.rcvv=""; } EasyVR.prototype.argchar=function(val) { if (val<-1 || val > 31) {throw "Bad arg";} return String.fromCharCode(0x41+val); }; EasyVR.prototype.chararg=function(chr) { return chr.charCodeAt(0)-0x41; }; EasyVR.prototype.onWatch=function(data) { //this=evr; console.log("serial data watch: "+data); var rcv=data.charCodeAt(0); console.log("serial data: "+rcv); if (rcv>0x60) { console.log("status"); var temp=evr.sts_idx[data]; //console.log("serial lookup: "+temp); if (temp[0]) { evr.stsr=data; evr.ser.print(' '); } else { eval(temp[1]); } } else { console.log("data"); evr.rcvv+=data; if (evr.rcvv.length>=evr.sts_idx[evr.stsr][0]){ console.log("running callback "+evr.sts_idx[evr.stsr][1]); eval(evr.sts_idx[evr.stsr][1]); evr.rcvv=""; evr.stsr='o'; } else { console.log("need more data"); evr.ser.print(' '); } } }; EasyVR.prototype.sts_idx={ "o":[0,"console.log('STS_SUCCESS');"], "t":[0,"console.log('STS_TIMEOUT');"], "v":[0,"console.log('STS_INVALID');"], "i":[0,"console.log('STS_INTERR');"], "e":[2,"console.log('STS_ERROR '+evr.rcvv);evr.onErr(evr.rcvv);"], "r":[1,"console.log('STS_RESULT');"] }; EasyVR.prototype.onResult=function(r) { console.log("onresult"); console.log(r); var rt = this.onCommand(this.vrstate,r); if (rt.type!==undefined) { this.stop(); this.setRecognize(rt.type,rt.timeout); } }; EasyVR.prototype.setRecognize=function(type,to) { this.sts_idx.o[1]="evr.startRec("+type+","+to+");"; this.timeout(to); if (to) {setTimeout("eval(evr.sts_idx.t[1])",to*1000+1000);} }; EasyVR.prototype.startRec=function(type,timeout){ this.sts_idx.o[1]=""; this.sts_idx.r[1]="evr.onResult(evr.chararg(evr.rcvv));"; this.sts_idx.t[1]="evr.sts_idx.r[1]='';evr.sts_idx.t[1]='';evr.onTimeout(evr.vrstate);"; this.sendCmd('d',type); this.vrstate=type; }; EasyVR.prototype.sendCmd=function(cmd,arg) { //lastCmd=[cmd,arg]; this.ser.print(cmd); console.log("Sending command: "+cmd); if (arg!==undefined){console.log("With arg: "+this.argchar(arg));this.ser.print(this.argchar(arg));} }; EasyVR.prototype.stop=function(){ this.sts_idx={ "o":[0,"console.log('STS_SUCCESS');"], "t":[0,"console.log('STS_TIMEOUT');"], "v":[0,"console.log('STS_INVALID');"], "i":[0,"console.log('STS_INTERR');"], "e":[2,"console.log('STS_ERROR '+evr.rcvv);evr.onErr(evr.rcvv);"], "r":[1,"console.log('STS_RESULT');"] }; this.sendCmd('b'); }; EasyVR.prototype.timeout=function(arg) { this.sendCmd('o',arg); };
Of course it depends on the object being called evr.
var ocm=function(menu,option) { console.log("menu:"+menu+" option: "+option); if (menu==1&&option==2) { return {type:2,timeout:10}; } else { if (menu==2) { if (option==0) { digitalWrite([LED1,LED2,LED3],2); } else if(option==1) { digitalWrite([LED1,LED2,LED3],4); } else { digitalWrite([LED1,LED2,LED3],1); } } return {type:1,timeout:0}; } }; var otm=function(){ this.setRecognize(1,0); }; Serial4.setup(9600,{tx:C10,rx:C11}); var evr=require("easyvr").connect(Serial4,ocm,otm,otm);
@DrAzzy started
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
I've got it working, but it's hideous. There's gotta be a better way to do this...
Interfaces with an EasyVR voice recognition module.
Of course it depends on the object being called evr.