class SAAL::Sensor
Attributes
description[R]
name[R]
numreads[R]
underlying[RW]
Public Class Methods
new(dbstore, name, underlying, defs, opts={})
click to toggle source
# File lib/sensor.rb 16 def initialize(dbstore, name, underlying, defs, opts={}) 17 @dbstore = dbstore 18 @name = name 19 @underlying = underlying 20 @description = defs['name'] 21 @mock_opts = {} 22 23 if defs['altitude'] && @underlying.sensor_type == :pressure 24 @read_offset = defs['altitude'].to_f/9.2 25 elsif defs['linear_offset'] 26 @read_offset = defs['linear_offset'].to_f 27 else 28 @read_offset = 0.0 29 end 30 31 if defs['linear_multiplier'] 32 @read_multiplier = defs['linear_multiplier'].to_f 33 else 34 @read_multiplier = 1.0 35 end 36 37 @set_type = defs['type'] ? defs['type'].to_sym : nil 38 39 @numreads = (defs['numreads']||1).to_i 40 @numreads = 1 if @numreads == 0 41 @numreads += 1 if @numreads.even? 42 end
Public Instance Methods
average(from, to)
click to toggle source
# File lib/sensor.rb 70 def average(from, to) 71 return @mock_opts[:average] if @mock_opts[:average] 72 apply_offset @dbstore.average(@name, from, to) 73 end
last_value()
click to toggle source
# File lib/sensor.rb 90 def last_value 91 return @mock_opts[:last_value] if @mock_opts[:last_value] 92 apply_offset @dbstore.last_value(@name) 93 end
maximum(from, to)
click to toggle source
# File lib/sensor.rb 85 def maximum(from, to) 86 return @mock_opts[:maximum] if @mock_opts[:maximum] 87 apply_offset @dbstore.maximum(@name, from, to) 88 end
minimum(from, to)
click to toggle source
# File lib/sensor.rb 80 def minimum(from, to) 81 return @mock_opts[:minimum] if @mock_opts[:minimum] 82 apply_offset @dbstore.minimum(@name, from, to) 83 end
mock_set(opts)
click to toggle source
# File lib/sensor.rb 100 def mock_set(opts) 101 @mock_opts.merge!(opts) 102 end
read()
click to toggle source
# File lib/sensor.rb 52 def read 53 real_read(false) 54 end
read_uncached()
click to toggle source
# File lib/sensor.rb 56 def read_uncached 57 real_read(true) 58 end
sensor_type()
click to toggle source
# File lib/sensor.rb 48 def sensor_type 49 @set_type || @underlying.sensor_type 50 end
store_value()
click to toggle source
# File lib/sensor.rb 95 def store_value 96 value = real_read(true,false) 97 @dbstore.write(@name, Time.now.utc.to_i, value) if value 98 end
weighted_average(from, to)
click to toggle source
# File lib/sensor.rb 75 def weighted_average(from, to) 76 return @mock_opts[:weighted_average] if @mock_opts[:weighted_average] 77 apply_offset @dbstore.weighted_average(@name, from, to) 78 end
write(value)
click to toggle source
# File lib/sensor.rb 60 def write(value) 61 if @mock_opts[:value] 62 @mock_opts[:value] = value 63 else 64 ret = @underlying.write(value) 65 store_value 66 ret 67 end 68 end
writeable?()
click to toggle source
# File lib/sensor.rb 44 def writeable? 45 @underlying.writeable? 46 end
Private Instance Methods
apply_offset(v)
click to toggle source
# File lib/sensor.rb 117 def apply_offset(v) 118 v ? v*@read_multiplier+@read_offset : v 119 end
real_read(uncached,offset=true)
click to toggle source
# File lib/sensor.rb 105 def real_read(uncached,offset=true) 106 return @mock_opts[:value] if @mock_opts[:value] 107 values = (0..@numreads-1).map{@underlying.read(uncached)} 108 #FIXME: If we don't get all values give up and return the first value 109 if not values.all? {|v| v.instance_of?(Float) || v.instance_of?(Integer)} 110 value = values[0] 111 else 112 value = values.sort[@numreads/2] 113 end 114 offset ? apply_offset(value) : value 115 end