OSDN Git Service

ae664d722fc831a308711b6baf988b1a0578fac2
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.BusOut.js
1 /**\r
2  * @fileOverview BusOutクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * BusOutクラスです。\r
10  * <a href="https://mbed.org/handbook/BusOut">mbed::BusOut</a>と同等の機能を持ちます。\r
11  * @name mbedJS.BusOut\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  * <p>\r
36  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
37  * <p>\r
38  * @return {mbedJS.BusOut}\r
39  * @example //Callback\r
40  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
41  * {\r
42  *   onNew:function(){\r
43  *     var bus=new mbedJS.BusOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],{\r
44  *     onNew:function(){\r
45  *       bus.write(2);\r
46  *     },\r
47  *     onWrite:function()\r
48  *     {\r
49  *       bus.read();\r
50  *     },\r
51  *     onRead:function(v){\r
52  *       mcu.close();\r
53  *     },\r
54  *     });\r
55  *   },\r
56  *   onClose:function(){\r
57  *   },\r
58  *   onError:function(){\r
59  *   }\r
60  * });\r
61  * @example //Generator\r
62  * var g=function*(){\r
63  * try{\r
64  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
65  *   yield mcu.waitForNew();\r
66  *   var bus=new mbedJS.BusOut(mcu,[mbedJS.PinName.P0_21,mbedJS.PinName.P0_22],g);\r
67  *   yield bus.waitForNew();\r
68  *   yield bus.write(1);\r
69  *   var v=yield bus.read();\r
70  *   yield mcu.close();\r
71  * }catch(e){\r
72  *   mcu.shutdown();\r
73  * }\r
74  * }();\r
75  * g.next();\r
76  */\r
77 var CLASS=function BusOut(i_mcu,i_params,i_handler)\r
78 {\r
79         try{\r
80                 var _t=this;\r
81                 _t._mcu=i_mcu;\r
82                 _t._lc=CLASS;\r
83                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
84                 else if(i_handler){_t._event=i_handler}\r
85                 function cb(j)\r
86                 {\r
87                         _t._oid=j.result[0];\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                 //Pin配列の正規化\r
93                 var ap=i_params;\r
94                 if(ap.length<1 ||ap.length>16){\r
95                         throw new MI.MiMicException(MI.NG_INVALID_ARG);\r
96                 }\r
97                 //数値のみの配列かな?\r
98                 MI.assertInt(ap);       \r
99                 var pins=ap[0];\r
100                 var i=1;\r
101                 for(;i<i_params.length;i++){\r
102                         pins+=","+ap[i];\r
103                 }\r
104                 for(;i<16;i++){\r
105                         pins+=","+NS.PinName.NC;\r
106                 }\r
107                 return _t._mcu.rpc(_t.RPC_NS+":_new1",pins,cb);\r
108         }catch(e){\r
109                 throw new MI.MiMicException(e);\r
110         }\r
111                 \r
112 }\r
113 CLASS.prototype=\r
114 {\r
115         /** @private */\r
116         RPC_NS:"mbedJS:BusOut",\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 BusOut()の完了を待ちます。\r
128          * @name mbedJS.BusOut#waitForNew\r
129          * @function\r
130          */\r
131         waitForNew:function BusOut_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          * 関数の完了時にonWriteイベントが発生します。\r
143          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
144          * @name mbedJS.BusOut#write\r
145          * @function\r
146          * @param {int} i_value\r
147          * @return {int}\r
148          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
149          */\r
150         write:function BusOut_write(i_value)\r
151         {\r
152                 try{\r
153                         var _t=this;\r
154                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
155                         _t._lc=CLASS.write;\r
156                         MI.assertInt(i_value);  \r
157                         return _t._mcu.rpc(_t.RPC_NS+":write",_t._oid+","+i_value,\r
158                         function(j){\r
159                                 if(_t._event.onWrite){_t._event.onWrite();}\r
160                                 if(_t._gen){_t._gen.next();}\r
161                                  _t._lc=null;\r
162                         });\r
163                 }catch(e){\r
164                         throw new MI.MiMicException(e);\r
165                 }\r
166         },\r
167         /**\r
168          * ピンから値を読み込みます。\r
169          * 関数の完了時にonReadイベントが発生します。\r
170          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
171          * @name mbedJS.BusOut#read\r
172          * @function\r
173          * @return {int}\r
174          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
175          * @return {int}\r
176          * Generatorモードの時はピンの値を返します。\r
177          */\r
178         read:function BusOut_read()\r
179         {\r
180                 try{\r
181                         var _t=this;\r
182                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
183                         _t._lc=CLASS.read;\r
184                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
185                         function (j)\r
186                         {\r
187                                 var v=j.result[0];\r
188                                 if(_t._event.onRead){_t._event.onRead(v);}\r
189                                 if(_t._gen){_t._gen.next(v);}\r
190                                  _t._lc=null;\r
191                         });\r
192                 }catch(e){\r
193                         throw new MI.MiMicException(e);\r
194                 }\r
195         }\r
196 }\r
197 NS.BusOut=CLASS;\r
198 }());