rabbit-slide-hasumikin-KeebKaigi2023 2022.05.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bdadd24317419639077b394662232dcceb19c221f1fce06fd4ddf52858fbdb53
4
+ data.tar.gz: d5adc18602df421aa8689fd94d9ccc57a4e916f9983e7ce4f826f3e36e5a9bf6
5
+ SHA512:
6
+ metadata.gz: 810bdb5b35daffb725fd0c459b122180a48737685685516924cd9dd0b9db79f78f584cbfd15e1bee97f17f38e053574343e9906f1f0c1b544d0424c31a994655
7
+ data.tar.gz: 9dedf04a7566c7e0e0bdf1d310f59208d209799df79115ebffc7f5803657e7ccfe5b5ee3b9b850049df4323be4615dcd9d1c10372c110e4253345aa64d15ee3d
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ PointingDeviceOnThePartnerHalf.rab
@@ -0,0 +1,255 @@
1
+ = Pointing Device
2
+
3
+ : subtitle
4
+ On The Partner Half
5
+ : author
6
+ hasumikin
7
+ : date
8
+ Mar. 10, 2023
9
+ : allotted-time
10
+ 20m
11
+ : theme
12
+ theme
13
+
14
+ = Today's mood
15
+
16
+ * Sharing how a keybosrd firmware creator thinks
17
+ * We won't get a conclusion today
18
+ * New ideas are welcome!
19
+
20
+
21
+ = PRK Firmware - Outline
22
+
23
+ * QMK inspired firmware
24
+ * Written in PicoRuby
25
+ * You don't need to build a firmware
26
+ * Instead, just drag and drop a `keymap.rb`
27
+
28
+ = PRK Firmware - Features
29
+
30
+ * Split-type, Consumer key
31
+ * Num/Caps/Scroll lock
32
+ * Layer, Debounce, Composite key
33
+ * Rotary encoder, Joystick
34
+ * RGBLED, Sounder
35
+
36
+ = PRK Firmware - Coming next
37
+
38
+ * Track ball / Touchpad / Joystick as a ((*Mouse*))
39
+ * You can configure a device based on I2C, SPI and ADC
40
+ * PicoRuby has implemented general peripheral classes
41
+
42
+ = PRK Firmware - Track ball🖲️
43
+
44
+ # image
45
+ # src = images/keyball44.jpg
46
+ # relative-height = 98
47
+
48
+ = PRK Firmware - I2C Track ball
49
+
50
+ # enscript ruby
51
+ require "i2c"
52
+ require "mouse"
53
+
54
+ i2c = I2C.new(unit: :RP2040_I2C0, frequency: 100_000,
55
+ sda_pin: 20, scl_pin: 21)
56
+ mouse = Mouse.new(driver: i2c)
57
+ mouse.task do |mouse, keyboard|
58
+ left, x, up, y, push = mouse.driver.read(0x0a, 5).bytes
59
+ x = -left if 0 < left
60
+ y = -up if 0 < up
61
+ # LEFT: 0b001, RIGHT: 0b010, MIDDLE: 0b100
62
+ button = (push == 128 ? 0b100 : 0)
63
+ if keyboard.layer == :default
64
+ USB.merge_mouse_report(button, x, y, 0, 0)
65
+ else
66
+ # Works as a scroll wheel when layer is changed
67
+ USB.merge_mouse_report(button, 0, 0, x, -y)
68
+ end
69
+ end
70
+ kbd.append mouse
71
+
72
+ = An issue of split-type
73
+
74
+ * Pointing device works on only "Anchor"
75
+ * Anchor: The half that connects to USB
76
+ * Partner: The opposite
77
+
78
+ = An issue of split-type
79
+
80
+ * Pointing device works on only "Anchor"
81
+ * Anchor: The half that connects to USB
82
+ * Partner: The opposite
83
+
84
+ (('tag:center'))
85
+ (('tag:x-large'))
86
+ ((*I know you want to place balls on both sides*))
87
+
88
+ = UART - Communication protocol
89
+
90
+ # enscript sh
91
+ # Simplex: One wire (TRS)
92
+ Anchor RX <---- TX Partner
93
+
94
+ # Full duplex: Two wires (TRRS)
95
+ Anchor TX ----> RX Partner
96
+ Anchor RX <---- TX Partner
97
+
98
+ # Half duplex: One wire (TRS)
99
+ Anchor RX/TX <===> TX/RX Partner
100
+
101
+ = Bit-banging half duplex
102
+
103
+ * Manually manipulating GPIO to simulate a UART communication protocol
104
+ * Manually toggling the TX and RX to send and receive data on ((*one wire*))
105
+ * MCU may breaks if both sides become TX at the same time
106
+
107
+ = PRK Fimeware - Bit-banging
108
+
109
+ # enscript sh
110
+ Anchor(TX) ---> Partner(RX)
111
+ Stop-bit : 11111111
112
+ Start-bit : 0
113
+ Data : 87654321
114
+ Stop-bit : 11
115
+ Extra-bit : 0
116
+ ---------------------------------------------------------------
117
+ Demilitarized zone (both are RX)
118
+ DMZ : 0000
119
+ ---------------------------------------------------------------
120
+ Anchor(RX) <--- Partner(TX)
121
+ Idle-bit : 0000
122
+ Stop-bit : 1
123
+ Start-bit : 0
124
+ Data1,2,3 : 87654321 87654321 87654321
125
+ Stop-bit : 1
126
+ ---------------------------------------------------------------
127
+ Anchor(TX) ---> Partner(RX)
128
+ Idling : 0
129
+
130
+ = PRK Fimeware - Bit-banging
131
+
132
+ * In a bit-bang cycle,
133
+ * Anhcor sends 8 bits then receives 24 bits
134
+ * Partner receives 8 bits then sends 24 bits
135
+
136
+ = What can 8-bit represent?
137
+
138
+ # enscript sh
139
+ # One key switch
140
+ 87654321
141
+ ^^^ row number (0 to 7)
142
+ ^^^^^ col number (0 to 31)
143
+
144
+ # Four rotary encoders
145
+ 87654321
146
+ ^^ ^^
147
+ ^^ ^^ 2-bit each (-1,0,1)
148
+
149
+ = What can 8-bit represent?
150
+
151
+ # enscript sh
152
+ # One coarsened axis data of an analog stick
153
+ 87654321 (0 to 255. Originally 12 bits: 0 to 4095)
154
+
155
+ # One axis and one button of a pointing device
156
+ 87654321
157
+ ^^^^^^^ Signed 7 bit (-64 to 63)
158
+ ^ Button push
159
+
160
+ = How many bits are required?
161
+
162
+ * A key switch: 8 bits
163
+ * A rotary encoder: 2 bits
164
+ * A joystick (X, Y): 16 bits (ideally 24 bits)
165
+ * A pointing device (X, Y, 2 buttons): 16 bits
166
+ * If more buttons or multiple gestures: 17+ bits
167
+
168
+ = What if a track ball on partner?
169
+
170
+ * We'd need 40 bits (5 bytes) data width
171
+ * 24 bits (3 bytes) for three key switches
172
+ * 16 bits (2 bytes) for a track ball
173
+
174
+ = 24 bits width would be short
175
+
176
+ # enscript sh
177
+ Anchor(TX) ---> Partner(RX)
178
+ Stop-bit : 11111111
179
+ Start-bit : 0
180
+ Data : 87654321
181
+ Stop-bit : 11
182
+ Extra-bit : 0
183
+ ---------------------------------------------------------------
184
+ Demilitarized zone (both are RX)
185
+ DMZ : 0000
186
+ ---------------------------------------------------------------
187
+ Anchor(RX) <--- Partner(TX)
188
+ Idle-bit : 0000
189
+ Stop-bit : 1
190
+ Start-bit : 0
191
+ Data1,2,3 : 87654321 87654321 87654321
192
+ Stop-bit : 1
193
+ ---------------------------------------------------------------
194
+ Anchor(TX) ---> Partner(RX)
195
+ Idling : 0
196
+
197
+ = Plan A: Expand the data width
198
+
199
+ # enscript sh
200
+ Anchor(TX) ---> Partner(RX)
201
+ Stop-bit : 11111111
202
+ Start-bit : 0
203
+ Data : 87654321
204
+ Stop-bit : 11
205
+ Extra-bit : 0
206
+ ---------------------------------------------------------------
207
+ Demilitarized zone (both are RX)
208
+ DMZ : 0000
209
+ ---------------------------------------------------------------
210
+ Anchor(RX) <--- Partner(TX)
211
+ Idle-bit : 0000
212
+ Stop-bit : 1
213
+ Start-bit : 0
214
+ Data1,2,3,4,5: 87654321 87654321 87654321 87654321 87654321
215
+ Stop-bit : 1 👆👆👆👆 👆👆👆👆
216
+ ---------------------------------------------------------------
217
+ Anchor(TX) ---> Partner(RX)
218
+ Idling : 0
219
+
220
+ = Plan A: Expand the data width
221
+
222
+ * Plan A: Easy to implement but,
223
+ * What if one needs 6 bytes?
224
+ * Joystick and rotary encoders and,......🔥
225
+
226
+ = Plan B: Multiple comm threads
227
+
228
+ * Divide threads into:
229
+ * Thread 1: 24 bits for three key switches
230
+ * Thread 2: 24 bits for user difined device
231
+ * Each input sustains for two thread cycles
232
+ * Three or more threads?🤔
233
+
234
+ = Plan B: Multiple comm threads
235
+
236
+ * Plan A: Easy to implement but,
237
+ * What if one needs 6 bytes?
238
+ * Joystick and rotary encoders and,......🔥
239
+ * Plan B: Harder to implement🐛
240
+ * Both: Poorer performance?
241
+
242
+ = Plan C: ??????????????????????
243
+
244
+ (('tag:center'))
245
+ (('tag:xx-large'))
246
+ If you have an idea, reach out to\n(twitter | github).com/hasumikin
247
+
248
+ = chapter
249
+
250
+ (('tag:xx-large'))
251
+ ((*Thank you!!!!q*))
252
+ == prop
253
+ : hide-title
254
+ true
255
+
data/README.rd ADDED
@@ -0,0 +1,24 @@
1
+ = Pointing Device On The Partner Half
2
+
3
+ Presentation slide for KeebKaigi 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-KeebKaigi2023
20
+
21
+ === Show
22
+
23
+ rabbit rabbit-slide-hasumikin-KeebKaigi2023.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: KeebKaigi2023
3
+ base_name: PointingDeviceOnThePartnerHalf
4
+ tags:
5
+ - PicoRuby
6
+ - PointingDevice
7
+ - Firmware
8
+ presentation_date: '2023-05-10'
9
+ presentation_start_time:
10
+ presentation_end_time:
11
+ version: 2022.05.10.0
12
+ licenses: ["MIT License"]
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/theme.rb ADDED
@@ -0,0 +1,177 @@
1
+ # puts font_families.sort
2
+ @xxx_large_font_size = screen_size(12 * Pango::SCALE)
3
+ @xx_large_font_size = screen_size(9 * Pango::SCALE)
4
+ @x_large_font_size = screen_size(8 * Pango::SCALE)
5
+ @large_font_size = screen_size(7 * 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('Saira')
12
+ @monospace_font_family = 'Courier Prime'
13
+ @title_font_family = find_font_family('Saira')
14
+
15
+ # colors
16
+ foreground = "#e9fd01"
17
+ light_gray = "#444444"
18
+ green = "#b5ff14"
19
+ pink = "#fc0fc0"
20
+ blue = "#00bfff"
21
+
22
+ @default_headline_line_color = pink
23
+ @default_headline_line_width = 2
24
+ @default_headline_line_expand = true
25
+
26
+ @default_emphasis_color = pink
27
+ @default_emphasis_level2_color = "#ffffff"
28
+
29
+ set_graffiti_color green
30
+ set_graffiti_line_width 5
31
+
32
+ @preformatted_fill_color = '#222222'
33
+ # @preformatted_centering = true
34
+ @space = screen_y(1)
35
+
36
+ @image_slide_number_start_flag_color = pink
37
+ @image_slide_number_goal_flag_color = blue
38
+
39
+ #@slide_headline_hide = true
40
+
41
+ @slide_background_image = 'images/assets/body_2.png'
42
+ include_theme("slide-background-image")
43
+
44
+ @title_slide_background_image = 'images/assets/cover_2.png'
45
+ include_theme("title-slide-background-image")
46
+
47
+ include_theme('default')
48
+
49
+ match(Slide) do |slides|
50
+ slides.margin_left = 100
51
+ slides.margin_right = 100
52
+ slides.prop_set("foreground", foreground)
53
+ end
54
+ match(Slide, HeadLine) do |heads|
55
+ heads.margin_top = 0
56
+ heads.prop_set "foreground", blue
57
+ # heads.prop_set("weight", "normal")
58
+ # set_font_family(heads)
59
+ end
60
+
61
+ match TitleSlide do |slides|
62
+ slides.margin_left = 0
63
+ slides.prop_set("foreground", foreground)
64
+ end
65
+ match TitleSlide, Title do |title|
66
+ title.margin_top = 250
67
+ title.prop_set "size", @xxx_large_font_size
68
+ title.prop_set "font-family", @title_font_family
69
+ title.prop_set "weight", "bold"
70
+ end
71
+ match TitleSlide, Subtitle do |subtitle|
72
+ subtitle.margin_top = -100
73
+ subtitle.prop_set "size", @xxx_large_font_size
74
+ subtitle.prop_set "font-family", @title_font_family
75
+ subtitle.prop_set "weight", "bold"
76
+ end
77
+ match TitleSlide, Author do |author|
78
+ author.margin_top = -50
79
+ author.prop_set "size", @large_font_size
80
+ author.prop_set "foreground", pink
81
+ end
82
+ match TitleSlide, Date do |date|
83
+ date.margin_top = -20
84
+ date.prop_set "size", @x_small_font_size
85
+ date.prop_set "style", "normal"
86
+ date.prop_set "foreground", blue
87
+ end
88
+ match TitleSlide, Institution do |i|
89
+ i.prop_set "size", @x_small_font_size
90
+ i.prop_set "style", "normal"
91
+ end
92
+
93
+ #@slide_logo_image = 'images/mark_g.png'
94
+ #include_theme('slide-logo')
95
+
96
+ @item_image_1 = 'images/assets/bullet-point.png'
97
+ @item_image_2 = 'images/assets/bullet-point.png'
98
+ @item_image_3 = 'images/assets/bullet-point.png'
99
+
100
+ include_theme("default-item-mark")
101
+
102
+ add_image_path("rabbit-images")
103
+
104
+ slide_body = [Slide, Body]
105
+ item_list_item = [ItemList, ItemListItem]
106
+
107
+ indent = 50
108
+
109
+ match(*(slide_body + (item_list_item * 1))) do |items|
110
+ name = "item1"
111
+ items.delete_pre_draw_proc_by_name(name)
112
+ items.delete_post_draw_proc_by_name(name)
113
+ draw_image_mark(items, @item_image_1, name, indent: indent)
114
+ end
115
+
116
+ match(*(slide_body + (item_list_item * 2))) do |items|
117
+ name = "item2"
118
+ items.delete_pre_draw_proc_by_name(name)
119
+ items.delete_post_draw_proc_by_name(name)
120
+ draw_image_mark(items, @item_image_2, name, indent: indent)
121
+ end
122
+
123
+ match(*(slide_body + (item_list_item * 3))) do |items|
124
+ name = "item3"
125
+ items.delete_pre_draw_proc_by_name(name)
126
+ items.delete_post_draw_proc_by_name(name)
127
+ draw_image_mark(items, @item_image_3, name, indent: indent)
128
+ end
129
+
130
+ enum_list_item = [EnumList, EnumListItem]
131
+
132
+ match(*(slide_body + enum_list_item + item_list_item)) do |items|
133
+ name = "enum-item1"
134
+ items.delete_pre_draw_proc_by_name(name)
135
+ items.delete_post_draw_proc_by_name(name)
136
+ draw_image_mark(items, @item_image_1, name, indent: indent)
137
+ end
138
+
139
+ match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
140
+ name = "enum-item2"
141
+ items.delete_pre_draw_proc_by_name(name)
142
+ items.delete_post_draw_proc_by_name(name)
143
+ draw_image_mark(items, @item_image_2, name, indent: indent)
144
+ end
145
+
146
+ # table
147
+ all_table = ["**", Table]
148
+ match(*(all_table + [TableBody, TableRow, TableCell])) do |cells|
149
+ set_font_family(cells, @monospace_font_family)
150
+ end
151
+ match(*(all_table + [TableHead, TableRow, TableHeader])) do |headers|
152
+ set_font_family(headers, @monospace_font_family)
153
+ end
154
+
155
+ match("**", Emphasis, Emphasis) do |texts|
156
+ texts.prop_set("foreground", @default_emphasis_level2_color)
157
+ texts.prop_set("weight", "normal")
158
+ end
159
+
160
+ # Chapter
161
+ match Slide do |slides|
162
+ slides.each do |slide|
163
+ if slide.match?(/sub_chapter/)
164
+ slide.horizontal_centering = true
165
+ elsif slide.match?(/chapter/)
166
+ set_font_family slide, @title_font_family
167
+ slide.horizontal_centering = true
168
+ elsif slide.match?(/cite/)
169
+ slide.prop_set "foreground", foreground
170
+ slide.horizontal_centering = true
171
+ end
172
+ end
173
+ end
174
+
175
+ match("**", PreformattedBlock) do |blocks|
176
+ blocks.prop_set("foreground", foreground)
177
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-hasumikin-KeebKaigi2023
3
+ version: !ruby/object:Gem::Version
4
+ version: 2022.05.10.0
5
+ platform: ruby
6
+ authors:
7
+ - HASUMI Hitoshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-10 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 KeebKaigi 2023
28
+ email:
29
+ - hasumikin@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - PointingDeviceOnThePartnerHalf.rab
36
+ - README.rd
37
+ - Rakefile
38
+ - config.yaml
39
+ - images/assets/body_1.png
40
+ - images/assets/body_2.png
41
+ - images/assets/body_3.png
42
+ - images/assets/bullet-point.png
43
+ - images/assets/cover_1.png
44
+ - images/assets/cover_2.png
45
+ - images/assets/cover_3.png
46
+ - images/keyball44.jpg
47
+ - pdf/KeebKaigi2023-PointingDeviceOnThePartnerHalf.pdf
48
+ - theme.rb
49
+ homepage: https://slide.rabbit-shocker.org/authors/hasumikin/KeebKaigi2023/
50
+ licenses:
51
+ - MIT License
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubygems_version: 3.4.12
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: Pointing Device On The Partner Half
72
+ test_files: []