rbuspirate 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e5ac21bf23f1ef37bb26f473b2a1af1fedf6f9d0a0acf1ae57b0d4f9bb1ca488
4
+ data.tar.gz: ab5ef5031437fd16343c12cb9e3001d05698c02fc262f92aab58aeddb3b4f992
5
+ SHA512:
6
+ metadata.gz: b74422e19fac09ce79f85bbc9e3a51d0868d1972607daffbad6dd19dfafc497095315f5b43f0ad6e17fc81b253e557cbd5636a68a2dae0df7a2315e29d0f4d45
7
+ data.tar.gz: ff71fbe1589ac130cc8bf301365a3a4e61a18883c91b52de03f69e387b7cad033318851286161c469ac0ea933627b516f14a6c91c58faeee382abda49482fa33
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rbuspirate.gemspec
4
+ gemspec
5
+
6
+ gem "pry", "~> 0.12.2"
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rbuspirate (0.1.1)
5
+ serialport (~> 1.3)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ coderay (1.1.2)
11
+ method_source (0.9.2)
12
+ pry (0.12.2)
13
+ coderay (~> 1.1.0)
14
+ method_source (~> 0.9.0)
15
+ rake (10.5.0)
16
+ serialport (1.3.1)
17
+
18
+ PLATFORMS
19
+ ruby
20
+
21
+ DEPENDENCIES
22
+ bundler (~> 2.0)
23
+ pry (~> 0.12.2)
24
+ rake (~> 10.0)
25
+ rbuspirate!
26
+
27
+ BUNDLED WITH
28
+ 2.1.4
@@ -0,0 +1,42 @@
1
+ # Rbuspirate
2
+
3
+ Better ruby driver for buspirate
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rbuspirate'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rbuspirate
20
+
21
+ ## Usage
22
+ See examples/ dir
23
+
24
+ ## Status
25
+
26
+ I2C: Full support
27
+ UART: Basic support (only bridge mode, no custom speed)
28
+ Windows not supported, contributions are welcomed
29
+
30
+ ## Development
31
+
32
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
33
+
34
+ ## Contributing
35
+
36
+ Bug reports and pull requests are welcome on GitHub at https://github.com/sh7d/rbuspirate.
37
+
38
+ ## Todo
39
+ * Documentation
40
+ * Full uart support
41
+ * SPI
42
+ * Other protocols
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'rbuspirate'
5
+ require 'optparse'
6
+ require 'pry'
7
+
8
+ le_options = {}
9
+
10
+ optparse = OptParse.new do |opts|
11
+ opts.on(
12
+ '-d device', '--device device', String, 'Path to buspirate device'
13
+ ) do |device|
14
+ dev_stat = File.stat(device).rdev rescue nil
15
+ raise 'Connect buspirate first' unless dev_stat
16
+ raise 'Device argument must be device' if dev_stat.zero?
17
+
18
+ le_options[:device] = device
19
+ end
20
+ end
21
+ optparse.parse!
22
+ le_options.freeze
23
+ if le_options[:device]
24
+ bp = SerialPort.new(le_options[:device], 115_200, 8, 1, SerialPort::NONE)
25
+ rs = Rbuspirate::Client.new(bp)
26
+
27
+ binding.pry
28
+ else
29
+ puts optparse.to_s
30
+ end
@@ -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
@@ -0,0 +1,37 @@
1
+ require 'rbuspirate'
2
+
3
+ bp = Rbuspirate::Client.new('/dev/buspirate')
4
+ bp.enter_i2c
5
+ # valid settings are :'5khz', :'50khz', :'100khz', :'400khz'
6
+ bp.interface.speed = :'400khz'
7
+ # default vaules are false
8
+ bp.interface.configure_peripherals(
9
+ power: true, pullup: true, aux: false, cs: false
10
+ )
11
+ # you can see definet peripherals config via accesors
12
+ puts "Power #{bp.interface.power ? 'enabled' : 'disabled'}"
13
+ puts "Pull-up resitors #{bp.interface.pullup ? 'enabled' : 'disabled'}"
14
+ # Frist argument is command
15
+ # second expected data to read
16
+ # succes_timeout specifies timeout to read data from device
17
+ # allow_zerobyte: allows one single byte instead of expected data to read
18
+ data = bp.interface.write_then_read(0xA1.chr, 4, succes_timeout: 5, allow_zerobyte: false)
19
+ puts "First 4 bytes are #{data.unpack('H*').join}"
20
+
21
+ # You can also acces raw mode
22
+ # Block is optional
23
+ bp.interface.send_start
24
+ ack_array = bp.interface.bulk_write("\xA0\x00\x00\xDE\xAD".b, ack_timeout: 1, &method(:puts))
25
+ bp.interface.send_stop
26
+ puts ack_array
27
+
28
+ # And read
29
+ bp.interface.send_start
30
+ bp.interface.bulk_write("\xA0\x00\x00".b)
31
+ bp.interface.send_stop
32
+ bp.interface.send_start
33
+ bp.interface.bulk_write("\xA1".b)
34
+ # default vaules are true for acks, and 1 for readbyte_timeout
35
+ data = bp.interface.read(4, auto_ack: true, auto_nack: true, readbyte_timeout: 1)
36
+ bp.interface.send_stop
37
+ puts "First 4 bytes are: #{data.unpack('H*').join}"
@@ -0,0 +1,29 @@
1
+ require 'rbuspirate'
2
+
3
+ bp = Rbuspirate::Client.new('/dev/buspirate')
4
+ bp.enter_uart
5
+ # set speed
6
+ bp.interface.speed = 115_200
7
+ # parity_data possible vaules are: :n8, :e8, :o8, :n9
8
+ bp.interface.config_uart(
9
+ pin_out_33: true, stop_bits: 1, parity_data: :n8, rx_idle: true
10
+ )
11
+ # you can see defined settings via accesors
12
+ puts "Pin out voltage #{bp.interface.pin_out_33 ? '3.3V' : '5V'}"
13
+ # Enable power
14
+ bp.interface.configure_peripherals(
15
+ power: false, pullup: false, aux: false, cs: false
16
+ )
17
+ # you can call to configure_peripherals like configure_peripherals(power: true)
18
+ # rest of arguments will be in default state (false)
19
+ # you can also see peripherals config state via accesors
20
+ puts "Power #{bp.interface.power ? 'enabled' : 'disabled'}"
21
+ # Bridge mode
22
+ bp.interface.enter_bridge
23
+
24
+ # raw port is exposed via port accesor
25
+ port = bp.interface.port
26
+
27
+ while (line = port.readline)
28
+ puts line
29
+ end
@@ -0,0 +1,91 @@
1
+ require 'expect'
2
+ require 'serialport'
3
+
4
+ require 'rbuspirate/commands'
5
+ require 'rbuspirate/helpers'
6
+ require 'rbuspirate/responses'
7
+ require 'rbuspirate/timeouts'
8
+ require 'rbuspirate/interfaces/i2c'
9
+ require 'rbuspirate/interfaces/uart'
10
+
11
+ module Rbuspirate
12
+ class Client
13
+ attr_reader :mode, :interface, :needs_reset
14
+
15
+ def initialize(dvc, sync: true)
16
+ raise ArgumentError, 'Shitty arg' unless [SerialPort, String].include?(dvc.class)
17
+
18
+ if dvc.instance_of?(String)
19
+ raise 'Connect buspirate first' unless File.exist?(dvc)
20
+ raise 'Device argument must be device' if File.stat(dvc).rdev.zero?
21
+
22
+ dvc = SerialPort.new(dvc, 115_200, 8, 1, SerialPort::NONE)
23
+ end
24
+ @le_port = dvc
25
+ @le_port.sync = true if sync
26
+ @needs_reset = false
27
+ reset_binary_mode
28
+ end
29
+
30
+ def reset_binary_mode
31
+ raise 'Device needs reset to change mode' if @needs_reset
32
+
33
+ 20.times do
34
+ @le_port.putc(Commands::RESET_BITBANG)
35
+ resp = @le_port.expect(
36
+ Responses::BITBANG_MODE, Timeouts::BINARY_RESET
37
+ )
38
+
39
+ if resp
40
+ @interface = nil
41
+ @mode = :bitbang
42
+ return true
43
+ end
44
+ end
45
+
46
+ raise 'Enter to bitbang failied'
47
+ end
48
+
49
+ def enter_i2c
50
+ raise 'Device needs reset to change mode' if @needs_reset
51
+
52
+ switch_mode(
53
+ :i2c, Commands::I2C::ENTER,
54
+ Timeouts::I2C::ENTER, Responses::I2C::ENTER,
55
+ Interfaces::I2C
56
+ )
57
+ end
58
+
59
+ def enter_uart
60
+ raise 'Device needs reset to change mode' if @needs_reset
61
+
62
+ switch_mode(
63
+ :uart, Commands::UART::ENTER,
64
+ Timeouts::UART::ENTER, Responses::UART::ENTER,
65
+ Interfaces::UART
66
+ )
67
+ end
68
+
69
+ private
70
+
71
+ def switch_mode(
72
+ name_symbol, switch_command,
73
+ wait_timeout, enter_response,
74
+ interface_class
75
+ )
76
+ raise 'Device needs reset to change mode' if @needs_reset
77
+
78
+ @le_port.write(switch_command.chr)
79
+ resp = @le_port.expect(
80
+ enter_response, wait_timeout
81
+ )
82
+ if resp
83
+ @mode = name_symbol
84
+ @interface = interface_class.new(@le_port, self)
85
+ return true
86
+ end
87
+
88
+ raise "Switch to #{name_symbol.to_s.upcase} failied"
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,79 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ module Rbuspirate
5
+ module Commands
6
+ RESET_BITBANG = 0b00000000
7
+
8
+ module I2C
9
+ ENTER = 0b00000010
10
+ PREPARE_WRITE = 0b00010000
11
+ READBYTE = 0b00000100
12
+ WRITE_THEN_READ = 0x8
13
+
14
+ module Config
15
+ CONF_PER = 0b01000000
16
+
17
+ module Peripherals
18
+ POWER = 0b00001000
19
+ PULLUP = 0b00000100
20
+ AUX = 0b00000010
21
+ CS = 0b00000001
22
+ end
23
+
24
+ module Speed
25
+ S5KHZ = 0b01100000
26
+ S50KZ = 0b01100001
27
+ S100KHZ = 0b01100010
28
+ S400KHZ = 0b01100011
29
+ end
30
+ end
31
+
32
+ module Flow
33
+ START = 0b00000010
34
+ STOP = 0b00000011
35
+ ACK = 0b00000110
36
+ NACK = 0b00000111
37
+ end
38
+ end
39
+
40
+ module UART
41
+ ENTER = 0b00000011
42
+ START_BRIDGE = 0b00001111
43
+
44
+ module Config
45
+ CONF_PER = 0b01000000
46
+ CONF_UART = 0b10000000
47
+
48
+ module Peripherals
49
+ POWER = 0b00001000
50
+ PULLUP = 0b00000100
51
+ AUX = 0b00000010
52
+ CS = 0b00000001
53
+ end
54
+
55
+ module Speed
56
+ S300 = 0b01100000
57
+ S1200 = 0b01100001
58
+ S2400 = 0b01100010
59
+ S4800 = 0b01100011
60
+ S9600 = 0b01100100
61
+ S19200 = 0b01100101
62
+ S31250 = 0b01100110
63
+ S38400 = 0b01100111
64
+ S57600 = 0b01101000
65
+ S115200 = 0b01101010
66
+ end
67
+
68
+ module UartConf
69
+ PIN_OUT_33 = 0b00010000
70
+ DAT_PARITY_8E = 0b00000100
71
+ DAT_PARITY_80 = 0b00001000
72
+ DAT_PARITY_9N = 0b00001100
73
+ STOP_BIT_2 = 0b00000010
74
+ DISABLE_RX_IDLE = 0b00000001
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,16 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ module Rbuspirate
5
+ module Helpers
6
+ private
7
+
8
+ def simplex_command(command, tout, ex_message)
9
+ @le_port.write(command.chr)
10
+ resp = @le_port.expect(Responses::SUCCESS, tout)
11
+ return true if resp
12
+
13
+ raise ex_message
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,170 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ require 'timeout'
5
+
6
+ module Rbuspirate
7
+ module Interfaces
8
+ class I2C
9
+ include Helpers
10
+ attr_reader :speed, :power, :pullup, :aux, :cs
11
+
12
+ def initialize(serial, bup)
13
+ raise 'Bus pirate must be in i2c mode' unless bup.mode == :i2c
14
+
15
+ @le_port = serial
16
+ end
17
+
18
+ def configure_peripherals(
19
+ power: false, pullup: false, aux: false, cs: false
20
+ )
21
+ [power, pullup, aux, cs].map(&:class).each do |cls|
22
+ raise ArgumentError, 'All args must be true or false' unless [FalseClass, TrueClass].include?(cls)
23
+ end
24
+
25
+ bit_config = Commands::I2C::Config::CONF_PER
26
+ bit_config |= Commands::I2C::Config::Peripherals::POWER if power
27
+ bit_config |= Commands::I2C::Config::Peripherals::PULLUP if pullup
28
+ bit_config |= Commands::I2C::Config::Peripherals::AUX if aux
29
+ bit_config |= Commands::I2C::Config::Peripherals::CS if cs
30
+
31
+ simplex_command(
32
+ bit_config,
33
+ Timeouts::SUCCESS,
34
+ 'Unable to confgure peripherals'
35
+ )
36
+ @power, @pullup, @aux, @cs = power, pullup, aux, cs
37
+ end
38
+
39
+ def speed=(le_speed)
40
+ bit_speed = case le_speed.to_sym
41
+ when :'5khz'
42
+ Commands::I2C::Config::Speed::S5KHZ
43
+ when :'50khz'
44
+ Commands::I2C::Config::Speed::S50KHZ
45
+ when :'100khz'
46
+ Commands::I2C::Config::Speed::S100KHZ
47
+ when :'400khz'
48
+ Commands::I2C::Config::Speed::S400KHZ
49
+ else
50
+ raise ArgumentError, 'Bad speed argument'
51
+ end
52
+
53
+ simplex_command(bit_speed, Timeouts::SUCCESS, 'Unable to set speed')
54
+ end
55
+
56
+ def send_start
57
+ simplex_command(
58
+ Commands::I2C::Flow::START,
59
+ Timeouts::I2C::STARTSTOP,
60
+ 'Unable to sent start bit'
61
+ )
62
+ end
63
+
64
+ def send_stop
65
+ simplex_command(
66
+ Commands::I2C::Flow::STOP,
67
+ Timeouts::I2C::STARTSTOP,
68
+ 'Unable to sent stop bit'
69
+ )
70
+ end
71
+
72
+ def send_ack
73
+ simplex_command(
74
+ Commands::I2C::Flow::ACK,
75
+ Timeouts::I2C::ACKNACK,
76
+ 'Unable to sent ack'
77
+ )
78
+ end
79
+
80
+ def send_nack
81
+ simplex_command(
82
+ Commands::I2C::Flow::NACK,
83
+ Timeouts::I2C::ACKNACK,
84
+ 'Unable to sent nack'
85
+ )
86
+ end
87
+
88
+ def read(bytes = 1, auto_ack: true, auto_nack: true, readbyte_timeout: Timeouts::I2C::READ)
89
+ result = ''.dup.b
90
+ bytes.times do |t|
91
+ @le_port.write(Commands::I2C::READBYTE.chr)
92
+ Timeout.timeout(readbyte_timeout) do
93
+ result << @le_port.read(1)
94
+ end
95
+ send_ack if auto_ack && t + 1 != bytes
96
+ send_nack if auto_nack && t + 1 == bytes
97
+ end
98
+ result
99
+ end
100
+
101
+ def bulk_write(data, ack_timeout: Timeouts::I2C::SLAVE_ACKNACK)
102
+ raise ArgumentError, 'data must be String instance' unless data.instance_of?(String)
103
+
104
+ if !data.instance_of?(String) || data.instance_of?(String) && data.empty?
105
+ raise ArgumentError, 'Bad data argument'
106
+ end
107
+ raise ArgumentError, 'Data is too long' if data.bytesize > 16
108
+
109
+ bit_bulk_write = Commands::I2C::PREPARE_WRITE | data.bytesize - 1
110
+ simplex_command(
111
+ bit_bulk_write.chr,
112
+ Timeouts::I2C::PREPARE_WRITE,
113
+ 'Unable to prepare write mode'
114
+ )
115
+ ack_array = []
116
+ data.each_byte do |data_byte|
117
+ @le_port.write(data_byte.chr)
118
+ Timeout.timeout(ack_timeout) do
119
+ ack_array << case @le_port.read(1).ord
120
+ when 0
121
+ :ack
122
+ when 1
123
+ :nack
124
+ else
125
+ raise 'Unknown bytewrite response'
126
+ end
127
+ yield(ack_array.last) if block_given?
128
+ end
129
+ end
130
+ ack_array.freeze
131
+ end
132
+
133
+ def write_then_read(
134
+ data, expected_bytes = 0,
135
+ succes_timeout: Timeouts::I2C::WRITE_THEN_READ_S,
136
+ allow_zerobyte: false
137
+ )
138
+ raise ArgumentError, 'Bad data type' unless data.instance_of?(String)
139
+ raise ArgumentError, 'Data is too long' if data.bytesize > 4096
140
+ raise ArgumentError, 'Bad expected_bytes type' unless expected_bytes.instance_of?(Integer)
141
+ raise ArgumentError, 'Bad expected_bytes value' if expected_bytes.negative? || expected_bytes > 4096
142
+
143
+ binary_command = Commands::I2C::WRITE_THEN_READ.chr +
144
+ [data.bytesize, expected_bytes].pack('S>S>') +
145
+ data
146
+ @le_port.write(binary_command)
147
+ result = nil
148
+ # So fucking ugly
149
+ begin
150
+ Timeout.timeout(succes_timeout) do
151
+ result = @le_port.read(1)
152
+ end
153
+ rescue Timeout::Error
154
+ return false
155
+ end
156
+ return false if allow_zerobyte && result.ord.zero?
157
+ raise 'Write failed' if result.ord.zero?
158
+
159
+ if expected_bytes != 0
160
+ Timeout.timeout(Timeouts::I2C::WRITE_THEN_READ_D) do
161
+ result = @le_port.read(expected_bytes)
162
+ end
163
+ result
164
+ else
165
+ true
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,128 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ require 'timeout'
5
+
6
+ module Rbuspirate
7
+ module Interfaces
8
+ class UART
9
+ include Helpers
10
+ attr_reader :bridge, :speed, :power, :pullup, :aux, :cs,
11
+ :pin_out_33, :parity_data, :stop_bits, :rx_idle,
12
+ :port
13
+
14
+ def initialize(serial, bup)
15
+ raise 'Bus pirate must be in uart mode' unless bup.mode == :uart
16
+
17
+ @bridge = false
18
+ @bup = bup
19
+ @le_port = serial
20
+ end
21
+
22
+ def configure_peripherals(
23
+ power: false, pullup: false, aux: false, cs: false
24
+ )
25
+ raise 'Device needs reset in order to reconfigure it' if @bridge
26
+
27
+ [power, pullup, aux, cs].map(&:class).each do |cls|
28
+ raise ArgumentError, 'All args must be true or false' unless [FalseClass, TrueClass].include?(cls)
29
+ end
30
+
31
+ bit_config = Commands::UART::Config::CONF_PER
32
+ bit_config |= Commands::UART::Config::Peripherals::POWER if power
33
+ bit_config |= Commands::UART::Config::Peripherals::PULLUP if pullup
34
+ bit_config |= Commands::UART::Config::Peripherals::AUX if aux
35
+ bit_config |= Commands::UART::Config::Peripherals::CS if cs
36
+
37
+ simplex_command(
38
+ bit_config,
39
+ Timeouts::SUCCESS,
40
+ 'Unable to confgure peripherals'
41
+ )
42
+ @power, @pullup, @aux, @cs = power, pullup, aux, cs
43
+ end
44
+
45
+ def speed=(le_speed)
46
+ raise 'Device needs reset in order to reconfigure it' if @bridge
47
+
48
+ bit_speed = case le_speed
49
+ when 300
50
+ Commands::UART::Config::Speed::S300
51
+ when 1200
52
+ Commands::UART::Config::Speed::S1200
53
+ when 2400
54
+ Commands::UART::Config::Speed::S2400
55
+ when 4800
56
+ Commands::UART::Config::Speed::S4800
57
+ when 9600
58
+ Commands::UART::Config::Speed::S9600
59
+ when 19_200
60
+ Commands::UART::Config::Speed::S19200
61
+ when 31_250
62
+ Commands::UART::Config::Speed::S31250
63
+ when 38_400
64
+ Commands::UART::Config::Speed::S38400
65
+ when 57_600
66
+ Commands::UART::Config::Speed::S57600
67
+ when 115_200
68
+ Commands::UART::Config::Speed::S115200
69
+ else
70
+ raise ArgumentError, 'Unsupported speed'
71
+ end
72
+
73
+ simplex_command(bit_speed, Timeouts::SUCCESS, 'Unable to set speed')
74
+ @speed = bit_speed
75
+ end
76
+
77
+ def config_uart(
78
+ pin_out_33: false, parity_data: :n8, stop_bits: 1, rx_idle: true
79
+ )
80
+ raise 'Device needs reset in order to reconfigure it' if @bridge
81
+
82
+ raise ArgumentError, 'Pin out should be false or true' unless [true, false].include?(pin_out_33)
83
+ raise ArgumentError, 'Unknown praity and databits mode' unless [:n8, :e8, :o8, :n9].include?(parity_data)
84
+ raise ArgumentError, 'Unknown stop bits mode' unless [1, 2].include?(stop_bits)
85
+ raise ArgumentError, 'Rx idle should be false or true' unless [true, false].include?(rx_idle)
86
+
87
+ bit_conf_uart = Commands::UART::Config::CONF_UART
88
+
89
+ bit_conf_uart |= Commands::UART::Config::UartConf::PIN_OUT_33 if pin_out_33
90
+ bit_conf_uart |= case parity_data
91
+ when :e8
92
+ Commands::UART::Config::UartConf::DAT_PARITY_8E
93
+ when :o8
94
+ Commands::UART::Config::UartConf::DAT_PARITY_8O
95
+ when :n9
96
+ Commands::UART::Config::UartConf::DAT_PARITY_9N
97
+ else
98
+ 0
99
+ end
100
+ bit_conf_uart |= Commands::UART::Config::UartConf::STOP_BIT_2 if stop_bits == 2
101
+ bit_conf_uart |= Commands::UART::Config::UartConf::DISABLE_RX_IDLE unless rx_idle
102
+
103
+ simplex_command(bit_conf_uart, Timeouts::SUCCESS, 'Unable to config uart')
104
+
105
+ @pin_out_33, @parity_data, @stop_bits, @rx_idle = pin_out_33, parity_data, stop_bits, rx_idle
106
+ end
107
+
108
+ def enter_bridge
109
+ return @bridge if @bridge
110
+
111
+ @le_port.write(Commands::UART::START_BRIDGE.chr)
112
+ @bridge = true
113
+ @bup.instance_variable_set(:@needs_reset, true)
114
+ @port = @le_port
115
+ end
116
+
117
+ def read(bytes = 0)
118
+ raise 'Enter to bridge mode first' unless @bridge
119
+ bytes.positive? ? @le_port.read(bytes) : @le_port.read
120
+ end
121
+
122
+ def write(data)
123
+ raise 'Enter to bridge mode first' unless @bridge
124
+ @le_port.write(data.to_s.b)
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,17 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ module Rbuspirate
5
+ module Responses
6
+ BITBANG_MODE = 'BBIO1'
7
+ SUCCESS = 0x01.chr
8
+
9
+ module I2C
10
+ ENTER = 'I2C1'
11
+ end
12
+
13
+ module UART
14
+ ENTER = 'ART1'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ # Encoding: binary
2
+ # frozen_string_literal: true
3
+
4
+ module Rbuspirate
5
+ module Timeouts
6
+ BINARY_RESET = 0.05
7
+ SUCCESS = 0.1
8
+ module I2C
9
+ ENTER = 0.2
10
+ STARTSTOP = 0.5
11
+ PREPARE_WRITE = 0.1
12
+ ACKNACK = 0.3
13
+ READ = 1
14
+ SLAVE_ACKNACK = 0.5
15
+ WRITE_THEN_READ_S = 5
16
+ WRITE_THEN_READ_D = 5
17
+ end
18
+
19
+ module UART
20
+ ENTER = 0.2
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Rbuspirate
2
+ VERSION = '0.1.1'
3
+ end
@@ -0,0 +1,31 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "rbuspirate/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rbuspirate"
7
+ spec.version = Rbuspirate::VERSION
8
+ spec.authors = ["sh7d"]
9
+ spec.email = ["sh7d@sh7d"]
10
+
11
+ spec.summary = %q{Ruby better buspirate interface}
12
+ spec.description = %q{Simple buspirate ruby interface}
13
+ spec.homepage = "https://github.com/sh7d/rbuspirate"
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib'] + Dir.glob('lib/**').select(&File.method(:directory?))
25
+
26
+ spec.add_development_dependency "bundler", "~> 2.0"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "pry", "~> 0.12"
29
+ spec.add_dependency "serialport", "~> 1.3"
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbuspirate
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - sh7d
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: serialport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ description: Simple buspirate ruby interface
70
+ email:
71
+ - sh7d@sh7d
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - README.md
80
+ - Rakefile
81
+ - bin/console
82
+ - bin/setup
83
+ - examples/i2c.rb
84
+ - examples/uart.rb
85
+ - lib/rbuspirate.rb
86
+ - lib/rbuspirate/commands.rb
87
+ - lib/rbuspirate/helpers.rb
88
+ - lib/rbuspirate/interfaces/i2c.rb
89
+ - lib/rbuspirate/interfaces/uart.rb
90
+ - lib/rbuspirate/responses.rb
91
+ - lib/rbuspirate/timeouts.rb
92
+ - lib/rbuspirate/version.rb
93
+ - rbuspirate.gemspec
94
+ homepage: https://github.com/sh7d/rbuspirate
95
+ licenses: []
96
+ metadata:
97
+ homepage_uri: https://github.com/sh7d/rbuspirate
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ - lib/rbuspirate
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.1.2
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Ruby better buspirate interface
118
+ test_files: []