OSDN Git Service

JSAPIのSerial,I2C,Memoryクラスを追加
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.I2CSlave.js
diff --git a/misc/mbedJS/mbddJS.API/mbedJS/mbed.I2CSlave.js b/misc/mbedJS/mbddJS.API/mbedJS/mbed.I2CSlave.js
new file mode 100644 (file)
index 0000000..5c68a02
--- /dev/null
@@ -0,0 +1,372 @@
+/**\r
+ * @fileOverview I2CSlaveクラスを定義します。\r
+ */\r
+(function(){\r
+var NS=mbedJS;\r
+var MI=MiMicJS;\r
+\r
+/**\r
+ * I2CSlaveクラスです。\r
+ * <a href="https://mbed.org/handbook/I2CSlave">mbed::I2CSlave</a>と同等の機能を持ちます。\r
+ * @constructor\r
+ * @name mbedJS.I2CSlave\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(v)} onReceive -\r
+ * receive関数が完了したときに呼び出されます。\r
+ * <li>v {int}-受信ステータス値を返します。mbedJS.I2CSlave#RxStatusの値です。</li>\r
+ * </ul> \r
+ * </li>\r
+ * <li>{function()} onStop -\r
+ * stop関数が完了したときに呼び出されます。\r
+ * </li>\r
+ * <li>{function()} onAddress -\r
+ * address関数が完了したときに呼び出されます。\r
+ * </li>\r
+ * </ul>\r
+ * <p>\r
+ * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
+ * <p>\r
+ * @return {mbedJS.I2CSlave}\r
+ * @example //Callback\r
+ * var mcu=new mbedJS.Mcu("192.168.128.39",\r
+ * {\r
+ *   onNew:function(){\r
+ *     var pin=new mbedJS.I2CSlave(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.I2CSlave(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 I2CSlave(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:I2CSlave",\r
+       RxStatus:{\r
+               NoData:0,ReadAddressed:1,WriteGeneral:2,WriteAddressed:3},\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 I2CSlave()の完了を待ちます。\r
+        * @name mbedJS.I2CSlave#waitForNew\r
+        * @function\r
+        */\r
+       waitForNew:function I2CSlave_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
+        * I2CSlaveのアドレスを設定します。\r
+        * 関数の完了時にonAddressイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2CSlave#address\r
+        * @function\r
+        * @param {int} i_value\r
+        * 8ビットのアドレス値です。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       address:function I2CSlave_address(i_value)\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_value);\r
+                       return _t._mcu.rpc(_t.RPC_NS+":address",_t._oid+","+i_value,\r
+                       function(j){\r
+                               if(_t._event.onAddress){_t._event.onAddress();}\r
+                               if(_t._gen){_t._gen.next();}\r
+                                _t._lc=null;\r
+                       });\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }                       \r
+       },      \r
+       /**\r
+        * Hz単位でバスの速度を指定します。\r
+        * 関数の完了時にonFrequencyイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2CSlave#frequency\r
+        * @function\r
+        * @param {int} i_hz\r
+        * Hz単位のバス速度です。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       frequency:function I2CSlave_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
+        * 引数が2個の場合\r
+        * @name mbedJS.I2CSlave#read.1\r
+        * @function\r
+        * @param {int} length\r
+        * 読み出すデータの長さです。256未満の値を指定してください。\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
+        * 引数が0個の場合\r
+        * @name mbedJS.I2CSlave#read.2\r
+        * @function\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は読みだした値を返します。\r
+        */\r
+       /**\r
+        * バスから値を読み出します。\r
+        * 関数の完了時にonReadイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2CSlave#read\r
+        * @function\r
+        * @param ...\r
+        * 詳細はmbedJS.I2CSlave#read.Nを参照してください。\r
+        */     \r
+       read:function I2CSlave_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==0){\r
+                               return _t._mcu.rpc(_t.RPC_NS+":read2",_t._oid,cb);\r
+                       }else{\r
+                               MI.assertInt(arguments[0]);\r
+                               return _t._mcu.rpc(_t.RPC_NS+":read1",_t._oid+","+arguments[0],cb);\r
+                       }\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }                       \r
+       },\r
+       /**\r
+        * I2CSlaveバスを開始状態にします。\r
+        * 関数の完了時にonReceiveイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2CSlave#receive\r
+        * @function\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は受信ステータス値を返します。mbedJS.I2CSlave#RxStatusの値です。\r
+        */\r
+       receive:function I2CSlave_receive()\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+":receive",_t._oid,\r
+                       function (j)\r
+                       {\r
+                               var v=j.result[0];\r
+                               if(_t._event.onReceive){_t._event.onReceive(v);}\r
+                               if(_t._gen){_t._gen.next(v);}\r
+                                _t._lc=null;\r
+                       }\r
+                       );\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }                       \r
+       },\r
+       /**\r
+        * 引数が3個の場合\r
+        * @name mbedJS.I2CSlave#write.1\r
+        * @function\r
+        * @param {int} address\r
+        * 8ビットのI2CSlaveSlaveアドレスです。\r
+        * @param {byte[]} data\r
+        * 送信するデータを格納したバイト配列です。\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        * @return {int}\r
+        * Generatorモードの時は成功/失敗フラグを返します。ACK:0(成功),NACK:それ以外です。\r
+        */\r
+       /**\r
+        * 引数が1個の場合\r
+        * @name mbedJS.I2CSlave#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.I2CSlave#write\r
+        * @function\r
+        * @param ...\r
+        * 詳細はmbedJS.I2CSlave#write.Nを参照してください。\r
+        */     \r
+       write:function I2CSlave_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(!MI.isArray(arguments[0])){\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
+                               return _t._mcu.rpc(_t.RPC_NS+":write1",_t._oid+",\""+MI.byteArray2bstr(a[0])+"\"",cb);\r
+                       }\r
+               }catch(e){\r
+                       throw new MI.MiMicException(e);\r
+               }                       \r
+       },\r
+       /**\r
+        * I2CSlaveを受信状態に戻します。\r
+        * 関数の完了時にonStopイベントが発生します。\r
+        * Generatorモードの時は、yieldと併用して完了を待機できます。\r
+        * @name mbedJS.I2CSlave#stop\r
+        * @function\r
+        * @return {int}\r
+        * Callbackモードの時はRPCメソッドのインデクスを返します。\r
+        */\r
+       stop:function I2CSlave_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.I2CSlave=CLASS;\r
+}());
\ No newline at end of file