1 /**
  2  * @fileOverview LPCXpresso1769のポート(ピンセット)を制御するクラスを定義する。
  3  */
  4 
  5 (function(){
  6 var DEV=LPCXpresso1769;
  7 var BCF=DEV._BCF;
  8 var EE=DEV._EE;
  9 var isUndef=MiMicLib.isUndef;
 10 
 11 /**
 12  * @private
 13  * レジスタの内容
 14  */
 15 var REG={
 16 	_PINSEL:[0x4002C000,0x4002C004,0x4002C008,0x4002C00C,0x4002C010,null,null,0x4002C0C0,null,0x4002C024,0x4002C028],
 17 	_PINMODE:[0x4002C040,0x4002C044,0x4002C048,0x4002C04C,0x4002C050,0x4002C054,0x4002C058,0x4002C05C,null,0x4002C064],
 18 	_PINMODE_OD:[0x4002C068,0x4002C06C,0x4002C070,0x4002C074,0x4002C078],
 19 };
 20 /**
 21  * LPCXPresso1769.Port (Port)クラスのコンストラクタ。
 22  * ピン識別子を元に、MCUに関連付けたPortインスタンスを生成する。
 23  * Portクラスは、複数の物理ピンをまとめて、操作インタフェイスを定義する。
 24  * PINSEL,PINMODE,PINMODE_ODレジスタを管理する。
 25  * @name LPCXpresso1769.Port
 26  * @constructor
 27  * @param {object as LPCXpresso1769.Mcu} i_mcu
 28  * インスタンスを結びつけるMcuオブジェクト。
 29  * @param {array[object as ピン識別子]} i_pin
 30  * ポートを構成するピンの配列。
 31  * @param {array[object as associative array]} i_opt
 32  * インスタンス生成と同時にsetOpt関数で設定する値。省略時は無視する。
 33  * 詳細はsetOpt関数を参照。
 34  * このクラスは、上位クラスへピンの基本的な操作機能を提供する為のものであり、ユーザが直接使用することは(あまり)ない。
 35  * この関数は、MiMicの管理しているピン(ENET_?)も操作することが出来るが、操作してしまうとMiMicRemoteMcuとのコネクションが破壊されるので、注意すること。
 36  * @example
 37  * //create pin instance at P0[0]
 38  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);
 39  * var port=new LPCXpresso1769.Port(mcu,[LPCXpresso.P0[0]]);
 40  */
 41 DEV.Port=function Port(i_mcu,i_pins,i_opts)
 42 {
 43 	try{
 44 		this._mcu=i_mcu;
 45 		this._pininfo=new Array();
 46 		//ピン情報に変換
 47 		for(var i=0;i<i_pins.length;i++){
 48 			this._pininfo.push(DEV.getPinRegInfo(i_pins[i]));
 49 		}
 50 		if(!isUndef(i_opts)){
 51 			this.setOpts(i_opts);
 52 		}
 53 	}catch(e){
 54 		throw new MiMicException(e);
 55 	}		
 56 }
 57 
 58 DEV.Port.prototype=
 59 {
 60 	_mcu:null,
 61 	/**
 62 	 * 複数のピン設定をレジスタごとにまとめたBCを生成する。
 63 	 @private
 64 	 */
 65 	BCF_setOpts:function BCF_setOpts(i_opts,i_db)
 66 	{
 67 		try{
 68 			//10/5レジスタ分のワーク領域を作る。
 69 			var d={
 70 				selr:[0,0,0,0,0,0,0,0,0,0],
 71 				selr_mask:[0,0,0,0,0,0,0,0,0,0],
 72 				modr:[0,0,0,0,0,0,0,0,0,0],
 73 				modr_mask:[0,0,0,0,0,0,0,0,0,0],
 74 				odr:[0,0,0,0,0],
 75 				odr_mask:[0,0,0,0,0]};
 76 	
 77 			//pinsとoptsの数は同じだよね?
 78 			if(this._pininfo.length!=i_opts.length){
 79 				throw new MiMicException();
 80 			}
 81 			
 82 			//レジスタ値、マスクの生成
 83 			for(var i=0;i<i_opts.length;i++)
 84 			{
 85 				var pi=this._pininfo[i];
 86 				var opt=i_opts[i];
 87 				if(!isUndef(opt.sel))
 88 				{
 89 					d.selr[pi.s]|=(opt.sel<<pi.smb);
 90 					d.selr_mask[pi.s]|=(0x3<<pi.smb);
 91 				}
 92 				if(!isUndef(opt.mode))
 93 				{
 94 					d.modr[pi.m]|=(opt.mode<<pi.smb);
 95 					d.modr_mask[pi.m]|=(0x3<<pi.smb);
 96 				}
 97 				if(!isUndef(opt.od))
 98 				{
 99 					d.odr[pi.o]|=(opt.od<<pi.ob);
100 					d.odr_mask[pi.o]|=(0x1<<pi.ob);
101 				}
102 			}
103 			//BCFを生成
104 			var bc="";
105 			for(var i=0;i<10;i++){
106 				if(d.selr_mask[i]!=0x0){
107 					bc+=BCF.setBit(REG._PINSEL[i],d.selr_mask[i],d.selr[i],0,i_db);
108 				}
109 				if(d.modr_mask[i]!=0x0){
110 					bc+=BCF.setBit(REG._PINMODE[i],d.modr_mask[i],d.modr[i],0,i_db);
111 				}
112 			}
113 			for(var i=0;i<5;i++){
114 				if(d.odr_mask[i]!=0x0){
115 					bc+=BCF.setBit(REG._PINMODE_OD[i],d.odr_mask[i],d.odr[i],0,i_db);
116 				}
117 			}
118 			return bc;
119 		}catch(e){
120 			throw new MiMicException(e);
121 		}
122 	},
123 	/**
124 	 * ポートにオプションパラメータをセットする。
125 	 * 関数は、ポートを構成するピンに、ピンオプション配列の値を個別に設定する。
126 	 * @name LPCXpresso1769.Port#setOpts
127 	 * @function
128 	 * @param {array[object as associative array]} i_opts
129 	 * ピンコンフィグレーションのパラメタの配列である。個々の要素は、ピンオプションである。ピンオプションの構造は、Pin#setOptを参照。
130 	 * 配列の要素数は、ポートを構成するピンの数と同じでなければならない。
131 	 * @example
132 	 * //set GPIO,mode=1,open drain=0
133 	 * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);
134 	 * var port=new LPCXpresso1769.Port(mcu,[LPCXpresso.P2[3],LPCXpresso.P2[4]]);
135 	 * port.setOpts([{sel:0,mode:1,od:0},{sel:0,mode:1,od:0}]);	
136 	 */	
137 	setOpts:function setOpts(i_opts)
138 	{
139 		try{
140 			var db=new Array();
141 			var bc=this.BCF_setOpts(i_opts,db);
142 			if(bc.length==0){
143 				throw new MiMicException("i_opt is empty or invalid.");
144 			}
145 			//MiMicBCを生成して実行
146 			this._mcu.callMiMicWithCheck(bc+BCF.END,db);
147 		}catch(e){
148 			throw new MiMicException(e);
149 		}
150 		return;
151 	}	
152 }
153 
154 }());