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} i_event
\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
45 * @return {mbedJS.Memory}
\r
46 * @example //Callback
\r
48 * var mcu=new mbedJS.Mcu("192.168.128.39",
\r
51 * var mem=new mbedJS.Memory(mcu,{
\r
54 * mem.write(0x20080000,1);
\r
56 * onWrite:function(){
\r
57 * log("[PASS]onWrite:"+s);
\r
60 * mem.read(0x20080000,1);
\r
63 * mem.read(0x20080001,1);
\r
66 * mem.read(0x20080000,8);
\r
70 * onRead:function(v){
\r
71 * log("[PASS]onRead:"+s);
\r
74 * mem.write(0x20080001,[2]);
\r
77 * mem.write(0x20080004,[10,20,30]);
\r
80 * mem.write32(0x20080000,0xff);
\r
85 * onWrite32:function(){
\r
86 * log("[PASS]onWrite32:"+s);
\r
89 * mem.read32(0x20080000);
\r
92 * mem.read32(0x20080004,4);
\r
95 * mem.read32(0x20080000,16);
\r
99 * onRead32:function(v){
\r
100 * log("[PASS]onRead32:"+s);
\r
103 * mem.write32(0x20080004,[2]);
\r
106 * mem.write32(0x20080004,[10,20,30]);
\r
115 * onClose:function(){
\r
116 * log("[PASS]onClose");
\r
118 * onError:function(){
\r
122 * @example //Generator
\r
123 * var g=function*(){
\r
126 * var mcu=new mbedJS.Mcu("192.168.128.39",g);
\r
127 * yield mcu.waitForNew();
\r
128 * var mem=new mbedJS.Memory(mcu,g);
\r
129 * yield mem.waitForNew();
\r
130 * yield mem.write(0x20080000,1);
\r
131 * log("[PASS]onWrite:");
\r
132 * v=yield mem.read(0x20080000,1);
\r
133 * log("[PASS]onRead:"+v);
\r
134 * v=yield mem.read(0x20080001,1);
\r
135 * log("[PASS]onRead:"+v);
\r
136 * v=yield mem.read(0x20080000,8);
\r
137 * log("[PASS]onRead:"+v);
\r
138 * yield mem.write(0x20080001,[2]);
\r
139 * log("[PASS]onWrite:");
\r
140 * yield mem.write(0x20080004,[10,20,30]);
\r
141 * log("[PASS]onWrite:");
\r
142 * yield mem.write32(0x20080000,0xff);
\r
143 * log("[PASS]onWrite32:");
\r
144 * v=yield mem.read32(0x20080000);
\r
145 * log("[PASS]onRead32:"+v);
\r
146 * v=yield mem.read32(0x20080004,4);
\r
147 * log("[PASS]onRead32:"+v);
\r
148 * v=yield mem.read32(0x20080000,16);
\r
149 * log("[PASS]onRead32:"+v);
\r
150 * yield mem.write32(0x20080004,[2]);
\r
151 * log("[PASS]onWrite32:");
\r
152 * yield mem.write32(0x20080004,[10,20,30]);
\r
153 * log("[PASS]onWrite32:");
\r
163 var CLASS=function Memory(i_mcu,i_handler)
\r
169 if(MI.isGenerator(i_handler)){_t._gen=i_handler;}
\r
170 else if(i_handler){_t._event=i_handler}
\r
173 if(_t._event.onNew){_t._event.onNew();}
\r
174 if(_t._gen){_t._gen.next(_t);}
\r
177 return _t._mcu.rpc(_t.RPC_NS+":init","",cb);
\r
179 throw new MI.MiMicException(e);
\r
185 RPC_NS:"MiMic:Memory",
\r
186 /** @private 最後にコールしたAPIです。*/
\r
188 /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/
\r
190 /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/
\r
193 * Generatorモードのときに使用する関数です。
\r
194 * Generatorモードの時は、yieldと併用してnew Memory()の完了を待ちます。
\r
195 * @name mbedJS.Memory#waitForNew
\r
198 waitForNew:function Memory_waitForNew()
\r
201 if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}
\r
202 this._lc=CLASS.waitForNew;
\r
204 throw new MI.MiMicException(e);
\r
208 * 1バイト単位でメモリから読み込みます。
\r
209 * 関数の完了時にonReadイベントが発生します。
\r
210 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
211 * @name mbedJS.Memory#read
\r
213 * @param {int} i_addr
\r
215 * @param {int} i_size
\r
216 * (Optional) 読出しサイズです。省略時は1です。
\r
218 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
220 * Generatorモードの時はメモリ値を格納した配列を返します。
\r
222 read:function Memory_read(i_addr,i_size)
\r
225 //read(i_addr,i_len)
\r
228 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
230 var a=[i_addr,MI.isUndefined(i_size,1)];
\r
232 return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],
\r
235 var v=MI.bstr2byteArray(j.result[0]);
\r
236 if(_t._event.onRead){_t._event.onRead(v);}
\r
237 if(_t._gen){_t._gen.next(v);}
\r
241 throw new MI.MiMicException(e);
\r
246 * 関数の完了時にonWriteイベントが発生します。
\r
247 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
248 * @name mbedJS.Memory#write
\r
250 * @param {int} i_addr
\r
251 * 書き込み先のメモリアドレスを指定します。
\r
252 * @param {int|int[]} i_v
\r
253 * 書き込むbyte配列、または数値を指定します。
\r
254 * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。
\r
256 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
258 write:function Memory_write(i_addr,i_v)
\r
262 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
263 _t._lc=CLASS.write;
\r
264 MI.assertInt(i_addr);
\r
266 return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.byteArray2bstr(i_v)+"\"",
\r
269 if(_t._event.onWrite){_t._event.onWrite();}
\r
270 if(_t._gen){_t._gen.next();}
\r
275 throw new MI.MiMicException(e);
\r
279 * 4バイト単位でメモリから読み込みます。
\r
280 * 関数の完了時にonRead32イベントが発生します。
\r
281 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
282 * @name mbedJS.Memory#read32
\r
284 * @param {int} i_addr
\r
286 * @param {int} i_size
\r
287 * (Optional) 読出しサイズです。省略時は4です。4の倍数を指定してください。
\r
289 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
291 * Generatorモードの時はメモリ値を格納した配列を返します。
\r
293 read32:function Memory_read32(i_addr,i_size)
\r
296 //read(i_addr,i_len)
\r
299 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
300 _t._lc=CLASS.read32;
\r
301 var a=[i_addr,MI.isUndefined(i_size,4)];
\r
303 throw new MI.MiMicException(MI.Error.NG_INVALID_ARG);
\r
306 return _t._mcu.rpc(_t.RPC_NS+":read",a[0]+","+a[1],
\r
309 var v=MI.bstr2uintArray(j.result[0]);
\r
310 if(_t._event.onRead32){_t._event.onRead32(v);}
\r
311 if(_t._gen){_t._gen.next(v);}
\r
315 throw new MI.MiMicException(e);
\r
319 * 32bit unsigned intをメモリへ書き込みます。
\r
320 * 関数の完了時にonWrite32イベントが発生します。
\r
321 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
322 * @name mbedJS.Memory#write32
\r
324 * @param {int} i_addr
\r
325 * 書き込み先のメモリアドレスを指定します。
\r
326 * @param {int|int[]} i_v
\r
327 * 書き込むbyte配列、または数値を指定します。
\r
328 * 数値の場合は1バイトを書き込みます。最大長さは200byteくらいです。
\r
330 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
332 write32:function Memory_write32(i_addr,i_v)
\r
336 if(this._gen && this._lc){throw new MI.MiMicException(MI.Error.NG_YIELD_NOT_COMPLETED);}
\r
337 _t._lc=CLASS.write32;
\r
338 MI.assertInt(i_addr);
\r
340 return _t._mcu.rpc(_t.RPC_NS+":write",i_addr+",\""+MI.uintArray2bstr(i_v)+"\"",
\r
343 if(_t._event.onWrite){_t._event.onWrite32();}
\r
344 if(_t._gen){_t._gen.next();}
\r
349 throw new MI.MiMicException(e);
\r