OSDN Git Service

3bfcbd16d733f0906dc615bfbc1824598026f5f3
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.PortIn.js
1 /**\r
2  * @fileOverview PortInクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * PortInクラスです。\r
10  * <a href="https://mbed.org/handbook/PortIn">mbed::PortIn</a>と同等の機能を持ちます。\r
11  * @name mbedJS.PortIn\r
12  * @constructor\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {HashMap|Array} i_params\r
16  * <p>\r
17  * HashNapの場合は以下のメンバを指定できます。\r
18  * <ul>\r
19  * <li>{PortName} port -\r
20  * ポート名を指定します。</li>\r
21  * <li>{uint32} mask -\r
22  * ポートマスクを指定します。</li>\r
23  * </ul>\r
24  * </p>\r
25  * <p>配列の場合は次の順番でパラメータを指定します。\r
26  * <pre>{port,mask}</pre>\r
27  * </p>\r
28  * @param {HashMap|Generator|function} i_handler\r
29  * 非同期イベントハンドラの連想配列、Generator、コールバック関数の何れかを指定します。\r
30  * <p>\r
31  * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
32  * <ul>\r
33  * <li>{function()} onNew -\r
34  * インスタンスが使用可能になった時に呼び出されます。\r
35  * </li>\r
36  * <li>{function(v)} onRead -\r
37  * read関数のコールバック関数です。\r
38  *      <ul>\r
39  *              <li>{int} v - 現在のポートの値です。</li>\r
40  *      </ul>\r
41  * </li>\r
42  * </ul>\r
43  * <p>\r
44  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
45  * </p>\r
46  * <p>\r
47  * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。\r
48  * </p>\r
49  * @return {mbedJS.PortIn}\r
50  * @example //Callback\r
51  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
52  * {\r
53  *   onNew:function(){\r
54  *     var pin=new mbedJS.PortIn(mcu,[mbedJS.PortName.Port0,0xffffffff],{\r
55  *     onNew:function(){\r
56  *       log("[PASS]onNew");\r
57  *       pin.read();\r
58  *     },\r
59  *     onRead:function(v)\r
60  *     {\r
61  *       log("[PASS]read:"+v);\r
62  *       mcu.close();\r
63  *     }});\r
64  *   },\r
65  *   onClose:function(){\r
66  *     log("[PASS]onClose");\r
67  *   },\r
68  *   onError:function(){\r
69  *     alert("Error");\r
70  *   }\r
71  * });\r
72  * @example //Generator\r
73  * var g=function*(){\r
74  * try{\r
75  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
76  *   yield mcu.waitForNew();\r
77  *   var port=new mbedJS.PortIn(mcu,[mbedJS.PortName.Port0,0xffffffff],g);\r
78  *   yield port.waitForNew();\r
79  *   var v=yield port.read();\r
80  *   yield mcu.close();\r
81  * }catch(e){\r
82  *   mcu.shutdown();\r
83  * }\r
84  * }();\r
85  * g.next();\r
86  */\r
87 var CLASS=function PortIn(i_mcu,i_params,i_handler)\r
88 {\r
89         try{\r
90                 var _t=this;\r
91                 _t._mcu=i_mcu;\r
92                 _t._lc=CLASS;\r
93                 var cb=MI._initHandler.call(_t,i_handler);\r
94                 //引数の正規化\r
95                 var pr;\r
96                 if(MI.isHashArray(i_params)){\r
97                         pr=[i_params.port,i_params.mask];\r
98                 }else if(MI.isArray(i_params)){\r
99                         pr=i_params;\r
100                 }\r
101                 MI.assertInt(pr);\r
102                 _t._mcu.rpc(_t.RPC_NS+":_new1",pr[0]+","+pr[1],\r
103                         function(j)\r
104                         {\r
105                                 _t._oid=j.result[0];\r
106                                 if(cb){cb();}\r
107                                 if(_t._gen){_t._gen.next(_t);}\r
108                                 _t._lc=null;\r
109                         }               \r
110                 );\r
111         }catch(e){\r
112                 throw new MI.MiMicException(e);\r
113         }       \r
114 }\r
115 CLASS.prototype=\r
116 {\r
117         /** @private */\r
118         RPC_NS:"mbedJS:PortIn",\r
119         /** @private 最後にコールしたAPIです。*/\r
120         _lc:null,\r
121         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
122         _gen:null,\r
123         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
124         _event:{},\r
125         /** @private リモートインスタンスのオブジェクトIDです。*/\r
126         _oid:null,\r
127         /**\r
128          * Generatorモードのときに使用する関数です。\r
129          * Generatorモードの時は、yieldと併用してnew PortIn()の完了を待ちます。\r
130          * @name mbedJS.PortIn#waitForNew\r
131          * @function\r
132          */\r
133         waitForNew:function PortIn_waitForNew()\r
134         {\r
135                 try{\r
136                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
137                         this._lc=CLASS.waitForNew;\r
138                 }catch(e){\r
139                         throw new MI.MiMicException(e);\r
140                 }\r
141         },\r
142         /**\r
143          * ピンから値を読み込みます。\r
144          * 関数の完了時にonReadイベントが発生します。\r
145          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
146          * @name mbedJS.PortIn#read\r
147          * @function\r
148          * @return {int}\r
149          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
150          * @return {int}\r
151          * Generatorモードの時はポートの値を返します。\r
152          */\r
153         read:function PortIn_read()\r
154         {\r
155                 try{\r
156                         var _t=this;\r
157                         var cb=MI._getCb(arguments,_t._event.onRead);\r
158                         MI._assertYield.call(_t);\r
159                         _t._lc=CLASS.read;\r
160                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
161                                 function (j)\r
162                                 {\r
163                                         var v=j.result[0];\r
164                                         if(cb){cb(v);}\r
165                                         if(_t._gen){_t._gen.next(v);}\r
166                                          _t._lc=null;\r
167                                 }\r
168                         );\r
169                 }catch(e){\r
170                         throw new MI.MiMicException(e);\r
171                 }                       \r
172         },\r
173         /**\r
174          * MCUに生成されているオブジェクトを破棄します。\r
175          * @name mbedJS.PortIn#dispose\r
176          * @function\r
177          */\r
178         dispose:function PortIn_dispose()\r
179         {\r
180                 return this._mcu._dispose.apply(this,arguments);\r
181         }\r
182 }\r
183 NS.PortIn=CLASS;\r
184 }());