diff options
Diffstat (limited to 'sds.rb')
-rwxr-xr-x | sds.rb | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -0,0 +1,66 @@ +#!/usr/bin/env ruby + +class Rdr + def initialize(f) + @f = f + reset + end + + def valid? + @len == 10# && @csok + end + + def read! + v = @f.read(1) + @len += 1 + + case @len + when 1 + reset if v != 0xAA + when 2 + reset if v != 0xC0 + when 3 + @pm25 = v + when 4 + @pm25 += v * 256 + when 5 + @pm10 = v + when 6 + @pm10 += v * 256 + when 7 + @id = v + when 8 + @id += v * 256 + when 9 + if checksum == v + @csok = true + else + reset + end + when 10 + reset if v != 0xAB + else + reset + end + end + + def checksum + ((@pm25 / 256) + (@pm25 % 256) + + (@pm10 / 256) + (@pm10 % 256) + + (@id / 256) + (@id % 256)) % 256 + end + + def reset + @len = 0 + @pm25 = 0 + @pm10 = 0 + @id = 0 + @csok = false + end +end + +File.open("/dev/ttyUSB0", "rb") do |f| + r = Rdr.new(f) + r.read! until r.valid? + puts "Hooray" +end |