OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@96 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXPresso1769.Gpio.js
1 /**\r
2  * @fileOverview LPCXpresso1769の、GPIOペリフェラル、ピンの制御クラスを定義する。\r
3  */\r
4 \r
5 (function(){\r
6 var DEV=LPCXpresso1769;\r
7 var BCF=DEV._BCF;\r
8 var EE=DEV._EE;\r
9 var isUndef=MiMicLib.isUndef;\r
10 var cloneAssoc=MiMicLib.cloneAssoc;\r
11 \r
12 /**\r
13  * LPCXPresso1769.Gpio (Gpio)クラスのコンストラクタ。\r
14  * MCUに関連付けしたGpioペリフェラルを生成する。\r
15  * GPIOペリフェラルは、物理的には存在しない仮想ペリフェラルである。GPIOを集中管理するために定義している。\r
16  * @name LPCXpresso1769.Gpio\r
17  * @constructor\r
18  * @param {object as LPCXpresso1769.Mcu} i_mcu\r
19  * インスタンスを結びつけるMcuオブジェクト。\r
20  * @param {oject as associative array} i_opt\r
21  * 常に無視する。省略すること。\r
22  * @example\r
23  * //create GPIO (logical)pheripheral\r
24  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
25  * var gpio=new LPCXpresso1769.Gpio(mcu);
26  */\r
27 DEV.Gpio=function Gpio(i_mcu,i_opt)\r
28 {\r
29         try{\r
30                 this._mcu=i_mcu;\r
31                 i_mcu.registerPhl(this,"GPIO");\r
32         }catch(e){\r
33                 throw new MiMicException(e);\r
34         }\r
35 }\r
36 DEV.Gpio.prototype={\r
37         _FIO_DIR :[0x2009C000,0x2009C020,0x2009C040,0x2009C060,0x2009C080],\r
38         _FIO_PIN :[0x2009C014,0x2009C034,0x2009C054,0x2009C074,0x2009C094],\r
39         _FIO_SET :[0x2009C018,0x2009C038,0x2009C058,0x2009C078,0x2009C098],\r
40         _FIO_CLR :[0x2009C01C,0x2009C03C,0x2009C05C,0x2009C07C,0x2009C09C],\r
41         _FIO_MASK:[0x2009C010,0x2009C030,0x2009C050,0x2009C070,0x2009C090],\r
42         _mcu:null,\r
43         /**\r
44          * ピン用のBCF生成関数\r
45          * @private
46          */\r
47         BCF_setDir:function BCF_setDir(i_ch,i_bit,i_dir,i_db)\r
48         {\r
49                 try{\r
50                         return BCF.setBit(this._FIO_DIR[i_ch],0x00000001,i_dir,i_bit,i_db);\r
51                 }catch(e){\r
52                         throw new MiMicException(e);\r
53                 }\r
54         },\r
55         BCF_setValue:function BCF_setValue(i_ch,i_bit,i_val,i_db)\r
56         {\r
57                 /**\r
58                  * GPIOレジスタにセットするBC\r
59                 SGET #0;//GPIOの値レジスタアドレス\r
60                 SGET #1;//GPIOのMASKレジスタアドレス\r
61                 SGET #2;//MASKレジスタの値\r
62                 MPUT #2,#1;//MASK設定\r
63                 LD #2,0xffffffff\r
64                 MPUT #2,#0;//値セット\r
65                 * @private\r
66                 */\r
67                 try{\r
68                         if(i_val){\r
69                                 i_db.push(this._FIO_SET[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
70                         }else{\r
71                                 i_db.push(this._FIO_CLR[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
72                         }\r
73                         return "EA00EA01EA02DF0201FB02ffffffffDF0200";\r
74                 }catch(e){\r
75                         throw new MiMicException(e);\r
76                 }\r
77         },\r
78         /**\r
79          * @private\r
80          */\r
81         BCF_getValue:function BCF_getValue(i_ch,i_bit,i_db)\r
82         {\r
83                 /*GPIOレジスタからとってくるBC\r
84                 SGET #0;//GPIOの値レジスタアドレス\r
85                 SGET #1;//GPIOのMASKレジスタアドレス\r
86                 SGET #2;//MASKレジスタの値\r
87                 MSET #2,#1;//MASK設定\r
88                 MGET #3,#0;//値取得\r
89                 SPUT #3;//SPUT\r
90                  */\r
91                 try{\r
92                         i_db.push(this._FIO_PIN[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
93                         return "EA00EA01EA02DF0201DB0300EE03";\r
94                 }catch(e){\r
95                         throw new MiMicException(e);\r
96                 }               \r
97         },\r
98         /**\r
99          * GPIO機能を持つピンを取得する。\r
100          * ピン識別子で指定されるピンをGPIOペリフェラルと結合して、GpioPinを生成する。\r
101          * 関数は、LPCXpresso1769.GpioPinクラスのコンストラクタをコールして、GpioPinを生成する。失敗すると、例外をスローする。\r
102          * 生成ルールについての詳細は、LPCXpresso1769.GpioPinを参照。\r
103          * @name LPCXpresso1769.Gpio.getPin\r
104          * @function\r
105          * @param {object as ピン識別子} i_pin\r
106          * GPIO機能を割り当てるPINの識別子である。\r
107          * @param {object as associative array} i_opt\r
108          * GpioPinのコンストラクタに渡すオプション値を指定する。省略可能。省略時はundefinedとみなす。詳細はGpioPinのコンストラクタを参照。\r
109          * @return {object as GpioPin}\r
110          * GpioPinクラスのオブジェクトである。\r
111          * @example\r
112          * //create GpioPin direction=out\r
113          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
114          * var gpio=new LPCXpresso1769.Gpio(mcu);\r
115          * var pin=gpio.getPin(LPCXpresso1769.P0[0],{dir:1});\r
116          */\r
117         getPin:function getPin(i_pin,i_opt)\r
118         {\r
119                 try{\r
120                         return new DEV.GpioPin(this,i_pin,i_opt);\r
121                 }catch(e){\r
122                         throw new MiMicException(e);\r
123                 }\r
124         }\r
125 \r
126 }\r
127 \r
128 /**\r
129  * LPCXPresso1769.GpioPin (GpioPin)クラスのコンストラクタ。\r
130  * Gpioペリフェラルオブジェクトにピン識別子で指定されたピンを関連付けて、GPIO機能を持つピンを生成する。\r
131  * 関数は、ピン識別子を元に、そのピンがGPIO機能に接続できるかを調べる。ピンにGPIO機能を割り当てられない場合、例外が発生する。どのピンにGPIO機能が割り当てられるかは、MCUのスペックシートを参照すること。\r
132  * ピンがGPIO機能を持たない場合、例外が発生する。\r
133  * @name LPCXpresso1769.GpioPin\r
134  * @constructor\r
135  * @param i_gpio\r
136  * インスタンスを結びつけるGpioオブジェクト。\r
137  * @param {object as pin識別子} i_pin\r
138  * ピン識別子。指定できるのは、LPCXpresso1796.P?[?]である。\r
139  * @param i_opt\r
140  * setOpt関数のi_optに渡すパラメタ。省略可能。\r
141  * 省略時は、{pin:{sel:auto}}を使用する。autoは関数が自動的に決定PINSEL値である。\r
142  * 詳細はsetOpt関数を参照。\r
143  * @example\r
144  * //create GPIO Port 0.0 dir=out\r
145  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
146  * var gpio=new LPCXpresso1769.Gpio(mcu);\r
147  * var pin=new  LPCXpresso1769.GpioPin(gpio,P0[0],{dir:1}); \r
148  */\r
149 DEV.GpioPin=function GpioPin(i_gpio,i_pin,i_opt)\r
150 {\r
151         try{\r
152                 //PINを作る。\r
153                 this._gpio=i_gpio;\r
154                 this._pin=new DEV.Pin(i_gpio._mcu,i_pin);\r
155                 //pinからGPIOに関するピン情報を計算。\r
156                 this._gpioinfo=function(i_pin)\r
157                 {\r
158                         //pinの完全な機能名を得る。(得られれば機能がある。)\r
159                         var func_name=DEV.completePinFunctionName(i_pin,"GPIO");\r
160                         //pin名からポートとビットを得る。\r
161                         var a=func_name.substring(4).split(".");\r
162                         //pin情報を構成。\r
163                         var r={port:parseInt(a[0]),bit:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,func_name)};\r
164                         if(!isNaN(r.port) && !isNaN(r.bit)){\r
165                                 return r;\r
166                         }\r
167                         throw new MiMicException(EE.INVALID_CFG,"The pin has not GPIO fuction.");\r
168                 }(i_pin);\r
169                 //optの構成\r
170                 var opt=isUndef(i_opt)?{pin:{}}:\r
171                 {\r
172                         dir:i_opt.dir,\r
173                         pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin)\r
174                 }\r
175                 //デフォルト値\r
176                 if(isUndef(opt.pin.sel)){opt.pin.sel=this._gpioinfo.pin_sel;}\r
177                 //Pinのコンフィギュレーション\r
178                 this.setOpt(opt);\r
179         }catch(e){\r
180                 throw new MiMicException(e);\r
181         }\r
182 }\r
183 DEV.GpioPin.prototype=\r
184 {\r
185         _gpio:null,\r
186         _pin:null,//LPCXpressoのpin\r
187         _gpioinfo:null,//GPIOの情報{port,bit,pin_sel}\r
188         /**\r
189          * ADピンにオプション値を設定する。\r
190          * @name LPCXpresso1769.GpioPin#setOpt\r
191          * @function\r
192          * @param {object as associative array} i_opt\r
193          * GPIOピンのコンフィグレーションパラメタである。必要な値を格納した連想配列で指定する。\r
194          * 全ての値を省略することは出来ない。連想配列のメンバは以下の通り。\r
195          * <pre>{dir:int,pin:object as associative array}</pre>\r
196          * <ul>\r
197          * <li>dir - ピンのIN/OUTを指定する1bitの値。1=out,0=in</li>\r
198          * <li>pin - LPCXpresso1769.Pin#setOpt関数のi_optに渡すパラメタである。</li>\r
199          * </ul>\r
200          * @example\r
201          * //set P0[0] to output  GPIO and mode=repeter and open drain=1\r
202          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
203          * var gpiopin=mcu.getPin(LPCXpresso1769.P0[0],"GPIO");\r
204          * gpiopin.setOpt({dir:1,pin:{mode:1,od:0}});\r
205          * gpiopin.setValue(1);  \r
206          */     \r
207         setOpt:function setOpt(i_opt)\r
208         {\r
209                 try{\r
210                         var bc="";\r
211                         var db=new Array();\r
212                         //dirの設定\r
213                         if(!isUndef(i_opt.dir)){\r
214                                 bc+=this._gpio.BCF_setDir(this._gpioinfo.port,this._gpioinfo.bit,i_opt.dir,db);\r
215                         }\r
216                         //pinselの値\r
217                         if(!isUndef(i_opt.pin)){\r
218                                 bc+=this._pin.BCF_setOpt(i_opt.pin,db);\r
219                         }\r
220                         //MiMicBCを生成して実行\r
221                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
222                 }catch(e){\r
223                         throw new MiMicException(e);\r
224                 }\r
225         },\r
226         /**\r
227          * ピンの出力状態を設定する。\r
228          * この関数は、directionを1(output)に設定したピンで使用できる。inputに設定したピンには使用できない。\r
229          * @name LPCXpresso1769.GpioPin#setValue\r
230          * @function\r
231          * @param {int} i_val\r
232          * 1ビットの出力値。\r
233          * @example\r
234          * //set P0[0] pin to “on”. If LED was connected pin it will turn on.\r
235          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
236          * var gpiopin=mcu.getPin(LPCXpresso1769.P0[0],"GPIO");\r
237          * gpiopin.setOpt({dir:1,pin:{mode:1,od:0}});\r
238          * gpiopin.setValue(1);  \r
239          */\r
240         setValue:function setValue(i_val)\r
241         {\r
242                 try{\r
243                         var bc="";\r
244                         var db=new Array();\r
245                         bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val,db);\r
246                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
247                 }catch(e){\r
248                         throw new MiMicException(e);\r
249                 }\r
250         },      \r
251         /**\r
252          * ピンの入力状態を1/0で返す。\r
253          * この関数は、directionを0(input)に設定したピンで使用できる。outputに設定したピンには使用できない。\r
254          * @function\r
255          * @return {int}\r
256          * 1,又は0\r
257          * @name LPCXpresso1769.GpioPin#getValue\r
258          * @example\r
259          * //show P0[0] value\r
260          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
261          * var gpiopin=mcu.getPin(LPCXpresso1769.P0[0],"GPIO");\r
262          * gpiopin.setOpt({dir:0,pin:{mode:0,od:0}});\r
263          * alert(gpiopin.getValue());    \r
264          */\r
265         getValue:function getValue()\r
266         {\r
267 \r
268                 try{\r
269                         var bc="";\r
270                         var db=new Array();\r
271                         bc+=this._gpio.BCF_getValue(this._gpioinfo.port,this._gpioinfo.bit,db);\r
272                         var ret=this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
273                         return (ret.stream[0]>>this._gpioinfo.bit)&0x01;\r
274                 }catch(e){\r
275                         throw new MiMicException(e);\r
276                 }\r
277         },\r
278         /**\r
279          * 直列化されたビットパターンを出力する。\r
280          * 単純なビットパターンをピンに出力するときに使用する。\r
281          * 出力速度はMCU依存であり、コントロールできない。\r
282          * この関数は、directionを1(output)に設定したピンで使用できる。inputに設定したピンには使用できない。\r
283          * @name LPCXpresso1769.GpioPin#outPatt\r
284          * @function\r
285          * @param {array[int]} i_val_array\r
286          * ビットパターンの配列。1ビットの値(0 or 1)の配列を指定する。最大数は20である。\r
287          * [0,1,0,1]の場合、0,1,0,1の順に、パターンを出力します。\r
288          * @example\r
289          * //output  0101010100001010 to P0[0]\r
290          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
291          * var gpiopin=mcu.getPin(LPCXpresso1769.P0[0],"GPIO");\r
292          * gpiopin.setOpt({dir:1,pin:{mode:1,od:0}});\r
293          * gpiopin.outPatt([0,1,0,1,0,1,0,1,0,0,0,0,1,0,1,0]);\r
294          */\r
295         outPatt:function outPatt(i_val_array)\r
296         {\r
297                 try{\r
298                         var bc="";\r
299                         var db=new Array();\r
300                         for(var i=0;i<i_val_array.length;i++){\r
301                                 bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val_array[i],db);\r
302                         }\r
303                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
304                 }catch(e){\r
305                         throw new MiMicException(e);\r
306                 }\r
307         },\r
308         \r
309 }\r
310 \r
311 }());\r