OSDN Git Service

2.0.2
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.SPI.js
1 /**\r
2  * @fileOverview SPIクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * SPIクラスです。\r
10  * <a href="https://mbed.org/handbook/SPI">mbed::SPI</a>と同等の機能を持ちます。\r
11  * @name mbedJS.SPI\r
12  * @constructor\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {[PinName,PinName,PinName]} i_params\r
16  * SPIを構成する3つのPinNameを格納する配列です。mosi,miso,sclkの順番です。\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)} onWrite -\r
26  * write関数のコールバック関数です。\r
27  *      <ul>\r
28  *              <li>{int} v - 受信した8BIT値です。</li>\r
29  *      </ul>\r
30  * </li>\r
31  * <li>{function(v)} onFrequency  -\r
32  * frequency関数のコールバック関数です。\r
33  * </li>\r
34  * <li>{function(v)} onFormat  -\r
35  * format関数のコールバック関数です。\r
36  * </li>\r
37  * </ul>\r
38  * <p>\r
39  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
40  * </p>\r
41  * <p>\r
42  * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。\r
43  * </p>\r
44  * @return {mbedJS.SPI}\r
45  * @example //Callback\r
46  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
47  * {\r
48  *   onNew:function(){\r
49  *     var pin=new mbedJS.SPI(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7],{\r
50  *     onNew:function(){\r
51  *       pin.frequency(1000000);\r
52  *     },\r
53  *     onFrequency:function()\r
54  *     {\r
55  *       pin.format(8,3);\r
56  *     },\r
57  *     onFormat:function()\r
58  *     {\r
59  *       pin.write(39);\r
60  *     },\r
61  *     onWrite:function(v){\r
62  *       mcu.close();\r
63  *     }});\r
64  *   },\r
65  *   onClose:function(){\r
66  *   },\r
67  *   onError:function(){\r
68  *   }\r
69  * });\r
70  * @example //Generator\r
71  * var g=function*(){\r
72  * try{\r
73  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
74  *   yield mcu.waitForNew();\r
75  *   var pin=new mbedJS.SPI(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7],g);\r
76  *   yield pin.waitForNew();\r
77  *   yield pin.frequency(1000000);\r
78  *   yield pin.format(8,3);\r
79  *   v=yield pin.write(39);\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 SPI(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                 MI.assertInt(i_params);\r
95                 _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1]+","+i_params[2]+","+NS.PinName.NC,\r
96                         function(j)\r
97                         {\r
98                                 _t._oid=j.result[0];\r
99                                 if(cb){cb();}\r
100                                 if(_t._gen){_t._gen.next(_t);}\r
101                                 _t._lc=null;\r
102                         }               \r
103                 );\r
104         }catch(e){\r
105                 throw new MI.MiMicException(e);\r
106         }\r
107                 \r
108 }\r
109 CLASS.prototype=\r
110 {\r
111         /** @private */\r
112         RPC_NS:"mbedJS:SPI",\r
113         /** @private 最後にコールしたAPIです。*/\r
114         _lc:null,\r
115         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
116         _gen:null,\r
117         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
118         _event:{},\r
119         /** @private リモートインスタンスのオブジェクトIDです。*/\r
120         _oid:null,\r
121         /**\r
122          * Generatorモードのときに使用する関数です。\r
123          * Generatorモードの時は、yieldと併用してnew SPI()の完了を待ちます。\r
124          * @name mbedJS.SPI#waitForNew\r
125          * @function\r
126          */\r
127         waitForNew:function SPI_waitForNew()\r
128         {\r
129                 try{\r
130                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
131                         this._lc=CLASS.waitForNew;\r
132                 }catch(e){\r
133                         throw new MI.MiMicException(e);\r
134                 }                       \r
135         },      \r
136         /**\r
137          * ピンに値を出力します。\r
138          * 関数の完了時にonWriteイベントが発生します。\r
139          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
140          * @name mbedJS.SPI#write\r
141          * @function\r
142          * @param {int} i_value\r
143          * @return {int}\r
144          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
145          */\r
146         write:function SPI_write(i_value)\r
147         {\r
148                 try{\r
149                         var _t=this;\r
150                         MI._assertYield.call(_t);\r
151                         var cb=MI._getCb(arguments,_t._event.onWrite);\r
152                         _t._lc=CLASS.write;\r
153                         MI.assertInt(i_value);\r
154                         return _t._mcu.rpc(_t.RPC_NS+":write",_t._oid+","+i_value,\r
155                                 function(j){\r
156                                         var v=j.result[0];\r
157                                         if(cb){cb(v);}\r
158                                         if(_t._gen){_t._gen.next(v);}\r
159                                          _t._lc=null;\r
160                                 }\r
161                         );\r
162                 }catch(e){\r
163                         throw new MI.MiMicException(e);\r
164                 }\r
165         },\r
166         /**\r
167          * ピンに値を出力します。\r
168          * 関数の完了時にonFrequencyイベントが発生します。\r
169          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
170          * @name mbedJS.SPI#frequency\r
171          * @function\r
172          * @param {int} i_value\r
173          * frequencyに設定する値です。\r
174          * @return {int}\r
175          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
176          */\r
177         frequency:function SPI_frequency(i_value)\r
178         {\r
179                 try{\r
180                         var _t=this;\r
181                         MI._assertYield.call(_t);\r
182                         var cb=MI._getCb(arguments,_t._event.onFrequency);\r
183                         _t._lc=CLASS.frequency;\r
184                         MI.assertInt(i_value);\r
185                         return _t._mcu.rpc(_t.RPC_NS+":frequency",_t._oid+","+i_value,\r
186                                 function(j){\r
187                                         if(cb){cb();}\r
188                                         if(_t._gen){_t._gen.next();}\r
189                                          _t._lc=null;\r
190                                 }\r
191                         );\r
192                 }catch(e){\r
193                         throw new MI.MiMicException(e);\r
194                 }\r
195         },      \r
196         /**\r
197          * ピンに値を出力します。\r
198          * 関数の完了時にonFrequencyイベントが発生します。\r
199          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
200          * @name mbedJS.SPI#format\r
201          * @function\r
202          * @param {int} i_bits\r
203          * @param {int} i_mode\r
204          * 省略可能です。省略時は0になります。\r
205          * @return {int}\r
206          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
207          */\r
208         format:function SPI_format(i_bits,i_mode)\r
209         {\r
210                 try{\r
211                         var _t=this;\r
212                         MI._assertYield.call(_t);\r
213                         var cb=MI._getCb(arguments,_t._event.onFormat);\r
214                         _t._lc=CLASS.format;\r
215                         var mode=i_mode?i_mode:0;\r
216                         MI.assertInt([i_bits,mode]);\r
217                         return _t._mcu.rpc(_t.RPC_NS+":format",_t._oid+","+i_bits+","+mode,\r
218                                 function(j){\r
219                                         if(cb){cb();}\r
220                                         if(_t._gen){_t._gen.next();}\r
221                                          _t._lc=null;\r
222                                 }\r
223                         );\r
224                 }catch(e){\r
225                         throw new MI.MiMicException(e);\r
226                 }\r
227         }\r
228 }\r
229 NS.SPI=CLASS;\r
230 }());