+++ /dev/null
-/**\r
- * @fileOverview 低レベルAPIを定義する。低レベルAPIは、MiMicRemoteMcuをインストールしたMCUとの通信クラスを提供する。\r
- */\r
-\r
-/**\r
- * MiMicネームスペース\r
- * @namespace\r
- */\r
-var MiMicJS={};\r
-(function(){\r
- var NS=MiMicJS;\r
- /**\r
- * MiMicJsAPIのバージョン文字列。\r
- * @name MiMicJS#VERSION\r
- */\r
- NS.VERSION="MiMicJsAPI/2.0.3";\r
- /**\r
- * 配列要素、又は値がすべてInt値でない場合に例外を起こします。\r
- * @name MiMicJS.assertInt\r
- * @function\r
- * @param {[array]} v\r
- * テストする配列\r
- */\r
- NS.assertInt=function assertInt(v){\r
- if(!NS.isArray(v)){\r
- if(!NS.isInt(v)){throw new NS.MiMicException();}\r
- }\r
- for(var i=0;i<v.length;i++){\r
- if(NS.isInt(v[i])){\r
- continue;\r
- }\r
- throw new NS.MiMicException('"'+v[i]+'" is not integer.');\r
- }\r
- }\r
- /**\r
- * 配列要素、、又は値がすべて数値でない場合に例外を起こします。\r
- * @name MiMicJS.assertNumber\r
- * @function\r
- * @param {[array]} v\r
- * テストする配列\r
- */\r
- NS.assertNumber=function assertNumber(v){\r
- if(!NS.isArray(v)){\r
- if(!NS.isNumber(v)){ throw new NS.MiMicException();}\r
- }else{\r
- for(var i=0;i<v.length;i++){\r
- if(NS.isNumber(v[i])){\r
- continue;\r
- }\r
- throw new NS.MiMicException('"'+v[i]+'" is not number.');\r
- }\r
- }\r
- };\r
- /**\r
- * @private\r
- */\r
- NS.isUndefined=function(v,def){\r
- if(arguments.length==1){return v === void 0;}\r
- return (v === void 0)?def:v;\r
- };\r
- /**\r
- * 数値であるかを確認します。\r
- * @private\r
- */\r
- NS.isNumber=function isNumber(o)\r
- {\r
- return (typeof o=='number');\r
- };\r
- /**\r
- * 整数であるかを確認します。\r
- * @private\r
- */\r
- NS.isInt=function isInt(o)\r
- {\r
- return (typeof o=='number') && (o-Math.round(o)==0);\r
- };\r
-\r
- /**\r
- * オブジェクトがジェネレータクラスであるかを返します。\r
- * @private\r
- */\r
- NS.isGenerator=function isGenerator(o)\r
- {\r
- if(!o){return false;}\r
- return o.toString().indexOf('Generator')!=-1;\r
- };\r
- /**\r
- * オブジェクトが関数であるかを返します。\r
- * @private\r
- */\r
- NS.isFunction=function isFunction(o){\r
- return (typeof o == 'function');\r
- }\r
- /**\r
- * @private\r
- * 現在の時刻を返します。\r
- */\r
- NS.getNow=function getNow(){\r
- return (new Date()).getTime();\r
- };\r
- /**\r
- * @private\r
- * aが配列であるかを返します。\r
- */\r
- NS.isArray=function isArray(a){\r
- return a instanceof Array;\r
- };\r
- /**\r
- * @private\r
- * aが配列であるかを返します。\r
- */\r
- NS.isHashArray=function isHashArray(a){\r
- return (!(a instanceof Array)) && (typeof a == "object");\r
- }; \r
- /**\r
- * 連想配列をシャローコピーして複製します。\r
- * @private\r
- */ \r
- NS.cloneAssoc=function cloneAssoc(a)\r
- {\r
- var r={};\r
- for(var i in a){\r
- r[i]=a[i];\r
- }\r
- return r;\r
- };\r
- /**\r
- * @private\r
- * 桁数を指定して、int値を16進数に変換します。\r
- * @param {int} i_val\r
- * 変換する値\r
- * @param {int} i_digit\r
- * 桁数\r
- * @return {string}\r
- * 文字列形式の値\r
- */\r
- NS.hexout=function hexout(i_val,i_digit)\r
- {\r
- var dt=["","0","00","000","0000","00000","000000","0000000"];\r
- var s=(i_val>>>0).toString(16).toLowerCase();\r
- if(s.length>i_digit){\r
- //マイナスだともれなくエラー\r
- throw new NS.MiMicException(EE.NG);\r
- }\r
- var l=i_digit-s.length;\r
- return dt[l]+s;\r
- };\r
- /**\r
- * @private\r
- * 連想配列を文字列にして返します。\r
- */\r
- NS.assocToStr=function assocToStr(a)\r
- {\r
- var s="";\r
- for(k in a){s+=k+":"+a[k]+",";}\r
- return s;\r
- };\r
- /**\r
- * @private\r
- * 32bit値のエンディアンを交換します。\r
- * @param v\r
- * 交換する値\r
- * @return\r
- * 交換後の値\r
- */\r
- NS.bswap32=function bswap32(v)\r
- {\r
- return ((v<<24)&0xff000000)|((v<<8)&0xff0000)|((v>>8)&0xff00)|((v>>24)&0xff);\r
- };\r
- /**\r
- * @private\r
- * バイナリ文字列をバイト値として配列に変換します。\r
- * @param v\r
- * 数値配列\r
- */\r
- NS.bstr2byteArray=function bstr2byteArray(v)\r
- {\r
- var r=new Array();\r
- if(v.length%2!=0){\r
- throw new NS.MiMicException(); \r
- }\r
- for(var i=0;i<v.length;i+=2){\r
- r.push(parseInt(v.substr(i,2),16));\r
- }\r
- return r;\r
- };\r
- /**\r
- * @private\r
- * バイナリ文字列を32bitUInt数値配列に変換します。\r
- * Uint値はLittleEndianとして解釈します。\r
- * @param {int[]} v\r
- * 数値配列\r
- */\r
- NS.bstr2uintArray=function bstr2uintArray(v)\r
- {\r
- var r=new Array();\r
- if(v.length%8!=0){\r
- throw new NS.MiMicException(); \r
- }\r
- for(var i=0;i<v.length;i+=8){\r
- r.push(NS.bswap32(parseInt(v.substr(i,8),16)));\r
- }\r
- return r;\r
- };\r
- /**\r
- * ByteArrayをBinarayStringに変換します。\r
- * @name MiMicJS.byteArray2bstr\r
- * @function\r
- * @param v\r
- * @return {String}\r
- */\r
- NS.byteArray2bstr=function byteArray2bstr(v)\r
- {\r
- var s=NS.isArray(v)?v:[v];\r
- var r="";\r
- for(var i=0;i<s.length;i++){\r
- r+=NS.hexout(s[i],2,16);\r
- }\r
- return r;\r
- };\r
- /**\r
- * UInt32ArrayをBinarayStringに変換します。\r
- * 出力はLittleEndianの配列です。\r
- * @name MiMicJS.uintArray2bstr\r
- * @function\r
- * @param v\r
- * UInt32の配列\r
- * @return {String}\r
- */ \r
- NS.uintArray2bstr=function uintArray2bstr(v)\r
- {\r
- var s=NS.isArray(v)?v:[v];\r
- var r="";\r
- for(var i=0;i<s.length;i++){\r
- r+=NS.hexout(NS.bswap32(s[i]),8,16);\r
- }\r
- return r;\r
- };\r
- \r
- /**\r
- * 連想配列の内容をルートオブジェクト直下に展開します。\r
- * この関数は名前空間を汚染します。十分に注意して使用してください。\r
- * @name MiMicJS.using\r
- * @function\r
- * @param {HashMap} v\r
- * 展開する連想配列\r
- * @example\r
- * MiMicJS.using(mbedJS);\r
- * MiMicJS.using(mbedJS.PinName);\r
- */\r
- NS.using=function using(v)\r
- {\r
- for (var key in v) {\r
- window[key]=v[key];\r
- }\r
- }\r
- /**\r
- * MiMicSDK向けの内部関数です。\r
- * 末尾引数が関数の場合にはその関数を、異なる場合はi_cbを返却します。\r
- * @private\r
- * @param i_arg\r
- * 引数配列を指定します。\r
- * @param i_default_cb\r
- * 引数配列に関数がなかった場合に返す値を指定します。\r
- */\r
- NS._getCb=function _getCb(i_arg,i_default_cb)\r
- {\r
- if(i_arg.length==0){\r
- return i_default_cb;\r
- }\r
- return NS.isFunction(i_arg[i_arg.length-1])?i_arg[i_arg.length-1]:i_default_cb;\r
- }\r
- /**\r
- * MiMicSDK向けの関数です。\r
- * 末尾の拡張変数を取り除いたarguments引数の数を返します。\r
- * @private\r
- */\r
- NS._getBaseArgsLen=function _getBaseArgsLen(i_arg)\r
- {\r
- if(i_arg.length==0 || (!NS.isFunction(i_arg[i_arg.length-1]))){\r
- return i_arg.length;\r
- }\r
- return i_arg.length==1?0:i_arg.length-1;\r
- }\r
- \r
- /**\r
- * MiMicSDK向けの関数です。\r
- * インスタンスがyieldコール可能かをチェックし、可能ならコール関数を記録します。\r
- * 関数は、インスタンスの_gen,_lcをチェックして、yieldが不可能な場合に例外を発生します。\r
- * _assertYield.call(this)でコールして下さい。\r
- * @private\r
- */\r
- NS._assertYield=function _assertYield()\r
- {\r
- if(this._gen && this._lc){\r
- throw new NS.MiMicException(NS.Error.NG_YIELD_NOT_COMPLETED);\r
- }\r
- }\r
- /**\r
- * MiMicSDK向けの関数です。コンストラクタでイベントハンドラをセットアップする定型処理です。\r
- * i_handlerにセットされたオブジェクトに従って_gen,_eventメンバをセットします。\r
- * _initHandler.call(this,i_handler)でコールして下さい。\r
- * @private\r
- */\r
- NS._initHandler=function _initHandler(i_handler)\r
- {\r
- if(NS.isGenerator(i_handler)){\r
- this._gen=i_handler;\r
- }else if(NS.isFunction(i_handler)){\r
- return i_handler;\r
- }else if(i_handler){\r
- this._event=i_handler;\r
- return i_handler.onNew;\r
- }\r
- return null;\r
- }\r
- \r
- \r
-}());\r
- \r
-(function(){\r
- var NS=MiMicJS;\r
- \r
- /**\r
- * MiMicExceptionが使用するエラーコードと、その判定関数を定義する。\r
- * エラーコードは、以下の形式の配列オブジェクトで表現する。\r
- * <pre>\r
- * [code:int,message:string]\r
- * </pre>\r
- * \r
- * codeは31ビットのエラーコードである。ビットフィールドの意味は以下の通りである。\r
- * <table>\r
- * <tr><th>bit</th><th>name</th><th>discription</th></tr>\r
- * <tr><td>30</td><td>ErrorBit</td><td>Error:1,OK:0</td></tr>\r
- * <tr><td>29-24</td><td>Reserved</td><td>-</td></tr>\r
- * <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
- * <tr><td>15-8</td><td>ClassID</td><td>0x00:unknown</td></tr>\r
- * <tr><td>7-0</td><td>ErrorID</td><td></td></tr>\r
- * </table>\r
- * @namespace\r
- * @name MiMicJS.Error\r
- * @example\r
- * throw new MiMicException(MiMicError.NG);\r
- */\r
- NS.Error=\r
- {\r
- /** 成功を示します。\r
- * @constant\r
- * @name MiMicJS.Error.OK\r
- */\r
- OK:[0x00000000,"OK"],\r
- /** 詳細情報の無いエラーです。\r
- * @constant\r
- * @name MiMicJS.Error.NG\r
- */ \r
- NG:[0x40000000,"NG"],\r
- /** Generatorを用いたコードで、前回のyieldが終了していないことを示します。\r
- * @constant\r
- * @name MiMicJS.Error.NG_YIELD_NOT_COMPLETED\r
- */\r
- NG_YIELD_NOT_COMPLETED:[0x40001001,"The previous function has not been completed."],\r
- /** 関数の呼び出し順序が正しくないことを示します。\r
- * @constant\r
- * @name MiMicJS.Error.NG_ILLEGAL_CALL\r
- */\r
- NG_ILLEGAL_CALL:[0x40001002,"Illegal procedure call."],\r
- /** 引数型の不一致を検出したことを示します。\r
- * @constant\r
- * @name MiMicJS.Error.NG_INVALID_ARG\r
- */\r
- NG_INVALID_ARG:[0x40001003,"Invalid arguments."],\r
- /**\r
- * エラーコードがOKか調べる。\r
- * @function\r
- * @name MiMicJS.Error.isOK\r
- * @param {Object as [MiMicErrorCode]} v\r
- * 評価するオブジェクト\r
- * @return {Boolean}\r
- * エラーコードでなければ、trueを返す。\r
- * @example\r
- * MiMicError.isOK(MiMicError.OK);//true\r
- */\r
- isOK:function(v){\r
- return (0x40000000 & v)==0x00000000;\r
- }\r
- };\r
- \r
-}());\r
-\r
-(function(){\r
- var NS=MiMicJS; \r
- /**\r
- * 引数が1個のパターン。\r
- * @name MiMicJS.MiMicException:2\r
- * @function\r
- * @param {object} e\r
- * eのクラスにより、動作が異なる。\r
- * <ul>\r
- * <li>{string} - MiMicException(Error.NG,e)と等価である。</li>\r
- * <li>{object as [MiMicErrorCode]} - エラーコードを指定して例外を生成する。エラーコードについては、MiMicJs.Errorを参照</li>\r
- * <li>{object} - MiMicException(MiMicError.NG,e.toString())と等価である。objectを文字列化して例外を生成する。</li>\r
- * <li>{MiMicException} - codeとmessageを継承して例外を生成する。コールスタックを生成するときは、このパターンを使うこと。</li>\r
- * </ul>\r
- * @example\r
- * throw new MiMicException(MiMicError.NG);\r
- * throw new MiMicException("Error");\r
- * try{\r
- * throw new MiMicException("Error");\r
- * }catch(e){\r
- * throw new MiMicException(e);\r
- * }\r
- */\r
- /**\r
- * MiMic javascript APIが生成する例外クラスのコンストラクタである。関数ごとにMiMicExceptionを使ったtry-catchを導入することにより、例外発生時にスタックトレースメッセージを得ることが出来る。\r
- * スタックトレースは改行で連結された文字列である。messageプロパティに格納される。alert関数で表示することで、効率的なデバックが可能である。\r
- * 引数の違いにより、数種類の呼び出し方がある。\r
- * @constructor\r
- * @name MiMicJS.MiMicException\r
- * @param ...\r
- * 詳細は、MiMicException:nを参照。\r
- */\r
- NS.MiMicException=function MiMicException(/*...*/)\r
- {\r
- var pfx;\r
- if(typeof arguments.callee.caller=="function"){\r
- if(arguments.callee.caller.name.toString().length>0){\r
- pfx="function '"+arguments.callee.caller.name+'.';\r
- }else{\r
- var s=arguments.callee.caller.toString();\r
- pfx="closure '"+s.substring(0,s.indexOf("{"))+"...'";\r
- }\r
- }else{\r
- pfx="root document";\r
- }\r
- var sfx="";\r
- switch(arguments.length){\r
- case 0:\r
- //とりあえずexceptiion\r
- this.code=NS.Error.NG[0];\r
- this.message=pfx+" code(0x"+this.code.toString(16)+")"+NS.Error.NG[1];\r
- return;\r
- case 1:\r
- var v=arguments[0];\r
- if(v instanceof NS.MiMicException){\r
- //exception継承\r
- this.code=v.code;\r
- sfx=" \nfrom "+v.message;\r
- }else if(typeof v=="object" && v.length==2){\r
- //Errorコードテーブル\r
- this.code=v[0];\r
- sfx=v[1];\r
- }else{\r
- //文字列やオブジェクト\r
- this.code=NS.Error.NG[0];\r
- sfx=NS.Error.NG[1]+" "+(((typeof v)!='undefined')?v.toString():"v==undefined");\r
- }\r
- this.message=pfx+" code(0x"+this.code.toString(16)+")"+sfx;\r
- return;\r
- default:\r
- break;\r
- }\r
- throw new NS.MiMicException("Invalid MiMicException argument.");\r
- }\r
-\r
- NS.MiMicException.prototype=\r
- {\r
- \r
- /**\r
- * MiMicErrorCode形式のエラーコードを保持する。\r
- * @field {object as MiMicErrorCode}\r
- * @name MiMicJS.MiMicException#code\r
- */\r
- code:null,\r
- /**\r
- * エラーメッセージを保持する。この値は、改行区切りのコールスタックである。\r
- * @field {string}\r
- * @name MiMicJS.MiMicException#message\r
- */\r
- message:"",\r
- /**\r
- * messageフィールドをalertで表示する。\r
- * @name MiMicJS.MiMicException#alert\r
- * @function\r
- * @example\r
- * try{\r
- * throw new MiMicException();\r
- * }catch(e){\r
- * e.alert();\r
- * } \r
- */\r
- alert:function(){\r
- alert(this.message);\r
- },\r
- /**\r
- * toStringを上書きする。オブジェクトを文字列化する。\r
- * 文字列は例外のコールスタックであり、デバックで役立つ。\r
- * @function\r
- * @name MiMicJS.MiMicException#toString\r
- * @return {string}\r
- * 現在のオブジェクトの状態(例外のコールスタック)\r
- * @example\r
- * try{\r
- * throw new MiMicException();\r
- * }catch(e){\r
- * alert(e.toString());\r
- * } \r
- */\r
- toString:function()\r
- {\r
- return "MiMicException:"+this.message;\r
- } \r
- }\r
-}());\r
-\r
-(function(){\r
- /**@private */\r
- var NS=MiMicJS;\r
- /**\r
- * MiMicRPCのクライアントクラスです。\r
- * 通信APIを提供します。\r
- * @name MiMicJS.Rpc\r
- * @constructor\r
- * @param {HashMap} i_event\r
- * 非同期イベントハンドラの連想配列です。登録できるメンバは以下の通りです。\r
- * <ul>\r
- * <li>onOpen:function() -\r
- * open関数のコールバック関数です。\r
- * <li>onClose:function() -\r
- * close関数のコールバック関数です。\r
- * <li>onError:function() -\r
- * 何らかの異常で通信を継続できないエラーが発生し、コネクションを維持できない時に発生します。\r
- * このイベントが発生するとコネクションは閉じられます。\r
- * </ul>\r
- */\r
- NS.Rpc=function Rpc(i_event)\r
- {\r
- this._event=(i_event)?i_event:null;\r
- }\r
- NS.Rpc.prototype=\r
- {\r
- _event:null,\r
- /**\r
- * @private \r
- * Websocketインスタンスです。\r
- */\r
- _ws:null,\r
- /**\r
- * @private\r
- * [READ ONLY]\r
- * RPCの平均RTT[ms]です。\r
- * @name MiMicJs.Rpc#RTT\r
- */\r
- rtt:0,\r
- /** メソッドIDカウンタ。sendJsonを実行する毎にインクリメントされます。*/\r
- _method_id:0,\r
- /**\r
- * RPCコネクションを開きます。\r
- * 関数が終了するとonOpenイベントをコールバックします。\r
- * @name MiMicJS.Rpc#open\r
- * @function\r
- * @param i_url\r
- * ws://から始まるWebsocketサービスURLを指定します。\r
- */\r
- open:function open(i_url)\r
- {\r
- var _t=this;\r
- if(this._ws){\r
- throw new MiMicException();\r
- }\r
- \r
- var q=new Array();\r
- var ev=this._event;\r
- var ws=new WebSocket(i_url);\r
- ws.onopen = function(){\r
- if(ev.onOpen){ev.onOpen();}\r
- }\r
- ws.onclose = function(){\r
- if(ev.onClose){ev.onClose();}\r
- };\r
- ws.error = function(){\r
- _t.shutdown();\r
- if(ev.onClose){ev.onError();}\r
- };\r
- var rx="";\r
- var rxst=0;\r
- var _t=this;\r
- ws.onmessage = function (e)\r
- {\r
- //ストリームからJSONを抽出。"のエスケープには対応しない。\r
- for(var i=0;i<e.data.length;i++){\r
- var t=e.data[i];\r
- switch(rxst){\r
- case 2:\r
- if(t!='"'){\r
- rxst=1;\r
- }\r
- break;\r
- case 0:\r
- if(t!='{'){\r
- continue;\r
- }\r
- rx='({';\r
- rxst=1;\r
- continue;\r
- case 1:\r
- switch(t){\r
- case '"':\r
- rxst=2;\r
- break;\r
- case '}':\r
- rx+='})';\r
- rxst=0;\r
- {\r
-// log(rx);//Debug\r
- //JSONがたぶん確定\r
- var j=eval(rx);\r
- for(var i2=q.length-1;i2>=0;i2--){\r
- if(q[i2][0]==j.id){\r
- //id一致→コールバック\r
- var qi=q[i2];\r
- q.splice(i2, 1);\r
- //コールバック必要?\r
- if(qi[1]){qi[1](j);}\r
- break;\r
- }\r
- }\r
- }\r
- continue;\r
- }\r
- }\r
- rx+=t;\r
- }\r
- }\r
- this._method_id=0;\r
- this._q=q;\r
- this._ws=ws;\r
- },\r
- /**\r
- * 接続中のRPCコネクションを閉じます。\r
- * 関数が終了するとonCloseイベントをコールバックします。\r
- * @name MiMicJS.Rpc#close\r
- * @function\r
- */\r
- close:function close()\r
- {\r
- if(this._ws && this._ws.readyState==1){\r
- this._ws.close();\r
- this._ws=null;\r
- }\r
- },\r
- /**\r
- * RPC回線を確実に閉じます。\r
- * この関数を実行すると、すべてのコールバックイベントはキャンセルされます。\r
- * @name MiMicJS.Rpc#shutdown\r
- * @function\r
- */\r
- shutdown:function shutdown()\r
- {\r
- var _t=this;\r
- if(_t._ws){\r
- _t._ws.onopen=function(){_t._ws.close();};\r
- _t._ws.onmessage=function(){_t._ws.close();};\r
- _t._ws.onclose=function(){_t._ws=null;};\r
- _t._ws.onerror=function(){_t._ws=null;};\r
- }\r
- },\r
- /**\r
- * 非同期でJSON RPCメソッドを送信します。\r
- * @name MiMicJS.Rpc#sendMethod\r
- * @function\r
- * @param {string} i_method\r
- * RPCメソッドの名前です。\r
- * @param {string} i_params\r
- * カンマ区切りのJSONスタイルの文字列です。この文字列は[....]に埋め込まれます。エスケープ文字列は使用できません。\r
- * @param {function(json)}i_callback\r
- * Resultを受け取るコールバック関数です。jsonにはResult JSONをパースしたオブジェクトが入ります。\r
- * @return {int}\r
- * メソッドIDを返します。\r
- */\r
- sendMethod:function callJsonRpc(i_method,i_params,i_callback)\r
- {\r
- var v="{\"jsonrpc\":\"2.0\",\"method\":\""+i_method+"\",\"params\":["+i_params+"],\"id\":"+this._method_id+"}";\r
-// log(v);//Debug\r
- this._ws.send(v);\r
- this._q.push([this._method_id,i_callback]);//キューに記録\r
- this._method_id=(this._method_id+1)&0x0fffffff;//IDインクリメント\r
- return this._method_id;\r
- }\r
- }\r
-\r
-}());
\ No newline at end of file