DEV.Gpio=function Gpio(i_mcu)\r
{\r
try{\r
- i_mcu.registerPhy(this,"Gpio");\r
this._mcu=i_mcu;\r
+ i_mcu.registerPhy(this,"Gpio");\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
}\r
//実行なう\r
//MiMicBCを生成して実行\r
- this._gpio._mcu.execBc2WithException(bc+BCF.END,db);\r
+ this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
var bc="";\r
var db=new Array();\r
bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val,db);\r
- this._gpio._mcu.execBc2WithException(bc+BCF.END,db);\r
+ this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
var bc="";\r
var db=new Array();\r
bc+=this._gpio.BCF_getValue(this._gpioinfo.port,this._gpioinfo.bit,db);\r
- var ret=this._gpio._mcu.execBc2WithException(bc+BCF.END,db);\r
+ var ret=this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
return (ret.stream[0]>>this._gpioinfo.bit)&0x01;\r
}catch(e){\r
throw new MiMicException(e);\r
for(var i=0;i<i_val_array.length;i++){\r
bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val_array[i],db);\r
}\r
- this._gpio._mcu.execBc2WithException(bc+BCF.END,db);\r
+ this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
throw new MiMicException("i_opt is empty or invalid.");\r
}\r
//MiMicBCを生成して実行\r
- ret=this._mcu.mif.execBc2(bc+BCF.END,db);\r
- if(ret.result!=0x0){\r
- throw new MiMicException(EE.VM_RUNTIME);\r
- }\r
+ this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
DEV.Adc=function Adc(i_mcu,i_opt)\r
{\r
try{\r
- i_mcu.registerPhy(this,"Adc");\r
this._mcu=i_mcu;\r
var phyopt=isUndef(i_opt)?{power:1}:i_opt.phy;\r
//PHY生成。\r
bc+=BCF.setMem(this._AD0CR,0x00200500,db);\r
bc+=BCF.setMem(this._AD0CR,0x00210500,db);\r
//\r
- this._mcu.execBc2WithException(bc+BCF.END,db);\r
+ this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+ //ペリフェラルをMCUに登録\r
+ this._mcu.registerPhy(this,"Adc");\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
bc+=this._pin.BCF_setOpt({sel:this._adinfo.pin_sel},db);\r
//AD0CRに値設定\r
bc+=this._adc.BCF_setSel(this._adinfo.ch,1,db);\r
- var ret=this._adc._mcu.execBc2WithException(bc+BCF.END,db);\r
+ var ret=this._adc._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
}\r
}catch(e){\r
throw new MiMicException(e);\r
//メモリから値取得\r
var db=new Array();\r
var bc=this._adc.BCF_getAD0DR(this._adinfo.ch,db);\r
- var ret=this._adc._mcu.execBc2WithException(bc+BCF.END,db);\r
+ var ret=this._adc._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
return (ret.stream[0]>>4)&0x00000fff;\r
}catch(e){\r
throw new MiMicException(e);\r
var EE=DEV._EE;\r
var isUndef=MiMicLib.isUndef;\r
\r
+ /**\r
+ * 配列をMiMicDBへ変換する。\r
+ @throws\r
+ 変換失敗時は例外\r
+ */\r
+ function array2MimicDb(i_array)\r
+ {\r
+ try{\r
+ var dt=["0000000","000000","00000","0000","000","00","0",""];\r
+ var p="";\r
+ for(var i=0;i<i_array.length;i++){\r
+ var v=(i_array[i]>>>0);\r
+ var s=v.toString(16).toLowerCase();\r
+ if(s.length<1 || s.length>8){\r
+ throw new MiMicException(EE.NG);\r
+ }\r
+ p+=dt[s.length-1]+s;\r
+ }\r
+ return p;\r
+ }catch(e){\r
+ throw MiMicException(e);\r
+ }\r
+ }\r
\r
/**\r
* PINの機能名を含むPin識別子を得る。\r
}\r
\r
/**\r
- * LPCXPresso1769にあるMiMicRemoteMCUとのコネクションをのMUC操作クラスを生成します。\r
- このクラスは、物理的なMCUで動作するMiMicRemoteMCUとのコネクションを確立して、 処理系とMCUの間に\r
- 同期処理系を生成します。\r
- <h2>ステートマシン</h2>\r
- <ul>\r
- <li>enabled - MCUを操作可能であるかをします。</li>\r
- </ul>\r
- </div>\r
- @param i_mimic\r
- MiMicをインストールしたLPCXpresso1769のIPアドレスを定義します。\r
- @param i_connect\r
- 即座に コネクションを確立するかのフラグです。\r
+ * @see API Manual\r
*/\r
- DEV.Mcu=function Mcu(i_mimic_addr,i_connect)\r
+ DEV.Mcu=function Mcu(i_mimic_addr,i_is_activate)\r
{\r
try{\r
//リモートインタフェイスの取得\r
this._mif=new MiMicRemoteMcuInterface(i_mimic_addr);\r
+ var ac=isUndef(i_is_activate)?true:i_is_activate;\r
+ if(ac){\r
+ this.activate();\r
+ };\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
- //this.mif.connect();\r
};\r
DEV.Mcu.prototype=\r
{\r
/**\r
- * ファンクション名シンボル
- */\r
- FUNC_SYMBOL:["GPIO","AD","DA"],\r
- /**\r
- * ペリフェラル名シンボル。\r
+ * ペリフェラルシンボル。\r
*/\r
_PHY_SYMBOL :["Gpio","Adc","Dac"],\r
/**\r
*/\r
_mif:null,\r
/**\r
- * 状態値です。状態がtrueの時、インスタンスはMCUを操作することが出来ます。falseの時はできません。\r
+ * @see API manual
*/\r
- enabled:true,\r
+ isActive:function isActive()\r
+ {\r
+ try{\r
+ return this._mif.isConnected();\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
/**\r
- * イベントハンドラを格納します。
+ * @see API manual
*/\r
events:{\r
/**\r
- * enableが変更されたときにコールされます。function(){}の関数です。
+ * @see API manual\r
*/\r
- onChangeEnable:null\r
+ onActivateChanged:null\r
},\r
/**\r
* ペリフェラルオブジェクトのホルダ。ペリフェラル名をキーにした、ペリフェラルオブジェクトの連想配列。\r
*/\r
_phy_holder:[],\r
/**\r
+ * 物理MCUに接続して、MCUを有効化します。
+ */\r
+ activate:function activate()\r
+ {\r
+ try{\r
+ var _t=this;\r
+ //既にアクティブならエラー。\r
+ if(this.isActive()){\r
+ throw new MiMicException("Already activated!");\r
+ }\r
+ //接続\r
+ this._mif.connect(\r
+ function(){\r
+ //非同期切断があったらイベント\r
+ if(_t.events.onActivateChanged!=null){\r
+ _t.events.onActivateChanged(false);\r
+ }\r
+ }\r
+ );\r
+ if(this.events.onActivateChanged!=null){\r
+ this.events.onActivateChanged(true);\r
+ }\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ /**\r
+ * 物理MCUから切断して、MCUを無効化します。
+ */\r
+ deactivate:function deactivate()\r
+ {\r
+ this._mif.disconnect();\r
+ if(this.events.onActivateChanged!=null){\r
+ this.events.onActivateChanged(false);\r
+ }\r
+ },\r
+ /**\r
* MiMicRemoteMcuInterfaceにより、MiMicBCを送信します。\r
+ * MiMicTXTにInt配列をDBに変換して結合したBCを生成して実行します。\r
この関数は、execBc2で{result}メンバチェックを省略する為に使います。\r
@param\r
MiMicBCのMiMicTxT部\r
@throws\r
通信層でエラーが発生した場合。応答の{result}メンバがMVM_OK(0x00000000)以外の場合。\r
*/\r
- execBc2WithException:function execBc2WithException(bc,db)\r
+ /**\r
+ @return\r
+ execBc関数を参照してください。\r
+ @throws\r
+ 変換失敗時,またはexecBcに失敗したとき\r
+ */\r
+ /**\r
+ * MiMicにBcを送信します。\r
+ i_txt or i_txt,db\r
+ */\r
+ callMiMic:function callMiMic(/**/)\r
+ {\r
+ try{\r
+ var bc;\r
+ switch(arguments.length){\r
+ case 1:\r
+ //mimicBC\r
+ bc=arguments[0];\r
+ break;\r
+ case 2:\r
+ //mimicBC:string,db:array[int]\r
+ bc=arguments[0]+array2MimicDb(arguments[1]);\r
+ break;\r
+ default:\r
+ throw new MiMicException(e);\r
+ }\r
+ return this._mif.execBc(bc);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ /**\r
+ * 戻り値チェック有りの場合
+ */\r
+ callMiMicWithCheck:function execBc2WithException(/**/)\r
{\r
try{\r
- var ret=this._mif.execBc2(bc,db);\r
+ var ret=this.callMiMic.apply(this,arguments);\r
if(ret.result!=0x0){\r
throw new MiMicException(EE.VM_RUNTIME,"Result="+ret.toString());\r
}\r
return this._phy_holder[i_phy_symbol];\r
},\r
/**\r
- * システム関数。MCU依存のペリフェラルオブジェクトを登録する。
+ * [forSystem]システム関数。MCU依存のペリフェラルオブジェクトを登録する。
*/\r
registerPhy:function registerPhy(i_phy,i_symbol)\r
{\r
}\r
}\r
}\r
- this._gpio._mcu.execBc2WithException(bc+BCF.END,ar);\r
+ this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,ar);\r
return is_single?ret.stream[0]:ret.stream;\r
}catch(e){\r
throw new MiMicException(e);\r
throw new MiMicException("i_opt is empty or invalid.");\r
}\r
//MiMicBCを生成して実行\r
- var ret=this._mcu.mif.execBc2(bc+BCF.END,db);\r
- if(ret.result!=0x0){\r
- throw new MiMicException(EE.VM_RUNTIME);\r
- }\r
+ this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+\r
}catch(e){\r
throw new MiMicException(e);\r
}\r
*/\r
END:"ZZ.E" \r
},\r
- /**Chapter 4: LPC17xx Clocking and power control\r
- * Peripheralを主キーにしたテーブル。ペリフェラルと物理デバイスの設定値を格納する。\r
- [PCLKSEL Reg#、PCLKSEL bit, PCONP bit]\r
+ /**\r
+ * @see API manual\r
+ */\r
+ FUNC_SYMBOL:["GPIO","AD","DA"],\r
+ \r
+ /**\r
+ * @see API manual\r
+ PHY:{PHY_NAME:[PCLKSELreg#PCLKSELbit,PCONPbit]}\r
*/\r
PHY:{\r
WDT: [0,0,null],\r
USB:[null,null,31]\r
},\r
/**\r
- * LPCXpressoのPINに対応する定数である。PIN識別子として使用する。\r
- P?[?]は、例えばP0[0]のように指定する。これは、lpcxpresso.lpc1769.schematic.pdfのTable 73. Pin descriptionのSymbolに対応している。\r
- \r
- データ構造は、PIN名(P?[?])を主キーとして、Chapter 8: LPC17xx Pin connect blockの各値を追記したテーブルである。\r
- PINFUNC,PINMODE,PINMODE_ODのレジスタインデクスと、bit値を定義する。\r
- 定義:[PINFUNC#,PINMODE#,PINOD#,bitidx,[PINSEL設定値と機能マップ]]\r
- -PINFUNC,PINMODEのビット位置は、(bitidx%16)*2で計算する。ODRegについては、そのままの数値を使う。\r
- -[PINSEL設定値と機能名マップ]は、FunctionNameをPINSEL設定値に変換するテーブルである。\r
- 配列のインデクス値が、そのままPINSELの値に対応する。設定できない値のフィールドはnullである。機能名はPin connect blockのテーブルの値であるが、\r
- GPIOについては"GPIO Port "を"GPIO"に省略している。\r
- アクセスは、専用の関数を使用して行うこと。\r
+ * @see API Manual
*/\r
P0:[\r
[0,0,0,0,["GPIO0.0","RD1","TXD3","SDA1"]],//0\r
[4,4,2,3,["GPIO2.3","PWM1.4","DCD1",null]],//3\r
[4,4,2,4,["GPIO2.4","PWM1.5","DSR1",null]],//4\r
[4,4,2,5,["GPIO2.5","PWM1.6","DTR1",null]],//5\r
- [4,4,2,6,["GPIO2.6 PCAP1.0","RI1",null]],//6\r
+ [4,4,2,6,["GPIO2.6","PCAP1.0","RI1",null]],//6\r
[4,4,2,7,["GPIO2.7","RD2","RTS1",null]],//7\r
[4,4,2,8,["GPIO2.8","TD2","TXD2","ENET_MDC"]],//8\r
[4,4,2,9,["GPIO2.9","USB_CONNECT","RXD2","ENET_MDIO"]],//9\r
[9,9,4,29,["GPIO4.29","TX_MCLK","MAT2.1","RXD3"]]//29\r
],\r
/**\r
- * ピン識別子のアクセス関数。\r
- ピン情報を元に、Function名のプレフィクスを、完全な名称に変換します。\r
- ã\83\94ã\83³ã\81«Functionã\81\8cå\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bã\81\8b調ã\81¹ã\82\8bã\81\93ã\81¨ã\81\8cå\87ºæ\9d¥ã\81¾ã\81\99。\r
+ * [forSystem]ピン識別子のアクセス関数である。\r
+ ピン機能シンボルのプレフィクス(機能シンボル)を、 ピン識別子を元に、完全な名称に変換する。\r
+ ã\83\94ã\83³ã\81«Functionã\81\8cå\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bã\81\8b調ã\81¹ã\82\8bã\81\93ã\81¨ã\81\8cå\87ºæ\9d¥ã\82\8b。\r
*/\r
completePinFunctionName:function completePinFunctionName(i_pin,i_prefix)\r
{\r
}\r
},\r
/**\r
- * ピン識別子のアクセス関数。\r
- ピン識別値から、Pinレジスタ番号とビット位置を得ます。\r
+ * [forSystem]ピン識別子のアクセス関数。\r
+ ピン識別値から、Pinレジスタの番号と、ビット位置を取り出す。\r
@return\r
{s:pinselのレジスタ番号、m:modeのレジスタ番号、,o:odのレジスタ番号,sbm:mode,selのビット位置,ob:odのビット位置}
*/\r
}\r
},\r
/**\r
- * ピン識別子のアクセス関数。\r
- * PINの機能名からpinのPINSELの設定値を計算します。
+ * [forSystem]ピン識別子のアクセス関数。\r
+ PIN機能名に一致するPinsel値を取り出す。\r
*/\r
getPinSelByFunctionName:function getPinSelByFunctionName(i_pin,i_name)\r
{\r
}\r
},\r
/**\r
- * ピンが、ピンファンクションを持つか返します。\r
+ * [forSystem]ピンが、ピン機能シンボルを持つか返す。\r
*/\r
hasPinFunctionName:function hasPinFunctionName(i_pin,i_name)\r
{\r
return i_pin[4].indexOf(i_name)>=0;\r
- },\r
- _dfmtHexArray:function(i_array){\r
- var ret="";\r
- for(var i=0;i<i_array.length;i++){\r
- ret+="0x"+(i_array[i] >>> 0).toString(16)+",";\r
- }\r
- return ret;\r
- },\r
-\r
+ }\r
}\r
-/**\r
- * BCフラグメント\r
- */\r
-var BCF=DEV._BCF;\r
-var EE=DEV._EE;\r
-\r
-\r
-\r
-\r
-\r
-\r
\r
\r
DEV.I2c=function I2c()\r
{\r
throw new MiMicException("Not imprement.");\r
}\r
-alert\r
+\r
\r
LPCXpresso1769=DEV;\r
}());\r
NG:[i_base|0x00,"Unknown exception in MiMicRemoteMcuInterface"],\r
TCP_CONNECT:[i_base|0x01,"TCP CONNECT FAILED"],//接続エラー\r
HTTP :[i_base|0x02,"HTTP FAILED"]}//HTTPエラー\r
- }(MiMicError.NG|MiMicError.MID_MiMic|MiMicError.CAID_RemoteMCU);\r
+ }(MiMicError.NG[0]|MiMicError.MID_MiMic|MiMicError.CAID_RemoteMCU);\r
\r
MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(server)\r
{\r
MiMicRemoteMcuInterface.prototype=\r
{\r
_mimic_host:null,\r
+ _keep_alive:null, \r
/**\r
* XmlHttpRequestを実行する。\r
@return\r
//なんかうまくいかない。\r
throw new MiMicException(EE.NG);\r
},\r
+\r
/**\r
- * 配列をMiMicDBへ変換する。\r
- @throws\r
- 変換失敗時は例外\r
+ * 接続中かを返す。
*/\r
- _array2MimicDb:function(i_array)\r
+ isConnected:function isConnected()\r
{\r
- var dt=["0000000","000000","00000","0000","000","00","0",""];\r
- var p="";\r
- for(var i=0;i<i_array.length;i++){\r
- var v=(i_array[i]>>>0);\r
- var s=v.toString(16).toLowerCase();\r
- if(s.length<1 || s.length>8){\r
- throw new MiMicException(EE.NG);\r
- }\r
- p+=dt[s.length-1]+s;\r
- }\r
- return p;\r
+ return this._keep_alive!=null;\r
},\r
/**\r
* MiMicBCを実行する。\r
throw new MiMicException(e);\r
}\r
},\r
- /**\r
- * MiMicTXTにInt配列をDBに変換して結合したBCを生成して実行する。\r
- @return\r
- execBc関数を参照してください。\r
- @throws\r
- 変換失敗時,またはexecBcに失敗したとき\r
- */\r
- execBc2:function execBc2(i_txt,i_db_array)\r
- {\r
- try{\r
- var db=this._array2MimicDb(i_db_array);\r
- return this.execBc(i_txt+db);\r
- }catch(e){\r
- throw new MiMicException(e);\r
- }\r
- },\r
+\r
/**\r
* RemoteMCUに接続します。\r
既に接続済みの場合はなにもしません。\r
_t._keep_alive=null;\r
i_callback(false);\r
}else{\r
- i_callback(true);//応答した\r
startCheck();\r
}\r
return;\r
//オーソドックスな方法\r
function case1()\r
{\r
- var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
+ var mcu=new LPCXpresso1769.Mcu("192.168.0.39",true);\r
//ADCペリフェラルを作る。\r
var adc=new LPCXpresso1769.Adc(mcu);\r
//ペリフェラルからピンに接続\r