├── .gitignore ├── .gitmodules ├── CONTRIBUTING ├── LICENSE ├── README.md ├── images ├── bar.webp ├── caps.webp ├── doublesided.webp ├── drumset.webp ├── flap.webp ├── furikku.webp ├── mageru.webp ├── magichand.webp ├── morse.webp ├── nazoru.webp ├── piropiro.webp ├── puchipuchi.webp └── yunomi.webp ├── mozc-bar ├── README.md ├── board │ ├── .gitignore │ ├── controller │ │ ├── controller.kicad_pcb │ │ ├── controller.net │ │ ├── controller.pro │ │ └── controller.sch │ ├── type-a │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-a-rescue.dcm │ │ ├── type-a-rescue.lib │ │ ├── type-a.kicad_pcb │ │ ├── type-a.net │ │ ├── type-a.pro │ │ └── type-a.sch │ ├── type-b │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-b-rescue.dcm │ │ ├── type-b-rescue.lib │ │ ├── type-b.kicad_pcb │ │ ├── type-b.net │ │ ├── type-b.pro │ │ └── type-b.sch │ ├── type-c │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-c-rescue.dcm │ │ ├── type-c-rescue.lib │ │ ├── type-c.kicad_pcb │ │ ├── type-c.net │ │ ├── type-c.pro │ │ └── type-c.sch │ ├── type-d │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-d-rescue.dcm │ │ ├── type-d-rescue.lib │ │ ├── type-d.kicad_pcb │ │ ├── type-d.net │ │ ├── type-d.pro │ │ └── type-d.sch │ ├── type-e │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-e-rescue.dcm │ │ ├── type-e-rescue.lib │ │ ├── type-e.kicad_pcb │ │ ├── type-e.net │ │ ├── type-e.pro │ │ └── type-e.sch │ ├── type-f │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-f-rescue.dcm │ │ ├── type-f-rescue.lib │ │ ├── type-f.kicad_pcb │ │ ├── type-f.net │ │ ├── type-f.pro │ │ └── type-f.sch │ └── type-g │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── type-g-rescue.dcm │ │ ├── type-g-rescue.lib │ │ ├── type-g.kicad_pcb │ │ ├── type-g.net │ │ ├── type-g.pro │ │ └── type-g.sch ├── case │ ├── controller.stl │ ├── left-tip.stl │ ├── right-tip.stl │ ├── typeA.stl │ ├── typeB.stl │ ├── typeC.stl │ ├── typeD.stl │ ├── typeE.stl │ ├── typeF.stl │ └── typeG.stl ├── firmware │ ├── mozc-bar-promicro │ │ └── mozc-bar-promicro.ino │ └── mozc-bar-stickc │ │ └── mozc-bar-stickc.ino └── image │ ├── aluminium_frame.png │ ├── header.jpg │ ├── keymap.png │ ├── pcbs.jpg │ ├── promicro.jpg │ ├── spacer.png │ ├── stickc-after.jpg │ └── stickc-before.jpg ├── mozc-caps ├── README.md ├── firmware │ └── mozc-caps │ │ ├── .gitignore │ │ └── mozc-caps.ino ├── hardware │ ├── bump_cap_insert_mount.stl │ ├── sliding_plate.stl │ ├── switch_mount.stl │ ├── top_plate.stl │ └── top_plate_angle_bracket_mount.stl └── images │ ├── assembly_1.png │ ├── assembly_2.png │ ├── assembly_3.png │ ├── attach_rubber_band.jpg │ ├── bump_cap_insert_mount.png │ ├── header.jpg │ ├── mount_inner_rail.jpg │ ├── sliding_plate.png │ ├── switch_harness.jpg │ ├── switch_mount.png │ ├── switch_pressed.jpg │ ├── switch_with_mount.jpg │ ├── top_board.png │ └── top_plate_angle_bracket_mount.png ├── mozc-doublesided ├── README.md ├── README_ja.md ├── board │ ├── Library.kicad_sym │ ├── Library.pretty │ │ ├── CUT.kicad_mod │ │ ├── JST_S7B_ZR.kicad_mod │ │ ├── JST_S8B_ZR.kicad_mod │ │ ├── Keyswitch.kicad_mod │ │ └── SK6812MINIe (Reverse).kicad_mod │ ├── main │ │ ├── fp-lib-table │ │ ├── main.kicad_pcb │ │ ├── main.kicad_prl │ │ ├── main.kicad_pro │ │ ├── main.kicad_sch │ │ └── sym-lib-table │ ├── main_panel │ │ ├── fabrication-toolkit-options.json │ │ ├── main_panel.kicad_pcb │ │ ├── main_panel.kicad_prl │ │ ├── main_panel.kicad_pro │ │ └── main_panel.kicad_sch │ ├── sub │ │ ├── fabrication-toolkit-options.json │ │ ├── fp-lib-table │ │ ├── sub.kicad_pcb │ │ ├── sub.kicad_prl │ │ ├── sub.kicad_pro │ │ ├── sub.kicad_sch │ │ ├── sub.rules │ │ └── sym-lib-table │ ├── sub_panel │ │ ├── fabrication-toolkit-options.json │ │ ├── sub_panel.kicad_pcb │ │ ├── sub_panel.kicad_prl │ │ ├── sub_panel.kicad_pro │ │ └── sub_panel.kicad_sch │ └── usb │ │ ├── fabrication-toolkit-options.json │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── usb.kicad_pcb │ │ ├── usb.kicad_prl │ │ ├── usb.kicad_pro │ │ ├── usb.kicad_sch │ │ └── usb.rules ├── case │ ├── case00.stl │ ├── case01.stl │ ├── case02.stl │ ├── case03.stl │ ├── case04.stl │ ├── case05.stl │ ├── case06.stl │ ├── case07.stl │ ├── case08.stl │ ├── case09.stl │ ├── case10.stl │ ├── case11.stl │ ├── case12.stl │ ├── case13.stl │ ├── case14.stl │ ├── case15.stl │ ├── case16.stl │ ├── case17.stl │ ├── case18.stl │ ├── case19.stl │ ├── case20.stl │ ├── case21.stl │ ├── case22.stl │ ├── case23.stl │ ├── case24.stl │ ├── case25.stl │ └── jig.stl ├── examples │ └── webhid.html ├── firmware │ ├── CMakeLists.txt │ ├── Core │ │ ├── Inc │ │ │ ├── hid.h │ │ │ ├── i2c.h │ │ │ ├── led.h │ │ │ └── mozc.h │ │ └── Src │ │ │ ├── hid.c │ │ │ ├── i2c.c │ │ │ ├── led.c │ │ │ └── mozc.c │ ├── STM32F042F6Px_FLASH.ld.diff │ ├── firmware.diff │ ├── firmware.ioc │ └── prebuilt │ │ └── mozc.elf ├── gerber │ ├── main_panel.zip │ ├── main_panel_bom.csv │ ├── main_panel_positions.csv │ ├── sub_panel.zip │ ├── sub_panel_bom.csv │ ├── sub_panel_positions.csv │ ├── usb.zip │ ├── usb_bom.csv │ └── usb_positions.csv └── images │ ├── connect_boards.png │ ├── connections.png │ ├── header.webp │ ├── pairing_case.webp │ ├── pairing_helper.webp │ ├── pcb_pair.png │ ├── pcb_primary.png │ ├── pcb_swd.png │ ├── primary_case.webp │ ├── primary_usb.webp │ └── usb_case.webp ├── mozc-furikku ├── README.md ├── arduino │ └── flick │ │ ├── flick.ino │ │ ├── flick_keyboard.cpp │ │ └── flick_keyboard.h ├── circuit.png └── photo │ ├── device.jpg │ ├── jsmodule.jpg │ └── keyboard.jpg ├── mozc-mageru ├── README.md ├── wired │ └── firmware │ │ └── firmware.ino └── wireless │ └── board │ ├── board-bottom.png │ ├── board-top.png │ ├── board.brd │ ├── board.sch │ └── schematic.png ├── mozc-nazoru ├── .gitignore ├── README.rst ├── bin │ ├── nazoru-input │ └── nazoru-training ├── board │ ├── nazoru-stack.brd │ ├── nazoru-stack.sch │ └── schematic.png ├── data │ ├── nazoru.service │ └── strokes.zip ├── setup.py └── src │ └── nazoru │ ├── __init__.py │ ├── bluetooth.py │ ├── core.py │ ├── data │ └── optimized_nazoru.pb │ ├── keyboard_recorder.py │ ├── led.py │ ├── lib.py │ ├── nazoru_test.py │ ├── nazorunet.py │ ├── predictor.py │ └── utils.py ├── mozc-piropiro ├── README.md ├── arduino │ └── piropiro │ │ └── piropiro.ino ├── assembly.png ├── circuit.png ├── example.jpg └── stl │ ├── arm.stl │ ├── base.stl │ ├── holder1.stl │ ├── holder2.stl │ └── sensor_bracket.stl ├── mozc-yunomi ├── README.md ├── README_promicro.md ├── board │ ├── .gitignore │ ├── base-promicro │ │ ├── base-promicro.kicad_pcb │ │ ├── base-promicro.net │ │ ├── base-promicro.pro │ │ └── base-promicro.sch │ ├── base │ │ ├── base.kicad_pcb │ │ ├── base.net │ │ ├── base.pro │ │ └── base.sch │ └── key │ │ ├── fp-lib-table │ │ ├── sym-lib-table │ │ ├── yunomi.kicad_pcb │ │ ├── yunomi.net │ │ ├── yunomi.pro │ │ └── yunomi.sch ├── firmware │ └── firmware.ino ├── images │ ├── base-pcb.png │ ├── base-pcb_promicro.png │ ├── connect.png │ ├── connect2.jpg │ ├── connect3.jpg │ ├── connect4.jpg │ ├── connect4_promicro.jpg │ ├── device.jpg │ ├── key-pcb.png │ ├── pcbs.jpg │ ├── pcbs_promicro.jpg │ └── platform_promicro.jpg ├── jig.stl └── platform_promicro.stl └── third_party ├── .gitignore ├── mozc-flap ├── COPYING ├── Makefile ├── Readme.txt ├── circuit.png ├── flap.c ├── usb_keyboard.c ├── usb_keyboard.h └── usbconfig.h ├── mozc-mageru └── spoon_stl │ ├── LICENSE │ ├── README.md │ └── slotted_spoon.stl ├── mozc-morse ├── COPYING ├── Makefile ├── Readme.txt ├── circuit.png ├── dit-dah.c ├── romaji_dit-dah.txt ├── space.c ├── usb_keyboard.c ├── usb_keyboard.h └── usbconfig.h ├── mozc-puchi ├── LICENSE ├── README.md ├── circuit │ └── circuit.jpg ├── desktop │ ├── 3Dprinter │ │ ├── desktop.igs │ │ ├── desktop.stl │ │ └── desktop.stp │ └── Arduino │ │ └── desktop │ │ └── desktop.ino ├── handheld │ ├── 3Dprinter │ │ ├── handheld.igs │ │ ├── handheld.stl │ │ └── handheld.stp │ └── Arduino │ │ └── handheld │ │ └── handheld.ino └── photo │ └── device_desktop.jpg └── usbdrv ├── Changelog.txt ├── CommercialLicense.txt ├── License.txt ├── Readme.txt ├── USB-ID-FAQ.txt ├── USB-IDs-for-free.txt ├── asmcommon.inc ├── oddebug.c ├── oddebug.h ├── usbconfig-prototype.h ├── usbdrv.c ├── usbdrv.h ├── usbdrvasm.S ├── usbdrvasm.asm ├── usbdrvasm12.inc ├── usbdrvasm128.inc ├── usbdrvasm15.inc ├── usbdrvasm16.inc ├── usbdrvasm165.inc ├── usbdrvasm18-crc.inc ├── usbdrvasm20.inc └── usbportability.h /.gitignore: -------------------------------------------------------------------------------- 1 | *-cache.lib 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "third_party/mozc-yunomi/daprice-keyswitches.pretty"] 2 | path = third_party/mozc-yunomi/daprice-keyswitches.pretty 3 | url = https://github.com/daprice/keyswitches.pretty 4 | -------------------------------------------------------------------------------- /CONTRIBUTING: -------------------------------------------------------------------------------- 1 | Want to contribute? Great! First, read this page (including the small print at the end). 2 | 3 | ### Before you contribute 4 | Before we can use your code, you must sign the 5 | [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) 6 | (CLA), which you can do online. The CLA is necessary mainly because you own the 7 | copyright to your changes, even after your contribution becomes part of our 8 | codebase, so we need your permission to use and distribute your code. We also 9 | need to be sure of various other things—for instance that you'll tell us if you 10 | know that your code infringes on other people's patents. You don't have to sign 11 | the CLA until after you've submitted your code for review and a member has 12 | approved it, but you must do it before we can put your code into our codebase. 13 | Before you start working on a larger contribution, you should get in touch with 14 | us first through the issue tracker with your idea so that we can help out and 15 | possibly guide you. Coordinating up front makes it much easier to avoid 16 | frustration later on. 17 | 18 | ### Code reviews 19 | All submissions, including submissions by project members, require review. We 20 | use Github pull requests for this purpose. 21 | 22 | ### The small print 23 | Contributions made by corporations are covered by a different agreement than 24 | the one above, the 25 | [Software Grant and Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate). 26 | 27 | -------------------------------------------------------------------------------- /images/bar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/bar.webp -------------------------------------------------------------------------------- /images/caps.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/caps.webp -------------------------------------------------------------------------------- /images/doublesided.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/doublesided.webp -------------------------------------------------------------------------------- /images/drumset.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/drumset.webp -------------------------------------------------------------------------------- /images/flap.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/flap.webp -------------------------------------------------------------------------------- /images/furikku.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/furikku.webp -------------------------------------------------------------------------------- /images/mageru.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/mageru.webp -------------------------------------------------------------------------------- /images/magichand.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/magichand.webp -------------------------------------------------------------------------------- /images/morse.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/morse.webp -------------------------------------------------------------------------------- /images/nazoru.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/nazoru.webp -------------------------------------------------------------------------------- /images/piropiro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/piropiro.webp -------------------------------------------------------------------------------- /images/puchipuchi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/puchipuchi.webp -------------------------------------------------------------------------------- /images/yunomi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/images/yunomi.webp -------------------------------------------------------------------------------- /mozc-bar/board/.gitignore: -------------------------------------------------------------------------------- 1 | *.000 2 | *.bak 3 | *.bck 4 | *.kicad_pcb-bak 5 | *.kicad_sch-bak 6 | *.kicad_prl 7 | *.sch-bak 8 | *~ 9 | _autosave-* 10 | *.tmp 11 | *-save.pro 12 | *-save.kicad_pcb 13 | fp-info-cache 14 | -------------------------------------------------------------------------------- /mozc-bar/board/type-a/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-a/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-a-rescue)(type Legacy)(uri ${KIPRJMOD}/type-a-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-a/type-a-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-b/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-b/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-b-rescue)(type Legacy)(uri ${KIPRJMOD}/type-b-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-b/type-b-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-c/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-c/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-c-rescue)(type Legacy)(uri ${KIPRJMOD}/type-c-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-c/type-c-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-d/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-d/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-d-rescue)(type Legacy)(uri ${KIPRJMOD}/type-d-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-d/type-d-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-e/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-e/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-e-rescue)(type Legacy)(uri ${KIPRJMOD}/type-e-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-e/type-e-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-f/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-f/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-f-rescue)(type Legacy)(uri ${KIPRJMOD}/type-f-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-f/type-f-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-g/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name holes)(type KiCad)(uri ${KIPRJMOD}/../holes.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-g/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name type-g-rescue)(type Legacy)(uri ${KIPRJMOD}/type-g-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-bar/board/type-g/type-g-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /mozc-bar/case/controller.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/controller.stl -------------------------------------------------------------------------------- /mozc-bar/case/left-tip.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/left-tip.stl -------------------------------------------------------------------------------- /mozc-bar/case/right-tip.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/right-tip.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeA.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeA.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeB.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeB.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeC.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeC.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeD.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeD.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeE.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeE.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeF.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeF.stl -------------------------------------------------------------------------------- /mozc-bar/case/typeG.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/case/typeG.stl -------------------------------------------------------------------------------- /mozc-bar/image/aluminium_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/aluminium_frame.png -------------------------------------------------------------------------------- /mozc-bar/image/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/header.jpg -------------------------------------------------------------------------------- /mozc-bar/image/keymap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/keymap.png -------------------------------------------------------------------------------- /mozc-bar/image/pcbs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/pcbs.jpg -------------------------------------------------------------------------------- /mozc-bar/image/promicro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/promicro.jpg -------------------------------------------------------------------------------- /mozc-bar/image/spacer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/spacer.png -------------------------------------------------------------------------------- /mozc-bar/image/stickc-after.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/stickc-after.jpg -------------------------------------------------------------------------------- /mozc-bar/image/stickc-before.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-bar/image/stickc-before.jpg -------------------------------------------------------------------------------- /mozc-caps/firmware/mozc-caps/.gitignore: -------------------------------------------------------------------------------- 1 | imu.cpp 2 | imu.h 3 | debug.cfg 4 | debug_custom.json 5 | esp32.svd 6 | -------------------------------------------------------------------------------- /mozc-caps/hardware/bump_cap_insert_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/hardware/bump_cap_insert_mount.stl -------------------------------------------------------------------------------- /mozc-caps/hardware/sliding_plate.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/hardware/sliding_plate.stl -------------------------------------------------------------------------------- /mozc-caps/hardware/switch_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/hardware/switch_mount.stl -------------------------------------------------------------------------------- /mozc-caps/hardware/top_plate.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/hardware/top_plate.stl -------------------------------------------------------------------------------- /mozc-caps/hardware/top_plate_angle_bracket_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/hardware/top_plate_angle_bracket_mount.stl -------------------------------------------------------------------------------- /mozc-caps/images/assembly_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/assembly_1.png -------------------------------------------------------------------------------- /mozc-caps/images/assembly_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/assembly_2.png -------------------------------------------------------------------------------- /mozc-caps/images/assembly_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/assembly_3.png -------------------------------------------------------------------------------- /mozc-caps/images/attach_rubber_band.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/attach_rubber_band.jpg -------------------------------------------------------------------------------- /mozc-caps/images/bump_cap_insert_mount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/bump_cap_insert_mount.png -------------------------------------------------------------------------------- /mozc-caps/images/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/header.jpg -------------------------------------------------------------------------------- /mozc-caps/images/mount_inner_rail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/mount_inner_rail.jpg -------------------------------------------------------------------------------- /mozc-caps/images/sliding_plate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/sliding_plate.png -------------------------------------------------------------------------------- /mozc-caps/images/switch_harness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/switch_harness.jpg -------------------------------------------------------------------------------- /mozc-caps/images/switch_mount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/switch_mount.png -------------------------------------------------------------------------------- /mozc-caps/images/switch_pressed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/switch_pressed.jpg -------------------------------------------------------------------------------- /mozc-caps/images/switch_with_mount.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/switch_with_mount.jpg -------------------------------------------------------------------------------- /mozc-caps/images/top_board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/top_board.png -------------------------------------------------------------------------------- /mozc-caps/images/top_plate_angle_bracket_mount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-caps/images/top_plate_angle_bracket_mount.png -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib 2 | (version 20231120) 3 | (generator "kicad_symbol_editor") 4 | (generator_version "8.0") 5 | (symbol "SK6812MINIe" 6 | (pin_names 7 | (offset 0.254) 8 | ) 9 | (exclude_from_sim no) 10 | (in_bom yes) 11 | (on_board yes) 12 | (property "Reference" "D" 13 | (at 5.08 5.715 0) 14 | (effects 15 | (font 16 | (size 1.27 1.27) 17 | ) 18 | (justify right bottom) 19 | ) 20 | ) 21 | (property "Value" "SK6812MINIe" 22 | (at 1.27 -5.715 0) 23 | (effects 24 | (font 25 | (size 1.27 1.27) 26 | ) 27 | (justify left top) 28 | ) 29 | ) 30 | (property "Footprint" "LED_SMD:LED_SK6812MINI_PLCC4_3.5x3.5mm_P1.75mm" 31 | (at 1.27 -7.62 0) 32 | (effects 33 | (font 34 | (size 1.27 1.27) 35 | ) 36 | (justify left top) 37 | (hide yes) 38 | ) 39 | ) 40 | (property "Datasheet" "https://cdn-shop.adafruit.com/product-files/2686/SK6812MINI_REV.01-1-2.pdf" 41 | (at 2.54 -9.525 0) 42 | (effects 43 | (font 44 | (size 1.27 1.27) 45 | ) 46 | (justify left top) 47 | (hide yes) 48 | ) 49 | ) 50 | (property "Description" "RGB LED with integrated controller" 51 | (at 0 0 0) 52 | (effects 53 | (font 54 | (size 1.27 1.27) 55 | ) 56 | (hide yes) 57 | ) 58 | ) 59 | (property "ki_keywords" "RGB LED NeoPixel Mini addressable" 60 | (at 0 0 0) 61 | (effects 62 | (font 63 | (size 1.27 1.27) 64 | ) 65 | (hide yes) 66 | ) 67 | ) 68 | (property "ki_fp_filters" "LED*SK6812MINI*PLCC*3.5x3.5mm*P1.75mm*" 69 | (at 0 0 0) 70 | (effects 71 | (font 72 | (size 1.27 1.27) 73 | ) 74 | (hide yes) 75 | ) 76 | ) 77 | (symbol "SK6812MINIe_0_0" 78 | (text "RGB" 79 | (at 2.286 -4.191 0) 80 | (effects 81 | (font 82 | (size 0.762 0.762) 83 | ) 84 | ) 85 | ) 86 | ) 87 | (symbol "SK6812MINIe_0_1" 88 | (polyline 89 | (pts 90 | (xy 1.27 -3.556) (xy 1.778 -3.556) 91 | ) 92 | (stroke 93 | (width 0) 94 | (type default) 95 | ) 96 | (fill 97 | (type none) 98 | ) 99 | ) 100 | (polyline 101 | (pts 102 | (xy 1.27 -2.54) (xy 1.778 -2.54) 103 | ) 104 | (stroke 105 | (width 0) 106 | (type default) 107 | ) 108 | (fill 109 | (type none) 110 | ) 111 | ) 112 | (polyline 113 | (pts 114 | (xy 4.699 -3.556) (xy 2.667 -3.556) 115 | ) 116 | (stroke 117 | (width 0) 118 | (type default) 119 | ) 120 | (fill 121 | (type none) 122 | ) 123 | ) 124 | (polyline 125 | (pts 126 | (xy 2.286 -2.54) (xy 1.27 -3.556) (xy 1.27 -3.048) 127 | ) 128 | (stroke 129 | (width 0) 130 | (type default) 131 | ) 132 | (fill 133 | (type none) 134 | ) 135 | ) 136 | (polyline 137 | (pts 138 | (xy 2.286 -1.524) (xy 1.27 -2.54) (xy 1.27 -2.032) 139 | ) 140 | (stroke 141 | (width 0) 142 | (type default) 143 | ) 144 | (fill 145 | (type none) 146 | ) 147 | ) 148 | (polyline 149 | (pts 150 | (xy 3.683 -1.016) (xy 3.683 -3.556) (xy 3.683 -4.064) 151 | ) 152 | (stroke 153 | (width 0) 154 | (type default) 155 | ) 156 | (fill 157 | (type none) 158 | ) 159 | ) 160 | (polyline 161 | (pts 162 | (xy 4.699 -1.524) (xy 2.667 -1.524) (xy 3.683 -3.556) (xy 4.699 -1.524) 163 | ) 164 | (stroke 165 | (width 0) 166 | (type default) 167 | ) 168 | (fill 169 | (type none) 170 | ) 171 | ) 172 | (rectangle 173 | (start 5.08 5.08) 174 | (end -5.08 -5.08) 175 | (stroke 176 | (width 0.254) 177 | (type default) 178 | ) 179 | (fill 180 | (type background) 181 | ) 182 | ) 183 | ) 184 | (symbol "SK6812MINIe_1_1" 185 | (pin power_in line 186 | (at 0 7.62 270) 187 | (length 2.54) 188 | (name "VDD" 189 | (effects 190 | (font 191 | (size 1.27 1.27) 192 | ) 193 | ) 194 | ) 195 | (number "1" 196 | (effects 197 | (font 198 | (size 1.27 1.27) 199 | ) 200 | ) 201 | ) 202 | ) 203 | (pin output line 204 | (at 7.62 0 180) 205 | (length 2.54) 206 | (name "DOUT" 207 | (effects 208 | (font 209 | (size 1.27 1.27) 210 | ) 211 | ) 212 | ) 213 | (number "2" 214 | (effects 215 | (font 216 | (size 1.27 1.27) 217 | ) 218 | ) 219 | ) 220 | ) 221 | (pin power_in line 222 | (at 0 -7.62 90) 223 | (length 2.54) 224 | (name "VSS" 225 | (effects 226 | (font 227 | (size 1.27 1.27) 228 | ) 229 | ) 230 | ) 231 | (number "3" 232 | (effects 233 | (font 234 | (size 1.27 1.27) 235 | ) 236 | ) 237 | ) 238 | ) 239 | (pin input line 240 | (at -7.62 0 0) 241 | (length 2.54) 242 | (name "DIN" 243 | (effects 244 | (font 245 | (size 1.27 1.27) 246 | ) 247 | ) 248 | ) 249 | (number "4" 250 | (effects 251 | (font 252 | (size 1.27 1.27) 253 | ) 254 | ) 255 | ) 256 | ) 257 | ) 258 | ) 259 | ) 260 | -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.pretty/CUT.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "CUT" 2 | (version 20240108) 3 | (generator "pcbnew") 4 | (generator_version "8.0") 5 | (layer "F.Cu") 6 | (property "Reference" "REF**" 7 | (at 0 2.75 0) 8 | (unlocked yes) 9 | (layer "F.SilkS") 10 | (uuid "f0529529-e7ad-4a57-8e7c-8304f8fad623") 11 | (effects 12 | (font 13 | (size 1 1) 14 | (thickness 0.1) 15 | ) 16 | ) 17 | ) 18 | (property "Value" "CUT" 19 | (at 0 -3.556 0) 20 | (unlocked yes) 21 | (layer "F.Fab") 22 | (hide yes) 23 | (uuid "083d266b-e8f8-45fe-a99a-e0833140eab2") 24 | (effects 25 | (font 26 | (size 1 1) 27 | (thickness 0.15) 28 | ) 29 | ) 30 | ) 31 | (property "Footprint" "CUT" 32 | (at 0 -3.048 0) 33 | (unlocked yes) 34 | (layer "F.Fab") 35 | (hide yes) 36 | (uuid "ada22d4b-0035-4ba2-bfd4-5c13580d04b1") 37 | (effects 38 | (font 39 | (size 1 1) 40 | (thickness 0.15) 41 | ) 42 | ) 43 | ) 44 | (property "Datasheet" "" 45 | (at 0 0 0) 46 | (unlocked yes) 47 | (layer "F.Fab") 48 | (hide yes) 49 | (uuid "0a279097-fb8e-4256-8351-f65668097495") 50 | (effects 51 | (font 52 | (size 1 1) 53 | (thickness 0.15) 54 | ) 55 | ) 56 | ) 57 | (property "Description" "" 58 | (at 0 0 0) 59 | (unlocked yes) 60 | (layer "F.Fab") 61 | (hide yes) 62 | (uuid "33b51e5b-386b-4a58-8dae-e5735447e6fe") 63 | (effects 64 | (font 65 | (size 1 1) 66 | (thickness 0.15) 67 | ) 68 | ) 69 | ) 70 | (attr through_hole) 71 | (fp_line 72 | (start -1.25 4.25) 73 | (end -1.25 -3.75) 74 | (stroke 75 | (width 0.1) 76 | (type default) 77 | ) 78 | (layer "F.SilkS") 79 | (uuid "863182fd-f10e-4540-873b-887dc0d75756") 80 | ) 81 | (fp_line 82 | (start -1.25 38) 83 | (end -1.25 -38) 84 | (stroke 85 | (width 0.1) 86 | (type default) 87 | ) 88 | (layer "F.SilkS") 89 | (uuid "fca3fa1c-3fcc-4972-9e14-2378578f24dd") 90 | ) 91 | (fp_line 92 | (start 1.25 -38) 93 | (end -1.25 -38) 94 | (stroke 95 | (width 0.1) 96 | (type default) 97 | ) 98 | (layer "F.SilkS") 99 | (uuid "cb003dda-7a74-4e65-b2dc-9a1a65af324d") 100 | ) 101 | (fp_line 102 | (start 1.25 -38) 103 | (end 1.25 38) 104 | (stroke 105 | (width 0.1) 106 | (type default) 107 | ) 108 | (layer "F.SilkS") 109 | (uuid "7870eede-df43-4abc-a041-03331377be7d") 110 | ) 111 | (fp_line 112 | (start 1.25 -3.75) 113 | (end 1.25 4.25) 114 | (stroke 115 | (width 0.1) 116 | (type default) 117 | ) 118 | (layer "F.SilkS") 119 | (uuid "5134138d-302e-4316-9dd7-d93e68134713") 120 | ) 121 | (fp_line 122 | (start 1.25 38) 123 | (end -1.25 38) 124 | (stroke 125 | (width 0.1) 126 | (type default) 127 | ) 128 | (layer "F.SilkS") 129 | (uuid "6f3b0a45-c7dc-4b72-9881-33b989816b1c") 130 | ) 131 | (fp_text user "${REFERENCE}" 132 | (at 0 -2.032 0) 133 | (unlocked yes) 134 | (layer "F.Fab") 135 | (uuid "222f8e4d-c3d8-487f-b7eb-87c90827f1de") 136 | (effects 137 | (font 138 | (size 1 1) 139 | (thickness 0.15) 140 | ) 141 | ) 142 | ) 143 | (pad "" np_thru_hole oval 144 | (at -0.5 0) 145 | (size 1.5 78) 146 | (drill oval 1.5 78) 147 | (layers "F&B.Cu" "*.Mask") 148 | (uuid "d335cf29-973d-48d2-9d86-023c8a6b979f") 149 | ) 150 | (pad "" np_thru_hole oval 151 | (at 0.5 0) 152 | (size 1.5 78) 153 | (drill oval 1.5 78) 154 | (layers "F&B.Cu" "*.Mask") 155 | (uuid "74231be5-5b0c-450d-bd9a-2904e007056f") 156 | ) 157 | ) 158 | -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.pretty/JST_S7B_ZR.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "JST_S7B_ZR" 2 | (version 20240108) 3 | (generator "pcbnew") 4 | (generator_version "8.0") 5 | (layer "F.Cu") 6 | (property "Reference" "REF**" 7 | (at 0 -2.5 0) 8 | (unlocked yes) 9 | (layer "F.SilkS") 10 | (uuid "bae32462-6c5e-4a07-a152-387c5a2b4f4a") 11 | (effects 12 | (font 13 | (size 1 1) 14 | (thickness 0.1) 15 | ) 16 | ) 17 | ) 18 | (property "Value" "JST_S7B_ZR" 19 | (at 0 6 0) 20 | (unlocked yes) 21 | (layer "F.Fab") 22 | (uuid "181081ae-416d-43a9-92dd-7cbe06e4f148") 23 | (effects 24 | (font 25 | (size 1 1) 26 | (thickness 0.15) 27 | ) 28 | ) 29 | ) 30 | (property "Footprint" "JST_S7B_ZR" 31 | (at 0 -5.5 0) 32 | (unlocked yes) 33 | (layer "F.Fab") 34 | (hide yes) 35 | (uuid "9a65e609-9750-4cb1-a97d-44b75c6cb701") 36 | (effects 37 | (font 38 | (size 1 1) 39 | (thickness 0.15) 40 | ) 41 | ) 42 | ) 43 | (property "Datasheet" "" 44 | (at -0.5 0 0) 45 | (unlocked yes) 46 | (layer "F.Fab") 47 | (hide yes) 48 | (uuid "1cba1d40-e7f9-4068-af6a-8936a0eb9721") 49 | (effects 50 | (font 51 | (size 1 1) 52 | (thickness 0.15) 53 | ) 54 | ) 55 | ) 56 | (property "Description" "" 57 | (at -0.5 0 0) 58 | (unlocked yes) 59 | (layer "F.Fab") 60 | (hide yes) 61 | (uuid "60c16c84-892a-4f57-936a-8937e5d62eff") 62 | (effects 63 | (font 64 | (size 1 1) 65 | (thickness 0.15) 66 | ) 67 | ) 68 | ) 69 | (attr through_hole) 70 | (fp_line 71 | (start -6 -1.5) 72 | (end -6 4.6) 73 | (stroke 74 | (width 0.1) 75 | (type default) 76 | ) 77 | (layer "F.SilkS") 78 | (uuid "12ecbc05-5bba-4dbf-b092-4085a80779ca") 79 | ) 80 | (fp_line 81 | (start -6 4.6) 82 | (end 6 4.6) 83 | (stroke 84 | (width 0.1) 85 | (type default) 86 | ) 87 | (layer "F.SilkS") 88 | (uuid "1ab22b04-51a7-4a6f-9078-6ed0f29fac48") 89 | ) 90 | (fp_line 91 | (start -5 0.75) 92 | (end -4 0.75) 93 | (stroke 94 | (width 0.1) 95 | (type default) 96 | ) 97 | (layer "F.SilkS") 98 | (uuid "60399dd4-79ef-4503-89d0-7f2514c5fe97") 99 | ) 100 | (fp_line 101 | (start -4.5 1.75) 102 | (end -5 0.75) 103 | (stroke 104 | (width 0.1) 105 | (type default) 106 | ) 107 | (layer "F.SilkS") 108 | (uuid "4a15179f-edf6-4b12-97e3-5b02d5df5e98") 109 | ) 110 | (fp_line 111 | (start -4 0.75) 112 | (end -4.5 1.75) 113 | (stroke 114 | (width 0.1) 115 | (type default) 116 | ) 117 | (layer "F.SilkS") 118 | (uuid "41a30844-4207-4c50-854e-3af7a189c512") 119 | ) 120 | (fp_line 121 | (start 6 -1.5) 122 | (end -6 -1.5) 123 | (stroke 124 | (width 0.1) 125 | (type default) 126 | ) 127 | (layer "F.SilkS") 128 | (uuid "868f0f71-d45d-4d3b-8176-b9c2710fe60d") 129 | ) 130 | (fp_line 131 | (start 6 -1.5) 132 | (end 6 4.6) 133 | (stroke 134 | (width 0.1) 135 | (type default) 136 | ) 137 | (layer "F.SilkS") 138 | (uuid "4e256072-d085-4fc2-8bb8-35ec8977a21c") 139 | ) 140 | (fp_text user "${REFERENCE}" 141 | (at 0 7.5 0) 142 | (unlocked yes) 143 | (layer "F.Fab") 144 | (uuid "90f9e58f-4754-4219-9391-3fd081552975") 145 | (effects 146 | (font 147 | (size 1 1) 148 | (thickness 0.15) 149 | ) 150 | ) 151 | ) 152 | (pad "1" thru_hole rect 153 | (at -4.5 0) 154 | (size 1.2 1.2) 155 | (drill 0.762) 156 | (layers "*.Cu" "*.Mask") 157 | (remove_unused_layers no) 158 | (uuid "7f2da7e6-74ad-487a-af0c-6f90fc58ea85") 159 | ) 160 | (pad "2" thru_hole rect 161 | (at -3 0) 162 | (size 1.2 1.2) 163 | (drill 0.762) 164 | (layers "*.Cu" "*.Mask") 165 | (remove_unused_layers no) 166 | (uuid "cf13f5f9-53d8-4a75-a2a6-9a6682958630") 167 | ) 168 | (pad "3" thru_hole rect 169 | (at -1.5 0) 170 | (size 1.2 1.2) 171 | (drill 0.762) 172 | (layers "*.Cu" "*.Mask") 173 | (remove_unused_layers no) 174 | (uuid "8d1f0ecd-3600-4939-acfd-62e9c7e7df2e") 175 | ) 176 | (pad "4" thru_hole rect 177 | (at 0 0) 178 | (size 1.2 1.2) 179 | (drill 0.762) 180 | (layers "*.Cu" "*.Mask") 181 | (remove_unused_layers no) 182 | (uuid "0d4e7676-f11b-4563-8cd2-8b5b199c5a44") 183 | ) 184 | (pad "5" thru_hole rect 185 | (at 1.5 0) 186 | (size 1.2 1.2) 187 | (drill 0.762) 188 | (layers "*.Cu" "*.Mask") 189 | (remove_unused_layers no) 190 | (uuid "a48f4b70-013e-460e-a4d7-9f21019485ca") 191 | ) 192 | (pad "6" thru_hole rect 193 | (at 3 0) 194 | (size 1.2 1.2) 195 | (drill 0.762) 196 | (layers "*.Cu" "*.Mask") 197 | (remove_unused_layers no) 198 | (uuid "74072075-f09d-4091-a205-b40d78e11534") 199 | ) 200 | (pad "7" thru_hole rect 201 | (at 4.5 0) 202 | (size 1.2 1.2) 203 | (drill 0.762) 204 | (layers "*.Cu" "*.Mask") 205 | (remove_unused_layers no) 206 | (uuid "240bb452-6231-44a3-9834-2206c827d892") 207 | ) 208 | ) 209 | -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.pretty/JST_S8B_ZR.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "JST_S8B_ZR" 2 | (version 20240108) 3 | (generator "pcbnew") 4 | (generator_version "8.0") 5 | (layer "F.Cu") 6 | (property "Reference" "REF**" 7 | (at -0.75 -2.5 0) 8 | (unlocked yes) 9 | (layer "F.SilkS") 10 | (uuid "bae32462-6c5e-4a07-a152-387c5a2b4f4a") 11 | (effects 12 | (font 13 | (size 1 1) 14 | (thickness 0.1) 15 | ) 16 | ) 17 | ) 18 | (property "Value" "JST_S8B_ZR" 19 | (at 0 6 0) 20 | (unlocked yes) 21 | (layer "F.Fab") 22 | (uuid "181081ae-416d-43a9-92dd-7cbe06e4f148") 23 | (effects 24 | (font 25 | (size 1 1) 26 | (thickness 0.15) 27 | ) 28 | ) 29 | ) 30 | (property "Footprint" "JST_S7B_ZR" 31 | (at 0 -5.5 0) 32 | (unlocked yes) 33 | (layer "F.Fab") 34 | (hide yes) 35 | (uuid "9a65e609-9750-4cb1-a97d-44b75c6cb701") 36 | (effects 37 | (font 38 | (size 1 1) 39 | (thickness 0.15) 40 | ) 41 | ) 42 | ) 43 | (property "Datasheet" "" 44 | (at -1.25 0 0) 45 | (unlocked yes) 46 | (layer "F.Fab") 47 | (hide yes) 48 | (uuid "1cba1d40-e7f9-4068-af6a-8936a0eb9721") 49 | (effects 50 | (font 51 | (size 1 1) 52 | (thickness 0.15) 53 | ) 54 | ) 55 | ) 56 | (property "Description" "" 57 | (at -1.25 0 0) 58 | (unlocked yes) 59 | (layer "F.Fab") 60 | (hide yes) 61 | (uuid "60c16c84-892a-4f57-936a-8937e5d62eff") 62 | (effects 63 | (font 64 | (size 1 1) 65 | (thickness 0.15) 66 | ) 67 | ) 68 | ) 69 | (attr through_hole) 70 | (fp_line 71 | (start -6.75 -1.5) 72 | (end -6.75 4.6) 73 | (stroke 74 | (width 0.1) 75 | (type default) 76 | ) 77 | (layer "F.SilkS") 78 | (uuid "12ecbc05-5bba-4dbf-b092-4085a80779ca") 79 | ) 80 | (fp_line 81 | (start -6.75 4.6) 82 | (end 6.75 4.6) 83 | (stroke 84 | (width 0.1) 85 | (type default) 86 | ) 87 | (layer "F.SilkS") 88 | (uuid "1ab22b04-51a7-4a6f-9078-6ed0f29fac48") 89 | ) 90 | (fp_line 91 | (start -5.75 0.75) 92 | (end -4.75 0.75) 93 | (stroke 94 | (width 0.1) 95 | (type default) 96 | ) 97 | (layer "F.SilkS") 98 | (uuid "60399dd4-79ef-4503-89d0-7f2514c5fe97") 99 | ) 100 | (fp_line 101 | (start -5.25 1.75) 102 | (end -5.75 0.75) 103 | (stroke 104 | (width 0.1) 105 | (type default) 106 | ) 107 | (layer "F.SilkS") 108 | (uuid "4a15179f-edf6-4b12-97e3-5b02d5df5e98") 109 | ) 110 | (fp_line 111 | (start -4.75 0.75) 112 | (end -5.25 1.75) 113 | (stroke 114 | (width 0.1) 115 | (type default) 116 | ) 117 | (layer "F.SilkS") 118 | (uuid "41a30844-4207-4c50-854e-3af7a189c512") 119 | ) 120 | (fp_line 121 | (start 6.75 -1.5) 122 | (end -6.75 -1.5) 123 | (stroke 124 | (width 0.1) 125 | (type default) 126 | ) 127 | (layer "F.SilkS") 128 | (uuid "868f0f71-d45d-4d3b-8176-b9c2710fe60d") 129 | ) 130 | (fp_line 131 | (start 6.75 -1.5) 132 | (end 6.75 4.6) 133 | (stroke 134 | (width 0.1) 135 | (type default) 136 | ) 137 | (layer "F.SilkS") 138 | (uuid "4e256072-d085-4fc2-8bb8-35ec8977a21c") 139 | ) 140 | (fp_text user "${REFERENCE}" 141 | (at 0 7.5 0) 142 | (unlocked yes) 143 | (layer "F.Fab") 144 | (uuid "90f9e58f-4754-4219-9391-3fd081552975") 145 | (effects 146 | (font 147 | (size 1 1) 148 | (thickness 0.15) 149 | ) 150 | ) 151 | ) 152 | (pad "1" thru_hole rect 153 | (at -5.25 0) 154 | (size 1.2 1.2) 155 | (drill 0.762) 156 | (layers "*.Cu" "*.Mask") 157 | (remove_unused_layers no) 158 | (uuid "7f2da7e6-74ad-487a-af0c-6f90fc58ea85") 159 | ) 160 | (pad "2" thru_hole rect 161 | (at -3.75 0) 162 | (size 1.2 1.2) 163 | (drill 0.762) 164 | (layers "*.Cu" "*.Mask") 165 | (remove_unused_layers no) 166 | (uuid "cf13f5f9-53d8-4a75-a2a6-9a6682958630") 167 | ) 168 | (pad "3" thru_hole rect 169 | (at -2.25 0) 170 | (size 1.2 1.2) 171 | (drill 0.762) 172 | (layers "*.Cu" "*.Mask") 173 | (remove_unused_layers no) 174 | (uuid "8d1f0ecd-3600-4939-acfd-62e9c7e7df2e") 175 | ) 176 | (pad "4" thru_hole rect 177 | (at -0.75 0) 178 | (size 1.2 1.2) 179 | (drill 0.762) 180 | (layers "*.Cu" "*.Mask") 181 | (remove_unused_layers no) 182 | (uuid "0d4e7676-f11b-4563-8cd2-8b5b199c5a44") 183 | ) 184 | (pad "5" thru_hole rect 185 | (at 0.75 0) 186 | (size 1.2 1.2) 187 | (drill 0.762) 188 | (layers "*.Cu" "*.Mask") 189 | (remove_unused_layers no) 190 | (uuid "a48f4b70-013e-460e-a4d7-9f21019485ca") 191 | ) 192 | (pad "6" thru_hole rect 193 | (at 2.25 0) 194 | (size 1.2 1.2) 195 | (drill 0.762) 196 | (layers "*.Cu" "*.Mask") 197 | (remove_unused_layers no) 198 | (uuid "74072075-f09d-4091-a205-b40d78e11534") 199 | ) 200 | (pad "7" thru_hole rect 201 | (at 3.75 0) 202 | (size 1.2 1.2) 203 | (drill 0.762) 204 | (layers "*.Cu" "*.Mask") 205 | (remove_unused_layers no) 206 | (uuid "240bb452-6231-44a3-9834-2206c827d892") 207 | ) 208 | (pad "8" thru_hole rect 209 | (at 5.25 0) 210 | (size 1.2 1.2) 211 | (drill 0.762) 212 | (layers "*.Cu" "*.Mask") 213 | (remove_unused_layers no) 214 | (uuid "5935f949-12ee-4fd0-a053-a302725c15c8") 215 | ) 216 | ) 217 | -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.pretty/Keyswitch.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "Keyswitch" 2 | (version 20240108) 3 | (generator "pcbnew") 4 | (generator_version "8.0") 5 | (layer "F.Cu") 6 | (property "Reference" "REF**" 7 | (at 0 -0.5 0) 8 | (unlocked yes) 9 | (layer "F.SilkS") 10 | (uuid "0a8dcc72-c147-4804-b650-a6bd830f8008") 11 | (effects 12 | (font 13 | (size 1 1) 14 | (thickness 0.1) 15 | ) 16 | ) 17 | ) 18 | (property "Value" "Keyswitch" 19 | (at 0 -7.62 0) 20 | (unlocked yes) 21 | (layer "F.Fab") 22 | (uuid "718bfec1-ec51-4c07-b755-636a4d91c4d1") 23 | (effects 24 | (font 25 | (size 1 1) 26 | (thickness 0.15) 27 | ) 28 | ) 29 | ) 30 | (property "Footprint" "Keyswitch" 31 | (at -0.1 -9.525 0) 32 | (unlocked yes) 33 | (layer "F.Fab") 34 | (hide yes) 35 | (uuid "91e8520f-61fb-412f-8468-f66cc861e94e") 36 | (effects 37 | (font 38 | (size 1 1) 39 | (thickness 0.15) 40 | ) 41 | ) 42 | ) 43 | (property "Datasheet" "" 44 | (at 0 0 0) 45 | (unlocked yes) 46 | (layer "F.Fab") 47 | (hide yes) 48 | (uuid "c3c783c3-f6fa-4c4a-93c2-36635e2f68a4") 49 | (effects 50 | (font 51 | (size 1 1) 52 | (thickness 0.15) 53 | ) 54 | ) 55 | ) 56 | (property "Description" "" 57 | (at 0 0 0) 58 | (unlocked yes) 59 | (layer "F.Fab") 60 | (hide yes) 61 | (uuid "2d08db83-5937-45ed-bd45-935f7c04dc50") 62 | (effects 63 | (font 64 | (size 1 1) 65 | (thickness 0.15) 66 | ) 67 | ) 68 | ) 69 | (attr through_hole) 70 | (fp_line 71 | (start -6.985 -6.985) 72 | (end 6.985 -6.985) 73 | (stroke 74 | (width 0.05) 75 | (type default) 76 | ) 77 | (layer "B.CrtYd") 78 | (uuid "5201e7cc-c732-40f4-bee7-66aed32470e5") 79 | ) 80 | (fp_line 81 | (start -6.985 6.985) 82 | (end -6.985 -6.985) 83 | (stroke 84 | (width 0.05) 85 | (type default) 86 | ) 87 | (layer "B.CrtYd") 88 | (uuid "98d3f658-1439-4b1f-a883-752d85a6c31c") 89 | ) 90 | (fp_line 91 | (start 6.985 -6.985) 92 | (end 6.985 6.985) 93 | (stroke 94 | (width 0.05) 95 | (type default) 96 | ) 97 | (layer "B.CrtYd") 98 | (uuid "4318bc1d-2c18-463c-ab17-504fd2fa5a9a") 99 | ) 100 | (fp_line 101 | (start 6.985 6.985) 102 | (end -6.985 6.985) 103 | (stroke 104 | (width 0.05) 105 | (type default) 106 | ) 107 | (layer "B.CrtYd") 108 | (uuid "e5443cdc-cb4f-4cb5-9285-36e6bdf40f91") 109 | ) 110 | (fp_line 111 | (start 3.81 5.08) 112 | (end -3.81 5.08) 113 | (stroke 114 | (width 0.1) 115 | (type default) 116 | ) 117 | (layer "User.2") 118 | (uuid "d2741143-81d0-422e-b905-ea9496ce9ed0") 119 | ) 120 | (fp_rect 121 | (start -4.445 -6.985) 122 | (end -8.255 -3.175) 123 | (stroke 124 | (width 0.1) 125 | (type default) 126 | ) 127 | (fill none) 128 | (layer "User.2") 129 | (uuid "a851abba-f4c5-4aec-9cb6-3bdfc214acbb") 130 | ) 131 | (fp_rect 132 | (start 9.525 -4.445) 133 | (end 5.715 -0.635) 134 | (stroke 135 | (width 0.1) 136 | (type default) 137 | ) 138 | (fill none) 139 | (layer "User.2") 140 | (uuid "f28b8bf4-ac96-46e8-9b4f-7273158b7e71") 141 | ) 142 | (fp_text user "${REFERENCE}" 143 | (at 0 -5.715 0) 144 | (unlocked yes) 145 | (layer "F.Fab") 146 | (uuid "256b44ce-2967-4db3-b7ac-cb3d0f94ed3a") 147 | (effects 148 | (font 149 | (size 1 1) 150 | (thickness 0.15) 151 | ) 152 | ) 153 | ) 154 | (pad "" np_thru_hole circle 155 | (at -5.08 0) 156 | (size 1.7526 1.7526) 157 | (drill 1.7526) 158 | (layers "F&B.Cu" "*.Mask") 159 | (uuid "382e6dad-e08d-413b-8277-895111c64112") 160 | ) 161 | (pad "" np_thru_hole circle 162 | (at -2.54 -5.08) 163 | (size 3.05 3.05) 164 | (drill 3.05) 165 | (layers "F&B.Cu" "*.Mask") 166 | (uuid "8f9f6045-4247-4b53-bc82-51b37112e39c") 167 | ) 168 | (pad "" np_thru_hole circle 169 | (at 0 0) 170 | (size 4.0894 4.0894) 171 | (drill 4.0894) 172 | (layers "F&B.Cu" "*.Mask") 173 | (uuid "f7bfcaf5-2702-4bbb-8457-9c2bb1f3c21b") 174 | ) 175 | (pad "" np_thru_hole circle 176 | (at 3.81 -2.54) 177 | (size 3.05 3.05) 178 | (drill 3.05) 179 | (layers "F&B.Cu" "*.Mask") 180 | (uuid "c98c1390-f969-4b22-bf72-ac3409f460f6") 181 | ) 182 | (pad "" np_thru_hole circle 183 | (at 5.08 0) 184 | (size 1.7526 1.7526) 185 | (drill 1.7526) 186 | (layers "F&B.Cu" "*.Mask") 187 | (uuid "7335aeb7-7726-4139-bc74-e642fc4dd835") 188 | ) 189 | (pad "1" smd rect 190 | (at -6.35 -5.08) 191 | (size 3.5 3.5) 192 | (layers "F.Cu" "F.Paste" "F.Mask") 193 | (uuid "2a0404a2-0053-4fd2-bf42-02c78d3af3bf") 194 | ) 195 | (pad "2" smd rect 196 | (at 7.62 -2.54) 197 | (size 3.5 3.5) 198 | (layers "F.Cu" "F.Paste" "F.Mask") 199 | (uuid "0db5fccc-d2ae-479c-a26e-732c3b75d329") 200 | ) 201 | ) 202 | -------------------------------------------------------------------------------- /mozc-doublesided/board/Library.pretty/SK6812MINIe (Reverse).kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "SK6812MINIe (Reverse)" 2 | (version 20240108) 3 | (generator "pcbnew") 4 | (generator_version "8.0") 5 | (layer "F.Cu") 6 | (property "Reference" "REF**" 7 | (at 0 2.75 0) 8 | (unlocked yes) 9 | (layer "F.SilkS") 10 | (uuid "f0529529-e7ad-4a57-8e7c-8304f8fad623") 11 | (effects 12 | (font 13 | (size 1 1) 14 | (thickness 0.1) 15 | ) 16 | ) 17 | ) 18 | (property "Value" "SK6812MINIe" 19 | (at 0 -3.556 0) 20 | (unlocked yes) 21 | (layer "F.Fab") 22 | (uuid "083d266b-e8f8-45fe-a99a-e0833140eab2") 23 | (effects 24 | (font 25 | (size 1 1) 26 | (thickness 0.15) 27 | ) 28 | ) 29 | ) 30 | (property "Footprint" "SK6812MINIe (Reverse)" 31 | (at 0 -3.048 0) 32 | (unlocked yes) 33 | (layer "F.Fab") 34 | (hide yes) 35 | (uuid "ada22d4b-0035-4ba2-bfd4-5c13580d04b1") 36 | (effects 37 | (font 38 | (size 1 1) 39 | (thickness 0.15) 40 | ) 41 | ) 42 | ) 43 | (property "Datasheet" "" 44 | (at 0 0 0) 45 | (unlocked yes) 46 | (layer "F.Fab") 47 | (hide yes) 48 | (uuid "0a279097-fb8e-4256-8351-f65668097495") 49 | (effects 50 | (font 51 | (size 1 1) 52 | (thickness 0.15) 53 | ) 54 | ) 55 | ) 56 | (property "Description" "" 57 | (at 0 0 0) 58 | (unlocked yes) 59 | (layer "F.Fab") 60 | (hide yes) 61 | (uuid "33b51e5b-386b-4a58-8dae-e5735447e6fe") 62 | (effects 63 | (font 64 | (size 1 1) 65 | (thickness 0.15) 66 | ) 67 | ) 68 | ) 69 | (attr through_hole) 70 | (fp_line 71 | (start -2 -2) 72 | (end -2 1.25) 73 | (stroke 74 | (width 0.1) 75 | (type default) 76 | ) 77 | (layer "F.SilkS") 78 | (uuid "d276074e-3eb1-41e3-ac25-8f9eeb8842a9") 79 | ) 80 | (fp_line 81 | (start -2 1.25) 82 | (end -1.25 2) 83 | (stroke 84 | (width 0.1) 85 | (type default) 86 | ) 87 | (layer "F.SilkS") 88 | (uuid "a0cd938d-69fd-4778-899c-eb62edbf048d") 89 | ) 90 | (fp_line 91 | (start -1.25 2) 92 | (end 2 2) 93 | (stroke 94 | (width 0.1) 95 | (type default) 96 | ) 97 | (layer "F.SilkS") 98 | (uuid "53cf1a29-b708-41d7-b5f3-3556ea5c1bd7") 99 | ) 100 | (fp_line 101 | (start 2 -2) 102 | (end -2 -2) 103 | (stroke 104 | (width 0.1) 105 | (type default) 106 | ) 107 | (layer "F.SilkS") 108 | (uuid "a70455ac-9fd6-4244-a066-171f4bf503db") 109 | ) 110 | (fp_line 111 | (start 2 2) 112 | (end 2 -2) 113 | (stroke 114 | (width 0.1) 115 | (type default) 116 | ) 117 | (layer "F.SilkS") 118 | (uuid "b7a22319-2db9-45dc-82b8-e1d76e88a7a3") 119 | ) 120 | (fp_rect 121 | (start 1.6 -1.4) 122 | (end -1.6 1.4) 123 | (stroke 124 | (width 0.1) 125 | (type solid) 126 | ) 127 | (fill none) 128 | (layer "User.2") 129 | (uuid "023d3fbb-47d4-4673-80bd-cec1d8598f6a") 130 | ) 131 | (fp_rect 132 | (start 3 -1.4) 133 | (end -3 1.4) 134 | (stroke 135 | (width 0.1) 136 | (type default) 137 | ) 138 | (fill none) 139 | (layer "User.2") 140 | (uuid "14011cdf-2739-41e7-ba89-c479e0afdf21") 141 | ) 142 | (fp_text user "${REFERENCE}" 143 | (at 0 -2.032 0) 144 | (unlocked yes) 145 | (layer "F.Fab") 146 | (uuid "222f8e4d-c3d8-487f-b7eb-87c90827f1de") 147 | (effects 148 | (font 149 | (size 1 1) 150 | (thickness 0.15) 151 | ) 152 | ) 153 | ) 154 | (pad "" np_thru_hole oval 155 | (at -1 0 90) 156 | (size 3.5 1.5) 157 | (drill oval 3.5 1.5) 158 | (layers "F&B.Cu" "*.Mask") 159 | (uuid "d335cf29-973d-48d2-9d86-023c8a6b979f") 160 | ) 161 | (pad "" np_thru_hole oval 162 | (at 0 -1 180) 163 | (size 3.5 1.5) 164 | (drill oval 3.5 1.5) 165 | (layers "F&B.Cu" "*.Mask") 166 | (uuid "3df47cf9-27dc-4c4b-8145-5758815af33e") 167 | ) 168 | (pad "" np_thru_hole oval 169 | (at 0 0 90) 170 | (size 3.5 1.5) 171 | (drill oval 3.5 1.5) 172 | (layers "F&B.Cu" "*.Mask") 173 | (uuid "05f55096-2580-4a59-ac5f-e7dca0ffc95b") 174 | ) 175 | (pad "" np_thru_hole oval 176 | (at 0 1 180) 177 | (size 3.5 1.5) 178 | (drill oval 3.5 1.5) 179 | (layers "F&B.Cu" "*.Mask") 180 | (uuid "8b051ef9-20b6-45f2-965a-05da1d06395d") 181 | ) 182 | (pad "" np_thru_hole oval 183 | (at 1 0 90) 184 | (size 3.5 1.5) 185 | (drill oval 3.5 1.5) 186 | (layers "F&B.Cu" "*.Mask") 187 | (uuid "7978914e-afc7-400b-8225-98ddfcac3a14") 188 | ) 189 | (pad "1" smd rect 190 | (at 2.5 -0.762) 191 | (size 1.25 1) 192 | (layers "F.Cu" "F.Paste" "F.Mask") 193 | (uuid "ed7c6070-e4ae-4ef6-b84d-78cf2f579a28") 194 | ) 195 | (pad "2" smd rect 196 | (at 2.5 0.762) 197 | (size 1.25 1) 198 | (layers "F.Cu" "F.Paste" "F.Mask") 199 | (uuid "6089f4bf-3836-4f78-ae63-fa92da1b501c") 200 | ) 201 | (pad "3" smd rect 202 | (at -2.5 0.75) 203 | (size 1.25 1) 204 | (layers "F.Cu" "F.Paste" "F.Mask") 205 | (uuid "f91154ac-6669-46e5-b592-95a9a1e75aa5") 206 | ) 207 | (pad "4" smd rect 208 | (at -2.5 -0.762) 209 | (size 1.25 1) 210 | (layers "F.Cu" "F.Paste" "F.Mask") 211 | (uuid "0c0396b6-ee7b-4ebf-8d4a-1ca94b57e18c") 212 | ) 213 | ) 214 | -------------------------------------------------------------------------------- /mozc-doublesided/board/main/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.pretty")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/main/main.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 51, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 12, 41 | 13, 42 | 15, 43 | 16, 44 | 17, 45 | 18, 46 | 19, 47 | 20, 48 | 21, 49 | 22, 50 | 23, 51 | 24, 52 | 25, 53 | 26, 54 | 27, 55 | 28, 56 | 29, 57 | 30, 58 | 32, 59 | 33, 60 | 34, 61 | 35, 62 | 36, 63 | 39, 64 | 40 65 | ], 66 | "visible_layers": "8083fff_ffffffff", 67 | "zone_display_mode": 0 68 | }, 69 | "git": { 70 | "repo_password": "", 71 | "repo_type": "", 72 | "repo_username": "", 73 | "ssh_key": "" 74 | }, 75 | "meta": { 76 | "filename": "main.kicad_prl", 77 | "version": 3 78 | }, 79 | "project": { 80 | "files": [] 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /mozc-doublesided/board/main/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.kicad_sym")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/main_panel/fabrication-toolkit-options.json: -------------------------------------------------------------------------------- 1 | {"EXTRA_LAYERS": "", "EXTEND_EDGE_CUT": true, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": true} -------------------------------------------------------------------------------- /mozc-doublesided/board/main_panel/main_panel.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 32, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 12, 41 | 13, 42 | 15, 43 | 16, 44 | 17, 45 | 18, 46 | 19, 47 | 20, 48 | 21, 49 | 22, 50 | 23, 51 | 24, 52 | 25, 53 | 26, 54 | 27, 55 | 28, 56 | 29, 57 | 30, 58 | 32, 59 | 33, 60 | 34, 61 | 35, 62 | 36, 63 | 39, 64 | 40 65 | ], 66 | "visible_layers": "00410fc_80000007", 67 | "zone_display_mode": 0 68 | }, 69 | "git": { 70 | "repo_password": "", 71 | "repo_type": "", 72 | "repo_username": "", 73 | "ssh_key": "" 74 | }, 75 | "meta": { 76 | "filename": "main_panel.kicad_prl", 77 | "version": 3 78 | }, 79 | "project": { 80 | "files": [] 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /mozc-doublesided/board/main_panel/main_panel.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20231120) (generator "eeschema") (generator_version "8.0") 2 | (paper "A4") 3 | (lib_symbols) 4 | (symbol_instances) 5 | ) 6 | -------------------------------------------------------------------------------- /mozc-doublesided/board/sub/fabrication-toolkit-options.json: -------------------------------------------------------------------------------- 1 | {"EXTRA_LAYERS": "", "EXTEND_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": true} -------------------------------------------------------------------------------- /mozc-doublesided/board/sub/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.pretty")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/sub/sub.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 37, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 12, 41 | 13, 42 | 15, 43 | 16, 44 | 17, 45 | 18, 46 | 19, 47 | 20, 48 | 21, 49 | 22, 50 | 23, 51 | 24, 52 | 25, 53 | 26, 54 | 27, 55 | 28, 56 | 29, 57 | 30, 58 | 32, 59 | 33, 60 | 34, 61 | 35, 62 | 36, 63 | 39, 64 | 40 65 | ], 66 | "visible_layers": "ffcffff_ffffffff", 67 | "zone_display_mode": 0 68 | }, 69 | "git": { 70 | "repo_password": "", 71 | "repo_type": "", 72 | "repo_username": "", 73 | "ssh_key": "" 74 | }, 75 | "meta": { 76 | "filename": "sub.kicad_prl", 77 | "version": 3 78 | }, 79 | "project": { 80 | "files": [] 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /mozc-doublesided/board/sub/sub.rules: -------------------------------------------------------------------------------- 1 | 2 | (rules PCB sub 3 | (snap_angle 4 | fortyfive_degree 5 | ) 6 | (autoroute_settings 7 | (fanout off) 8 | (autoroute on) 9 | (postroute on) 10 | (vias on) 11 | (via_costs 50) 12 | (plane_via_costs 5) 13 | (start_ripup_costs 100) 14 | (start_pass_no 277) 15 | (layer_rule F.Cu 16 | (active on) 17 | (preferred_direction vertical) 18 | (preferred_direction_trace_costs 1.0) 19 | (against_preferred_direction_trace_costs 5.0) 20 | ) 21 | (layer_rule B.Cu 22 | (active on) 23 | (preferred_direction horizontal) 24 | (preferred_direction_trace_costs 1.0) 25 | (against_preferred_direction_trace_costs 1.3) 26 | ) 27 | ) 28 | (rule 29 | (width 130.0) 30 | (clear 130.0) 31 | (clear 65.0 (type smd_to_turn_gap)) 32 | (clear 190.0 (type default_Power)) 33 | (clear 32.6 (type smd_smd)) 34 | (clear 190.0 (type smd_Power)) 35 | (clear 190.0 (type "kicad_default"_Power)) 36 | (clear 190.0 (type Power_Power)) 37 | ) 38 | (padstack "Via[0-1]_600:300_um" 39 | (shape 40 | (circle F.Cu 600.0 0.0 0.0) 41 | ) 42 | (shape 43 | (circle B.Cu 600.0 0.0 0.0) 44 | ) 45 | (attach off) 46 | ) 47 | (via 48 | "Via[0-1]_600:300_um" "Via[0-1]_600:300_um" default 49 | ) 50 | (via 51 | "Via[0-1]_600:300_um-kicad_default" "Via[0-1]_600:300_um" "kicad_default" 52 | ) 53 | (via 54 | "Via[0-1]_600:300_um-Power" "Via[0-1]_600:300_um" Power 55 | ) 56 | (via_rule 57 | default "Via[0-1]_600:300_um" 58 | ) 59 | (via_rule 60 | "kicad_default" "Via[0-1]_600:300_um-kicad_default" 61 | ) 62 | (via_rule 63 | Power "Via[0-1]_600:300_um-Power" 64 | ) 65 | (class default 66 | (clearance_class default) 67 | (via_rule default) 68 | (rule 69 | (width 130.0) 70 | ) 71 | (circuit 72 | (use_layer F.Cu B.Cu) 73 | ) 74 | ) 75 | (class "kicad_default" 76 | "Net-(D1-DOUT)" "Net-(D2-DOUT)" "Net-(D3-DOUT)" /LED2 /SW1 /SW2 /SW3 /SW4 77 | "Net-(D5-A)" "unconnected-(R2-Pad2)" "Net-(D6-A)" "Net-(D7-A)" "Net-(D8-A)" /COM2 78 | (clearance_class "kicad_default") 79 | (via_rule kicad_default) 80 | (rule 81 | (width 130.0) 82 | ) 83 | (circuit 84 | (use_layer F.Cu B.Cu) 85 | ) 86 | ) 87 | (class Power 88 | +5V GND 89 | (clearance_class Power) 90 | (via_rule Power) 91 | (rule 92 | (width 200.0) 93 | ) 94 | (circuit 95 | (use_layer F.Cu B.Cu) 96 | ) 97 | ) 98 | ) -------------------------------------------------------------------------------- /mozc-doublesided/board/sub/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.kicad_sym")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/sub_panel/fabrication-toolkit-options.json: -------------------------------------------------------------------------------- 1 | {"EXTRA_LAYERS": "", "EXTEND_EDGE_CUT": true, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": true} -------------------------------------------------------------------------------- /mozc-doublesided/board/sub_panel/sub_panel.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 12, 41 | 13, 42 | 15, 43 | 16, 44 | 17, 45 | 18, 46 | 19, 47 | 20, 48 | 21, 49 | 22, 50 | 23, 51 | 24, 52 | 25, 53 | 26, 54 | 27, 55 | 28, 56 | 29, 57 | 30, 58 | 32, 59 | 33, 60 | 34, 61 | 35, 62 | 36, 63 | 39, 64 | 40 65 | ], 66 | "visible_layers": "7ffffff_80000001", 67 | "zone_display_mode": 0 68 | }, 69 | "git": { 70 | "repo_password": "", 71 | "repo_type": "", 72 | "repo_username": "", 73 | "ssh_key": "" 74 | }, 75 | "meta": { 76 | "filename": "sub_panel.kicad_prl", 77 | "version": 3 78 | }, 79 | "project": { 80 | "files": [] 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /mozc-doublesided/board/sub_panel/sub_panel.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20231120) (generator "eeschema") (generator_version "8.0") 2 | (paper "A4") 3 | (lib_symbols) 4 | (symbol_instances) 5 | ) 6 | -------------------------------------------------------------------------------- /mozc-doublesided/board/usb/fabrication-toolkit-options.json: -------------------------------------------------------------------------------- 1 | {"EXTRA_LAYERS": "", "EXTEND_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": true} -------------------------------------------------------------------------------- /mozc-doublesided/board/usb/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.pretty")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/usb/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (version 7) 3 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/../Library.kicad_sym")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /mozc-doublesided/board/usb/usb.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 44, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 12, 41 | 13, 42 | 15, 43 | 16, 44 | 17, 45 | 18, 46 | 19, 47 | 20, 48 | 21, 49 | 22, 50 | 23, 51 | 24, 52 | 25, 53 | 26, 54 | 27, 55 | 28, 56 | 29, 57 | 30, 58 | 32, 59 | 33, 60 | 34, 61 | 35, 62 | 36, 63 | 39, 64 | 40 65 | ], 66 | "visible_layers": "ff8ffff_ffffffff", 67 | "zone_display_mode": 1 68 | }, 69 | "git": { 70 | "repo_password": "", 71 | "repo_type": "", 72 | "repo_username": "", 73 | "ssh_key": "" 74 | }, 75 | "meta": { 76 | "filename": "usb.kicad_prl", 77 | "version": 3 78 | }, 79 | "project": { 80 | "files": [] 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /mozc-doublesided/board/usb/usb.rules: -------------------------------------------------------------------------------- 1 | 2 | (rules PCB mozc2024 3 | (snap_angle 4 | fortyfive_degree 5 | ) 6 | (autoroute_settings 7 | (fanout off) 8 | (autoroute on) 9 | (postroute on) 10 | (vias on) 11 | (via_costs 50) 12 | (plane_via_costs 5) 13 | (start_ripup_costs 100) 14 | (start_pass_no 1467) 15 | (layer_rule F.Cu 16 | (active on) 17 | (preferred_direction vertical) 18 | (preferred_direction_trace_costs 1.0) 19 | (against_preferred_direction_trace_costs 5.0) 20 | ) 21 | (layer_rule B.Cu 22 | (active on) 23 | (preferred_direction horizontal) 24 | (preferred_direction_trace_costs 1.0) 25 | (against_preferred_direction_trace_costs 1.3) 26 | ) 27 | ) 28 | (rule 29 | (width 200.0) 30 | (clear 200.0) 31 | (clear 100.0 (type smd_to_turn_gap)) 32 | (clear 50.0 (type smd_smd)) 33 | ) 34 | (padstack "Via[0-1]_600:300_um" 35 | (shape 36 | (circle F.Cu 600.0 0.0 0.0) 37 | ) 38 | (shape 39 | (circle B.Cu 600.0 0.0 0.0) 40 | ) 41 | (attach off) 42 | ) 43 | (via 44 | "Via[0-1]_600:300_um" "Via[0-1]_600:300_um" default 45 | ) 46 | (via 47 | "Via[0-1]_600:300_um-kicad_default" "Via[0-1]_600:300_um" "kicad_default" 48 | ) 49 | (via_rule 50 | default "Via[0-1]_600:300_um" 51 | ) 52 | (via_rule 53 | "kicad_default" "Via[0-1]_600:300_um-kicad_default" 54 | ) 55 | (class default 56 | (clearance_class default) 57 | (via_rule default) 58 | (rule 59 | (width 200.0) 60 | ) 61 | (circuit 62 | (use_layer F.Cu B.Cu) 63 | ) 64 | ) 65 | (class "kicad_default" 66 | "Net-(D1-DOUT)" +5V "Net-(D1-DIN)" GND "Net-(D2-DOUT)" "Net-(D3-DOUT)" "Net-(D4-DOUT)" /SW1 67 | /SW2 /SW3 /SW4 /SDA +3.3V /RDYout /DP "Net-(U1-PB8)" 68 | /DM /SWCLK /SWDIO /SCL /RDYin /LED "unconnected-(U1-PA7-Pad13)" "unconnected-(U1-NRST-Pad4)" 69 | "unconnected-(U1-PA6-Pad12)" "unconnected-(R2-Pad2)" 70 | (clearance_class "kicad_default") 71 | (via_rule kicad_default) 72 | (rule 73 | (width 200.0) 74 | ) 75 | (circuit 76 | (use_layer F.Cu B.Cu) 77 | ) 78 | ) 79 | ) -------------------------------------------------------------------------------- /mozc-doublesided/case/case00.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case00.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case01.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case01.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case02.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case02.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case03.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case03.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case04.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case04.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case05.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case05.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case06.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case06.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case07.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case07.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case08.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case08.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case09.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case09.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case10.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case10.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case11.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case11.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case12.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case12.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case13.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case13.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case14.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case14.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case15.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case15.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case16.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case16.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case17.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case17.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case18.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case18.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case19.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case19.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case20.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case20.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case21.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case21.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case22.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case22.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case23.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case23.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case24.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case24.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/case25.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/case25.stl -------------------------------------------------------------------------------- /mozc-doublesided/case/jig.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/case/jig.stl -------------------------------------------------------------------------------- /mozc-doublesided/examples/webhid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 28 | 29 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22) 2 | 3 | # 4 | # This file is generated only once, 5 | # and is not re-generated if converter is called multiple times. 6 | # 7 | # User is free to modify the file as much as necessary 8 | # 9 | 10 | # Setup compiler settings 11 | set(CMAKE_C_STANDARD 11) 12 | set(CMAKE_C_STANDARD_REQUIRED ON) 13 | set(CMAKE_C_EXTENSIONS ON) 14 | 15 | 16 | # Define the build type 17 | if(NOT CMAKE_BUILD_TYPE) 18 | set(CMAKE_BUILD_TYPE "Release") 19 | endif() 20 | 21 | # Set the project name 22 | set(CMAKE_PROJECT_NAME firmware) 23 | 24 | # Include toolchain file 25 | include("cmake/gcc-arm-none-eabi.cmake") 26 | 27 | # Enable compile command to ease indexing with e.g. clangd 28 | set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) 29 | 30 | # Enable CMake support for ASM and C languages 31 | enable_language(C ASM) 32 | 33 | # Core project settings 34 | project(${CMAKE_PROJECT_NAME}) 35 | message("Build type: " ${CMAKE_BUILD_TYPE}) 36 | 37 | # Create an executable object type 38 | add_executable(${CMAKE_PROJECT_NAME}) 39 | 40 | # Add STM32CubeMX generated sources 41 | add_subdirectory(cmake/stm32cubemx) 42 | 43 | # Link directories setup 44 | target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE 45 | # Add user defined library search paths 46 | ) 47 | 48 | # Add sources to executable 49 | target_sources(${CMAKE_PROJECT_NAME} PRIVATE 50 | # Add user sources here 51 | Core/Src/hid.c 52 | Core/Src/i2c.c 53 | Core/Src/led.c 54 | Core/Src/mozc.c 55 | ) 56 | 57 | # Add include paths 58 | target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE 59 | # Add user defined include paths 60 | ) 61 | 62 | # Add project symbols (macros) 63 | target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE 64 | # Add user defined symbols 65 | ) 66 | 67 | # Add linked libraries 68 | target_link_libraries(${CMAKE_PROJECT_NAME} 69 | stm32cubemx 70 | 71 | # Add user defined libraries 72 | ) 73 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Inc/hid.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #ifndef HID_H_ 6 | #define HID_H_ 7 | 8 | #include 9 | 10 | void hid_init(void); 11 | void hid_update(const uint8_t* keys); 12 | void hid_deinit(void); 13 | 14 | #endif // HID_H_ 15 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Inc/i2c.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #ifndef I2C_H_ 6 | #define I2C_H_ 7 | 8 | #include 9 | 10 | void i2c_init(void); 11 | bool i2c_is_host(void); 12 | void i2c_activate_host(void); 13 | void i2c_maybe_listen(void); 14 | 15 | #endif // I2C_H_ 16 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Inc/led.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #ifndef LED_H_ 6 | #define LED_H_ 7 | 8 | #include 9 | 10 | void led_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b); 11 | void led_flush(void); 12 | 13 | #endif // LED_H_ -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Inc/mozc.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #ifndef MOZC_H_ 6 | #define MOZC_H_ 7 | 8 | void mozc_init(void); 9 | void mozc_loop(void); 10 | 11 | #endif // MOZC_H_ 12 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Src/led.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #include "led.h" 6 | 7 | #include "main.h" 8 | 9 | extern SPI_HandleTypeDef hspi1; 10 | 11 | #define RESET_COUNT 16 12 | #define LED_COUNT 8 13 | #define DATA_LENGTH 6 14 | #define DMA_BUFFER_SIZE (RESET_COUNT + LED_COUNT * DATA_LENGTH + 1) << 1 15 | 16 | // 0xe: 1110 - HIGH 17 | // 0x8: 1000 - LOW 18 | static uint16_t dma_buffer[DMA_BUFFER_SIZE] = { 19 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // RESET 20 | 0, 0, 0, 0, 0, 0, // LED 0 21 | 0, 0, 0, 0, 0, 0, // LED 1 22 | 0, 0, 0, 0, 0, 0, // LED 2 23 | 0, 0, 0, 0, 0, 0, // LED 3 24 | 0, 0, 0, 0, 0, 0, // LED 4 25 | 0, 0, 0, 0, 0, 0, // LED 5 26 | 0, 0, 0, 0, 0, 0, // LED 6 27 | 0, 0, 0, 0, 0, 0, // LED 7 28 | 0xffff, // EOD 29 | }; 30 | 31 | static uint32_t to_spi_value(uint8_t value) { 32 | uint32_t spi_value = 0; 33 | for (uint8_t bit_mask = 0x80; bit_mask != 0; bit_mask >>= 1) { 34 | spi_value <<= 4; 35 | if (value & bit_mask) { 36 | spi_value |= 0xe; 37 | } else { 38 | spi_value |= 0x8; 39 | } 40 | } 41 | return spi_value; 42 | } 43 | 44 | void set_spi_value(uint8_t offset, uint32_t value) { 45 | dma_buffer[RESET_COUNT + offset * 2 + 0] = value >> 16; 46 | dma_buffer[RESET_COUNT + offset * 2 + 1] = value & 0xffff; 47 | } 48 | 49 | void led_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b) { 50 | set_spi_value(index * 3 + 0, to_spi_value(g)); 51 | set_spi_value(index * 3 + 1, to_spi_value(r)); 52 | set_spi_value(index * 3 + 2, to_spi_value(b)); 53 | } 54 | 55 | void led_flush(void) { 56 | HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)dma_buffer, DMA_BUFFER_SIZE); 57 | } 58 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/Core/Src/mozc.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Google Inc. 2 | // Use of this source code is governed by an Apache License that can be found in 3 | // the LICENSE file. 4 | 5 | #include "mozc.h" 6 | 7 | #include 8 | #include 9 | 10 | #include "i2c.h" 11 | #include "main.h" 12 | 13 | void mozc_init(void) { i2c_init(); } 14 | 15 | void mozc_loop(void) { i2c_maybe_listen(); } 16 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/STM32F042F6Px_FLASH.ld.diff: -------------------------------------------------------------------------------- 1 | *** STM32F042F6Px_FLASH.ld Sat Sep 21 21:47:11 2024 2 | --- STM32F042F6Px_FLASH.ld.fixed Sat Sep 21 21:47:59 2024 3 | *************** 4 | *** 53,59 **** 5 | ENTRY(Reset_Handler) 6 | 7 | /* Highest address of the user mode stack */ 8 | ! _estack = ORIGIN() + LENGTH(); /* end of RAM */ 9 | /* Generate a link error if heap and stack don't fit into RAM */ 10 | _Min_Heap_Size = 0x200; /* required amount of heap */ 11 | _Min_Stack_Size = 0x400; /* required amount of stack */ 12 | --- 53,59 ---- 13 | ENTRY(Reset_Handler) 14 | 15 | /* Highest address of the user mode stack */ 16 | ! _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ 17 | /* Generate a link error if heap and stack don't fit into RAM */ 18 | _Min_Heap_Size = 0x200; /* required amount of heap */ 19 | _Min_Stack_Size = 0x400; /* required amount of stack */ 20 | *************** 21 | *** 143,149 **** 22 | 23 | . = ALIGN(4); 24 | _edata = .; /* define a global symbol at data end */ 25 | ! } > AT> FLASH 26 | 27 | 28 | /* Uninitialized data section */ 29 | --- 143,149 ---- 30 | 31 | . = ALIGN(4); 32 | _edata = .; /* define a global symbol at data end */ 33 | ! } >RAM AT> FLASH 34 | 35 | 36 | /* Uninitialized data section */ 37 | *************** 38 | *** 160,166 **** 39 | . = ALIGN(4); 40 | _ebss = .; /* define a global symbol at bss end */ 41 | __bss_end__ = _ebss; 42 | ! } > 43 | 44 | /* User_heap_stack section, used to check that there is enough RAM left */ 45 | ._user_heap_stack : 46 | --- 160,166 ---- 47 | . = ALIGN(4); 48 | _ebss = .; /* define a global symbol at bss end */ 49 | __bss_end__ = _ebss; 50 | ! } >RAM 51 | 52 | /* User_heap_stack section, used to check that there is enough RAM left */ 53 | ._user_heap_stack : 54 | *************** 55 | *** 171,177 **** 56 | . = . + _Min_Heap_Size; 57 | . = . + _Min_Stack_Size; 58 | . = ALIGN(8); 59 | ! } > 60 | 61 | 62 | 63 | --- 171,177 ---- 64 | . = . + _Min_Heap_Size; 65 | . = . + _Min_Stack_Size; 66 | . = ALIGN(8); 67 | ! } >RAM 68 | 69 | 70 | 71 | *************** 72 | *** 183,188 **** 73 | --- 183,189 ---- 74 | libgcc.a ( * ) 75 | } 76 | 77 | + .ARM.attributes 0 : { *(.ARM.attributes) } 78 | } 79 | 80 | 81 | -------------------------------------------------------------------------------- /mozc-doublesided/firmware/prebuilt/mozc.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/firmware/prebuilt/mozc.elf -------------------------------------------------------------------------------- /mozc-doublesided/gerber/main_panel.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/gerber/main_panel.zip -------------------------------------------------------------------------------- /mozc-doublesided/gerber/main_panel_bom.csv: -------------------------------------------------------------------------------- 1 | Designator,Footprint,Quantity,Value,LCSC Part # 2 | "C1_9, C1_8, C1_7, C1_6, C1_5, C1_4, C1_3, C1_2, C1",0402,9,0.1u, 3 | "CUT1_9, CUT1_8, CUT1_7, CUT1_6, CUT1_5, CUT1_4, CUT1_3, CUT1_2, CUT1, CUT2_9, CUT2_8, CUT2_7, CUT2_6, CUT2_5, CUT2_4, CUT2_3, CUT2_2, CUT2",CUT,18,CUT, 4 | "D1_9, D1_8, D1_7, D1_6, D1_5, D1_4, D1_3, D1_2, D1, D2_9, D2_8, D2_7, D2_6, D2_5, D2_4, D2_3, D2_2, D2, D3_9, D3_8, D3_7, D3_6, D3_5, D3_4, D3_3, D3_2, D3, D4_9, D4_8, D4_7, D4_6, D4_5, D4_4, D4_3, D4_2, D4",SK6812MINIe (Reverse),36,SK6812MINIe,C5149201 5 | "D5_9, D5_8, D5_7, D5_6, D5_5, D5_4, D5_3, D5_2, D5, D6_9, D6_8, D6_7, D6_6, D6_5, D6_4, D6_3, D6_2, D6, D7_9, D7_8, D7_7, D7_6, D7_5, D7_4, D7_3, D7_2, D7, D8_9, D8_8, D8_7, D8_6, D8_5, D8_4, D8_3, D8_2, D8",0805,36,D,C109001 6 | "J2_9, J2_8, J2_7, J2_6, J2_5, J2_4, J2_3, J2_2, J2",JST_S8B_ZR,9,Conn_Upstream,C2845571 7 | "J3_9, J3_8, J3_7, J3_6, J3_5, J3_4, J3_3, J3_2, J3",JST_S8B_ZR,9,Conn_Downstream,C2845571 8 | "R1_9, R1_8, R1_7, R1_6, R1_5, R1_4, R1_3, R1_2, R1, R2_9, R2_8, R2_7, R2_6, R2_5, R2_4, R2_3, R2_2, R2",0402,18,510, 9 | "SW1_9, SW1_8, SW1_7, SW1_6, SW1_5, SW1_4, SW1_3, SW1_2, SW1, SW2_9, SW2_8, SW2_7, SW2_6, SW2_5, SW2_4, SW2_3, SW2_2, SW2, SW3_9, SW3_8, SW3_7, SW3_6, SW3_5, SW3_4, SW3_3, SW3_2, SW3, SW4_9, SW4_8, SW4_7, SW4_6, SW4_5, SW4_4, SW4_3, SW4_2, SW4",Keyswitch,36,SW_Push,C5184526 10 | "U1_9, U1_8, U1_7, U1_6, U1_5, U1_4, U1_3, U1_2, U1",TSSOP-20_4.4x6.5mm_P0.65mm,9,STM32F042F4Px,C81002 11 | -------------------------------------------------------------------------------- /mozc-doublesided/gerber/sub_panel.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/gerber/sub_panel.zip -------------------------------------------------------------------------------- /mozc-doublesided/gerber/sub_panel_bom.csv: -------------------------------------------------------------------------------- 1 | Designator,Footprint,Quantity,Value,LCSC Part # 2 | "D1_9, D1_8, D1_7, D1_6, D1_5, D1_4, D1_3, D1_2, D1, D2_9, D2_8, D2_7, D2_6, D2_5, D2_4, D2_3, D2_2, D2, D3_9, D3_8, D3_7, D3_6, D3_5, D3_4, D3_3, D3_2, D3, D4_9, D4_8, D4_7, D4_6, D4_5, D4_4, D4_3, D4_2, D4",SK6812MINIe (Reverse),36,SK6812MINIe,C5149201 3 | "D5_9, D5_8, D5_7, D5_6, D5_5, D5_4, D5_3, D5_2, D5, D6_9, D6_8, D6_7, D6_6, D6_5, D6_4, D6_3, D6_2, D6, D7_9, D7_8, D7_7, D7_6, D7_5, D7_4, D7_3, D7_2, D7, D8_9, D8_8, D8_7, D8_6, D8_5, D8_4, D8_3, D8_2, D8",0805,36,D,C109001 4 | "R2_9, R2_8, R2_7, R2_6, R2_5, R2_4, R2_3, R2_2, R2",0402,9,510, 5 | "SW1_9, SW1_8, SW1_7, SW1_6, SW1_5, SW1_4, SW1_3, SW1_2, SW1, SW2_9, SW2_8, SW2_7, SW2_6, SW2_5, SW2_4, SW2_3, SW2_2, SW2, SW3_9, SW3_8, SW3_7, SW3_6, SW3_5, SW3_4, SW3_3, SW3_2, SW3, SW4_9, SW4_8, SW4_7, SW4_6, SW4_5, SW4_4, SW4_3, SW4_2, SW4",Keyswitch,36,SW_Push,C5184526 6 | -------------------------------------------------------------------------------- /mozc-doublesided/gerber/sub_panel_positions.csv: -------------------------------------------------------------------------------- 1 | Designator,Mid X,Mid Y,Rotation,Layer 2 | D1_9,172.3,-91.4,180.0,bottom 3 | D1_8,134.3,-91.4,180.0,bottom 4 | D1_7,39.3,-91.4,180.0,bottom 5 | D1_6,191.3,-91.4,180.0,bottom 6 | D1_5,115.3,-91.4,180.0,bottom 7 | D1_4,77.3,-91.4,180.0,bottom 8 | D1_3,153.3,-91.4,180.0,bottom 9 | D1_2,96.3,-91.4,180.0,bottom 10 | D1,58.3,-91.4,180.0,bottom 11 | D2_9,77.3,-72.4,180.0,bottom 12 | D2_8,172.3,-72.4,180.0,bottom 13 | D2_7,134.3,-72.4,180.0,bottom 14 | D2_6,191.3,-72.4,180.0,bottom 15 | D2_5,115.3,-72.4,180.0,bottom 16 | D2_4,96.3,-72.4,180.0,bottom 17 | D2_3,39.3,-72.4,180.0,bottom 18 | D2_2,153.3,-72.4,180.0,bottom 19 | D2,58.3,-72.4,180.0,bottom 20 | D3_9,77.396,-53.4,180.0,bottom 21 | D3_8,172.396,-53.4,180.0,bottom 22 | D3_7,58.396,-53.4,180.0,bottom 23 | D3_6,134.396,-53.4,180.0,bottom 24 | D3_5,191.396,-53.4,180.0,bottom 25 | D3_4,115.396,-53.4,180.0,bottom 26 | D3_3,96.396,-53.4,180.0,bottom 27 | D3_2,153.396,-53.4,180.0,bottom 28 | D3,39.396,-53.4,180.0,bottom 29 | D4_9,115.396,-34.4,180.0,bottom 30 | D4_8,77.396,-34.4,180.0,bottom 31 | D4_7,39.396,-34.4,180.0,bottom 32 | D4_6,134.396,-34.4,180.0,bottom 33 | D4_5,172.396,-34.4,180.0,bottom 34 | D4_4,153.396,-34.4,180.0,bottom 35 | D4_3,58.396,-34.4,180.0,bottom 36 | D4_2,191.396,-34.4,180.0,bottom 37 | D4,96.396,-34.4,180.0,bottom 38 | D5_9,86.0,-95.5,270.0,bottom 39 | D5_8,181.0,-95.5,270.0,bottom 40 | D5_7,143.0,-95.5,270.0,bottom 41 | D5_6,200.0,-95.5,270.0,bottom 42 | D5_5,67.0,-95.5,270.0,bottom 43 | D5_4,105.0,-95.5,270.0,bottom 44 | D5_3,48.0,-95.5,270.0,bottom 45 | D5_2,124.0,-95.5,270.0,bottom 46 | D5,162.0,-95.5,270.0,bottom 47 | D6_9,162.0,-76.5,270.0,bottom 48 | D6_8,181.0,-76.5,270.0,bottom 49 | D6_7,143.0,-76.5,270.0,bottom 50 | D6_6,124.0,-76.5,270.0,bottom 51 | D6_5,67.0,-76.5,270.0,bottom 52 | D6_4,200.0,-76.5,270.0,bottom 53 | D6_3,105.0,-76.5,270.0,bottom 54 | D6_2,86.0,-76.5,270.0,bottom 55 | D6,48.0,-76.5,270.0,bottom 56 | D7_9,199.3,-58.3,180.0,bottom 57 | D7_8,180.3,-58.3,180.0,bottom 58 | D7_7,85.3,-58.3,180.0,bottom 59 | D7_6,161.3,-58.3,180.0,bottom 60 | D7_5,66.3,-58.3,180.0,bottom 61 | D7_4,123.3,-58.3,180.0,bottom 62 | D7_3,142.3,-58.3,180.0,bottom 63 | D7_2,47.3,-58.3,180.0,bottom 64 | D7,104.3,-58.3,180.0,bottom 65 | D8_9,200.0,-38.5,270.0,bottom 66 | D8_8,105.0,-38.5,270.0,bottom 67 | D8_7,67.0,-38.5,270.0,bottom 68 | D8_6,48.0,-38.5,270.0,bottom 69 | D8_5,181.0,-38.5,270.0,bottom 70 | D8_4,86.0,-38.5,270.0,bottom 71 | D8_3,162.0,-38.5,270.0,bottom 72 | D8_2,124.0,-38.5,270.0,bottom 73 | D8,143.0,-38.5,270.0,bottom 74 | R2_9,196.5,-34.0,180.0,bottom 75 | R2_8,44.5,-34.0,180.0,bottom 76 | R2_7,158.5,-34.0,180.0,bottom 77 | R2_6,177.5,-34.0,180.0,bottom 78 | R2_5,120.5,-34.0,180.0,bottom 79 | R2_4,101.5,-34.0,180.0,bottom 80 | R2_3,82.5,-34.0,180.0,bottom 81 | R2_2,139.5,-34.0,180.0,bottom 82 | R2,63.5,-34.0,180.0,bottom 83 | SW1_9,59.1,-100.3125,0.0,bottom 84 | SW1_8,154.1,-100.3125,0.0,bottom 85 | SW1_7,135.1,-100.3125,0.0,bottom 86 | SW1_6,78.1,-100.3125,0.0,bottom 87 | SW1_5,97.1,-100.3125,0.0,bottom 88 | SW1_4,173.1,-100.3125,0.0,bottom 89 | SW1_3,40.1,-100.3125,0.0,bottom 90 | SW1_2,116.1,-100.3125,0.0,bottom 91 | SW1,192.1,-100.3125,0.0,bottom 92 | SW2_9,116.1,-81.3125,0.0,bottom 93 | SW2_8,78.1,-81.3125,0.0,bottom 94 | SW2_7,173.1,-81.3125,0.0,bottom 95 | SW2_6,40.1,-81.3125,0.0,bottom 96 | SW2_5,135.1,-81.3125,0.0,bottom 97 | SW2_4,97.1,-81.3125,0.0,bottom 98 | SW2_3,154.1,-81.3125,0.0,bottom 99 | SW2_2,59.1,-81.3125,0.0,bottom 100 | SW2,192.1,-81.3125,0.0,bottom 101 | SW3_9,40.02,-62.3125,0.0,bottom 102 | SW3_8,59.02,-62.3125,0.0,bottom 103 | SW3_7,154.02,-62.3125,0.0,bottom 104 | SW3_6,97.02,-62.3125,0.0,bottom 105 | SW3_5,173.02,-62.3125,0.0,bottom 106 | SW3_4,135.02,-62.3125,0.0,bottom 107 | SW3_3,78.02,-62.3125,0.0,bottom 108 | SW3_2,116.02,-62.3125,0.0,bottom 109 | SW3,192.02,-62.3125,0.0,bottom 110 | SW4_9,78.02,-43.3125,0.0,bottom 111 | SW4_8,59.02,-43.3125,0.0,bottom 112 | SW4_7,192.02,-43.3125,0.0,bottom 113 | SW4_6,116.02,-43.3125,0.0,bottom 114 | SW4_5,173.02,-43.3125,0.0,bottom 115 | SW4_4,40.02,-43.3125,0.0,bottom 116 | SW4_3,154.02,-43.3125,0.0,bottom 117 | SW4_2,135.02,-43.3125,0.0,bottom 118 | SW4,97.02,-43.3125,0.0,bottom 119 | -------------------------------------------------------------------------------- /mozc-doublesided/gerber/usb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/gerber/usb.zip -------------------------------------------------------------------------------- /mozc-doublesided/gerber/usb_bom.csv: -------------------------------------------------------------------------------- 1 | Designator,Footprint,Quantity,Value,LCSC Part # 2 | C1,0402,1,10u, 3 | C2,0402,1,2.2u, 4 | "C3, C4",0402,2,47p, 5 | J1,JST_S7B_ZR,1,JST_ZH_7P,C160734 6 | J2,USB_C_Receptacle_XKB_U262-16XN-4BVC11,1,USB, 7 | "R1, R2",0402,2,5.1K, 8 | "R3, R4",0402,2,22, 9 | R5,0402,1,1.5K, 10 | U1,SOT-223-3_TabPin2,1,AMS1117-3.3,C347222 11 | -------------------------------------------------------------------------------- /mozc-doublesided/gerber/usb_positions.csv: -------------------------------------------------------------------------------- 1 | Designator,Mid X,Mid Y,Rotation,Layer 2 | C1,29.22,-34.47,0.0,top 3 | C2,33.27,-35.76,180.0,top 4 | C3,36.15,-39.65,270.0,top 5 | C4,36.15,-41.55,270.0,top 6 | J1,32.0,-48.5,0.0,top 7 | J2,32.01,-29.145,180.0,top 8 | R1,27.3,-35.55,0.0,top 9 | R2,27.31,-34.47,0.0,top 10 | R3,37.15,-41.55,270.0,top 11 | R4,37.15,-39.65,90.0,top 12 | R5,27.7,-44.1,90.0,top 13 | U1,32.0,-40.65,90.0,top 14 | -------------------------------------------------------------------------------- /mozc-doublesided/images/connect_boards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/connect_boards.png -------------------------------------------------------------------------------- /mozc-doublesided/images/connections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/connections.png -------------------------------------------------------------------------------- /mozc-doublesided/images/header.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/header.webp -------------------------------------------------------------------------------- /mozc-doublesided/images/pairing_case.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/pairing_case.webp -------------------------------------------------------------------------------- /mozc-doublesided/images/pairing_helper.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/pairing_helper.webp -------------------------------------------------------------------------------- /mozc-doublesided/images/pcb_pair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/pcb_pair.png -------------------------------------------------------------------------------- /mozc-doublesided/images/pcb_primary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/pcb_primary.png -------------------------------------------------------------------------------- /mozc-doublesided/images/pcb_swd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/pcb_swd.png -------------------------------------------------------------------------------- /mozc-doublesided/images/primary_case.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/primary_case.webp -------------------------------------------------------------------------------- /mozc-doublesided/images/primary_usb.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/primary_usb.webp -------------------------------------------------------------------------------- /mozc-doublesided/images/usb_case.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-doublesided/images/usb_case.webp -------------------------------------------------------------------------------- /mozc-furikku/README.md: -------------------------------------------------------------------------------- 1 | Copyright 2016 Google Inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | 15 | 16 | Summary 17 | ===================================== 18 | 19 | Circuit diagram and firmware of Google Japanese Input physical flick version. 20 | 21 | 22 | Files 23 | ===================================== 24 | 25 | * README.md -- this file 26 | * arduino/flick/* -- firmware source code (Arduino sketch) 27 | * circuit.png -- circuit diagram 28 | * photo/* -- for reference 29 | 30 | 31 | Building your device 32 | ===================================== 33 | 34 | ## Electronic parts 35 | 36 | * Arduino Nano * 1 37 | * RN-42-I/RM * 1 38 | * SJoys 2-axes joystick module (Sainsmart) * 12 39 | * MCP3208 * 3 40 | * 0.1uF ceramic capacitor * 4 41 | * 470 ohm resistor * 1 42 | * 1k ohm resistor * 1 43 | * Connectors 44 | 45 | ## RN42 configuration 46 | 47 | This step is required for the first time, or when changing the device's name. 48 | See Microchip's documents for detail. 49 | 50 | 1. Run a terminal emulator and open the serial port for Arduino. 51 | 2. Type '!' to enter pass-through mode. 52 | 3. Type '$$$'. 53 | 4. Configure the module by these commands: 54 | 55 | * * * * * * 56 | SU,115k 57 | SM,6 58 | SA,2 59 | S~,6 60 | SH,0000 61 | SN,MY_PHYSICAL_FLICK_KEYBOARD 62 | R,1 63 | * * * * * * 64 | MY\_PHYSICAL\_FLICK\_KEYBOARD is a device name that will appear when you scan 65 | Bluetooth devices, and can be replaced by your preferred name. 66 | 67 | The commands will configure the module as follows: 68 | 69 | * 115200bps 70 | * Pairing mode 71 | * SSP "just works" mode 72 | * SPP profile 73 | * HID flag register = 0 (keyboard) 74 | 75 | 76 | Using flick input 77 | ===================================== 78 | 79 | ## Power supply 80 | 81 | When operating the device, supply power by USB cables to Arduino Nano. 82 | 83 | ## Bluetooth pairing 84 | 85 | Using your device (e.g. Android phone), scan Bluetooth devices and you will 86 | find MY\_PHYSICAL\_FLICK\_KEYBOARD (or the name you set up) in the available 87 | device list. 88 | 89 | After pairing, find the device in the "physical keyboard" section and choose 90 | "English - U.S." keyboard layout for it. 91 | 92 | ## How to input 93 | 94 | Switch the Japanese IME on the paired device to romaji input mode. 95 | Characters will be input as flick or press a key. 96 | -------------------------------------------------------------------------------- /mozc-furikku/arduino/flick/flick.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include "flick_keyboard.h" 3 | 4 | // Number of A/D converter ICs. 5 | const int kNumAdcIc = 3; 6 | const int kCsPins[kNumAdcIc] = {10, 9, 8}; 7 | 8 | const int kButtonPins[12] = { 9 | // If you use Arduino Nano version 2, use A6 and A7 instead of A0 and A1. 10 | // (which are actually port C, thus used as digital input) 11 | A0, A1, A2, A3, A4, A5, 12 | 7, 6, 5, 4, 3, 2 13 | }; 14 | 15 | FlickKeyboard keyboard; 16 | 17 | void setup() { 18 | Serial.begin(115200); 19 | for (size_t i = 0; i < kNumAdcIc; i++) { 20 | pinMode(kCsPins[i], OUTPUT); 21 | digitalWrite(kCsPins[i], HIGH); 22 | } 23 | for (size_t i = 0; i < 12; i++) { 24 | pinMode(kButtonPins[i], INPUT_PULLUP); 25 | } 26 | SPI.begin(); 27 | SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); 28 | } 29 | 30 | void SelectChip(uint8_t id) { 31 | if (id > kNumAdcIc) { 32 | return; 33 | } 34 | for (size_t i = 0; i < kNumAdcIc; i++) { 35 | digitalWrite(kCsPins[i], HIGH); 36 | } 37 | digitalWrite(kCsPins[id], LOW); 38 | } 39 | 40 | void DeselectChips() { 41 | for (size_t i = 0; i < kNumAdcIc; i++) { 42 | digitalWrite(kCsPins[i], HIGH); 43 | } 44 | } 45 | 46 | // Fetch a ADC result of a specified channel from a MCP3208. 47 | int16_t ReadMcp3208Adc(uint8_t chipId, uint8_t channel) { 48 | SelectChip(chipId); 49 | // MCP3208 receives only 5 bits for start. 50 | // Since the SPI library only supports bytewise tramsmission, 51 | // we send dummy (high-level) bits before the start bit. 52 | // Send data : 53 | // 3 dummy bits (000) 54 | // start bit (1) 55 | // select single-end (1) 56 | // 3 address bits: d2, d1, d0 57 | SPI.transfer(0x18 | channel); 58 | uint16_t b0 = SPI.transfer(0x00); 59 | uint16_t b1 = SPI.transfer(0x00); 60 | DeselectChips(); 61 | // The first output bit is high-Z (sampling period). 62 | // The second bit is always 0. 63 | // Then the ADC value follows in MSB first format. 64 | // Therefore the first received byte contains 6 bits from MSB, 65 | // and the second byte contains the remainder. 66 | return ((b0 & 0x3f) << 6) | ((b1 & 0xfc) >> 2); 67 | } 68 | 69 | void ReadSwitches(bool* button) { 70 | for (size_t i = 0; i < 12; i++) { 71 | button[i] = (digitalRead(kButtonPins[i]) == LOW); 72 | } 73 | } 74 | 75 | void ReadVolumes(uint16_t* data) { 76 | byte inByte = 0; 77 | for (uint8_t j = 0; j < kNumAdcIc; j++) { 78 | for (uint8_t i = 0; i < 8; i++) { 79 | data[j * 8 + i] = ReadMcp3208Adc(j, i); 80 | } 81 | } 82 | } 83 | 84 | // Passes through any serial input to the output. 85 | // This mode can be used to configure RN-42 using serial terminal 86 | // connected to Arduino. 87 | void EchoBackMode() { 88 | while (true) { 89 | if (Serial.available()) { 90 | Serial.print((char)Serial.read()); 91 | } 92 | } 93 | } 94 | 95 | void loop() { 96 | if (Serial.available() && Serial.read() == '!') { 97 | EchoBackMode(); 98 | } 99 | 100 | SensorData keys; 101 | ReadVolumes(keys.axes); 102 | ReadSwitches(keys.button); 103 | int nOutputs; 104 | const char* outputs[COLS]; 105 | keyboard.ProcessSensorData(keys, COLS, outputs, &nOutputs); 106 | for (size_t i = 0; i < nOutputs; i++) { 107 | Serial.print(outputs[i]); 108 | } 109 | } 110 | 111 | -------------------------------------------------------------------------------- /mozc-furikku/arduino/flick/flick_keyboard.cpp: -------------------------------------------------------------------------------- 1 | #include "flick_keyboard.h" 2 | #include 3 | 4 | #define ADC_BITS 12 5 | 6 | void FlickKeyboard::ProcessSensorData(const SensorData& data, size_t maxKeyNum, 7 | const char** outputStrings, int* nOutputs) { 8 | const char* characters[COLS][ROWS] = { 9 | {"a", "i", "u", "e", "o"}, 10 | {"ka", "ki", "ku", "ke", "ko"}, 11 | {"sa", "si", "su", "se", "so"}, 12 | {"ta", "ti", "tu", "te", "to"}, 13 | {"na", "ni", "nu", "ne", "no"}, 14 | {"ha", "hi", "hu", "he", "ho"}, 15 | {"ma", "mi", "mu", "me", "mo"}, 16 | {"ya", "(", "yu", ")", "yo"}, 17 | {"ra", "ri", "ru", "re", "ro"}, 18 | {"\n", "\b", "", " ", ""}, 19 | {"wa", "wo", "nn", "-", "~"}, 20 | {",", ".", "?", "!", "..."} 21 | }; 22 | *nOutputs = 0; 23 | for (size_t i = 0; i < COLS; i++) { 24 | Direction s = ConvertToFlickState(data.axes[i * 2 + 1], 25 | data.axes[i * 2], data.button[i]); 26 | if (lastState[i] == NONE && s != NONE) { 27 | if (*nOutputs < maxKeyNum) { 28 | outputStrings[(*nOutputs)++] = characters[i][s]; 29 | } 30 | } 31 | lastState[i] = s; 32 | } 33 | } 34 | 35 | FlickKeyboard::FlickKeyboard() { 36 | for (size_t i = 0; i < COLS; i++) { 37 | lastState[i] = NONE; 38 | } 39 | } 40 | 41 | Direction FlickKeyboard::ConvertToFlickState( 42 | int16_t x, int16_t y, bool buttonPressed) { 43 | const int16_t adScale = 1 << ADC_BITS; 44 | const int16_t adCenter = adScale / 2; 45 | const int16_t threshold = adScale * 0.4; 46 | 47 | int16_t diffX = x - adCenter; 48 | int16_t diffY = y - adCenter; 49 | if (buttonPressed) { 50 | return CENTER; 51 | } 52 | if (abs(diffX) > abs(diffY)) { 53 | if (diffX < -threshold) { 54 | return LEFT; 55 | } else if (diffX > threshold) { 56 | return RIGHT; 57 | } 58 | } else { 59 | if (diffY < -threshold) { 60 | return UP; 61 | } else if (diffY > threshold) { 62 | return DOWN; 63 | } 64 | } 65 | return NONE; 66 | } 67 | 68 | -------------------------------------------------------------------------------- /mozc-furikku/arduino/flick/flick_keyboard.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #define ROWS 5 7 | #define COLS 12 // Equals to the number of the keys. 8 | 9 | enum Direction { 10 | CENTER, LEFT, UP, RIGHT, DOWN, NONE 11 | }; 12 | 13 | struct SensorData { 14 | uint16_t axes[COLS * 2]; 15 | bool button[COLS]; 16 | }; 17 | 18 | class FlickKeyboard { 19 | private: 20 | Direction lastState[COLS]; 21 | Direction ConvertToFlickState(int16_t x, int16_t y, 22 | bool buttonPressed); 23 | public: 24 | FlickKeyboard(); 25 | void ProcessSensorData(const SensorData& data, size_t maxKeyNum, 26 | const char** outputStrings, int* nOutputs); 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /mozc-furikku/circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-furikku/circuit.png -------------------------------------------------------------------------------- /mozc-furikku/photo/device.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-furikku/photo/device.jpg -------------------------------------------------------------------------------- /mozc-furikku/photo/jsmodule.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-furikku/photo/jsmodule.jpg -------------------------------------------------------------------------------- /mozc-furikku/photo/keyboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-furikku/photo/keyboard.jpg -------------------------------------------------------------------------------- /mozc-mageru/README.md: -------------------------------------------------------------------------------- 1 | # Gboard Spoon Bending Version 2 | 3 | This contains programs, schematics and board layouts for Gboard Spoon Bending Version, which was released on **Apr 1, 2019**. 4 | 5 | This is not an officially supported Google product. 6 | 7 | # Contents 8 | 9 | Directory structure is as follows. 10 | 11 | - wireless/ 12 | - firmware/ 13 | - Firmware for the wireless version. (coming soon) 14 | - board/ 15 | - Schematic and PCB layout made by EAGLE. 16 | - wired/ 17 | - firmware/ 18 | - Arduino sketch for the wired version. 19 | - ../third_party/mozc-mageru/spoon_stl/ 20 | - Spoon shape data for 3D printing. 21 | 22 | # Wired Version 23 | 24 | ## The spoon 25 | 26 | Print the spoon under /third_party/mozc-mageru/spoon_stl/ using a 3D printer. 27 | This is an example design of a flexible spoon that has a slot to embed a 28 | flex sensor into. 29 | We have tried it with PLA, but it will probably work with ABS as well. 30 | 31 | ## Electronic circuit 32 | 33 | - Arduino Micro 34 | - 22k-ohm resistor 35 | - Flex sensor: FS-L-0055-253-ST (Spectra Symbol) 36 | 37 | ``` 38 | Arduino Micro 39 | 40 | 5V ---[22k ohm]-------+ 41 | | 42 | A5 -------------------+ 43 | | 44 | GND ---[Flex sensor]---+ 45 | ``` 46 | 47 | ## How to use the firmware 48 | 49 | 1. Open the sketch on Arduino IDE. 50 | 2. Choose "Arduino/Genuino Micro" in the [Tools]-[Board] menu. 51 | 3. If you are making Japanse-hiragana version, add ```#define JAPANESE_``` to the first line of the sketch 52 | 4. Upload to board. 53 | 54 | ## Sensor calibration 55 | 56 | 1. Open Serial Monitor. 57 | 2. Send '!' once to disable key output. 58 | 3. (the home position, which decides when to commit a character) 59 | Bend the sensor slightly and send '0'. Make sure the LED turns off when the spoon is not bent by external force. 60 | 4. (the position for the first letter) 61 | Bend the sensor slightly a bit more and send '1'. 62 | 5. (the position for the last letter) 63 | Bend the sensor to the end and send '2'. 64 | 6. Send 'w' to save the configuration to EEPROM. 65 | 7. Send '!' again to enable key output, or reset the device. 66 | 67 | # Wireless Version 68 | 69 | Coming soon. 70 | 71 | # License 72 | 73 | ``` 74 | Licensed under the Apache License, Version 2.0 (the "License"); you may 75 | not use this file except in compliance with the License. You may obtain 76 | a copy of the License at 77 | 78 | http://www.apache.org/licenses/LICENSE-2.0 79 | 80 | Unless required by applicable law or agreed to in writing, software 81 | distributed under the License is distributed on an "AS IS" BASIS, 82 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 83 | See the License for the specific language governing permissions and 84 | limitations under the License. 85 | ``` 86 | -------------------------------------------------------------------------------- /mozc-mageru/wireless/board/board-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-mageru/wireless/board/board-bottom.png -------------------------------------------------------------------------------- /mozc-mageru/wireless/board/board-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-mageru/wireless/board/board-top.png -------------------------------------------------------------------------------- /mozc-mageru/wireless/board/schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-mageru/wireless/board/schematic.png -------------------------------------------------------------------------------- /mozc-nazoru/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | .static_storage/ 57 | .media/ 58 | local_settings.py 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # mypy 105 | .mypy_cache/ 106 | 107 | # macOS filesystem 108 | .DS_Store 109 | 110 | # Uncompressed training data 111 | data/strokes.ndjson 112 | nazoru_saved_model/ 113 | nazoru.pb 114 | optimized_nazoru.pb 115 | -------------------------------------------------------------------------------- /mozc-nazoru/bin/nazoru-input: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Copyright 2018 Google LLC 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # http://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | 18 | from __future__ import print_function 19 | 20 | # Surpress warnings. Please unvail these warnings when development. 21 | import warnings 22 | warnings.filterwarnings("ignore", category=RuntimeWarning) 23 | warnings.filterwarnings("ignore", category=FutureWarning) 24 | 25 | from nazoru.led import LED_BLUE, LED_RED, LED_CHASSIS 26 | import time 27 | LED_RED.blink(1) 28 | LED_CHASSIS.on() 29 | time.sleep(1) 30 | LED_CHASSIS.off() 31 | 32 | import argparse 33 | import os 34 | import unicodedata 35 | from nazoru import get_default_graph_path 36 | from nazoru.core import ( 37 | create_keyboard_recorder, Bluetooth, NazoruPredictor, clear_screen) 38 | 39 | def main(): 40 | FLAGS = None 41 | parser = argparse.ArgumentParser() 42 | parser.add_argument('-g', '--graph', 43 | type=str, 44 | default=get_default_graph_path(), 45 | help='Path to a trained model which is generated by ' + 46 | 'nazoru-training.') 47 | parser.add_argument('-v', '--verbose', action='store_true') 48 | FLAGS, unparsed = parser.parse_known_args() 49 | 50 | LED_RED.blink(0.3) 51 | 52 | bt_connection = Bluetooth() 53 | try: 54 | recorder = create_keyboard_recorder(verbose=FLAGS.verbose) 55 | except IOError as e: 56 | LED_RED.off() 57 | LED_BLUE.off() 58 | raise e 59 | predictor = NazoruPredictor(FLAGS.graph) 60 | 61 | LED_RED.off() 62 | LED_BLUE.blink(1) 63 | LED_CHASSIS.set_brightness(5) 64 | 65 | print('Ready. Please scrrible on your keyboard.') 66 | while True: 67 | data, command = recorder.record() 68 | if command is not None: 69 | print('command: %s' % command) 70 | bt_connection.command(command) 71 | continue 72 | if data is None: 73 | print('done.') 74 | break 75 | 76 | LED_CHASSIS.set_brightness(100) 77 | LED_RED.on() 78 | try: 79 | result = predictor.predict_top_n(data, 5) 80 | except IndexError: 81 | # This is possible when pressing keys we don't use for learning. 82 | print('Invalid input. (out of range)') 83 | continue 84 | except ValueError: 85 | # This is possible when pressing only one key. 86 | print('Invalid input. (one key)') 87 | continue 88 | LED_RED.off() 89 | LED_CHASSIS.set_brightness(5) 90 | 91 | clear_screen() 92 | print('\n===== RESULTS =====') 93 | for item in result: 94 | if unicodedata.east_asian_width(item[0]) in {'W', 'F'}: 95 | surface = item[0] 96 | else: 97 | surface = item[0] + ' ' 98 | print(u'%s (%4s): %.5f' % (surface, item[1], item[2])) 99 | print('===================\n') 100 | 101 | most_likely_result = result[0] 102 | print(u'prediction: %s (%s)' % ( 103 | most_likely_result[0], most_likely_result[1])) 104 | bt_connection.send(most_likely_result[1]) 105 | 106 | if __name__ == '__main__': 107 | main() 108 | -------------------------------------------------------------------------------- /mozc-nazoru/board/schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-nazoru/board/schematic.png -------------------------------------------------------------------------------- /mozc-nazoru/data/nazoru.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=nazoru-input daemon 3 | 4 | [Service] 5 | Type=simple 6 | Environment=PYTHONIOENCODING=utf-8 7 | ExecStart=/usr/bin/env nazoru-input 8 | StandardOutput=syslog 9 | StandardError=syslog 10 | SyslogIdentifier=nazoru-input 11 | Restart=always 12 | RestartSec=10 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /mozc-nazoru/data/strokes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-nazoru/data/strokes.zip -------------------------------------------------------------------------------- /mozc-nazoru/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Copyright 2018 Google LLC 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # http://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | 18 | import codecs 19 | import os 20 | from setuptools import setup, find_packages 21 | 22 | def read_file(name): 23 | with codecs.open( 24 | os.path.join(os.path.dirname(__file__), name), 'r', 'utf-8') as f: 25 | return f.read().strip() 26 | 27 | setup( 28 | name='nazoru-input', 29 | version='0.1.2', 30 | author='Makoto Shimazu', 31 | author_email='shimazu@google.com', 32 | url='https://landing.google.com/tegaki', 33 | description='Package for Gboard Physical Handwriting Version', 34 | long_description=read_file('README.rst'), 35 | license='Apache', 36 | classifiers=[ 37 | 'Development Status :: 3 - Alpha', 38 | 'Environment :: Console', 39 | 'Environment :: No Input/Output (Daemon)', 40 | 'Operating System :: OS Independent', 41 | 'Programming Language :: Python', 42 | 'License :: OSI Approved :: Apache Software License', 43 | 'Topic :: Scientific/Engineering :: Artificial Intelligence', 44 | 'Topic :: Software Development :: Libraries :: Python Modules', 45 | 'Topic :: Utilities', 46 | ], 47 | packages=find_packages('src'), 48 | package_dir={'': 'src'}, 49 | package_data={ 50 | 'nazoru': ['data/optimized_nazoru.pb'] 51 | }, 52 | scripts=[ 53 | 'bin/nazoru-input', 54 | 'bin/nazoru-training' 55 | ], 56 | 57 | # For installing the nazoru_input as a service of systemd. Please uncomment 58 | # the following |data_files| if you want to install nazoru.service. 59 | # data_files=[('/etc/systemd/system', ['data/nazoru.service'])], 60 | 61 | install_requires=[ 62 | 'cairocffi', 63 | 'pillow', 64 | 'tensorflow~=2.12.1', 65 | 'tf_slim~=1.1.0', 66 | 'enum34;python_version<"3.4"', 67 | 'pyserial', 68 | 'evdev;platform_system=="Linux"', 69 | 'wiringpi;platform_system=="Linux"' 70 | ], 71 | python_requires='>=3.8, <3.12' 72 | ) 73 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | def get_default_graph_path(): 4 | import os 5 | script_dir = os.path.dirname(os.path.abspath(__file__)) 6 | return os.path.join(script_dir, 'data', 'optimized_nazoru.pb') 7 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/bluetooth.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | import serial 18 | import struct 19 | 20 | class Bluetooth(): 21 | DEVICE_FILE = '/dev/serial0' 22 | BAUDRATE = 115200 23 | 24 | def __init__(self): 25 | try: 26 | self._conn = serial.Serial(self.DEVICE_FILE, self.BAUDRATE) 27 | self._dummy = False 28 | print('Bluetooth') 29 | except serial.SerialException: 30 | self._conn = None 31 | self._dummy = True 32 | print('Dummy Bluetooth') 33 | 34 | def send(self, string): 35 | """Send |string| as a series of characters. |string| should be 36 | alphabets, numbers and symbols which can be typed from your keyboard.""" 37 | if self._dummy: 38 | print('bluetooth: {}'.format(string)) 39 | return 40 | self._conn.write(string) 41 | 42 | # See http://ww1.microchip.com/downloads/en/DeviceDoc/bluetooth_cr_UG-v1.0r.pdf 43 | # for detail. 44 | UART_CODES = { 45 | 'KEY_DELETE': 4, 46 | 'KEY_RIGHT': 7, 47 | 'KEY_BACKSPACE': 8, 48 | 'KEY_ENTER': 10, 49 | 'KEY_LEFT': 11, 50 | 'KEY_DOWN': 12, 51 | 'KEY_UP': 14, 52 | } 53 | 54 | def command(self, cmd): 55 | if cmd not in self.UART_CODES: 56 | print('Unknown Command: {}'.format(cmd)) 57 | return 58 | if self._dummy: 59 | print('bluetooth: command({})'.format(cmd)) 60 | return 61 | self.send(struct.pack('b', self.UART_CODES[cmd])) 62 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/core.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | from __future__ import absolute_import 18 | 19 | from . import lib 20 | from .bluetooth import Bluetooth 21 | from .keyboard_recorder import create_keyboard_recorder 22 | from .nazorunet import nazorunet 23 | from .nazorunet import Conv 24 | from .nazorunet import DepthSepConv 25 | from .predictor import NazoruPredictor 26 | from .utils import clear_screen 27 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/data/optimized_nazoru.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-nazoru/src/nazoru/data/optimized_nazoru.pb -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/led.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # vim: set fileencoding=utf-8 : 4 | # 5 | # Copyright 2018 Google LLC 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); 8 | # you may not use this file except in compliance with the License. 9 | # You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, 15 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | # See the License for the specific language governing permissions and 17 | # limitations under the License. 18 | 19 | class LEDBase(object): 20 | def __init__(self, pin): 21 | self._pin = pin 22 | def on(self): 23 | pass 24 | def off(self): 25 | pass 26 | def blink(self, interval): 27 | pass 28 | def set_brightness(self, brightness): 29 | pass 30 | 31 | try: 32 | import RPi.GPIO as GPIO 33 | import threading 34 | GPIO.setmode(GPIO.BOARD) 35 | 36 | class LED(LEDBase): 37 | ON = 'ON' 38 | OFF = 'OFF' 39 | 40 | def __init__(self, pin): 41 | self._pin = pin 42 | self._lock = threading.Lock() 43 | self._timer = None 44 | GPIO.setup(pin, GPIO.OUT) 45 | self.off() 46 | 47 | def on(self): 48 | with self._lock: 49 | self._state = self.ON 50 | GPIO.output(self._pin, False) 51 | self._ensure_stop_timer() 52 | 53 | def off(self): 54 | with self._lock: 55 | self._state = self.OFF 56 | GPIO.output(self._pin, True) 57 | self._ensure_stop_timer() 58 | 59 | def blink(self, interval): 60 | self._ensure_stop_timer() 61 | def toggle(): 62 | self._timer = None 63 | if self._state == self.ON: 64 | self.off() 65 | else: 66 | self.on() 67 | self._timer = threading.Timer(interval, toggle) 68 | self._timer.daemon = True 69 | self._timer.start() 70 | toggle() 71 | 72 | def _ensure_stop_timer(self): 73 | if self._timer is not None: 74 | self._timer.cancel() 75 | self._timer = None 76 | 77 | import wiringpi 78 | wiringpi.wiringPiSetupPhys() 79 | class SlowLED(LEDBase): 80 | DUTY_MAX = 1024 81 | INTERVAL_MS = 10 82 | 83 | def __init__(self, pin, delay_ms): 84 | self._pin = pin 85 | self._delay_ms = delay_ms 86 | wiringpi.pinMode(pin, wiringpi.GPIO.PWM_OUTPUT) 87 | self._target_duty = 0 88 | self._current_duty = 0 89 | self._remaining_cycles = 0 90 | self._lock = threading.Lock() 91 | self._timer = None 92 | self.off() 93 | 94 | # Called every 10ms 95 | def _update(self): 96 | with self._lock: 97 | diff = (self._target_duty - self._current_duty) // \ 98 | self._remaining_cycles 99 | self._current_duty += diff 100 | self._remaining_cycles -= 1 101 | self._set_duty_immediate(self._current_duty) 102 | if self._remaining_cycles == 0: 103 | self._timer.cancel() 104 | self._timer = None 105 | return 106 | self._timer = threading.Timer(self.INTERVAL_MS * 0.001, self._update) 107 | self._timer.daemon = True 108 | self._timer.start() 109 | 110 | 111 | # |duty|: 0 - 100 112 | def _set_duty_immediate(self, duty): 113 | wiringpi.pwmWrite(self._pin, int(self.DUTY_MAX * duty // 100)) 114 | 115 | def _set_duty_slow(self, duty, time_ms): 116 | with self._lock: 117 | self._target_duty = duty 118 | self._remaining_cycles = time_ms // self.INTERVAL_MS 119 | if self._timer is None: 120 | self._timer = threading.Timer(self.INTERVAL_MS * 0.001, self._update) 121 | self._timer.daemon = True 122 | self._timer.start() 123 | 124 | def on(self): 125 | self._set_duty_slow(100, self._delay_ms) 126 | 127 | def off(self): 128 | self._set_duty_slow(0, self._delay_ms) 129 | 130 | # |brightness|: 0 - 100 131 | def set_brightness(self, brightness): 132 | self._set_duty_slow(brightness, self._delay_ms) 133 | 134 | except ImportError as e: 135 | import sys 136 | 137 | class LED(LEDBase): 138 | pass 139 | class SlowLED(LEDBase): 140 | def __init__(self, pin, delay_ms): 141 | super(SlowLED, self).__init__(pin) 142 | 143 | LED_BLUE = LED(38) 144 | LED_RED = LED(40) 145 | LED_CHASSIS = SlowLED(32, 500) 146 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/nazoru_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | import unittest 18 | import nazoru 19 | 20 | class TestNazoru(unittest.TestCase): 21 | """Test class for nazoru.py""" 22 | 23 | def test_key2pos(self): 24 | pos = nazoru.key2pos('a', ['abc', 'def'], 0.5) 25 | self.assertEqual((0,0), pos) 26 | pos = nazoru.key2pos('e', ['abc', 'def'], 0.5) 27 | self.assertEqual((1.5,1), pos) 28 | 29 | if __name__ == "__main__": 30 | unittest.main() 31 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/predictor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | from __future__ import absolute_import 18 | 19 | import tensorflow as tf 20 | from . import lib 21 | from . import utils 22 | import numpy as np 23 | 24 | def _load_graph(model_file): 25 | graph = tf.Graph() 26 | graph_def = tf.compat.v1.GraphDef() 27 | with open(model_file, "rb") as f: 28 | graph_def.ParseFromString(f.read()) 29 | with graph.as_default(): 30 | tf.import_graph_def(graph_def) 31 | return graph 32 | 33 | class NazoruPredictor(): 34 | def __init__(self, model_file): 35 | graph = _load_graph(model_file) 36 | self._graph = graph 37 | self._input_operation = graph.get_operation_by_name( 38 | 'import/' + lib.INPUT_NODE_NAME) 39 | self._output_operation = graph.get_operation_by_name( 40 | 'import/' + lib.OUTPUT_NODE_NAME) 41 | 42 | def _predict(self, data): 43 | with utils.Measure('inputs'): 44 | inputs = lib.keydowns2image(data, True, True, 16, 2) 45 | inputs = np.expand_dims(inputs, axis=0) 46 | with utils.Measure('sess.run'): 47 | with tf.compat.v1.Session(graph=self._graph) as sess: 48 | result = sess.run(self._output_operation.outputs[0], 49 | {self._input_operation.outputs[0]: inputs})[0] 50 | return result 51 | def predict_top_n(self, data, n): 52 | """Predict the charactor drawn by |data|. 53 | 54 | Args: 55 | data: [(key, time)] |time| is elapsed time since the first character in ms. 56 | n: integer of the number of the return value. 57 | Returns: 58 | ans: [(kana, key, probability)] sorted by the probability. 59 | """ 60 | result = self._predict(data) 61 | ans = [] 62 | for i in result.argsort()[::-1][:n]: 63 | ans.append((lib.KANAS[i], lib.KEYS[i], result[i])) 64 | return ans 65 | -------------------------------------------------------------------------------- /mozc-nazoru/src/nazoru/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | import time 18 | import sys 19 | 20 | class Measure(): 21 | def __init__(self, tag): 22 | self._tag = tag 23 | 24 | def __enter__(self): 25 | self._start = time.time() 26 | 27 | def __exit__(self, type, value, traceback): 28 | now = time.time() 29 | print('[{0}] {1} ms'.format(self._tag, (now - self._start)*1E3)) 30 | 31 | def clear_screen(): 32 | sys.stdout.write('\033[2J') 33 | sys.stdout.write('\033[H') 34 | sys.stdout.flush() 35 | -------------------------------------------------------------------------------- /mozc-piropiro/README.md: -------------------------------------------------------------------------------- 1 | Copyright 2015 Google Inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | 15 | 16 | Summary 17 | ===================================== 18 | 19 | Mechanical design, circuit diagram and firmware of Google Japanese Input 20 | piropiro version. 21 | 22 | 23 | Files 24 | ===================================== 25 | 26 | * arduino/piropiro/piropiro.ino -- firmware source code (Arduino sketch) 27 | * stl/* -- 3D shape data of mechanical parts 28 | * README.txt -- this file 29 | * assembly.png -- mechanical assembly instruction 30 | * circuit.png -- circuit diagram 31 | * example.jpg -- photograph of an example device 32 | 33 | 34 | Building your device 35 | ===================================== 36 | 37 | ## Mechanical parts 38 | 39 | Output all mechanical parts under stl/ directory with a 3D printer. 40 | Additionally, you need these parts. 41 | 42 | * M2x4 scerws x7 43 | * M2 washer (inside diameter=2.2mm, outside diameter=5.8mm) x1 44 | * A party horn x1 45 | 46 | ## Electronic parts 47 | 48 | * Arduino Nano 49 | Some other models of Arduino (e.g. Arduino Uno) can be used 50 | if required function is available. 51 | * RN-42-EK or a compatible evaluation kit 52 | RN-42 can be used instead if wired appropriately. 53 | * GP2Y0E02A distance sensor 54 | * 1/8W Resistors 55 | * 1k 56 | * 470 57 | * Breadboard and jump wires 58 | 59 | ## Assembly 60 | 61 | See the circuit diagram and mechanical assembly instruction images. 62 | 63 | Also refer the example device in the photo. 64 | 65 | ## RN42 module configuration 66 | 67 | This step is required for the first time, or when changing the device's name. 68 | Note that you should not connect Arduino Nano when you configure RN-42-EK via 69 | USB, because signal from Arduino Nano overrides the TxD signal on RN-42-EK. 70 | See Microchip's documents for detail. 71 | 72 | 1. Connect RN-42-EK to your PC by USB. 73 | 2. Run a terminal emulator and open the serial port for RN-42-EK. 74 | 3. Type '$$$'. Make sure 'CMD' is returned from RN-42-EK and the green LED on 75 | RN-42-EK blinks fast. 76 | 4. Configure the module by these commands: 77 | 78 | * * * * * * 79 | SU,115k 80 | SM,6 81 | SA,2 82 | S~,6 83 | SH,0000 84 | SN,MY_PIROPIRO_KEYBOARD 85 | R,1 86 | * * * * * * 87 | MY\_PIROPIRO\_KEYBOARD is a device name that will appear when you scan Bluetooth 88 | devices, and can be replaced by your preferred name. 89 | 90 | The commands will configure the module as follows: 91 | 92 | * 115200bps 93 | * Pairing mode 94 | * SSP "just works" mode 95 | * SPP profile 96 | * HID flag register = 0 (keyboard) 97 | 98 | 99 | Using piropiro input 100 | ===================================== 101 | 102 | ## Power supply 103 | 104 | When operating the device, supply power by USB cables to both RN-42-EK and 105 | Arduino Nano. You can alternatively supply 3.3V power to RN-42-EK from Arduino's 106 | 3.3V pin, but this requires a modification on RN-42-EK to disconnect the 107 | regulator's output pin on it from the circuit. 108 | 109 | ## Sensor adjustment 110 | 111 | 1. Attach the device to your party horn. The sensor should be positioned about 112 | 40mm apart from the rolled paper tube. 113 | 2. Turn on Arduino Nano and adjust the optical axis of the sensor. The LED on 114 | Arduino board is lit while the sensor is collectly sensing the tip of the 115 | paper tube between 50mm -- 350mm. 116 | 117 | ## Bluetooth pairing 118 | 119 | Using your device (e.g. Android phone), scan Bluetooth devices and you will 120 | find MY\_PIROPIRO\_KEYBOARD (or the name you set up) in the available device 121 | list. 122 | 123 | ## How to input 124 | 125 | Switch the Japanese IME on the paired device to romaji input mode. 126 | Characters will be input as you blow the horn. 127 | The length of the horn chooses the vowel. 128 | In order to switch to the next column (consonant), quickly shrink the horn and blow it again. 129 | -------------------------------------------------------------------------------- /mozc-piropiro/arduino/piropiro/piropiro.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /* 18 | * Firmware of piropiro (party horn) Bluetooth keyboard. 19 | */ 20 | 21 | #define V_REF 5.0 22 | #define PIN_LED 13 23 | #define N_AD_SAMPLES 10 24 | 25 | #define INTERVAL_MSEC 20 26 | #define COMMIT_TIME (600 / INTERVAL_MSEC) 27 | 28 | #define ROWS 5 29 | #define COLS 10 30 | 31 | const char* characters[ROWS * COLS] = { 32 | "a", "i", "u", "e", "o", 33 | "ka", "ki", "ku", "ke", "ko", 34 | "sa", "si", "su", "se", "so", 35 | "ta", "ti", "tu", "te", "to", 36 | "na", "ni", "nu", "ne", "no", 37 | "ha", "hi", "hu", "he", "ho", 38 | "ma", "mi", "mu", "me", "mo", 39 | "ya", "ya", "yu", "yu", "yo", 40 | "ra", "ri", "ru", "re", "ro", 41 | "wa", "wo", "nn", ",", "." 42 | }; 43 | 44 | int column = 0; 45 | int vowel = 0; 46 | int release_duration = 0; 47 | 48 | void setup() { 49 | Serial.begin(115200); 50 | pinMode(PIN_LED, OUTPUT); 51 | column = 0; 52 | vowel = 0; 53 | } 54 | 55 | float getVoltage(int ch) { 56 | return analogRead(ch) * V_REF / 1023; 57 | } 58 | 59 | float getAverageVoltage(int ch) { 60 | float sum = 0.0; 61 | for (int i = 0; i < N_AD_SAMPLES; i++) { 62 | sum += getVoltage(ch); 63 | } 64 | return sum / N_AD_SAMPLES; 65 | } 66 | 67 | float voltageToLength(float voltage) { 68 | return 648 - voltage * 268; 69 | } 70 | 71 | void loop() { 72 | float length = voltageToLength(getAverageVoltage(0)); 73 | if (length > 350) { 74 | digitalWrite(PIN_LED, LOW); 75 | } else { 76 | digitalWrite(PIN_LED, HIGH); 77 | if (length < 50) { 78 | if (vowel > 0) { 79 | vowel = 0; 80 | column ++; 81 | if (column >= COLS) { 82 | column = 0; 83 | } 84 | release_duration = 0; 85 | } else if (release_duration > COMMIT_TIME) { 86 | vowel = 0; 87 | column = 0; 88 | } else if (column > 0) { 89 | release_duration ++; 90 | } 91 | } else { 92 | int target_vowel = (length - 80) / 40 + 1; 93 | if (target_vowel > 5) target_vowel = 5; 94 | if (vowel < target_vowel) { 95 | if (column > 0 || vowel > 0) { 96 | Serial.print("\b"); 97 | } 98 | vowel ++; 99 | int current_character = vowel - 1 + column * 5; 100 | Serial.print(characters[current_character]); 101 | } 102 | } 103 | } 104 | delay(INTERVAL_MSEC); 105 | } 106 | 107 | -------------------------------------------------------------------------------- /mozc-piropiro/assembly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/assembly.png -------------------------------------------------------------------------------- /mozc-piropiro/circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/circuit.png -------------------------------------------------------------------------------- /mozc-piropiro/example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/example.jpg -------------------------------------------------------------------------------- /mozc-piropiro/stl/arm.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/stl/arm.stl -------------------------------------------------------------------------------- /mozc-piropiro/stl/base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/stl/base.stl -------------------------------------------------------------------------------- /mozc-piropiro/stl/holder1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/stl/holder1.stl -------------------------------------------------------------------------------- /mozc-piropiro/stl/holder2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/stl/holder2.stl -------------------------------------------------------------------------------- /mozc-piropiro/stl/sensor_bracket.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-piropiro/stl/sensor_bracket.stl -------------------------------------------------------------------------------- /mozc-yunomi/README.md: -------------------------------------------------------------------------------- 1 | # Gboard Yunomi version 2 | 3 | This contains programs, schematics and board layouts for Gboard Yunomi version, 4 | which was released on **Oct 1, 2021**. 5 | 6 | This is not an officially supported Google product. 7 | 8 | ## Contents 9 | 10 | The directory structure is as follows: 11 | 12 | - firmware/ : Arduino sketch. 13 | - board/ : KiCad schematics and PCB layouts. 14 | - jig.stl : A jig for building the keyboards. 15 | - ../third_party/mozc-yunomi/keyswitches.pretty : Footprint data for the key 16 | switches. 17 | 18 | ## Building Gboard Yunomi Version 19 | 20 | ![device](./images/device.jpg) 21 | 22 | **We also have the Pro Micro version of the device, which is easier to build. Please refer to [the Pro Micro README](./README_promicro.md) if you want to build one with Pro Micro.** 23 | 24 | ### Parts 25 | 26 | - Kailh choc key x60 27 | - Diode (1N4148) x60 28 | - ATMega32U4-AU (QFP) 29 | - Resistor 10kOhm 30 | - Resistor 22Ohm x2 31 | - Capacitor 0.1uF 32 | - Capacitor 1uF x2 33 | - Capacitor 22pF x2 34 | - Crystal 16MHz (HC-49) 35 | - USB-C connector breakout (4pin) 36 | 37 | ### PCBs 38 | 39 | We need two types of PCBs to build this project. 40 | 41 | ![pcbs](./images/pcbs.jpg) 42 | 43 | #### Key-PCB 44 | 45 | ![key-pcb](./images/key-pcb.png) 46 | 47 | File location: board/key 48 | 49 | Shape: Rectangular. 50 | 51 | Components: Diodes and key switches. 52 | 53 | Number of PCBs required: 12 54 | 55 | #### Base-PCB: 56 | 57 | ![base-pcb](./images/base-pcb.png) 58 | 59 | File location: board/base 60 | 61 | Shape: Dodecagonal 62 | 63 | Component2: ATMega32u4. 64 | 65 | ### Steps to build 66 | 67 | #### Step 1 68 | 69 | Solder diodes D1 to D5 onto the twelve Key-PCBs at the silk-screened locations. 70 | 71 | *IMPORTANT:* Diodes on six of the Key-PCB should be placed in the opposite 72 | direction. 73 | 74 | For six of the PCBs, we can solder diodes as indicated by the silk-screen. For 75 | the other six PCBs, we need to solder the diodes in the opposite direction. 76 | 77 | #### Step 2 78 | 79 | Solder key-switches to each Key-PCB. Note that the diodes need to be placed on 80 | the opposite side of the Key-PCB to the key-switches, as shown by the 81 | silk-screen. 82 | 83 | #### Step 3 84 | 85 | Create a cylindrical shape by combining the 12 Key-PCBs. 86 | 87 | There are six connection points between each pair of Key-PCBs. Connect adjacent 88 | pairs of boards by soldering the tin-plated wires (see the picture). 89 | 90 | However, only connect J11 and J12 between the first and last Key-PCB, instead of 91 | all six locations. 92 | 93 | ![connect](./images/connect.png) 94 | 95 | ![connect2](./images/connect2.jpg) 96 | 97 | ![connect3](./images/connect3.jpg) 98 | 99 | If you have a 3D printer, you may print and use jig.stl to help with this step. 100 | 101 | #### Step 4 102 | 103 | Solder all parts for Base-PCB. 104 | 105 | #### Step 5 106 | 107 | Connect Base-PCB to the cylinder made in Step 3. 108 | 109 | ![connect4](./images/connect4.jpg) 110 | 111 | #### Step 6 112 | 113 | Install the 114 | [Arduino caterina bootloader](https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/caterina/Caterina-Leonardo.hex) 115 | using AVRISP or other ISP tool. 116 | 117 | #### Step 7 118 | 119 | Install firmware using the Arduino IDE. 120 | 121 | #### Step 8 122 | 123 | Connect the keyboard to a PC or other device that has Google Japanese 124 | Input/Gboard installed. 125 | 126 | ## License 127 | 128 | ``` 129 | Licensed under the Apache License, Version 2.0 (the "License"); you may 130 | not use this file except in compliance with the License. You may obtain 131 | a copy of the License at 132 | 133 | http://www.apache.org/licenses/LICENSE-2.0 134 | 135 | Unless required by applicable law or agreed to in writing, software 136 | distributed under the License is distributed on an "AS IS" BASIS, 137 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138 | See the License for the specific language governing permissions and 139 | limitations under the License. 140 | ``` 141 | -------------------------------------------------------------------------------- /mozc-yunomi/README_promicro.md: -------------------------------------------------------------------------------- 1 | # Gboard Yunomi version with Pro Micro 2 | 3 | This is an instruction to build the Gboard Yunomi version with Pro Micro. 4 | For the general information about the Gboard Yunomi version, please refer to [the project README](./README.md). 5 | 6 | 7 | ### Parts 8 | 9 | - Kailh choc key x60 10 | - Diode (1N4148) x60 11 | - Pro Micro x1 12 | 13 | ### PCBs 14 | 15 | We need two types of PCBs to build this project. 16 | 17 | ![pcbs](./images/pcbs_promicro.jpg) 18 | 19 | #### Key-PCB 20 | 21 | ![key-pcb](./images/key-pcb.png) 22 | 23 | File location: board/key 24 | 25 | Shape: Rectangular 26 | 27 | Components to be soldered: Diodes and key switches 28 | 29 | Number of PCBs required: 12 30 | 31 | #### Base-PCB: 32 | 33 | ![base-pcb](./images/base-pcb_promicro.png) 34 | 35 | File location: board/base-promicro 36 | 37 | Shape: Dodecagonal 38 | 39 | Components to be soldered: Pro Micro 40 | 41 | Number of PCBs required: 1 42 | 43 | ### Steps to build 44 | 45 | #### Step 1 46 | 47 | Solder diodes D1 to D5 onto the twelve Key-PCBs at the silk-screened locations. 48 | 49 | *IMPORTANT:* Diodes on six of the Key-PCBs should be placed in the opposite 50 | direction. 51 | 52 | In other words, you can solder diodes as indicated by the silk-screen for six of them, and you need to solder diodes in the opposite direction for the rest six. 53 | 54 | #### Step 2 55 | 56 | Solder key-switches to each Key-PCB. Note that the diodes need to be placed on 57 | the opposite side of the Key-PCB to the key-switches, as shown by the 58 | silk-screen. 59 | 60 | #### Step 3 61 | 62 | Create a cylindrical shape by combining the 12 Key-PCBs. 63 | 64 | There are six connection points between each pair of Key-PCBs. Connect adjacent 65 | pairs of boards by soldering the tin-plated wires (see the picture). 66 | 67 | However, only connect J11 and J12 between the first and last Key-PCB, instead of 68 | all six locations. 69 | 70 | ![connect](./images/connect.png) 71 | 72 | ![connect2](./images/connect2.jpg) 73 | 74 | ![connect3](./images/connect3.jpg) 75 | 76 | If you have a 3D printer, you may print and use jig.stl to help with this step. 77 | 78 | #### Step 4 79 | 80 | Solder a Pro Micro to the Base-PCB. 81 | 82 | #### Step 5 83 | 84 | Connect Base-PCB to the cylinder made in Step 3. 85 | 86 | ![connect4](./images/connect4_promicro.jpg) 87 | 88 | #### Step 6 89 | 90 | Install [firmware](./firmware/firmware.ino) using the Arduino IDE. Note that you need to uncomment the line 2 (`#define PRO_MICRO`) to make it work with the Pro Micro version. 91 | 92 | #### Step 7 (Optional) 93 | 94 | Print and mount the platform (./platform_promicro.stl). 95 | 96 | ![platform](./images/platform_promicro.jpg) 97 | 98 | #### Step 8 99 | 100 | Connect the keyboard to a PC or other device that has Google Japanese 101 | Input/Gboard installed. Enjoy! 102 | -------------------------------------------------------------------------------- /mozc-yunomi/board/.gitignore: -------------------------------------------------------------------------------- 1 | *.000 2 | *.bak 3 | *.bck 4 | *.kicad_pcb-bak 5 | *.kicad_sch-bak 6 | *.kicad_prl 7 | *.sch-bak 8 | *~ 9 | _autosave-* 10 | *.tmp 11 | *-save.pro 12 | *-save.kicad_pcb 13 | fp-info-cache 14 | -------------------------------------------------------------------------------- /mozc-yunomi/board/base-promicro/base-promicro.pro: -------------------------------------------------------------------------------- 1 | update=2019年11月13日 11時01分37秒 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [schematic_editor] 16 | version=1 17 | PageLayoutDescrFile= 18 | PlotDirectoryName= 19 | SubpartIdSeparator=0 20 | SubpartFirstId=65 21 | NetFmtName=Pcbnew 22 | SpiceAjustPassiveValues=0 23 | LabSize=50 24 | ERC_TestSimilarLabels=1 25 | [pcbnew] 26 | version=1 27 | PageLayoutDescrFile= 28 | LastNetListRead=base-promicro.net 29 | CopperLayerCount=2 30 | BoardThickness=1.6 31 | AllowMicroVias=0 32 | AllowBlindVias=0 33 | RequireCourtyardDefinitions=0 34 | ProhibitOverlappingCourtyards=1 35 | MinTrackWidth=0.2 36 | MinViaDiameter=0.4 37 | MinViaDrill=0.3 38 | MinMicroViaDiameter=0.2 39 | MinMicroViaDrill=0.09999999999999999 40 | MinHoleToHole=0.25 41 | TrackWidth1=0.25 42 | ViaDiameter1=0.8 43 | ViaDrill1=0.4 44 | dPairWidth1=0.2 45 | dPairGap1=0.25 46 | dPairViaGap1=0.25 47 | SilkLineWidth=0.12 48 | SilkTextSizeV=1 49 | SilkTextSizeH=1 50 | SilkTextSizeThickness=0.15 51 | SilkTextItalic=0 52 | SilkTextUpright=1 53 | CopperLineWidth=0.2 54 | CopperTextSizeV=1.5 55 | CopperTextSizeH=1.5 56 | CopperTextThickness=0.3 57 | CopperTextItalic=0 58 | CopperTextUpright=1 59 | EdgeCutLineWidth=0.05 60 | CourtyardLineWidth=0.05 61 | OthersLineWidth=0.15 62 | OthersTextSizeV=1 63 | OthersTextSizeH=1 64 | OthersTextSizeThickness=0.15 65 | OthersTextItalic=0 66 | OthersTextUpright=1 67 | SolderMaskClearance=0.051 68 | SolderMaskMinWidth=0.25 69 | SolderPasteClearance=0 70 | SolderPasteRatio=-0 71 | [pcbnew/Layer.F.Cu] 72 | Name=F.Cu 73 | Type=0 74 | Enabled=1 75 | [pcbnew/Layer.In1.Cu] 76 | Name=In1.Cu 77 | Type=0 78 | Enabled=0 79 | [pcbnew/Layer.In2.Cu] 80 | Name=In2.Cu 81 | Type=0 82 | Enabled=0 83 | [pcbnew/Layer.In3.Cu] 84 | Name=In3.Cu 85 | Type=0 86 | Enabled=0 87 | [pcbnew/Layer.In4.Cu] 88 | Name=In4.Cu 89 | Type=0 90 | Enabled=0 91 | [pcbnew/Layer.In5.Cu] 92 | Name=In5.Cu 93 | Type=0 94 | Enabled=0 95 | [pcbnew/Layer.In6.Cu] 96 | Name=In6.Cu 97 | Type=0 98 | Enabled=0 99 | [pcbnew/Layer.In7.Cu] 100 | Name=In7.Cu 101 | Type=0 102 | Enabled=0 103 | [pcbnew/Layer.In8.Cu] 104 | Name=In8.Cu 105 | Type=0 106 | Enabled=0 107 | [pcbnew/Layer.In9.Cu] 108 | Name=In9.Cu 109 | Type=0 110 | Enabled=0 111 | [pcbnew/Layer.In10.Cu] 112 | Name=In10.Cu 113 | Type=0 114 | Enabled=0 115 | [pcbnew/Layer.In11.Cu] 116 | Name=In11.Cu 117 | Type=0 118 | Enabled=0 119 | [pcbnew/Layer.In12.Cu] 120 | Name=In12.Cu 121 | Type=0 122 | Enabled=0 123 | [pcbnew/Layer.In13.Cu] 124 | Name=In13.Cu 125 | Type=0 126 | Enabled=0 127 | [pcbnew/Layer.In14.Cu] 128 | Name=In14.Cu 129 | Type=0 130 | Enabled=0 131 | [pcbnew/Layer.In15.Cu] 132 | Name=In15.Cu 133 | Type=0 134 | Enabled=0 135 | [pcbnew/Layer.In16.Cu] 136 | Name=In16.Cu 137 | Type=0 138 | Enabled=0 139 | [pcbnew/Layer.In17.Cu] 140 | Name=In17.Cu 141 | Type=0 142 | Enabled=0 143 | [pcbnew/Layer.In18.Cu] 144 | Name=In18.Cu 145 | Type=0 146 | Enabled=0 147 | [pcbnew/Layer.In19.Cu] 148 | Name=In19.Cu 149 | Type=0 150 | Enabled=0 151 | [pcbnew/Layer.In20.Cu] 152 | Name=In20.Cu 153 | Type=0 154 | Enabled=0 155 | [pcbnew/Layer.In21.Cu] 156 | Name=In21.Cu 157 | Type=0 158 | Enabled=0 159 | [pcbnew/Layer.In22.Cu] 160 | Name=In22.Cu 161 | Type=0 162 | Enabled=0 163 | [pcbnew/Layer.In23.Cu] 164 | Name=In23.Cu 165 | Type=0 166 | Enabled=0 167 | [pcbnew/Layer.In24.Cu] 168 | Name=In24.Cu 169 | Type=0 170 | Enabled=0 171 | [pcbnew/Layer.In25.Cu] 172 | Name=In25.Cu 173 | Type=0 174 | Enabled=0 175 | [pcbnew/Layer.In26.Cu] 176 | Name=In26.Cu 177 | Type=0 178 | Enabled=0 179 | [pcbnew/Layer.In27.Cu] 180 | Name=In27.Cu 181 | Type=0 182 | Enabled=0 183 | [pcbnew/Layer.In28.Cu] 184 | Name=In28.Cu 185 | Type=0 186 | Enabled=0 187 | [pcbnew/Layer.In29.Cu] 188 | Name=In29.Cu 189 | Type=0 190 | Enabled=0 191 | [pcbnew/Layer.In30.Cu] 192 | Name=In30.Cu 193 | Type=0 194 | Enabled=0 195 | [pcbnew/Layer.B.Cu] 196 | Name=B.Cu 197 | Type=0 198 | Enabled=1 199 | [pcbnew/Layer.B.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.F.Adhes] 202 | Enabled=1 203 | [pcbnew/Layer.B.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.F.Paste] 206 | Enabled=1 207 | [pcbnew/Layer.B.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.F.SilkS] 210 | Enabled=1 211 | [pcbnew/Layer.B.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.F.Mask] 214 | Enabled=1 215 | [pcbnew/Layer.Dwgs.User] 216 | Enabled=1 217 | [pcbnew/Layer.Cmts.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco1.User] 220 | Enabled=1 221 | [pcbnew/Layer.Eco2.User] 222 | Enabled=1 223 | [pcbnew/Layer.Edge.Cuts] 224 | Enabled=1 225 | [pcbnew/Layer.Margin] 226 | Enabled=1 227 | [pcbnew/Layer.B.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.F.CrtYd] 230 | Enabled=1 231 | [pcbnew/Layer.B.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.F.Fab] 234 | Enabled=1 235 | [pcbnew/Layer.Rescue] 236 | Enabled=0 237 | [pcbnew/Netclasses] 238 | [pcbnew/Netclasses/Default] 239 | Name=Default 240 | Clearance=0.2 241 | TrackWidth=0.25 242 | ViaDiameter=0.8 243 | ViaDrill=0.4 244 | uViaDiameter=0.3 245 | uViaDrill=0.1 246 | dPairWidth=0.2 247 | dPairGap=0.25 248 | dPairViaGap=0.25 249 | -------------------------------------------------------------------------------- /mozc-yunomi/board/base/base.pro: -------------------------------------------------------------------------------- 1 | update=2019年11月13日 11時01分37秒 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [schematic_editor] 16 | version=1 17 | PageLayoutDescrFile= 18 | PlotDirectoryName= 19 | SubpartIdSeparator=0 20 | SubpartFirstId=65 21 | NetFmtName=Pcbnew 22 | SpiceAjustPassiveValues=0 23 | LabSize=50 24 | ERC_TestSimilarLabels=1 25 | [pcbnew] 26 | version=1 27 | PageLayoutDescrFile= 28 | LastNetListRead=base.net 29 | CopperLayerCount=2 30 | BoardThickness=1.6 31 | AllowMicroVias=0 32 | AllowBlindVias=0 33 | RequireCourtyardDefinitions=0 34 | ProhibitOverlappingCourtyards=1 35 | MinTrackWidth=0.2 36 | MinViaDiameter=0.4 37 | MinViaDrill=0.3 38 | MinMicroViaDiameter=0.2 39 | MinMicroViaDrill=0.09999999999999999 40 | MinHoleToHole=0.25 41 | TrackWidth1=0.25 42 | ViaDiameter1=0.8 43 | ViaDrill1=0.4 44 | dPairWidth1=0.2 45 | dPairGap1=0.25 46 | dPairViaGap1=0.25 47 | SilkLineWidth=0.12 48 | SilkTextSizeV=1 49 | SilkTextSizeH=1 50 | SilkTextSizeThickness=0.15 51 | SilkTextItalic=0 52 | SilkTextUpright=1 53 | CopperLineWidth=0.2 54 | CopperTextSizeV=1.5 55 | CopperTextSizeH=1.5 56 | CopperTextThickness=0.3 57 | CopperTextItalic=0 58 | CopperTextUpright=1 59 | EdgeCutLineWidth=0.05 60 | CourtyardLineWidth=0.05 61 | OthersLineWidth=0.15 62 | OthersTextSizeV=1 63 | OthersTextSizeH=1 64 | OthersTextSizeThickness=0.15 65 | OthersTextItalic=0 66 | OthersTextUpright=1 67 | SolderMaskClearance=0.051 68 | SolderMaskMinWidth=0.25 69 | SolderPasteClearance=0 70 | SolderPasteRatio=-0 71 | [pcbnew/Layer.F.Cu] 72 | Name=F.Cu 73 | Type=0 74 | Enabled=1 75 | [pcbnew/Layer.In1.Cu] 76 | Name=In1.Cu 77 | Type=0 78 | Enabled=0 79 | [pcbnew/Layer.In2.Cu] 80 | Name=In2.Cu 81 | Type=0 82 | Enabled=0 83 | [pcbnew/Layer.In3.Cu] 84 | Name=In3.Cu 85 | Type=0 86 | Enabled=0 87 | [pcbnew/Layer.In4.Cu] 88 | Name=In4.Cu 89 | Type=0 90 | Enabled=0 91 | [pcbnew/Layer.In5.Cu] 92 | Name=In5.Cu 93 | Type=0 94 | Enabled=0 95 | [pcbnew/Layer.In6.Cu] 96 | Name=In6.Cu 97 | Type=0 98 | Enabled=0 99 | [pcbnew/Layer.In7.Cu] 100 | Name=In7.Cu 101 | Type=0 102 | Enabled=0 103 | [pcbnew/Layer.In8.Cu] 104 | Name=In8.Cu 105 | Type=0 106 | Enabled=0 107 | [pcbnew/Layer.In9.Cu] 108 | Name=In9.Cu 109 | Type=0 110 | Enabled=0 111 | [pcbnew/Layer.In10.Cu] 112 | Name=In10.Cu 113 | Type=0 114 | Enabled=0 115 | [pcbnew/Layer.In11.Cu] 116 | Name=In11.Cu 117 | Type=0 118 | Enabled=0 119 | [pcbnew/Layer.In12.Cu] 120 | Name=In12.Cu 121 | Type=0 122 | Enabled=0 123 | [pcbnew/Layer.In13.Cu] 124 | Name=In13.Cu 125 | Type=0 126 | Enabled=0 127 | [pcbnew/Layer.In14.Cu] 128 | Name=In14.Cu 129 | Type=0 130 | Enabled=0 131 | [pcbnew/Layer.In15.Cu] 132 | Name=In15.Cu 133 | Type=0 134 | Enabled=0 135 | [pcbnew/Layer.In16.Cu] 136 | Name=In16.Cu 137 | Type=0 138 | Enabled=0 139 | [pcbnew/Layer.In17.Cu] 140 | Name=In17.Cu 141 | Type=0 142 | Enabled=0 143 | [pcbnew/Layer.In18.Cu] 144 | Name=In18.Cu 145 | Type=0 146 | Enabled=0 147 | [pcbnew/Layer.In19.Cu] 148 | Name=In19.Cu 149 | Type=0 150 | Enabled=0 151 | [pcbnew/Layer.In20.Cu] 152 | Name=In20.Cu 153 | Type=0 154 | Enabled=0 155 | [pcbnew/Layer.In21.Cu] 156 | Name=In21.Cu 157 | Type=0 158 | Enabled=0 159 | [pcbnew/Layer.In22.Cu] 160 | Name=In22.Cu 161 | Type=0 162 | Enabled=0 163 | [pcbnew/Layer.In23.Cu] 164 | Name=In23.Cu 165 | Type=0 166 | Enabled=0 167 | [pcbnew/Layer.In24.Cu] 168 | Name=In24.Cu 169 | Type=0 170 | Enabled=0 171 | [pcbnew/Layer.In25.Cu] 172 | Name=In25.Cu 173 | Type=0 174 | Enabled=0 175 | [pcbnew/Layer.In26.Cu] 176 | Name=In26.Cu 177 | Type=0 178 | Enabled=0 179 | [pcbnew/Layer.In27.Cu] 180 | Name=In27.Cu 181 | Type=0 182 | Enabled=0 183 | [pcbnew/Layer.In28.Cu] 184 | Name=In28.Cu 185 | Type=0 186 | Enabled=0 187 | [pcbnew/Layer.In29.Cu] 188 | Name=In29.Cu 189 | Type=0 190 | Enabled=0 191 | [pcbnew/Layer.In30.Cu] 192 | Name=In30.Cu 193 | Type=0 194 | Enabled=0 195 | [pcbnew/Layer.B.Cu] 196 | Name=B.Cu 197 | Type=0 198 | Enabled=1 199 | [pcbnew/Layer.B.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.F.Adhes] 202 | Enabled=1 203 | [pcbnew/Layer.B.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.F.Paste] 206 | Enabled=1 207 | [pcbnew/Layer.B.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.F.SilkS] 210 | Enabled=1 211 | [pcbnew/Layer.B.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.F.Mask] 214 | Enabled=1 215 | [pcbnew/Layer.Dwgs.User] 216 | Enabled=1 217 | [pcbnew/Layer.Cmts.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco1.User] 220 | Enabled=1 221 | [pcbnew/Layer.Eco2.User] 222 | Enabled=1 223 | [pcbnew/Layer.Edge.Cuts] 224 | Enabled=1 225 | [pcbnew/Layer.Margin] 226 | Enabled=1 227 | [pcbnew/Layer.B.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.F.CrtYd] 230 | Enabled=1 231 | [pcbnew/Layer.B.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.F.Fab] 234 | Enabled=1 235 | [pcbnew/Layer.Rescue] 236 | Enabled=0 237 | [pcbnew/Netclasses] 238 | [pcbnew/Netclasses/Default] 239 | Name=Default 240 | Clearance=0.2 241 | TrackWidth=0.25 242 | ViaDiameter=0.8 243 | ViaDrill=0.4 244 | uViaDiameter=0.3 245 | uViaDrill=0.1 246 | dPairWidth=0.2 247 | dPairGap=0.25 248 | dPairViaGap=0.25 249 | -------------------------------------------------------------------------------- /mozc-yunomi/board/key/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name daprice)(type KiCad)(uri ${KIPRJMOD}/../../../third_party/mozc-yunomi/daprice-keyswitches.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /mozc-yunomi/board/key/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | ) 3 | -------------------------------------------------------------------------------- /mozc-yunomi/board/key/yunomi.pro: -------------------------------------------------------------------------------- 1 | update=Tue Nov 12 20:59:20 2019 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [schematic_editor] 16 | version=1 17 | PageLayoutDescrFile= 18 | PlotDirectoryName= 19 | SubpartIdSeparator=0 20 | SubpartFirstId=65 21 | NetFmtName=Pcbnew 22 | SpiceAjustPassiveValues=0 23 | LabSize=50 24 | ERC_TestSimilarLabels=1 25 | [pcbnew] 26 | version=1 27 | PageLayoutDescrFile= 28 | LastNetListRead=yunomi.net 29 | CopperLayerCount=2 30 | BoardThickness=1.6 31 | AllowMicroVias=0 32 | AllowBlindVias=0 33 | RequireCourtyardDefinitions=0 34 | ProhibitOverlappingCourtyards=1 35 | MinTrackWidth=0.2 36 | MinViaDiameter=0.4 37 | MinViaDrill=0.3 38 | MinMicroViaDiameter=0.2 39 | MinMicroViaDrill=0.09999999999999999 40 | MinHoleToHole=0.25 41 | TrackWidth1=0.25 42 | ViaDiameter1=0.8 43 | ViaDrill1=0.4 44 | dPairWidth1=0.2 45 | dPairGap1=0.25 46 | dPairViaGap1=0.25 47 | SilkLineWidth=0.12 48 | SilkTextSizeV=1 49 | SilkTextSizeH=1 50 | SilkTextSizeThickness=0.15 51 | SilkTextItalic=0 52 | SilkTextUpright=1 53 | CopperLineWidth=0.2 54 | CopperTextSizeV=1.5 55 | CopperTextSizeH=1.5 56 | CopperTextThickness=0.3 57 | CopperTextItalic=0 58 | CopperTextUpright=1 59 | EdgeCutLineWidth=0.05 60 | CourtyardLineWidth=0.05 61 | OthersLineWidth=0.15 62 | OthersTextSizeV=1 63 | OthersTextSizeH=1 64 | OthersTextSizeThickness=0.15 65 | OthersTextItalic=0 66 | OthersTextUpright=1 67 | SolderMaskClearance=0.051 68 | SolderMaskMinWidth=0.25 69 | SolderPasteClearance=0 70 | SolderPasteRatio=-0 71 | [pcbnew/Layer.F.Cu] 72 | Name=F.Cu 73 | Type=0 74 | Enabled=1 75 | [pcbnew/Layer.In1.Cu] 76 | Name=In1.Cu 77 | Type=0 78 | Enabled=0 79 | [pcbnew/Layer.In2.Cu] 80 | Name=In2.Cu 81 | Type=0 82 | Enabled=0 83 | [pcbnew/Layer.In3.Cu] 84 | Name=In3.Cu 85 | Type=0 86 | Enabled=0 87 | [pcbnew/Layer.In4.Cu] 88 | Name=In4.Cu 89 | Type=0 90 | Enabled=0 91 | [pcbnew/Layer.In5.Cu] 92 | Name=In5.Cu 93 | Type=0 94 | Enabled=0 95 | [pcbnew/Layer.In6.Cu] 96 | Name=In6.Cu 97 | Type=0 98 | Enabled=0 99 | [pcbnew/Layer.In7.Cu] 100 | Name=In7.Cu 101 | Type=0 102 | Enabled=0 103 | [pcbnew/Layer.In8.Cu] 104 | Name=In8.Cu 105 | Type=0 106 | Enabled=0 107 | [pcbnew/Layer.In9.Cu] 108 | Name=In9.Cu 109 | Type=0 110 | Enabled=0 111 | [pcbnew/Layer.In10.Cu] 112 | Name=In10.Cu 113 | Type=0 114 | Enabled=0 115 | [pcbnew/Layer.In11.Cu] 116 | Name=In11.Cu 117 | Type=0 118 | Enabled=0 119 | [pcbnew/Layer.In12.Cu] 120 | Name=In12.Cu 121 | Type=0 122 | Enabled=0 123 | [pcbnew/Layer.In13.Cu] 124 | Name=In13.Cu 125 | Type=0 126 | Enabled=0 127 | [pcbnew/Layer.In14.Cu] 128 | Name=In14.Cu 129 | Type=0 130 | Enabled=0 131 | [pcbnew/Layer.In15.Cu] 132 | Name=In15.Cu 133 | Type=0 134 | Enabled=0 135 | [pcbnew/Layer.In16.Cu] 136 | Name=In16.Cu 137 | Type=0 138 | Enabled=0 139 | [pcbnew/Layer.In17.Cu] 140 | Name=In17.Cu 141 | Type=0 142 | Enabled=0 143 | [pcbnew/Layer.In18.Cu] 144 | Name=In18.Cu 145 | Type=0 146 | Enabled=0 147 | [pcbnew/Layer.In19.Cu] 148 | Name=In19.Cu 149 | Type=0 150 | Enabled=0 151 | [pcbnew/Layer.In20.Cu] 152 | Name=In20.Cu 153 | Type=0 154 | Enabled=0 155 | [pcbnew/Layer.In21.Cu] 156 | Name=In21.Cu 157 | Type=0 158 | Enabled=0 159 | [pcbnew/Layer.In22.Cu] 160 | Name=In22.Cu 161 | Type=0 162 | Enabled=0 163 | [pcbnew/Layer.In23.Cu] 164 | Name=In23.Cu 165 | Type=0 166 | Enabled=0 167 | [pcbnew/Layer.In24.Cu] 168 | Name=In24.Cu 169 | Type=0 170 | Enabled=0 171 | [pcbnew/Layer.In25.Cu] 172 | Name=In25.Cu 173 | Type=0 174 | Enabled=0 175 | [pcbnew/Layer.In26.Cu] 176 | Name=In26.Cu 177 | Type=0 178 | Enabled=0 179 | [pcbnew/Layer.In27.Cu] 180 | Name=In27.Cu 181 | Type=0 182 | Enabled=0 183 | [pcbnew/Layer.In28.Cu] 184 | Name=In28.Cu 185 | Type=0 186 | Enabled=0 187 | [pcbnew/Layer.In29.Cu] 188 | Name=In29.Cu 189 | Type=0 190 | Enabled=0 191 | [pcbnew/Layer.In30.Cu] 192 | Name=In30.Cu 193 | Type=0 194 | Enabled=0 195 | [pcbnew/Layer.B.Cu] 196 | Name=B.Cu 197 | Type=0 198 | Enabled=1 199 | [pcbnew/Layer.B.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.F.Adhes] 202 | Enabled=1 203 | [pcbnew/Layer.B.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.F.Paste] 206 | Enabled=1 207 | [pcbnew/Layer.B.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.F.SilkS] 210 | Enabled=1 211 | [pcbnew/Layer.B.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.F.Mask] 214 | Enabled=1 215 | [pcbnew/Layer.Dwgs.User] 216 | Enabled=1 217 | [pcbnew/Layer.Cmts.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco1.User] 220 | Enabled=1 221 | [pcbnew/Layer.Eco2.User] 222 | Enabled=1 223 | [pcbnew/Layer.Edge.Cuts] 224 | Enabled=1 225 | [pcbnew/Layer.Margin] 226 | Enabled=1 227 | [pcbnew/Layer.B.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.F.CrtYd] 230 | Enabled=1 231 | [pcbnew/Layer.B.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.F.Fab] 234 | Enabled=1 235 | [pcbnew/Layer.Rescue] 236 | Enabled=0 237 | [pcbnew/Netclasses] 238 | [pcbnew/Netclasses/Default] 239 | Name=Default 240 | Clearance=0.5 241 | TrackWidth=0.25 242 | ViaDiameter=0.8 243 | ViaDrill=0.4 244 | uViaDiameter=0.3 245 | uViaDrill=0.1 246 | dPairWidth=0.2 247 | dPairGap=0.25 248 | dPairViaGap=0.25 249 | -------------------------------------------------------------------------------- /mozc-yunomi/images/base-pcb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/base-pcb.png -------------------------------------------------------------------------------- /mozc-yunomi/images/base-pcb_promicro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/base-pcb_promicro.png -------------------------------------------------------------------------------- /mozc-yunomi/images/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/connect.png -------------------------------------------------------------------------------- /mozc-yunomi/images/connect2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/connect2.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/connect3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/connect3.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/connect4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/connect4.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/connect4_promicro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/connect4_promicro.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/device.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/device.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/key-pcb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/key-pcb.png -------------------------------------------------------------------------------- /mozc-yunomi/images/pcbs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/pcbs.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/pcbs_promicro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/pcbs_promicro.jpg -------------------------------------------------------------------------------- /mozc-yunomi/images/platform_promicro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/mozc-yunomi/images/platform_promicro.jpg -------------------------------------------------------------------------------- /third_party/.gitignore: -------------------------------------------------------------------------------- 1 | # Object files 2 | *.o 3 | *.ko 4 | *.obj 5 | *.elf 6 | 7 | # Libraries 8 | *.lib 9 | *.a 10 | *.la 11 | *.lo 12 | 13 | # Shared objects (inc. Windows DLLs) 14 | *.dll 15 | *.so 16 | *.so.* 17 | *.dylib 18 | 19 | # Executables 20 | *.exe 21 | *.out 22 | *.app 23 | *.i*86 24 | *.x86_64 25 | *.hex 26 | 27 | _build 28 | -------------------------------------------------------------------------------- /third_party/mozc-flap/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2013 Google Inc. 3 | # 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of the GNU General Public License 6 | # as published by the Free Software Foundation; either version 2 7 | # of the License, or (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | # MA 02110-1301, USA. 18 | # 19 | 20 | 21 | DEVICE = attiny2313 22 | F_CPU = 12000000 # in Hz 23 | 24 | AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer 25 | 26 | USBDRV_DIR = ../third_party/usbdrv 27 | 28 | CFLAGS = -I$(USBDRV_DIR) -I. -DDEBUG_LEVEL=0 29 | 30 | 31 | OBJECTS = $(USBDRV_DIR)/usbdrv.o $(USBDRV_DIR)/usbdrvasm.o $(USBDRV_DIR)/oddebug.o usb_keyboard.o flap.o 32 | 33 | COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) 34 | 35 | FUSE_L = 0xef 36 | FUSE_H = 0xdb 37 | # ATTiny2313 FUSE_L (Fuse low byte): 38 | # 0xef = 1 1 1 0 1 1 1 1 39 | # ^ ^ \+/ \--+--/ 40 | # | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) 41 | # | | +--------------- SUT 1..0 (BOD enabled, fast rising power) 42 | # | +------------------ CKOUT (clock output on CKOUT pin -> disabled) 43 | # +-------------------- CKDIV8 (divide clock by 8 -> don't divide) 44 | # ATTiny2313 FUSE_H (Fuse high byte): 45 | # 0xdb = 1 1 0 1 1 0 1 1 46 | # ^ ^ ^ ^ \-+-/ ^ 47 | # | | | | | +---- RSTDISBL (disable external reset -> enabled) 48 | # | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) 49 | # | | | +-------------- WDTON (watchdog timer always on -> disable) 50 | # | | +---------------- SPIEN (enable serial programming -> enabled) 51 | # | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) 52 | # +-------------------- DWEN (debug wire enable) 53 | 54 | 55 | # symbolic targets: 56 | help: 57 | @echo "This Makefile has no default rule. Use one of the following:" 58 | @echo "make hex ........... to build flap.hex" 59 | @echo "make program ....... to flash fuses and the flap firmware" 60 | @echo "make fuse .......... to flash the fuses" 61 | @echo "make flash ......... to flash the flap firmware" 62 | @echo "make clean ......... to delete objects and hex file" 63 | 64 | hex: flap.hex 65 | 66 | program: flash fuse 67 | 68 | # rule for programming fuse bits: 69 | fuse: 70 | @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ 71 | { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } 72 | $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m 73 | 74 | # rule for uploading firmware: 75 | flash: flap.hex 76 | $(AVRDUDE) -U flash:w:flap.hex:i 77 | 78 | # rule for deleting dependent files (those which can be built by Make): 79 | clean: 80 | rm -f flap.{hex,lst,obj,cof,list,map,eep.hex,elf,s} $(OBJECTS) $(USBDRV_DIR)/oddebug.s $(USBDRV_DIR)/usbdrv.s 81 | 82 | # Generic rule for compiling C files: 83 | .c.o: 84 | $(COMPILE) -c $< -o $@ 85 | 86 | $(USBDRV_DIR)/usbdrvasm.o: $(USBDRV_DIR)/usbdrvasm.S \ 87 | $(USBDRV_DIR)/usbportability.h $(USBDRV_DIR)/usbdrv.h \ 88 | usbconfig.h $(USBDRV_DIR)/usbdrvasm12.inc \ 89 | $(USBDRV_DIR)/asmcommon.inc 90 | 91 | $(USBDRV_DIR)/oddebug.o: $(USBDRV_DIR)/oddebug.c $(USBDRV_DIR)/oddebug.h \ 92 | $(USBDRV_DIR)/usbportability.h 93 | 94 | $(USBDRV_DIR)/usbdrv.o: $(USBDRV_DIR)/usbdrv.c $(USBDRV_DIR)/usbportability.h \ 95 | $(USBDRV_DIR)/usbdrv.h usbconfig.h $(USBDRV_DIR)/oddebug.h 96 | 97 | usb_keyboard.o: usb_keyboard.c usb_keyboard.h $(USBDRV_DIR)/usbdrv.h \ 98 | usbconfig.h $(USBDRV_DIR)/usbportability.h 99 | 100 | flap.o: flap.c usbconfig.h usb_keyboard.h 101 | 102 | # Generic rule for assembling Assembler source files: 103 | .S.o: 104 | $(COMPILE) -x assembler-with-cpp -c $< -o $@ 105 | # "-x assembler-with-cpp" should not be necessary since this is the default 106 | # file type for the .S (with capital S) extension. However, upper case 107 | # characters are not always preserved on Windows. To ensure WinAVR 108 | # compatibility define the file type manually. 109 | 110 | # Generic rule for compiling C to assembler, used for debugging only. 111 | .c.s: 112 | $(COMPILE) -S $< -o $@ 113 | 114 | # file targets: 115 | 116 | flap.elf: $(OBJECTS) 117 | $(COMPILE) -o flap.elf $(OBJECTS) 118 | 119 | flap.hex: flap.elf 120 | rm -f flap.hex flap.eep.hex 121 | avr-objcopy -j .text -j .data -O ihex flap.elf flap.hex 122 | avr-size flap.hex 123 | -------------------------------------------------------------------------------- /third_party/mozc-flap/Readme.txt: -------------------------------------------------------------------------------- 1 | Copyright 2013 Google Inc. 2 | 3 | This program is free software; you can redistribute it and/or 4 | modify it under the terms of the GNU General Public License 5 | as published by the Free Software Foundation; either version 2 6 | of the License, or (at your option) any later version. 7 | 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | 13 | You should have received a copy of the GNU General Public License 14 | along with this program; if not, write to the Free Software 15 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 16 | MA 02110-1301, USA. 17 | 18 | 19 | ===================================== 20 | Summary 21 | ===================================== 22 | 23 | Circuit diagram and firmware of split-flap display input device for 24 | Google Japanese Input. 25 | 26 | 27 | ===================================== 28 | Files 29 | ===================================== 30 | 31 | * V-USB library files 32 | ../third_party/usbdrv/ 33 | 34 | The directory and files were copied from V-USB files available at 35 | http://www.obdev.at/vusb/ 36 | 37 | * Documents 38 | COPYING ...... Open Source license for this software. 39 | Readme.txt ... The file you are currently reading. 40 | 41 | * Circuit diagram 42 | circuit.png 43 | 44 | * Firmware source codes 45 | Makefile 46 | flap.c 47 | usbconfig.h 48 | usb_keyboard.c 49 | usb_keyboard.h 50 | 51 | 52 | ===================================== 53 | Building & Writing Firmware 54 | ===================================== 55 | 56 | * Building firmware binaries 57 | 58 | AVR-gcc is required. 59 | 60 | $ make hex 61 | 62 | 63 | * Writing to the program memory 64 | 65 | Please refer documents of AVR programmer device you use. 66 | Makefile contains "flash" rule that writes a hex file using Avrdude as an 67 | example. 68 | 69 | 70 | * Programming the fuse bits 71 | 72 | Fuse bits must be configured in order to run the firmware correctly. 73 | 74 | lower byte: 0xef 75 | higher byte: 0xdb 76 | 77 | # ATTiny2313 FUSE_L (Fuse low byte): 78 | # 0xef = 1 1 1 0 1 1 1 1 79 | # ^ ^ \+/ \--+--/ 80 | # | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) 81 | # | | +--------------- SUT 1..0 (BOD enabled, fast rising power) 82 | # | +------------------ CKOUT (clock output on CKOUT pin -> disabled) 83 | # +-------------------- CKDIV8 (divide clock by 8 -> don't divide) 84 | # ATTiny2313 FUSE_H (Fuse high byte): 85 | # 0xdb = 1 1 0 1 1 0 1 1 86 | # ^ ^ ^ ^ \-+-/ ^ 87 | # | | | | | +---- RSTDISBL (disable external reset -> enabled) 88 | # | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) 89 | # | | | +-------------- WDTON (watchdog timer always on -> disable) 90 | # | | +---------------- SPIEN (enable serial programming -> enabled) 91 | # | +------------------ EESAVE (preserve EEPROM on Chip Erase 92 | # | -> not preserved) 93 | # +-------------------- DWEN (debug wire enable) 94 | 95 | Makefile contains "fuse" rule that programs fuse bits using Avrdude as an 96 | example. 97 | 98 | 99 | ================== 100 | References 101 | ================== 102 | 103 | The firmware and circuit diagram has been developed based on V-USB. 104 | 105 | * V-USB 106 | http://www.obdev.at/vusb/ 107 | -------------------------------------------------------------------------------- /third_party/mozc-flap/circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-flap/circuit.png -------------------------------------------------------------------------------- /third_party/mozc-flap/usb_keyboard.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | #include "usb_keyboard.h" 21 | 22 | #include /* for sei() */ 23 | #include 24 | #include /* for _delay_ms() */ 25 | 26 | /* USB report descriptor, size must match usbconfig.h */ 27 | const PROGMEM char usbHidReportDescriptor[35] = { 28 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 29 | 0x09, 0x06, // USAGE (Keyboard) 30 | 0xa1, 0x01, // COLLECTION (Application) 31 | 0x05, 0x07, // USAGE_PAGE (Keyboard) 32 | 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 33 | 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 34 | 0x15, 0x00, // LOGICAL_MINIMUM (0) 35 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) 36 | 0x75, 0x01, // REPORT_SIZE (1) 37 | 0x95, 0x08, // REPORT_COUNT (8) 38 | 0x81, 0x02, // INPUT (Data,Var,Abs) 39 | 0x95, 0x01, // REPORT_COUNT (1) 40 | 0x75, 0x08, // REPORT_SIZE (8) 41 | 0x25, 0x65, // LOGICAL_MAXIMUM (101) 42 | 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 43 | 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 44 | 0x81, 0x00, // INPUT (Data,Ary,Abs) 45 | 0xc0 // END_COLLECTION 46 | }; 47 | 48 | static uchar reportBuffer[2]; 49 | static uchar idleRate; /* repeat rate for keyboards */ 50 | 51 | #define MOD_CONTROL_LEFT (1<<0) 52 | #define MOD_SHIFT_LEFT (1<<1) 53 | #define MOD_ALT_LEFT (1<<2) 54 | #define MOD_GUI_LEFT (1<<3) 55 | #define MOD_CONTROL_RIGHT (1<<4) 56 | #define MOD_SHIFT_RIGHT (1<<5) 57 | #define MOD_ALT_RIGHT (1<<6) 58 | #define MOD_GUI_RIGHT (1<<7) 59 | 60 | uchar keyReport[2]; 61 | 62 | usbMsgLen_t usbFunctionSetup(uchar data[8]) 63 | { 64 | usbRequest_t *rq = (void *)data; 65 | 66 | /* The following requests are never used. But since they are required by 67 | * the specification, we implement them in this example. 68 | */ 69 | if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { 70 | /* class request type */ 71 | /* wValue: ReportType (highbyte), ReportID (lowbyte) */ 72 | if(rq->bRequest == USBRQ_HID_GET_REPORT) { 73 | /* we only have one report type, so don't look at wValue */ 74 | usbMsgPtr = (void *)&reportBuffer; 75 | return sizeof(reportBuffer); 76 | } else if(rq->bRequest == USBRQ_HID_GET_IDLE) { 77 | usbMsgPtr = &idleRate; 78 | return 1; 79 | } else if(rq->bRequest == USBRQ_HID_SET_IDLE) { 80 | idleRate = rq->wValue.bytes[1]; 81 | } 82 | } else { 83 | /* no vendor specific requests implemented */ 84 | } 85 | /* default for not implemented requests: return no data back to host */ 86 | return 0; 87 | } 88 | 89 | void initUsbKeyboard() { 90 | usbInit(); 91 | /* enforce re-enumeration, do this while interrupts are disabled! */ 92 | usbDeviceDisconnect(); 93 | uchar i; 94 | i = 0; 95 | while(--i) { /* fake USB disconnect for > 250 ms */ 96 | wdt_reset(); 97 | _delay_ms(1); 98 | } 99 | usbDeviceConnect(); 100 | sei(); 101 | } 102 | 103 | void prepareInterruptReport(uchar keycode) { 104 | reportBuffer[0] = 0; /* modifier keys */ 105 | reportBuffer[1] = keycode; 106 | /* called after every poll of the interrupt endpoint */ 107 | usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); 108 | } 109 | -------------------------------------------------------------------------------- /third_party/mozc-flap/usb_keyboard.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | #include "usbdrv.h" 21 | 22 | usbMsgLen_t usbFunctionSetup(uchar data[8]); 23 | void initUsbKeyboard(); 24 | void prepareInterruptReport(uchar key); 25 | 26 | #define KEYCODE_NONE 0x00 27 | #define KEYCODE_A 0x04 28 | #define KEYCODE_SPACE 0x2c 29 | #define KEYCODE_PERIOD 0x37 30 | #define KEYCODE_HYPHEN 0x2d 31 | #define KEYCODE_SLASH 0x38 32 | #define KEYCODE_ENTER 0x28 33 | #define KEYCODE_SEMICOLON 0x33 34 | #define KEYCODE_COMMA 0x36 35 | #define KEYCODE_PERIOD 0x37 36 | -------------------------------------------------------------------------------- /third_party/mozc-mageru/spoon_stl/LICENSE: -------------------------------------------------------------------------------- 1 | Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) 2 | 3 | https://creativecommons.org/licenses/by-sa/4.0/ 4 | https://creativecommons.org/licenses/by-sa/4.0/legalcode -------------------------------------------------------------------------------- /third_party/mozc-mageru/spoon_stl/README.md: -------------------------------------------------------------------------------- 1 | A spoon shape file for 3D printing which has a slot to embed flex sensor in. 2 | 3 | - slotted_spoon.stl 4 | 5 | This is a modified version of spoon.stl included in 6 | "Fork, Knife & Spoon" by hacklabnobo 7 | https://www.thingiverse.com/thing:226875 8 | -------------------------------------------------------------------------------- /third_party/mozc-mageru/spoon_stl/slotted_spoon.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-mageru/spoon_stl/slotted_spoon.stl -------------------------------------------------------------------------------- /third_party/mozc-morse/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2012 Google Inc. 3 | # 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of the GNU General Public License 6 | # as published by the Free Software Foundation; either version 2 7 | # of the License, or (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | # MA 02110-1301, USA. 18 | # 19 | 20 | 21 | DEVICE = attiny2313 22 | F_CPU = 12000000 # in Hz 23 | 24 | AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer 25 | 26 | USBDRV_DIR = ../third_party/usbdrv 27 | 28 | CFLAGS = -I$(USBDRV_DIR) -I. -DDEBUG_LEVEL=0 29 | 30 | OBJECTS = $(USBDRV_DIR)/usbdrv.o $(USBDRV_DIR)/usbdrvasm.o $(USBDRV_DIR)/oddebug.o usb_keyboard.o 31 | 32 | COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) 33 | 34 | FUSE_L = 0xef 35 | FUSE_H = 0xdb 36 | # ATTiny2313 FUSE_L (Fuse low byte): 37 | # 0xef = 1 1 1 0 1 1 1 1 38 | # ^ ^ \+/ \--+--/ 39 | # | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) 40 | # | | +--------------- SUT 1..0 (BOD enabled, fast rising power) 41 | # | +------------------ CKOUT (clock output on CKOUT pin -> disabled) 42 | # +-------------------- CKDIV8 (divide clock by 8 -> don't divide) 43 | # ATTiny2313 FUSE_H (Fuse high byte): 44 | # 0xdb = 1 1 0 1 1 0 1 1 45 | # ^ ^ ^ ^ \-+-/ ^ 46 | # | | | | | +---- RSTDISBL (disable external reset -> enabled) 47 | # | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) 48 | # | | | +-------------- WDTON (watchdog timer always on -> disable) 49 | # | | +---------------- SPIEN (enable serial programming -> enabled) 50 | # | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) 51 | # +-------------------- DWEN (debug wire enable) 52 | 53 | 54 | # symbolic targets: 55 | help: 56 | @echo "This Makefile has no default rule. Use one of the following:" 57 | @echo "make hex ........... to build dit-dah.hex and space.hex" 58 | @echo "make program ....... to flash fuses and dit-dah firmware" 59 | @echo "make fuse .......... to flash the fuses" 60 | @echo "make flash_dit-dah . to flash the dit-dah firmware" 61 | @echo "make flash_space ... to flash the space key firmware" 62 | @echo "make clean ......... to delete objects and hex file" 63 | 64 | hex: dit-dah.hex space.hex 65 | 66 | program: flash_dit-dah fuse 67 | 68 | # rule for programming fuse bits: 69 | fuse: 70 | @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ 71 | { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } 72 | $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m 73 | 74 | # rule for uploading firmware: 75 | flash_dit-dah: dit-dah.hex 76 | $(AVRDUDE) -U flash:w:dit-dah.hex:i 77 | 78 | flash_space: space.hex 79 | $(AVRDUDE) -U flash:w:space.hex:i 80 | 81 | # rule for deleting dependent files (those which can be built by Make): 82 | clean: 83 | rm -f dit-dah.{hex,lst,obj,cof,list,map,eep.hex,elf,s} space.{hex,lst,obj,cof,list,map,eep.hex,elf,s} *.o $(USBDRV_DIR)/*.o $(USBDRV_DIR)/oddebug.s $(USBDRV_DIR)/usbdrv.s 84 | 85 | # Generic rule for compiling C files: 86 | .c.o: 87 | $(COMPILE) -c $< -o $@ 88 | 89 | dit-dah.o: dit-dah.c usbconfig.h usb_keyboard.h 90 | 91 | space.o: space.c usbconfig.h usb_keyboard.h 92 | 93 | # Generic rule for assembling Assembler source files: 94 | .S.o: 95 | $(COMPILE) -x assembler-with-cpp -c $< -o $@ 96 | # "-x assembler-with-cpp" should not be necessary since this is the default 97 | # file type for the .S (with capital S) extension. However, upper case 98 | # characters are not always preserved on Windows. To ensure WinAVR 99 | # compatibility define the file type manually. 100 | 101 | # Generic rule for compiling C to assembler, used for debugging only. 102 | .c.s: 103 | $(COMPILE) -S $< -o $@ 104 | 105 | # file targets: 106 | 107 | dit-dah.elf: $(OBJECTS) dit-dah.o 108 | $(COMPILE) -o dit-dah.elf $(OBJECTS) dit-dah.o 109 | 110 | space.elf: $(OBJECTS) space.o 111 | $(COMPILE) -o space.elf $(OBJECTS) space.o 112 | 113 | dit-dah.hex: dit-dah.elf 114 | rm -f dit-dah.hex dit-dah.eep.hex 115 | avr-objcopy -j .text -j .data -O ihex dit-dah.elf dit-dah.hex 116 | avr-size dit-dah.hex 117 | 118 | space.hex: space.elf 119 | rm -f space.hex space.eep.hex 120 | avr-objcopy -j .text -j .data -O ihex space.elf space.hex 121 | avr-size space.hex 122 | -------------------------------------------------------------------------------- /third_party/mozc-morse/Readme.txt: -------------------------------------------------------------------------------- 1 | Copyright 2012 Google Inc. 2 | 3 | This program is free software; you can redistribute it and/or 4 | modify it under the terms of the GNU General Public License 5 | as published by the Free Software Foundation; either version 2 6 | of the License, or (at your option) any later version. 7 | 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | 13 | You should have received a copy of the GNU General Public License 14 | along with this program; if not, write to the Free Software 15 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 16 | MA 02110-1301, USA. 17 | 18 | 19 | ===================================== 20 | Summary 21 | ===================================== 22 | 23 | Circuit diagram and firmwares of Morse key for Google Japanese Input. 24 | 25 | 26 | ===================================== 27 | Files 28 | ===================================== 29 | 30 | * V-USB library files 31 | third_party/usbdrv/ 32 | 33 | This directory and files are copied from V-USB files available at 34 | http://www.obdev.at/vusb/ 35 | 36 | * Documents 37 | COPYING ...... Open Source license for this software. 38 | Readme.txt ... The file you are currently reading. 39 | 40 | * Circuit diagram 41 | circuit.png 42 | 43 | * Firmware source codes 44 | Makefile 45 | dit-dah.c 46 | space.c 47 | usbconfig.h 48 | usb_keyboard.c 49 | usb_keyboard.h 50 | 51 | * Romaji table for Google Japanese Input 52 | romaji_dit-dah.txt 53 | 54 | ===================================== 55 | Building & Writing Firmware 56 | ===================================== 57 | 58 | * Building firmware binariese 59 | 60 | AVR-gcc is required. 61 | 62 | $ make hex 63 | 64 | 65 | * Writing to the program memory 66 | 67 | Choose one of the HEX files to write. 68 | - space.hex: Sends space key as the button is pressed. 69 | - dit-dah.hex: Sends dits, dahs. 70 | 71 | Please refer documents of AVR programmer device you use. 72 | Makefile contains "flash_space" and "flash_dit-dah" rules that writes 73 | a hex file using Avrdude as an example. 74 | 75 | 76 | * Programming the fuse bits 77 | 78 | Fuse bits must be configured in order to run the firmware correctly. 79 | 80 | lower byte: 0xef 81 | higher byte: 0xdb 82 | 83 | # ATTiny2313 FUSE_L (Fuse low byte): 84 | # 0xef = 1 1 1 0 1 1 1 1 85 | # ^ ^ \+/ \--+--/ 86 | # | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) 87 | # | | +--------------- SUT 1..0 (BOD enabled, fast rising power) 88 | # | +------------------ CKOUT (clock output on CKOUT pin -> disabled) 89 | # +-------------------- CKDIV8 (divide clock by 8 -> don't divide) 90 | # ATTiny2313 FUSE_H (Fuse high byte): 91 | # 0xdb = 1 1 0 1 1 0 1 1 92 | # ^ ^ ^ ^ \-+-/ ^ 93 | # | | | | | +---- RSTDISBL (disable external reset -> enabled) 94 | # | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) 95 | # | | | +-------------- WDTON (watchdog timer always on -> disable) 96 | # | | +---------------- SPIEN (enable serial programming -> enabled) 97 | # | +------------------ EESAVE (preserve EEPROM on Chip Erase 98 | # | -> not preserved) 99 | # +-------------------- DWEN (debug wire enable) 100 | 101 | Makefile contains "fuse" rule that programs fuse bits using Avrdude as an 102 | example. 103 | 104 | 105 | =================================================== 106 | Using dit-dah firmware with Google Japanese Input 107 | =================================================== 108 | 109 | "dit-dah" firmware is intended to be combined with Google Japanese Input, whose 110 | romaji table is configured by "romaji_dit-dah.txt". 111 | 112 | Note: This process will overwrite existing romaji table. 113 | If you have customized the romaji table, you should backup your data first. 114 | 115 | 1. Open Properties 116 | 2. Press "Customize..." button 117 | 3. Open "Edit - Inport from file..." 118 | 4. Open "romaji_dit-dah.txt" in this directory 119 | 120 | 121 | ================== 122 | References 123 | ================== 124 | 125 | The firmware and circuit diagram has been developed based on V-USB. 126 | 127 | * V-USB 128 | http://www.obdev.at/vusb/ 129 | -------------------------------------------------------------------------------- /third_party/mozc-morse/circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-morse/circuit.png -------------------------------------------------------------------------------- /third_party/mozc-morse/dit-dah.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | /* 22 | * USB keyboard to input by Morse code with help of special romaji table. 23 | * The device transmits keycodes based on a single button input: 24 | * 25 | * "." for a short tap 26 | * "-" for a long tap 27 | * "/" for a pause after a tap 28 | * [SPACE][ENTER] for a long pause after taps (convert and commit) 29 | */ 30 | 31 | #include 32 | #include 33 | #include /* for _delay_ms() */ 34 | #include "usb_keyboard.h" 35 | 36 | /* 37 | * Thresholds for button pressing duration. 38 | * 39 | * A counter is increased every 10 milliseconds in the main loop. 40 | * These time lengths are specified by the units of this counter. 41 | * 42 | * FYI: WPM = words per minute is commonly used unit of morse code speed. 43 | * 1 word stands for 50 dots. For example, 10 WPM means 1 dot=0.12s 44 | */ 45 | 46 | #define T_DIT 12 /* 10WPM */ 47 | 48 | /* minimum length of button press duration for a "dah" */ 49 | #define THRESHOLD_DIT_DAH (T_DIT + 7) 50 | 51 | /* minimum length of time for a character separator */ 52 | #define THRESHOLD_GAP (T_DIT * 3) 53 | 54 | /* length of time to wait before convert and commit */ 55 | #define THRESHOLD_LONG_GAP 100 /* 1 second */ 56 | 57 | 58 | #define EMPTY 255 59 | 60 | int __attribute__((noreturn)) main(void) 61 | { 62 | PORTB = 0xff; 63 | 64 | wdt_enable(WDTO_1S); 65 | initUsbKeyboard(); 66 | 67 | /* sets up timer for button polling interval */ 68 | /* timer 1 CTC mode, counts up at f[clock]/8 [Hz] */ 69 | TCCR1B = (1 << WGM12) | (1 << CS11); 70 | TCNT1 = 0; 71 | OCR1A = F_CPU / 8 / 100; /* 100Hz, T=10 milliseconds */ 72 | 73 | uchar key = 0; 74 | 75 | /* Keyboard keys to send. 76 | * Since we have only 1 byte buffer, the first key is dropped if the second 77 | * key is pushed before submitting it. 78 | */ 79 | uchar cmdBuf = EMPTY; 80 | 81 | uchar state = 0; 82 | unsigned int count = 0; 83 | while(1) { /* main event loop */ 84 | wdt_reset(); 85 | usbPoll(); 86 | if(usbInterruptIsReady()) { 87 | if (cmdBuf != EMPTY) { 88 | prepareInterruptReport(cmdBuf); 89 | if (cmdBuf == KEYCODE_NONE) { 90 | cmdBuf = EMPTY; 91 | } else { 92 | /* release all keys */ 93 | cmdBuf = KEYCODE_NONE; 94 | } 95 | } 96 | } 97 | /* samples the key input every 10 milliseconds to avoid chattering */ 98 | if (bit_is_clear(TIFR, OCF1A)) { 99 | continue; 100 | } 101 | TIFR |= _BV(OCF1A); /* clear OCF1A */ 102 | 103 | key = bit_is_clear(PINB, PINB0); 104 | switch(state) { 105 | case 0: /* initial state or after a long gap */ 106 | if (key) { 107 | state = 1; 108 | count = 0; 109 | } 110 | break; 111 | case 1: /* key is on */ 112 | if (!key) { 113 | cmdBuf = KEYCODE_PERIOD; /* dot */ 114 | state = 3; 115 | count = 0; 116 | break; 117 | } 118 | if (count++ > THRESHOLD_DIT_DAH) { 119 | state = 2; 120 | count = 0; 121 | } 122 | break; 123 | case 2: /* key has been pressed long enough to input dash */ 124 | if (!key) { 125 | cmdBuf = KEYCODE_HYPHEN; /* dash */ 126 | state = 3; 127 | count = 0; 128 | } 129 | break; 130 | case 3: /* key was released. */ 131 | if (key) { 132 | state = 1; 133 | count = 0; 134 | break; 135 | } 136 | if (count++ > THRESHOLD_GAP) { 137 | cmdBuf = KEYCODE_SLASH; /* word separator */ 138 | state = 4; 139 | } 140 | break; 141 | case 4: /* short gap, or long gap */ 142 | if (key) { 143 | state = 1; 144 | count = 0; 145 | break; 146 | } 147 | if (count++ > THRESHOLD_LONG_GAP) { 148 | cmdBuf = KEYCODE_SPACE; /* start conversion */ 149 | state = 5; 150 | count = 0; 151 | } 152 | break; 153 | case 5: /* long gap. pause before sending Enter key. */ 154 | if (count++ > T_DIT) { 155 | cmdBuf = KEYCODE_ENTER; /* commit conversion */ 156 | state = 0; 157 | count = 0; 158 | } 159 | break; 160 | } 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /third_party/mozc-morse/romaji_dit-dah.txt: -------------------------------------------------------------------------------- 1 | -..---/ (本文) 2 | .-.-../ (段落) 3 | ...-./ (訂正or終了) 4 | .-.-.-/ 、 5 | --.--/ あ 6 | .-/ い 7 | ..-/ う 8 | -.---/ え 9 | .-.../ お 10 | .-../ か 11 | -.-../ き 12 | ...-/ く 13 | -.--/ け 14 | ----/ こ 15 | -.-.-/ さ 16 | --.-./ し 17 | ---.-/ す 18 | .---./ せ 19 | ---./ そ 20 | -./ た 21 | ..-./ ち 22 | .--./ つ 23 | .-.--/ て 24 | ..-../ と 25 | .-./ な 26 | -.-./ に 27 | ..../ ぬ 28 | --.-/ ね 29 | ..--/ の 30 | -.../ は 31 | --..-/ ひ 32 | --../ ふ 33 | ./ へ 34 | -../ ほ 35 | -..-/ ま 36 | ..-.-/ み 37 | -/ む 38 | -...-/ め 39 | -..-./ も 40 | .--/ や 41 | -..--/ ゆ 42 | --/ よ 43 | .../ ら 44 | --./ り 45 | -.--./ る 46 | ---/ れ 47 | .-.-/ ろ 48 | -.-/ わ 49 | .-..-/ ゐ 50 | .--../ ゑ 51 | .---/ を 52 | .-.-./ ん 53 | ../ ゛ 54 | ..--./ ゜ 55 | う../ ヴ 56 | か../ が 57 | き../ ぎ 58 | く../ ぐ 59 | け../ げ 60 | こ../ ご 61 | さ../ ざ 62 | し../ じ 63 | す../ ず 64 | せ../ ぜ 65 | そ../ ぞ 66 | た../ だ 67 | ち../ ぢ 68 | つ../ づ 69 | て../ で 70 | と../ ど 71 | は../ ば 72 | ひ../ び 73 | ふ../ ぶ 74 | へ../ べ 75 | ほ../ ぼ 76 | う..--./ ぅ 77 | は..--./ ぱ 78 | ひ..--./ ぴ 79 | ふ..--./ ぷ 80 | へ..--./ ぺ 81 | ほ..--./ ぽ 82 | か..--./ ヵ 83 | け..--./ ヶ 84 | .--.-/ ー 85 | -.--.-/ ( 86 | .-..-./ ) 87 | き- き - 88 | き./ き へ 89 | き.- き .- 90 | き..- き ..- 91 | き... き ... 92 | く- く - 93 | く./ く へ 94 | く.- く .- 95 | く..- く ..- 96 | く... く ... 97 | こ- こ - 98 | こ./ こ へ 99 | こ.- こ .- 100 | こ..- こ ..- 101 | こ... こ ... 102 | さ- さ - 103 | さ./ さ へ 104 | さ.- さ .- 105 | さ..- さ ..- 106 | さ... さ ... 107 | し- し - 108 | し./ し へ 109 | し.- し .- 110 | し..- し ..- 111 | し... し ... 112 | す- す - 113 | す./ す へ 114 | す.- す .- 115 | す..- す ..- 116 | す... す ... 117 | せ- せ - 118 | せ./ せ へ 119 | せ.- せ .- 120 | せ..- せ ..- 121 | せ... せ ... 122 | そ- そ - 123 | そ./ そ へ 124 | そ.- そ .- 125 | そ..- そ ..- 126 | そ... そ ... 127 | た- た - 128 | た./ た へ 129 | た.- た .- 130 | た..- た ..- 131 | た... た ... 132 | ち- ち - 133 | ち./ ち へ 134 | ち.- ち .- 135 | ち..- ち ..- 136 | ち... ち ... 137 | て- て - 138 | て./ て へ 139 | て.- て .- 140 | て..- て ..- 141 | て... て ... 142 | と- と - 143 | と./ と へ 144 | と.- と .- 145 | と..- と ..- 146 | と... と ... 147 | う- う - 148 | う.- う .- 149 | う./ う へ 150 | う... う ... 151 | う..-. う ..-. 152 | う..-/ う う 153 | う..--- う ..--- 154 | う..--/ うの 155 | は- は - 156 | は.- は .- 157 | は./ は へ 158 | は... は ... 159 | は..-. は ..-. 160 | は..-/ は う 161 | は..--- は ..--- 162 | は..--/ はの 163 | ひ- ひ - 164 | ひ.- ひ .- 165 | ひ./ ひ へ 166 | ひ... ひ ... 167 | ひ..-. ひ ..-. 168 | ひ..-/ ひ う 169 | ひ..--- ひ ..--- 170 | ひ..--/ ひの 171 | ふ- ふ - 172 | ふ.- ふ .- 173 | ふ./ ふ へ 174 | ふ... ふ ... 175 | ふ..-. ふ ..-. 176 | ふ..-/ ふ う 177 | ふ..--- ふ ..--- 178 | ふ..--/ ふの 179 | へ- へ - 180 | へ.- へ .- 181 | へ./ へ へ 182 | へ... へ ... 183 | へ..-. へ ..-. 184 | へ..-/ へ う 185 | へ..--- へ ..--- 186 | へ..--/ への 187 | ほ- ほ - 188 | ほ.- ほ .- 189 | ほ./ ほ へ 190 | ほ... ほ ... 191 | ほ..-. ほ ..-. 192 | ほ..-/ ほ う 193 | ほ..--- ほ ..--- 194 | ほ..--/ ほの 195 | つ- つ - 196 | つ.- つ .- 197 | つ./ つ へ 198 | つ... つ ... 199 | つ..-. つ ..-. 200 | つ..-/ つ う 201 | つ..--- つ ..--- 202 | つ..--/ つの 203 | か- か - 204 | か.- か .- 205 | か./ か へ 206 | か... か ... 207 | か..-. か ..-. 208 | か..-/ か う 209 | か..--- か ..--- 210 | か..--/ かの 211 | け- け - 212 | け.- け .- 213 | け./ け へ 214 | け... け ... 215 | け..-. け ..-. 216 | け..-/ け う 217 | け..--- け ..--- 218 | け..--/ けの 219 | つ..--./ っ 220 | や- や - 221 | や.- や .- 222 | や./ や へ 223 | や../ や゛ 224 | や... や ... 225 | や..-. や ..-. 226 | や..-/ や う 227 | や..--- や ..--- 228 | や..--/ やの 229 | や..--./ ゃ 230 | ゆ- ゆ - 231 | ゆ.- ゆ .- 232 | ゆ./ ゆ へ 233 | ゆ../ ゆ゛ 234 | ゆ... ゆ ... 235 | ゆ..-. ゆ ..-. 236 | ゆ..-/ ゆ う 237 | ゆ..--- ゆ ..--- 238 | ゆ..--/ ゆの 239 | ゆ..--./ ゅ 240 | よ- よ - 241 | よ.- よ .- 242 | よ./ よ へ 243 | よ../ よ゛ 244 | よ... よ ... 245 | よ..-. よ ..-. 246 | よ..-/ よ う 247 | よ..--- よ ..--- 248 | よ..--/ よの 249 | よ..--./ ょ 250 | あ- あ - 251 | あ.- あ .- 252 | あ./ あ へ 253 | あ../ あ゛ 254 | あ... あ ... 255 | あ..-. あ ..-. 256 | あ..-/ あ う 257 | あ..--- あ ..--- 258 | あ..--/ あの 259 | あ..--./ ぁ 260 | い- い - 261 | い.- い .- 262 | い./ い へ 263 | い../ い゛ 264 | い... い ... 265 | い..-. い ..-. 266 | い..-/ い う 267 | い..--- い ..--- 268 | い..--/ いの 269 | い..--./ ぃ 270 | え- え - 271 | え.- え .- 272 | え./ え へ 273 | え../ え゛ 274 | え... え ... 275 | え..-. え ..-. 276 | え..-/ え う 277 | え..--- え ..--- 278 | え..--/ えの 279 | え..--./ ぇ 280 | お- お - 281 | お.- お .- 282 | お./ お へ 283 | お../ お゛ 284 | お... お ... 285 | お..-. お ..-. 286 | お..-/ お う 287 | お..--- お ..--- 288 | お..--/ おの 289 | お..--./ ぉ 290 | わ- わ - 291 | わ.- わ .- 292 | わ./ わ へ 293 | わ../ わ゛ 294 | わ... わ ... 295 | わ..-. わ ..-. 296 | わ..-/ わ う 297 | わ..--- わ ..--- 298 | わ..--/ わの 299 | わ..--./ ゎ 300 | .----/ 1 301 | ..---/ 2 302 | ...--/ 3 303 | ....-/ 4 304 | ...../ 5 305 | -..../ 6 306 | --.../ 7 307 | ---../ 8 308 | ----./ 9 309 | -----/ 0 310 | -------------------------------------------------------------------------------- /third_party/mozc-morse/space.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | /* 22 | * USB space key. 23 | * Connect a nomally-open switch to PB0. The device works as a space bar. 24 | */ 25 | 26 | #include 27 | #include 28 | #include /* for _delay_ms() */ 29 | #include "usb_keyboard.h" 30 | 31 | int __attribute__((noreturn)) main(void) 32 | { 33 | PORTB = 0xff; 34 | 35 | wdt_enable(WDTO_1S); 36 | 37 | initUsbKeyboard(); 38 | 39 | /* sets up timer for button polling interval */ 40 | /* timer 1 CTC mode, counts up at f[clock]/8 [Hz] */ 41 | TCCR1B = (1 << WGM12) | (1 << CS11); 42 | TCNT1 = 0; 43 | OCR1A = F_CPU / 8 / 100; /* 100Hz, T=10 milliseconds */ 44 | 45 | uchar key = 0; 46 | uchar lastKey = 0; 47 | 48 | while(1) { /* main event loop */ 49 | wdt_reset(); 50 | usbPoll(); 51 | 52 | /* samples the key input every 10 milliseconds to avoid chattering */ 53 | if (bit_is_clear(TIFR, OCF1A)) { 54 | continue; 55 | } 56 | TIFR |= _BV(OCF1A); /* clear OCF1A */ 57 | 58 | if(usbInterruptIsReady()){ 59 | key = bit_is_clear(PINB, PINB0) ? KEYCODE_SPACE : KEYCODE_NONE; 60 | if (key != lastKey) { 61 | lastKey = key; 62 | prepareInterruptReport(key); 63 | } 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /third_party/mozc-morse/usb_keyboard.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | #include "usb_keyboard.h" 21 | 22 | #include /* for sei() */ 23 | #include 24 | #include /* for _delay_ms() */ 25 | 26 | /* USB report descriptor, size must match usbconfig.h */ 27 | const PROGMEM char usbHidReportDescriptor[35] = { 28 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 29 | 0x09, 0x06, // USAGE (Keyboard) 30 | 0xa1, 0x01, // COLLECTION (Application) 31 | 0x05, 0x07, // USAGE_PAGE (Keyboard) 32 | 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 33 | 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 34 | 0x15, 0x00, // LOGICAL_MINIMUM (0) 35 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) 36 | 0x75, 0x01, // REPORT_SIZE (1) 37 | 0x95, 0x08, // REPORT_COUNT (8) 38 | 0x81, 0x02, // INPUT (Data,Var,Abs) 39 | 0x95, 0x01, // REPORT_COUNT (1) 40 | 0x75, 0x08, // REPORT_SIZE (8) 41 | 0x25, 0x65, // LOGICAL_MAXIMUM (101) 42 | 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 43 | 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 44 | 0x81, 0x00, // INPUT (Data,Ary,Abs) 45 | 0xc0 // END_COLLECTION 46 | }; 47 | 48 | static uchar reportBuffer[2]; 49 | static uchar idleRate; /* repeat rate for keyboards */ 50 | 51 | #define MOD_CONTROL_LEFT (1<<0) 52 | #define MOD_SHIFT_LEFT (1<<1) 53 | #define MOD_ALT_LEFT (1<<2) 54 | #define MOD_GUI_LEFT (1<<3) 55 | #define MOD_CONTROL_RIGHT (1<<4) 56 | #define MOD_SHIFT_RIGHT (1<<5) 57 | #define MOD_ALT_RIGHT (1<<6) 58 | #define MOD_GUI_RIGHT (1<<7) 59 | 60 | uchar keyReport[2]; 61 | 62 | usbMsgLen_t usbFunctionSetup(uchar data[8]) 63 | { 64 | usbRequest_t *rq = (void *)data; 65 | 66 | /* The following requests are never used. But since they are required by 67 | * the specification, we implement them in this example. 68 | */ 69 | if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { 70 | /* class request type */ 71 | /* wValue: ReportType (highbyte), ReportID (lowbyte) */ 72 | if(rq->bRequest == USBRQ_HID_GET_REPORT) { 73 | /* we only have one report type, so don't look at wValue */ 74 | usbMsgPtr = (void *)&reportBuffer; 75 | return sizeof(reportBuffer); 76 | } else if(rq->bRequest == USBRQ_HID_GET_IDLE) { 77 | usbMsgPtr = &idleRate; 78 | return 1; 79 | } else if(rq->bRequest == USBRQ_HID_SET_IDLE) { 80 | idleRate = rq->wValue.bytes[1]; 81 | } 82 | } else { 83 | /* no vendor specific requests implemented */ 84 | } 85 | /* default for not implemented requests: return no data back to host */ 86 | return 0; 87 | } 88 | 89 | void initUsbKeyboard() { 90 | usbInit(); 91 | /* enforce re-enumeration, do this while interrupts are disabled! */ 92 | usbDeviceDisconnect(); 93 | uchar i; 94 | i = 0; 95 | while(--i) { /* fake USB disconnect for > 250 ms */ 96 | wdt_reset(); 97 | _delay_ms(1); 98 | } 99 | usbDeviceConnect(); 100 | sei(); 101 | } 102 | 103 | void prepareInterruptReport(uchar keycode) { 104 | reportBuffer[0] = 0; /* modifier keys */ 105 | reportBuffer[1] = keycode; 106 | /* called after every poll of the interrupt endpoint */ 107 | usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); 108 | } 109 | -------------------------------------------------------------------------------- /third_party/mozc-morse/usb_keyboard.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 2 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | #include "usbdrv.h" 21 | 22 | usbMsgLen_t usbFunctionSetup(uchar data[8]); 23 | void initUsbKeyboard(); 24 | void prepareInterruptReport(uchar key); 25 | 26 | #define KEYCODE_NONE 0x00 27 | #define KEYCODE_SPACE 0x2c 28 | #define KEYCODE_PERIOD 0x37 29 | #define KEYCODE_HYPHEN 0x2d 30 | #define KEYCODE_SLASH 0x38 31 | #define KEYCODE_ENTER 0x28 32 | #define KEYCODE_SEMICOLON 0x33 33 | -------------------------------------------------------------------------------- /third_party/mozc-puchi/README.md: -------------------------------------------------------------------------------- 1 | 2 | Summary 3 | ===================================== 4 | 5 | Mechanical design, circuit diagram and firmware of Google Japanese Input 6 | puchi-puchi version. 7 | 8 | 9 | Building your device 10 | ===================================== 11 | 12 | ![Photograph of the device](photo/device_desktop.jpg) 13 | 14 | ## Electronic parts 15 | 16 | ### Desktop type 17 | 18 | * Arduino Leonardo 19 | * Adafruit motor driver shield 20 | * Microswitch * 5 21 | * LED * 5 22 | * 330[ohm] Resistors * 5 23 | 24 | ### Handheld type 25 | 26 | * Arduino Micro 27 | * Microswitch * 5 28 | 29 | 30 | Files 31 | ===================================== 32 | 33 | * README.md ----> this file 34 | * LICENSE ----> license file 35 | * circuit/ 36 | * circuit.jpg ----> circuit diagram of both desktop/handheld devices 37 | * desktop/ 38 | * 3Dprinter ----> data to print for 3D printer 39 | * desktop.igs 40 | * desktop.stl 41 | * desktop.stp 42 | * Arduino/ ----> Arduino sketch file to drive board (Leonardo) 43 | * desktop/desktop.ino 44 | * handheld/ 45 | * 3Dprinter/ ----> data to print for 3D printer 46 | * handheld.igs 47 | * handheld.stl 48 | * handheld.stp 49 | * Arduino/ ----> Arduino sketch file to drive board (Arduino Micro) 50 | * handheld/handheld.ino 51 | -------------------------------------------------------------------------------- /third_party/mozc-puchi/circuit/circuit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-puchi/circuit/circuit.jpg -------------------------------------------------------------------------------- /third_party/mozc-puchi/desktop/3Dprinter/desktop.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-puchi/desktop/3Dprinter/desktop.stl -------------------------------------------------------------------------------- /third_party/mozc-puchi/handheld/3Dprinter/handheld.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-puchi/handheld/3Dprinter/handheld.stl -------------------------------------------------------------------------------- /third_party/mozc-puchi/photo/device_desktop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/mozc-devices/2dafea49c6411f20ee17bf920a865a0c1cf4cfe1/third_party/mozc-puchi/photo/device_desktop.jpg -------------------------------------------------------------------------------- /third_party/usbdrv/oddebug.c: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.c 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | * This Revision: $Id$ 9 | */ 10 | 11 | #include "oddebug.h" 12 | 13 | #if DEBUG_LEVEL > 0 14 | 15 | #warning "Never compile production devices with debugging enabled" 16 | 17 | static void uartPutc(char c) 18 | { 19 | while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ 20 | ODDBG_UDR = c; 21 | } 22 | 23 | static uchar hexAscii(uchar h) 24 | { 25 | h &= 0xf; 26 | if(h >= 10) 27 | h += 'a' - (uchar)10 - '0'; 28 | h += '0'; 29 | return h; 30 | } 31 | 32 | static void printHex(uchar c) 33 | { 34 | uartPutc(hexAscii(c >> 4)); 35 | uartPutc(hexAscii(c)); 36 | } 37 | 38 | void odDebug(uchar prefix, uchar *data, uchar len) 39 | { 40 | printHex(prefix); 41 | uartPutc(':'); 42 | while(len--){ 43 | uartPutc(' '); 44 | printHex(*data++); 45 | } 46 | uartPutc('\r'); 47 | uartPutc('\n'); 48 | } 49 | 50 | #endif 51 | -------------------------------------------------------------------------------- /third_party/usbdrv/oddebug.h: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.h 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | * This Revision: $Id$ 9 | */ 10 | 11 | #ifndef __oddebug_h_included__ 12 | #define __oddebug_h_included__ 13 | 14 | /* 15 | General Description: 16 | This module implements a function for debug logs on the serial line of the 17 | AVR microcontroller. Debugging can be configured with the define 18 | 'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging 19 | calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is 20 | 2, DBG1 and DBG2 logs will be printed. 21 | 22 | A debug log consists of a label ('prefix') to indicate which debug log created 23 | the output and a memory block to dump in hex ('data' and 'len'). 24 | */ 25 | 26 | 27 | #ifndef F_CPU 28 | # define F_CPU 12000000 /* 12 MHz */ 29 | #endif 30 | 31 | /* make sure we have the UART defines: */ 32 | #include "usbportability.h" 33 | 34 | #ifndef uchar 35 | # define uchar unsigned char 36 | #endif 37 | 38 | #if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ 39 | # warning "Debugging disabled because device has no UART" 40 | # undef DEBUG_LEVEL 41 | #endif 42 | 43 | #ifndef DEBUG_LEVEL 44 | # define DEBUG_LEVEL 0 45 | #endif 46 | 47 | /* ------------------------------------------------------------------------- */ 48 | 49 | #if DEBUG_LEVEL > 0 50 | # define DBG1(prefix, data, len) odDebug(prefix, data, len) 51 | #else 52 | # define DBG1(prefix, data, len) 53 | #endif 54 | 55 | #if DEBUG_LEVEL > 1 56 | # define DBG2(prefix, data, len) odDebug(prefix, data, len) 57 | #else 58 | # define DBG2(prefix, data, len) 59 | #endif 60 | 61 | /* ------------------------------------------------------------------------- */ 62 | 63 | #if DEBUG_LEVEL > 0 64 | extern void odDebug(uchar prefix, uchar *data, uchar len); 65 | 66 | /* Try to find our control registers; ATMEL likes to rename these */ 67 | 68 | #if defined UBRR 69 | # define ODDBG_UBRR UBRR 70 | #elif defined UBRRL 71 | # define ODDBG_UBRR UBRRL 72 | #elif defined UBRR0 73 | # define ODDBG_UBRR UBRR0 74 | #elif defined UBRR0L 75 | # define ODDBG_UBRR UBRR0L 76 | #endif 77 | 78 | #if defined UCR 79 | # define ODDBG_UCR UCR 80 | #elif defined UCSRB 81 | # define ODDBG_UCR UCSRB 82 | #elif defined UCSR0B 83 | # define ODDBG_UCR UCSR0B 84 | #endif 85 | 86 | #if defined TXEN 87 | # define ODDBG_TXEN TXEN 88 | #else 89 | # define ODDBG_TXEN TXEN0 90 | #endif 91 | 92 | #if defined USR 93 | # define ODDBG_USR USR 94 | #elif defined UCSRA 95 | # define ODDBG_USR UCSRA 96 | #elif defined UCSR0A 97 | # define ODDBG_USR UCSR0A 98 | #endif 99 | 100 | #if defined UDRE 101 | # define ODDBG_UDRE UDRE 102 | #else 103 | # define ODDBG_UDRE UDRE0 104 | #endif 105 | 106 | #if defined UDR 107 | # define ODDBG_UDR UDR 108 | #elif defined UDR0 109 | # define ODDBG_UDR UDR0 110 | #endif 111 | 112 | static inline void odDebugInit(void) 113 | { 114 | ODDBG_UCR |= (1<