OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@106 47198e57-cb75-475f-84c4-a814cd...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXpresso1769.Pwm.js
index da5a04b..24f6c43 100644 (file)
@@ -117,8 +117,21 @@ DEV.Pwm.prototype=
        },\r
        BCF_setLER:function BCF_setLER(i_ch,i_db)\r
        {\r
-               //LERにビットをセット\r
-               return BCF.setBit(this._LER,0x01,0x01,i_ch,i_db);\r
+               try{\r
+                       //LERにビットをセット\r
+                       return BCF.setBit(this._LER,0x01,0x01,i_ch,i_db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       BCF_setLERs:function BCF_setLERs(i_mask,i_value,i_db)\r
+       {\r
+               try{\r
+                       //LERにビットをセット\r
+                       return BCF.setBit(this._LER,i_mask,i_value*i_mask,0,i_db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
        },\r
        \r
        /**\r
@@ -145,32 +158,34 @@ DEV.Pwm.prototype=
         * PCRに値を設定するBC\r
         i_ch=1の場合、エッジモードは無視します。\r
         @private\r
-        @param i_ch\r
-        1-6\r
+        @param i_mask\r
         @param i_edge\r
         エッジモード(1/0)\r
         @param i_en\r
        有効/無効の選択\r
         */\r
-       BCF_setPCRbit:function BCF_setPCR(i_ch,i_edge,i_en,i_db)\r
+       BCF_setPCRbits:function BCF_setPCRbits(i_mask,i_edge,i_en,i_db)\r
        {\r
                try{\r
                        var m,v;\r
                        m=v=0;\r
                        if(!isUndef(i_edge)){\r
-                               v|=i_edge;\r
-                               m|=0x00000001;\r
+                               var t=0xff&i_mask;\r
+                               v|=i_edge*t;\r
+                               m|=t;\r
                        }\r
                        if(!isUndef(i_en)){\r
-                               v|=(i_en<<8);\r
-                               m|=0x00000100;\r
+                               var t=0xff00&i_mask;\r
+                               v|=(i_en*t);\r
+                               m|=t;\r
                        }\r
                        //ビットの設定\r
-                       return BCF.setBit(this._PCR,m,v,i_ch,i_db);\r
+                       return BCF.setBit(this._PCR,m,v,0,i_db);\r
                }catch(e){\r
                        throw new MiMicException(e);\r
                }\r
        },\r
+       \r
        /**\r
         * Pwmペリフェラルに値を設定する。\r
         * 設定する値は、全てのPWMチャンネル(PIN)に共通な項目である。\r
@@ -226,102 +241,250 @@ DEV.Pwm.prototype=
                }catch(e){\r
                        throw new MiMicException(e);\r
                }\r
+       },\r
+       /**\r
+        * PWM機能を持つポート(Pin集合)を取得する。\r
+        * ピン識別子で指定されるピンのセットをPWMペリフェラルと結合して、PwmPortを生成する。\r
+        * 関数は、PwmPortのコンストラクタをコールする。\r
+        * 生成ルールについては、PwmPort関数を参照すること。\r
+        * @name LPCXpresso1769.Pwm#getPort\r
+        * @function\r
+        * @param {array[ピン識別子]} i_pin\r
+        * Pwm機能を割り当てるPINの識別子の配列である。値は、LPCXpresso1769.Pn[m]のメンバ変数である。\r
+        * @param {object as associative array} i_opt\r
+        * AdcPortのコンストラクタに渡すオプション値。省略時はundefinedである。詳細はLPCXpresso1769.PwmPort.setOptを参照。\r
+        * @return {object as LPCXpresso1769.PwmPort}\r
+        * LPCXpresso1769.PwmPortクラスのオブジェクトである。\r
+        * @example\r
+        * //create 2AdcPort that has 2 pins.\r
+        * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
+        * var pwm=new LPCXpresso1769.Pwm(mcu);\r
+        * var port=pwm.getPort([LPCXpresso1769.P0[23],LPCXpresso1769.P0[24]]);\r
+        */\r
+       getPort:function getPort(i_pins,i_opt)\r
+       {\r
+               try{\r
+                       return new DEV.PwmPort(this,i_pins,i_opt);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
        }       \r
 }\r
 \r
 /**\r
- * PwmペリフェラルとPin識別子から、シングルエッジPwmピンを構成する。\r
- * Pwmペリフェラルオブジェクトにピン識別子で指定されたピンを関連付けて、PWM機能を持つピンを生成する。\r
- * 関数は、ピン識別子を元に、そのピンがPWM機能に接続できるかを調べる。ピンにPWM機能を割り当てられない場合、例外が発生する。どのピンにPWM機能が割り当てられるかは、MCUのスペックシートを参照すること。\r
- * ピンがPWM機能を持たない場合、例外が発生する。\r
+ * Pwm pinからPwmInfoを取得\r
+ * @private\r
+ */\r
+function pin2PwmPinInfo(i_pin)\r
+{\r
+       try{\r
+               //pinの完全な機能名を得る。(得られれば機能がある。)\r
+               var fn=DEV.completePinFunctionName(i_pin,"PWM");\r
+               //portとbitを得る(AD0だけしか管理しないよ)\r
+               var a=fn.substring(2).split(".");\r
+               var r={port:0,ch:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,fn)};\r
+               if(!isNaN(r.ch)){\r
+                       return r;\r
+               }\r
+               throw new MiMicException(EE.INVALID_CFG,"The pin has not PWM fuction.");\r
+       }catch(e){\r
+               throw new MiMicException(e);    \r
+       }\r
+}\r
+/**\r
+ * Pwmペリフェラルと複数のPin識別子から、シングルエッジPwmポートを構成する。\r
+ * Pwmペリフェラルオブジェクトにピン識別子の配列で指定されたピンを関連付けて、PWM機能を持つポートを生成する。\r
+ * 関数は、ピン識別子を元に、それぞれのピンがPWM機能に接続できるかを調べる。\r
+ * ピンにPWM機能を割り当てられない場合、例外が発生する。どのピンにPWM機能が割り当てられるかは、MCUのスペックシートを参照すること。\r
+ * PWMポートは、複数の同一周期のPWMピンのデューティ比を、同期して操作するときに便利である。\r
  * @constructor\r
- * @name LPCXpresso1769.PwmPin\r
+ * @name LPCXpresso1769.PwmPort\r
  * @param {object as LPCXpresso1769.Pwm} i_pwm\r
- * インスタンスを結びつけるAdcオブジェクト。\r
- * @param {object as pin識別子} i_pin\r
- * ピン識別子。指定できるのは、LPCXpresso1796.P?[?]である。\r
+ * インスタンスを結びつけるPwmオブジェクト。\r
+ * @param {array[pin識別子]} i_pins\r
+ * ã\83\94ã\83³è­\98å\88¥å­\90ã\81®é\85\8då\88\97ã\80\82æ\8c\87å®\9aã\81§ã\81\8dã\82\8bã\81®ã\81¯ã\80\81LPCXpresso1796.P?[?]ã\81§ã\81\82ã\82\8bã\80\82\r
  * @param {object as associative array} i_opt\r
  * setOpt関数のi_optに渡すパラメタである。省略可能。省略時は{duty:100,enable:1,pin{sel:auto}}を設定する。\r
  * autoは、関数が自動的に決定するPINSELの値である。詳細はsetOpt関数を参照。 \r
+ * dutyをピン毎に設定する場合は、setDuty関数を使うこと。\r
  * @example\r
- * //create PWM1.0\r
+ * //create PWM1.0,PWM1.1\r
  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
  * var pwm=new LPCXpresso1769.Pwm(mcu,{freq:100});\r
- * var pwmpin=new LPCXpresso1769.PwmPin(pwm,P2[0]); \r
+ * var port=new LPCXpresso1769.PwmPort(pwm,[LPCXpresso1769.P2[0],LPCXpresso1769.P2[1]]); \r
  */\r
-DEV.PwmPin=function PwmPin(i_pwm,i_pin,i_opt)\r
+DEV.PwmPort=function PwmPort(i_pwm,i_pins,i_opt)\r
 {\r
        try{\r
                this._pwm=i_pwm;\r
-               //PINがPWM持ってるか確認\r
-               this._pin=new DEV.Pin(i_pwm._mcu,i_pin);\r
-               //PinNameからピン情報を得る。\r
-               this._pwminfo=function(i_pin){\r
-                       //pinの完全な機能名を得る。(得られれば機能がある。)\r
-                       var func_name=DEV.completePinFunctionName(i_pin,"PWM");\r
-                       //portとbitを得る(AD0だけしか管理しないよ)\r
-                       var a=func_name.substring(2).split(".");\r
-                       var r={port:0,ch:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,func_name)};\r
-                       if(!isNaN(r.ch)){\r
-                               return r;\r
+               //ピンセットを取得\r
+               this._pins=new Array();\r
+               //pinに変換する。\r
+               for(var i=0;i<i_pins.length;i++){\r
+                       this._pins.push(pin2PwmPinInfo(i_pins[i]));\r
+               }\r
+               //pinが全て同じポートに所属しているか確認\r
+               var p=this._pins[0].port;\r
+               for(var i=1;i<this._pins.length;i++){\r
+                       if(p!=this._pins[1].port){\r
+                               throw new MiMicException("Invalid pin combination.");\r
                        }\r
-                       throw new MiMicException(EE.INVALID_CFG,"The pin has not PWM fuction.");\r
-               }(i_pin);\r
-               //設定用のBCを作って実行\r
-               {\r
-                       var opt=isUndef(i_opt)?{pin:{}}:\r
-                       {\r
-                               pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin),\r
-                               duty:i_opt.duty,\r
-                               enable:i_opt.enable\r
-                       };\r
-                       //デフォルト値のロード\r
-                       if(isUndef(opt.pin.sel)){ opt.pin.sel=this._pwminfo.pin_sel;}\r
-                       if(isUndef(opt.duty)){opt.duty=0;}\r
-                       if(isUndef(opt.enable)){opt.enable=1;}\r
-                       this.setOpt(opt);\r
                }\r
+               //ポートの生成\r
+               this._port=new DEV.Port(i_pwm._mcu,i_pins);\r
+               this._port_no=p;\r
+               \r
+               this._ler_mask=0;\r
+               this._pcr_mask=0;\r
+               for(var i=0;i<this._pins.length;i++){\r
+                       this._ler_mask|=(0x1<<this._pins[i].ch);\r
+                       this._pcr_mask|=(0x101<<this._pins[i].ch);\r
+               }               \r
+               var opt=isUndef(i_opt)?{pin:{}}:\r
+               {\r
+                       pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin),\r
+                       duty:i_opt.duty,\r
+                       enable:i_opt.enable\r
+               };\r
+               //デフォルト値のロード\r
+               if(isUndef(opt.pin.sel)){opt.pin.sel=this._PINSEL_AUTO_DETECT;}\r
+               if(isUndef(opt.duty)){opt.duty=0;}\r
+               if(isUndef(opt.enable)){opt.enable=1;}\r
+               this.setOpt(opt);\r
        }catch(e){\r
                throw new MiMicException(e);\r
-       }\r
+       }       \r
 }\r
-\r
-DEV.PwmPin.prototype=\r
+DEV.PwmPort.prototype=\r
 {\r
+       _PINSEL_AUTO_DETECT:0x0fffffff,\r
        _pwm:null,\r
-       _pin:null,\r
-       _pwminfo:null,\r
+       _pins:null,\r
+       _port_no:0,\r
+       _port:null,\r
+       _pcr_mask:0,\r
+       _ler_mask:0,\r
        /**\r
-        * \r
-        @private\r
-        @param i_opt\r
-        シングルエッジPWMのオプション値を設定する。\r
-        {pin:{ピン初期化パラメタ},enable:有効値,duty:デューティ比}}
+        * PWMポートにオプション値を設定する。\r
+        * 関数は、ポートを構成する全てのピンに、同じ値を設定する。\r
+        * 設定可能な値は、LPCXpresso1769.PwmPin#setOptと同じである。     \r
+        * @name LPCXpresso1769.PwmPort#setOpt\r
+        * @function\r
+        * @param {object as associative array} i_opt\r
+        * LPCXpresso1769.PwmPin#setOptを参照。\r
+        * @example\r
+        * var mcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
+        * var pwm=mcu.getPeripheral("PWM",{freq:100});\r
+        * var port=pwm.getPort([LPCXpresso1769.P2[0]]);\r
+        * port.setOpt({enable:0});\r
         */\r
-       BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
+       setOpt:function setOpt(i_opt)\r
        {\r
                try{\r
+                       var db=new Array();\r
+                       //BCの生成\r
                        var bc="";\r
-                       //pinselの値\r
+                       //i_optの展開\r
                        if(!isUndef(i_opt.pin)){\r
-                               //PINSEL設定\r
-                               bc+=this._pin.BCF_setOpt(i_opt.pin,i_db);\r
+                               var optset=new Array();\r
+                               for(var i=0;i<this._pins.length;i++){\r
+                                       //pinselが_PINSEL_AUTO_DETECTならばauto。そうでなければundefinedも含めて設定\r
+                                       var s=(i_opt.pin.sel==this._PINSEL_AUTO_DETECT)?this._pins[i].pin_sel:i_opt.pin.sel;\r
+                                       optset.push({sel:s,mode:i_opt.pin.mode,od:i_opt.pin.od});\r
+                               }\r
                        }\r
+                       //portの設定\r
+                       bc+=this._port.BCF_setOpts(optset,db);\r
                        //PCRに値設定\r
                        if(!isUndef(i_opt.enable)){\r
-                               bc+=this._pwm.BCF_setPCRbit(this._pwminfo.ch,0,i_opt.enable,i_db);\r
+                               bc+=this._pwm.BCF_setPCRbits(this._pcr_mask,0,i_opt.enable,db);\r
                        }\r
-                       //MRnに値設定してLERにセット\r
+                       //デューティ比を\r
                        if(!isUndef(i_opt.duty)){\r
-                               bc+=this._pwm.BCF_setMRnByDuty(this._pwminfo.ch,i_opt.duty,i_db);\r
-                               bc+=this._pwm.BCF_setLER(this._pwminfo.ch,i_db);\r
+                               //デューティ比を設定\r
+                               for(var i=0;i<this._pins.length;i++){\r
+                                       bc+=this._pwm.BCF_setMRnByDuty(this._pins[i].ch,i_opt.duty,db);\r
+                               }\r
+                               //LERにセット\r
+                               bc+=this._pwm.BCF_setLERs(this._ler_mask,1,db);\r
                        }\r
-                       return bc;\r
+                       this._pwm._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+                       return;\r
                }catch(e){\r
                        throw new MiMicException(e);\r
                }\r
        },\r
        /**\r
+        * PWMポートのデューティ比をまとめて変更する。\r
+        * @name LPCXpresso1769.PwmPort#setDutys\r
+        * @function\r
+        * @param {array[double]} i_duty_array\r
+        * デューティ比の配列である。0.0<=n<=1.0のdouble値を指定する。\r
+        * ポートを構成するピンの数だけ指定する。変更しないピンには、undefinedを指定すること。\r
+        * @example\r
+        * varmcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
+        * var pwm=mcu.getPeripheral("PWM",{freq:100});\r
+        * var port=pwm.getPort([LPCXpresso1769.P2[0],LPCXpresso1769.P2[1]]);\r
+        * pwm.setDutys([0.5,0.0]);//PWM0=0.5,PWM1=0.0\r
+        * pwm.setDutys([undefined,0.0]);//PWM1=0.0\r
+        */     \r
+       setDutys:function setDutys(i_duty_array)\r
+       {\r
+               try{\r
+                       if(i_duty_array.length!=this._pins.length){\r
+                               throw new MiMicException(e);\r
+                       }\r
+                       var bc="";\r
+                       var db=new Array();\r
+                       //デューティ比をまとめてセット\r
+                       for(var i=0;i<this._pins.length;i++){\r
+                               if(!isUndef(i_duty_array[i])){\r
+                                       bc+=this._pwm.BCF_setMRnByDuty(this._pins[i].ch,i_duty_array[i],db);\r
+                               }\r
+                       }\r
+                       //LERにセット\r
+                       bc+=this._pwm.BCF_setLERs(this._ler_mask,1,db);\r
+                       this._pwm._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       }\r
+}\r
+/**\r
+ * PwmペリフェラルとPin識別子から、シングルエッジPwmピンを構成する。\r
+ * Pwmペリフェラルオブジェクトにピン識別子で指定されたピンを関連付けて、PWM機能を持つピンを生成する。\r
+ * 関数は、ピン識別子を元に、そのピンがPWM機能に接続できるかを調べる。ピンにPWM機能を割り当てられない場合、例外が発生する。どのピンにPWM機能が割り当てられるかは、MCUのスペックシートを参照すること。\r
+ * ピンがPWM機能を持たない場合、例外が発生する。\r
+ * @constructor\r
+ * @name LPCXpresso1769.PwmPin\r
+ * @param {object as LPCXpresso1769.Pwm} i_pwm\r
+ * インスタンスを結びつけるAdcオブジェクト。\r
+ * @param {object as pin識別子} i_pin\r
+ * ピン識別子。指定できるのは、LPCXpresso1796.P?[?]である。\r
+ * @param {object as associative array} i_opt\r
+ * setOpt関数のi_optに渡すパラメタである。省略可能。省略時は{duty:100,enable:1,pin{sel:auto}}を設定する。\r
+ * autoは、関数が自動的に決定するPINSELの値である。詳細はsetOpt関数を参照。 \r
+ * @example\r
+ * //create PWM1.0\r
+ * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
+ * var pwm=new LPCXpresso1769.Pwm(mcu,{freq:100});\r
+ * var pwmpin=new LPCXpresso1769.PwmPin(pwm,P2[0]); \r
+ */\r
+DEV.PwmPin=function PwmPin(i_pwm,i_pin,i_opt)\r
+{\r
+       try{\r
+               //1pinのポートとして実装\r
+               this._pport=new DEV.PwmPort(i_pwm,[i_pin],i_opt);\r
+       }catch(e){\r
+               throw new MiMicException(e);\r
+       }\r
+}\r
+\r
+DEV.PwmPin.prototype=\r
+{\r
+       _pport:null,\r
+\r
+       /**\r
         * PWMピンにオプション値を設定する。\r
         * @name LPCXpresso1769.PwmPin#setOpt\r
         * @function\r
@@ -335,16 +498,15 @@ DEV.PwmPin.prototype=
         * <li>duty - デューティ比である。0.0<=n<=1.0のdouble値を指定する。</li>\r
         * </ul>\r
         * @example\r
-        * var  mcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
+        * var mcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
         * var pwm=mcu.getPeripheral("PWM",{freq:100});\r
-        * pwmpin=pwm.getPin(LPCXpresso1769.P2[0]);\r
-        */             \r
+        * var pin=pwm.getPin(LPCXpresso1769.P2[0]);\r
+        * pin.setOpt({duty:0});\r
+        */\r
        setOpt:function setOpt(i_opt)\r
        {\r
                try{\r
-                       var db=new Array();\r
-                       var bc=this.BCF_setOpt(i_opt,db);\r
-                       this._pwm._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+                       this._pport.setOpt(i_opt);\r
                }catch(e){\r
                        throw new MiMicException(e);\r
                }\r
@@ -354,7 +516,7 @@ DEV.PwmPin.prototype=
         * @name LPCXpresso1769.PwmPin#setDuty\r
         * @function\r
         * @param {double} i_duty\r
-        * デューティ比である。0.0<=n<=1.0のdouble値を指定する。</li>\r
+        * デューティ比である。0.0<=n<=1.0のdouble値を指定する。\r
         * @example\r
         * varmcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
         * var pwm=mcu.getPeripheral("PWM",{freq:100});\r
@@ -364,7 +526,7 @@ DEV.PwmPin.prototype=
        setDuty:function setDuty(i_duty)\r
        {\r
                try{\r
-                       this.setOpt({duty:i_duty});\r
+                       this._pport.setDuty([i_duty]);\r
                }catch(e){\r
                        throw new MiMicException(e);\r
                }\r