refactor bus and device class, testing of i2c r/w

master
David Kebler 2017-01-15 17:59:50 -08:00
parent 34b951f528
commit 635d7fc35e
2 changed files with 82 additions and 25 deletions

View File

@ -15,7 +15,7 @@ class MCP23008 extends Device {
this.ports.A = new Port(opts)
// if not specified there RPi is not managing the interrupt
// pin number on RPi that is connected to and services the interrupt. 4/17/27/22 = 7/11/13/15
this.ports.A.interPin = opts.interPin
this.ports.A.interPin = opts.interPin.A ? opts.interPin.A : opts.interPin
} // end constructor
init() {
@ -49,7 +49,53 @@ class MCP23008 extends Device {
return pSeries(jobs)
} // end writePinsCfg
// reads all pins in all ports
read(cmd, fmt) {
let jobs = []
cmd = cmd ? cmd : 'gpio'
let reg = registers.pin_cmd[cmd]
for (let port in this.ports) {
jobs.push(() => super.read(reg))
reg += 0x10
}
return pSeries(jobs)
}
write() {
}
pinRead(id, opts) {
let mcpdev = this;
return new Promise(function (resolve, reject) {
let cmd = opts.cmd ? opts.cmd : 'gpio'
let fmt = opts.fmt ? opts.fmt : { in: 'PLC', out: 'PLC' }
let reg = registers.pin_cmd[cmd]
let gpio = mcpdev.pin(id)
if (!gpio) {
reject('no pin found for given id')
}
if (gpio.port === 'B') {
reg = reg + 16
}
// call device class read (response is always decimal)
console.log('port - reg', gpio.port, reg)
return mcpdev.read(reg).then(resp => {
resp = _u.byteFormat(resp, { in: 'DEC',
out: 'ARY'
})
let addr = gpio.pin.address.toFmt('ARY')
console.log(addr)
console.log(resp)
resolve(_u.sum(_u.and(addr, resp))) // resolve 1 or 0
})
})
.then(state => console.log(`pin state ${state}`))
.catch(err => console.log(err)) // end Promise
} // end pinRead
pinWrite(id, opts) {
let mcpdev = this;
return new Promise(function (resolve, reject) {
let cmd = opts.cmd ? opts.cmd : 'gpio'
@ -84,10 +130,9 @@ class MCP23017 extends MCP23008 {
constructor(busObj, i2cAddress, opts) {
super(busObj, i2cAddress, opts)
// add a second port
opts.portID = 'B'
this.ports.B = new Port(opts)
this.ports.A.interPin = opts.interPin // if not specified the RPi is not managing the interrupt
this.ports.B.interPin = opts.interPin.B ? opts.interPin.B : opts.interPin
}
pin(id, port) {

View File

@ -49,43 +49,55 @@
it('can set and get a single pin config on both ports', function () {
expect(mcp17.pin(1).cfg, "pin configs getter failed").to.deep.equal(config_sets.momentary_switch)
// expect(mcp17.pin(8).cfg.dir, "pin config getter failed").to.equal(0)
// mcp17.pin(8).cfg.dir = 1
// expect(mcp17.pin(8).config.dir, "pin address setter failed").to.equal(1)
// expect(mcp17.pin(8, 'B').cfg.dir, "pin address getter port B failed").to.equal(0)
// mcp17.pin(8, 'B').cfg.dir = 1
// expect(mcp17.pin(8, 'B').config.dir, "pin address setter failed").to.equal(1)
expect(mcp17.pin(8).cfg.dir, "pin config getter failed").to.equal(1)
mcp17.pin(8).cfg.dir = 0
expect(mcp17.pin(8).cfg.dir, "pin address setter failed").to.equal(0)
expect(mcp17.pin(8, 'B').cfg.dir, "pin address getter port B failed").to.equal(1)
mcp17.pin(8, 'B').cfg.dir = 0
expect(mcp17.pin(8, 'B').config.dir, "pin address setter failed").to.equal(0)
});
});
let mcp8 = new MCP.MCP23008(bus1, 0x21, {
pin_cfg_default: 'toggle_switch',
name: 'relay 1-8'
name: 'test 1-8'
})
describe('MCP23008 Class - ', function () {
it('can set and get a single pin config', function () {
expect(mcp8.pin(1).cfg, "pin configs getter failed").to.deep.equal(config_sets.toggle_switch)
// expect(mcp8.pin(8).cfg.dir, "pin address getter failed").to.equal(1)
// expect(mcp8.pin(8).cfg.ivrt, "pin address getter failed").to.equal(1)
// expect(mcp8.pin(8).cfg.usedef, "pin address getter failed").to.equal(0)
// mcp8.pin(8).cfg.dir = 0
// expect(mcp8.pin(8).cfg.dir, "pin address setter failed").to.equal(0)
// expect(mcp8.pin(8).ivrt, "pin address getter failed").to.equal(1)
expect(mcp8.pin(8).cfg.dir, "pin address getter failed").to.equal(1)
expect(mcp8.pin(8).cfg.ivrt, "pin address getter failed").to.equal(1)
expect(mcp8.pin(8).cfg.usedef, "pin address getter failed").to.equal(0)
mcp8.pin(8).cfg.dir = 0
expect(mcp8.pin(8).cfg.dir, "pin address setter failed").to.equal(0)
expect(mcp8.pin(8).cfg.ivrt, "pin address getter failed").to.equal(1)
});
const ADDR = 0x21,
DIR = 0x00,
RW = 0x09,
ALLPINS = 0x40,
NOPINS = 0x00
const ADDR = 0x20,
W = 0x09,
R = 0x0A,
PINSON = 129,
PINSOFF = 0x00
mcp8.write(DIR, 0x00).then(() =>
mcp8.write(RW, ALLPINS).then(() =>
mcp8.read(RW, ALLPINS).then((resp) => {
console.log('relays on', resp)
let testout = new MCP.MCP23008(bus1, ADDR, {
pin_cfg_default: 'output',
name: 'outputs 1-8'
})
let tasks = [
testout.init(),
testout.write(W, PINSON)
]
testout.init().then(() =>
testout.write(W, PINSON).then(() =>
testout.read(R).then((resp) => {
console.log('Pins Set On', resp)
testout.write(W, PINSOFF)
})
)
)