OSDN Git Service

a48200e81444d276277971be64c3d1c4049bb2d1
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.BusIn.js
1 /**\r
2  * @fileOverview BusInクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * BusInクラスです。\r
10  * <a href="https://mbed.org/handbook/BusIn">mbed::BusIn</a>と同等の機能を持ちます。\r
11  * @name mbedJS.BusIn\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()} onMode -\r
32  * mode関数のコールバック関数です。\r
33  * </li>\r
34  * </ul>\r
35  * <p>\r
36  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
37  * </p>\r
38  * <p>\r
39  * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。\r
40  * </p>\r
41  * @return {mbedJS.BusIn}\r
42  * @example //Callback\r
43  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
44  * {\r
45  *   onNew:function(){\r
46  *     var pin=new mbedJS.BusIn(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],{\r
47  *     onNew:function(){\r
48  *       pin.read();\r
49  *     },\r
50  *     onRead:function(v)\r
51  *     {\r
52  *       pin.mode(mbedJS.PinMode.PullDown);\r
53  *     },\r
54  *     onMode:function(v){\r
55  *       mcu.close();\r
56  *     }});\r
57  *   },\r
58  *   onClose:function(){\r
59  *   },\r
60  *   onError:function(){\r
61  *   }\r
62  * });\r
63  * @example //Generator\r
64  * var g=function*(){\r
65  * try{\r
66  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
67  *   yield mcu.waitForNew();\r
68  *   var bus=new mbedJS.BusIn(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],g);\r
69  *   yield bus.waitForNew();\r
70  *   var v=yield bus.read();\r
71  *   v=yield bus.mode(mbedJS.PinMode.PullUp);\r
72  *   yield mcu.close();\r
73  * }catch(e){\r
74  *   mcu.shutdown();\r
75  * }}();\r
76  * g.next();\r
77  */\r
78 var CLASS=function BusIn(i_mcu,i_params,i_handler)\r
79 {\r
80         try{\r
81                 var _t=this;\r
82                 _t._mcu=i_mcu;\r
83                 _t._lc=CLASS;\r
84                 var cb=MI._initHandler.call(_t,i_handler);\r
85                 //Pin配列の正規化\r
86                 var ap=i_params;\r
87                 if(ap.length<1 ||ap.length>16){\r
88                         throw new MI.MiMicException(MI.NG_INVALID_ARG);\r
89                 }\r
90                 //数値のみの配列かな?\r
91                 MI.assertInt(ap);\r
92                 var pins=ap[0];\r
93                 var i=1;\r
94                 for(;i<i_params.length;i++){\r
95                         pins+=","+ap[i];\r
96                 }\r
97                 for(;i<16;i++){\r
98                         pins+=","+NS.PinName.NC;\r
99                 }\r
100                 _t._mcu.rpc(_t.RPC_NS+":_new1",pins,\r
101                         function(j)\r
102                         {\r
103                                 _t._oid=j.result[0];\r
104                                 if(cb){cb();}\r
105                                 if(_t._gen){_t._gen.next(_t);}\r
106                                 _t._lc=null;\r
107                         }                               \r
108                 );\r
109         }catch(e){\r
110                 throw new MI.MiMicException(e);\r
111         }\r
112 }\r
113 CLASS.prototype=\r
114 {\r
115         /** @private */\r
116         RPC_NS:"mbedJS:BusIn",\r
117         /** @private 最後にコールしたAPIです。*/\r
118         _lc:null,\r
119         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
120         _gen:null,\r
121         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
122         _event:{},\r
123         /** @private リモートインスタンスのオブジェクトIDです。*/\r
124         _oid:null,\r
125         /**\r
126          * Generatorモードのときに使用する関数です。\r
127          * Generatorモードの時は、yieldと併用してnew BusIn()の完了を待ちます。\r
128          * @name mbedJS.BusIn#waitForNew\r
129          * @function\r
130          */\r
131         waitForNew:function BusIn_waitForNew()\r
132         {\r
133                 try{\r
134                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
135                         this._lc=CLASS.waitForNew;\r
136                 }catch(e){\r
137                         throw new MI.MiMicException(e);\r
138                 }\r
139         },\r
140         /**\r
141          * ピンから値を読み込みます。\r
142          * 関数の完了時にonReadイベントが発生します。\r
143          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
144          * @name mbedJS.BusIn#read\r
145          * @function\r
146          * @return {int}\r
147          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
148          * @return {int}\r
149          * Generatorモードの時はピンの値を返します。\r
150          */\r
151         read:function BusIn_read()\r
152         {\r
153                 try{\r
154                         var _t=this;\r
155                         var cb=MI._getCb(arguments,_t._event.onRead);\r
156                         MI._assertYield.call(_t);\r
157                         _t._lc=CLASS.read;\r
158                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
159                                 function (j)\r
160                                 {\r
161                                         var v=j.result[0];\r
162                                         if(cb){cb(v);}\r
163                                         if(_t._gen){_t._gen.next(v);}\r
164                                          _t._lc=null;\r
165                                 }\r
166                         );\r
167                 }catch(e){\r
168                         throw new MI.MiMicException(e);\r
169                 }\r
170         },\r
171         /**\r
172          * ピンモードを設定します。\r
173          * 関数の完了時にonModeイベントが発生します。\r
174          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
175          * @name mbedJS.BusIn#mode\r
176          * @function\r
177          * @param {PinMode} i_value\r
178          * PinModeの値です。\r
179          * @return {int}\r
180          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
181          */\r
182         mode:function BusIn_mode(i_value)\r
183         {\r
184                 try{\r
185                         var _t=this;\r
186                         var cb=MI._getCb(arguments,_t._event.onMode);\r
187                         MI._assertYield.call(_t);\r
188                         MI.assertInt(i_value);\r
189                         return _t._mcu.rpc(_t.RPC_NS+":mode",_t._oid+","+i_value,\r
190                                 function (j)\r
191                                 {\r
192                                         var v=j.result[0];\r
193                                         if(cb){cb(v);}\r
194                                         if(_t._gen){_t._gen.next(v);}\r
195                                          _t._lc=null;\r
196                                 }\r
197                         );\r
198                 }catch(e){\r
199                         throw new MI.MiMicException(e);\r
200                 }                       \r
201         },\r
202         /**\r
203          * MCUに生成されているオブジェクトを破棄します。\r
204          * @name mbedJS.BusIn#dispose\r
205          * @function\r
206          */\r
207         dispose:function BusIn_dispose()\r
208         {\r
209                 return this._mcu._dispose.apply(this,arguments);\r
210         }\r
211 \r
212 }\r
213 NS.BusIn=CLASS;\r
214 }());