uci-mcp/lib/port-pin.js

153 lines
3.6 KiB
JavaScript

'use strict'
const _ = require('@uci/utils')
class Pin {
constructor(id, address, opts = {}) {
// at a minimum a byte address is required
this.address = address
// a pin id MUST be supplied in opts 1 to 8
this.id = id
// a custom pin configuration can be passed or choosen from one of the sets, if neither than the default output config is chosen
if (opts.pin_cfg_default) {
if (_.keyExists(config_sets, opts.pin_cfg_default)) {
this.config = _.clone(config_sets[opts.pin_cfg_default])
} else {
console.log(`WARNING config set ${opts.pin_cfg_default} not found using default output set`)
this.config = _.clone(config_sets.output)
}
} else {
this.config = _.clone(config_sets.output)
}
// after setting a default overwrite part or all of pin config with custom
if (opts.pinConfig) {
this.config = Object.assign(this.config, opts.pinConfig)
}
// this.cfgSet = false // set to true when for sure the configuration has been written, changed to false when config is changed.
}
//getters and setters
get adr() {
return this.address
}
get pid() { return this.id }
set pid(pid) { this.id = pid }
// config getters and setters
get cfg() {
return this.config
}
set cfg(config) {
this.config = _.merge(this.config, config) // this merges partial changes
// write the config here.
}
show() {
console.log(`\n=====Pin ${this.id} =====\n Decimal Address ${this.address}`)
console.log('Conifguration: ', this.config)
}
} // End GPIO Pin
//======================
// A port of 8 GPIO pins
class Port {
constructor(opts) {
if (opts) {
this.reverse = opts.reverse ? opts.reverse : false
this.id = opts.portID ? opts.portID : ''
this.desc = opts.portDesc ? opts.portDesc : ''
} else {
opts = {}
this.reverse = false
}
// Create group of 8 pins for port
this.pins = new Array(8)
let pid = ''
for (let i = 0; i < 8; i++) {
this.pins[i] = new Pin(i, Math.pow(2, i), opts)
}
}
// return handle to a port's pin from id
pin(id) {
for (let pins of this.pins) {
if (pin.id === id) {
return pin
}
}
return false
}
// return pin's id on a port from address
pid(address) {
return Math.log(address) / Math.log(2)
}
} // end GPIO Port CLass
//====================
// needs to take current pin and pick out details and make a call the contstructor.
// clone(adr, alias) {
// let newPin = _.clone(this)
// newPin.address = adr
// newPin.alias = alias
// return newPin
// }
// return list of all pin configs, handle to particular config or adding of custom pin configuration at runtime
function configs(cfg) {
if (_.isString(cfg)) {
if (cfg === 'list') {
return Object.keys(config_sets)
}
if (_.keyExists(config_sets, cfg)) {
return config_sets[cfg]
}
return 'configuration no found'
}
_.merge(config_sets, cfg)
// console.log(config_sets)
return `pin configuration ${Object.keys(cfg)} added to configuration set`
}
module.exports = {
Port,
Pin,
configs
}
let config_sets = {
output: {
dir: 0, // 0 output,1 input
ivrt: 0,
pullup: 0,
intr: 0, // if intr = 0 usedef,deval not used
usedef: 0, // if usedef = 0 defval not used
defval: 0
},
toggle_switch: {
dir: 1, // 0 output,1 input
ivrt: 1, // for reading let 1 be zero and vice versa
pullup: 1,
intr: 1, // if intr = 0 usedef,deval not used
usedef: 0, // if usedef = 0 defval not used
defval: 0
},
momentary_switch: {
dir: 1, // 0 output,1 input
ivrt: 1, // for reading let 1 be zero and vice versa
pullup: 1,
intr: 1, // if intr = 0 usedef,deval not used
usedef: 1, // if usedef = 0 defval not used
defval: 1
}
}