pimatic-mysensors
Version:
MySensors Plugin for pimatic
76 lines (61 loc) • 2.37 kB
text/coffeescript
module.exports = (env) ->
events = require 'events'
serialport = require("serialport")
SerialPort = require 'serialport'
Readline = SerialPort.parsers.Readline #require('@serialport/parser-readline')
Promise = env.require 'bluebird'
Promise.promisifyAll(SerialPort.prototype)
class SerialPortDriver extends events.EventEmitter
constructor: (protocolOptions)->
env.logger.debug "initializing SerialPortDriver"
= new SerialPort(protocolOptions.serialDevice, {
baudRate: protocolOptions.baudrate,
autoOpen: false
})
connect: (timeout, retries) ->
# cleanup
= no
.removeAllListeners('error')
.removeAllListeners('data')
.removeAllListeners('close')
.on('error', (error) => )
.on('close', => 'close' )
return .openAsync().then( =>
#resolver = null
# setup data listener
= .pipe(new Readline("\n"));
.on("data", (data) =>
# Sanitize data
line = data.replace(/\0/g, '').trim()
#if line is "ready"
# = yes
# 'ready'
#return
#unless
# got, data but was not ready => reset
# .writeAsync("RESET\n").catch( (error) -> )
# return
)
#return new Promise( (resolve, reject) =>
# write ping to force reset (see data listerner) if device was not reseted probably
# Promise.delay(1000).then( =>
# .writeAsync("PING\n").catch(reject)
# ).done()
# resolver = resolve
#
#).timeout(timeout).catch( (err) =>
#
# .removeAllListeners('data')
# if err.name is "TimeoutError" and retries > 0
# 'reconnect', err
# try to reconnect
# return
# else
# throw err
#)
)
disconnect: -> .closeAsync()
write: (data) -> .writeAsync(data)
module.exports = SerialPortDriver