2 * @fileOverview Memoryクラスを定義します。
\r
10 * <a href="https://mbed.org/handbook/Memory">mbed::Memory</a>と同等の機能を持ちます。
\r
11 * @name mbedJS.Memory
\r
13 * @param {mbedJS.Mcu} i_mcu
\r
14 * インスタンスをバインドするMCUオブジェクトです。
\r
15 * @param {HashMap|Generator|function} i_handler
\r
16 * 非同期イベントハンドラの連想配列、Generator、コールバック関数の何れかを指定します。
\r
18 * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。
\r
20 * <li>{function()} onNew -
\r
21 * インスタンスが使用可能になった時に呼び出されます。
\r
23 * <li>{function(v)} onRead -
\r
24 * read関数が完了した時に呼び出されます。
\r
26 * <li>{byte[]} v - 読みだしたバイト値を格納した配列です。</li>
\r
29 * <li>{function(v)} onRead32 -
\r
30 * read32関数が完了した時に呼び出されます。
\r
32 * <li>{int[]} v - 読みだしたuint32値を格納した配列です。</li>
\r
35 * <li>{function()} onWrite -
\r
36 * write関数が完了した時に呼び出されます。
\r
38 * <li>{function()} onWrite32 -
\r
39 * write32関数が完了した時に呼び出されます。
\r
43 * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。
\r
46 * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。
\r
48 * @return {mbedJS.Memory}
\r
49 * @example //Callback
\r
51 * var mcu=new mbedJS.Mcu("192.168.128.39",
\r
54 * var mem=new mbedJS.Memory(mcu,{
\r
57 * mem.write(0x20080000,1);
\r
59 * onWrite:function(){
\r
60 * log("[PASS]onWrite:"+s);
\r
63 * mem.read(0x20080000,1);
\r
66 * mem.read(0x20080001,1);
\r
69 * mem.read(0x20080000,8);
\r
73 * onRead:function(v){
\r
74 * log("[PASS]onRead:"+s);
\r
77 * mem.write(0x20080001,[2]);
\r
80 * mem.write(0x20080004,[10,20,30]);
\r
83 * mem.write32(0x20080000,0xff);
\r
88 * onWrite32:function(){
\r
89 * log("[PASS]onWrite32:"+s);
\r
92 * mem.read32(0x20080000);
\r
95 * mem.read32(0x20080004,4);
\r
98 * mem.read32(0x20080000,16);
\r
102 * onRead32:function(v){
\r
103 * log("[PASS]onRead32:"+s);
\r
106 * mem.write32(0x20080004,[2]);
\r
109 * mem.write32(0x20080004,[10,20,30]);
\r
118 * onClose:function(){
\r
119 * log("[PASS]onClose");
\r
121 * onError:function(){
\r
125 * @example //Generator
\r
126 * var g=function*(){
\r
129 * var mcu=new mbedJS.Mcu("192.168.128.39",g);
\r
130 * yield mcu.waitForNew();
\r
131 * var mem=new mbedJS.Memory(mcu,g);
\r
132 * yield mem.waitForNew();
\r
133 * yield mem.write(0x20080000,1);
\r
134 * log("[PASS]onWrite:");
\r
135 * v=yield mem.read(0x20080000,1);
\r
136 * log("[PASS]onRead:"+v);
\r
137 * v=yield mem.read(0x20080001,1);
\r
138 * log("[PASS]onRead:"+v);
\r
139 * v=yield mem.read(0x20080000,8);
\r
140 * log("[PASS]onRead:"+v);
\r
141 * yield mem.write(0x20080001,[2]);
\r
142 * log("[PASS]onWrite:");
\r
143 * yield mem.write(0x20080004,[10,20,30]);
\r
144 * log("[PASS]onWrite:");
\r
145 * yield mem.write32(0x20080000,0xff);
\r
146 * log("[PASS]onWrite32:");
\r
147 * v=yield mem.read32(0x20080000);
\r
148 * log("[PASS]onRead32:"+v);
\r
149 * v=yield mem.read32(0x20080004,4);
\r
150 * log("[PASS]onRead32:"+v);
\r
151 * v=yield mem.read32(0x20080000,16);
\r
152 * log("[PASS]onRead32:"+v);
\r
153 * yield mem.write32(0x20080004,[2]);
\r
154 * log("[PASS]onWrite32:");
\r
155 * yield mem.write32(0x20080004,[10,20,30]);
\r
156 * log("[PASS]onWrite32:");
\r
166 var CLASS=function Memory(i_mcu,i_handler)
\r
172 var cb=MI._initHandler.call(_t,i_handler);
\r
173 _t._mcu.rpc(_t.RPC_NS+":init","",
\r
177 if(_t._gen){_t._gen.next(_t);}
\r
182 throw new MI.MiMicException(e);
\r
188 RPC_NS:"MiMic:Memory",
\r
189 /** @private 最後にコールしたAPIです。*/
\r
191 /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/
\r
193 /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/
\r
196 * Generatorモードのときに使用する関数です。
\r
197 * Generatorモードの時は、yieldと併用してnew Memory()の完了を待ちます。
\r
198 * @name mbedJS.Memory#waitForNew
\r
201 waitForNew:function Memory_waitForNew()
\r
204 if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}
\r
205 this._lc=CLASS.waitForNew;
\r
207 throw new MI.MiMicException(e);
\r
211 * 1バイト単位でメモリから読み込みます。
\r
212 * 関数の完了時にonReadイベントが発生します。
\r
213 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
214 * @name mbedJS.Memory#read
\r
216 * @param {int} i_addr
\r
218 * @param {int} i_size
\r
219 * (Optional) 読出しサイズです。省略時は1です。
\r
221 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
223 * Generatorモードの時はメモリ値を格納した配列を返します。
\r
225 read:function Memory_read(i_addr,i_size)
\r
228 //read(i_addr,i_len)
\r
231 var cb=MI._getCb(arguments,_t._event.onRead);
\r
232 MI._assertYield.call(_t);
\r
234 var a=[i_addr,(MI._getBaseArgsLen(arguments)==1)?i_size:1];
\r
236 return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],
\r
239 var v=MI.bstr2byteArray(j.result[0]);
\r
241 if(_t._gen){_t._gen.next(v);}
\r
245 throw new MI.MiMicException(e);
\r
250 * 関数の完了時にonWriteイベントが発生します。
\r
251 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
252 * @name mbedJS.Memory#write
\r
254 * @param {int} i_addr
\r
255 * 書き込み先のメモリアドレスを指定します。
\r
256 * @param {int|int[]} i_v
\r
257 * 書き込むbyte配列、または数値を指定します。
\r
258 * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。
\r
260 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
262 write:function Memory_write(i_addr,i_v)
\r
266 var cb=MI._getCb(arguments,_t._event.onWrite);
\r
267 MI._assertYield.call(_t);
\r
268 _t._lc=CLASS.write;
\r
269 MI.assertInt(i_addr);
\r
271 return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.byteArray2bstr(i_v)+"\"",
\r
275 if(_t._gen){_t._gen.next();}
\r
280 throw new MI.MiMicException(e);
\r
284 * 4バイト単位でメモリから読み込みます。
\r
285 * 関数の完了時にonRead32イベントが発生します。
\r
286 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
287 * @name mbedJS.Memory#read32
\r
289 * @param {int} i_addr
\r
291 * @param {int} i_size
\r
292 * (Optional) 読出しサイズです。省略時は4です。4の倍数を指定してください。
\r
294 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
296 * Generatorモードの時はメモリ値を格納した配列を返します。
\r
298 read32:function Memory_read32(i_addr,i_size)
\r
301 //read(i_addr,i_len)
\r
304 var cb=MI._getCb(arguments,_t._event.onRead32);
\r
305 MI._assertYield.call(_t);
\r
306 _t._lc=CLASS.read32;
\r
308 var a=[i_addr,(MI._getBaseArgsLen(arguments)==1)?4:i_size];
\r
310 throw new MI.MiMicException(MI.Error.NG_INVALID_ARG);
\r
313 return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],
\r
316 var v=MI.bstr2uintArray(j.result[0]);
\r
318 if(_t._gen){_t._gen.next(v);}
\r
323 throw new MI.MiMicException(e);
\r
327 * 32bit unsigned intをメモリへ書き込みます。
\r
328 * 関数の完了時にonWrite32イベントが発生します。
\r
329 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
330 * @name mbedJS.Memory#write32
\r
332 * @param {int} i_addr
\r
333 * 書き込み先のメモリアドレスを指定します。
\r
334 * @param {int|int[]} i_v
\r
335 * 書き込むbyte配列、または数値を指定します。
\r
336 * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。
\r
338 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
340 write32:function Memory_write32(i_addr,i_v)
\r
344 var cb=MI._getCb(arguments,_t._event.onWrite32);
\r
345 MI._assertYield.call(_t);
\r
346 _t._lc=CLASS.write32;
\r
347 MI.assertInt(i_addr);
\r
349 return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.uintArray2bstr(i_v)+"\"",
\r
353 if(_t._gen){_t._gen.next();}
\r
358 throw new MI.MiMicException(e);
\r