rabbit-slide-hasumikin-RubyConfTaiwan2023 2023.12.15.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ed5c251ae68675cfad989272e87c634d1f9d2922d2037bda80b02905aecbf9e6
4
+ data.tar.gz: a152b4b8cf5d17656ce7b0650e9646e6bbf73d1923155bab027f1075181bf703
5
+ SHA512:
6
+ metadata.gz: c801ae7cbdf4a9c25b1c986e33b03ec9be314f642dff50c092c72339f4ec568ffcd1f95e5f1dd9683ba946f1d5f7ee4ccdfb14315a02133f064f889f78b7f58c
7
+ data.tar.gz: d9229b3b921d4cefd68a38871698a85c4e1c3e0b1b11fb024c91e3a198fd5aef236365913565aa346ebe5844707c1abedc94836da76bc2a7bae223845543d0d8
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ PicoRuby_ep4.rab
data/PicoRuby_ep4.rab ADDED
@@ -0,0 +1,508 @@
1
+ = pico
2
+
3
+ : subtitle
4
+ THE RISE OF MICROCONTROLLER
5
+ : author
6
+ ruby
7
+ : content-source
8
+ EPISODE Ⅳ
9
+ : institution
10
+ @hasumikin
11
+ : place
12
+ RubyConf Taiwan 2023
13
+ : date
14
+ Dec. 15, 2023
15
+ : allotted-time
16
+ 38m
17
+ : theme
18
+ theme
19
+
20
+ = sub_chapter
21
+ Find PicoRuby's history on the internet
22
+ \n
23
+ \n
24
+ EPISODE Ⅱ
25
+ \n
26
+ (('tag:large:ATTACK OF THE RAKE'))
27
+ \n
28
+ \n
29
+ EPISODE Ⅲ
30
+ \n
31
+ (('tag:large:REVENGE OF THE STDIN'))
32
+ \n
33
+ \n
34
+ Extra edition in Euruko 2023
35
+ \n
36
+ (('tag:large:"A Beginner's Complete Guide"'))
37
+
38
+ == prop
39
+ : hide-title
40
+ true
41
+
42
+ = self.inspect
43
+
44
+ * Hitoshi HASUMI
45
+ * hasumikin (('tag:small:(GitHub ,ex-Twitter, Bluesky and Mastodon)'))
46
+ * Creator of PicoRuby and PRK Firmware
47
+ * Committer of CRuby's IRB and Reline
48
+ * First prize of Fukuoka Ruby Award\n(2020 and 2022✌️)
49
+ * A final nominee of Ruby Prize 2021
50
+
51
+ # image
52
+ # src = images/hasumi.jpg
53
+ # align = right
54
+ # relative-height = 95
55
+ # relative_margin_top = 50
56
+ # relative_margin_left = 25
57
+
58
+ = I have a favor to ask
59
+
60
+ (('tag:center'))
61
+ If possible, please turn off your Bluetooth
62
+
63
+ # image
64
+ # src = images/disable-bluetooth.jpg
65
+ # relative_height = 80
66
+
67
+ (('tag:center'))
68
+ To avoid channel congestion during my talk
69
+
70
+ = Let's begin 1/5
71
+ * Connect Pi Pico and PC while\npressing the BOOTSEL button
72
+ * You'll find "RPI-RP2" drive\nin file manager
73
+
74
+ # image
75
+ # align = right
76
+ # src = images/boot_button_1.png
77
+ # relative-height = 80
78
+ # relative_margin_left = 0
79
+ # relative_margin_top = 0
80
+
81
+ (('tag:right'))
82
+ (('tag:xx-small'))\n\n\n\n\n\n\n
83
+ https://www.raspberrypi.org/documentation/rp2040/getting-started
84
+
85
+ = Let's begin 2/5
86
+ * Download the latest\n`((*R2P2*))-*.uf2`\nfrom GitHub
87
+
88
+ # image
89
+ # align = right
90
+ # src = images/download-r2p2.png
91
+ # relative-height = 90
92
+ # relative_margin_left = 20
93
+ # relative_margin_top = 0
94
+
95
+ (('tag:x-small'))\n\n\n\n
96
+ https://github.com/picoruby/((*R2P2*))/releases
97
+
98
+ = Let's begin 3/5
99
+
100
+ * Drag & drop `((*R2P2*))-*.uf2` into RPI-RP2 drive
101
+
102
+ # image
103
+ # align = bottom
104
+ # src = images/install-uf2.png
105
+ # relative-height = 90
106
+ # relative_margin_left = 0
107
+ # relative_margin_top = 1
108
+
109
+ = Let's begin 4/5
110
+ * Open a proper\nserial port on\nterminal emulator
111
+
112
+ # image
113
+ # align = right
114
+ # src = images/teraterm.png
115
+ # relative-height = 90
116
+ # relative_margin_left = 12
117
+ # relative_margin_top = 0
118
+
119
+ = Let's begin 5/5
120
+ * ((*R2P2*)) is a Unix-like shell\nrunning on Pi Pico
121
+ * You can use some\ncommands like `cd`,\n`ls`, `mkdir`, and `((*irb*))`
122
+ * Every computing process\nis happening on Pi Pico
123
+
124
+ # image
125
+ # align = right
126
+ # src = images/teraterm.png
127
+ # relative-height = 90
128
+ # relative_margin_left = 20
129
+ # relative_margin_top = 5
130
+
131
+ = By the way, ((*R2P2*)) stands for
132
+
133
+ \n\n
134
+ (('tag:large:((*R*))uby on'))
135
+ \n
136
+ (('tag:large:((*R*))aspberry'))
137
+ \n
138
+ (('tag:large:((*P*))i'))
139
+ \n
140
+ (('tag:large:((*P*))ico'))
141
+
142
+ # image
143
+ # align = right
144
+ # src = images/R2D2_mosaic.png
145
+ # relative-height = 90
146
+ # relative_margin_left = -10
147
+ # relative_margin_top = 0
148
+
149
+ = Today's setup
150
+
151
+ * Raspberry Pi Pico W * 2
152
+ * AQM0802 charactor\ndisplay module
153
+ * ADT7310 thermo\nsensor module
154
+ * FTDI USB-TTL serial\ncoverter cable
155
+
156
+ # image
157
+ # align = right
158
+ # src = images/setup.jpg
159
+ # relative-height = 85
160
+ # relative_margin_left = 10
161
+ # relative_margin_top = 0
162
+
163
+ = Raspberry Pi "Pico" and "Pico W"
164
+
165
+ # image
166
+ # src = images/pico-and-pico_w.jpg
167
+ # relative_height = 100
168
+ # draw1 = [text, Pico, 0.18, 0.75, {color: white, size: 80, font_family: 'Courier Prime', weight: bold}]
169
+ # draw2 = [text, Pico W, 0.5, 0.75, {color: white, size: 80, font_family: 'Courier Prime', weight: bold}]
170
+
171
+ = GPIO
172
+
173
+ irb> gpio = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
174
+ # gpio = GPIO.new(25, GPIO::OUT) # If Pico w/o W
175
+ irb> gpio.write 1 #=> LED turns on
176
+ irb> gpio.write 0 #=> LED turns off
177
+ irb> 3.times do
178
+ irb* gpio.write 1
179
+ irb* sleep 1
180
+ irb* gpio.write 0
181
+ irb* sleep 1
182
+ irb* end #=> LED blinks three times
183
+
184
+ = LED wraps GPIO
185
+
186
+ # enscript ruby
187
+ # /lib/led.rb in R2P2 drive
188
+ require 'gpio'
189
+ require 'cyw43'
190
+ CYW43.init
191
+ class LED
192
+ def initialize
193
+ @gpio = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
194
+ # = GPIO.new(25, GPIO::OUT) # If Pico w/o W
195
+ end
196
+ def on
197
+ @gpio.write 1
198
+ end
199
+ def off
200
+ @gpio.write 0
201
+ end
202
+ def invert
203
+ @gpio.read == 1 ? off : on
204
+ end
205
+ end
206
+
207
+ = LED wraps GPIO
208
+
209
+ irb> require 'led'
210
+ irb> led = LED.new
211
+ irb> 3.times do
212
+ irb* led.invert
213
+ irb* sleep 1
214
+ irb* end
215
+
216
+ = Peripherals for serial communication
217
+ * I2C: To communicate between integrated circuits with support for multiple devices connected to the same bus
218
+ * SPI: To facilitate high-speed communication between microcontrollers and peripheral devices
219
+ * UART: To establish asynchronous serial communication between devices
220
+
221
+ = I2C
222
+
223
+ irb> require 'i2c'
224
+ irb> i2c = I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27)
225
+ irb> [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c].each { |i| i2c.write(0x3e, 0, i); sleep_ms 1 }
226
+ irb> [0x38, 0x0c, 0x01].each { |i| i2c.write(0x3e, 0, i); sleep_ms 1 }
227
+ irb> "Hello,".bytes.each { |c| i2c.write(0x3e, 0x40, c); sleep_ms 1 }
228
+ irb> i2c.write(0x3e, 0, 0x80|0x40)
229
+ irb> "Taiwan!".bytes.each { |c| i2c.write(0x3e, 0x40, c); sleep_ms 1 }
230
+
231
+ \n
232
+
233
+ # image
234
+ # src = images/hello_taiwan.jpg
235
+ # relative_height = 110
236
+ # relative_margin_top = -15
237
+
238
+ = LCD wraps I2C
239
+
240
+ # enscript ruby
241
+ # /lib/lcd.rb in R2P2 drive
242
+ require 'i2c'
243
+ class LCD
244
+ ADDRESS = 0x3e # 0x7c == (0x3e << 1) + 0 (R/W)
245
+ def initialize(i2c:)
246
+ @i2c = i2c
247
+ reset
248
+ end
249
+ def reset
250
+ [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c].each { |i| @i2c.write(ADDRESS, 0, i) }
251
+ sleep_ms 200
252
+ [0x38, 0x0c, 0x01].each { |i| @i2c.write(ADDRESS, 0, i) }
253
+ end
254
+ def putc(c)
255
+ @i2c.write(ADDRESS, 0x40, c)
256
+ sleep_ms 1
257
+ end
258
+ def print(line)
259
+ line.bytes.each { |c| putc c }
260
+ end
261
+ # ...
262
+ # See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
263
+
264
+ = LCD wraps I2C
265
+
266
+ irb> require 'lcd'
267
+ irb> lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
268
+ irb> lcd.print "Hello,"
269
+ irb> lcd.break_line
270
+ irb> lcd.print "Taiwan!"
271
+
272
+ \n
273
+
274
+ # image
275
+ # src = images/hello_taiwan.jpg
276
+ # relative_height = 110
277
+ # relative_margin_top = -5
278
+
279
+ = SPI
280
+
281
+ irb> require 'spi'
282
+ irb> spi = SPI.new(unit: :RP2040_SPI0, cipo_pin: 16,
283
+ cs_pin: 17, sck_pin: 18, copi_pin: 19)
284
+ irb> spi.select
285
+ irb> spi.write(255,255,255,255) # Reset
286
+ irb> spi.write(0x54) # Start continuous mode
287
+ irb> data = spi.read(2).bytes
288
+ irb> temp = data[0] << 8 | data[1]
289
+ irb> temp / 128.0 # Convert to Celsius
290
+ => 19.5621
291
+
292
+ = THERMO wraps SPI
293
+
294
+ # enscript ruby
295
+ # /lib/thermo.rb in R2P2 drive
296
+ require 'spi'
297
+ class THERMO
298
+ def initialize(unit:, sck_pin:, cipo_pin:, copi_pin:, cs_pin:)
299
+ @spi = SPI.new(unit: unit, frequency: 500_000, mode: 0, cs_pin: cs_pin,
300
+ sck_pin: sck_pin, cipo_pin: cipo_pin, copi_pin: copi_pin
301
+ )
302
+ @spi.select
303
+ @spi.write 0xFF, 0xFF, 0xFF, 0xFF # Reset
304
+ @spi.write 0x54 # Start continuous mode
305
+ sleep_ms 240
306
+ end
307
+
308
+ def read
309
+ data = @spi.read(2).bytes
310
+ temp = (data[0] << 8 | data[1]) >> 3
311
+ # If it minus?
312
+ temp -= 0x2000 if 0 < temp & 0b1_0000_0000_0000
313
+ temp / 16.0 # Convert to Celsius
314
+ end
315
+ end
316
+ # See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
317
+
318
+ = THERMO wraps SPI
319
+
320
+ irb> require 'thermo'
321
+ irb> thermo = THERMO.new(unit: :RP2040_SPI0,
322
+ cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
323
+ irb> thermo.read
324
+ => 19.5621
325
+
326
+ = LCD and THERMO
327
+
328
+ irb> require 'lcd'
329
+ irb> lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
330
+ irb> require 'thermo'
331
+ irb> thermo = THERMO.new(unit: :RP2040_SPI0,
332
+ cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
333
+ irb> lcd.print sprintf("%5.2f \xdfC", thermo.read)
334
+
335
+ \n
336
+
337
+ # image
338
+ # src = images/lcd-and-thermo.jpg
339
+ # relative_height = 115
340
+ # relative_margin_top = -8
341
+
342
+ = UART
343
+
344
+ irb> require 'uart'
345
+ irb> uart = UART.new(unit: :RP2040_UART0, txd_pin: 16, rxd_pin: 17, baudrate: 115200)
346
+ irb> uart.puts "Hello from Pico!"
347
+ => nil
348
+ irb> while true
349
+ irb* if c = uart.read
350
+ irb* uart.write c # Echo back
351
+ irb* print c
352
+ irb* end
353
+ irb* end
354
+ Hello to Pico! # <= "Hello to Pico!" in UART device
355
+
356
+ (('tag:center'))
357
+ \n
358
+ You don't need to wrap UART. Use as it is
359
+
360
+ = BLE Broadcaster
361
+ # image
362
+ # src = images/broadcaster_bb.png
363
+ # align = right
364
+ # relative_height = 90
365
+ # relative_margin_left = 7
366
+ # draw1 = [text, THERMO, 0.63, 0.09, {color: blue, size: 70, font_family: 'Courier Prime', weight: bold}]
367
+
368
+ * Pin assign
369
+ * 3V3 to {LCD,THERMO}:VCC
370
+ * GND to {LCD,THERMO}:GND
371
+ * GPIO16 to THERMO:SDO
372
+ * GPIO17 to THERMO:CS
373
+ * GPIO18 to THERMO:SCL
374
+ * GPIO19 to THERMO:SDI
375
+ * GPIO26 to LCD:SDA
376
+ * GPIO27 to LCD:SCL
377
+
378
+ = BLE Observer
379
+ # image
380
+ # src = images/observer_bb.png
381
+ # align = right
382
+ # relative_height = 90
383
+ # relative_margin_left = 5
384
+ # draw1 = [text, USB-TTL, 0.33, 0.1, {color: red, size: 70, font_family: 'Courier Prime', weight: bold}]
385
+
386
+ * Pin assign
387
+ * 3V3 to USB-TTL:VCC
388
+ * GND to USB-TTL:GND
389
+ * GPIO16 to USB-TTL:RX
390
+ * GPIO17 to USB-TTL:TX
391
+
392
+ = Gems in Broadcaster and Observer
393
+
394
+ # in Broadcaster
395
+ $> ls /lib
396
+ lcd.rb
397
+ thermo.rb
398
+
399
+ # in Observer
400
+ $> ls /lib
401
+ led.rb
402
+
403
+ = BLE Broadcaster
404
+
405
+ # enscript ruby
406
+ # /home/app.rb in R2P2 drive
407
+ class DemoBroadcaster < BLE::Broadcaster
408
+ def initialize
409
+ super(nil)
410
+ led = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
411
+ @lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
412
+ @thermo = THERMO.new(unit: :RP2040_SPI0, cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
413
+ @counter = 0
414
+ end
415
+ def adv_data(send_data)
416
+ BLE::AdvertisingData.build do |adv|
417
+ adv.add(0x01, 0xFF)
418
+ adv.add(0x09, "PicoRuby")
419
+ adv.add(0xFF, send_data)
420
+ end
421
+ end
422
+ def heartbeat_callback
423
+ Machine.using_delay do
424
+ temperature = @thermo.read
425
+ @lcd.clear
426
+ @lcd.print sprintf("%5.2f \xdfC", temperature)
427
+ @lcd.break_line
428
+ @lcd.print "+" * (@counter % 9)
429
+ advertise(adv_data (temperature * 100).to_i.to_s)
430
+ end
431
+ @counter += 1
432
+ Watchdog.update
433
+ end
434
+ def packet_callback(event_packet)
435
+ case event_packet[0]&.ord # event type
436
+ when 0x60 # BTSTACK_EVENT_STATE
437
+ return unless event_packet[2]&.ord == BLE::HCI_STATE_WORKING
438
+ @state = :HCI_STATE_WORKING
439
+ Watchdog.enable(2000)
440
+ end
441
+ end
442
+ end
443
+ DemoBroadcaster.new.start
444
+ # See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
445
+
446
+ = BLE Observer
447
+
448
+ # enscript ruby
449
+ # /home/app.rb in R2P2 drive
450
+ class DemoObserver < BLE::Observer
451
+ def initialize
452
+ super
453
+ @led = LED.new
454
+ @uart = UART.new(unit: :RP2040_UART0, txd_pin: 16, rxd_pin: 17, baudrate: 115200)
455
+ @uart.puts 'Start BLE Observer Demo'
456
+ @last_time_found = Time.now.to_i
457
+ Watchdog.enable(4000)
458
+ end
459
+ def advertising_report_callback(adv_report)
460
+ if adv_report&.reports[:complete_local_name] == 'PicoRuby'
461
+ now = Time.now.to_i
462
+ if 2 < now - @last_time_found
463
+ @uart.puts sprintf("%5.2f degC", adv_report.reports[:manufacturer_specific_data].to_f / 100)
464
+ @last_time_found = now
465
+ end
466
+ end
467
+ end
468
+ def heartbeat_callback
469
+ Watchdog.update
470
+ @led.invert
471
+ end
472
+ end
473
+ DemoObserver.new.scan(stop_state: :no_stop)
474
+ # See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
475
+
476
+ = Real world application
477
+
478
+ # image
479
+ # src = images/kamos-2023.jpg
480
+ # relative_height = 100
481
+
482
+ = Wrap up
483
+
484
+ * PicoRuby is a Ruby implementaiton targeting on one-chip microcontroller
485
+ * Built-in peripheral gems for general IOs:\nGPIO, I2C, SPI, UART, ADC, and PWM are ready
486
+ * You can incrementally write your device drivers and applications with PicoIRB
487
+ * BLE gem is also almost ready for real applications
488
+
489
+ = chapter
490
+ (('tag:x-large:stargaze at'))
491
+ # image
492
+ # src = images/QR_picoruby.png
493
+ # relative_height = 80
494
+ (('tag:center'))github.com/picoruby/picoruby
495
+ == prop
496
+ : hide-title
497
+ true
498
+
499
+ = chapter
500
+ (('tag:x-large:may the'))
501
+ \n
502
+ (('tag:xx-large:source'))
503
+ \n
504
+ (('tag:x-large:be with you'))
505
+ == prop
506
+ : hide-title
507
+ true
508
+
data/README.rd ADDED
@@ -0,0 +1,24 @@
1
+ = PicoRuby epsode 4
2
+
3
+ Presentation slide for RubyConf Taiwan 2023
4
+
5
+ == For author
6
+
7
+ === Show
8
+
9
+ rake
10
+
11
+ === Publish
12
+
13
+ rake publish
14
+
15
+ == For viewers
16
+
17
+ === Install
18
+
19
+ gem install rabbit-slide-hasumikin-RubyConfTaiwan2023
20
+
21
+ === Show
22
+
23
+ rabbit rabbit-slide-hasumikin-RubyConfTaiwan2023.gem
24
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: RubyConfTaiwan2023
3
+ base_name: PicoRuby_ep4
4
+ tags:
5
+ - PicoRuby
6
+ - Peripheral
7
+ - Microcontroller
8
+ presentation_date: '2023-12-15'
9
+ presentation_start_time:
10
+ presentation_end_time:
11
+ version: 2023.12.15.0
12
+ licenses: ["MIT"]
13
+ slideshare_id:
14
+ speaker_deck_id:
15
+ ustream_id:
16
+ vimeo_id:
17
+ youtube_id:
18
+ author:
19
+ markup_language: :rd
20
+ name: HASUMI Hitoshi
21
+ email: hasumikin@gmail.com
22
+ rubygems_user: hasumikin
23
+ slideshare_user:
24
+ speaker_deck_user:
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/images/hasumi.jpg ADDED
Binary file
Binary file
Binary file
Binary file
Binary file
data/images/mark_g.png ADDED
Binary file
data/images/mark_y.png ADDED
Binary file
Binary file
Binary file
data/images/setup.jpg ADDED
Binary file
Binary file
Binary file
Binary file
data/theme.rb ADDED
@@ -0,0 +1,182 @@
1
+ # puts font_families.sort
2
+ @xxx_large_font_size = screen_size(22 * Pango::SCALE)
3
+ @xx_large_font_size = screen_size(18 * Pango::SCALE)
4
+ @x_large_font_size = screen_size(11 * Pango::SCALE)
5
+ @large_font_size = screen_size(7.5 * Pango::SCALE)
6
+ @normal_font_size = screen_size(5 * Pango::SCALE)
7
+ @small_font_size = screen_size(4.5 * Pango::SCALE)
8
+ @x_small_font_size = screen_size(3.5 * Pango::SCALE)
9
+ @xx_small_font_size = screen_size(3 * Pango::SCALE)
10
+
11
+ @font_family = find_font_family('Franklin Gothic Medium')
12
+ @monospace_font_family = 'Ricty Discord'
13
+ @title_font_family = find_font_family('Star Jedi Hollow')
14
+
15
+ @default_headline_line_color = '#ffff00'
16
+ @default_headline_line_width = 2
17
+ @default_headline_line_expand = false
18
+
19
+ @default_emphasis_color = "#ff0000"
20
+ @default_emphasis_level2_color = "#ffffff"
21
+
22
+ set_graffiti_color "#FF2B22"
23
+ set_graffiti_line_width 5
24
+
25
+ #@table_frame_color = "#ffffff"
26
+ #@table_fill_color = "#0f0428"
27
+ #@table_body_frame_color = "#ffffff"
28
+ #@table_body_fill_color = "#3f3468"
29
+ #@table_head_frame_color = "#ffffff"
30
+ #@table_head_fill_color = "#rf0428"
31
+
32
+ @preformatted_fill_color = '#000000'
33
+ # @preformatted_centering = true
34
+ @space = screen_y(1)
35
+
36
+ # @margin_left = 300
37
+
38
+ @image_slide_number_start_flag_color = "#53575a"
39
+ @image_slide_number_goal_flag_color = "#a81313"
40
+
41
+ #@slide_headline_hide = true
42
+
43
+ @slide_background_image = 'images/star-background.jpg'
44
+ include_theme("slide-background-image")
45
+
46
+ @title_slide_background_image = 'images/star-background.jpg'
47
+ include_theme("title-slide-background-image")
48
+
49
+ include_theme('default')
50
+
51
+ match(Slide, HeadLine) do |heads|
52
+ #heads.prop_set("size", 0)
53
+ heads.prop_set("weight", "normal")
54
+ set_font_family(heads)
55
+ end
56
+ match(Slide) do |slides|
57
+ slides.prop_set("foreground", "#ffff00")
58
+ end
59
+
60
+ match TitleSlide do |slides|
61
+ slides.margin_left = @margin_right
62
+ slides.prop_set("foreground", "#ffff00")
63
+ end
64
+ match TitleSlide, Title do |elem|
65
+ elem.margin_top = -120
66
+ elem.prop_set "size", @xxx_large_font_size
67
+ elem.prop_set "font-family", @title_font_family
68
+ elem.prop_set "weight", "normal"
69
+ end
70
+ match TitleSlide, Subtitle do |elem|
71
+ elem.prop_set "size", @normal_font_size
72
+ elem.margin_top = -110
73
+ end
74
+ match TitleSlide, Author do |elem|
75
+ elem.margin_top = -180
76
+ elem.prop_set "size", @xxx_large_font_size
77
+ elem.prop_set "font-family", @title_font_family
78
+ end
79
+ match TitleSlide, ContentSource do |elem|
80
+ elem.margin_top = -80
81
+ elem.prop_set "size", @small_font_size
82
+ elem.prop_set "style", "normal"
83
+ end
84
+ match TitleSlide, Place do |elem|
85
+ elem.prop_set "size", @xx_small_font_size
86
+ elem.prop_set "style", "normal"
87
+ end
88
+ match TitleSlide, Date do |elem|
89
+ elem.prop_set "size", @xx_small_font_size
90
+ elem.prop_set "style", "normal"
91
+ end
92
+ match TitleSlide, Institution do |elem|
93
+ elem.margin_top = 50
94
+ elem.prop_set "size", @x_small_font_size
95
+ elem.prop_set "style", "normal"
96
+ end
97
+
98
+ #@slide_logo_image = 'images/mark_g.png'
99
+ #include_theme('slide-logo')
100
+
101
+ @item_image_1 = 'images/r2d2_icon-icons.com_76952.png'
102
+ @item_image_2 = 'images/c3p0_icon-icons.com_76936.png'
103
+ @item_image_3 = 'images/ewok_icon-icons.com_76943.png'
104
+
105
+ include_theme("default-item-mark")
106
+
107
+ add_image_path("rabbit-images")
108
+
109
+ slide_body = [Slide, Body]
110
+ item_list_item = [ItemList, ItemListItem]
111
+
112
+ indent = 50
113
+
114
+ match(*(slide_body + (item_list_item * 1))) do |items|
115
+ name = "item1"
116
+ items.delete_pre_draw_proc_by_name(name)
117
+ items.delete_post_draw_proc_by_name(name)
118
+ draw_image_mark(items, @item_image_1, name, indent: indent)
119
+ end
120
+
121
+ match(*(slide_body + (item_list_item * 2))) do |items|
122
+ name = "item2"
123
+ items.delete_pre_draw_proc_by_name(name)
124
+ items.delete_post_draw_proc_by_name(name)
125
+ draw_image_mark(items, @item_image_2, name, indent: indent)
126
+ end
127
+
128
+ match(*(slide_body + (item_list_item * 3))) do |items|
129
+ name = "item3"
130
+ items.delete_pre_draw_proc_by_name(name)
131
+ items.delete_post_draw_proc_by_name(name)
132
+ draw_image_mark(items, @item_image_3, name, indent: indent)
133
+ end
134
+
135
+ enum_list_item = [EnumList, EnumListItem]
136
+
137
+ match(*(slide_body + enum_list_item + item_list_item)) do |items|
138
+ name = "enum-item1"
139
+ items.delete_pre_draw_proc_by_name(name)
140
+ items.delete_post_draw_proc_by_name(name)
141
+ draw_image_mark(items, @item_image_1, name, indent: indent)
142
+ end
143
+
144
+ match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
145
+ name = "enum-item2"
146
+ items.delete_pre_draw_proc_by_name(name)
147
+ items.delete_post_draw_proc_by_name(name)
148
+ draw_image_mark(items, @item_image_2, name, indent: indent)
149
+ end
150
+
151
+ # table
152
+ all_table = ["**", Table]
153
+ match(*(all_table + [TableBody, TableRow, TableCell])) do |cells|
154
+ set_font_family(cells, @monospace_font_family)
155
+ end
156
+ match(*(all_table + [TableHead, TableRow, TableHeader])) do |headers|
157
+ set_font_family(headers, @monospace_font_family)
158
+ end
159
+
160
+ match("**", Emphasis, Emphasis) do |texts|
161
+ texts.prop_set("foreground", @default_emphasis_level2_color)
162
+ texts.prop_set("weight", "normal")
163
+ end
164
+
165
+ # Chapter
166
+ match Slide do |slides|
167
+ slides.each do |slide|
168
+ if slide.match?(/sub_chapter/)
169
+ slide.horizontal_centering = true
170
+ elsif slide.match?(/chapter/)
171
+ set_font_family slide, @title_font_family
172
+ slide.horizontal_centering = true
173
+ elsif slide.match?(/cite/)
174
+ slide.prop_set "foreground", "#222222"
175
+ slide.horizontal_centering = true
176
+ end
177
+ end
178
+ end
179
+
180
+ match("**", PreformattedBlock) do |blocks|
181
+ blocks.prop_set("foreground", "#00FFAF")
182
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-hasumikin-RubyConfTaiwan2023
3
+ version: !ruby/object:Gem::Version
4
+ version: 2023.12.15.0
5
+ platform: ruby
6
+ authors:
7
+ - HASUMI Hitoshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-12-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: Presentation slide for RubyConf Taiwan 2023
28
+ email:
29
+ - hasumikin@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - PicoRuby_ep4.rab
36
+ - README.rd
37
+ - Rakefile
38
+ - config.yaml
39
+ - images/QR_R2P2.png
40
+ - images/QR_picoruby.png
41
+ - images/QR_prk_firmware.png
42
+ - images/R2D2_mosaic.png
43
+ - images/boot_button_1.png
44
+ - images/broadcaster_bb.png
45
+ - images/c3p0_icon-icons.com_76936.png
46
+ - images/disable-bluetooth.jpg
47
+ - images/download-r2p2.png
48
+ - images/ewok_icon-icons.com_76943.png
49
+ - images/hasumi.jpg
50
+ - images/hello_taiwan.jpg
51
+ - images/install-uf2.png
52
+ - images/kamos-2023.jpg
53
+ - images/lcd-and-thermo.jpg
54
+ - images/mark_g.png
55
+ - images/mark_y.png
56
+ - images/observer_bb.png
57
+ - images/pico-and-pico_w.jpg
58
+ - images/r2d2_icon-icons.com_76952.png
59
+ - images/setup.jpg
60
+ - images/star-background.jpg
61
+ - images/teraterm.png
62
+ - images/title-background.png
63
+ - pdf/RubyConfTaiwan2023-PicoRuby_ep4.pdf
64
+ - theme.rb
65
+ homepage: https://slide.rabbit-shocker.org/authors/hasumikin/RubyConfTaiwan2023/
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubygems_version: 3.4.13
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: PicoRuby epsode 4
88
+ test_files: []