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