OSDN Git Service

bafe1e817a6fa0aa20a7aa2ac99d9f264548ba0e
[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} 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)} 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  * @return {mbedJS.SPI}\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.SPI(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7],{\r
47  *     onNew:function(){\r
48  *       pin.frequency(1000000);\r
49  *     },\r
50  *     onFrequency:function()\r
51  *     {\r
52  *       pin.format(8,3);\r
53  *     },\r
54  *     onFormat:function()\r
55  *     {\r
56  *       pin.write(39);\r
57  *     },\r
58  *     onWrite:function(v){\r
59  *       mcu.close();\r
60  *     }});\r
61  *   },\r
62  *   onClose:function(){\r
63  *   },\r
64  *   onError:function(){\r
65  *   }\r
66  * });\r
67  * @example //Generator\r
68  * var g=function*(){\r
69  * try{\r
70  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
71  *   yield mcu.waitForNew();\r
72  *   var pin=new mbedJS.SPI(mcu,[mbedJS.PinName.p5,mbedJS.PinName.p6,mbedJS.PinName.p7],g);\r
73  *   yield pin.waitForNew();\r
74  *   yield pin.frequency(1000000);\r
75  *   yield pin.format(8,3);\r
76  *   v=yield pin.write(39);\r
77  *   yield mcu.close();\r
78  * }catch(e){\r
79  *   mcu.shutdown();\r
80  * }\r
81  * }();\r
82  * g.next();\r
83  */\r
84 var CLASS=function SPI(i_mcu,i_params,i_handler)\r
85 {\r
86         try{\r
87                 var _t=this;\r
88                 _t._mcu=i_mcu;\r
89                 _t._lc=CLASS;\r
90                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
91                 else if(i_handler){_t._event=i_handler}\r
92                 function cb(j)\r
93                 {\r
94                         _t._oid=j.result[0];\r
95                         if(_t._event.onNew){_t._event.onNew();}\r
96                         if(_t._gen){_t._gen.next(_t);}\r
97                         _t._lc=null;\r
98                 }\r
99                 MI.assertInt(i_params);\r
100                 return _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1]+","+i_params[2]+","+NS.PinName.NC,cb);\r
101         }catch(e){\r
102                 throw new MI.MiMicException(e);\r
103         }\r
104                 \r
105 }\r
106 CLASS.prototype=\r
107 {\r
108         /** @private */\r
109         RPC_NS:"mbedJS:SPI",\r
110         /** @private 最後にコールしたAPIです。*/\r
111         _lc:null,\r
112         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
113         _gen:null,\r
114         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
115         _event:{},\r
116         /** @private リモートインスタンスのオブジェクトIDです。*/\r
117         _oid:null,\r
118         /**\r
119          * Generatorモードのときに使用する関数です。\r
120          * Generatorモードの時は、yieldと併用してnew SPI()の完了を待ちます。\r
121          * @name mbedJS.SPI#waitForNew\r
122          * @function\r
123          */\r
124         waitForNew:function SPI_waitForNew()\r
125         {\r
126                 try{\r
127                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
128                         this._lc=CLASS.waitForNew;\r
129                 }catch(e){\r
130                         throw new MI.MiMicException(e);\r
131                 }                       \r
132         },      \r
133         /**\r
134          * ピンに値を出力します。\r
135          * 関数の完了時にonWriteイベントが発生します。\r
136          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
137          * @name mbedJS.SPI#write\r
138          * @function\r
139          * @param {int} i_value\r
140          * @return {int}\r
141          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
142          */\r
143         write:function SPI_write(i_value)\r
144         {\r
145                 try{\r
146                         var _t=this;\r
147                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
148                         _t._lc=CLASS.write;\r
149                         MI.assertInt(i_value);\r
150                         return _t._mcu.rpc(_t.RPC_NS+":write",_t._oid+","+i_value,\r
151                         function(j){\r
152                                 var v=j.result[0];\r
153                                 if(_t._event.onWrite){_t._event.onWrite(v);}\r
154                                 if(_t._gen){_t._gen.next(v);}\r
155                                  _t._lc=null;\r
156                         });\r
157                 }catch(e){\r
158                         throw new MI.MiMicException(e);\r
159                 }\r
160         },\r
161         /**\r
162          * ピンに値を出力します。\r
163          * 関数の完了時にonFrequencyイベントが発生します。\r
164          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
165          * @name mbedJS.SPI#frequency\r
166          * @function\r
167          * @param {int} i_value\r
168          * frequencyに設定する値です。\r
169          * @return {int}\r
170          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
171          */\r
172         frequency:function SPI_frequency(i_value)\r
173         {\r
174                 try{\r
175                         var _t=this;\r
176                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
177                         _t._lc=CLASS.frequency;\r
178                         MI.assertInt(i_value);\r
179                         return _t._mcu.rpc(_t.RPC_NS+":frequency",_t._oid+","+i_value,\r
180                         function(j){\r
181                                 if(_t._event.onFrequency){_t._event.onFrequency();}\r
182                                 if(_t._gen){_t._gen.next();}\r
183                                  _t._lc=null;\r
184                         });\r
185                 }catch(e){\r
186                         throw new MI.MiMicException(e);\r
187                 }\r
188         },      \r
189         /**\r
190          * ピンに値を出力します。\r
191          * 関数の完了時にonFrequencyイベントが発生します。\r
192          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
193          * @name mbedJS.SPI#format\r
194          * @function\r
195          * @param {int} i_bits\r
196          * @param {int} i_mode\r
197          * 省略可能です。省略時は0になります。\r
198          * @return {int}\r
199          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
200          */\r
201         format:function SPI_format(i_bits,i_mode)\r
202         {\r
203                 try{\r
204                         var _t=this;\r
205                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
206                         _t._lc=CLASS.format;\r
207                         var mode=i_mode?i_mode:0;\r
208                         MI.assertInt([i_bits,mode]);\r
209                         return _t._mcu.rpc(_t.RPC_NS+":format",_t._oid+","+i_bits+","+mode,\r
210                         function(j){\r
211                                 if(_t._event.onFormat){_t._event.onFormat();}\r
212                                 if(_t._gen){_t._gen.next();}\r
213                                  _t._lc=null;\r
214                         });\r
215                 }catch(e){\r
216                         throw new MI.MiMicException(e);\r
217                 }\r
218         }\r
219 }\r
220 NS.SPI=CLASS;\r
221 }());