OSDN Git Service

9347e4d62a4a553ef873c26f68867bb107fd6a89
[mimic/MiMicSDK.git] / misc / mbedJS / mbddJS.API / mbedJS / mbed.Memory.js
1 /**\r
2  * @fileOverview Memoryクラスを定義します。\r
3  */\r
4 (function(){\r
5 var NS=mbedJS;\r
6 var MI=MiMicJS;\r
7 \r
8 /**\r
9  * Memoryクラスです。\r
10  * <a href="https://mbed.org/handbook/Memory">mbed::Memory</a>と同等の機能を持ちます。\r
11  * @name mbedJS.Memory\r
12  * @constructor\r
13  * @param {mbedJS.Mcu} i_mcu\r
14  * インスタンスをバインドするMCUオブジェクトです。\r
15  * @param {HashMap|Generator} i_event\r
16  * 非同期イベントハンドラの連想配列、又はGeneratorです。\r
17  * <p>\r
18  * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。\r
19  * <ul>\r
20  * <li>{function()} onNew -\r
21  * インスタンスが使用可能になった時に呼び出されます。\r
22  * </li>\r
23  * <li>{function(v)} onRead  -\r
24  * read関数のコールバック関数です。\r
25  *      <ul>\r
26  *              <li>{int} v - 現在のピンの値です。</li>\r
27  *      </ul>\r
28  * </li>\r
29  * <li>{function()} onMode -\r
30  * mode関数のコールバック関数です。\r
31  * </li>\r
32  * </ul>\r
33  * <p>\r
34  * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。\r
35  * <p>\r
36  * @return {mbedJS.Memory}\r
37  * @example //Callback\r
38  * @example //Generator\r
39  */\r
40 var CLASS=function Memory(i_mcu,i_handler)\r
41 {\r
42         try{\r
43                 var _t=this;\r
44                 _t._mcu=i_mcu;\r
45                 _t._lc=CLASS;\r
46                 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}\r
47                 else if(i_handler){_t._event=i_handler}\r
48                 function cb(j)\r
49                 {\r
50                         if(_t._event.onNew){_t._event.onNew();}\r
51                         if(_t._gen){_t._gen.next(_t);}\r
52                         _t._lc=null;\r
53                 }\r
54                 return _t._mcu.rpc(_t.RPC_NS+":init","",cb);\r
55         }catch(e){\r
56                 throw new MI.MiMicException(e);\r
57         }\r
58 }\r
59 CLASS.prototype=\r
60 {\r
61         /** @private */\r
62         RPC_NS:"MiMic:Memory",\r
63         /** @private 最後にコールしたAPIです。*/\r
64         _lc:null,\r
65         /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/\r
66         _gen:null,\r
67         /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/\r
68         _event:{},\r
69         /**\r
70          * Generatorモードのときに使用する関数です。\r
71          * Generatorモードの時は、yieldと併用してnew Memory()の完了を待ちます。\r
72          * @name mbedJS.Memory#waitForNew\r
73          * @function\r
74          */\r
75         waitForNew:function Memory_waitForNew()\r
76         {\r
77                 try{\r
78                         if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}\r
79                         this._lc=CLASS.waitForNew;\r
80                 }catch(e){\r
81                         throw new MI.MiMicException(e);\r
82                 }\r
83         },\r
84         /**\r
85          * 1バイト単位でメモリから読み込みます。\r
86          * 関数の完了時にonReadイベントが発生します。\r
87          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
88          * @name mbedJS.Memory#read\r
89          * @function\r
90          * @param {int} i_addr\r
91          * メモリアドレス\r
92          * @param {int} i_size\r
93          * (Optional) 読出しサイズです。省略時は1です。\r
94          * @return {int}\r
95          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
96          * @return {int[]}\r
97          * Generatorモードの時はメモリ値を格納した配列を返します。\r
98          */\r
99         read:function Memory_read(i_addr,i_size)\r
100         {\r
101                 //read(i_addr)\r
102                 //read(i_addr,i_len)\r
103                 try{\r
104                         var _t=this;\r
105                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
106                         _t._lc=CLASS.read;\r
107                         var a=[i_addr,arguments.length<2?1:i_size];\r
108                         MI.assertInt(a);\r
109                         return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],\r
110                         function (j)\r
111                         {\r
112                                 var v=MI.bstr2byteArray(j.result[0]);\r
113                                 if(_t._event.onRead){_t._event.onRead(v);}\r
114                                 if(_t._gen){_t._gen.next(v);}\r
115                                  _t._lc=null;\r
116                         });\r
117                 }catch(e){\r
118                         throw new MI.MiMicException(e);\r
119                 }\r
120         },\r
121         /**\r
122          * 1バイトをメモリへ書き込みます。\r
123          * 関数の完了時にonWriteイベントが発生します。\r
124          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
125          * @name mbedJS.Memory#write\r
126          * @function\r
127          * @param {int} i_addr\r
128          * 書き込み先のメモリアドレスを指定します。\r
129          * @param {int|int[]} i_v\r
130          * 書き込むbyte配列、または数値を指定します。\r
131          * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。\r
132          * @return {int}\r
133          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
134          */\r
135         write:function Memory_write(i_addr,i_v)\r
136         {\r
137                 try{\r
138                         var _t=this;\r
139                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
140                         _t._lc=CLASS.write;\r
141                         MI.assertInt(i_addr);\r
142                         MI.assertInt(i_v);\r
143                         return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.byteArray2bstr(i_v)+"\"",\r
144                         function (j)\r
145                         {\r
146                                 if(_t._event.onWrite){_t._event.onWrite();}\r
147                                 if(_t._gen){_t._gen.next();}\r
148                                  _t._lc=null;\r
149                         }\r
150                         );\r
151                 }catch(e){\r
152                         throw new MI.MiMicException(e);\r
153                 }\r
154         },\r
155         /**\r
156          * 4バイト単位でメモリから読み込みます。\r
157          * 関数の完了時にonRead32イベントが発生します。\r
158          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
159          * @name mbedJS.Memory#read32\r
160          * @function\r
161          * @param {int} i_addr\r
162          * メモリアドレス\r
163          * @param {int} i_size\r
164          * (Optional) 読出しサイズです。省略時は4です。4の倍数を指定してください。\r
165          * @return {int}\r
166          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
167          * @return {int[]}\r
168          * Generatorモードの時はメモリ値を格納した配列を返します。\r
169          */\r
170         read32:function Memory_read32(i_addr,i_size)\r
171         {\r
172                 //read(i_addr)\r
173                 //read(i_addr,i_len)\r
174                 try{\r
175                         var _t=this;\r
176                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
177                         _t._lc=CLASS.read32;\r
178                         var a=[i_addr,arguments.length<2?4:i_size];\r
179                         if(a[1]%4!=0){\r
180                                 throw new MI.MiMicException(MI.Error.NG_INVALID_ARG);\r
181                         }\r
182                         MI.assertInt(a);\r
183                         return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],\r
184                         function (j)\r
185                         {\r
186                                 var v=MI.bstr2uintArray(j.result[0]);\r
187                                 if(_t._event.onRead32){_t._event.onRead32(v);}\r
188                                 if(_t._gen){_t._gen.next(v);}\r
189                                  _t._lc=null;\r
190                         });\r
191                 }catch(e){\r
192                         throw new MI.MiMicException(e);\r
193                 }\r
194         },\r
195         /**\r
196          * 32bit unsigned intをメモリへ書き込みます。\r
197          * 関数の完了時にonWrite32イベントが発生します。\r
198          * Generatorモードの時は、yieldと併用して完了を待機できます。\r
199          * @name mbedJS.Memory#write32\r
200          * @function\r
201          * @param {int} i_addr\r
202          * 書き込み先のメモリアドレスを指定します。\r
203          * @param {int|int[]} i_v\r
204          * 書き込むbyte配列、または数値を指定します。\r
205          * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。\r
206          * @return {int}\r
207          * Callbackモードの時はRPCメソッドのインデクスを返します。\r
208          */\r
209         write32:function Memory_write32(i_addr,i_v)\r
210         {\r
211                 try{\r
212                         var _t=this;\r
213                         if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}\r
214                         _t._lc=CLASS.write32;\r
215                         MI.assertInt(i_addr);\r
216                         MI.assertInt(i_v);\r
217                         return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.uintArray2bstr(i_v)+"\"",\r
218                         function (j)\r
219                         {\r
220                                 if(_t._event.onWrite){_t._event.onWrite32();}\r
221                                 if(_t._gen){_t._gen.next();}\r
222                                  _t._lc=null;\r
223                         }\r
224                         );\r
225                 }catch(e){\r
226                         throw new MI.MiMicException(e);\r
227                 }\r
228         }\r
229 }\r
230 NS.Memory=CLASS;\r
231 }());