OSDN Git Service

2.0.2
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.Mcu.js
1 /**\r
2  * @fileOverview Mcuクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * mbedJSを搭載したmbedに接続したインスタンスを生成します。\r
10  * Mcuオブジェクトは、他のペリフェラルクラスをインスタンス化するときに必要です。\r
11  * @name mbedJS.Mcu\r
12  * @constructor\r
13  * @param {string} i_url\r
14  * 接続先のMiMicRPCサービスのアドレスを指定します。\r
15  * @param {HashMap|Generator} i_handler\r
16  * 非同期イベントハンドラの連想配列、又はGeneratorです。\r
17  * <p>\r
18  * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
19  * <ul>\r
20  * <li>{function()} onNew -\r
21  * インスタンスが使用可能になった時に呼び出されます。\r
22  * </li>\r
23  * <li>{function()} onClose -\r
24  * Close関数のコールバック関数です。\r
25  * </li>\r
26  * <li>{function()} onError -\r
27  * 何らかの異常で通信を継続できないエラーが発生し、コネクションを維持できない時に発生します。\r
28  * このイベントが発生するとコネクションは閉じられれます。\r
29  * </li>\r
30  * <li>{function(v)} onDisposeObject\r
31  * disposeObject関数が完了したときに呼び出されます。\r
32  * vは削除に成功したかの真偽値です。\r
33  * </li>\r
34  * <li>{function(v)} onGetInfo\r
35  * onGetInfo関数が完了したときに呼び出されます。\r
36  * vは戻り値を格納した複合連想配列です。\r
37  * {version,platform,mcu:{name,eth},memory:{free}}\r
38  * </li>\r
39  * </ul>\r
40  * <p>\r
41  * Generatorを指定した場合、コールバック関数の戻り値はyiledの戻り値として取得できます。\r
42  * <p>\r
43  * @return {mbedJS.Mcu}\r
44  * @example //Callback\r
45  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
46  * {\r
47  *   onNew:function(){\r
48  *     mcu.getInfo();\r
49  *   },\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
53  *       onNew:function(){\r
54  *         mcu.disposeObject(pin._oid);\r
55  *       }});\r
56  *   },\r
57  *   onDisposeObject:function(v){\r
58  *     mcu.close();\r
59  *   },\r
60  *   onClose:function(){\r
61  *   },\r
62  *   onError:function(){\r
63  *     alert("Error");\r
64  *   }\r
65  * });\r
66  * @example //Generator\r
67  * var g=function*(){\r
68  * try{\r
69  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
70  *   yield mcu.waitForNew();\r
71  *   yield mcu.close();\r
72  * }catch(e){\r
73  *   mcu.shutdown();\r
74  * }\r
75  * }();\r
76  * g.next();\r
77  */\r
78 var CLASS=function Mcu(i_url,i_handler)\r
79 {\r
80         var _t=this;\r
81         _t._lc=CLASS;\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
85         \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
90                         _t.lc=null;\r
91                 },\r
92                 onClose:function _Mcu_onClose(){\r
93                         if(_t._lc==CLASS.close){\r
94                                 if(_t._event.onClose){_t._event.onClose();}\r
95                         }else{\r
96                                 if(_t._event.onError){_t._event.onError();}\r
97                         }\r
98                         if(_t._gen){\r
99                                 _t._gen.next(_t);\r
100                         }                       \r
101                         _t.lc=null;\r
102                 },\r
103                 onError:function _Mcu_onError()\r
104                 {\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
109                         }\r
110                         //@todo MCUにぶら下がってる全てのyieldに対してもExceptionの発生要請?\r
111                 }\r
112         });\r
113         //MCUへ接続\r
114         this._rpc.open('ws://'+i_url+'/rpc/');\r
115 }\r
116 CLASS.prototype=\r
117 {\r
118         RPC_NS:"mbedJS:Mcu",\r
119         _lc:null,\r
120         _rpc:null,\r
121         _gen:null,\r
122         _event:{},\r
123         _has_error:false,\r
124         /**\r
125          * エラー状態であるかを返します。\r
126          * Generatorモードの場合に、定期実行してインスタンスの状態をチェックできます。\r
127          * falseの場合、下位のオブジェクトでyieldロックが発生している場合があります。\r
128          * @name mbedJS.Mcu#hasError\r
129          * @function\r
130          * @return {boolean}\r
131          * true - インスタンスはエラー状態で停止中です。使用できません。\r
132          * false - インスタンスは動作中です。使用可能です。\r
133          */\r
134         hasError:function(){\r
135                 return _t._has_error;\r
136         },\r
137         /**\r
138          * Generatorモードのときに使用する関数です。\r
139          * Generatorモードの時は、yieldと併用してnew Mcu()の完了を待ちます。\r
140          * @name mbedJS.Mcu#waitForNew\r
141          * @function\r
142          */\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
146         },\r
147         /**\r
148          * RPCを切断します。関数の完了時にonCloseイベントが発生します。\r
149          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
150          * @name mbedJS.Mcu#close\r
151          * @function\r
152          */\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
156                 this._rpc.close();\r
157         },\r
158         /**\r
159          * コールバック関数を全てキャンセルして、Mcuとの接続をシャットダウンします。\r
160          * この関数は即座に完了します。\r
161          * @name mbedJS.Mcu#shutdown\r
162          * @function\r
163          */\r
164         shutdown:function MCU_shutdown(){\r
165                 this._rpc.shutdown();\r
166         },\r
167         /**\r
168          * RPCメソッドを実行します。\r
169          * @name mbedJS.Mcu#rpc\r
170          * @function\r
171          * @param {string} m\r
172          * メソッド名です。\r
173          * @param {string} p\r
174          * パラメータ部の文字列です。JSONオブジェクトの配列を記述します。\r
175          * 配列の要素はプリミティブ型である必要があります。\r
176          * @param {function(json)} c\r
177          * RPCが完了したときに呼び出すコールバック関数です。\r
178          * <ul>\r
179          * <li>json - 戻り値をJSON文字列としてパースしたObjectです。</li>\r
180          * </ul>\r
181          * @return {int}\r
182          * メソッドのid値を返します。\r
183          */\r
184         rpc:function Mcu_rpc(m,p,c){\r
185                 if(this._has_error){\r
186                         throw new MI.MiMicException();\r
187                 }\r
188                 return this._rpc.sendMethod(m,p,c);\r
189         },\r
190         /** @private */\r
191         addItem:function(o){\r
192                 this._items.push(o);\r
193         },\r
194         /**\r
195          * Mcuの情報を返します。\r
196          * @name mbedJS.Mcu#getInfo\r
197          * @function\r
198          * @return {HashMap}\r
199          * 情報を格納した連想配列です。\r
200          */\r
201         getInfo:function(){\r
202                 try{\r
203                         var _t=this;\r
204                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
205                         _t._lc=CLASS.getInfo;\r
206                         return _t.rpc(_t.RPC_NS+":getInfo","",\r
207                         function (j)\r
208                         {\r
209                                 var r=j.result;\r
210                                 var v={version:r[0],platform:r[1],mcu:{name:r[3],eth:r[2]},memory:{free:r[4]}};\r
211                                 if(_t._event.onGetInfo){_t._event.onGetInfo(v);}\r
212                                 if(_t._gen){_t._gen.next(v);}\r
213                                  _t._lc=null;\r
214                         }\r
215                         );\r
216                 }catch(e){\r
217                         throw new MI.MiMicException(e);\r
218                 }               \r
219         },\r
220         /**\r
221          * 指定idのオブジェクトをMCUのメモリから削除します。\r
222          * @name mbedJS.Mcu#disposeObject\r
223          * @function\r
224          * @param {int} i_oid\r
225          * オブジェクトID。\r
226          * mbedJSオブジェクトが所有するリモートオブジェクトのIDを指定します。\r
227          * @return {boolean}\r
228          * 結果を返します。\r
229          */\r
230         disposeObject:function(i_oid){\r
231                 try{\r
232                         var _t=this;\r
233                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
234                         _t._lc=CLASS.disposeObject;\r
235                         return _t.rpc(_t.RPC_NS+":disposeObject",i_oid,\r
236                         function (j)\r
237                         {\r
238                                 var v=j.result[0]?true:false;\r
239                                 if(_t._event.onDisposeObject){_t._event.onDisposeObject(v);}\r
240                                 if(_t._gen){_t._gen.next(v);}\r
241                                  _t._lc=null;\r
242                         }\r
243                         );\r
244                 }catch(e){\r
245                         throw new MI.MiMicException(e);\r
246                 }               \r
247         }       \r
248 }\r
249 NS.Mcu=CLASS;\r
250 }());