OSDN Git Service

2.0.2
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / MiMicCore.js
1 /**\r
2  * @fileOverview 低レベルAPIを定義する。低レベルAPIは、MiMicRemoteMcuをインストールしたMCUとの通信クラスを提供する。\r
3  */\r
4 \r
5 /**\r
6  * MiMicネームスペース\r
7  * @namespace\r
8  */\r
9 var MiMicJS={};\r
10 (function(){\r
11         var NS=MiMicJS;\r
12         /**\r
13          * MiMicJsAPIのバージョン文字列。\r
14          * @name MiMicJS#VERSION\r
15          */\r
16         NS.VERSION="MiMicJsAPI/2.0.2";\r
17         /**\r
18          * 配列要素、又は値がすべてInt値でない場合に例外を起こします。\r
19          * @name MiMicJS.assertInt\r
20          * @function\r
21          * @param {[array]} v\r
22          * テストする配列\r
23          */\r
24         NS.assertInt=function assertInt(v){\r
25                 if(!NS.isArray(v)){\r
26                         if(!NS.isInt(v)){throw new NS.MiMicException();}\r
27                 }\r
28                 for(var i=0;i<v.length;i++){\r
29                         if(NS.isInt(v[i])){\r
30                                 continue;\r
31                         }\r
32                         throw new NS.MiMicException('"'+v[i]+'" is not integer.');\r
33                 }\r
34         }\r
35         /**\r
36          * 配列要素、、又は値がすべて数値でない場合に例外を起こします。\r
37          * @name MiMicJS.assertNumber\r
38          * @function\r
39          * @param {[array]} v\r
40          * テストする配列\r
41          */\r
42         NS.assertNumber=function assertNumber(v){\r
43                 if(!NS.isArray(v)){\r
44                         if(!NS.isNumber(v)){    throw new NS.MiMicException();}\r
45                 }else{\r
46                         for(var i=0;i<v.length;i++){\r
47                                 if(NS.isNumber(v[i])){\r
48                                         continue;\r
49                                 }\r
50                                 throw new NS.MiMicException('"'+v[i]+'" is not number.');\r
51                         }\r
52                 }\r
53         };\r
54         /**\r
55          * @private\r
56          */\r
57         NS.isUndefined=function(v,def){\r
58                 if(arguments.length==1){return v === void 0;}\r
59                 return (v === void 0)?def:v;\r
60         };\r
61         /**\r
62          * 数値であるかを確認します。\r
63          * @private\r
64          */\r
65         NS.isNumber=function isNumber(o)\r
66         {\r
67                 return (typeof o=='number');\r
68         };\r
69         /**\r
70          * 整数であるかを確認します。\r
71          * @private\r
72          */\r
73         NS.isInt=function isInt(o)\r
74         {\r
75                 return (typeof o=='number') && (o-Math.round(o)==0);\r
76         };\r
77 \r
78         /**\r
79          * オブジェクトがジェネレータクラスであるかを返します。\r
80          * @private\r
81          */\r
82         NS.isGenerator=function isGenerator(o)\r
83         {\r
84                 if(!o){return false;}\r
85                 return o.toString().indexOf('Generator')!=-1;\r
86         };\r
87         /**\r
88          * オブジェクトが関数であるかを返します。\r
89          * @private\r
90          */\r
91         NS.isFunction=function isFunction(o){\r
92                 return (typeof o == 'function');\r
93         }\r
94         /**\r
95          * @private\r
96          * 現在の時刻を返します。\r
97          */\r
98         NS.getNow=function getNow(){\r
99                 return (new Date()).getTime();\r
100         };\r
101         /**\r
102          * @private\r
103          * aが配列であるかを返します。\r
104          */\r
105         NS.isArray=function isArray(a){\r
106                 return a instanceof Array;\r
107         };\r
108         /**\r
109          * @private\r
110          * aが配列であるかを返します。\r
111          */\r
112         NS.isHashArray=function isHashArray(a){\r
113                 return (!(a instanceof Array)) && (typeof a == "object");\r
114         };      \r
115         /**\r
116          * 連想配列をシャローコピーして複製します。\r
117          * @private\r
118          */     \r
119         NS.cloneAssoc=function cloneAssoc(a)\r
120         {\r
121                 var r={};\r
122                 for(var i in a){\r
123                         r[i]=a[i];\r
124                 }\r
125                 return r;\r
126         };\r
127         /**\r
128          * @private\r
129          * 桁数を指定して、int値を16進数に変換します。\r
130          * @param {int} i_val\r
131          * 変換する値\r
132          * @param {int} i_digit\r
133          * 桁数\r
134          * @return {string}\r
135          * 文字列形式の値\r
136          */\r
137         NS.hexout=function hexout(i_val,i_digit)\r
138         {\r
139                 var dt=["","0","00","000","0000","00000","000000","0000000"];\r
140                 var s=(i_val>>>0).toString(16).toLowerCase();\r
141                 if(s.length>i_digit){\r
142                         //マイナスだともれなくエラー\r
143                         throw new NS.MiMicException(EE.NG);\r
144                 }\r
145                 var l=i_digit-s.length;\r
146                 return dt[l]+s;\r
147         };\r
148         /**\r
149          * @private\r
150          * 連想配列を文字列にして返します。\r
151          */\r
152         NS.assocToStr=function assocToStr(a)\r
153         {\r
154                 var s="";\r
155                 for(k in a){s+=k+":"+a[k]+",";}\r
156                 return s;\r
157         };\r
158         /**\r
159          * @private\r
160          * 32bit値のエンディアンを交換します。\r
161          * @param v\r
162          * 交換する値\r
163          * @return\r
164          * 交換後の値\r
165          */\r
166         NS.bswap32=function bswap32(v)\r
167         {\r
168                 return ((v<<24)&0xff000000)|((v<<8)&0xff0000)|((v>>8)&0xff00)|((v>>24)&0xff);\r
169         };\r
170         /**\r
171          * @private\r
172          * バイナリ文字列をバイト値として配列に変換します。\r
173          * @param v\r
174          * 数値配列\r
175          */\r
176         NS.bstr2byteArray=function bstr2byteArray(v)\r
177         {\r
178                 var r=new Array();\r
179                 if(v.length%2!=0){\r
180                         throw new NS.MiMicException();                  \r
181                 }\r
182                 for(var i=0;i<v.length;i+=2){\r
183                         r.push(parseInt(v.substr(i,2),16));\r
184                 }\r
185                 return r;\r
186         };\r
187         /**\r
188          * @private\r
189          * バイナリ文字列を32bitUInt数値配列に変換します。\r
190          * Uint値はLittleEndianとして解釈します。\r
191          * @param {int[]} v\r
192          * 数値配列\r
193          */\r
194         NS.bstr2uintArray=function bstr2uintArray(v)\r
195         {\r
196                 var r=new Array();\r
197                 if(v.length%8!=0){\r
198                         throw new NS.MiMicException();                  \r
199                 }\r
200                 for(var i=0;i<v.length;i+=8){\r
201                         r.push(NS.bswap32(parseInt(v.substr(i,8),16)));\r
202                 }\r
203                 return r;\r
204         };\r
205         /**\r
206          * ByteArrayをBinarayStringに変換します。\r
207          * @name MiMicJS.byteArray2bstr\r
208          * @function\r
209          * @param v\r
210          * @return {String}\r
211          */\r
212         NS.byteArray2bstr=function byteArray2bstr(v)\r
213         {\r
214                 var s=NS.isArray(v)?v:[v];\r
215                 var r="";\r
216                 for(var i=0;i<s.length;i++){\r
217                         r+=NS.hexout(s[i],2,16);\r
218                 }\r
219                 return r;\r
220         };\r
221         /**\r
222          * UInt32ArrayをBinarayStringに変換します。\r
223          * 出力はLittleEndianの配列です。\r
224          * @name MiMicJS.uintArray2bstr\r
225          * @function\r
226          * @param v\r
227          * UInt32の配列\r
228          * @return {String}\r
229          */     \r
230         NS.uintArray2bstr=function uintArray2bstr(v)\r
231         {\r
232                 var s=NS.isArray(v)?v:[v];\r
233                 var r="";\r
234                 for(var i=0;i<s.length;i++){\r
235                         r+=NS.hexout(NS.bswap32(s[i]),8,16);\r
236                 }\r
237                 return r;\r
238         };\r
239         \r
240         /**\r
241          * 連想配列の内容をルートオブジェクト直下に展開します。\r
242          * この関数は名前空間を汚染します。十分に注意して使用してください。\r
243          * @name MiMicJS.using\r
244          * @function\r
245          * @param {HashMap} v\r
246          * 展開する連想配列\r
247          * @example\r
248          * MiMicJS.using(mbedJS);\r
249          * MiMicJS.using(mbedJS.PinName);\r
250          */\r
251         NS.using=function using(v)\r
252         {\r
253                 for (var key in v) {\r
254                         window[key]=v[key];\r
255                 }\r
256         }\r
257         /**\r
258          * MiMicSDK向けの内部関数です。\r
259          * 末尾引数が関数の場合にはその関数を、異なる場合はi_cbを返却します。\r
260          * @private\r
261          * @param i_arg\r
262          * 引数配列を指定します。\r
263          * @param i_default_cb\r
264          * 引数配列に関数がなかった場合に返す値を指定します。\r
265          */\r
266         NS._getCb=function _getCb(i_arg,i_default_cb)\r
267         {\r
268                 if(i_arg.length==0){\r
269                         return i_default_cb;\r
270                 }\r
271                 return NS.isFunction(i_arg[i_arg.length-1])?i_arg[i_arg.length-1]:i_default_cb;\r
272         }\r
273         /**\r
274          * MiMicSDK向けの関数です。\r
275          * 末尾の拡張変数を取り除いたarguments引数の数を返します。\r
276          * @private\r
277          */\r
278         NS._getBaseArgsLen=function _getBaseArgsLen(i_arg)\r
279         {\r
280                 if(i_arg.length==0 || (!NS.isFunction(i_arg[i_arg.length-1]))){\r
281                         return i_arg.length;\r
282                 }\r
283                 return i_arg.length==1?0:i_arg.length-1;\r
284         }\r
285         \r
286         /**\r
287          * MiMicSDK向けの関数です。\r
288          * インスタンスがyieldコール可能かをチェックし、可能ならコール関数を記録します。\r
289          * 関数は、インスタンスの_gen,_lcをチェックして、yieldが不可能な場合に例外を発生します。\r
290          * _assertYield.call(this)でコールして下さい。\r
291          * @private\r
292          */\r
293         NS._assertYield=function _assertYield()\r
294         {\r
295                 if(this._gen && this._lc){\r
296                         throw new NS.MiMicException(NS.Error.NG_YIELD_NOT_COMPLETED);\r
297                 }\r
298         }\r
299         /**\r
300          * MiMicSDK向けの関数です。コンストラクタでイベントハンドラをセットアップする定型処理です。\r
301          * i_handlerにセットされたオブジェクトに従って_gen,_eventメンバをセットします。\r
302          * _initHandler.call(this,i_handler)でコールして下さい。\r
303          * @private\r
304          */\r
305         NS._initHandler=function _initHandler(i_handler)\r
306         {\r
307                 if(NS.isGenerator(i_handler)){\r
308                         this._gen=i_handler;\r
309                 }else if(NS.isFunction(i_handler)){\r
310                         return i_handler;\r
311                 }else if(i_handler){\r
312                         this._event=i_handler;\r
313                         return i_handler.onNew;\r
314                 }\r
315                 return null;\r
316         }\r
317         \r
318         \r
319 }());\r
320         \r
321 (function(){\r
322         var NS=MiMicJS;\r
323         \r
324         /**\r
325          * MiMicExceptionが使用するエラーコードと、その判定関数を定義する。\r
326          * エラーコードは、以下の形式の配列オブジェクトで表現する。\r
327          * <pre>\r
328          * [code:int,message:string]\r
329          * </pre>\r
330          * \r
331          * codeは31ビットのエラーコードである。ビットフィールドの意味は以下の通りである。\r
332          * <table>\r
333          * <tr><th>bit</th><th>name</th><th>discription</th></tr>\r
334          * <tr><td>30</td><td>ErrorBit</td><td>Error:1,OK:0</td></tr>\r
335          * <tr><td>29-24</td><td>Reserved</td><td>-</td></tr>\r
336          * <tr><td>23-16</td><td>ModuleID</td><td>0x00:unknown<br/>0x39:MiMic<br/>0xF0-0xFF: user define<br/>Other:Reserved<br/></td></tr>\r
337          * <tr><td>15-8</td><td>ClassID</td><td>0x00:unknown</td></tr>\r
338          * <tr><td>7-0</td><td>ErrorID</td><td></td></tr>\r
339          * </table>\r
340          * @namespace\r
341          * @name MiMicJS.Error\r
342          * @example\r
343          * throw new MiMicException(MiMicError.NG);\r
344          */\r
345         NS.Error=\r
346         {\r
347                 /** 成功を示します。\r
348                  * @constant\r
349                  * @name MiMicJS.Error.OK\r
350                  */\r
351                 OK:[0x00000000,"OK"],\r
352                 /** 詳細情報の無いエラーです。\r
353                  * @constant\r
354                  * @name MiMicJS.Error.NG\r
355                  */     \r
356                 NG:[0x40000000,"NG"],\r
357                 /** Generatorを用いたコードで、前回のyieldが終了していないことを示します。\r
358                  * @constant\r
359                  * @name MiMicJS.Error.NG_YIELD_NOT_COMPLETED\r
360                  */\r
361                 NG_YIELD_NOT_COMPLETED:[0x40001001,"The previous function has not been completed."],\r
362                 /** 関数の呼び出し順序が正しくないことを示します。\r
363                  * @constant\r
364                  * @name MiMicJS.Error.NG_ILLEGAL_CALL\r
365                  */\r
366                 NG_ILLEGAL_CALL:[0x40001002,"Illegal procedure call."],\r
367                 /** 引数型の不一致を検出したことを示します。\r
368                  * @constant\r
369                  * @name MiMicJS.Error.NG_INVALID_ARG\r
370                  */\r
371                 NG_INVALID_ARG:[0x40001003,"Invalid arguments."],\r
372                 /**\r
373                  * エラーコードがOKか調べる。\r
374                  * @function\r
375                  * @name MiMicJS.Error.isOK\r
376                  * @param {Object as [MiMicErrorCode]} v\r
377                  * 評価するオブジェクト\r
378                  * @return {Boolean}\r
379                  * エラーコードでなければ、trueを返す。\r
380                  * @example\r
381                  * MiMicError.isOK(MiMicError.OK);//true\r
382                  */\r
383                 isOK:function(v){\r
384                         return (0x40000000 & v)==0x00000000;\r
385                 }\r
386         };\r
387         \r
388 }());\r
389 \r
390 (function(){\r
391         var NS=MiMicJS; \r
392         /**\r
393          * 引数が1個のパターン。\r
394          * @name MiMicJS.MiMicException.2\r
395          * @function\r
396          * @param {object} e\r
397          * eのクラスにより、動作が異なる。\r
398          * <ul>\r
399          * <li>{string} - MiMicException(Error.NG,e)と等価である。</li>\r
400          * <li>{object as [MiMicErrorCode]} - エラーコードを指定して例外を生成する。エラーコードについては、MiMicJs.Errorを参照</li>\r
401          * <li>{object} - MiMicException(MiMicError.NG,e.toString())と等価である。objectを文字列化して例外を生成する。</li>\r
402          * <li>{MiMicException} - codeとmessageを継承して例外を生成する。コールスタックを生成するときは、このパターンを使うこと。</li>\r
403          * </ul>\r
404          * @example\r
405          * throw new MiMicException(MiMicError.NG);\r
406          * throw new MiMicException("Error");\r
407          * try{\r
408          *       throw new MiMicException("Error");\r
409          * }catch(e){\r
410          *       throw new MiMicException(e);\r
411          * }\r
412          */\r
413         /**\r
414          * MiMic javascript APIが生成する例外クラスのコンストラクタである。関数ごとにMiMicExceptionを使ったtry-catchを導入することにより、例外発生時にスタックトレースメッセージを得ることが出来る。\r
415          * スタックトレースは改行で連結された文字列である。messageプロパティに格納される。alert関数で表示することで、効率的なデバックが可能である。\r
416          * 引数の違いにより、数種類の呼び出し方がある。\r
417          * @constructor\r
418          * @name MiMicJS.MiMicException\r
419          * @param ...\r
420          * 詳細は、MiMicException.nを参照。\r
421          */\r
422         NS.MiMicException=function MiMicException(/*...*/)\r
423         {\r
424                 var pfx;\r
425                 if(typeof arguments.callee.caller=="function"){\r
426                          if(arguments.callee.caller.name.toString().length>0){\r
427                                 pfx="function '"+arguments.callee.caller.name+'.';\r
428                          }else{\r
429                                 var s=arguments.callee.caller.toString();\r
430                                 pfx="closure '"+s.substring(0,s.indexOf("{"))+"...'";\r
431                          }\r
432                 }else{\r
433                         pfx="root document";\r
434                 }\r
435                 var sfx="";\r
436                 switch(arguments.length){\r
437                 case 0:\r
438                         //とりあえずexceptiion\r
439                         this.code=NS.Error.NG[0];\r
440                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+NS.Error.NG[1];\r
441                         return;\r
442                 case 1:\r
443                         var v=arguments[0];\r
444                         if(v instanceof NS.MiMicException){\r
445                                 //exception継承\r
446                                 this.code=v.code;\r
447                                 sfx="  \nfrom "+v.message;\r
448                         }else if(typeof v=="object" && v.length==2){\r
449                                 //Errorコードテーブル\r
450                                 this.code=v[0];\r
451                                 sfx=v[1];\r
452                         }else{\r
453                                 //文字列やオブジェクト\r
454                                 this.code=NS.Error.NG[0];\r
455                                 sfx=NS.Error.NG[1]+" "+(((typeof v)!='undefined')?v.toString():"v==undefined");\r
456                         }\r
457                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+sfx;\r
458                         return;\r
459                 default:\r
460                         break;\r
461                 }\r
462                 throw new NS.MiMicException("Invalid MiMicException argument.");\r
463         }\r
464 \r
465         NS.MiMicException.prototype=\r
466         {\r
467                 \r
468                 /**\r
469                  * MiMicErrorCode形式のエラーコードを保持する。\r
470                  * @field {object as MiMicErrorCode}\r
471                  * @name MiMicJS.MiMicException#code\r
472                  */\r
473                 code:null,\r
474                 /**\r
475                  * エラーメッセージを保持する。この値は、改行区切りのコールスタックである。\r
476                  * @field {string}\r
477                  * @name MiMicJS.MiMicException#message\r
478                  */\r
479                 message:"",\r
480                 /**\r
481                  * messageフィールドをalertで表示する。\r
482                  * @name MiMicJS.MiMicException#alert\r
483                  * @function\r
484                  * @example\r
485                  * try{\r
486                  *      throw new MiMicException();\r
487                  * }catch(e){\r
488                  *      e.alert();\r
489                  * }     \r
490                  */\r
491                 alert:function(){\r
492                         alert(this.message);\r
493                 },\r
494                 /**\r
495                  * toStringを上書きする。オブジェクトを文字列化する。\r
496                  * 文字列は例外のコールスタックであり、デバックで役立つ。\r
497                  * @function\r
498                  * @name MiMicJS.MiMicException#toString\r
499                  * @return {string}\r
500                  * 現在のオブジェクトの状態(例外のコールスタック)\r
501                  * @example\r
502                  * try{\r
503                  *      throw new MiMicException();\r
504                  * }catch(e){\r
505                  *      alert(e.toString());\r
506                  * }     \r
507                  */\r
508                 toString:function()\r
509                 {\r
510                         return "MiMicException:"+this.message;\r
511                 }       \r
512         }\r
513 }());\r
514 \r
515 (function(){\r
516         /**@private */\r
517         var NS=MiMicJS;\r
518         /**\r
519          * MiMicRPCのクライアントクラスです。\r
520          * 通信APIを提供します。\r
521          * @name MiMicJS.Rpc\r
522          * @constructor\r
523          * @param {HashMap} i_event\r
524          * 非同期イベントハンドラの連想配列です。登録できるメンバは以下の通りです。\r
525          * <ul>\r
526          * <li>onOpen:function() -\r
527          * open関数のコールバック関数です。\r
528          * <li>onClose:function() -\r
529          * close関数のコールバック関数です。\r
530          * <li>onError:function() -\r
531          * 何らかの異常で通信を継続できないエラーが発生し、コネクションを維持できない時に発生します。\r
532          * このイベントが発生するとコネクションは閉じられます。\r
533          * </ul>\r
534          */\r
535         NS.Rpc=function Rpc(i_event)\r
536         {\r
537                 this._event=(i_event)?i_event:null;\r
538         }\r
539         NS.Rpc.prototype=\r
540         {\r
541                 _event:null,\r
542                 /**\r
543                  * @private \r
544                  * Websocketインスタンスです。\r
545                  */\r
546                 _ws:null,\r
547                 /**\r
548                  * @private\r
549                  * [READ ONLY]\r
550                  * RPCの平均RTT[ms]です。\r
551                  * @name MiMicJs.Rpc#RTT\r
552                  */\r
553                 rtt:0,\r
554                 /** メソッドIDカウンタ。sendJsonを実行する毎にインクリメントされます。*/\r
555                 _method_id:0,\r
556                 /**\r
557                  * RPCコネクションを開きます。\r
558                  * 関数が終了するとonOpenイベントをコールバックします。\r
559                  * @name MiMicJS.Rpc#open\r
560                  * @function\r
561                  * @param i_url\r
562                  * ws://から始まるWebsocketサービスURLを指定します。\r
563                  */\r
564                 open:function open(i_url)\r
565                 {\r
566                         var _t=this;\r
567                         if(this._ws){\r
568                                 throw new MiMicException();\r
569                         }\r
570                         \r
571                         var q=new Array();\r
572                         var ev=this._event;\r
573                         var ws=new WebSocket(i_url);\r
574                         ws.onopen = function(){\r
575                                 if(ev.onOpen){ev.onOpen();}\r
576                         }\r
577                         ws.onclose = function(){\r
578                                 if(ev.onClose){ev.onClose();}\r
579                         };\r
580                         ws.error = function(){\r
581                                 _t.shutdown();\r
582                                 if(ev.onClose){ev.onError();}\r
583                         };\r
584                         var rx="";\r
585                         var rxst=0;\r
586                         var _t=this;\r
587                         ws.onmessage = function (e)\r
588                         {\r
589                                 //ストリームからJSONを抽出。"のエスケープには対応しない。\r
590                                 for(var i=0;i<e.data.length;i++){\r
591                                         var t=e.data[i];\r
592                                         switch(rxst){\r
593                                         case 2:\r
594                                                 if(t!='"'){\r
595                                                         rxst=1;\r
596                                                 }\r
597                                                 break;\r
598                                         case 0:\r
599                                                 if(t!='{'){\r
600                                                         continue;\r
601                                                 }\r
602                                                 rx='({';\r
603                                                 rxst=1;\r
604                                                 continue;\r
605                                         case 1:\r
606                                                 switch(t){\r
607                                                 case '"':\r
608                                                         rxst=2;\r
609                                                         break;\r
610                                                 case '}':\r
611                                                         rx+='})';\r
612                                                         rxst=0;\r
613                                                         {\r
614 //                                                              log(rx);//Debug\r
615                                                                 //JSONがたぶん確定\r
616                                                                 var j=eval(rx);\r
617                                                                 for(var i2=q.length-1;i2>=0;i2--){\r
618                                                                         if(q[i2][0]==j.id){\r
619                                                                                 //id一致→コールバック\r
620                                                                                 var qi=q[i2];\r
621                                                                                 q.splice(i2, 1);\r
622                                                                                 //コールバック必要?\r
623                                                                                 if(qi[1]){qi[1](j);}\r
624                                                                                 break;\r
625                                                                         }\r
626                                                                 }\r
627                                                         }\r
628                                                         continue;\r
629                                                 }\r
630                                         }\r
631                                         rx+=t;\r
632                                 }\r
633                         }\r
634                         this._method_id=0;\r
635                         this._q=q;\r
636                         this._ws=ws;\r
637                 },\r
638                 /**\r
639                  * 接続中のRPCコネクションを閉じます。\r
640                  * 関数が終了するとonCloseイベントをコールバックします。\r
641                  * @name MiMicJS.Rpc#close\r
642                  * @function\r
643                  */\r
644                 close:function close()\r
645                 {\r
646                         if(this._ws && this._ws.readyState==1){\r
647                                 this._ws.close();\r
648                                 this._ws=null;\r
649                         }\r
650                 },\r
651                 /**\r
652                  * RPC回線を確実に閉じます。\r
653                  * この関数を実行すると、すべてのコールバックイベントはキャンセルされます。\r
654                  * @name MiMicJS.Rpc#shutdown\r
655                  * @function\r
656                  */\r
657                 shutdown:function shutdown()\r
658                 {\r
659                         var _t=this;\r
660                         if(_t._ws){\r
661                                 _t._ws.onopen=function(){_t._ws.close();};\r
662                                 _t._ws.onmessage=function(){_t._ws.close();};\r
663                                 _t._ws.onclose=function(){_t._ws=null;};\r
664                                 _t._ws.onerror=function(){_t._ws=null;};\r
665                         }\r
666                 },\r
667                 /**\r
668                  * 非同期でJSON RPCメソッドを送信します。\r
669                  * @name MiMicJS.Rpc#sendMethod\r
670                  * @function\r
671                  * @param {string} i_method\r
672                  * RPCメソッドの名前です。\r
673                  * @param {string} i_params\r
674                  * カンマ区切りのJSONスタイルの文字列です。この文字列は[....]に埋め込まれます。エスケープ文字列は使用できません。\r
675                  * @param {function(json)}i_callback\r
676                  * Resultを受け取るコールバック関数です。jsonにはResult JSONをパースしたオブジェクトが入ります。\r
677                  * @return {int}\r
678                  * メソッドIDを返します。\r
679                  */\r
680                 sendMethod:function callJsonRpc(i_method,i_params,i_callback)\r
681                 {\r
682                         var v="{\"jsonrpc\":\"2.0\",\"method\":\""+i_method+"\",\"params\":["+i_params+"],\"id\":"+this._method_id+"}";\r
683 //                      log(v);//Debug\r
684                         this._ws.send(v);\r
685                         this._q.push([this._method_id,i_callback]);//キューに記録\r
686                         this._method_id=(this._method_id+1)&0x0fffffff;//IDインクリメント\r
687                         return this._method_id;\r
688                 }\r
689         }\r
690 \r
691 }());