pimatic-johnny-five
Version:
Pimatic Plugin for Johnny Five, a Robotics and IoT programming framework.
84 lines (70 loc) • 2.48 kB
text/coffeescript
module.exports = (env) ->
Promise = env.require 'bluebird'
_ = env.require 'lodash'
five = require('johnny-five')
commons = require('pimatic-plugin-commons')(env)
# Device class representing an Johnny Five digital output
class JohnnyFiveSwitch extends env.devices.SwitchActuator
# Create a new JohnnyFiveSwitch device
# @param [Object] config device configuration
# @param [JohnnyFivePlugin] plugin plugin instance
# @param [Object] lastState state information stored in database
constructor: (@config, @plugin, lastState) ->
@id = @config.id
@name = @config.name
super()
@debug = @plugin.config.debug || false
@_base = commons.base @, @config.class
@_state = off
@boardHandle = @plugin.boardManager.getBoard(@config.boardId)
#console.log("----------------------", lastState)
@boardHandle.boardReady()
.then (board)=>
@_base.debug "initializing digital output pin #{@config.pin}"
@pin = new five.Pin {
pin: @config.pin
type: "digital"
mode: 1
board: board
}
@changeStateTo lastState?.state?.value or off
.catch (error) =>
@_base.rejectWithError null, error
destroy: () ->
super()
_queryState: () ->
return new Promise( (resolve, reject) =>
@boardHandle.boardReady()
.then (board) =>
try
if (board.remote)
resolve @_state
else
resolve if @pin.value is 1 then true else false
catch e
@_base.rejectWithError reject, e
.catch (error) =>
@_base.rejectWithError reject, error
)
changeStateTo: (newState) ->
@_base.debug "state change requested to: #{newState}"
return new Promise (resolve, reject) =>
@boardHandle.boardReady()
.then (board)=>
stateVal = if newState then 1 else 0
try
@pin.write stateVal
catch e
@_base.rejectWithError reject, e
if board.remote
@_setState newState
resolve()
else
@_queryState()
.then (state) =>
@_setState state
resolve()
.catch (error) =>
@_base.rejectWithError reject, error
getState: () ->
return Promise.resolve @_state