noflo-legoev3
Version:
NoFlo components for a LEGO Mindstorms EV3
95 lines (77 loc) • 2.66 kB
text/coffeescript
fs = require 'fs'
noflo = require 'noflo'
# noflo-nodejs
# http://www.ev3dev.org/docs/sensors/lego-ev3-color-sensor/
LOG_PREFIX = 'legoev3/ColorSensor:'
ENC = { encoding: 'utf8' }
class ColorSensor extends noflo.Component
description: 'Detect colors/brightness.'
icon: 'tint'
constructor: ->
#console.log "#{LOG_PREFIX} creating new component"
= null
= false
= null
=
'refletive': 'COL-REFLECT'
'ambient': 'COL-AMBIENT'
'color': 'COL-COLOR'
1
['refletive']
= new noflo.InPorts
kick:
datatype: 'bang'
description: 'Probe the sensor'
port:
datatype: 'int'
values: [1,2,3,4]
description: 'Sensor port'
mode:
# values: /sys/class/msensor/sensorX/modes
datatype: 'string'
values: ['reflective','ambient', 'color']
description: 'Sensor mode'
= new noflo.OutPorts
value:
datatype: 'int'
description: 'Sends the color when changed'
.kick.on 'data', =>
return if or is null
= true
new_value = parseInt (fs.readFileSync + '/value0', ENC)
# Only send messages on change
if new_value isnt
#console.log "#{LOG_PREFIX} read: #{new_value}"
= new_value
.value.send new_value
= false
.mode.on 'data', (data) =>
data
.port.on 'data', (data) =>
data
#console.log "#{LOG_PREFIX} created new component"
updateMode: (mode) ->
return if is null
fs.writeFile + '/mode', [mode]
updateBase: (port) ->
dir = '/sys/class/msensor/'
try
files = fs.readdirSync dir
files = (file for file in files when file.slice(0, 6) is 'sensor')
wanted = 'in' + port
console.log "#{LOG_PREFIX} searching for #{wanted} in #{files.length} entries"
for file in files
path = dir + file
port_name = fs.readFileSync path + '/port_name', ENC
if port_name.trim() is wanted
type_id = fs.readFileSync path + '/type_id', ENC
if type_id.trim() is "29"
= path
console.log "#{LOG_PREFIX} new base: #{@base}"
.value.connect()
else
console.log "#{LOG_PREFIX} wrong sensor type: #{type_id} != 29"
break
catch err
console.log "#{LOG_PREFIX} readdir failed: #{err}"
exports.getComponent = -> new ColorSensor