2 * @fileOverview Mcuクラスを定義します。
\r
9 * mbedJSを搭載したmbedに接続したインスタンスを生成します。
\r
10 * Mcuオブジェクトは、他のペリフェラルクラスをインスタンス化するときに必要です。
\r
13 * @param {string} i_url
\r
14 * 接続先のMiMicRPCサービスのアドレスを指定します。
\r
15 * @param {HashMap|Generator} i_handler
\r
16 * 非同期イベントハンドラの連想配列、又はGeneratorです。
\r
18 * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。
\r
20 * <li>{function()} onNew -
\r
21 * インスタンスが使用可能になった時に呼び出されます。
\r
23 * <li>{function()} onClose -
\r
24 * Close関数のコールバック関数です。
\r
26 * <li>{function()} onError -
\r
27 * 何らかの異常で通信を継続できないエラーが発生し、コネクションを維持できない時に発生します。
\r
28 * このイベントが発生するとコネクションは閉じられれます。
\r
30 * <li>{function(v)} onDisposeObject
\r
31 * disposeObject関数が完了したときに呼び出されます。
\r
34 * <li>{function(v)} onGetInfo
\r
35 * onGetInfo関数が完了したときに呼び出されます。
\r
36 * vは戻り値を格納した複合連想配列です。
\r
37 * {version,platform,mcu:{name,eth},memory:{free}}
\r
41 * Generatorを指定した場合、コールバック関数の戻り値はyiledの戻り値として取得できます。
\r
43 * @return {mbedJS.Mcu}
\r
44 * @example //Callback
\r
45 * var mcu=new mbedJS.Mcu("192.168.128.39",
\r
50 * onGetInfo:function(v){
\r
51 * log("[PASS]onGetInfo:"+v.version+","+v.platform+","+v.mcu.name+","+v.mcu.eth+","+v.memory.free);
\r
52 * var pin=new mbedJS.DigitalIn(mcu,mbedJS.PinName.P0_22,{
\r
54 * mcu.disposeObject(pin._oid);
\r
57 * onDisposeObject:function(v){
\r
60 * onClose:function(){
\r
62 * onError:function(){
\r
66 * @example //Generator
\r
67 * var g=function*(){
\r
69 * var mcu=new mbedJS.Mcu("192.168.128.39",g);
\r
70 * yield mcu.waitForNew();
\r
71 * yield mcu.close();
\r
78 var CLASS=function Mcu(i_url,i_handler)
\r
82 _t._has_error=false;
\r
83 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}
\r
84 else if(i_handler){_t._event=i_handler}
\r
86 _t._rpc=new MI.Rpc({
\r
87 onOpen:function _Mcu_onOpen(){
\r
88 if(_t._event.onNew){_t._event.onNew();}
\r
89 if(_t._gen){_t._gen.next(_t);}
\r
92 onClose:function _Mcu_onClose(){
\r
93 if(_t._lc==CLASS.close){
\r
94 if(_t._event.onClose){_t._event.onClose();}
\r
96 if(_t._event.onError){_t._event.onError();}
\r
103 onError:function _Mcu_onError()
\r
105 _t._has_error=true;
\r
106 if(_t._event.onError){_t._event.onError();}
\r
107 if(_t._gen && _t._lc){
\r
108 _t._gen.throw(new MI.MiMicException());
\r
110 //@todo MCUにぶら下がってる全てのyieldに対してもExceptionの発生要請?
\r
114 this._rpc.open('ws://'+i_url+'/rpc/');
\r
118 RPC_NS:"mbedJS:Mcu",
\r
126 * Generatorモードの場合に、定期実行してインスタンスの状態をチェックできます。
\r
127 * falseの場合、下位のオブジェクトでyieldロックが発生している場合があります。
\r
128 * @name mbedJS.Mcu#hasError
\r
130 * @return {boolean}
\r
131 * true - インスタンスはエラー状態で停止中です。使用できません。
\r
132 * false - インスタンスは動作中です。使用可能です。
\r
134 hasError:function(){
\r
135 return _t._has_error;
\r
138 * Generatorモードのときに使用する関数です。
\r
139 * Generatorモードの時は、yieldと併用してnew Mcu()の完了を待ちます。
\r
140 * @name mbedJS.Mcu#waitForNew
\r
143 waitForNew:function MCU_waitForNew(){
\r
144 if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}
\r
145 this._lc=CLASS.waitForNew;
\r
148 * RPCを切断します。関数の完了時にonCloseイベントが発生します。
\r
149 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
150 * @name mbedJS.Mcu#close
\r
153 close:function MCU_close(){
\r
154 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
155 this._lc=CLASS.close;
\r
159 * コールバック関数を全てキャンセルして、Mcuとの接続をシャットダウンします。
\r
160 * @name mbedJS.Mcu#shutdown
\r
163 shutdown:function MCU_shutdown(){
\r
164 this._rpc.shutdown();
\r
168 * @name mbedJS.Mcu#rpc
\r
170 * @param {string} m
\r
172 * @param {string} p
\r
173 * パラメータ部の文字列です。JSONオブジェクトの配列を記述します。
\r
174 * 配列の要素はプリミティブ型である必要があります。
\r
175 * @param {function(json)} c
\r
176 * RPCが完了したときに呼び出すコールバック関数です。
\r
178 * <li>json - 戻り値をJSON文字列としてパースしたObjectです。</li>
\r
183 rpc:function Mcu_rpc(m,p,c){
\r
184 if(this._has_error){
\r
185 throw new MI.MiMicException();
\r
187 return this._rpc.sendMethod(m,p,c);
\r
190 addItem:function(o){
\r
191 this._items.push(o);
\r
195 * @name mbedJS.Mcu#getInfo
\r
197 * @return {HashMap}
\r
200 getInfo:function(){
\r
203 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
204 _t._lc=CLASS.getInfo;
\r
205 return _t.rpc(_t.RPC_NS+":getInfo","",
\r
209 var v={version:r[0],platform:r[1],mcu:{name:r[3],eth:r[2]},memory:{free:r[4]}};
\r
210 if(_t._event.onGetInfo){_t._event.onGetInfo(v);}
\r
211 if(_t._gen){_t._gen.next(v);}
\r
216 throw new MI.MiMicException(e);
\r
220 * 指定idのオブジェクトをMCUのメモリから削除します。
\r
221 * @name mbedJS.Mcu#disposeObject
\r
223 * @return {boolean}
\r
226 disposeObject:function(i_oid){
\r
229 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
230 _t._lc=CLASS.disposeObject;
\r
231 return _t.rpc(_t.RPC_NS+":disposeObject",i_oid,
\r
234 var v=j.result[0]?true:false;
\r
235 if(_t._event.onDisposeObject){_t._event.onDisposeObject(v);}
\r
236 if(_t._gen){_t._gen.next(v);}
\r
241 throw new MI.MiMicException(e);
\r