OSDN Git Service

バイナリ文字列(BSTR)転送に関する機能追加
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.Memory.js
diff --git a/misc/mbedJS/mbddJS.API/mbedJS/mbed.Memory.js b/misc/mbedJS/mbddJS.API/mbedJS/mbed.Memory.js
new file mode 100644 (file)
index 0000000..9347e4d
--- /dev/null
@@ -0,0 +1,231 @@
+/**\r
+ * @fileOverview Memoryクラスを定義します。\r
+ */\r
+(function(){\r
+var NS=mbedJS;\r
+var MI=MiMicJS;\r
+\r
+/**\r
+ * Memoryクラスです。\r
+ * <a href="https://mbed.org/handbook/Memory">mbed::Memory</a>と同等の機能を持ちます。\r
+ * @name mbedJS.Memory\r
+ * @constructor\r
+ * @param {mbedJS.Mcu} i_mcu\r
+ * インスタンスをバインドするMCUオブジェクトです。\r
+ * @param {HashMap|Generator} i_event\r
+ * 非同期イベントハンドラの連想配列、又はGeneratorです。\r
+ * <p>\r
+ * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
+ * <ul>\r
+ * <li>{function()} onNew -\r
+ * インスタンスが使用可能になった時に呼び出されます。\r
+ * </li>\r
+ * <li>{function(v)} onRead  -\r
+ * read関数のコールバック関数です。\r
+ *     <ul>\r
+ *             <li>{int} v - 現在のピンの値です。</li>\r
+ *     </ul>\r
+ * </li>\r
+ * <li>{function()} onMode -\r
+ * mode関数のコールバック関数です。\r
+ * </li>\r
+ * </ul>\r
+ * <p>\r
+ * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
+ * <p>\r
+ * @return {mbedJS.Memory}\r
+ * @example //Callback\r
+ * @example //Generator\r
+ */\r
+var CLASS=function Memory(i_mcu,i_handler)\r
+{\r
+       try{\r
+               var _t=this;\r
+               _t._mcu=i_mcu;\r
+               _t._lc=CLASS;\r
+               if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
+               else if(i_handler){_t._event=i_handler}\r
+               function cb(j)\r
+               {\r
+                       if(_t._event.onNew){_t._event.onNew();}\r
+                       if(_t._gen){_t._gen.next(_t);}\r
+                       _t._lc=null;\r
+               }\r
+               return _t._mcu.rpc(_t.RPC_NS+":init","",cb);\r
+       }catch(e){\r
+               throw new MI.MiMicException(e);\r
+       }\r
+}\r
+CLASS.prototype=\r
+{\r
+       /** @private */\r
+       RPC_NS:"MiMic:Memory",\r
+       /** @private 最後にコールしたAPIです。*/\r
+       _lc:null,\r
+       /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
+       _gen:null,\r
+       /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
+       _event:{},\r
+       /**\r
+        * Generatorモードのときに使用する関数です。\r
+        * Generatorモードの時は、yieldと併用してnew Memory()の完了を待ちます。\r
+        * @name mbedJS.Memory#waitForNew\r
+        * @function\r
+        */\r
+       waitForNew:function Memory_waitForNew()\r
+       {\r
+               try{\r
+                       if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
+                       this._lc=CLASS.waitForNew;\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * 1バイト単位でメモリから読み込みます。\r
+        * 関数の完了時にonReadイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.Memory#read\r
+        * @function\r
+        * @param {int} i_addr\r
+        * メモリアドレス\r
+        * @param {int} i_size\r
+        * (Optional) 読出しサイズです。省略時は1です。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int[]}\r
+        * Generatorモードの時はメモリ値を格納した配列を返します。\r
+        */\r
+       read:function Memory_read(i_addr,i_size)\r
+       {\r
+               //read(i_addr)\r
+               //read(i_addr,i_len)\r
+               try{\r
+                       var _t=this;\r
+                       if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
+                       _t._lc=CLASS.read;\r
+                       var a=[i_addr,arguments.length<2?1:i_size];\r
+                       MI.assertInt(a);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],\r
+                       function (j)\r
+                       {\r
+                               var v=MI.bstr2byteArray(j.result[0]);\r
+                               if(_t._event.onRead){_t._event.onRead(v);}\r
+                               if(_t._gen){_t._gen.next(v);}\r
+                                _t._lc=null;\r
+                       });\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * 1バイトをメモリへ書き込みます。\r
+        * 関数の完了時にonWriteイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.Memory#write\r
+        * @function\r
+        * @param {int} i_addr\r
+        * 書き込み先のメモリアドレスを指定します。\r
+        * @param {int|int[]} i_v\r
+        * 書き込むbyte配列、または数値を指定します。\r
+        * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       write:function Memory_write(i_addr,i_v)\r
+       {\r
+               try{\r
+                       var _t=this;\r
+                       if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
+                       _t._lc=CLASS.write;\r
+                       MI.assertInt(i_addr);\r
+                       MI.assertInt(i_v);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.byteArray2bstr(i_v)+"\"",\r
+                       function (j)\r
+                       {\r
+                               if(_t._event.onWrite){_t._event.onWrite();}\r
+                               if(_t._gen){_t._gen.next();}\r
+                                _t._lc=null;\r
+                       }\r
+                       );\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * 4バイト単位でメモリから読み込みます。\r
+        * 関数の完了時にonRead32イベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.Memory#read32\r
+        * @function\r
+        * @param {int} i_addr\r
+        * メモリアドレス\r
+        * @param {int} i_size\r
+        * (Optional) 読出しサイズです。省略時は4です。4の倍数を指定してください。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int[]}\r
+        * Generatorモードの時はメモリ値を格納した配列を返します。\r
+        */\r
+       read32:function Memory_read32(i_addr,i_size)\r
+       {\r
+               //read(i_addr)\r
+               //read(i_addr,i_len)\r
+               try{\r
+                       var _t=this;\r
+                       if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
+                       _t._lc=CLASS.read32;\r
+                       var a=[i_addr,arguments.length<2?4:i_size];\r
+                       if(a[1]%4!=0){\r
+                               throw new MI.MiMicException(MI.Error.NG_INVALID_ARG);\r
+                       }\r
+                       MI.assertInt(a);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],\r
+                       function (j)\r
+                       {\r
+                               var v=MI.bstr2uintArray(j.result[0]);\r
+                               if(_t._event.onRead32){_t._event.onRead32(v);}\r
+                               if(_t._gen){_t._gen.next(v);}\r
+                                _t._lc=null;\r
+                       });\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * 32bit unsigned intをメモリへ書き込みます。\r
+        * 関数の完了時にonWrite32イベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.Memory#write32\r
+        * @function\r
+        * @param {int} i_addr\r
+        * 書き込み先のメモリアドレスを指定します。\r
+        * @param {int|int[]} i_v\r
+        * 書き込むbyte配列、または数値を指定します。\r
+        * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       write32:function Memory_write32(i_addr,i_v)\r
+       {\r
+               try{\r
+                       var _t=this;\r
+                       if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
+                       _t._lc=CLASS.write32;\r
+                       MI.assertInt(i_addr);\r
+                       MI.assertInt(i_v);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.uintArray2bstr(i_v)+"\"",\r
+                       function (j)\r
+                       {\r
+                               if(_t._event.onWrite){_t._event.onWrite32();}\r
+                               if(_t._gen){_t._gen.next();}\r
+                                _t._lc=null;\r
+                       }\r
+                       );\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       }\r
+}\r
+NS.Memory=CLASS;\r
+}());
\ No newline at end of file