OSDN Git Service

0f6e0fb11a99c3ca9673d841e2f1e210bd794409
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.Serial.js
1 /**\r
2  * @fileOverview AnalogInクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * Serialクラスです。\r
10  * <a href="https://mbed.org/handbook/Serial">mbed::Serial</a>と同等の機能を持ちます。\r
11  * @constructor\r
12  * @name mbedJS.Serial\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {[PinName,PinName]} i_params\r
16  * UARTを構成する2本のピンを指定します。tx,rxの順で設定します。\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()} onFormat -\r
26  * format関数が完了したときに呼び出されます。\r
27  * </li>\r
28  * <li>{function(v)} onReadable -\r
29  * read関数が完了したときに呼び出されます。\r
30  *      <ul>\r
31  *              <li>{boolean} v - 読出しが可能化の真偽値です。</li>\r
32  *      </ul>\r
33  * </li>\r
34  * <li>{function(v)} onWriteable -\r
35  * write関数が完了したときに呼び出されます。\r
36  *      <ul>\r
37  *              <li>{boolean} v - 書き込みが可能化の真偽値です。</li>\r
38  *      </ul>\r
39  * </li>\r
40  * <li>{function()} onSend_break -\r
41  * send_break関数が完了したときに呼び出されます。\r
42  * </li>\r
43  * <li>{function(v)} onPutc -\r
44  * putc関数が完了したときに呼び出されます。\r
45  *      <ul>\r
46  *              <li>{int} v - 謎の戻り値です。</li>\r
47  *      </ul>\r
48  * </li>\r
49  * <li>{function(v)} onPuts -\r
50  * puts関数が完了したときに呼び出されます。\r
51  *      <ul>\r
52  *              <li>{int} v - 謎の戻り値です。</li>\r
53  *      </ul>\r
54  * </li>\r
55  * <li>{function(v)} onGetc -\r
56  * getc関数が完了したときに呼び出されます。\r
57  *      <ul>\r
58  *              <li>{int} v - 読みだした1バイトの値です。</li>\r
59  *      </ul>\r
60  * </li>\r
61  * <li>{function(v)} onGets -\r
62  * gets関数が完了したときに呼び出されます。\r
63  *      <ul>\r
64  *              <li>{int} v - 読みだした文字列です。</li>\r
65  *      </ul>\r
66  * </li>\r
67  * <li>{function()} onBaud -\r
68  * baud関数が完了したときに呼び出されます。\r
69  * </li>\r
70  * </ul>\r
71  * <p>\r
72  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
73  * <p>\r
74  * @return {mbedJS.Serial}\r
75  * @example //Callback\r
76  * var mcu=new mbedJS.Mcu("192.168.128.39",\r
77  * {\r
78  *   onNew:function(){\r
79  *     var uart=new mbedJS.Serial(mcu,[mbedJS.PinName.p9,mbedJS.PinName.p10],{\r
80  *     onNew:function(){\r
81  *       uart.baud(115200);\r
82  *     },\r
83  *     onBaud:function()\r
84  *     {\r
85  *       uart.send_break();\r
86  *     },\r
87  *     onSend_break:function(){\r
88  *       uart.format(8,uart.Parity.None,1);\r
89  *     },\r
90  *     onFormat:function(){\r
91  *       uart.readable();\r
92  *     },\r
93  *     onReadable:function(v){\r
94  *       uart.writeable();\r
95  *     },\r
96  *     onWriteable:function(v){\r
97  *       uart.putc(32);\r
98  *     },\r
99  *     onPutc:function(v){\r
100  *       uart.getc();\r
101  *     },\r
102  *     onGetc:function(v){\r
103  *       uart.puts("1234");\r
104  *     },\r
105  *     onPuts:function(v){\r
106  *       uart.gets(5);\r
107  *     },\r
108  *     onGets:function(v){\r
109  *       mcu.close();\r
110  *     }\r
111  *     });\r
112  *   },\r
113  *   onClose:function(){\r
114  *   },\r
115  *   onError:function(){\r
116  *     alert("Error");\r
117  *   }\r
118  * });\r
119  * @example //Generator\r
120  * var g=function*(){\r
121  * try{\r
122  *   var v;\r
123  *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
124  *   yield mcu.waitForNew();\r
125  *   var uart=new mbedJS.Serial(mcu,[mbedJS.PinName.p9,mbedJS.PinName.p10],g);\r
126  *   yield uart.waitForNew();\r
127  *   yield uart.baud(115200);\r
128  *   yield uart.send_break();\r
129  *   yield uart.format(8,uart.Parity.None,1);\r
130  *   v=yield uart.readable();\r
131  *   v=yield uart.writeable();\r
132  *   v=yield uart.putc(32);\r
133  *   v=yield uart.getc();\r
134  *   v=yield uart.puts("1234");\r
135  *   v=yield uart.gets(5);\r
136  *   yield mcu.close();\r
137  * }catch(e){\r
138  *   mcu.shutdown();\r
139  *   alert(e);\r
140  *   throw e;\r
141  * }\r
142  * }();\r
143  * g.next();\r
144  */\r
145 var CLASS=function Serial(i_mcu,i_params,i_handler)\r
146 {\r
147         try{\r
148                 var _t=this;\r
149                 _t._mcu=i_mcu;\r
150                 _t._lc=CLASS;\r
151                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
152                 else if(i_handler){_t._event=i_handler}\r
153                 function cb(j)\r
154                 {\r
155                         _t._oid=j.result[0];\r
156                         if(_t._event.onNew){_t._event.onNew();}\r
157                         if(_t._gen){_t._gen.next(_t);}\r
158                         _t._lc=null;\r
159                 }\r
160                 MI.assertInt(i_params);         \r
161                 _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1],cb);\r
162         }catch(e){\r
163                 throw new MI.MiMicException(e);\r
164         }       \r
165 }\r
166 CLASS.prototype=\r
167 {\r
168         /** @private */\r
169         RPC_NS:"mbedJS:Serial",\r
170         /**\r
171          * mbedJS.Serial#format関数に指定する値の種類です。\r
172          * None,Odd,Even,Forced1,Forced0があります。\r
173          * @name mbedJS.Serial#Parity\r
174          * @field\r
175          */\r
176     Parity:{\r
177         None:0,Odd:1,Even:2,Forced1:3,Forced0:4\r
178     },\r
179         /** @private 最後にコールしたAPIです。*/\r
180         _lc:null,\r
181         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
182         _gen:null,\r
183         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
184         _event:{},\r
185         /** @private リモートインスタンスのオブジェクトIDです。*/\r
186         _oid:null,\r
187         /**\r
188          * Generatorモードのときに使用する関数です。\r
189          * Generatorモードの時は、yieldと併用してnew AnalogIn()の完了を待ちます。\r
190          * @name mbedJS.Serial#waitForNew\r
191          * @function\r
192          */\r
193         waitForNew:function Serial_waitForNew()\r
194         {\r
195                 try{\r
196                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
197                         this._lc=CLASS.waitForNew;\r
198                 }catch(e){\r
199                         throw new MI.MiMicException(e);\r
200                 }\r
201         },\r
202         /**\r
203          * フォーマットを設定します。\r
204          * 関数の完了時にonFormatイベントが発生します。\r
205          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
206          * @name mbedJS.Serial#format\r
207          * @function\r
208          * @param {int} i_bits\r
209          * ビット数です。省略時は8です。\r
210          * @param {int} i_parity\r
211          * パリティの値です。省略時はmbedJS.Serial#Parity.Noneです。\r
212          * @param {int} i_stop_bits\r
213          * ストップビットの値です。省略時は1です。\r
214          * @return {int}\r
215          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
216          */\r
217         format:function SerialIn_format(i_bits,i_parity,i_stop_bits)\r
218         {\r
219                 try{\r
220                         var _t=this;\r
221                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
222                         _t._lc=CLASS.format;\r
223                         var p=[MI.isUndefined(i_bits,8),MI.isUndefined(i_parity,_t.Parity.None),MI.isUndefined(i_stop_bits,1)];\r
224                         MI.assertInt(p);\r
225                         return _t._mcu.rpc(_t.RPC_NS+":format",_t._oid+","+p[0]+","+p[1]+","+p[2],\r
226                         function (j)\r
227                         {\r
228                                 if(_t._event.onFormat){_t._event.onFormat();}\r
229                                 if(_t._gen){_t._gen.next();}\r
230                                  _t._lc=null;\r
231                         }\r
232                         );\r
233                 }catch(e){\r
234                         throw new MI.MiMicException(e);\r
235                 }                       \r
236         },\r
237         /**\r
238          * 読出し可能かを返します。\r
239          * 関数の完了時にonReadableイベントが発生します。\r
240          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
241          * @name mbedJS.Serial#readable\r
242          * @function\r
243          * @return {int}\r
244          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
245          * @return {boolean}\r
246          * Generatorモードの時は状態値の真偽値を返します。\r
247          */\r
248         readable:function Serial_readable()\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.readable;\r
254                         return _t._mcu.rpc(_t.RPC_NS+":readable",_t._oid,\r
255                         function (j)\r
256                         {\r
257                                 var v=j.result[0];\r
258                                 if(_t._event.onReadable){_t._event.onReadable(v);}\r
259                                 if(_t._gen){_t._gen.next(v);}\r
260                                  _t._lc=null;\r
261                         }\r
262                         );\r
263                 }catch(e){\r
264                         throw new MI.MiMicException(e);\r
265                 }                       \r
266         },\r
267         /**\r
268          * 書き込み可能かを返します。\r
269          * 関数の完了時にonWriteableイベントが発生します。\r
270          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
271          * @name mbedJS.Serial#writeable\r
272          * @function\r
273          * @return {int}\r
274          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
275          * @return {boolean}\r
276          * Generatorモードの時は状態値の真偽値を返します。\r
277          */\r
278         writeable:function Serial_writeable()\r
279         {\r
280                 try{\r
281                         var _t=this;\r
282                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
283                         _t._lc=CLASS.writeable;                 \r
284                         return _t._mcu.rpc(_t.RPC_NS+":writeable",_t._oid,\r
285                         function (j)\r
286                         {\r
287                                 var v=j.result[0]?true:false;\r
288                                 if(_t._event.onWriteable){_t._event.onWriteable(v);}\r
289                                 if(_t._gen){_t._gen.next(v);}\r
290                                  _t._lc=null;\r
291                         }\r
292                         );\r
293                 }catch(e){\r
294                         throw new MI.MiMicException(e);\r
295                 }                       \r
296         },\r
297         /**\r
298          * ブレーク信号を送信します。\r
299          * 関数の完了時にonSend_breakイベントが発生します。\r
300          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
301          * @name mbedJS.Serial#send_break\r
302          * @function\r
303          * @return {int}\r
304          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
305          */\r
306         send_break:function Serial_send_break()\r
307         {\r
308                 try{\r
309                         var _t=this;\r
310                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
311                         _t._lc=CLASS.send_break;\r
312                         return _t._mcu.rpc(_t.RPC_NS+":send_break",_t._oid,\r
313                         function (j)\r
314                         {\r
315                                 if(_t._event.onSend_break){_t._event.onSend_break();}\r
316                                 if(_t._gen){_t._gen.next();}\r
317                                  _t._lc=null;\r
318                         }\r
319                         );\r
320                 }catch(e){\r
321                         throw new MI.MiMicException(e);\r
322                 }                       \r
323         },\r
324         /**\r
325          * 1バイトの値を出力します。\r
326          * 関数の完了時にonPutcイベントが発生します。\r
327          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
328          * @name mbedJS.Serial#putc\r
329          * @function\r
330          * @return {int}\r
331          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
332          * @return {int}\r
333          * Generatorモードの時は謎の値を返します。\r
334          */\r
335         putc:function Serial_putc(i_c)\r
336         {\r
337                 try{\r
338                         var _t=this;\r
339                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
340                         _t._lc=CLASS.putc;\r
341                         MI.assertInt(i_c);\r
342                         return _t._mcu.rpc(_t.RPC_NS+":putc",_t._oid+","+i_c,\r
343                         function (j)\r
344                         {\r
345                                 var v=j.result[0];\r
346                                 if(_t._event.onPutc){_t._event.onPutc(v);}\r
347                                 if(_t._gen){_t._gen.next(v);}\r
348                                  _t._lc=null;\r
349                         }\r
350                         );\r
351                 }catch(e){\r
352                         throw new MI.MiMicException(e);\r
353                 }\r
354         },\r
355         /**\r
356          * 文字列を出力します。\r
357          * 関数の完了時にonPutsイベントが発生します。\r
358          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
359          * @name mbedJS.Serial#puts\r
360          * @function\r
361          * @return {int}\r
362          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
363          * @return {int}\r
364          * Generatorモードの時は謎の値を返します。\r
365          */\r
366         puts:function Serial_puts(i_s)\r
367         {\r
368                 try{\r
369                         var _t=this;\r
370                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
371                         _t._lc=CLASS.puts;\r
372                         return _t._mcu.rpc(_t.RPC_NS+":puts",_t._oid+",\""+i_s+"\"",\r
373                         function (j)\r
374                         {\r
375                                 var v=j.result[0];\r
376                                 if(_t._event.onPuts){_t._event.onPuts(v);}\r
377                                 if(_t._gen){_t._gen.next(v);}\r
378                                  _t._lc=null;\r
379                         }\r
380                         );\r
381                 }catch(e){\r
382                         throw new MI.MiMicException(e);\r
383                 }\r
384         },\r
385         /**\r
386          * 1バイトを読み込みます。\r
387          * 関数の完了時にonGetcイベントが発生します。\r
388          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
389          * @name mbedJS.Serial#getc\r
390          * @function\r
391          * @return {int}\r
392          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
393          * @return {int}\r
394          * Generatorモードの時は受信した数値を返します。\r
395          */\r
396         getc:function Serial_getc()\r
397         {\r
398                 try{\r
399                         var _t=this;\r
400                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
401                         _t._lc=CLASS.getc;\r
402                         return _t._mcu.rpc(_t.RPC_NS+":getc",_t._oid,\r
403                         function (j)\r
404                         {\r
405                                 var v=j.result[0];\r
406                                 if(_t._event.onGetc){_t._event.onGetc(v);}\r
407                                 if(_t._gen){_t._gen.next(v);}\r
408                                  _t._lc=null;\r
409                         }\r
410                         );\r
411                 }catch(e){\r
412                         throw new MI.MiMicException(e);\r
413                 }\r
414         },\r
415         /**\r
416          * 文字列を読み込みます。\r
417          * 関数の完了時にonGetsイベントが発生します。\r
418          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
419          * @name mbedJS.Serial#gets\r
420          * @function\r
421          * @param {int} i_len\r
422          * 受信メモリのサイズを指定します。256未満を指定してください。\r
423          * @return {int}\r
424          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
425          * @return {string}\r
426          * Generatorモードの時は受信した文字列を返します。\r
427          */\r
428         gets:function Serial_gets(i_len)\r
429         {\r
430                 try{\r
431                         var _t=this;\r
432                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
433                         _t._lc=CLASS.gets;\r
434                         MI.assertInt(i_len);                    \r
435                         return _t._mcu.rpc(_t.RPC_NS+":gets",_t._oid+","+i_len,\r
436                         function (j)\r
437                         {\r
438                                 var v=j.result[0];\r
439                                 if(_t._event.onGets){_t._event.onGets(v);}\r
440                                 if(_t._gen){_t._gen.next(v);}\r
441                                  _t._lc=null;\r
442                         }\r
443                         );\r
444                 }catch(e){\r
445                         throw new MI.MiMicException(e);\r
446                 }\r
447         },\r
448         /**\r
449          * ボーレイトを設定します。\r
450          * 関数の完了時にonBaudイベントが発生します。\r
451          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
452          * @name mbedJS.Serial#baud\r
453          * @function\r
454          * @param {int} i_baudrate\r
455          * ボーレイトの値です。\r
456          * @return {int}\r
457          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
458          */\r
459         baud:function Serial_baud(i_baudrate)\r
460         {\r
461                 try{\r
462                         var _t=this;\r
463                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
464                         _t._lc=CLASS.baud;\r
465                         MI.assertInt(i_baudrate);                       \r
466                         return _t._mcu.rpc(_t.RPC_NS+":baud",_t._oid+","+i_baudrate,\r
467                         function (j)\r
468                         {\r
469                                 if(_t._event.onBaud){_t._event.onBaud();}\r
470                                 if(_t._gen){_t._gen.next();}\r
471                                  _t._lc=null;\r
472                         }\r
473                         );\r
474                 }catch(e){\r
475                         throw new MI.MiMicException(e);\r
476                 }                       \r
477         }       \r
478 }\r
479 NS.Serial=CLASS;\r
480 }());