OSDN Git Service

100,10,110等のipアドレスを正しく表示できなかった問題を修正
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.BusInOut.js
1 /**\r
2  * @fileOverview BusInOutクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * BusInOutクラスです。\r
10  * <a href="https://mbed.org/handbook/BusInOut">mbed::BusInOut</a>と同等の機能を持ちます。\r
11  * @name mbedJS.BusInOut\r
12  * @constructor\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {[PinName...]} i_params\r
16  * ピンIDの配列を指定します。要素数の最大値は16です。\r
17  * @param {HashMap|Generator|function} i_handler\r
18  * 非同期イベントハンドラの連想配列、Generator、コールバック関数の何れかを指定します。\r
19  * <p>\r
20  * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
21  * <ul>\r
22  * <li>{function()} onNew -\r
23  * インスタンスが使用可能になった時に呼び出されます。\r
24  * </li>\r
25  * <li>{function(v)} onRead  -\r
26  * read関数のコールバック関数です。\r
27  *      <ul>\r
28  *              <li>{int} v - 現在のピンの値です。</li>\r
29  *      </ul>\r
30  * </li>\r
31  * <li>{function()} onWrite -\r
32  * write関数のコールバック関数です。\r
33  * </li>\r
34  * </ul>\r
35  * <li>{function()} onOutput -\r
36  * output関数のコールバック関数です。\r
37  * </li>\r
38  * <li>{function()} onInput -\r
39  * input関数のコールバック関数です。\r
40  * </li>\r
41  * <li>{function()} onMode -\r
42  * mode関数のコールバック関数です。\r
43  * </li>\r
44  * \r
45  * <p>\r
46  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
47  * </p>\r
48  * <p>\r
49  * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。\r
50  * </p>\r
51  * @return {mbedJS.BusIn}\r
52  * @example //Callback\r
53  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
54  * {\r
55  * onNew:function(){\r
56  *   var bus=new mbedJS.BusInOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],{\r
57  *   onNew:function(){\r
58  *     bus.mode(mbedJS.PinMode.PullDown);\r
59  *   },\r
60  *   onMode:function()\r
61  *   {\r
62  *     bus.output();\r
63  *   },\r
64  *   onOutput:function()\r
65  *   {\r
66  *     bus.write(1);\r
67  *   },\r
68  *   onWrite:function()\r
69  *   {\r
70  *     bus.input();\r
71  *   },\r
72  *   onInput:function(){\r
73  *     bus.read();\r
74  *   },\r
75  *   onRead:function(v)\r
76  *   {\r
77  *     mcu.close();\r
78  *   }});\r
79  * },\r
80  * onClose:function(){\r
81  * },\r
82  * onError:function(){\r
83  * }\r
84  * });\r
85  * \r
86  * @example //Generator\r
87  * var g=function*(){\r
88  * try{\r
89  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
90  *   yield mcu.waitForNew();\r
91  *   var bus=new mbedJS.BusInOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],g);\r
92  *   yield bus.waitForNew();\r
93  *   yield bus.mode(mbedJS.PinMode.PullDown);\r
94  *   yield bus.output();\r
95  *   yield bus.write(1);\r
96  *   yield bus.input();\r
97  *   var v=yield bus.read();\r
98  *   yield mcu.close();\r
99  * }catch(e){\r
100  *   mcu.shutdown();\r
101  * }\r
102  * }();\r
103  * g.next();\r
104  */\r
105 var CLASS=function BusInOut(i_mcu,i_params,i_handler)\r
106 {\r
107         try{\r
108                 var _t=this;\r
109                 _t._mcu=i_mcu;\r
110                 _t._lc=CLASS;\r
111                 var cb=MI._initHandler.call(_t,i_handler);\r
112                 //Pin配列の正規化\r
113                 var ap=i_params;\r
114                 //数値のみの配列かな?\r
115                 MI.assertInt(ap);       \r
116                 if(ap.length<1 ||ap.length>16){\r
117                         throw new MI.MiMicException(MI.NG_INVALID_ARG);\r
118                 }\r
119                 var pins=ap[0];\r
120                 var i=1;\r
121                 for(;i<i_params.length;i++){\r
122                         pins+=","+ap[i];\r
123                 }\r
124                 for(;i<16;i++){\r
125                         pins+=","+NS.PinName.NC;\r
126                 }\r
127                 _t._mcu.rpc(_t.RPC_NS+":_new1",pins,\r
128                         function(j)\r
129                         {\r
130                                 _t._oid=j.result[0];\r
131                                 if(cb){cb();}\r
132                                 if(_t._gen){_t._gen.next(_t);}\r
133                                 _t._lc=null;\r
134                         }\r
135                 );\r
136         }catch(e){\r
137                 throw new MI.MiMicException(e);\r
138         }\r
139 }\r
140 CLASS.prototype=\r
141 {\r
142         /** @private */\r
143         RPC_NS:"mbedJS:BusInOut",\r
144         /** @private 最後にコールしたAPIです。*/\r
145         _lc:null,\r
146         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
147         _gen:null,\r
148         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
149         _event:{},\r
150         /** @private リモートインスタンスのオブジェクトIDです。*/\r
151         _oid:null,\r
152         /**\r
153          * Generatorモードのときに使用する関数です。\r
154          * Generatorモードの時は、yieldと併用してnew BusInOut()の完了を待ちます。\r
155          * @name mbedJS.BusInOut#waitForNew\r
156          * @function\r
157          */\r
158         waitForNew:function BusInOut_waitForNew()\r
159         {\r
160                 try{\r
161                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
162                         this._lc=CLASS.waitForNew;\r
163                 }catch(e){\r
164                         throw new MI.MiMicException(e);\r
165                 }\r
166         },      \r
167         /**\r
168          * ピンに値を出力します。\r
169          * 関数の完了時にonWriteイベントが発生します。\r
170          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
171          * @name mbedJS.BusInOut#write\r
172          * @function\r
173          * @param {int} i_value\r
174          * @return {int}\r
175          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
176          */\r
177         write:function BusInOut_write(i_value)\r
178         {\r
179                 try{\r
180                         var _t=this;\r
181                         var cb=MI._getCb(arguments,_t._event.onWrite);\r
182                         MI._assertYield.call(_t);\r
183                         _t._lc=CLASS.write;\r
184                         MI.assertInt(i_value);\r
185                         return _t._mcu.rpc(_t.RPC_NS+":write",_t._oid+","+i_value,\r
186                                 function(j){\r
187                                         if(cb){cb();}\r
188                                         if(_t._gen){_t._gen.next();}\r
189                                          _t._lc=null;\r
190                                 }\r
191                         );\r
192                 }catch(e){\r
193                         throw new MI.MiMicException(e);\r
194                 }\r
195         },\r
196         /**\r
197          * ピンから値を読み込みます。\r
198          * 関数の完了時にonReadイベントが発生します。\r
199          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
200          * @name mbedJS.BusInOut#read\r
201          * @function\r
202          * @return {int}\r
203          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
204          * @return {int}\r
205          * Generatorモードの時はピンの値を返します。\r
206          */\r
207         read:function BusInOut_read()\r
208         {\r
209                 try{\r
210                         var _t=this;\r
211                         var cb=MI._getCb(arguments,_t._event.onRead);\r
212                         MI._assertYield.call(_t);\r
213                         _t._lc=CLASS.read;\r
214                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
215                                 function (j)\r
216                                 {\r
217                                         var v=j.result[0];\r
218                                         if(cb){cb(v);}\r
219                                         if(_t._gen){_t._gen.next(v);}\r
220                                          _t._lc=null;\r
221                                 }\r
222                         );\r
223                 }catch(e){\r
224                         throw new MI.MiMicException(e);\r
225                 }\r
226         },\r
227         /**\r
228          * ピンモードを設定します。\r
229          * 関数の完了時にonModeイベントが発生します。\r
230          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
231          * @name mbedJS.BusInOut#mode\r
232          * @function\r
233          * @param {PinMode} i_value\r
234          * PinModeの値です。\r
235          * @return {int}\r
236          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
237          */\r
238         mode:function BusInOut_mode(i_value)\r
239         {\r
240                 try{\r
241                         var _t=this;\r
242                         var cb=MI._getCb(arguments,_t._event.onMode);\r
243                         MI._assertYield.call(_t);\r
244                         _t._lc=CLASS.mode;\r
245                         MI.assertInt(i_value);\r
246                         return _t._mcu.rpc(_t.RPC_NS+":mode",_t._oid+","+i_value,\r
247                                 function (j)\r
248                                 {\r
249                                         var v=j.result[0];\r
250                                         if(cb){cb(v);}\r
251                                         if(_t._gen){_t._gen.next(v);}\r
252                                          _t._lc=null;\r
253                                 }\r
254                         );\r
255                 }catch(e){\r
256                         throw new MI.MiMicException(e);\r
257                 }\r
258         },\r
259         /**\r
260          * ピンモードを設定します。\r
261          * 関数の完了時にonInputイベントが発生します。\r
262          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
263          * @name mbedJS.BusInOut#input\r
264          * @function\r
265          * @return {int}\r
266          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
267          */\r
268         input:function BusInOut_input()\r
269         {\r
270                 try{\r
271                         var _t=this;\r
272                         var cb=MI._getCb(arguments,_t._event.onInput);\r
273                         MI._assertYield.call(_t);\r
274                         _t._lc=CLASS.input;\r
275                         return _t._mcu.rpc(_t.RPC_NS+":input",_t._oid,\r
276                         function (j)\r
277                         {\r
278                                 if(cb){cb();}\r
279                                 if(_t._gen){_t._gen.next();}\r
280                                  _t._lc=null;\r
281                         });\r
282                 }catch(e){\r
283                         throw new MI.MiMicException(e);\r
284                 }\r
285         },\r
286         /**\r
287          * ピンモードを設定します。\r
288          * 関数の完了時にonOutputイベントが発生します。\r
289          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
290          * @name mbedJS.BusInOut#output\r
291          * @function\r
292          * @return {int}\r
293          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
294          */\r
295         output:function BusInOut_output()\r
296         {\r
297                 try{\r
298                         var _t=this;\r
299                         var cb=MI._getCb(arguments,_t._event.onOutput);\r
300                         MI._assertYield.call(_t);\r
301                         _t._lc=CLASS.mode;\r
302                         return _t._mcu.rpc(_t.RPC_NS+":output",_t._oid,\r
303                         function (j)\r
304                         {\r
305                                 if(cb){cb();}\r
306                                 if(_t._gen){_t._gen.next();}\r
307                                  _t._lc=null;\r
308                         });\r
309                 }catch(e){\r
310                         throw new MI.MiMicException(e);\r
311                 }\r
312         },\r
313         /**\r
314          * MCUに生成されているオブジェクトを破棄します。\r
315          * @name mbedJS.BusInOut#dispose\r
316          * @function\r
317          */\r
318         dispose:function BusInOut_dispose()\r
319         {\r
320                 return this._mcu._dispose.apply(this,arguments);\r
321         }\r
322 \r
323 }\r
324 NS.BusInOut=CLASS;\r
325 }());