2 * @fileOverview I2Cクラスを定義します。
\r
10 * <a href="https://mbed.org/handbook/I2C">mbed::I2C</a>と同等の機能を持ちます。
\r
13 * @param {mbedJS.Mcu} i_mcu
\r
14 * インスタンスをバインドするMCUオブジェクトです。
\r
15 * @param {[PinName,PinName]} i_params
\r
16 * i2Cバスを構成するピンIDを指定します。sda,sclの順番です。
\r
17 * @param {HashMap|Generator|function} i_handler
\r
18 * 非同期イベントハンドラの連想配列、Generator、コールバック関数の何れかを指定します。
\r
20 * 非同期イベントハンドラの場合、関数はイベントハンドラで結果を通知します。
\r
22 * <li>{function()} onNew -
\r
23 * インスタンスが使用可能になった時に呼び出されます。
\r
25 * <li>{function()} onFrequency -
\r
26 * frequency関数が完了したときに呼び出されます。
\r
28 * <li>{function(ret,data)} onRead -
\r
29 * read関数が完了したときに呼び出されます。
\r
31 * <li>ret {int}-は成功/失敗フラグを返します。read.1とread.2の場合で意味が異なります。
\r
32 * read.1の場合、 0:ACK(成功),1:NACK(失敗)です。read.2の場合、読みだした値です。</li>
\r
33 * <li>data {byte[]}-読みだしたデータの配列です。read.1の場合のみ有効です。</li>
\r
36 * <li>{function(ret)} onWrite -
\r
37 * write関数が完了したときに呼び出されます。
\r
39 * <li>ret {int}-成功/失敗フラグを返します。write.1とwrite.2の場合で意味が異なります。
\r
40 * write.1の場合、ACK:0(成功),NACK:それ以外です。write.2の場合、ACKを受信すると1を返します。</li>
\r
43 * <li>{function()} onStart -
\r
44 * start関数が完了したときに呼び出されます。
\r
46 * <li>{function()} onStop -
\r
47 * stop関数が完了したときに呼び出されます。
\r
51 * Generatorを指定した場合、コールバック関数の引数はyiledの戻り値として取得できます。
\r
54 * コールバック関数を指定した場合、RPCが完了したときに呼び出されます。メンバ関数のイベントハンドラは個別に設定する必要があります。
\r
56 * @return {mbedJS.I2C}
\r
57 * @example //Callback
\r
59 * var mcu=new mbedJS.Mcu("192.168.128.39",
\r
62 * var i2c=new mbedJS.I2C(mcu,[mbedJS.PinName.p28,mbedJS.PinName.p27],{
\r
64 * i2c.frequency(100000);
\r
66 * onFrequency:function()
\r
70 * onStart:function(){
\r
74 * onWrite:function(v){
\r
76 * i2c.write(0,[1,2,3],false);
\r
83 * onRead:function(v){
\r
85 * i2c.read(1,2,false);
\r
91 * onStop:function(){
\r
96 * onClose:function(){
\r
98 * onError:function(){
\r
102 * @example //Generator
\r
103 * var g=function*(){
\r
106 * var mcu=new mbedJS.Mcu("192.168.128.39",g);
\r
107 * yield mcu.waitForNew();
\r
108 * var i2c=new mbedJS.I2C(mcu,[mbedJS.PinName.p28,mbedJS.PinName.p27],g);
\r
109 * yield i2c.waitForNew();
\r
110 * yield i2c.frequency(100000);
\r
111 * yield i2c.start();
\r
112 * yield i2c.write(1);
\r
113 * yield i2c.write(0,[1,2,3],false);
\r
114 * yield i2c.read(1);
\r
115 * yield i2c.read(1,2,false);
\r
116 * yield i2c.stop();
\r
117 * yield mcu.close();
\r
126 var CLASS=function I2C(i_mcu,i_params,i_handler)
\r
132 var cb=MI._initHandler.call(_t,i_handler);
\r
133 MI.assertInt(i_params);
\r
134 _t._mcu.rpc(_t.RPC_NS+":_new1",i_params[0]+","+i_params[1],
\r
137 _t._oid=j.result[0];
\r
139 if(_t._gen){_t._gen.next(_t);}
\r
144 throw new MI.MiMicException(e);
\r
150 RPC_NS:"mbedJS:I2C",
\r
151 /** @private 最後にコールしたAPIです。*/
\r
153 /** @private Generatorモードの場合にGeneratorオブジェクトを保持します。*/
\r
155 /** @private コールバック関数の連想配列です。要素はコンストラクタを参照してください。*/
\r
157 /** @private リモートインスタンスのオブジェクトIDです。*/
\r
160 * Generatorモードのときに使用する関数です。
\r
161 * Generatorモードの時は、yieldと併用してnew I2C()の完了を待ちます。
\r
162 * @name mbedJS.I2C#waitForNew
\r
165 waitForNew:function I2C_waitForNew()
\r
168 if(this._lc!=CLASS){throw new MI.MiMicException(MI.Error.NG_ILLEGAL_CALL);}
\r
169 this._lc=CLASS.waitForNew;
\r
171 throw new MI.MiMicException(e);
\r
175 * Hz単位でバスの速度を指定します。
\r
176 * 関数の完了時にonFrequencyイベントが発生します。
\r
177 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
178 * @name mbedJS.I2C#frequency
\r
180 * @param {int} i_hz
\r
183 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
185 frequency:function I2C_frequency(i_hz)
\r
189 var cb=MI._getCb(arguments,_t._event.onFrequency);
\r
190 MI._assertYield.call(_t);
\r
191 _t._lc=CLASS.frequency;
\r
192 MI.assertInt(i_hz);
\r
193 return _t._mcu.rpc(_t.RPC_NS+":frequency",_t._oid+","+i_hz,
\r
197 if(_t._gen){_t._gen.next();}
\r
202 throw new MI.MiMicException(e);
\r
207 * @name mbedJS.I2C#read.1
\r
209 * @param {int} address
\r
210 * 8ビットのI2CSlaveアドレスです。
\r
211 * @param {int} length
\r
212 * 読み出すデータの長さです。256未満の値を指定してください。
\r
213 * @param {boolean} repeated
\r
214 * Repeated start, true - do not send stop at end
\r
215 * Optionalです。省略時はfalseです。
\r
217 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
218 * @return {HashMap}
\r
219 * {ret:int,data:[byte]}
\r
220 * Generatorの場合は戻り値オブジェクトを返します。
\r
222 * <li>ret {int}- 成功フラグ 0:ACK(成功),1:NACK(失敗)</li>
\r
223 * <li>data {byte[]}- 読みだしたデータ</li>
\r
228 * @name mbedJS.I2C#read.2
\r
231 * indicates if the byte is to be acknowledged (1 = acknowledge)
\r
233 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
235 * Generatorモードの時は読みだした値を返します。
\r
239 * 関数の完了時にonReadイベントが発生します。
\r
240 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
241 * @name mbedJS.I2C#read
\r
244 * 詳細はmbedJS.I2C#read.Nを参照してください。
\r
246 read:function I2C_read(/*...*/)
\r
250 var cb=MI._getCb(arguments,_t._event.onRead);
\r
251 MI._assertYield.call(_t);
\r
254 var v=j.result.length>1?{ret:j.result[0],data:MI.bstr2byteArray(j.result[1])}:j.result[0];
\r
256 if(_t._gen){_t._gen.next(v);}
\r
260 if(MI._getBaseArgsLen(arguments)==1){
\r
261 MI.assertInt(arguments[0]);
\r
262 return _t._mcu.rpc(_t.RPC_NS+":read2",_t._oid+","+arguments[0],rcb);
\r
265 MI.assertInt([a[0],a[1]]);
\r
266 return _t._mcu.rpc(_t.RPC_NS+":read1",_t._oid+","+a[0]+","+a[1]+","+(a[2]?1:0),rcb);
\r
269 throw new MI.MiMicException(e);
\r
274 * @name mbedJS.I2C#write.1
\r
276 * @param {int} address
\r
277 * 8ビットのI2CSlaveアドレスです。
\r
278 * @param {byte[]} data
\r
279 * 送信するデータを格納したバイト配列です。
\r
280 * @param {boolean} repeated
\r
281 * Repeated start, true - do not send stop at end
\r
282 * Optionalです。省略時はfalseです。
\r
284 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
286 * Generatorモードの時は成功/失敗フラグを返します。ACK:0(成功),NACK:それ以外です。
\r
290 * @name mbedJS.I2C#write.2
\r
292 * @param {int} data
\r
295 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
297 * Generatorモードの時は成功/失敗フラグを返します。ACKを受信すると1を返します。
\r
301 * 関数の完了時にonWriteイベントが発生します。
\r
302 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
303 * @name mbedJS.I2C#write
\r
306 * 詳細はmbedJS.I2C#write.Nを参照してください。
\r
308 write:function I2C_write(/*...*/)
\r
312 var cb=MI._getCb(arguments,_t._event.onWrite);
\r
313 MI._assertYield.call(_t);
\r
314 _t._lc=CLASS.write;
\r
318 if(_t._gen){_t._gen.next(v);}
\r
321 if(MI._getBaseArgsLen(arguments)==1){
\r
322 MI.assertInt(arguments[0]);
\r
323 return _t._mcu.rpc(_t.RPC_NS+":write2",_t._oid+","+arguments[0],rcb);
\r
326 MI.assertInt(a[0]);
\r
327 return _t._mcu.rpc(_t.RPC_NS+":write1",_t._oid+","+a[0]+",\""+MI.byteArray2bstr(a[1])+"\","+(a[2]?1:0),rcb);
\r
330 throw new MI.MiMicException(e);
\r
335 * 関数の完了時にonStartイベントが発生します。
\r
336 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
337 * @name mbedJS.I2C#start
\r
340 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
342 start:function I2C_start()
\r
346 var cb=MI._getCb(arguments,_t._event.onStart);
\r
347 MI._assertYield.call(_t);
\r
348 _t._lc=CLASS.start;
\r
349 return _t._mcu.rpc(_t.RPC_NS+":start",_t._oid,
\r
353 if(_t._gen){_t._gen.next();}
\r
358 throw new MI.MiMicException(e);
\r
363 * 関数の完了時にonStopイベントが発生します。
\r
364 * Generatorモードの時は、yieldと併用して完了を待機できます。
\r
365 * @name mbedJS.I2C#stop
\r
368 * Callbackモードの時はRPCメソッドのインデクスを返します。
\r
370 stop:function I2C_stop()
\r
374 var cb=MI._getCb(arguments,_t._event.onStop);
\r
375 MI._assertYield.call(_t);
\r
377 return _t._mcu.rpc(_t.RPC_NS+":stop",_t._oid,
\r
381 if(_t._gen){_t._gen.next();}
\r
386 throw new MI.MiMicException(e);
\r