From 58eee12fb58f352711285fedc4bde382bce41c18 Mon Sep 17 00:00:00 2001 From: Aart van Halteren Date: Wed, 26 Jun 2013 15:05:20 +0200 Subject: [PATCH] Model for reading created State pattern implemented --- .project | 13 +++ Gemfile | 2 + app/helpers/ConfirmingSyncLossState.rb | 5 + app/helpers/ConfirmingSyncPatternState.rb | 21 ++++ app/helpers/InSyncState.rb | 18 ++++ app/helpers/SearchingForSyncState.rb | 13 +++ app/helpers/Synchronizer.rb | 8 ++ app/models/page.rb | 3 - app/models/reading.rb | 3 + db/migrate/001_creates_pages.rb | 8 -- db/migrate/001_creates_readings.rb | 15 +++ example_blurp.txt | 121 ++++++++++++++++++++++ smartmeter.rb | 24 +++-- 13 files changed, 236 insertions(+), 18 deletions(-) create mode 100644 .project create mode 100644 app/helpers/ConfirmingSyncLossState.rb create mode 100644 app/helpers/ConfirmingSyncPatternState.rb create mode 100644 app/helpers/InSyncState.rb create mode 100644 app/helpers/SearchingForSyncState.rb create mode 100644 app/helpers/Synchronizer.rb delete mode 100644 app/models/page.rb create mode 100644 app/models/reading.rb delete mode 100644 db/migrate/001_creates_pages.rb create mode 100644 db/migrate/001_creates_readings.rb create mode 100644 example_blurp.txt diff --git a/.project b/.project new file mode 100644 index 0000000..0a8a20e --- /dev/null +++ b/.project @@ -0,0 +1,13 @@ + + + smartmeter + + + + + + + com.aptana.projects.webnature + com.aptana.ruby.core.rubynature + + diff --git a/Gemfile b/Gemfile index 8919c11..166797f 100644 --- a/Gemfile +++ b/Gemfile @@ -4,3 +4,5 @@ gem "activerecord", "3.2.13" gem "mysql2" gem "serialport" gem "state_pattern" +#gem "daemon-kit" +#gem 'rufus-scheduler', '>= 2.0.3' diff --git a/app/helpers/ConfirmingSyncLossState.rb b/app/helpers/ConfirmingSyncLossState.rb new file mode 100644 index 0000000..628d9b5 --- /dev/null +++ b/app/helpers/ConfirmingSyncLossState.rb @@ -0,0 +1,5 @@ +class ConfirmingSyncLossState < StatePattern::State + def handle_byte_stream(bytes) + p "Please override" + end +end \ No newline at end of file diff --git a/app/helpers/ConfirmingSyncPatternState.rb b/app/helpers/ConfirmingSyncPatternState.rb new file mode 100644 index 0000000..a6157ca --- /dev/null +++ b/app/helpers/ConfirmingSyncPatternState.rb @@ -0,0 +1,21 @@ +class ConfirmingSyncPatternState < StatePattern::State + # Assumes that bytes[0] == Synchronizer::SYNC_PATTERN[0] + def handle_byte_stream(bytes) + idx = 0; + sync_length = Synchronizer::SYNC_PATTERN.length + + # confirm rest of sync pattern + while ((idx < sync_length) && bytes[idx] == Synchronizer::SYNC_PATTERN[idx]) do idx = idx+1 end + + if (idx == sync_length) + #p "Sync pattern confirmed" + transition_to(InSyncState) + else + #p "Back to SearchingForSync state. idx = #{idx}." + transition_to(SearchingForSyncState) + end + + # return the rest + return bytes[idx+1..-1] + end +end \ No newline at end of file diff --git a/app/helpers/InSyncState.rb b/app/helpers/InSyncState.rb new file mode 100644 index 0000000..531a649 --- /dev/null +++ b/app/helpers/InSyncState.rb @@ -0,0 +1,18 @@ +class InSyncState < StatePattern::State + + END_OF_FRAME = "!\n" + + def handle_byte_stream(bytes) + idx = 0 + frame = "" + while (idx < bytes.length && bytes[idx] != END_OF_FRAME[0]) do + frame = frame + bytes[idx] + idx = idx +1 + end + p "------ FRAME -----" + frame_lines = frame.split("\n") + p frame_lines # should call to higher level + p "##################" + return "" + end +end \ No newline at end of file diff --git a/app/helpers/SearchingForSyncState.rb b/app/helpers/SearchingForSyncState.rb new file mode 100644 index 0000000..e07cd8c --- /dev/null +++ b/app/helpers/SearchingForSyncState.rb @@ -0,0 +1,13 @@ +class SearchingForSyncState < StatePattern::State + def handle_byte_stream(bytes) + idx = 0; + # spool unwanted bytes + while (bytes[idx] != Synchronizer::SYNC_PATTERN[0]) do idx = idx+1 end + + #p "Found pattern at idx = #{idx}" + transition_to(ConfirmingSyncPatternState) + + # return + return bytes[idx..-1] + end +end \ No newline at end of file diff --git a/app/helpers/Synchronizer.rb b/app/helpers/Synchronizer.rb new file mode 100644 index 0000000..cf164d5 --- /dev/null +++ b/app/helpers/Synchronizer.rb @@ -0,0 +1,8 @@ +class Synchronizer + include StatePattern + + SYNC_PATTERN = "\n/ISk5\\2ME382-1003\n\n" + + set_initial_state SearchingForSyncState + +end \ No newline at end of file diff --git a/app/models/page.rb b/app/models/page.rb deleted file mode 100644 index fd711fe..0000000 --- a/app/models/page.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Page < ActiveRecord::Base - -end diff --git a/app/models/reading.rb b/app/models/reading.rb new file mode 100644 index 0000000..fbf6dd5 --- /dev/null +++ b/app/models/reading.rb @@ -0,0 +1,3 @@ +class Reading < ActiveRecord::Base + +end diff --git a/db/migrate/001_creates_pages.rb b/db/migrate/001_creates_pages.rb deleted file mode 100644 index eed18e4..0000000 --- a/db/migrate/001_creates_pages.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreatesPages < ActiveRecord::Migration - def change - create_table :pages do |t| - t.text :content - t.boolean :published, default: false - end - end -end diff --git a/db/migrate/001_creates_readings.rb b/db/migrate/001_creates_readings.rb new file mode 100644 index 0000000..03f2d26 --- /dev/null +++ b/db/migrate/001_creates_readings.rb @@ -0,0 +1,15 @@ +class CreatesReadings < ActiveRecord::Migration + def change + create_table :readings do |t| + t.float :total_kwh_consumed_high + t.float :total_kwh_consumed_low + t.float :total_kwh_produced_high + t.float :total_kwh_produced_low + t.float :current_kw_consumed + t.float :current_kw_produced + t.float :total_m3_gas_consumed + t.boolean :high_tarif + t.timestamps + end + end +end diff --git a/example_blurp.txt b/example_blurp.txt new file mode 100644 index 0000000..c904326 --- /dev/null +++ b/example_blurp.txt @@ -0,0 +1,121 @@ + +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.035*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.28*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.036*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.31*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.037*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.32*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.038*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.32*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.039*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.32*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! +/ISk5\2ME382-1003 + +0-0:96.1.1(4B413650303035313238303430383132) +1-0:1.8.1(00553.931*kWh) +1-0:1.8.2(00431.594*kWh) +1-0:2.8.1(00093.034*kWh) +1-0:2.8.2(00147.040*kWh) +0-0:96.14.0(0002) +1-0:1.7.0(0000.00*kW) +1-0:2.7.0(0000.30*kW) +0-0:17.0.0(0999.00*kW) +0-0:96.3.10(1) +0-0:96.13.1() +0-0:96.13.0() +0-1:24.1.0(3) +0-1:96.1.0(3238303131303031323439333134383132) +0-1:24.3.0(130626090000)(00)(60)(1)(0-1:24.2.1)(m3) +(00309.466) +0-1:24.4.0(1) +! diff --git a/smartmeter.rb b/smartmeter.rb index e815fb8..c630477 100644 --- a/smartmeter.rb +++ b/smartmeter.rb @@ -2,17 +2,27 @@ require "rubygems" require "bundler/setup" require "active_record" require "serialport" +require "state_pattern" project_root = File.dirname(File.absolute_path(__FILE__)) Dir.glob(project_root + "/app/models/*.rb").each{|f| require f} - +Dir.glob(project_root + "/app/helpers/*.rb").each{|f| require f} + connection_details = YAML::load(File.open('config/database.yml')) ActiveRecord::Base.establish_connection(connection_details) -# Open connection to serial port -ser = SerialPort.new("/dev/ttyUSB1", 9600, 7, 1, SerialPort::EVEN) +# # Open connection to serial port +# ser = SerialPort.new("/dev/ttyUSB1", 9600, 7, 1, SerialPort::EVEN) +# +# # read until newline +# response = ser.readline("\r") +# response.chomp! +# print "#{response}\n" -# read until newline -response = ser.readline("\r") -response.chomp! -print "#{response}\n" +sync = Synchronizer.new +lines = File.read("example_blurp.txt")[rand(500)..-1] +while (lines.length > 0) + lines = sync.handle_byte_stream(lines) +end + +p sync