OSDN Git Service

c146af982ea99530124493175dc72a33cc557e9f
[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} i_event\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  * @return {mbedJS.BusIn}\r
49  * @example //Callback\r
50  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
51  * {\r
52  * onNew:function(){\r
53  *   var bus=new mbedJS.BusInOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],{\r
54  *   onNew:function(){\r
55  *     bus.mode(mbedJS.PinMode.PullDown);\r
56  *   },\r
57  *   onMode:function()\r
58  *   {\r
59  *     bus.output();\r
60  *   },\r
61  *   onOutput:function()\r
62  *   {\r
63  *     bus.write(1);\r
64  *   },\r
65  *   onWrite:function()\r
66  *   {\r
67  *     bus.input();\r
68  *   },\r
69  *   onInput:function(){\r
70  *     bus.read();\r
71  *   },\r
72  *   onRead:function(v)\r
73  *   {\r
74  *     mcu.close();\r
75  *   }});\r
76  * },\r
77  * onClose:function(){\r
78  * },\r
79  * onError:function(){\r
80  * }\r
81  * });\r
82  * \r
83  * @example //Generator\r
84  * var g=function*(){\r
85  * try{\r
86  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
87  *   yield mcu.waitForNew();\r
88  *   var bus=new mbedJS.BusInOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],g);\r
89  *   yield bus.waitForNew();\r
90  *   yield bus.mode(mbedJS.PinMode.PullDown);\r
91  *   yield bus.output();\r
92  *   yield bus.write(1);\r
93  *   yield bus.input();\r
94  *   var v=yield bus.read();\r
95  *   yield mcu.close();\r
96  * }catch(e){\r
97  *   mcu.shutdown();\r
98  * }\r
99  * }();\r
100  * g.next();\r
101  */\r
102 var CLASS=function BusInOut(i_mcu,i_params,i_handler)\r
103 {\r
104         try{\r
105                 var _t=this;\r
106                 _t._mcu=i_mcu;\r
107                 _t._lc=CLASS;\r
108                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
109                 else if(i_handler){_t._event=i_handler}\r
110                 function cb(j)\r
111                 {\r
112                         _t._oid=j.result[0];\r
113                         if(_t._event.onNew){_t._event.onNew();}\r
114                         if(_t._gen){_t._gen.next(_t);}\r
115                         _t._lc=null;\r
116                 }\r
117                 //Pin配列の正規化\r
118                 var ap=i_params;\r
119                 //数値のみの配列かな?\r
120                 MI.assertInt(ap);       \r
121                 if(ap.length<1 ||ap.length>16){\r
122                         throw new MI.MiMicException(MI.NG_INVALID_ARG);\r
123                 }\r
124                 var pins=ap[0];\r
125                 var i=1;\r
126                 for(;i<i_params.length;i++){\r
127                         pins+=","+ap[i];\r
128                 }\r
129                 for(;i<16;i++){\r
130                         pins+=","+NS.PinName.NC;\r
131                 }\r
132                 return _t._mcu.rpc(_t.RPC_NS+":_new1",pins,cb);\r
133         }catch(e){\r
134                 throw new MI.MiMicException(e);\r
135         }\r
136 }\r
137 CLASS.prototype=\r
138 {\r
139         /** @private */\r
140         RPC_NS:"mbedJS:BusInOut",\r
141         /** @private 最後にコールしたAPIです。*/\r
142         _lc:null,\r
143         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
144         _gen:null,\r
145         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
146         _event:{},\r
147         /** @private リモートインスタンスのオブジェクトIDです。*/\r
148         _oid:null,\r
149         /**\r
150          * Generatorモードのときに使用する関数です。\r
151          * Generatorモードの時は、yieldと併用してnew BusInOut()の完了を待ちます。\r
152          * @name mbedJS.BusInOut#waitForNew\r
153          * @function\r
154          */\r
155         waitForNew:function BusInOut_waitForNew()\r
156         {\r
157                 try{\r
158                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
159                         this._lc=CLASS.waitForNew;\r
160                 }catch(e){\r
161                         throw new MI.MiMicException(e);\r
162                 }\r
163         },      \r
164         /**\r
165          * ピンに値を出力します。\r
166          * 関数の完了時にonWriteイベントが発生します。\r
167          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
168          * @name mbedJS.BusInOut#write\r
169          * @function\r
170          * @param {int} i_value\r
171          * @return {int}\r
172          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
173          */\r
174         write:function BusInOut_write(i_value)\r
175         {\r
176                 try{\r
177                         var _t=this;\r
178                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
179                         _t._lc=CLASS.write;\r
180                         MI.assertInt(i_value);\r
181                         return _t._mcu.rpc(_t.RPC_NS+":write",_t._oid+","+i_value,\r
182                         function(j){\r
183                                 if(_t._event.onWrite){_t._event.onWrite();}\r
184                                 if(_t._gen){_t._gen.next();}\r
185                                  _t._lc=null;\r
186                         });\r
187                 }catch(e){\r
188                         throw new MI.MiMicException(e);\r
189                 }\r
190         },\r
191         /**\r
192          * ピンから値を読み込みます。\r
193          * 関数の完了時にonReadイベントが発生します。\r
194          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
195          * @name mbedJS.BusInOut#read\r
196          * @function\r
197          * @return {int}\r
198          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
199          * @return {int}\r
200          * Generatorモードの時はピンの値を返します。\r
201          */\r
202         read:function BusInOut_read()\r
203         {\r
204                 try{\r
205                         var _t=this;\r
206                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
207                         _t._lc=CLASS.read;\r
208                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
209                         function (j)\r
210                         {\r
211                                 var v=j.result[0];\r
212                                 if(_t._event.onRead){_t._event.onRead(v);}\r
213                                 if(_t._gen){_t._gen.next(v);}\r
214                                  _t._lc=null;\r
215                         }\r
216                         );\r
217                 }catch(e){\r
218                         throw new MI.MiMicException(e);\r
219                 }\r
220         },\r
221         /**\r
222          * ピンモードを設定します。\r
223          * 関数の完了時にonModeイベントが発生します。\r
224          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
225          * @name mbedJS.BusInOut#mode\r
226          * @function\r
227          * @param {PinMode} i_value\r
228          * PinModeの値です。\r
229          * @return {int}\r
230          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
231          */\r
232         mode:function BusInOut_mode(i_value)\r
233         {\r
234                 try{\r
235                         var _t=this;\r
236                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
237                         _t._lc=CLASS.mode;\r
238                         MI.assertInt(i_value);\r
239                         return _t._mcu.rpc(_t.RPC_NS+":mode",_t._oid+","+i_value,\r
240                         function (j)\r
241                         {\r
242                                 var v=j.result[0];\r
243                                 if(_t._event.onMode){_t._event.onMode(v);}\r
244                                 if(_t._gen){_t._gen.next(v);}\r
245                                  _t._lc=null;\r
246                         });\r
247                 }catch(e){\r
248                         throw new MI.MiMicException(e);\r
249                 }\r
250         },\r
251         /**\r
252          * ピンモードを設定します。\r
253          * 関数の完了時にonInputイベントが発生します。\r
254          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
255          * @name mbedJS.BusInOut#input\r
256          * @function\r
257          * @return {int}\r
258          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
259          */\r
260         input:function BusInOut_input()\r
261         {\r
262                 try{\r
263                         var _t=this;\r
264                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
265                         _t._lc=CLASS.input;\r
266                         return _t._mcu.rpc(_t.RPC_NS+":input",_t._oid,\r
267                         function (j)\r
268                         {\r
269                                 if(_t._event.onInput){_t._event.onInput();}\r
270                                 if(_t._gen){_t._gen.next();}\r
271                                  _t._lc=null;\r
272                         });\r
273                 }catch(e){\r
274                         throw new MI.MiMicException(e);\r
275                 }\r
276         },\r
277         /**\r
278          * ピンモードを設定します。\r
279          * 関数の完了時にonOutputイベントが発生します。\r
280          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
281          * @name mbedJS.BusInOut#output\r
282          * @function\r
283          * @return {int}\r
284          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
285          */\r
286         output:function BusInOut_output()\r
287         {\r
288                 try{\r
289                         var _t=this;\r
290                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
291                         _t._lc=CLASS.mode;\r
292                         return _t._mcu.rpc(_t.RPC_NS+":output",_t._oid,\r
293                         function (j)\r
294                         {\r
295                                 if(_t._event.onOutput){_t._event.onOutput();}\r
296                                 if(_t._gen){_t._gen.next();}\r
297                                  _t._lc=null;\r
298                         });\r
299                 }catch(e){\r
300                         throw new MI.MiMicException(e);\r
301                 }\r
302         }       \r
303 }\r
304 NS.BusInOut=CLASS;\r
305 }());