OSDN Git Service

97a2f4d5c1ff4936d6297f5b5084bc189d586959
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.SPISlave.js
1 /**\r
2  * @fileOverview SPISlaveクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * SPISlaveクラスです。\r
10  * <a href="https://mbed.org/handbook/SPISlave">mbed::SPISlave</a>と同等の機能を持ちます。\r
11  * @name mbedJS.SPISlave\r
12  * @constructor\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {[PinName,PinName,PinName]} i_params\r
16  * SPIを構成する4つのPinNameを格納する配列です。\r
17  * mosi, miso, sclkの順番で設定します。\r
18  * @param {HashMap|Generator} i_event\r
19  * 非同期イベントハンドラの連想配列、又はGeneratorです。\r
20  * <p>\r
21  * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
22  * <ul>\r
23  * <li>{function()} onNew -\r
24  * インスタンスが使用可能になった時に呼び出されます。\r
25  * </li>\r
26  * <li>{function(v)} onFrequency  -\r
27  * frequency関数のコールバック関数です。\r
28  * </li>\r
29  * <li>{function(v)} onFormat  -\r
30  * format関数のコールバック関数です。\r
31  * </li>\r
32  * <li>{function(v)} onReceive  -\r
33  * receive関数のコールバック関数です。\r
34  * </li>\r
35  * <li>{function(v)} onRead  -\r
36  * read関数のコールバック関数です。\r
37  * <ul>\r
38  *              <li>{int} v - 受信した8BIT値です。</li>\r
39  * </ul>\r
40  * </li>\r
41  * <li>{function()} onReply  -\r
42  * reply関数のコールバック関数です。\r
43  * </li>\r
44  * </ul>\r
45  * <p>\r
46  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
47  * <p>\r
48  * @return {mbedJS.SPI}\r
49  * @example //Callback\r
50  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
51  * {\r
52  *   onNew:function(){\r
53  *     var pin=new mbedJS.SPISlave(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7,mbedJS.PinName.p8],{\r
54  *     onNew:function(){\r
55  *       pin.frequency(1000000);\r
56  *     },\r
57  *     onFrequency:function()\r
58  *     {\r
59  *       pin.format(8,3);\r
60  *     },\r
61  *     onFormat:function()\r
62  *     {\r
63  *       pin.read();\r
64  *     },\r
65  *     onRead:function(v){\r
66  *       pin.receive();\r
67  *     },\r
68  *     onReceive:function(v)\r
69  *     {\r
70  *       pin.reply(1);\r
71  *     },\r
72  *     onReply:function(){\r
73  *         mcu.close();\r
74  *     }\r
75  *     });\r
76  *   },\r
77  *   onClose:function(){\r
78  *   },\r
79  *   onError:function(){\r
80  *   }\r
81  * });\r
82  * @example //Generator\r
83  * var g=function*(){\r
84  * try{\r
85  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
86  *   yield mcu.waitForNew();\r
87  *   var pin=new mbedJS.SPISlave(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7,mbedJS.PinName.p8],g);\r
88  *   yield pin.waitForNew();\r
89  *   yield pin.frequency(1000000);\r
90  *   yield pin.format(8,3);\r
91  *   var v=yield pin.read();\r
92  *   v=yield pin.receive();\r
93  *   yield pin.reply(1);\r
94  *   yield mcu.close();\r
95  * }catch(e){\r
96  *   mcu.shutdown();\r
97  * }\r
98  * }();\r
99  * g.next();\r
100  */\r
101 var CLASS=function SPISlave(i_mcu,i_params,i_handler)\r
102 {\r
103         try{\r
104                 var _t=this;\r
105                 _t._mcu=i_mcu;\r
106                 _t._lc=CLASS;\r
107                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
108                 else if(i_handler){_t._event=i_handler}\r
109                 function cb(j)\r
110                 {\r
111                         _t._oid=j.result[0];\r
112                         if(_t._event.onNew){_t._event.onNew();}\r
113                         if(_t._gen){_t._gen.next(_t);}\r
114                         _t._lc=null;\r
115                 }\r
116                 MI.assertInt(i_params);\r
117                 return _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1]+","+i_params[2]+","+i_params[3],cb);\r
118         }catch(e){\r
119                 throw new MI.MiMicException(e);\r
120         }               \r
121 }\r
122 CLASS.prototype=\r
123 {\r
124         /** @private */\r
125         RPC_NS:"mbedJS:SPISlave",\r
126         /** @private 最後にコールしたAPIです。*/\r
127         _lc:null,\r
128         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
129         _gen:null,\r
130         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
131         _event:{},\r
132         /** @private リモートインスタンスのオブジェクトIDです。*/\r
133         _oid:null,\r
134         /**\r
135          * Generatorモードのときに使用する関数です。\r
136          * Generatorモードの時は、yieldと併用してnew SPISlave()の完了を待ちます。\r
137          * @name mbedJS.SPISlave#waitForNew\r
138          * @function\r
139          */\r
140         waitForNew:function SPISlave_waitForNew()\r
141         {\r
142                 try{\r
143                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
144                         this._lc=CLASS.waitForNew;\r
145                 }catch(e){\r
146                         throw new MI.MiMicException(e);\r
147                 }                       \r
148         },      \r
149 \r
150         /**\r
151          * ピンに値を出力します。\r
152          * 関数の完了時にonFrequencyイベントが発生します。\r
153          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
154          * @name mbedJS.SPISlave#frequency\r
155          * @function\r
156          * @param {int} i_value\r
157          * \r
158          * @return {int}\r
159          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
160          */\r
161         frequency:function SPISlave_frequency(i_value)\r
162         {\r
163                 try{\r
164                         var _t=this;\r
165                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
166                         _t._lc=CLASS.frequency;\r
167                         MI.assertInt(i_value);\r
168                         return _t._mcu.rpc(_t.RPC_NS+":frequency",_t._oid+","+i_value,\r
169                         function(j){\r
170                                 if(_t._event.onFrequency){_t._event.onFrequency();}\r
171                                 if(_t._gen){_t._gen.next();}\r
172                                  _t._lc=null;\r
173                         });\r
174                 }catch(e){\r
175                         throw new MI.MiMicException(e);\r
176                 }\r
177         },      \r
178         /**\r
179          * ピンに値を出力します。\r
180          * 関数の完了時にonFrequencyイベントが発生します。\r
181          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
182          * @name mbedJS.SPISlave#format\r
183          * @function\r
184          * @param {int} i_bits\r
185          * @param {int} i_mode\r
186          * 省略可能です。省略時は0になります。\r
187          * @return {int}\r
188          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
189          */\r
190         format:function SPISlave_format(i_bits,i_mode)\r
191         {\r
192                 try{\r
193                         var _t=this;\r
194                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
195                         _t._lc=CLASS.format;\r
196                         var mode=i_mode?i_mode:0;\r
197                         MI.assertInt([i_bits,mode]);\r
198                         return _t._mcu.rpc(_t.RPC_NS+":format",_t._oid+","+i_bits+","+mode,\r
199                         function(j){\r
200                                 if(_t._event.onFormat){_t._event.onFormat();}\r
201                                 if(_t._gen){_t._gen.next();}\r
202                                  _t._lc=null;\r
203                         });\r
204                 }catch(e){\r
205                         throw new MI.MiMicException(e);\r
206                 }\r
207         },\r
208         /**\r
209          * ピンから値を読み込みます。\r
210          * 関数の完了時にonReadイベントが発生します。\r
211          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
212          * @name mbedJS.SPISlave#read\r
213          * @function\r
214          * @return {int}\r
215          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
216          * @return {int}\r
217          * Generatorモードの時はピンの値を返します。\r
218          */\r
219         read:function SPISlave_read()\r
220         {\r
221                 try{\r
222                         var _t=this;\r
223                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
224                         _t._lc=CLASS.read;\r
225                         return _t._mcu.rpc(_t.RPC_NS+":read",_t._oid,\r
226                         function (j)\r
227                         {\r
228                                 var v=j.result[0];\r
229                                 if(_t._event.onRead){_t._event.onRead(v);}\r
230                                 if(_t._gen){_t._gen.next(v);}\r
231                                  _t._lc=null;\r
232                         });\r
233                 }catch(e){\r
234                         throw new MI.MiMicException(e);\r
235                 }                       \r
236         },\r
237         /**\r
238          * ピンから値を読み込みます。\r
239          * 関数の完了時にonReadイベントが発生します。\r
240          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
241          * @name mbedJS.SPISlave#receive\r
242          * @function\r
243          * @return {int}\r
244          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
245          * @return {int}\r
246          * Generatorモードの時はピンの値を返します。\r
247          */\r
248         receive:function SPISlave_receive()\r
249         {\r
250                 try{\r
251                         var _t=this;\r
252                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
253                         _t._lc=CLASS.receive;\r
254                         return _t._mcu.rpc(_t.RPC_NS+":receive",_t._oid,\r
255                         function (j)\r
256                         {\r
257                                 var v=j.result[0];\r
258                                 if(_t._event.onReceive){_t._event.onReceive(v);}\r
259                                 if(_t._gen){_t._gen.next(v);}\r
260                                  _t._lc=null;\r
261                         });\r
262                 }catch(e){\r
263                         throw new MI.MiMicException(e);\r
264                 }                       \r
265         },\r
266         /**\r
267          * ピンモードを設定します。\r
268          * 関数の完了時にonReplyイベントが発生します。\r
269          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
270          * @name mbedJS.SPISlave#reply\r
271          * @function\r
272          * @param {int} i_value\r
273          * 次に送る8bitの値です。\r
274          * @return {int}\r
275          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
276          */\r
277         reply:function SPISlave_reply(i_value)\r
278         {\r
279                 try{\r
280                         var _t=this;\r
281                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
282                         _t._lc=CLASS.reply;\r
283                         MI.assertInt(i_value);\r
284                         return _t._mcu.rpc(_t.RPC_NS+":reply",_t._oid+","+i_value,\r
285                         function (j)\r
286                         {\r
287                                 if(_t._event.onReply){_t._event.onReply();}\r
288                                 if(_t._gen){_t._gen.next();}\r
289                                  _t._lc=null;\r
290                         });\r
291                 }catch(e){\r
292                         throw new MI.MiMicException(e);\r
293                 }                       \r
294         }       \r
295 }\r
296 NS.SPISlave=CLASS;\r
297 }());