UNPKG

rpi-softspi

Version:

Software SPI implementation to use any Raspberry Pi pins as a SPI interface

3 lines (2 loc) 2.88 kB
/*! rpi-softspi 14-08-2017 */ var rpio=require("rpio");class SoftSPI{constructor(t){this.ClkPhase={First:0,Second:1},this.ClkTrigger={High:0,Low:2},this.assert(t.clock>0,"Clock pin must be specified"),this.default={clock:null,miso:null,mosi:null,client:null,clientSelect:rpio.LOW,mode:0,bitOrder:SoftSPI.MSB},t=Object.assign([],this.default,t),this.clock=t.clock,this.miso=t.miso,this.mosi=t.mosi,this.client=t.client,this.clientSelect=t.clientSelect,this.mode=t.mode,this.bitOrder=t.bitOrder,this.valid=!1}static get MSB(){return 1}static get LSB(){return 0}assert(t,i){if(!t)throw i}set mode(t){this.assert(t>=0&&t<=3,"Mode "+t+" not supported"),this._mode=t,this.clockPhase=t&this.ClkPhase.Second,this.clockTrigger=t&this.ClkTrigger.Low?rpio.LOW:rpio.HIGH,this.valid=!1}get mode(){return this._mode}set bitOrder(t){t===SoftSPI.MSB?(this._bitOrder=SoftSPI.MSB,this.bitMask=128,this.writeShift=SoftSPI.shiftLeft,this.readShift=SoftSPI.shiftRight):(this._bitOrder=SoftSPI.LSB,this.bitMask=1,this.writeShift=SoftSPI.shiftRight,this.readShift=SoftSPI.shiftLeft),this.valid=!1}get bitOrder(){return this._bitOrder}static pinVal(t){return t?rpio.HIGH:rpio.LOW}get clockOn(){return SoftSPI.pinVal(this.clockTrigger)}get clockOff(){return SoftSPI.pinVal(!this.clockTrigger)}get clientOn(){return SoftSPI.pinVal(this.clientSelect)}get clientOff(){return SoftSPI.pinVal(!this.clientSelect)}open(){return rpio.open(this.clock,rpio.OUTPUT,this.clockOff),this.client&&rpio.open(this.client,rpio.OUTPUT,this.clientOff),this.mosi&&rpio.open(this.mosi,rpio.OUTPUT,rpio.LOW),this.miso&&rpio.open(this.miso,rpio.INPUT),this.valid=!0,this}activateClient(){this.client&&rpio.write(this.client,this.clientOn)}deactivateClient(){this.client&&rpio.write(this.client,this.clientOff)}read(t){return this.transfer(new Uint8Array(t),!0,!1)}write(t){return this.transfer(t,!1,!0),this}transferBit(t,i,s,e){let r=0;return e&&rpio.write(this.mosi,SoftSPI.pinVal(this.writeShift(t,i)&this.bitMask)),rpio.write(this.clock,this.clockOn),s&&this.clockPhase===this.ClkPhase.First&&(r=rpio.read(this.miso)),rpio.write(this.clock,this.clockOff),s&&this.clockPhase===this.ClkPhase.Second&&(r=rpio.read(this.miso)),r}transferByte(t,i,s){let e=0;for(let r=0;r<8;++r)this.transferBit(t,r,i,s)?e|=this.readShift(this.bitMask,r):e&=~this.readShift(this.bitMask,r);return e}transfer(t,i=!0,s=!0){this.assert(this.valid,"Not initialized"),this.assert(!i||this.miso,"No input pin defined"),this.assert(!s||this.mosi,"No output pin defined");let e=Uint8Array.from(t),r=[];this.activateClient();for(let t of e)r.push(this.transferByte(t,i,s));return this.deactivateClient(),r}close(){return this.miso&&rpio.close(this.miso),this.mosi&&rpio.close(this.mosi),rpio.close(this.clock),this.client&&rpio.close(this.client),this.valid=!1,this}static shiftLeft(t,i){return t<<i}static shiftRight(t,i){return t>>i}}module.exports=SoftSPI;