OSDN Git Service

index.htmlへのリダイレクト、モジュールバージョン情報の統合、プラットフォーム名表示の復帰
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / 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 MiMicLib=\r
10 {\r
11         /**\r
12          * MiMicJsAPIのバージョン文字列。\r
13          */\r
14         VERSION:"MiMicJsAPI/1.0.2",\r
15         /**\r
16          * 現在の時刻を返す\r
17          * @returns\r
18          */\r
19         getNow:function getNow(){\r
20                 return (new Date()).getTime();\r
21         },\r
22         /**\r
23          * aがundefinedであるかを真偽値で返す。\r
24          * @function\r
25          * @param {object} a\r
26          * 判定対象のオブジェクト\r
27          * @return {Boolean}\r
28          * aがundefinedであれば、trueである。\r
29          */     \r
30         isUndef:function isUndef(a){\r
31                 return typeof a==="undefined"\r
32         },\r
33         /**\r
34          * aが配列であるかを返す。\r
35          * @function\r
36          * @param {object} a\r
37          * 判定対象のオブジェクト\r
38          * @return {Boolean}\r
39          * aがarrayであれば、trueである。\r
40          */\r
41         isArray:function isArray(a){\r
42                 return a instanceof Array;\r
43         },\r
44         /**\r
45          * 連想配列をシャローコピーして複製する。\r
46          * @function\r
47          * @param {object} a\r
48          * 複製元のオブジェクトである。\r
49          * @return {object}\r
50          * 複製したオブジェクトである。\r
51          */     \r
52         cloneAssoc:function cloneAssoc(a)\r
53         {\r
54                 var r={};\r
55                 for(var i in a){\r
56                         r[i]=a[i];\r
57                 }\r
58                 return r;\r
59         },\r
60         /**\r
61          * 桁数を指定して、int値を16進数に変換する。\r
62          * @param {int} i_val\r
63          * 変換する値\r
64          * @param {int} i_digit\r
65          * 桁数\r
66          * @return {string}\r
67          * 文字列形式の値\r
68          */\r
69         hexout:function hexout(i_val,i_digit)\r
70         {\r
71                 try{\r
72                         var dt=["","0","00","000","0000","00000","000000","0000000"];\r
73                         var s=(i_val>>>0).toString(16).toLowerCase();\r
74                         if(s.length>i_digit){\r
75                                 //マイナスだともれなくエラー\r
76                                 throw new MiMicException(EE.NG);\r
77                         }\r
78                         var l=i_digit-s.length;\r
79                         return dt[l]+s;\r
80                 }catch(e){\r
81                         throw new MiMicException(e);\r
82                 }\r
83         },\r
84         assocToStr:function assocToStr(a)\r
85         {\r
86                 var s="";\r
87                 for(k in a){s+=k+":"+a[k]+",";}\r
88                 return s;\r
89         }       \r
90 }\r
91 \r
92 /**\r
93  * MiMicExceptionが使用するエラーコードと、その判定関数を定義する。\r
94  * エラーコードは、以下の形式の配列オブジェクトで表現する。\r
95  * <pre>\r
96  * [code:int,message:string]\r
97  * </pre>\r
98  * \r
99  * codeは31ビットのエラーコードである。ビットフィールドの意味は以下の通りである。\r
100  * <table>\r
101  * <tr><th>bit</th><th>name</th><th>discription</th></tr>\r
102  * <tr><td>30</td><td>ErrorBit</td><td>Error:1,OK:0</td></tr>\r
103  * <tr><td>29-24</td><td>Reserved</td><td>-</td></tr>\r
104  * <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
105  * <tr><td>15-8</td><td>ClassID</td><td>0x00:unknown</td></tr>\r
106  * <tr><td>7-0</td><td>ErrorID</td><td></td></tr>\r
107  * </table>\r
108  * @namespace\r
109  * @example\r
110  * throw new MiMicException(MiMicError.NG);\r
111  */\r
112 var MiMicError=\r
113 {\r
114         /** 成功を示すエラー値\r
115          * @constant*/  \r
116         OK:[0x00000000,"OK"],\r
117         /** 失敗を示すエラー値。不明な場所で、不明な何かが、不明なエラーを起こしたことを示す。\r
118          * @constant*/  \r
119         NG:[0x40000000,"NG"],\r
120         /**\r
121          * エラーコードがOKか調べる。\r
122          * @function\r
123          * @param {Object as [MiMicErrorCode]} v\r
124          * 評価するオブジェクト\r
125          * @return {Boolean}\r
126          * エラーコードでなければ、trueを返す。\r
127          * @example\r
128          * MiMicError.isOK(MiMicError.OK);//true\r
129          */\r
130         isOK:function(v){\r
131                 return (0x40000000 & v)==0x00000000;\r
132         },\r
133         /*\r
134          * 定数定義\r
135          */\r
136         /** @private*/\r
137         MID_MiMic:0x00390000,\r
138         /** @private*/\r
139         CAID_RemoteMCU     :0x0100,     //\r
140         /** @private*/\r
141         CAID_LPCXPresso1769:0x0200      //リモートAPI\r
142         \r
143 }\r
144 \r
145 \r
146 /**\r
147  * 引数が1個のパターン。\r
148  * @name MiMicException.2\r
149  * @function\r
150  * @param {object} e\r
151  * eのクラスにより、動作が異なる。\r
152  * <ul>\r
153  * <li>{string} - MiMicException(MiMicError.NG,e)と等価である。</li>\r
154  * <li>{object as [MiMicErrorCode]} - エラーコードを指定して例外を生成する。エラーコードについては、MiMicErrorを参照</li>\r
155  * <li>{object} - MiMicException(MiMicError.NG,e.toString())と等価である。objectを文字列化して例外を生成する。</li>\r
156  * <li>{MiMicException} - codeとmessageを継承して例外を生成する。コールスタックを生成するときは、このパターンを使うこと。</li>\r
157  * </ul>\r
158  * @example\r
159  * throw new MiMicException(MiMicError.NG);\r
160  * throw new MiMicException("Error");\r
161  * try{\r
162  *       throw new MiMicException("Error");\r
163  * }catch(e){\r
164  *       throw new MiMicException(e);\r
165  * }\r
166  */\r
167 /**\r
168  * 引数が2個のパターン。追加メッセージを含めることが出来る。\r
169  * @name MiMicException.3\r
170  * @function\r
171  * @param {object} e\r
172  * eのクラスにより、動作が異なる。\r
173  * <ul>\r
174  * <li>{MiMicErrorCode} - エラーコードを指定して例外を生成する。</li>\r
175  * <li>{MiMicException} - codeとmessageを継承して例外を生成する。コールスタックを生成するときは、このパターンを使うこと。</li>\r
176  * </ul>\r
177  * @param {string} s\r
178  * 追加するエラーメッセージ。\r
179  */\r
180 /**\r
181  * MiMic javascript APIが生成する例外クラスのコンストラクタである。関数ごとにMiMicExceptionを使ったtry-catchを導入することにより、例外発生時にスタックトレースメッセージを得ることが出来る。\r
182  * スタックトレースは改行で連結された文字列である。messageプロパティに格納される。alert関数で表示することで、効率的なデバックが可能である。\r
183  * 引数の違いにより、数種類の呼び出し方がある。\r
184  * @constructor\r
185  * @param ...\r
186  * 詳細は、MiMicException.nを参照。\r
187  */\r
188 function MiMicException(/*...*/)\r
189 {\r
190         var pfx;\r
191         if(typeof arguments.callee.caller=="function"){\r
192                  if(arguments.callee.caller.name.toString().length>0){\r
193                         pfx="function '"+arguments.callee.caller.name+'.';\r
194                  }else{\r
195                         var s=arguments.callee.caller.toString();\r
196                         pfx="closure '"+s.substring(0,s.indexOf("{"))+"...'";\r
197                  }\r
198         }else{\r
199                 pfx="root document";\r
200         }\r
201         var sfx="";\r
202         switch(arguments.length){\r
203         case 0:\r
204                 //とりあえずexceptiion\r
205                 this.code=MiMicError.NG[0];\r
206                 this.message=pfx+" code(0x"+this.code.toString(16)+")"+MiMicError.NG[1];\r
207                 return;\r
208         case 1:\r
209                 var v=arguments[0];\r
210                 if(v instanceof MiMicException){\r
211                         //exception継承\r
212                         this.code=v.code;\r
213                         sfx="  \nfrom "+v.message;\r
214                 }else if(typeof v=="object" && v.length==2){\r
215                         //Errorコードテーブル\r
216                         this.code=v[0];\r
217                         sfx=v[1];\r
218                 }else{\r
219                         //文字列やオブジェクト\r
220                         this.code=MiMicError.NG[0];\r
221                         sfx=MiMicError.NG[1]+" "+(((typeof v)!='undefined')?v.toString():"v==undefined");\r
222                 }\r
223                 this.message=pfx+" code(0x"+this.code.toString(16)+")"+sfx;\r
224                 return;\r
225         case 2:\r
226                 var v=arguments[0];\r
227                 if(v instanceof MiMicException){\r
228                         //Exception+メッセージ\r
229                         this.code=v.code;\r
230                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+"\nfrom "+v.message+":"+arguments[1];\r
231                         return;\r
232                 }else if(typeof v!="string" && v.length==2){\r
233                         //Errorコードテーブル+メッセージ\r
234                         this.code=v[0];\r
235                         this.message=pfx+" code(0x"+this.code.toString(16)+")"+v[1]+":"+arguments[1];\r
236                 }else{\r
237                         break;\r
238                 }\r
239                 return;\r
240         default:\r
241                 break;\r
242         }\r
243         throw new MiMicException("Invalid MiMicException argument.");\r
244 }\r
245 \r
246 MiMicException.prototype={\r
247         /**\r
248          * MiMicErrorCode形式のエラーコードを保持する。\r
249          * @field {object as MiMicErrorCode}\r
250          */\r
251         code:MiMicError.OK,\r
252         /**\r
253          * エラーメッセージを保持する。この値は、改行区切りのコールスタックである。\r
254          * @field {string}\r
255          */\r
256         message:"",\r
257         /**\r
258          * messageフィールドをalertで表示する。\r
259          * @function\r
260          * @example\r
261          * try{\r
262          *      throw new MiMicException();\r
263          * }catch(e){\r
264          *      e.alert();\r
265          * }     \r
266          */\r
267         alert:function(){\r
268                 alert(this.message);\r
269         },\r
270         /**\r
271          * toStringを上書きする。オブジェクトを文字列化する。\r
272          * 文字列は例外のコールスタックであり、デバックで役立つ。\r
273          * @function\r
274          * @return {string}\r
275          * 現在のオブジェクトの状態(例外のコールスタック)\r
276          * @example\r
277          * try{\r
278          *      throw new MiMicException();\r
279          * }catch(e){\r
280          *      alert(e.toString());\r
281          * }     \r
282          */\r
283         toString:function()\r
284         {\r
285                 return "MiMicException:"+this.message;\r
286         }       \r
287 }\r
288 \r
289 \r
290 \r
291 \r
292 \r
293 \r
294 /*\r
295  * MiMicRemoteMCU\r
296  */\r
297 var MiMicRemoteMcuInterface;\r
298 \r
299 (function(){\r
300         /**\r
301          * エラーID定義\r
302          * @private\r
303          */\r
304         var EE=function(i_base)\r
305         {\r
306                 return {\r
307                 NG:[i_base|0x00,"Unknown exception in MiMicRemoteMcuInterface"],\r
308                 TCP_CONNECT:[i_base|0x01,"TCP CONNECT FAILED"],//接続エラー\r
309                 HTTP       :[i_base|0x02,"HTTP FAILED"]}//HTTPエラー\r
310         }(MiMicError.NG[0]|MiMicError.MID_MiMic|MiMicError.CAID_RemoteMCU);\r
311         /**\r
312          * MiMicRemoteMcuInterfaceクラスのコンストラクタ。\r
313          * MiMicRemoteMcuInterfaceクラスは、MCUで動作するMiMicRemoteMcuとの通信機能と、接続状態の監視機能を提供する。低レベルAPI全てを実装する。\r
314          * 低レベルAPIは、MiMicRemoteMcuとの通信を、関数コールに変換する。\r
315          * インスタンス生成直後は、MiMicRemoteMcuとの接続は断状態である。connect関数を実行して、接続する必要がある。\r
316          * 通信仕様については、MiMicVM.pdf Appendix 1.MiMicVM HTTP Interfaceを参照すること。\r
317          * @constructor\r
318          * @param {string} i_path\r
319          * 接続するMiMicRemoteMcuのホストパスを指定します。\r
320          * MiMicVersion 1.4以降はMiMicサーバの/mvm/に割り当てられています。\r
321          * ホストアドレスのみを指定した場合、"/mvm/"サフィックスを自動で追加します。\r
322          * ex.\r
323          * "127.0.0.1" =&lt; "127.0.0.1/mvm/"<br/>\r
324          * "127.0.0.1:3939/mvm/" =&lt; "127.0.0.1:3939/mvm/"\r
325          * @example\r
326          * //create a controlable MCU via network.\r
327          * var mcu=new MiMicRemoteMcuInterface(“192.168.0.39/mvm/”);         \r
328          */\r
329         MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(i_path)\r
330         {\r
331                 this._mimic_path=i_path+((i_path.indexOf("/")==-1)?"/mvm/":"");\r
332         }\r
333 \r
334         MiMicRemoteMcuInterface.prototype=\r
335         {\r
336                 _mimic_path:null,\r
337                 _keep_alive:null,\r
338                 /**\r
339                  * 最後にXhrレスポンスを得た時刻\r
340                  */\r
341                 _last_xhr_res_time:0,\r
342                 /**\r
343                  * XmlHttpRequestを実行する。\r
344                  * @private\r
345                  * @return\r
346                  * 取得したデータ。\r
347                  * @throws\r
348                  * 取得失敗時(例外発生の場合)\r
349                  */\r
350                 _xhrGet:function(i_url,i_async,i_callback)\r
351                 {\r
352                     var xhr = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest();\r
353                     var prog=0;\r
354                     try{\r
355                         if(i_async){\r
356                                 xhr.onreadystatechange = function(){\r
357                                                 if (xhr.readyState == 4){\r
358                                                 //最終受信時刻を記録\r
359                                                         this._last_xhr_res_time=MiMicLib.getNow();\r
360                                                         i_callback(xhr);\r
361                                                 }\r
362                                         }\r
363                         }\r
364                         xhr.open("GET",i_url,i_async);\r
365                         prog=1;\r
366                         xhr.send(null); \r
367                         if(!i_async){\r
368                                 //最終受信時刻を記録\r
369                                         this._last_xhr_res_time=MiMicLib.getNow();\r
370                         }\r
371                         prog=2;                 \r
372                     } catch (e){\r
373                         throw new MiMicException(\r
374                                 function(){\r
375                                         switch(prog){\r
376                                         case 1:return EE.HTTP;\r
377                                         }\r
378                                                 return EE.TCP_CONNECT;\r
379                                         }(),"url="+i_url);\r
380                     }\r
381                     return xhr;\r
382                 },\r
383                 /**\r
384                  * MiMicの応答から、オンラインチェックを実行します。\r
385                  * @private\r
386                  * @param res\r
387                  * レスポンスを格納済みのXHRオブジェクト\r
388                  * @return\r
389                  * オンラインならtrue\r
390                  * 入力文章から状態が判定できなかった場合、false\r
391                  */\r
392                 _isOnline_parseResponse: function(res)\r
393                 {\r
394                         function isok(i_s)\r
395                         {\r
396                                 function parse_version_tag(i_v)\r
397                                 {\r
398                                         var t=i_v.split("/");\r
399                                         var n=t[1].split(".");\r
400                                         return {name:t[0],major:parseInt(n[0]),minor:parseInt(n[1])};\r
401                                 }\r
402                                 try{\r
403                                         //"MiMicRemoteMCU/1.n;xならOK.(n>=1)\r
404                                         var l=i_s.split(";");\r
405                                         var rmcu=parse_version_tag(l[0]);//ModRemoteMcu\r
406                                         var mcut=l[1];//MCUTYPE\r
407                                         return ((rmcu.name=="ModRemoteMcu") && (rmcu.major==1) && (rmcu.minor>=0));\r
408                                 }catch(e){\r
409                                         throw MiMicException(e);\r
410                                 }\r
411                         }\r
412 \r
413                         try{\r
414                                 if(res.status!=200){\r
415                                         return false;\r
416                                 }\r
417                                 var ret=eval("("+res.responseText+")");\r
418                                 if(!isok(ret.application)){\r
419                                         return false;\r
420                                 }\r
421                         }catch(e){\r
422                                 return false;\r
423                         }\r
424                         return true;\r
425                 },\r
426                 /**\r
427                  * MvmのレスポンスをJSOにする。\r
428                  * @private\r
429                  * @return\r
430                  * 成功時はjson\r
431                  * @throws\r
432                  * JSONが得られない場合\r
433                  */\r
434                 _parseMvmResult:function(i_mvmresult)\r
435                 {\r
436                         function isok(i_s)\r
437                         {\r
438                                 //ModRemoteMcu/1.x;Json/1.0ならOK\r
439                                 var l=i_s.split(";");\r
440                                 return((l[0].indexOf("ModRemoteMcu/1.")==0) && (l[1]=="Json/1.0"));\r
441                         }\r
442                         var ret=eval("("+i_mvmresult+")");\r
443                         if(isok(ret.version)){\r
444                                 if(ret.result!=undefined){\r
445                                         if(ret.result!=0x0 || ret.stream!=undefined){\r
446                                                 return ret;\r
447                                         }\r
448                                 }\r
449                         }\r
450                         //なんかうまくいかない。\r
451                         throw new MiMicException(EE.NG,"Invalid json version:'"+ret.version+"'");\r
452                 },\r
453                 /**\r
454                  * 接続状態を真偽値で返す。\r
455                  * 接続状態の場合、execBc等の低レベルAPIを使用できる。\r
456                  * 状態は、インスタンスが定期的に実行するプローブ信号でチェックされ、更新される。\r
457                  * @function\r
458                  * @return {boolean}\r
459                  * 接続状態。trueなら、MCUインタフェイスは利用可能。\r
460                  * @example\r
461                  * //show connection status\r
462                  * var mri=new  MiMicRemoteMcuInterface(“192.168.0.1”);\r
463                  * alert(mri.isConnected());             \r
464                  */\r
465                 isConnected:function isConnected()\r
466                 {\r
467                         return this._keep_alive!=null;\r
468                 },\r
469                 /**\r
470                  * 接続中のMiMicremoteMCUへ、整形済みのMiMicBCを送信する。\r
471                  * 関数の利用前に、connect関数でMiMicremoteMCUへ接続する必要がある。\r
472                  * 何らかのエラーが発生してMiMicRemoteMCUからの応答が得られない場合、関数は例外を発生する。\r
473                  * この状況は、TCP/IPエラー、HTTPエラー、HTTPステータスエラー、MiMicVMのラインタイムエラー、MiMicRemoteMCUのフォールト等の原因で発生する。<br/>\r
474                  * 関数は同期実行でのため、RemoteMCUが応答しないと制御がブロックする。非同期関数は今後実装する。\r
475                  * @function\r
476                  * @param {string} i_bc\r
477                  * 整形済みのMiMicBC文字列。MiMicBCについては、MiMicVM.pdf の、MiMicBCの章を参照。\r
478                  * @return\r
479                  * MiMicVMのパース済みJavascriptObjectである。\r
480                  * 形式は以下の通り。\r
481                  * <pre>\r
482                  * {version: string,result: int,stream int[]}\r
483                  * </pre>\r
484                  * 詳細は、 MiMicVM.pdf Appendix 1. MiMicVM HTTP Interfaceを参照。\r
485                  * @example\r
486                  * //execute NOP.\r
487                  * var mri=new  MiMicRemoteMcuInterface(“192.168.0.1”);\r
488                  * mri.connect(function(){});\r
489                  * mri.execBc(“ZAZZ.E”);//NOP;EXIT;          \r
490                  */\r
491                 execBc:function execBc(i_bc)\r
492                 {\r
493                         try{\r
494                                 if(this._keep_alive==null){\r
495                                         throw new MiMicException(EE.NG,"disconnected");\r
496                                 }\r
497                                 var res=this._xhrGet("http://"+this._mimic_path+"mvm.api?v=1&bc="+i_bc,false);\r
498                                 if(res.status!=200){\r
499                                         throw new MiMicException(EE.HTTP,"i_bc="+i_bc+",XHR.status="+res.status);\r
500                                 }\r
501                                 return this._parseMvmResult(res.responseText,false);\r
502                         }catch(e){\r
503                                 throw new MiMicException(e);\r
504                         }\r
505                 },\r
506 \r
507                 /**\r
508                  * MiMicRemoteMCUへ接続する。\r
509                  * 既に接続済みの場合は何もしない。\r
510                  * @function\r
511                  * @param {function} i_callback\r
512                  * 回線状態を定期的に通知するコールバックハンドラ。\r
513                  * <pre>function(b:{boolean})</pre>\r
514                  * disconnect関数を呼び出すまでの間、回線の状態を定期的に受け取る。\r
515                  * bは接続状態を表す真偽値である。trueの時、接続中である。falseの場合、外部要因により切断されている。\r
516                  * falseが通知されるのは、disconnectが呼び出されるまでに非同期切断を検出したときだけである。disconnectで切断した場合には呼び出されない。           \r
517                  * @example\r
518                  * //show connection status\r
519                  * var mri=new  MiMicRemoteMcuInterface(“192.168.0.1”);\r
520                  * mri.connect(function(b){if(!b){alert(“disconnected!”);}});                \r
521                  */\r
522                 connect:function connect(i_callback)\r
523                 {\r
524                         try{\r
525                                 var _t=this;\r
526                                 //接続中ならおわり\r
527                                 if(this._keep_alive!=null){\r
528                                         return;\r
529                                 }\r
530                                 function xhrStatus(i_is_async,i_cb)\r
531                                 {\r
532                                         try{\r
533                                                 return _t._xhrGet("http://"+_t._mimic_path+"status.api",i_is_async,i_cb);\r
534                                         }catch(e){\r
535                                                 return null;\r
536                                         }\r
537                                 };\r
538                                 function intervalProc()\r
539                                 {\r
540                                         //現在時刻を計算\r
541                                         var now=MiMicLib.getNow();\r
542                                         //最後に通信に成功した時刻からの経過時間を計算\r
543                                         var lt=now-_t._last_xhr_res_time;\r
544                                         if(lt<3000){\r
545                                                 return;\r
546                                         }\r
547                                         //最後の通信からの経過時間がNを超えていたら通信チェック\r
548                                         var res=xhrStatus(false,null);\r
549                                         if((res==null) || (!_t._isOnline_parseResponse(res))){\r
550                                                 if(_t._keep_alive!=null){\r
551                                                         //Intrervalを中断\r
552                                                         clearInterval(_t._keep_alive.tid);\r
553                                                         _t._keep_alive=null;\r
554                                                         i_callback(false);\r
555                                                 }\r
556                                         }                                       \r
557                                         i_callback(true);\r
558                                 };\r
559                                 //1回目の接続確認(同期接続)\r
560                                 var res=xhrStatus(false,null);\r
561                                 if((res==null) || (!_t._isOnline_parseResponse(res))){\r
562                                         throw new MiMicException("Bad response from "+this._mimic_path);\r
563                                 }\r
564                                 //周期監視の開始\r
565                                 this._keep_alive={\r
566                                         tid:setInterval(intervalProc,500)\r
567                                 };\r
568                         }catch(e){\r
569                                 throw new MiMicException(e);\r
570                         }\r
571                         return;\r
572                 },\r
573                 /**\r
574                  * 接続中のMiMicRemoteMCUから切断する。接続されていなければ何もしない。\r
575                  * @function\r
576                  * @example\r
577                  * //connect and disconnect\r
578                  * var mri=new  MiMicRemoteMcuInterface(“192.168.0.1”);\r
579                  * mri.connect(function(b){if(!b){alert(“disconnected!”);}});\r
580                  * mri.disconnect();             \r
581                  */\r
582                 disconnect:function disconnect()\r
583                 {\r
584                         try{\r
585                                 if(this._keep_alive!=null){\r
586                                         clearInterval(this._keep_alive.tid);\r
587                                         this._keep_alive=null;//abortによるコールバックを抑制\r
588                                 }\r
589                         }catch(e){\r
590                                 throw new MiMicException(e);\r
591                         }\r
592                 }\r
593         }\r
594         \r
595         \r
596         \r
597         \r
598         \r
599 }());\r
600 \r
601 \r
602 \r