raudi 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/.DS_Store +0 -0
  2. data/.rvmrc +1 -1
  3. data/bin/raudi +17 -0
  4. data/configuration/atmega_328.yml +69 -0
  5. data/configuration/avr.yml +61 -0
  6. data/lib/.DS_Store +0 -0
  7. data/lib/raudi.rb +58 -9
  8. data/lib/raudi/.DS_Store +0 -0
  9. data/lib/raudi/action_processor.rb +34 -26
  10. data/lib/raudi/avr.rb +4 -0
  11. data/lib/raudi/avr/.DS_Store +0 -0
  12. data/lib/raudi/avr/controller.rb +73 -0
  13. data/lib/raudi/avr/pin.rb +30 -0
  14. data/lib/raudi/avr/pin_states.rb +73 -0
  15. data/lib/raudi/avr/port.rb +36 -0
  16. data/lib/raudi/avr/timer.rb +49 -0
  17. data/lib/raudi/core_ext.rb +1 -0
  18. data/lib/raudi/core_ext/fixnum.rb +16 -0
  19. data/lib/raudi/info.rb +52 -0
  20. data/lib/raudi/processing.rb +63 -0
  21. data/lib/raudi/processing/gpio.rb +25 -0
  22. data/lib/raudi/processing/int.rb +36 -0
  23. data/lib/raudi/processing/pcint.rb +35 -0
  24. data/lib/raudi/processing/timer.rb +56 -0
  25. data/lib/raudi/proxy/.DS_Store +0 -0
  26. data/lib/raudi/proxy/controller.rb +65 -0
  27. data/lib/raudi/proxy/external_interrupt.rb +30 -0
  28. data/lib/raudi/proxy/gpio.rb +19 -0
  29. data/lib/raudi/proxy/headers.rb +31 -0
  30. data/lib/raudi/proxy/timer.rb +61 -0
  31. data/lib/raudi/source.rb +48 -0
  32. data/lib/raudi/source/action.rb +16 -0
  33. data/lib/raudi/source/bit_operations.rb +35 -0
  34. data/lib/raudi/source/block.rb +44 -0
  35. data/lib/raudi/source/controller.rb +56 -0
  36. data/lib/raudi/source/function.rb +50 -0
  37. data/lib/raudi/source/interrupt.rb +35 -0
  38. data/lib/raudi/source/variable.rb +31 -0
  39. data/lib/raudi/state_list.rb +17 -0
  40. data/raudi.gemspec +3 -0
  41. data/spec/.DS_Store +0 -0
  42. data/spec/examples/sample.raudi +5 -0
  43. data/spec/lib/.DS_Store +0 -0
  44. data/spec/lib/raudi/.DS_Store +0 -0
  45. data/spec/lib/raudi/action_processor_spec.rb +35 -0
  46. data/spec/lib/raudi/avr/controller_spec.rb +13 -0
  47. data/spec/lib/raudi/avr/pin_spec.rb +70 -0
  48. data/spec/lib/raudi/avr/timer_spec.rb +22 -0
  49. data/spec/lib/raudi/info_spec.rb +9 -0
  50. data/spec/lib/raudi/proxy/external_interrupt_spec.rb +22 -0
  51. data/spec/lib/raudi/proxy/gpio_spec.rb +18 -0
  52. data/spec/lib/raudi/proxy/headers_spec.rb +34 -0
  53. data/spec/lib/raudi/proxy/timer_spec.rb +67 -0
  54. data/spec/lib/raudi/source/external_interrupt_spec.rb +55 -0
  55. data/spec/lib/raudi/source/gpio_spec.rb +18 -0
  56. data/spec/lib/raudi/source/main_structure_spec.rb +19 -0
  57. data/spec/lib/raudi/source/timer_spec.rb +44 -0
  58. data/spec/lib/raudi_spec.rb +41 -0
  59. data/spec/spec_helper.rb +10 -0
  60. data/spec/support/raudi_spec_helper.rb +27 -0
  61. metadata +106 -19
  62. data/examples/actions.raudi +0 -1
  63. data/examples/config.rb +0 -3
  64. data/examples/result.c +0 -10
  65. data/lib/raudi/avr_controller.rb +0 -23
  66. data/spec/raudi_spec.rb +0 -9
data/.DS_Store ADDED
Binary file
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm 1.9.3@raudi --create
1
+ rvm 1.9.2@raudi --create
data/bin/raudi ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'raudi'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ require 'raudi'
8
+ end
9
+
10
+ puts %Q{
11
+ Usage:
12
+ raudi source_file.raudi [options]
13
+
14
+ Options:
15
+ -o, [--output] # Set output file
16
+
17
+ } unless Raudi.process(*ARGV)
@@ -0,0 +1,69 @@
1
+ frequency: 16000000
2
+ max_frequency: 20000000
3
+ ports:
4
+ b:
5
+ pc_number: 0
6
+ pins:
7
+ 0:
8
+ - pcint_0
9
+ 1:
10
+ - pcint_1
11
+ 2:
12
+ - pcint_2
13
+ 3:
14
+ - pcint_3
15
+ 4:
16
+ - pcint_4
17
+ 5:
18
+ - pcint_5
19
+ 6:
20
+ - pcint_6
21
+ 7:
22
+ - pcint_7
23
+ c:
24
+ pc_number: 1
25
+ pins:
26
+ 0:
27
+ - pcint_8
28
+ 1:
29
+ - pcint_9
30
+ 2:
31
+ - pcint_10
32
+ 3:
33
+ - pcint_11
34
+ 4:
35
+ - pcint_12
36
+ 5:
37
+ - pcint_13
38
+ 6:
39
+ - pcint_14
40
+ d:
41
+ pc_number: 2
42
+ pins:
43
+ 0:
44
+ - pcint_16
45
+ 1:
46
+ - pcint_17
47
+ 2:
48
+ - int_0
49
+ - pcint_18
50
+ 3:
51
+ - int_1
52
+ - pcint_19
53
+ 4:
54
+ - pcint_20
55
+ - timer_0
56
+ 5:
57
+ - pcint_21
58
+ - timer_1
59
+ 6:
60
+ - pcint_22
61
+ 7:
62
+ - pcint_23
63
+ timers:
64
+ timer_0:
65
+ length: 8
66
+ timer_1:
67
+ length: 16
68
+ timer_2:
69
+ length: 8
@@ -0,0 +1,61 @@
1
+ headers:
2
+ avr:
3
+ - boot
4
+ - cpufunc
5
+ - eeprom
6
+ - fuse
7
+ - interrupt
8
+ - io
9
+ - lock
10
+ - pgmspace
11
+ - power
12
+ - sfr_defs
13
+ - signature
14
+ - sleep
15
+ - version
16
+ - wdt
17
+ common:
18
+ - alloca
19
+ - assert
20
+ - ctype
21
+ - errno
22
+ - inttypes
23
+ - math
24
+ - setjmp
25
+ - stdint
26
+ - stdio
27
+ - stdlib
28
+ - string
29
+ util:
30
+ - atomic
31
+ - crc16
32
+ - delay
33
+ - delay_basic
34
+ - parity
35
+ - setbaud
36
+ - twi
37
+
38
+ gpio_states:
39
+ - input
40
+ - pullup
41
+ - output
42
+ specific_pin_states:
43
+ - int
44
+ - pcint
45
+ - timer
46
+
47
+ interrupts:
48
+ events:
49
+ low: 0
50
+ both: 1
51
+ falling: 2
52
+ rising: 3
53
+ timers:
54
+ prescale:
55
+ 1: 1
56
+ 8: 2
57
+ 64: 3
58
+ 256: 4
59
+ 1024: 5
60
+ falling: 6
61
+ rising: 7
data/lib/.DS_Store ADDED
Binary file
data/lib/raudi.rb CHANGED
@@ -1,5 +1,9 @@
1
+ require 'forwardable'
2
+ require 'yaml'
1
3
  require 'raudi/action_processor'
2
- require 'raudi/avr_controller'
4
+ require 'raudi/core_ext'
5
+ require 'raudi/info'
6
+ require 'raudi/avr'
3
7
 
4
8
  module Raudi
5
9
 
@@ -8,18 +12,63 @@ module Raudi
8
12
  attr_accessor :controller
9
13
 
10
14
  def version
11
- "0.0.1"
15
+ "0.0.2"
12
16
  end
13
17
 
14
- def generate(config_file, actions_file)
15
- absolute_config_path = File.expand_path(config_file)
16
- absolute_actions_path = File.expand_path(actions_file)
17
- raise 'Create configuration file config.rb before' unless File.exists?(absolute_config_path)
18
- raise 'Create actions file actions.raudi before' unless File.exists?(absolute_actions_path)
19
- load(absolute_config_path)
20
- ActionProcessor.generate_source(absolute_config_path)
18
+ def configure(model_name, &block)
19
+ Raudi::AVR::Controller.new(model_name, &block)
20
+ end
21
+
22
+ def action
23
+ @action ||= Raudi::ActionProcessor.new
24
+ end
25
+
26
+ def process(*args)
27
+ return unless filename = check_filename(args)
28
+ begin
29
+ load filename
30
+ return write_file(filename, args)
31
+ rescue Exception => e
32
+ puts e.message
33
+ end
34
+ false
35
+ end
36
+
37
+ private
38
+
39
+ def check_filename(args)
40
+ filename = args.delete_at(0)
41
+ return unless filename
42
+ return unless File.exists?(filename)
43
+ return unless filename =~ /.*\.raudi$/i
44
+ filename
45
+ end
46
+
47
+ def param_alias(param)
48
+ {'--output' => '-o'}[param] or param
49
+ end
50
+
51
+ def write_file(source_path, args)
52
+ return unless source = controller.to_c
53
+ output = source_path.gsub(/\.raudi$/i, '.c')
54
+ args.each_with_index do |param, index|
55
+ next unless param_alias(param) == '-o'
56
+ custom_output = args[index + 1]
57
+ output = custom_output if custom_output
58
+ break
59
+ end
60
+ File.open(output, 'w') {|f| f.write(source) }
61
+ true
21
62
  end
22
63
 
23
64
  end
24
65
 
25
66
  end
67
+
68
+ def action
69
+ Raudi.action
70
+ end
71
+
72
+ def configure(*args, &block)
73
+ Raudi.configure(*args, &block)
74
+ end
Binary file
@@ -1,33 +1,41 @@
1
- module ActionProcessor
2
-
3
- class << self
4
-
5
- def generate_source(actions_file)
6
- raise %q{Controller isn't specified in config.rb file} unless Raudi.controller
7
- define_actions(actions_file)
8
- output = ''
9
- output << append_libs(Raudi.controller.libs)
10
- output << block_delimiter
11
- output << main_block
1
+ module Raudi
2
+
3
+ class ActionProcessor
4
+
5
+ attr_accessor :collection
6
+
7
+ def initialize
8
+ self.collection = {}
12
9
  end
13
-
14
- def append_libs(libs)
15
- libs.map do |lib_name|
16
- lib_name = lib_name.to_s
17
- lib_name << '.h' unless lib_name =~ /\.h$/
18
- "#include <#{lib_name}>"
19
- end.join("\n")
10
+
11
+ def [](*keys)
12
+ collection[prepare_key(*keys)]
20
13
  end
21
-
22
- def block_delimiter
23
- "\n"
14
+
15
+ def []=(*keys, value)
16
+ collection[prepare_key(*keys)] = value
24
17
  end
25
-
26
- def define_actions(actions_file)
27
- File.open(actions_file) do |file|
18
+
19
+ private
20
+
21
+ def prepare_key(*keys)
22
+ number = if keys.last.is_a?(Fixnum)
23
+ keys.pop
28
24
  end
25
+
26
+ key = keys.map{|key| key.to_s.downcase}.join('_')
27
+ key = key_alias(key)
28
+
29
+ key << number.to_s if number
30
+ key.to_sym
29
31
  end
30
-
32
+
33
+ def key_alias(key)
34
+ {
35
+ 'interrupt' => 'int'
36
+ }[key] or key
37
+ end
38
+
31
39
  end
32
40
 
33
- end
41
+ end
data/lib/raudi/avr.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'raudi/avr/controller'
2
+ require 'raudi/avr/port'
3
+ require 'raudi/avr/pin'
4
+ require 'raudi/avr/timer'
Binary file
@@ -0,0 +1,73 @@
1
+ require 'raudi/proxy/controller'
2
+ require 'raudi/source/controller'
3
+ require 'raudi/state_list'
4
+
5
+ module Raudi
6
+
7
+ module AVR
8
+
9
+ class Controller
10
+
11
+ extend Forwardable
12
+ include Raudi::StateList
13
+
14
+ attr_accessor :model_name, :headers, :ports, :timers, :interrupt
15
+
16
+ def_delegator :source, :to_c
17
+
18
+ def initialize(model_name, &block)
19
+ self.model_name = model_name
20
+ load_ports
21
+ load_timers
22
+ self.headers = ['avr/io']
23
+ Proxy::Controller.new(self, &block) if block_given?
24
+ Raudi.controller = self
25
+ end
26
+
27
+ def ports(port_name = nil)
28
+ if port_name
29
+ @ports.detect{|port| port.name == port_name.to_s.upcase}
30
+ else
31
+ @ports
32
+ end
33
+ end
34
+
35
+ def pins
36
+ ports.map(&:pins).flatten
37
+ end
38
+
39
+ def source
40
+ @source ||= Source::Controller.new(self)
41
+ end
42
+
43
+ private
44
+
45
+ def config
46
+ @config ||= begin
47
+ path = File.join(File.dirname(__FILE__), '/../../../configuration', "/#{model_name}.yml")
48
+ raise "Unknow controller model" unless File.exist?(path)
49
+ YAML.load_file(path)
50
+ end
51
+ end
52
+
53
+ def load_ports
54
+ self.ports = config['ports'].map {|port_name, config| Port.new(port_name, config)}
55
+ end
56
+
57
+ def load_timers
58
+ self.timers = config['timers'].map{|timer_name, config| Timer.new(timer_name, config)}
59
+ end
60
+
61
+ def method_missing(method_name, *args, &block)
62
+ if value = config[method_name.to_s]
63
+ value
64
+ else
65
+ super
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,30 @@
1
+ require 'raudi/avr/pin_states'
2
+
3
+ module Raudi
4
+
5
+ module AVR
6
+
7
+ class Pin
8
+
9
+ extend Forwardable
10
+ include PinStates
11
+
12
+ attr_accessor :port, :number
13
+
14
+ def_delegator :port, :name
15
+
16
+ def initialize(port, number, types)
17
+ self.port = port
18
+ self.number = number
19
+ load_states(types)
20
+ end
21
+
22
+ def to_s
23
+ "Pin #{name}#{number} <#{state}>"
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,73 @@
1
+ module Raudi
2
+
3
+ module AVR
4
+
5
+ module PinStates
6
+
7
+ DELIMITER = '_'
8
+
9
+ def self.included(klass)
10
+
11
+ klass.class_eval do
12
+
13
+ attr_accessor :states, :state, :state_params
14
+
15
+ Info.pin_states.each do |pin_state|
16
+
17
+ define_method :get_state do |pin_state|
18
+ states.detect { |state| state =~ Regexp.new("\\A(#{pin_state})(_\d+)?") }
19
+ end
20
+
21
+ define_method :get_state! do |pin_state|
22
+ valid_state = get_state(pin_state)
23
+ raise "#{to_s} can be #{pin_state}" unless valid_state
24
+ valid_state
25
+ end
26
+
27
+ define_method "#{pin_state}!" do |*args|
28
+ self.state = get_state!(pin_state)
29
+ self.state_params = args.first
30
+ end
31
+
32
+ define_method "#{pin_state}?" do |*args|
33
+ self.state == get_state(pin_state)
34
+ end
35
+
36
+ define_method "can_be_#{pin_state}?" do |*args|
37
+ return unless full_state = get_state(pin_state)
38
+ if(number = args.first)
39
+ return unless full_state[number.to_s]
40
+ end
41
+ true
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ def state_number
51
+ state.split(DELIMITER).last
52
+ end
53
+
54
+ def to_c
55
+ if Info.gpio_states.include?(state)
56
+ "PIN#{name}#{number}"
57
+ else
58
+ state.to_s.gsub(DELIMITER, '').upcase
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def load_states(states)
65
+ self.states = (Info.gpio_states + states).uniq
66
+ self.state = self.states.first
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end