diff --git a/lib/i2c.js b/lib/i2c.js index 1ff537a..dd3346f 100644 --- a/lib/i2c.js +++ b/lib/i2c.js @@ -46,6 +46,30 @@ class i2c extends EventEmitter { }); }); } + scanAsync() { + return new Promise((resolve, reject) => { + this.scan((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + scanAsync() { + return new Promise((resolve, reject) => { + this.scan((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + scanAsync() { + return new Promise((resolve, reject) => { + this.scan((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } setAddress(address) { wire.setAddress(address); @@ -59,6 +83,30 @@ class i2c extends EventEmitter { }); }); } + openAsync(device) { + return new Promise((resolve, reject) => { + this.open(device, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + openAsync(device) { + return new Promise((resolve, reject) => { + this.open(device, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + openAsync(device) { + return new Promise((resolve, reject) => { + this.open(device, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } close() { wire.close(); @@ -75,6 +123,30 @@ class i2c extends EventEmitter { }); }); } + writeAsync(buf) { + return new Promise((resolve, reject) => { + this.write(buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeAsync(buf) { + return new Promise((resolve, reject) => { + this.write(buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeAsync(buf) { + return new Promise((resolve, reject) => { + this.write(buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } writeByte(byte, callback) { this.setAddress(this.address); @@ -84,6 +156,30 @@ class i2c extends EventEmitter { }); }); } + writeByteAsync(byte) { + return new Promise((resolve, reject) => { + this.writeByte(byte, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeByteAsync(byte) { + return new Promise((resolve, reject) => { + this.writeByte(byte, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeByteAsync(byte) { + return new Promise((resolve, reject) => { + this.writeByte(byte, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } writeBytes(cmd, buf, callback) { this.setAddress(this.address); @@ -96,6 +192,30 @@ class i2c extends EventEmitter { }); }); } + writeBytesAsync(cmd, buf) { + return new Promise((resolve, reject) => { + this.writeBytes(cmd, buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeBytesAsync(cmd, buf) { + return new Promise((resolve, reject) => { + this.writeBytes(cmd, buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + writeBytesAsync(cmd, buf) { + return new Promise((resolve, reject) => { + this.writeBytes(cmd, buf, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } read(len, callback) { this.setAddress(this.address); @@ -105,6 +225,30 @@ class i2c extends EventEmitter { }); }); } + readAsync(len) { + return new Promise((resolve, reject) => { + this.read(len, (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readAsync(len) { + return new Promise((resolve, reject) => { + this.read(len, (err) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readAsync(len) { + return new Promise((resolve, reject) => { + this.read(len, (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } readByte(callback) { this.setAddress(this.address); @@ -114,6 +258,30 @@ class i2c extends EventEmitter { }); }); } + readByteAsync() { + return new Promise((resolve, reject) => { + this.readByte((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readByteAsync() { + return new Promise((resolve, reject) => { + this.readByte((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readByteAsync() { + return new Promise((resolve, reject) => { + this.readByte((err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } readBytes(cmd, len, callback) { this.setAddress(this.address); @@ -123,23 +291,53 @@ class i2c extends EventEmitter { }); }); } + readBytesAsync(cmd, len) { + return new Promise((resolve, reject) => { + this.readBytes(cmd, len, (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readBytesAsync(cmd, len) { + return new Promise((resolve, reject) => { + this.readBytes(cmd, len, (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } + readBytesAsync(cmd, len) { + return new Promise((resolve, reject) => { + this.readBytes(cmd, len, (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + } - stream(cmd, len, delay) { - if (delay == null) delay = 100; + stream(cmd, len, delay = 100) { this.setAddress(this.address); - wire.readBlock(cmd, len, delay, (err, data) => { - if (err) { - this.emit('error', err); - } else { - this.emit('data', { - address: this.address, - data: data, - cmd: cmd, - length: len, - timestamp: Date.now() - }); - } - }); + + const intervalId = setInterval(() => { + wire.readBlock(cmd, len, null, (err, data) => { + if (err) { + this.emit('error', err); + } else { + this.emit('data', { + address: this.address, + data: data, + cmd: cmd, + length: len, + timestamp: Date.now() + }); + } + }); + }, delay); + + return () => { + clearInterval(intervalId); + }; } } diff --git a/src/i2c.cc b/src/i2c.cc index cb8d6af..9d6e96d 100644 --- a/src/i2c.cc +++ b/src/i2c.cc @@ -160,27 +160,17 @@ void ReadBlock(const Nan::FunctionCallbackInfo& info) { Local buffer = Nan::NewBuffer(len).ToLocalChecked(); + if (i2c_smbus_read_i2c_block_data(fd, cmd, len, data.data()) != len) { + err = Nan::Error(Nan::New("Error reading length of bytes").ToLocalChecked()); + } - while (fd > 0) { - if (i2c_smbus_read_i2c_block_data(fd, cmd, len, data.data()) != len) { - err = Nan::Error(Nan::New("Error reading length of bytes").ToLocalChecked()); - } - - memcpy(node::Buffer::Data(buffer), data.data(), len); + memcpy(node::Buffer::Data(buffer), data.data(), len); - if (info[3]->IsFunction()) { - const unsigned argc = 2; - Local callback = Local::Cast(info[3]); - Local argv[argc] = { err, buffer }; - Nan::Call(callback, Nan::GetCurrentContext()->Global(), argc, argv); - } - - if (info[2]->IsNumber()) { - int32_t delay = info[2]->Int32Value(Nan::GetCurrentContext()).FromJust(); - usleep(delay * 1000); - } else { - break; - } + if (info[3]->IsFunction()) { + const unsigned argc = 2; + Local callback = Local::Cast(info[3]); + Local argv[argc] = { err, buffer }; + Nan::Call(callback, Nan::GetCurrentContext()->Global(), argc, argv); } info.GetReturnValue().Set(buffer);