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
@@ -0,0 +1,17 @@
1
+ module Raudi
2
+
3
+ module StateList
4
+
5
+ Info.pin_states.each do |common_state|
6
+ define_method "#{common_state}_pins" do
7
+ pins.select { |pin| pin.send("#{common_state}?") }
8
+ end
9
+
10
+ define_method "#{common_state}_present?" do
11
+ pins.any? { |pin| pin.send("#{common_state}?") }
12
+ end
13
+ end
14
+
15
+ end
16
+
17
+ end
data/raudi.gemspec CHANGED
@@ -19,9 +19,12 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
+ # maybe in future
23
+ # s.add_dependency 'activesupport'
22
24
  s.add_development_dependency "rspec", '>= 2.5'
23
25
  s.add_development_dependency 'guard-rspec'
24
26
  s.add_development_dependency 'fuubar'
25
27
  s.add_development_dependency 'ruby_gntp'
28
+ s.add_development_dependency 'ruby-debug19'
26
29
 
27
30
  end
data/spec/.DS_Store ADDED
Binary file
@@ -0,0 +1,5 @@
1
+ Raudi.configure :atmega_328 do
2
+ output :b3, :c3
3
+ pullup :c2, :d6
4
+ pc_interrupt :d1, :d2
5
+ end
Binary file
Binary file
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Raudi::ActionProcessor do
4
+
5
+ context 'processing keys' do
6
+
7
+ let(:action_text) { "Some dummy test" }
8
+
9
+ it 'string/symbol be same' do
10
+ subject['foo'] = action_text
11
+ subject[:foo].should == action_text
12
+ end
13
+
14
+ it 'case unsensative' do
15
+ subject[:FOOBar] = action_text
16
+ subject[:foobar].should == action_text
17
+ end
18
+
19
+ it 'allow 2 key format' do
20
+ subject[:foo, 2] = action_text
21
+ subject[:foo2].should == action_text
22
+ end
23
+
24
+ context 'using alias key' do
25
+
26
+ it 'for interrupt action' do
27
+ subject[:interrupt] = action_text
28
+ subject[:int].should == action_text
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Raudi::AVR::Controller do
4
+
5
+ it 'should have 3 timers' do
6
+ controller.timers.should have(3).items
7
+ controller.timers[0].length.should == 8
8
+ controller.timers[1].length.should == 16
9
+ controller.timers[2].length.should == 8
10
+ end
11
+
12
+ end
13
+
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Raudi::AVR::Pin do
4
+
5
+ let(:port){ Raudi::AVR::Port.new("C", {'pins' => []}) }
6
+
7
+ context 'generate c presentation' do
8
+
9
+ context 'as gpio' do
10
+
11
+ let(:pin) { Raudi::AVR::Pin.new(port, 3, []) }
12
+
13
+ it 'input' do
14
+ pin.to_c.should == "PINC3"
15
+ pin.should be_input
16
+ end
17
+
18
+ it 'output' do
19
+ pin.output!
20
+ pin.to_c.should == 'PINC3'
21
+ pin.should be_output
22
+ end
23
+
24
+ it 'pullup' do
25
+ pin.pullup!
26
+ pin.to_c.should == 'PINC3'
27
+ pin.should be_pullup
28
+ end
29
+
30
+ end
31
+
32
+ it 'as eint' do
33
+ pin = klass.new(port, 2, ["int_0"])
34
+ pin.int!
35
+ pin.to_c.should == "INT0"
36
+ pin.should be_int
37
+ end
38
+
39
+ end
40
+
41
+ context 'state checks' do
42
+
43
+ let(:pin) { Raudi::AVR::Pin.new(port, 3, ['timer_1', 'eint_0', 'pcint_4']) }
44
+
45
+ it 'should be input by default' do
46
+ pin.should be_input
47
+ end
48
+
49
+ it 'can be pullup by default' do
50
+ pin.can_be_pullup?.should be_true
51
+ pin.pullup!
52
+ pin.should be_pullup
53
+ end
54
+
55
+ it 'can be output by default' do
56
+ pin.can_be_output?.should be_true
57
+ pin.output!
58
+ pin.should be_output
59
+ end
60
+
61
+ it 'can be timer' do
62
+ pin.can_be_timer?.should be_true
63
+ pin.can_be_timer?(2).should be_false
64
+ pin.timer!
65
+ pin.should be_timer
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Raudi::AVR::Timer do
4
+
5
+ let(:timer) { klass.new('timer_0', 'length' => 8) }
6
+
7
+ specify{ timer.number.should == 0 }
8
+
9
+ specify{ timer.range.should include(23)}
10
+ specify{ timer.range.should_not include(256)}
11
+
12
+ it 'should change params when mode changed' do
13
+ timer.mode = :foo
14
+ timer.mode_params.should == {}
15
+ timer.mode_params[:a] = 34
16
+ timer.mode = :foo
17
+ timer.mode_params[:a].should == 34
18
+ timer.mode = :bar
19
+ timer.mode_params.should == {}
20
+ end
21
+
22
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Raudi::Info do
4
+
5
+ it 'define method by node of file' do
6
+ klass.pin_states.should be_kind_of(Array)
7
+ end
8
+
9
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Proxy for external interrupt' do
4
+
5
+ it 'external interrupt' do
6
+ config.external_interrupt :d2 => :falling, :d3 => :rising
7
+ controller.interrupt.should be_true
8
+ pin = get_pin(:d, 3)
9
+ pin.should be_int
10
+ pin.state_params.should == :rising
11
+ controller.headers.should include('avr/interrupt')
12
+ end
13
+
14
+ it 'pin change interrupt' do
15
+ config.pc_interrupt :b3, :d4
16
+ controller.interrupt.should be_true
17
+ pin = get_pin(:b, 3)
18
+ pin.should be_pcint
19
+ controller.headers.should include('avr/interrupt')
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Proxy for gpio' do
4
+
5
+ it 'output pins' do
6
+ config.output :d0, :d3
7
+ config.output :b0, :b2, :b3
8
+ controller.ports(:d).output_pins.should have(2).items
9
+ controller.ports(:b).output_pins[0].number.should == 0
10
+ end
11
+
12
+ it 'pullup pins' do
13
+ config.pullup :c3, :c5, :b5
14
+ controller.ports(:c).should have(2).pullup_pins
15
+ controller.ports(:b).should have(1).pullup_pins
16
+ end
17
+
18
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Proxy for headers' do
4
+
5
+ it 'by default have io header' do
6
+ controller.headers.should have(1).item
7
+ controller.headers.should include('avr/io')
8
+ end
9
+
10
+ it 'normal case' do
11
+ config.headers 'util/twi'
12
+ controller.headers.should have(2).items
13
+ end
14
+
15
+ it 'use symbols' do
16
+ config.headers :boot
17
+ controller.headers.should have(2).items
18
+ controller.headers.should include("avr/boot")
19
+ end
20
+
21
+ it 'remove duplication' do
22
+ config.headers :boot, 'avr/boot', "avr/boot"
23
+ controller.headers.should have(2).item
24
+ controller.headers.should include('avr/boot')
25
+ end
26
+
27
+ it 'remove unknow header' do
28
+ config.headers :wazza, 'avr/foo', 'sample'
29
+ controller.headers.should_not include('avr/wazza')
30
+ controller.headers.should_not include('avr/foo')
31
+ controller.headers.should_not include('sample')
32
+ end
33
+
34
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Proxy for timer/counter' do
4
+
5
+ context 'define timers' do
6
+
7
+ it 'basic config' do
8
+ config.activate_timer 0
9
+ timer = controller.timers[0]
10
+ timer.active.should be_true
11
+ timer.prescale.should == 1
12
+ end
13
+
14
+ it 'set prescale' do
15
+ config.activate_timer 1, :prescale => 8
16
+ timer = controller.timers[1]
17
+ timer.active.should be_true
18
+ timer.prescale.should == 2
19
+ end
20
+
21
+ it 'set invalid prescale' do
22
+ config.activate_timer 2, :prescale => 5
23
+ timer = controller.timers[2]
24
+ timer.active.should be_true
25
+ timer.prescale.should == 1
26
+ end
27
+
28
+ it 'set timer with interrupt' do
29
+ config.activate_timer 1, :interrupt => true
30
+ controller.interrupt.should be_true
31
+ timer = controller.timers[1]
32
+ controller.headers.should include('avr/interrupt')
33
+ end
34
+
35
+ end
36
+
37
+ context 'ctc mode' do
38
+
39
+ it 'set to ctc a' do
40
+ config.activate_timer 2, :a => 123
41
+ timer = controller.timers[2]
42
+ timer.should be_ctc
43
+ timer.mode_params[:a].should == 123
44
+ end
45
+
46
+ it 'set to ctc b that overflow' do
47
+ config.activate_timer 0, :b => 260
48
+ timer = controller.timers[0]
49
+ timer.should be_normal
50
+ timer.mode_params.should == {}
51
+ end
52
+
53
+ end
54
+
55
+ context 'define counter' do
56
+
57
+ it 'set timer 0 to counter' do
58
+ config.activate_counter 0
59
+ controller.timers[0].counter.should be
60
+ controller.timers[0].prescale.should == 6
61
+ pin = get_pin(:d, 4)
62
+ pin.should be_timer
63
+ end
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Generate external interrupt code' do
4
+
5
+ context 'external interrupt' do
6
+
7
+ it 'rising' do
8
+ config.external_interrupt :d2 => :rising
9
+ Raudi.action[:interrupt, 0] = "int k; for(k = 0; k < 4; k++);"
10
+ source.should include('sei();')
11
+ source.should include('ISR(INT0_vect)')
12
+ source.should include('EIMSK |= 1 << INT0;')
13
+ source.should include('EICRA |= 1 << ISC00 | 1 << ISC01;')
14
+ source.should include('int k;')
15
+ source.should include('for(k = 0; k < 4; k++);')
16
+ end
17
+
18
+ it 'falling' do
19
+ config.external_interrupt :d3 => :falling
20
+ source.should include('EIMSK |= 1 << INT1;')
21
+ source.should include('EICRA |= 1 << ISC11;')
22
+ end
23
+
24
+ it 'define two interrupts' do
25
+ config.external_interrupt :d2 => :both, :d3 => :falling
26
+ source.should include('ISR(INT0_vect)')
27
+ source.should include('ISR(INT1_vect)')
28
+ source.should include('EIMSK |= 1 << INT0 | 1 << INT1;')
29
+ source.should include('EICRA |= 1 << ISC00 | 1 << ISC11;')
30
+ end
31
+
32
+ end
33
+
34
+ context 'pin change interrupt' do
35
+
36
+ it 'for pins b1 and b5' do
37
+ config.pc_interrupt :b1, :b5
38
+ source.should include("sei();")
39
+ source.should include('PCMSK0 |= 1 << PCINT1 | 1 << PCINT5;')
40
+ source.should include('ISR(PCINT0_vect)')
41
+ source.should include('PCICR |= 1 << PCIE0;')
42
+ end
43
+
44
+ it 'pin c3 and d5' do
45
+ config.pc_interrupt :c3, :d5
46
+ source.should include('PCMSK1 |= 1 << PCINT11;')
47
+ source.should include('PCMSK2 |= 1 << PCINT21;')
48
+ source.should include('ISR(PCINT1_vect)')
49
+ source.should include('ISR(PCINT2_vect)')
50
+ source.should include('PCICR |= 1 << PCIE1 | 1 << PCIE2;')
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Generation gpio code' do
4
+
5
+ it 'output pins' do
6
+ config.output :b2, :c3, :b5, :d2
7
+ source.should include("DDRC |= 1 << 3;")
8
+ source.should include("DDRB |= 1 << 2 | 1 << 5;")
9
+ source.should include("DDRD |= 1 << 2;")
10
+ end
11
+
12
+ it 'pullup pins' do
13
+ config.pullup :c3, :b3, :b2, :b4
14
+ source.should include("PORTC |= 1 << 3;")
15
+ source.should include("PORTB |= 1 << 2 | 1 << 3 | 1 << 4;")
16
+ end
17
+
18
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Generation main structure' do
4
+
5
+ it 'should warp setup block' do
6
+ source.should include("int delay_time = 500;")
7
+ end
8
+
9
+ it 'should warp main block' do
10
+ source.should include("_delay_ms(delay_time);")
11
+ source.should include("toggle_pin(PIN3);")
12
+ end
13
+
14
+ it 'should allow interrupt' do
15
+ controller.interrupt = true
16
+ source.should include('sei();')
17
+ end
18
+
19
+ end