OSDN Git Service

JSAPIのSerial,I2C,Memoryクラスを追加
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.I2C.js
diff --git a/misc/mbedJS/mbddJS.API/mbedJS/mbed.I2C.js b/misc/mbedJS/mbddJS.API/mbedJS/mbed.I2C.js
new file mode 100644 (file)
index 0000000..31b1e8a
--- /dev/null
@@ -0,0 +1,347 @@
+/**\r
+ * @fileOverview I2Cクラスを定義します。\r
+ */\r
+(function(){\r
+var NS=mbedJS;\r
+var MI=MiMicJS;\r
+\r
+/**\r
+ * I2Cクラスです。\r
+ * <a href="https://mbed.org/handbook/I2C">mbed::I2C</a>と同等の機能を持ちます。\r
+ * @constructor\r
+ * @name mbedJS.I2C\r
+ * @param {mbedJS.Mcu} i_mcu\r
+ * インスタンスをバインドするMCUオブジェクトです。\r
+ * @param {[PinName,PinName]} i_params\r
+ * i2Cバスを構成するピンIDを指定します。sda,sclの順番です。\r
+ * @param {HashMap|Generator} i_event\r
+ * 非同期イベントハンドラの連想配列、又はGeneratorです。\r
+ * <p>\r
+ * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
+ * <ul>\r
+ * <li>{function()} onNew -\r
+ * インスタンスが使用可能になった時に呼び出されます。\r
+ * </li>\r
+ * <li>{function()} onFrequency -\r
+ * frequency関数が完了したときに呼び出されます。\r
+ * </li>\r
+ * <li>{function(ret,data)} onRead -\r
+ * read関数が完了したときに呼び出されます。\r
+ * <ul>\r
+ * <li>ret {int}-は成功/失敗フラグを返します。read.1とread.2の場合で意味が異なります。\r
+ * read.1の場合、 0:ACK(成功),1:NACK(失敗)です。read.2の場合、読みだした値です。</li>\r
+ * <li>data {byte[]}-読みだしたデータの配列です。read.1の場合のみ有効です。</li>\r
+ * </ul> \r
+ * </li>\r
+ * <li>{function(ret)} onWrite -\r
+ * write関数が完了したときに呼び出されます。\r
+ * <ul>\r
+ * <li>ret {int}-成功/失敗フラグを返します。write.1とwrite.2の場合で意味が異なります。\r
+ * write.1の場合、ACK:0(成功),NACK:それ以外です。write.2の場合、ACKを受信すると1を返します。</li>\r
+ * </ul> \r
+ * </li>\r
+ * <li>{function()} onStart -\r
+ * start関数が完了したときに呼び出されます。\r
+ * </li>\r
+ * <li>{function()} onStop -\r
+ * stop関数が完了したときに呼び出されます。\r
+ * </li>\r
+ * </ul>\r
+ * <p>\r
+ * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
+ * <p>\r
+ * @return {mbedJS.I2C}\r
+ * @example //Callback\r
+ * var mcu=new mbedJS.Mcu("192.168.128.39",\r
+ * {\r
+ *   onNew:function(){\r
+ *     var pin=new mbedJS.I2C(mcu,mbedJS.PinName.A0,{\r
+ *     onNew:function(){\r
+ *       pin.read();\r
+ *     },\r
+ *     onRead:function(v)\r
+ *     {\r
+ *       pin.read_u16();\r
+ *     },\r
+ *     onRead_u16:function(v){\r
+ *       mcu.close();\r
+ *     }});\r
+ *   },\r
+ *   onClose:function(){},\r
+ *   onError:function(){}\r
+ * });\r
+ * @example //Generator\r
+ * var g=function*(){\r
+ * try{\r
+ *   var mcu=new mbedJS.Mcu("192.168.128.39",g);\r
+ *   yield mcu.waitForNew();\r
+ *   var pin=new mbedJS.I2C(mcu,mbedJS.PinName.A0,g);\r
+ *   yield pin.waitForNew();\r
+ *   var v=yield pin.read();\r
+ *   v=yield pin.read_u16();\r
+ *   yield mcu.close();\r
+ * }catch(e){\r
+ *   mcu.shutdown();\r
+ * }}();\r
+ * g.next();\r
+ */\r
+var CLASS=function I2C(i_mcu,i_params,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
+                       _t._oid=j.result[0];\r
+                       if(_t._event.onNew){_t._event.onNew();}\r
+                       if(_t._gen){_t._gen.next(_t);}\r
+                       _t._lc=null;\r
+               }\r
+               MI.assertInt(i_params);         \r
+               return _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1],cb);\r
+       }catch(e){\r
+               throw new MI.MiMicException(e);\r
+       }       \r
+}\r
+CLASS.prototype=\r
+{\r
+       /** @private */\r
+       RPC_NS:"mbedJS:I2C",\r
+       /** @private 最後にコールしたAPIです。*/\r
+       _lc:null,\r
+       /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
+       _gen:null,\r
+       /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
+       _event:{},\r
+       /** @private リモートインスタンスのオブジェクトIDです。*/\r
+       _oid:null,\r
+       /**\r
+        * Generatorモードのときに使用する関数です。\r
+        * Generatorモードの時は、yieldと併用してnew I2C()の完了を待ちます。\r
+        * @name mbedJS.I2C#waitForNew\r
+        * @function\r
+        */\r
+       waitForNew:function I2C_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
+        * Hz単位でバスの速度を指定します。\r
+        * 関数の完了時にonFrequencyイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2C#frequency\r
+        * @function\r
+        * @param {int} i_hz\r
+        * Hz単位のバス速度です。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       frequency:function I2C_frequency(i_hz)\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.frequency;\r
+                       MI.assertInt(i_hz);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":frequency",_t._oid+","+i_hz,\r
+                       function (j)\r
+                       {\r
+                               if(_t._event.onFrequency){_t._event.onFrequency();}\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
+        * 引数が3個の場合\r
+        * @name mbedJS.I2C#read.1\r
+        * @function\r
+        * @param {int} address\r
+        * 8ビットのI2CSlaveアドレスです。\r
+        * @param {int} length\r
+        * 読み出すデータの長さです。256未満の値を指定してください。\r
+        * @param {boolean} repeated\r
+        * Repeated start, true - do not send stop at end\r
+        * Optionalです。省略時はfalseです。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {HashMap}\r
+        * {ret:int,data:[byte]}\r
+        * Generatorの場合は戻り値オブジェクトを返します。\r
+        * <ul>\r
+        * <li>ret {int}- 成功フラグ 0:ACK(成功),1:NACK(失敗)</li>\r
+        * <li>data {byte[]}- 読みだしたデータ</li>\r
+        * </ul>\r
+        */\r
+       /**\r
+        * 引数が1個の場合\r
+        * @name mbedJS.I2C#read.2\r
+        * @function\r
+        * @param {int} ack\r
+        * indicates if the byte is to be acknowledged (1 = acknowledge)\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は読みだした値を返します。\r
+        */\r
+       /**\r
+        * バスから値を読み出します。\r
+        * 関数の完了時にonReadイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2C#read\r
+        * @function\r
+        * @param ...\r
+        * 詳細はmbedJS.I2C#read.Nを参照してください。\r
+        */     \r
+       read:function I2C_read(/*...*/)\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.read;\r
+                       function cb(j){\r
+                               var v=j.result.length>1?{ret:j.result[0],data:MI.bstr2byteArray(j.result[1])}: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
+                       if(arguments.length==1){\r
+                               MI.assertInt(arguments[0]);\r
+                               return _t._mcu.rpc(_t.RPC_NS+":read2",_t._oid+","+arguments[0],cb);\r
+                       }else{\r
+                               var a=arguments;\r
+                               MI.assertInt([a[0],a[1]]);\r
+                               return _t._mcu.rpc(_t.RPC_NS+":read1",_t._oid+","+a[0]+","+a[1]+","+(a[2]?1:0),cb);\r
+                       }\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * 引数が3個の場合\r
+        * @name mbedJS.I2C#write.1\r
+        * @function\r
+        * @param {int} address\r
+        * 8ビットのI2CSlaveアドレスです。\r
+        * @param {byte[]} data\r
+        * 送信するデータを格納したバイト配列です。\r
+        * @param {boolean} repeated\r
+        * Repeated start, true - do not send stop at end\r
+        * Optionalです。省略時はfalseです。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は成功/失敗フラグを返します。ACK:0(成功),NACK:それ以外です。\r
+        */\r
+       /**\r
+        * 引数が1個の場合\r
+        * @name mbedJS.I2C#write.2\r
+        * @function\r
+        * @param {int} data\r
+        * 送信データを指定します。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は成功/失敗フラグを返します。ACKを受信すると1を返します。\r
+        */     \r
+       /**\r
+        * バスに値を書き込みます。\r
+        * 関数の完了時にonWriteイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2C#write\r
+        * @function\r
+        * @param ...\r
+        * 詳細はmbedJS.I2C#write.Nを参照してください。\r
+        */     \r
+       write:function I2C_write(/*...*/)\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
+                       function cb(j){\r
+                               var v=j.result[0];\r
+                               if(_t._event.onWrite){_t._event.onWrite(v);}\r
+                               if(_t._gen){_t._gen.next(v);}\r
+                                _t._lc=null;\r
+                       }\r
+                       if(arguments.length==1){\r
+                               MI.assertInt(arguments[0]);\r
+                               return _t._mcu.rpc(_t.RPC_NS+":write2",_t._oid+","+arguments[0],cb);\r
+                       }else{\r
+                               var a=arguments;\r
+                               MI.assertInt(a[0]);\r
+                               return _t._mcu.rpc(_t.RPC_NS+":write1",_t._oid+","+a[0]+",\""+MI.byteArray2bstr(a[1])+"\","+(a[2]?1:0),cb);\r
+                       }\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }                       \r
+       },\r
+       /**\r
+        * I2Cバスを開始状態にします。\r
+        * 関数の完了時にonStartイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2C#start\r
+        * @function\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       start:function I2C_start()\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.start;                     \r
+                       return _t._mcu.rpc(_t.RPC_NS+":start",_t._oid,\r
+                       function (j)\r
+                       {\r
+                               if(_t._event.onStart){_t._event.onStart();}\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
+        * I2Cバスを停止状態にします。\r
+        * 関数の完了時にonStopイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2C#stop\r
+        * @function\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       stop:function I2C_stop()\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.stop;                      \r
+                       return _t._mcu.rpc(_t.RPC_NS+":stop",_t._oid,\r
+                       function (j)\r
+                       {\r
+                               if(_t._event.onStop){_t._event.onStop();}\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.I2C=CLASS;\r
+}());
\ No newline at end of file