automotive-ecu 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bundle +114 -0
  3. data/bin/coderay +29 -0
  4. data/bin/console +14 -0
  5. data/bin/htmldiff +29 -0
  6. data/bin/irb +29 -0
  7. data/bin/ldiff +29 -0
  8. data/bin/pry +29 -0
  9. data/bin/rake +29 -0
  10. data/bin/rspec +29 -0
  11. data/bin/setup +8 -0
  12. data/lib/core_ext.rb +69 -0
  13. data/lib/ecu/combined_list.rb +25 -0
  14. data/lib/ecu/combined_list_comparison.rb +50 -0
  15. data/lib/ecu/interfaces/a2l/label_list.rb +18 -0
  16. data/lib/ecu/interfaces/a2l/signal_list.rb +15 -0
  17. data/lib/ecu/interfaces/dbc/signal_list.rb +12 -0
  18. data/lib/ecu/interfaces/dcm/buffer.rb +39 -0
  19. data/lib/ecu/interfaces/dcm/festkennfeld.rb +9 -0
  20. data/lib/ecu/interfaces/dcm/festkennlinie.rb +9 -0
  21. data/lib/ecu/interfaces/dcm/festwert.rb +20 -0
  22. data/lib/ecu/interfaces/dcm/festwerteblock.rb +26 -0
  23. data/lib/ecu/interfaces/dcm/functions.rb +13 -0
  24. data/lib/ecu/interfaces/dcm/gruppenkennfeld.rb +9 -0
  25. data/lib/ecu/interfaces/dcm/gruppenkennlinie.rb +9 -0
  26. data/lib/ecu/interfaces/dcm/kennfeld.rb +32 -0
  27. data/lib/ecu/interfaces/dcm/kennlinie.rb +25 -0
  28. data/lib/ecu/interfaces/dcm/label.rb +25 -0
  29. data/lib/ecu/interfaces/dcm/label_list.rb +94 -0
  30. data/lib/ecu/interfaces/dcm/malformed_dcm_error.rb +34 -0
  31. data/lib/ecu/interfaces/dcm/property_parser.rb +51 -0
  32. data/lib/ecu/interfaces/dcm/stuetzstellenverteilung.rb +20 -0
  33. data/lib/ecu/interfaces/lab/combined_list.rb +32 -0
  34. data/lib/ecu/interfaces/lab/lab_parser.rb +61 -0
  35. data/lib/ecu/interfaces/lab/label.rb +21 -0
  36. data/lib/ecu/interfaces/lab/label_list.rb +29 -0
  37. data/lib/ecu/interfaces/lab/signal.rb +15 -0
  38. data/lib/ecu/interfaces/lab/signal_list.rb +29 -0
  39. data/lib/ecu/interfaces/mfile/festwert.rb +10 -0
  40. data/lib/ecu/interfaces/mfile/festwerteblock.rb +12 -0
  41. data/lib/ecu/interfaces/mfile/kennfeld.rb +12 -0
  42. data/lib/ecu/interfaces/mfile/kennlinie.rb +7 -0
  43. data/lib/ecu/interfaces/mfile/label_list.rb +13 -0
  44. data/lib/ecu/interfaces/mfile/stuetzstellenverteilung.rb +7 -0
  45. data/lib/ecu/labels/festwert.rb +58 -0
  46. data/lib/ecu/labels/festwerteblock.rb +80 -0
  47. data/lib/ecu/labels/interpolator.rb +55 -0
  48. data/lib/ecu/labels/kennfeld.rb +107 -0
  49. data/lib/ecu/labels/kennlinie.rb +84 -0
  50. data/lib/ecu/labels/label.rb +82 -0
  51. data/lib/ecu/labels/label_list.rb +137 -0
  52. data/lib/ecu/labels/label_list_comparison.rb +65 -0
  53. data/lib/ecu/labels/stuetzstellenverteilung.rb +65 -0
  54. data/lib/ecu/labels/value_comparison.rb +37 -0
  55. data/lib/ecu/labels/value_printer.rb +49 -0
  56. data/lib/ecu/labels.rb +2 -0
  57. data/lib/ecu/signals/signal.rb +73 -0
  58. data/lib/ecu/signals/signal_list.rb +68 -0
  59. data/lib/ecu/signals/signal_list_comparison.rb +52 -0
  60. data/lib/ecu/signals.rb +2 -0
  61. data/lib/ecu/version.rb +3 -0
  62. data/lib/ecu.rb +59 -0
  63. metadata +161 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f3139f297c357d29c6be36cc632e0cbebf76a3c76e736643c167f5cfe7dc76bf
4
+ data.tar.gz: 3323e14ffcd10a81a12ef769b082cf9f7564b1270531577668e1c7245d8c15c3
5
+ SHA512:
6
+ metadata.gz: fa1e976d1554572d6d5cf99c3dad4b962f6e6a25fc125186cebf0fd0c9bafe090cd5ca160dc54871a472ec5ddb1a7136f0fd8d28b11e5678abd71c8e8a301e46
7
+ data.tar.gz: 020715725ac80d08fe8171d1af0f93b80dec3541fcd96272c1a77400f8de88fcae6ad54233c44e00214cfc7bbd96137d8ad0cccf27d3c756516f053f5f525486
data/bin/bundle ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ ARGV.each_with_index do |a, i|
30
+ if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
+ bundler_version = a
32
+ end
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../../gems.rb", __FILE__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_version
64
+ @bundler_version ||=
65
+ env_var_version || cli_arg_version ||
66
+ lockfile_version
67
+ end
68
+
69
+ def bundler_requirement
70
+ return "#{Gem::Requirement.default}.a" unless bundler_version
71
+
72
+ bundler_gem_version = Gem::Version.new(bundler_version)
73
+
74
+ requirement = bundler_gem_version.approximate_recommendation
75
+
76
+ return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0")
77
+
78
+ requirement += ".a" if bundler_gem_version.prerelease?
79
+
80
+ requirement
81
+ end
82
+
83
+ def load_bundler!
84
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
85
+
86
+ activate_bundler
87
+ end
88
+
89
+ def activate_bundler
90
+ gem_error = activation_error_handling do
91
+ gem "bundler", bundler_requirement
92
+ end
93
+ return if gem_error.nil?
94
+ require_error = activation_error_handling do
95
+ require "bundler/version"
96
+ end
97
+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
98
+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
99
+ exit 42
100
+ end
101
+
102
+ def activation_error_handling
103
+ yield
104
+ nil
105
+ rescue StandardError, LoadError => e
106
+ e
107
+ end
108
+ end
109
+
110
+ m.load_bundler!
111
+
112
+ if m.invoked_as_script?
113
+ load Gem.bin_path("bundler", "bundle")
114
+ end
data/bin/coderay ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'coderay' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("coderay", "coderay")
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ecu"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/htmldiff ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'htmldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "htmldiff")
data/bin/irb ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'irb' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("irb", "irb")
data/bin/ldiff ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'ldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "ldiff")
data/bin/pry ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'pry' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("pry", "pry")
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
data/bin/rspec ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/core_ext.rb ADDED
@@ -0,0 +1,69 @@
1
+ class String
2
+ BLANK_RE = /\A[[:space:]]*\z/
3
+
4
+ def blank?
5
+ empty? || BLANK_RE === self || self == "\u001A"
6
+ end
7
+
8
+ def indent(spaces = 2)
9
+ lines.map { |line| " " * spaces + line }.join
10
+ end
11
+
12
+ def inline_dcm
13
+ "KONSERVIERUNG_FORMAT 2.0\n\n" + self
14
+ end
15
+
16
+ def enquote
17
+ "\"#{to_s}\""
18
+ end
19
+
20
+ def to_si
21
+ [self].pack("H*").unpack("l>").first
22
+ end
23
+
24
+ def delete_surrounding(char)
25
+ self.delete_prefix(char).delete_suffix(char)
26
+ end
27
+
28
+ def to_regexp(ignorecase: false, multiline: false, extended: false)
29
+ options = 0
30
+ options = options | Regexp::EXTENDED if extended
31
+ options = options | Regexp::IGNORECASE if ignorecase
32
+ options = options | Regexp::MULTILINE if multiline
33
+ Regexp.new(self, options)
34
+ end
35
+ end
36
+
37
+ class Regexp
38
+ def extract_captures(str)
39
+ data = match(str)
40
+ return {} if data.nil?
41
+ data.named_captures.symbolize_keys
42
+ end
43
+ end
44
+
45
+ class Array
46
+ def avg
47
+ empty? ? nil : sum.to_f / count
48
+ end
49
+ end
50
+
51
+ class Hash
52
+ def symbolize_keys
53
+ self.map { |k, v| [k.to_sym, v] }.to_h
54
+ end
55
+ end
56
+
57
+ class File
58
+ def self.read_encoded(filepath)
59
+ read(filepath).encode('UTF-8', 'ISO-8859-1', invalid: :replace, undef: :replace, replace: '')
60
+ #read(filepath)
61
+ end
62
+ end
63
+
64
+ class Range
65
+ def overlaps?(other)
66
+ max >= other.min && min <= other.min ||
67
+ other.max >= min && other.min <= min
68
+ end
69
+ end
@@ -0,0 +1,25 @@
1
+ require_relative "labels/label_list"
2
+ require_relative "signals/signal_list"
3
+ require_relative "combined_list_comparison"
4
+ require_relative "interfaces/lab/combined_list"
5
+
6
+ class Ecu
7
+ class CombinedList
8
+
9
+ def initialize(signals=SignalList.new, labels=LabelList.new, headers=[], subheaders=[])
10
+ @signals = signals
11
+ @labels = labels
12
+ @headers = headers
13
+ @subheaders = subheaders
14
+ end
15
+
16
+ attr_accessor :signals, :labels, :headers, :subheaders
17
+
18
+ def to_s
19
+ "<CombinedList: #{signals.count} signals, #{labels.count} labels}>"
20
+ end
21
+
22
+ def inspect; to_s end
23
+
24
+ end
25
+ end
@@ -0,0 +1,50 @@
1
+ require_relative "signals/signal_list_comparison"
2
+ require_relative "labels/label_list_comparison"
3
+ require_relative "combined_list"
4
+
5
+ class Ecu
6
+ class CombinedListComparison
7
+
8
+ def initialize(left, right)
9
+
10
+ # TODO: This could/should be more leaniant and convert
11
+ # {Signal/Label}Lists on the fly to allow for comparison
12
+
13
+ unless left.is_a?(CombinedList) && right.is_a?(CombinedList)
14
+ fail "Can only merge CombinedList (left: #{left.class}, right: #{right.class})!"
15
+ end
16
+
17
+ @signal_comparison = SignalListComparison.new(left.signals, right.signals)
18
+ @label_comparison = LabelListComparison.new(left.labels, right.labels)
19
+ end
20
+
21
+ def names(spec)
22
+ signal_comparison.names(spec) + label_comparison.names(spec)
23
+ end
24
+
25
+ def left_exclusive
26
+ signal_comparison.left_exclusive + label_comparison.left_exclusive
27
+ end
28
+
29
+ def right_exclusive
30
+ signal_comparison.right_exclusive + label_comparison.right_exclusive
31
+ end
32
+
33
+ def differences
34
+ signal_comparison.differences + label_comparison.differences
35
+ end
36
+
37
+ def merge(priority: :right)
38
+ CombinedList.new \
39
+ signal_comparison.merge(priority: priority),
40
+ label_comparison.merge(priority: priority),
41
+ signal_comparison.headers, # Both should merge headers the same
42
+ signal_comparison.subheaders # way, so it doesn't matter
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :signal_comparison, :label_comparison
48
+
49
+ end
50
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "../../../core_ext"
2
+
3
+ class Ecu
4
+ class LabelList
5
+ A2LREGEXP = %r{/begin CHARACTERISTIC\s+([\S]+)\s+"([^"]*)"}
6
+
7
+ def self.from_a2l(str)
8
+ str.gsub!(%r{/\*.*?\*/}, "")
9
+ labels = str.scan(A2LREGEXP).map do |name, description|
10
+ # Ugly hack: Create dummy Festwert until better parsing
11
+ # is implemented
12
+ Ecu::Festwert.new(name: name, description: description, value: 0)
13
+ end
14
+ new(labels)
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,15 @@
1
+ require_relative "../../../core_ext"
2
+
3
+ class Ecu
4
+ class SignalList
5
+ A2LREGEXP = %r{/begin MEASUREMENT\s+([\S]+)\s+"([^"]*)"}
6
+
7
+ def self.from_a2l(str)
8
+ str.gsub!(%r{/\*.*?\*/}, "")
9
+ signals = str.scan(A2LREGEXP).map do |name, description|
10
+ Ecu::Signal.new(name: name, description: description)
11
+ end
12
+ new(signals)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+
2
+ class Ecu
3
+ class SignalList
4
+ DBCREGEXP = / SG_ ([A-Z_0-9]+) : .*/
5
+
6
+ def self.from_dbc(file_path)
7
+ new(File.open(file_path, "rb").read.scan(DBCREGEXP).map do |name|
8
+ Ecu::Signal.new(name: name.first)
9
+ end.reject { |signal| signal.name =~ /TA|TPCI/ })
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,39 @@
1
+ class DcmBuffer
2
+ attr_reader :buffer, :header, :constructor
3
+ def initialize
4
+ @constructor = nil
5
+ @header = :pre
6
+ @buffer = []
7
+ end
8
+
9
+ def start!(constructor, buffer)
10
+ fail "Nested parameter" unless self.buffer.empty?
11
+ fail "Missing DCM header" if self.header == :pre
12
+
13
+ @header = :done
14
+ @constructor = constructor
15
+ @buffer = buffer
16
+ end
17
+
18
+ def finish!(line)
19
+ fail "Unexpected END" if constructor.nil?
20
+ append!(line)
21
+
22
+ constructor.from_dcm(buffer).tap { reset! }
23
+ end
24
+
25
+ def reset!
26
+ @constructor = nil
27
+ @buffer = []
28
+ end
29
+
30
+ def header_seen!
31
+ @header = :after
32
+ end
33
+
34
+ def append!(line)
35
+ fail "No label started" if constructor.nil?
36
+
37
+ @buffer << line
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "kennfeld"
2
+
3
+ class Ecu
4
+ class Festkennfeld < Kennfeld
5
+ def self.dcm_header
6
+ %r{^FESTKENNFELD\s+(?<name>[A-Za-z0-9\._]+)\s+(?<xdim>\d+)\s+(?<ydim>\d+)}
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "kennlinie"
2
+
3
+ class Ecu
4
+ class Festkennlinie < Kennlinie
5
+ def self.dcm_header
6
+ %r{^FESTKENNLINIE\s+(?<name>[A-Za-z0-9\._]+)\s+(?<xdim>\d+)}
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ class Ecu
2
+ class Festwert < Label
3
+ def self.dcm_header
4
+ %r{FESTWERT\s+(?<name>[A-Za-z0-9\._]+)}
5
+ end
6
+
7
+ def to_dcm
8
+ "#{type.upcase} #{name}\n".tap do |str|
9
+ str << " LANGNAME #{description.enquote}\n" if description
10
+ str << " FUNKTION #{function}\n" if function
11
+ str << " EINHEIT_W #{unit.enquote}\n" if unit
12
+ str << case value
13
+ when Numeric then " WERT #{value}\n"
14
+ when String then " TEXT #{value.enquote}\n"
15
+ end
16
+ str << "END\n"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require_relative "../../../core_ext"
2
+
3
+ class Ecu
4
+ class Festwerteblock < Label
5
+ def self.dcm_header
6
+ %r{FESTWERTEBLOCK\s+(?<name>[A-Za-z0-9\._]+)\s+(?<xdim>\d+)(?:\s+@\s+(?<ydim>\d+))?}
7
+ end
8
+
9
+ def to_dcm
10
+ "FESTWERTEBLOCK #{name} #{xdim}".tap do |str|
11
+ str << " @ #{ydim}" if ydim != 1
12
+ str << "\n"
13
+ str << " LANGNAME #{description.enquote}\n" if description
14
+ str << " FUNKTION #{function}\n" if function
15
+ str << " EINHEIT_W #{unit.enquote}\n" if unit
16
+ value.each do |row|
17
+ str << case row.first
18
+ when Numeric then " WERT #{row.join(" ")}\n"
19
+ when String then " TEXT #{row.map(&:enquote).join(" ")}\n"
20
+ end
21
+ end
22
+ str << "END\n"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "property_parser"
2
+
3
+ class Ecu
4
+ class Functions
5
+ def self.dcm_header
6
+ /FUNKTIONEN.*/
7
+ end
8
+
9
+ def self.from_dcm(input)
10
+ new
11
+ end
12
+ end
13
+ end