prremote 0.1.6 → 0.1.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45e633df22e18c19d4c78f58c93580d3f8bfee065806067415004220b50957d2
4
- data.tar.gz: 291cfe851b01f38dad3d6bb10a827713d247b5ff0b8942043cbb2d2a57f40038
3
+ metadata.gz: b55c090d4bddcdac18b7a1166429af025eeecc0416e31dedf51f248b4d2cd975
4
+ data.tar.gz: c81096a50e22d31064a8f721daca2de89dcfc5ccbb6e6c9d2d3fb58973c85ac0
5
5
  SHA512:
6
- metadata.gz: 1f1af87f2ae1c9b72ad86dbf14d7a8cc05a94078c9913cafa294bea45c71844baf3bfad804cbb3a9c5cc3bf726866695b8d4685eb658906e35ebaba9181e46e0
7
- data.tar.gz: 4cf41d9ea379ba497d70c648100c907c7a51cdd452034a7fead5ba0a2d3021e60d5817f9fcaaa84b7254cd49cf7b4634a030af56f9228a9312b54c9284f33822
6
+ metadata.gz: 8d959c616f0205f2e63f9ba8eba7d96f66943822e1e59be4dc41cb58aed070fabe816ff1473a6cbee7057bdc19533274dbf8c0c2a5e04924d354bcaae54653db
7
+ data.tar.gz: 9a1fd33542e02a7a97f0e0a9d9626e3f688d80cf3027ff975de58e2159defc90fa3880a9611cb35b125359c7fc8d36ed3708e517673e16795ac3e8cb6a1d566a
data/README.md CHANGED
@@ -163,8 +163,8 @@ Show the gem version, mrbc version, and the connected device's runtime version.
163
163
 
164
164
  ```bash
165
165
  prremote version
166
- # prremote: 0.1.6
167
- # runtime: 0.1.6 (/dev/tty.usbmodem101)
166
+ # prremote: 0.1.7
167
+ # runtime: 0.1.7 (/dev/tty.usbmodem101)
168
168
  # mrbc: mruby 4.0.0 (2026-04-20) (/opt/homebrew/bin/mrbc)
169
169
  ```
170
170
 
@@ -213,6 +213,40 @@ Scripts saved via `deploy` are stored in flash and run automatically on every bo
213
213
 
214
214
  ---
215
215
 
216
+ ## Development
217
+
218
+ ### Clone
219
+
220
+ This repository uses Git submodules (mruby/c, picoruby, pico-sdk, etc.).
221
+ Clone with:
222
+
223
+ ```bash
224
+ git clone --recurse-submodules https://github.com/lumbermill/prremote.git
225
+ ```
226
+
227
+ If you already cloned without `--recurse-submodules`:
228
+
229
+ ```bash
230
+ git submodule update --init --recursive
231
+ ```
232
+
233
+ ### Build the runtime firmware
234
+
235
+ Requires the ARM cross-compiler (`arm-none-eabi-gcc`) and CMake.
236
+
237
+ ```bash
238
+ cd runtime/
239
+ rake cache # build UF2 for pico and picow → ~/.prremote/runtime/
240
+ ```
241
+
242
+ ### Run the tests
243
+
244
+ ```bash
245
+ bundle exec rake test
246
+ ```
247
+
248
+ ---
249
+
216
250
  ## License
217
251
 
218
252
  [MIT License](LICENSE)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.1.7
@@ -61,7 +61,7 @@ module Prremote
61
61
  buf = +''
62
62
  deadline = Time.now + 30
63
63
  loop do
64
- chunk = normalize(serial.read(256) || '')
64
+ chunk = normalize(safe_read(serial, 256))
65
65
  buf << chunk unless chunk.empty?
66
66
 
67
67
  return if buf.include?("DEPLOYED\n")
@@ -48,7 +48,7 @@ module Prremote
48
48
  post_running = wait_for_running(serial)
49
49
  stream_until_done(serial, post_running)
50
50
  rescue Interrupt
51
- serial&.write("\x03")
51
+ serial&.write("\x03") rescue nil
52
52
  sleep 0.1
53
53
  raise
54
54
  ensure
@@ -59,7 +59,7 @@ module Prremote
59
59
  buf = +''
60
60
  deadline = Time.now + 10
61
61
  loop do
62
- chunk = normalize(serial.read(256) || '')
62
+ chunk = normalize(safe_read(serial, 256))
63
63
  unless chunk.empty?
64
64
  debug "recv: #{chunk.inspect}"
65
65
  buf << chunk
@@ -79,7 +79,7 @@ module Prremote
79
79
  def stream_until_done(serial, initial = +'')
80
80
  buf = initial
81
81
  loop do
82
- buf << normalize(serial.read(256) || '')
82
+ buf << normalize(safe_read(serial, 256))
83
83
 
84
84
  if (done_pos = buf.index("DONE\n"))
85
85
  $stdout.print buf[0, done_pos] unless done_pos.zero?
@@ -87,11 +87,11 @@ module Prremote
87
87
  return
88
88
  end
89
89
 
90
- if buf.length > 512
91
- safe = buf.length - 5
92
- $stdout.print buf[0, safe]
90
+ # Flush on newline boundaries so each puts line appears immediately.
91
+ if (nl_pos = buf.rindex("\n"))
92
+ $stdout.print buf[0, nl_pos + 1]
93
93
  $stdout.flush
94
- buf = buf[safe..]
94
+ buf = buf[(nl_pos + 1)..]
95
95
  end
96
96
 
97
97
  sleep 0.01
@@ -11,8 +11,11 @@ module Prremote
11
11
  buf = +''
12
12
  deadline = Time.now + 10
13
13
  loop do
14
- buf << normalize(serial.read(256) || '')
15
- return if buf.include?('READY ')
14
+ buf << normalize(safe_read(serial, 256))
15
+ if buf.include?('READY ')
16
+ warn_if_runtime_outdated(buf)
17
+ return
18
+ end
16
19
  raise 'Timeout waiting for device. Run `prremote reset` if a script is running.' if Time.now > deadline
17
20
 
18
21
  sleep 0.05
@@ -22,6 +25,29 @@ module Prremote
22
25
  def normalize(str)
23
26
  str.gsub("\r\n", "\n").gsub("\r", '')
24
27
  end
28
+
29
+ # Wraps serial.read so that a device disconnect (e.g. ENXIO on macOS when
30
+ # the Pico resets) surfaces as a human-readable error instead of a bare errno name.
31
+ def safe_read(serial, size)
32
+ serial.read(size) || ''
33
+ rescue RubySerial::Error => e
34
+ raise "Device disconnected (#{e.message}). Run `prremote reset` if the device is unresponsive."
35
+ end
36
+
37
+ private
38
+
39
+ def warn_if_runtime_outdated(buf)
40
+ m = buf.match(/READY prremote-runtime\/(\S+)/)
41
+ return unless m
42
+
43
+ runtime_ver = Gem::Version.new(m[1])
44
+ gem_ver = Gem::Version.new(Prremote::VERSION)
45
+ return unless runtime_ver < gem_ver
46
+
47
+ warn "WARNING: runtime version #{m[1]} is older than prremote #{Prremote::VERSION}. Run `prremote install` to update."
48
+ rescue ArgumentError
49
+ # ignore unparseable version strings
50
+ end
25
51
  end
26
52
  end
27
53
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prremote
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - ITO Yosei