OSDN Git Service

5b106faeebdd2cc00706323aa74e415b95ef08c1
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXpresso1769.Mcu.js
1 (function(){\r
2         var DEV=LPCXpresso1769;\r
3         var BCF=DEV._BCF;\r
4         var EE=DEV._EE;\r
5         var isUndef=MiMicLib.isUndef;\r
6 \r
7         /**\r
8          * 配列をMiMicDBへ変換する。\r
9          @throws\r
10          変換失敗時は例外\r
11          */\r
12         function array2MimicDb(i_array)\r
13         {\r
14                 try{\r
15                         var dt=["0000000","000000","00000","0000","000","00","0",""];\r
16                         var p="";\r
17                         for(var i=0;i<i_array.length;i++){\r
18                                 var v=(i_array[i]>>>0);\r
19                                 var s=v.toString(16).toLowerCase();\r
20                                 if(s.length<1 || s.length>8){\r
21                                         throw new MiMicException(EE.NG);\r
22                                 }\r
23                                 p+=dt[s.length-1]+s;\r
24                         }\r
25                         return p;\r
26                 }catch(e){\r
27                         throw new MiMicException(e);\r
28                 }\r
29         }\r
30         \r
31         /**\r
32          * PINの機能名を含むPin識別子を得る。\r
33          */\r
34         function getPinByFuncName(i_name)\r
35         {\r
36                 try{\r
37                         function getPinByFName(i_pintbl,i_name)\r
38                         {\r
39                                 for(var i=0;i<i_pintbl.length;i++){\r
40                                         if(i_pintbl[i]==null){\r
41                                                 continue;\r
42                                         }\r
43                                         if(DEV.hasPinFunctionName(i_pintbl[i],i_name)){\r
44                                                 return i_pintbl[i];\r
45                                         }\r
46                                 }\r
47                                 return null;\r
48                         }\r
49                         var tbl=[DEV.P0,DEV.P1,DEV.P2,DEV.P3,DEV.P4];\r
50                         for(var i=0;i<tbl.length;i++){\r
51                                 var pin=getPinByFName(tbl[i],i_name);\r
52                                 if(pin!=null){\r
53                                         return pin;\r
54                                 }\r
55                         }\r
56                         throw new MiMicException("pin function '"+i_name+"' not found");\r
57                 }catch(e){\r
58                         throw new MiMicException(e);\r
59                 }\r
60         }\r
61         /**\r
62          * PIN機能名から使用するペリフェラルシンボルを推定する。
63          */\r
64         function pinFuncName2PhlName(i_pinfuncname)\r
65         {\r
66                 try{\r
67                         //Pin function nameプレフィクスとペリフェラル名の対比表\r
68                         var TBL={\r
69                                 "GPIO":"GPIO",\r
70                                 "AD":"ADC",\r
71                                 "DA":"DAC"\r
72                         };\r
73                         for(var key in TBL){\r
74                                 if(i_pinfuncname.indexOf(key)==0){\r
75                                         return TBL[key];\r
76                                 }\r
77                         }\r
78                         //見つからぬ。\r
79                         throw new MiMicException("Peripheral for "+i_pinfunction+" not found.");\r
80                 }catch(e){\r
81                         throw new MiMicException(e);\r
82                 }\r
83         }\r
84         \r
85         /**\r
86          * @see API Manual\r
87          */\r
88         DEV.Mcu=function Mcu(i_mimic_addr,i_is_activate)\r
89         {\r
90                 try{\r
91                         //リモートインタフェイスの取得\r
92                         this._mif=new MiMicRemoteMcuInterface(i_mimic_addr);\r
93                         var ac=isUndef(i_is_activate)?true:i_is_activate;\r
94                         if(ac){\r
95                                 this.activate();\r
96                         };\r
97                 }catch(e){\r
98                         throw new MiMicException(e);\r
99                 }\r
100         };\r
101         DEV.Mcu.prototype=\r
102         {\r
103                 /**\r
104                  * MiMicInterface
105                  */\r
106                 _mif:null,\r
107                 /**\r
108                  * @see API manual
109                  */\r
110                 isActive:function isActive()\r
111                 {\r
112                         try{\r
113                                 return this._mif.isConnected();\r
114                         }catch(e){\r
115                                 throw new MiMicException(e);\r
116                         }\r
117                 },\r
118                 /**\r
119                  * @see API manual
120                  */\r
121                 events:{\r
122                         /**\r
123                          * @see API manual\r
124                          */\r
125                         onActivateChanged:null\r
126                 },\r
127                 /**\r
128                  * ペリフェラルオブジェクトのホルダ。ペリフェラル名をキーにした、ペリフェラルオブジェクトの連想配列。\r
129                  MCUが、自身のペリフェラルオブジェクトを管理する為に使う。\r
130                  */\r
131                 _phl_holder:[],\r
132                 /**\r
133                  * Clockに関する情報を返す。
134                  */\r
135                 getClockInfo:function getClockProperty()\r
136                 {\r
137                         //CCLCK値(RemoteMCU側と合わせること。将来的にはactivateの時に決定する。)\r
138                         return {cclk:100*1000*1000};\r
139                 },\r
140                 /**\r
141                  * @see API manual
142                  */\r
143                 activate:function activate()\r
144                 {\r
145                         try{\r
146                                 var _t=this;\r
147                                 //既にアクティブならエラー。\r
148                                 if(this.isActive()){\r
149                                         throw new MiMicException("Already activated!");\r
150                                 }\r
151                                 //接続\r
152                                 this._mif.connect(\r
153                                         function(b){\r
154                                                 if(!b){\r
155                                                         //非同期切断を検出。\r
156                                                         if(_t.events.onActivateChanged!=null){\r
157                                                                 _t.events.onActivateChanged(false);\r
158                                                         }\r
159                                                 }\r
160                                         }\r
161                                 );\r
162                                 if(this.events.onActivateChanged!=null){\r
163                                         this.events.onActivateChanged(true);\r
164                                 }\r
165                         }catch(e){\r
166                                 throw new MiMicException(e);\r
167                         }\r
168                 },\r
169                 /**\r
170                  * @see API manual
171                  */\r
172                 deactivate:function deactivate()\r
173                 {\r
174                         try{\r
175                                 if(!this.isActive()){\r
176                                         throw new MiMicException("Already activated!");\r
177                                 }\r
178         \r
179                                 this._mif.disconnect();\r
180                                 if(this.events.onActivateChanged!=null){\r
181                                         this.events.onActivateChanged(false);\r
182                                 }\r
183                         }catch(e){\r
184                                 throw new MiMicException(e);\r
185                         }\r
186                 },\r
187                 /**\r
188                  * @see API manual
189                  */\r
190                 callMiMic:function callMiMic(/**/)\r
191                 {\r
192                         try{\r
193                                 var bc;\r
194                                 switch(arguments.length){\r
195                                 case 1:\r
196                                         //mimicBC\r
197                                         bc=arguments[0];\r
198                                         break;\r
199                                 case 2:\r
200                                         //mimicBC:string,db:array[int]\r
201                                         bc=arguments[0]+array2MimicDb(arguments[1]);\r
202                                         break;\r
203                                 default:\r
204                                         throw new MiMicException(e);\r
205                                 }\r
206                                 return this._mif.execBc(bc);\r
207                         }catch(e){\r
208                                 throw new MiMicException(e);\r
209                         }\r
210                 },\r
211                 /**\r
212                  * @see API manual\r
213                  */\r
214                 callMiMicWithCheck:function execBc2WithException(/**/)\r
215                 {\r
216                         try{\r
217                                 var ret=this.callMiMic.apply(this,arguments);\r
218                                 if(ret.result!=0x0){\r
219                                         throw new MiMicException(EE.VM_RUNTIME,"Result="+ret.toString());\r
220                                 }\r
221                                 return ret;\r
222                         }catch(e){\r
223                                 throw new MiMicException(e);\r
224                         }\r
225                 },\r
226                 /**\r
227                  * @see API manual
228                  */\r
229                 getPin:function getPin(/*...*/)\r
230                 {\r
231                         switch(arguments.length){\r
232                         case 1://getPin:function getPin(i_pin_function)\r
233                                 //pin_functionを持ってるPINを探す。\r
234                                 var pin=getPinByFuncName(arguments[0]);\r
235                                 //function名からペリフェラル名を得る。\r
236                                 var phl_name=pinFuncName2PhlName(arguments[0]);\r
237                                 //ピンコンストラクタとペリフェラルを使ってピンを生成。\r
238                                 return this.getPeripheral(phl_name).getPin(pin);\r
239                         case 2://getPin:function getPin(i_pin,i_function_name)\r
240                                 //function名からペリフェラル名を得る。(PINシンボル変換を流用)\r
241                                 var phl_name=pinFuncName2PhlName(arguments[1]);\r
242                                 return this.getPeripheral(phl_name).getPin(arguments[0]);\r
243                         default:\r
244                                 throw new MiMicException();\r
245                         }\r
246                 },\r
247                 /**\r
248                  * @see API manual\r
249                  */\r
250                 getPort:function getPort(i_port_name)\r
251                 {\r
252                         throw new MiMicException("Not implemented.");\r
253                 },\r
254                 /**\r
255                  * @see API manual
256                  */\r
257                 getPeripheral:function getPeripheral(i_phl_symbol,i_opt)\r
258                 {\r
259                         //ペリフェラルアイテムが生成済か確認\r
260                         if(isUndef(this._phl_holder[i_phl_symbol])){\r
261                                 //存在しなければPhlを生成。\r
262                                 switch(i_phl_symbol){\r
263                                 case "GPIO":new DEV.Gpio(this,i_opt);break;\r
264                                 case "ADC":new DEV.Adc(this,i_opt);break;\r
265                                 case "PWM":new DEV.Pwm(this,i_opt);break;\r
266                                 default:\r
267                                         throw new MiMicException("Unknown peripheral symbol "+i_phl_symbol);\r
268                                 }\r
269                         }else{\r
270                                 //2回目以降でi_optが設定されている?それはだめだよ。\r
271                                 if(!isUndef(i_opt)){\r
272                                         throw new MiMicException();\r
273                                 }\r
274                         }\r
275                         //phlからregisterのコールバックがかかるはず。\r
276                         return this._phl_holder[i_phl_symbol];\r
277                 },\r
278                 /**\r
279                  * [forSystem]システム関数。MCU依存のペリフェラルオブジェクトを登録する。
280                  */\r
281                 registerPhl:function registerPhl(i_phl,i_symbol)\r
282                 {\r
283                         try{\r
284                                 //登録済みのシンボルは登録できない。\r
285                                 if(!isUndef(this._phl_holder[i_symbol])){\r
286                                         throw new MiMicException("Peripheral symbol "+i_symbol+" is already exist on mcu.");\r
287                                 }\r
288                                 this._phl_holder[i_symbol]=i_phl;\r
289                         }catch(e){\r
290                                 throw new MiMicException(e);\r
291                         }\r
292                 }\r
293         }\r
294 }());