Compare commits

..

32 Commits

Author SHA1 Message Date
demik
75260870c7 fix ADB start and stop bit timings 2024-06-06 00:10:01 +02:00
demik
97a57e89ac added support for Kensington ADB Devices 2024-06-04 10:04:47 +02:00
demik
6a0e7ee968 early work to restore ADB to bluetooth functionality 2024-06-03 22:05:37 +02:00
demik
cfe3c0314a Updated ChangeLog to 1.4.5 2023-12-28 21:45:46 +01:00
demik
8dd60e2d20 Upgraded SDK to v5.1.2 2023-12-28 21:40:18 +01:00
demik
17be92fec7
Merge pull request #2 from ElectronicsArchiver/README-Rework
README Rework
2022-08-03 18:18:02 +02:00
ElectronicsArchiver
405194156c Merge branch 'README-Rework' of https://github.com/ElectronicsArchiver/quack into README-Rework 2022-08-03 12:08:08 -04:00
ElectronicsArchiver
72218018a4 Added Bigger Preview 2022-08-03 12:07:58 -04:00
トトも
6ad6c7bb4e
Adjusted Badge Style 2022-08-02 07:57:02 -04:00
ElectronicsArchiver
876920fd90 Updated Support Section 2022-07-05 06:56:52 -04:00
トトも
c211ab1f2c
Adjusted Spacing 2022-07-05 06:54:28 -04:00
ElectronicsArchiver
86f08d776b Formatted README 2022-07-05 06:51:16 -04:00
ElectronicsArchiver
0ca38e2f0a Cut Out Preview 2022-07-05 06:48:29 -04:00
demik
eeb5772664 Upgraded SDK to v4.2.3 2022-04-03 21:28:45 +02:00
demik
b4024687b4 cleaning 2022-01-04 19:26:32 +01:00
demik
4ba1b4b113 added back panel using a PCB 2022-01-04 19:23:36 +01:00
demik
f691dc34e6
fix typo 2021-12-22 23:05:08 +01:00
demik
7911d07477 provides some slight acceleration and desceleration on bluetooth mouses 2021-12-02 14:00:12 +01:00
demik
9c52c41ee2
Added support for Apple Lisa 2021-11-20 16:57:17 +01:00
demik
03a92bcda4 fixed BT LED state in case some mouse is reconnecting while the quack is scanning 2021-10-30 15:38:34 +02:00
demik
157ab85c84 Merge branch 'master' of github.com:demik/quack 2021-10-30 15:07:11 +02:00
demik
441cbe9bc7 added support for MicroSpeed MacTRAC 2.0 2021-10-30 15:06:51 +02:00
demik
1638fb5805
Added photo on README.md 2021-10-12 19:30:33 +02:00
demik
891e537a89 added PCB image 2021-10-12 19:26:54 +02:00
demik
5345ba5476 fixed BT LED state when using multiple mouses 2021-09-21 00:09:09 +02:00
demik
231e1dfb4a compile against SDK v4.2.2 2021-09-19 23:32:58 +02:00
demik
1600e81974 Datasheet for ADB Socket 2021-09-08 22:28:10 +02:00
demik
0bf80f5d28
Fixed wording 2021-08-26 18:25:01 +02:00
demik
c1fd23186c
Documentation for main subfolder 2021-08-24 13:46:45 +02:00
demik
f4bb8b1046
Added Wiki link 2021-08-24 09:27:19 +02:00
demik
e6730f2021
Updating main README.md 2021-08-23 20:15:34 +02:00
demik
22a159218a Firmware ChangeLog created 2021-08-22 21:06:00 +02:00
23 changed files with 2523 additions and 704 deletions

27
ChangeLog.md Normal file
View File

@ -0,0 +1,27 @@
## v1.4.5
- update to ESP-IDF v5.1.2
- big background update, lot of cleaning and rewrites
- as most patches as now mainstream, sdk patching now minimal
- removed direct call bluedroid
## v1.4.4
- update to ESP-IDF v4.2.3:
- https://github.com/espressif/esp-idf/releases/tag/v4.2.2
- mostly bluetooth related security and bug fixes
## v1.4.3
- provides some slight acceleration and desceleration on bluetooth mouses
## v1.4.2
- added support for MicroSpeed MacTRAC 2.0
- fixed a BT led state when a device reconnect while scanning
## v1.4.1
- update to ESP-IDF v4.2.2:
- https://github.com/espressif/esp-idf/releases/tag/v4.2.2
- fixed controller not reporting disconnect event
- fixed BT LED state when using multiple mouses
## v1.4.0
- Initial firmare release
- 1.4.x series is compatible with PCB 1.4 (EDA subfolder)

BIN
EDA/Datasheet/TM0508A.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,37 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector_TestPoint_Small
#
DEF Connector_TestPoint_Small TP 0 30 N N 1 F N
F0 "TP" 0 150 50 H V C CNN
F1 "Connector_TestPoint_Small" 0 80 50 H V C CNN
F2 "" 200 0 50 H I C CNN
F3 "" 200 0 50 H I C CNN
$FPLIST
Pin*
Test*
$ENDFPLIST
DRAW
C 0 0 20 0 1 0 N
X 1 1 0 0 0 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# power_Earth
#
DEF power_Earth #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_Earth" 0 -150 50 H I C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 -25 -75 25 -75 N
P 2 0 1 0 -5 -100 5 -100 N
P 2 0 1 0 0 -50 0 0 N
P 2 0 1 0 50 -50 -50 -50 N
X Earth 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,701 @@
(kicad_pcb (version 20171130) (host pcbnew "(5.1.12-1-10_14)")
(general
(thickness 1.6)
(drawings 19)
(tracks 10)
(zones 0)
(modules 3)
(nets 2)
)
(page A4)
(title_block
(title "Quack back panel")
(date 2021-12-08)
(rev 1.0)
(company Lostwave)
(comment 1 https://68kmla.org)
(comment 2 https://github.com/quack/quack)
)
(layers
(0 F.Cu signal)
(31 B.Cu signal)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(44 Edge.Cuts user)
(45 Margin user)
(46 B.CrtYd user)
(47 F.CrtYd user)
(48 B.Fab user)
(49 F.Fab user)
)
(setup
(last_trace_width 0.25)
(trace_clearance 0.2)
(zone_clearance 0.508)
(zone_45_only no)
(trace_min 0.2)
(via_size 0.8)
(via_drill 0.4)
(via_min_size 0.4)
(via_min_drill 0.3)
(uvia_size 0.3)
(uvia_drill 0.1)
(uvias_allowed no)
(uvia_min_size 0.2)
(uvia_min_drill 0.1)
(edge_width 0.05)
(segment_width 0.2)
(pcb_text_width 0.3)
(pcb_text_size 1.5 1.5)
(mod_edge_width 0.12)
(mod_text_size 1 1)
(mod_text_width 0.15)
(pad_size 1.524 1.524)
(pad_drill 0.762)
(pad_to_mask_clearance 0)
(aux_axis_origin 0 0)
(visible_elements FFFFFF7F)
(pcbplotparams
(layerselection 0x030f0_ffffffff)
(usegerberextensions false)
(usegerberattributes true)
(usegerberadvancedattributes true)
(creategerberjobfile true)
(excludeedgelayer true)
(linewidth 0.100000)
(plotframeref false)
(viasonmask false)
(mode 1)
(useauxorigin false)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15.000000)
(psnegative false)
(psa4output false)
(plotreference true)
(plotvalue true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 0)
(scaleselection 1)
(outputdirectory ""))
)
(net 0 "")
(net 1 Earth)
(net_class Default "Ceci est la Netclass par défaut."
(clearance 0.2)
(trace_width 0.25)
(via_dia 0.8)
(via_drill 0.4)
(uvia_dia 0.3)
(uvia_drill 0.1)
(add_net Earth)
)
(module "Macintosh logo:Macintosh logo" (layer F.Cu) (tedit 0) (tstamp 61B10486)
(at 90 51)
(fp_text reference G*** (at 0 0) (layer F.SilkS) hide
(effects (font (size 1.524 1.524) (thickness 0.3)))
)
(fp_text value LOGO (at 0.75 0) (layer F.SilkS) hide
(effects (font (size 1.524 1.524) (thickness 0.3)))
)
(fp_poly (pts (xy -3.142214 -2.857296) (xy -3.161382 -2.83255) (xy -3.194017 -2.795127) (xy -3.23769 -2.747483)
(xy -3.289971 -2.692074) (xy -3.348431 -2.631356) (xy -3.410644 -2.567785) (xy -3.474178 -2.503818)
(xy -3.536607 -2.441911) (xy -3.5955 -2.38452) (xy -3.64843 -2.334102) (xy -3.692967 -2.293111)
(xy -3.726682 -2.264006) (xy -3.747148 -2.249241) (xy -3.751028 -2.2479) (xy -3.771835 -2.258356)
(xy -3.786485 -2.278714) (xy -3.794843 -2.310463) (xy -3.78977 -2.345028) (xy -3.769636 -2.38706)
(xy -3.732813 -2.441214) (xy -3.72677 -2.449316) (xy -3.660779 -2.525856) (xy -3.574445 -2.607899)
(xy -3.471268 -2.692189) (xy -3.4417 -2.714377) (xy -3.396506 -2.744962) (xy -3.343087 -2.776932)
(xy -3.286683 -2.807649) (xy -3.23253 -2.834475) (xy -3.185867 -2.85477) (xy -3.151932 -2.865895)
(xy -3.13894 -2.866908) (xy -3.142214 -2.857296)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 0.613196 -4.757878) (xy 0.748727 -4.753862) (xy 0.81915 -4.751044) (xy 1.017327 -4.741404)
(xy 1.192932 -4.730384) (xy 1.345412 -4.718036) (xy 1.47421 -4.704412) (xy 1.578773 -4.689562)
(xy 1.658545 -4.67354) (xy 1.662147 -4.67264) (xy 1.791536 -4.62969) (xy 1.901307 -4.570915)
(xy 1.992287 -4.495564) (xy 2.065303 -4.402886) (xy 2.12118 -4.29213) (xy 2.140394 -4.23797)
(xy 2.152166 -4.198382) (xy 2.16058 -4.162227) (xy 2.166188 -4.123959) (xy 2.169541 -4.078026)
(xy 2.171191 -4.01888) (xy 2.171689 -3.940972) (xy 2.1717 -3.923087) (xy 2.17095 -3.861839)
(xy 2.168801 -3.78159) (xy 2.165399 -3.684929) (xy 2.160892 -3.574444) (xy 2.155426 -3.452724)
(xy 2.14915 -3.322357) (xy 2.142209 -3.185931) (xy 2.134752 -3.046036) (xy 2.126926 -2.905259)
(xy 2.118878 -2.76619) (xy 2.110755 -2.631415) (xy 2.102705 -2.503525) (xy 2.094874 -2.385107)
(xy 2.087411 -2.27875) (xy 2.080461 -2.187042) (xy 2.074174 -2.112572) (xy 2.068695 -2.057928)
(xy 2.064172 -2.025698) (xy 2.063609 -2.023061) (xy 2.0384 -1.937901) (xy 2.004965 -1.870479)
(xy 1.959485 -1.813517) (xy 1.947351 -1.801539) (xy 1.905988 -1.766308) (xy 1.860656 -1.736856)
(xy 1.808506 -1.712498) (xy 1.746686 -1.692552) (xy 1.672347 -1.676331) (xy 1.582636 -1.663153)
(xy 1.474705 -1.652331) (xy 1.345703 -1.643182) (xy 1.27 -1.638893) (xy 1.19756 -1.635889)
(xy 1.105131 -1.633348) (xy 0.997335 -1.631289) (xy 0.878791 -1.629732) (xy 0.754122 -1.628697)
(xy 0.627949 -1.628205) (xy 0.504893 -1.628274) (xy 0.389575 -1.628925) (xy 0.286617 -1.630177)
(xy 0.200639 -1.632051) (xy 0.14605 -1.634065) (xy 0.039198 -1.640612) (xy -0.066828 -1.649695)
(xy -0.166335 -1.66066) (xy -0.25363 -1.672858) (xy -0.323021 -1.685637) (xy -0.340326 -1.689695)
(xy -0.407849 -1.708441) (xy -0.464633 -1.727552) (xy -0.506683 -1.745433) (xy -0.530002 -1.760488)
(xy -0.5334 -1.766782) (xy -0.528893 -1.778039) (xy -0.514427 -1.788036) (xy -0.488586 -1.796878)
(xy -0.449953 -1.804671) (xy -0.397113 -1.811521) (xy -0.32865 -1.817534) (xy -0.243147 -1.822814)
(xy -0.139188 -1.827468) (xy -0.015358 -1.831601) (xy 0.129761 -1.835319) (xy 0.297584 -1.838728)
(xy 0.4699 -1.841629) (xy 0.671179 -1.845041) (xy 0.849004 -1.848711) (xy 1.005319 -1.852772)
(xy 1.142069 -1.857361) (xy 1.261201 -1.862615) (xy 1.364657 -1.868667) (xy 1.454385 -1.875656)
(xy 1.532328 -1.883716) (xy 1.600432 -1.892982) (xy 1.660641 -1.903592) (xy 1.714902 -1.91568)
(xy 1.765158 -1.929383) (xy 1.776625 -1.932861) (xy 1.862452 -1.965321) (xy 1.923741 -2.002228)
(xy 1.961021 -2.043933) (xy 1.968513 -2.059774) (xy 1.9741 -2.087622) (xy 1.979412 -2.140243)
(xy 1.984411 -2.21701) (xy 1.98906 -2.317298) (xy 1.99332 -2.440479) (xy 1.994956 -2.497869)
(xy 1.998541 -2.613518) (xy 2.003176 -2.736857) (xy 2.008556 -2.86122) (xy 2.014373 -2.979941)
(xy 2.020322 -3.086353) (xy 2.025889 -3.170969) (xy 2.032687 -3.269905) (xy 2.039293 -3.376709)
(xy 2.045237 -3.482998) (xy 2.050049 -3.580387) (xy 2.053164 -3.6576) (xy 2.055372 -3.757275)
(xy 2.05386 -3.838487) (xy 2.047608 -3.90803) (xy 2.035594 -3.9727) (xy 2.016799 -4.039288)
(xy 1.990204 -4.114591) (xy 1.980878 -4.139051) (xy 1.948923 -4.209215) (xy 1.910726 -4.264573)
(xy 1.860875 -4.310765) (xy 1.793958 -4.353435) (xy 1.756091 -4.373365) (xy 1.694633 -4.40278)
(xy 1.637364 -4.426155) (xy 1.57959 -4.444501) (xy 1.516614 -4.458828) (xy 1.443741 -4.470147)
(xy 1.356277 -4.479468) (xy 1.249526 -4.487801) (xy 1.21285 -4.490272) (xy 1.077497 -4.4999)
(xy 0.937382 -4.511228) (xy 0.797345 -4.523772) (xy 0.662226 -4.537053) (xy 0.536868 -4.550591)
(xy 0.426111 -4.563903) (xy 0.334795 -4.57651) (xy 0.3175 -4.579188) (xy 0.240263 -4.594591)
(xy 0.187858 -4.612671) (xy 0.159801 -4.634019) (xy 0.155609 -4.659225) (xy 0.174798 -4.688876)
(xy 0.205765 -4.715529) (xy 0.234833 -4.731046) (xy 0.276912 -4.743032) (xy 0.333893 -4.751599)
(xy 0.407672 -4.756856) (xy 0.500142 -4.758913) (xy 0.613196 -4.757878)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 0.458489 -5.585005) (xy 0.632765 -5.584465) (xy 0.807316 -5.58362) (xy 0.979667 -5.582485)
(xy 1.147341 -5.581072) (xy 1.307862 -5.579394) (xy 1.458754 -5.577463) (xy 1.597541 -5.575292)
(xy 1.721746 -5.572894) (xy 1.828893 -5.570283) (xy 1.916506 -5.567469) (xy 1.982109 -5.564467)
(xy 2.00025 -5.563315) (xy 2.146091 -5.551737) (xy 2.267917 -5.539141) (xy 2.367103 -5.525113)
(xy 2.445028 -5.509238) (xy 2.503068 -5.491099) (xy 2.5426 -5.470282) (xy 2.565001 -5.44637)
(xy 2.571648 -5.418949) (xy 2.565965 -5.392637) (xy 2.544901 -5.362846) (xy 2.52035 -5.346473)
(xy 2.483544 -5.338976) (xy 2.425034 -5.335326) (xy 2.348217 -5.335472) (xy 2.256488 -5.339361)
(xy 2.153244 -5.346942) (xy 2.08915 -5.353039) (xy 1.987409 -5.362368) (xy 1.874684 -5.370477)
(xy 1.749523 -5.377396) (xy 1.610474 -5.383156) (xy 1.456089 -5.387788) (xy 1.284914 -5.391321)
(xy 1.095501 -5.393786) (xy 0.886397 -5.395214) (xy 0.656153 -5.395635) (xy 0.403317 -5.395079)
(xy 0.148275 -5.393723) (xy -0.079986 -5.392031) (xy -0.284456 -5.390057) (xy -0.466745 -5.387688)
(xy -0.62846 -5.384812) (xy -0.77121 -5.381315) (xy -0.896605 -5.377086) (xy -1.006253 -5.372013)
(xy -1.101762 -5.365982) (xy -1.184741 -5.358882) (xy -1.2568 -5.3506) (xy -1.319546 -5.341023)
(xy -1.374589 -5.33004) (xy -1.423538 -5.317538) (xy -1.468 -5.303404) (xy -1.509585 -5.287526)
(xy -1.536271 -5.276021) (xy -1.589234 -5.247881) (xy -1.634992 -5.213246) (xy -1.673812 -5.170521)
(xy -1.705961 -5.118111) (xy -1.731706 -5.05442) (xy -1.751313 -4.977854) (xy -1.765049 -4.886816)
(xy -1.773181 -4.779712) (xy -1.775975 -4.654946) (xy -1.773699 -4.510923) (xy -1.766618 -4.346048)
(xy -1.755 -4.158726) (xy -1.745274 -4.0259) (xy -1.737359 -3.899274) (xy -1.731123 -3.74797)
(xy -1.72657 -3.572656) (xy -1.723706 -3.374) (xy -1.722534 -3.152669) (xy -1.72306 -2.90933)
(xy -1.725289 -2.644651) (xy -1.729226 -2.359299) (xy -1.731941 -2.20345) (xy -1.734557 -2.054997)
(xy -1.736413 -1.92863) (xy -1.737471 -1.821048) (xy -1.737696 -1.728947) (xy -1.73705 -1.649026)
(xy -1.735497 -1.577981) (xy -1.733 -1.51251) (xy -1.729521 -1.449311) (xy -1.725025 -1.38508)
(xy -1.722465 -1.35255) (xy -1.715595 -1.267326) (xy -1.708917 -1.183809) (xy -1.702901 -1.107926)
(xy -1.698018 -1.045606) (xy -1.694775 -1.0033) (xy -1.69321 -0.950633) (xy -1.695127 -0.89107)
(xy -1.699865 -0.830879) (xy -1.706767 -0.776324) (xy -1.715173 -0.733674) (xy -1.724425 -0.709193)
(xy -1.72588 -0.707441) (xy -1.738169 -0.708109) (xy -1.744989 -0.718844) (xy -1.750882 -0.741583)
(xy -1.759678 -0.784943) (xy -1.77063 -0.844408) (xy -1.782992 -0.915461) (xy -1.796017 -0.993587)
(xy -1.808959 -1.07427) (xy -1.82107 -1.152994) (xy -1.831605 -1.225242) (xy -1.839816 -1.286499)
(xy -1.842419 -1.3081) (xy -1.846634 -1.360396) (xy -1.849633 -1.433665) (xy -1.851413 -1.528397)
(xy -1.85197 -1.645083) (xy -1.851299 -1.784212) (xy -1.849396 -1.946275) (xy -1.846257 -2.131761)
(xy -1.841878 -2.34116) (xy -1.836255 -2.574963) (xy -1.829602 -2.82575) (xy -1.825442 -3.011945)
(xy -1.823793 -3.185363) (xy -1.824793 -3.352556) (xy -1.828579 -3.520081) (xy -1.835286 -3.694491)
(xy -1.845053 -3.88234) (xy -1.855047 -4.04495) (xy -1.860321 -4.150728) (xy -1.863418 -4.267597)
(xy -1.864438 -4.3908) (xy -1.863477 -4.515576) (xy -1.860635 -4.637167) (xy -1.856009 -4.750813)
(xy -1.849698 -4.851754) (xy -1.841801 -4.935232) (xy -1.835775 -4.9784) (xy -1.823516 -5.043253)
(xy -1.808611 -5.109972) (xy -1.793726 -5.16689) (xy -1.789453 -5.180971) (xy -1.766192 -5.246491)
(xy -1.739746 -5.303899) (xy -1.70834 -5.353801) (xy -1.670202 -5.396801) (xy -1.623557 -5.433503)
(xy -1.566631 -5.464514) (xy -1.497652 -5.490437) (xy -1.414844 -5.511878) (xy -1.316436 -5.529442)
(xy -1.200652 -5.543733) (xy -1.06572 -5.555357) (xy -0.909865 -5.564918) (xy -0.731314 -5.573022)
(xy -0.62865 -5.57687) (xy -0.545723 -5.579217) (xy -0.442711 -5.581159) (xy -0.322089 -5.582708)
(xy -0.186334 -5.583877) (xy -0.037923 -5.584678) (xy 0.120669 -5.585125) (xy 0.286965 -5.58523)
(xy 0.458489 -5.585005)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 1.856078 -0.555069) (xy 1.947224 -0.553758) (xy 2.025479 -0.551107) (xy 2.08829 -0.54703)
(xy 2.133104 -0.541436) (xy 2.156373 -0.534806) (xy 2.179133 -0.51044) (xy 2.182827 -0.477748)
(xy 2.166918 -0.445782) (xy 2.161969 -0.440838) (xy 2.136031 -0.42569) (xy 2.097351 -0.411621)
(xy 2.081292 -0.407486) (xy 2.020192 -0.39721) (xy 1.937764 -0.388481) (xy 1.838042 -0.38144)
(xy 1.725057 -0.37623) (xy 1.602843 -0.372994) (xy 1.475434 -0.371872) (xy 1.346862 -0.373008)
(xy 1.221161 -0.376543) (xy 1.21285 -0.376873) (xy 1.079982 -0.384866) (xy 0.960797 -0.397309)
(xy 0.858809 -0.413714) (xy 0.777529 -0.433594) (xy 0.758319 -0.439945) (xy 0.713002 -0.456863)
(xy 0.677053 -0.471706) (xy 0.657251 -0.481646) (xy 0.656007 -0.482617) (xy 0.65959 -0.490721)
(xy 0.686021 -0.498729) (xy 0.732746 -0.506553) (xy 0.797213 -0.514104) (xy 0.876869 -0.521294)
(xy 0.969162 -0.528033) (xy 1.071538 -0.534232) (xy 1.181444 -0.539804) (xy 1.296329 -0.544658)
(xy 1.413639 -0.548707) (xy 1.530822 -0.551861) (xy 1.645325 -0.554032) (xy 1.754594 -0.555131)
(xy 1.856078 -0.555069)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy -3.170154 -2.140166) (xy -3.096896 -2.123196) (xy -3.029496 -2.091953) (xy -2.964654 -2.045995)
(xy -2.899071 -1.984878) (xy -2.8956 -1.9813) (xy -2.809499 -1.881333) (xy -2.748208 -1.785215)
(xy -2.711519 -1.692408) (xy -2.699223 -1.602375) (xy -2.711112 -1.514578) (xy -2.712611 -1.509299)
(xy -2.730101 -1.485264) (xy -2.757521 -1.480527) (xy -2.782897 -1.493695) (xy -2.798812 -1.514384)
(xy -2.821315 -1.551532) (xy -2.846481 -1.598476) (xy -2.856453 -1.618583) (xy -2.902134 -1.698027)
(xy -2.960572 -1.777419) (xy -3.026175 -1.850389) (xy -3.093348 -1.910567) (xy -3.142094 -1.943877)
(xy -3.182332 -1.963829) (xy -3.223786 -1.976786) (xy -3.269617 -1.982409) (xy -3.322983 -1.980356)
(xy -3.387045 -1.970285) (xy -3.464962 -1.951855) (xy -3.559894 -1.924724) (xy -3.675001 -1.888553)
(xy -3.685386 -1.88519) (xy -3.762318 -1.861695) (xy -3.830646 -1.843629) (xy -3.885143 -1.83226)
(xy -3.917799 -1.8288) (xy -3.953627 -1.832227) (xy -4.006321 -1.841524) (xy -4.068433 -1.855221)
(xy -4.124963 -1.869742) (xy -4.192814 -1.88762) (xy -4.247935 -1.899462) (xy -4.299608 -1.906491)
(xy -4.357116 -1.909927) (xy -4.429744 -1.910993) (xy -4.43865 -1.911017) (xy -4.507422 -1.910831)
(xy -4.556677 -1.909364) (xy -4.592296 -1.905741) (xy -4.620159 -1.899084) (xy -4.646146 -1.888519)
(xy -4.669638 -1.876611) (xy -4.738294 -1.829877) (xy -4.787027 -1.771399) (xy -4.817111 -1.698735)
(xy -4.829818 -1.609441) (xy -4.83032 -1.56845) (xy -4.824115 -1.487606) (xy -4.807464 -1.408045)
(xy -4.77887 -1.326526) (xy -4.736838 -1.239812) (xy -4.679872 -1.144663) (xy -4.606475 -1.037838)
(xy -4.550188 -0.961849) (xy -4.470176 -0.855927) (xy -4.402973 -0.766226) (xy -4.345794 -0.688916)
(xy -4.295854 -0.62017) (xy -4.250367 -0.556157) (xy -4.20655 -0.49305) (xy -4.167305 -0.435438)
(xy -4.112148 -0.356192) (xy -4.066991 -0.297023) (xy -4.029672 -0.255709) (xy -3.998028 -0.230026)
(xy -3.969899 -0.217753) (xy -3.953815 -0.2159) (xy -3.927026 -0.222426) (xy -3.887812 -0.239518)
(xy -3.845452 -0.263012) (xy -3.794775 -0.291253) (xy -3.750663 -0.306984) (xy -3.700542 -0.314393)
(xy -3.688685 -0.315245) (xy -3.643064 -0.317052) (xy -3.61441 -0.313935) (xy -3.594466 -0.303952)
(xy -3.578948 -0.289413) (xy -3.552203 -0.265406) (xy -3.528626 -0.250736) (xy -3.528373 -0.250641)
(xy -3.488318 -0.248831) (xy -3.437618 -0.267473) (xy -3.378898 -0.305361) (xy -3.34118 -0.336589)
(xy -3.280268 -0.387936) (xy -3.233462 -0.420332) (xy -3.199093 -0.434731) (xy -3.17549 -0.43209)
(xy -3.174836 -0.431699) (xy -3.164055 -0.42039) (xy -3.167539 -0.40239) (xy -3.175312 -0.386768)
(xy -3.194487 -0.360719) (xy -3.22906 -0.322792) (xy -3.274694 -0.2771) (xy -3.327053 -0.227753)
(xy -3.381798 -0.178862) (xy -3.434593 -0.13454) (xy -3.472064 -0.105464) (xy -3.515199 -0.07548)
(xy -3.548015 -0.06065) (xy -3.578026 -0.061137) (xy -3.612747 -0.077099) (xy -3.659691 -0.108697)
(xy -3.660805 -0.109489) (xy -3.69945 -0.133202) (xy -3.734998 -0.148786) (xy -3.752727 -0.1524)
(xy -3.776973 -0.146248) (xy -3.816454 -0.129702) (xy -3.864739 -0.105633) (xy -3.89504 -0.0889)
(xy -3.962724 -0.052377) (xy -4.015056 -0.031067) (xy -4.056972 -0.024903) (xy -4.093405 -0.033814)
(xy -4.129293 -0.057733) (xy -4.15855 -0.085206) (xy -4.192546 -0.12247) (xy -4.239272 -0.177852)
(xy -4.296718 -0.248784) (xy -4.362876 -0.332698) (xy -4.435737 -0.427025) (xy -4.513293 -0.529197)
(xy -4.593534 -0.636645) (xy -4.6531 -0.71755) (xy -4.756853 -0.867147) (xy -4.83923 -1.003118)
(xy -4.900255 -1.125512) (xy -4.939956 -1.234379) (xy -4.947536 -1.26365) (xy -4.960175 -1.344731)
(xy -4.964561 -1.436973) (xy -4.961073 -1.53188) (xy -4.950095 -1.620958) (xy -4.932007 -1.695711)
(xy -4.927587 -1.70815) (xy -4.870443 -1.82887) (xy -4.79909 -1.928663) (xy -4.713946 -2.00737)
(xy -4.615427 -2.064829) (xy -4.50395 -2.100883) (xy -4.379932 -2.115369) (xy -4.243791 -2.108129)
(xy -4.095944 -2.079002) (xy -4.019348 -2.056691) (xy -3.952205 -2.037116) (xy -3.893447 -2.025531)
(xy -3.837091 -2.022178) (xy -3.777152 -2.0273) (xy -3.70765 -2.041139) (xy -3.622601 -2.063938)
(xy -3.58775 -2.074169) (xy -3.458068 -2.109864) (xy -3.347441 -2.133057) (xy -3.252569 -2.143306)
(xy -3.170154 -2.140166)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 3.125447 -5.113898) (xy 3.143864 -5.101845) (xy 3.14438 -5.100685) (xy 3.145808 -5.083054)
(xy 3.145819 -5.044292) (xy 3.144513 -4.988624) (xy 3.141994 -4.920273) (xy 3.138362 -4.843462)
(xy 3.138031 -4.83716) (xy 3.135938 -4.787419) (xy 3.133651 -4.714594) (xy 3.131213 -4.621001)
(xy 3.128667 -4.508955) (xy 3.126057 -4.380771) (xy 3.123425 -4.238766) (xy 3.120816 -4.085253)
(xy 3.118272 -3.922549) (xy 3.115836 -3.752969) (xy 3.113551 -3.578828) (xy 3.111761 -3.429)
(xy 3.107743 -3.078904) (xy 3.103937 -2.753278) (xy 3.100326 -2.451193) (xy 3.09689 -2.171719)
(xy 3.09361 -1.913928) (xy 3.090467 -1.67689) (xy 3.087443 -1.459677) (xy 3.084519 -1.261359)
(xy 3.081675 -1.081008) (xy 3.078893 -0.917694) (xy 3.076154 -0.770488) (xy 3.07344 -0.638461)
(xy 3.07073 -0.520684) (xy 3.068007 -0.416228) (xy 3.065251 -0.324163) (xy 3.062443 -0.243562)
(xy 3.059566 -0.173494) (xy 3.056599 -0.113031) (xy 3.053524 -0.061243) (xy 3.050321 -0.017202)
(xy 3.046973 0.020022) (xy 3.04346 0.051357) (xy 3.040572 0.072452) (xy 3.030798 0.115623)
(xy 3.017557 0.146165) (xy 3.003408 0.159848) (xy 2.991544 0.153523) (xy 2.987167 0.1346)
(xy 2.983071 0.09236) (xy 2.979255 0.02666) (xy 2.975717 -0.062642) (xy 2.972456 -0.175687)
(xy 2.96947 -0.312618) (xy 2.966757 -0.473577) (xy 2.964315 -0.658707) (xy 2.962142 -0.868149)
(xy 2.960237 -1.102045) (xy 2.958599 -1.360538) (xy 2.957224 -1.64377) (xy 2.956113 -1.951882)
(xy 2.955262 -2.285018) (xy 2.95467 -2.643318) (xy 2.954426 -2.887183) (xy 2.95275 -5.069516)
(xy 2.982731 -5.093808) (xy 3.012031 -5.108364) (xy 3.051162 -5.116802) (xy 3.091757 -5.118765)
(xy 3.125447 -5.113898)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 3.13055 1.194435) (xy 3.241022 1.324292) (xy 3.282992 1.372475) (xy 3.338214 1.434165)
(xy 3.402318 1.504574) (xy 3.470932 1.578916) (xy 3.539688 1.652403) (xy 3.564872 1.679033)
(xy 3.639031 1.757195) (xy 3.720994 1.843588) (xy 3.804682 1.931805) (xy 3.884016 2.015438)
(xy 3.952919 2.088079) (xy 3.962572 2.098256) (xy 4.059292 2.201216) (xy 4.137788 2.286947)
(xy 4.198268 2.355693) (xy 4.240941 2.4077) (xy 4.266015 2.443215) (xy 4.273698 2.462484)
(xy 4.273066 2.464581) (xy 4.255399 2.470414) (xy 4.221722 2.459997) (xy 4.17425 2.434771)
(xy 4.115199 2.396176) (xy 4.046784 2.345654) (xy 3.971221 2.284647) (xy 3.895866 2.219218)
(xy 3.842618 2.172758) (xy 3.792518 2.131424) (xy 3.75013 2.098813) (xy 3.720017 2.078523)
(xy 3.712659 2.074757) (xy 3.682048 2.066698) (xy 3.63903 2.061032) (xy 3.590889 2.057979)
(xy 3.54491 2.057759) (xy 3.508379 2.060592) (xy 3.488579 2.066699) (xy 3.487471 2.067961)
(xy 3.49217 2.081421) (xy 3.509388 2.111724) (xy 3.536786 2.155112) (xy 3.572025 2.207827)
(xy 3.596112 2.242586) (xy 3.662464 2.3395) (xy 3.712388 2.417885) (xy 3.746194 2.478318)
(xy 3.764191 2.521374) (xy 3.766689 2.547631) (xy 3.76327 2.553709) (xy 3.750563 2.560121)
(xy 3.732198 2.557726) (xy 3.706608 2.545281) (xy 3.672227 2.521545) (xy 3.627488 2.485275)
(xy 3.570824 2.435227) (xy 3.500668 2.37016) (xy 3.415454 2.28883) (xy 3.3528 2.228166)
(xy 3.20675 2.08618) (xy 3.05435 2.096227) (xy 2.988629 2.100334) (xy 2.926626 2.103812)
(xy 2.875889 2.106259) (xy 2.846907 2.107236) (xy 2.791865 2.1082) (xy 2.830444 2.155825)
(xy 2.851251 2.181368) (xy 2.884658 2.222209) (xy 2.927127 2.274033) (xy 2.975121 2.332521)
(xy 3.013896 2.379723) (xy 3.07737 2.457602) (xy 3.125529 2.518359) (xy 3.159764 2.564005)
(xy 3.181464 2.596553) (xy 3.19202 2.618013) (xy 3.19282 2.630398) (xy 3.189613 2.634067)
(xy 3.173641 2.631466) (xy 3.144734 2.617332) (xy 3.122736 2.603685) (xy 3.097391 2.584163)
(xy 3.057207 2.550114) (xy 3.005652 2.50462) (xy 2.946194 2.450764) (xy 2.882302 2.391626)
(xy 2.85115 2.362338) (xy 2.761456 2.279172) (xy 2.686119 2.21273) (xy 2.625907 2.163655)
(xy 2.58159 2.132595) (xy 2.568968 2.125596) (xy 2.535134 2.109714) (xy 2.508218 2.101032)
(xy 2.479811 2.098665) (xy 2.441505 2.101731) (xy 2.397518 2.10758) (xy 2.320758 2.115995)
(xy 2.227077 2.122683) (xy 2.122762 2.12752) (xy 2.014098 2.130383) (xy 1.907372 2.131149)
(xy 1.808869 2.129694) (xy 1.724876 2.125895) (xy 1.677386 2.121694) (xy 1.594179 2.109791)
(xy 1.528122 2.095827) (xy 1.480971 2.080485) (xy 1.454483 2.064447) (xy 1.450415 2.048396)
(xy 1.461394 2.037796) (xy 1.478276 2.034112) (xy 1.515742 2.029547) (xy 1.569013 2.024577)
(xy 1.63331 2.019671) (xy 1.667371 2.017436) (xy 1.733827 2.012734) (xy 1.811227 2.006325)
(xy 1.895825 1.998615) (xy 1.983872 1.990011) (xy 2.071623 1.980921) (xy 2.155329 1.97175)
(xy 2.231245 1.962906) (xy 2.295622 1.954795) (xy 2.344714 1.947823) (xy 2.374774 1.942399)
(xy 2.382411 1.939822) (xy 2.380621 1.925593) (xy 2.36724 1.898235) (xy 2.346502 1.864482)
(xy 2.322644 1.83107) (xy 2.299902 1.804735) (xy 2.294065 1.799336) (xy 2.231211 1.759923)
(xy 2.151957 1.732536) (xy 2.120114 1.727322) (xy 2.4765 1.727322) (xy 2.483633 1.742545)
(xy 2.502773 1.772778) (xy 2.530532 1.812829) (xy 2.547706 1.836431) (xy 2.581559 1.881362)
(xy 2.605201 1.909165) (xy 2.623102 1.923441) (xy 2.639732 1.927791) (xy 2.658831 1.92594)
(xy 2.688769 1.922146) (xy 2.736205 1.917553) (xy 2.793283 1.912884) (xy 2.82575 1.910559)
(xy 2.880236 1.906437) (xy 2.924923 1.902251) (xy 2.953939 1.898596) (xy 2.961608 1.896789)
(xy 2.958347 1.88518) (xy 2.942336 1.858204) (xy 2.91648 1.820495) (xy 2.898108 1.795519)
(xy 2.82575 1.699414) (xy 2.7051 1.706891) (xy 2.644976 1.710264) (xy 2.587827 1.712862)
(xy 2.542962 1.714284) (xy 2.530475 1.714434) (xy 2.497509 1.717161) (xy 2.478412 1.723942)
(xy 2.4765 1.727322) (xy 2.120114 1.727322) (xy 2.082414 1.721149) (xy 2.048747 1.718892)
(xy 1.993701 1.716088) (xy 1.921283 1.712904) (xy 1.835505 1.709503) (xy 1.740376 1.706051)
(xy 1.639906 1.702712) (xy 1.6129 1.701867) (xy 1.443125 1.695673) (xy 1.298462 1.688329)
(xy 1.258382 1.685478) (xy 3.0532 1.685478) (xy 3.061364 1.705938) (xy 3.085355 1.737108)
(xy 3.123274 1.781537) (xy 3.124765 1.783288) (xy 3.215169 1.889458) (xy 3.350659 1.882731)
(xy 3.408732 1.879242) (xy 3.458789 1.87512) (xy 3.494466 1.870952) (xy 3.50776 1.868224)
(xy 3.514409 1.861432) (xy 3.510043 1.847344) (xy 3.492703 1.82297) (xy 3.460429 1.785316)
(xy 3.435239 1.757465) (xy 3.341108 1.654486) (xy 3.216779 1.659787) (xy 3.142652 1.662884)
(xy 3.091946 1.666499) (xy 3.062761 1.673181) (xy 3.0532 1.685478) (xy 1.258382 1.685478)
(xy 1.178643 1.679806) (xy 1.083404 1.670074) (xy 1.012479 1.659103) (xy 0.965604 1.646864)
(xy 0.942513 1.633327) (xy 0.9398 1.626341) (xy 0.944585 1.620395) (xy 0.96014 1.615139)
(xy 0.988261 1.610457) (xy 1.030747 1.606234) (xy 1.089395 1.602353) (xy 1.166003 1.598699)
(xy 1.262368 1.595155) (xy 1.380287 1.591605) (xy 1.521559 1.587933) (xy 1.54305 1.587409)
(xy 1.652359 1.584565) (xy 1.754494 1.581535) (xy 1.846476 1.578433) (xy 1.925325 1.575378)
(xy 1.988063 1.572485) (xy 2.03171 1.569871) (xy 2.053287 1.567653) (xy 2.054225 1.567426)
(xy 2.077096 1.553654) (xy 2.080817 1.529017) (xy 2.065843 1.49016) (xy 2.064956 1.488444)
(xy 2.022713 1.432342) (xy 1.964525 1.395988) (xy 1.9304 1.385384) (xy 1.903561 1.38217)
(xy 1.853478 1.37924) (xy 1.782307 1.376646) (xy 1.692202 1.374442) (xy 1.585319 1.372678)
(xy 1.463812 1.371407) (xy 1.329837 1.370681) (xy 1.3208 1.370654) (xy 1.278104 1.370484)
(xy 2.2352 1.370484) (xy 2.24117 1.386218) (xy 2.257038 1.417791) (xy 2.279736 1.459199)
(xy 2.287097 1.472084) (xy 2.338995 1.5621) (xy 2.449022 1.560615) (xy 2.512348 1.558882)
(xy 2.577849 1.555679) (xy 2.632602 1.551656) (xy 2.638418 1.55109) (xy 2.717786 1.54305)
(xy 2.657468 1.443455) (xy 2.59715 1.343861) (xy 2.5146 1.35129) (xy 2.457772 1.355137)
(xy 2.390846 1.357855) (xy 2.333625 1.358809) (xy 2.287263 1.360226) (xy 2.25265 1.363903)
(xy 2.235888 1.369114) (xy 2.2352 1.370484) (xy 1.278104 1.370484) (xy 1.166842 1.370041)
(xy 1.036526 1.369095) (xy 0.928094 1.367735) (xy 0.839789 1.365884) (xy 0.769853 1.363462)
(xy 0.716528 1.36039) (xy 0.678058 1.35659) (xy 0.652685 1.351983) (xy 0.638652 1.34649)
(xy 0.634201 1.340032) (xy 0.634197 1.33985) (xy 2.794348 1.33985) (xy 2.91465 1.523572)
(xy 3.0226 1.523646) (xy 3.079221 1.522759) (xy 3.132017 1.520341) (xy 3.171277 1.516873)
(xy 3.17716 1.516013) (xy 3.223771 1.508305) (xy 3.15176 1.415117) (xy 3.07975 1.321928)
(xy 3.0099 1.322742) (xy 2.954128 1.324826) (xy 2.892835 1.329173) (xy 2.867199 1.331703)
(xy 2.794348 1.33985) (xy 0.634197 1.33985) (xy 0.639892 1.332257) (xy 0.657736 1.324885)
(xy 0.688733 1.317661) (xy 0.733886 1.310513) (xy 0.794199 1.30337) (xy 0.870675 1.29616)
(xy 0.964317 1.28881) (xy 1.076129 1.28125) (xy 1.207113 1.273407) (xy 1.358273 1.26521)
(xy 1.530612 1.256587) (xy 1.725134 1.247466) (xy 1.942842 1.237776) (xy 2.184739 1.227444)
(xy 2.2352 1.225332) (xy 2.373609 1.219612) (xy 2.506174 1.214236) (xy 2.630416 1.209298)
(xy 2.743853 1.204893) (xy 2.844004 1.201115) (xy 2.928388 1.198056) (xy 2.994525 1.195811)
(xy 3.039934 1.194473) (xy 3.0607 1.194121) (xy 3.13055 1.194435)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 2.018702 0.731077) (xy 2.227672 0.731196) (xy 2.414714 0.731435) (xy 2.580986 0.731805)
(xy 2.727645 0.732316) (xy 2.85585 0.732977) (xy 2.966756 0.733799) (xy 3.061521 0.734792)
(xy 3.141304 0.735965) (xy 3.207261 0.737329) (xy 3.260549 0.738895) (xy 3.302327 0.740671)
(xy 3.333751 0.742668) (xy 3.355979 0.744896) (xy 3.369168 0.747127) (xy 3.414699 0.76094)
(xy 3.458155 0.782666) (xy 3.507338 0.816601) (xy 3.535576 0.838731) (xy 3.578688 0.875642)
(xy 3.636434 0.928441) (xy 3.70612 0.994444) (xy 3.785051 1.070971) (xy 3.870531 1.155339)
(xy 3.959866 1.244864) (xy 4.05036 1.336866) (xy 4.139318 1.42866) (xy 4.224046 1.517566)
(xy 4.301849 1.600901) (xy 4.307572 1.607115) (xy 4.447189 1.761314) (xy 4.568363 1.900675)
(xy 4.672066 2.026741) (xy 4.759267 2.141055) (xy 4.830938 2.245159) (xy 4.888048 2.340595)
(xy 4.931568 2.428908) (xy 4.962468 2.511639) (xy 4.981719 2.590331) (xy 4.99029 2.666527)
(xy 4.990949 2.693546) (xy 4.978598 2.785235) (xy 4.941128 2.876095) (xy 4.878415 2.96641)
(xy 4.860475 2.98706) (xy 4.806657 3.046771) (xy 3.778103 3.085519) (xy 3.541928 3.094243)
(xy 3.329462 3.101699) (xy 3.139049 3.107913) (xy 2.969029 3.11291) (xy 2.817746 3.116715)
(xy 2.683543 3.119351) (xy 2.56476 3.120844) (xy 2.459742 3.121219) (xy 2.366829 3.1205)
(xy 2.284366 3.118712) (xy 2.210693 3.115879) (xy 2.144153 3.112027) (xy 2.119684 3.110247)
(xy 2.040007 3.102272) (xy 1.959919 3.091003) (xy 1.88338 3.077353) (xy 1.814353 3.062234)
(xy 1.756799 3.046556) (xy 1.714679 3.031233) (xy 1.691954 3.017176) (xy 1.6891 3.011128)
(xy 1.691155 3.006714) (xy 1.698597 3.002721) (xy 1.713341 2.999009) (xy 1.737303 2.995438)
(xy 1.772397 2.991866) (xy 1.820538 2.988152) (xy 1.883642 2.984158) (xy 1.963624 2.97974)
(xy 2.0624 2.974761) (xy 2.181883 2.969077) (xy 2.323989 2.96255) (xy 2.39395 2.959385)
(xy 2.666064 2.947095) (xy 2.91396 2.93586) (xy 3.138791 2.925624) (xy 3.341716 2.91633)
(xy 3.52389 2.907922) (xy 3.686468 2.900344) (xy 3.830608 2.89354) (xy 3.957465 2.887453)
(xy 4.068196 2.882028) (xy 4.163956 2.877209) (xy 4.245902 2.872938) (xy 4.31519 2.86916)
(xy 4.372976 2.865819) (xy 4.420416 2.862859) (xy 4.458667 2.860223) (xy 4.488884 2.857855)
(xy 4.4958 2.857256) (xy 4.618062 2.844628) (xy 4.716407 2.829967) (xy 4.792292 2.812266)
(xy 4.84718 2.790516) (xy 4.88253 2.763711) (xy 4.899803 2.730842) (xy 4.900459 2.690903)
(xy 4.885959 2.642886) (xy 4.866359 2.601614) (xy 4.825398 2.531767) (xy 4.768903 2.447133)
(xy 4.698833 2.349948) (xy 4.617145 2.242444) (xy 4.525798 2.126857) (xy 4.426749 2.005422)
(xy 4.321957 1.880372) (xy 4.21338 1.753943) (xy 4.102975 1.628369) (xy 3.9927 1.505884)
(xy 3.884514 1.388722) (xy 3.780374 1.279119) (xy 3.682239 1.179309) (xy 3.592067 1.091527)
(xy 3.511815 1.018006) (xy 3.443442 0.960981) (xy 3.403007 0.931618) (xy 3.37687 0.917279)
(xy 3.344665 0.90659) (xy 3.300617 0.898242) (xy 3.23895 0.890924) (xy 3.212507 0.888397)
(xy 3.180541 0.88658) (xy 3.124285 0.884708) (xy 3.04485 0.882793) (xy 2.943345 0.880848)
(xy 2.820881 0.878888) (xy 2.678569 0.876924) (xy 2.517517 0.874971) (xy 2.338838 0.873041)
(xy 2.14364 0.871147) (xy 1.933034 0.869303) (xy 1.70813 0.867522) (xy 1.470039 0.865817)
(xy 1.21987 0.864201) (xy 1.12395 0.863625) (xy 0.898917 0.862225) (xy 0.679523 0.860708)
(xy 0.467268 0.859092) (xy 0.26365 0.857395) (xy 0.070167 0.855633) (xy -0.111682 0.853825)
(xy -0.280399 0.851987) (xy -0.434484 0.850137) (xy -0.572439 0.848291) (xy -0.692765 0.846467)
(xy -0.793964 0.844683) (xy -0.874537 0.842956) (xy -0.932986 0.841303) (xy -0.967811 0.839741)
(xy -0.97155 0.839463) (xy -1.037781 0.833413) (xy -1.083462 0.827579) (xy -1.113407 0.820856)
(xy -1.132432 0.812135) (xy -1.145351 0.800309) (xy -1.146175 0.799306) (xy -1.162555 0.7759)
(xy -1.1684 0.762072) (xy -1.15575 0.758369) (xy -1.117991 0.754886) (xy -1.055417 0.751627)
(xy -0.968319 0.748594) (xy -0.856988 0.745791) (xy -0.721716 0.743223) (xy -0.562795 0.740891)
(xy -0.380516 0.738799) (xy -0.175171 0.73695) (xy 0.052948 0.735349) (xy 0.303551 0.733998)
(xy 0.576344 0.7329) (xy 0.871037 0.73206) (xy 1.187337 0.731479) (xy 1.524954 0.731163)
(xy 1.53035 0.73116) (xy 1.786647 0.731068) (xy 2.018702 0.731077)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy -1.047717 0.026842) (xy -0.955302 0.030664) (xy -0.868396 0.036587) (xy -0.791468 0.044209)
(xy -0.728988 0.05313) (xy -0.685426 0.062947) (xy -0.673186 0.067551) (xy -0.649413 0.089913)
(xy -0.637075 0.122698) (xy -0.638367 0.155577) (xy -0.6504 0.17477) (xy -0.673051 0.18306)
(xy -0.720369 0.191175) (xy -0.791622 0.199055) (xy -0.886077 0.206645) (xy -1.003002 0.213887)
(xy -1.141663 0.220724) (xy -1.30133 0.227099) (xy -1.33985 0.228456) (xy -1.556932 0.236891)
(xy -1.751859 0.246636) (xy -1.927858 0.258034) (xy -2.088156 0.27143) (xy -2.235981 0.287167)
(xy -2.374559 0.305589) (xy -2.507117 0.327041) (xy -2.636883 0.351867) (xy -2.767082 0.38041)
(xy -2.7686 0.380762) (xy -2.913582 0.417516) (xy -3.06258 0.46093) (xy -3.211387 0.509423)
(xy -3.35579 0.561409) (xy -3.491582 0.615308) (xy -3.614552 0.669534) (xy -3.720491 0.722505)
(xy -3.797952 0.767899) (xy -3.874049 0.821807) (xy -3.943969 0.880179) (xy -4.004695 0.939717)
(xy -4.05321 0.99712) (xy -4.086497 1.049088) (xy -4.101539 1.092322) (xy -4.102101 1.100594)
(xy -4.090091 1.139718) (xy -4.055409 1.183236) (xy -4.000071 1.229583) (xy -3.926094 1.277193)
(xy -3.835497 1.324498) (xy -3.78324 1.348132) (xy -3.692833 1.384127) (xy -3.596446 1.416255)
(xy -3.489883 1.445606) (xy -3.368944 1.473271) (xy -3.229431 1.500339) (xy -3.131833 1.517289)
(xy -2.946357 1.551674) (xy -2.77451 1.590219) (xy -2.618105 1.63231) (xy -2.478951 1.677332)
(xy -2.35886 1.724672) (xy -2.259642 1.773714) (xy -2.183108 1.823845) (xy -2.153951 1.84909)
(xy -2.121044 1.888548) (xy -2.099391 1.934759) (xy -2.087268 1.993419) (xy -2.082952 2.070226)
(xy -2.082871 2.084083) (xy -2.083628 2.124262) (xy -2.087131 2.159089) (xy -2.09513 2.192479)
(xy -2.109378 2.228348) (xy -2.131624 2.270609) (xy -2.163619 2.323178) (xy -2.207115 2.38997)
(xy -2.245256 2.447154) (xy -2.297885 2.526726) (xy -2.337378 2.589374) (xy -2.365516 2.638734)
(xy -2.384078 2.678442) (xy -2.394844 2.712132) (xy -2.399595 2.74344) (xy -2.4003 2.763803)
(xy -2.394635 2.814441) (xy -2.37668 2.862417) (xy -2.344998 2.908683) (xy -2.298149 2.954194)
(xy -2.234694 2.999901) (xy -2.153197 3.046759) (xy -2.052217 3.095719) (xy -1.930317 3.147736)
(xy -1.786059 3.203763) (xy -1.674764 3.244527) (xy -1.504423 3.30657) (xy -1.356135 3.362609)
(xy -1.227591 3.413821) (xy -1.116479 3.46138) (xy -1.020489 3.506463) (xy -0.937309 3.550245)
(xy -0.86463 3.593901) (xy -0.800141 3.638608) (xy -0.741531 3.685541) (xy -0.68649 3.735876)
(xy -0.662796 3.759414) (xy -0.615596 3.808545) (xy -0.585033 3.84376) (xy -0.571884 3.865218)
(xy -0.576926 3.873078) (xy -0.600938 3.867498) (xy -0.644698 3.848638) (xy -0.708983 3.816657)
(xy -0.7747 3.782266) (xy -0.903394 3.716967) (xy -1.034117 3.656796) (xy -1.172197 3.599583)
(xy -1.322961 3.543157) (xy -1.491737 3.485347) (xy -1.550315 3.466235) (xy -1.714408 3.412309)
(xy -1.855733 3.363711) (xy -1.976169 3.319629) (xy -2.077594 3.279251) (xy -2.161888 3.241762)
(xy -2.230928 3.20635) (xy -2.286593 3.172204) (xy -2.330763 3.138509) (xy -2.350768 3.119944)
(xy -2.414654 3.03921) (xy -2.456001 2.948237) (xy -2.474913 2.848297) (xy -2.471491 2.740661)
(xy -2.44584 2.626602) (xy -2.398061 2.507391) (xy -2.328258 2.384301) (xy -2.286319 2.32333)
(xy -2.239286 2.255638) (xy -2.199531 2.192504) (xy -2.16933 2.137967) (xy -2.150957 2.096065)
(xy -2.1463 2.074739) (xy -2.15794 2.043797) (xy -2.190737 2.00825) (xy -2.241506 1.970747)
(xy -2.307064 1.933939) (xy -2.326746 1.924529) (xy -2.372804 1.904155) (xy -2.420842 1.884963)
(xy -2.472937 1.866451) (xy -2.531163 1.848115) (xy -2.597595 1.829454) (xy -2.674311 1.809964)
(xy -2.763384 1.789144) (xy -2.86689 1.76649) (xy -2.986905 1.7415) (xy -3.125504 1.713671)
(xy -3.284763 1.682501) (xy -3.466757 1.647488) (xy -3.48615 1.643782) (xy -3.618636 1.615605)
(xy -3.730462 1.5849) (xy -3.826364 1.54967) (xy -3.911078 1.507917) (xy -3.989337 1.457645)
(xy -4.06042 1.401544) (xy -4.107279 1.3588) (xy -4.138249 1.321121) (xy -4.156086 1.281525)
(xy -4.163547 1.233028) (xy -4.16339 1.168647) (xy -4.162192 1.143748) (xy -4.145989 1.011446)
(xy -4.112087 0.896327) (xy -4.059567 0.796502) (xy -3.98751 0.710086) (xy -3.924714 0.656383)
(xy -3.848899 0.605412) (xy -3.752958 0.550527) (xy -3.641428 0.493896) (xy -3.518844 0.437689)
(xy -3.389741 0.384074) (xy -3.258655 0.335221) (xy -3.2385 0.328231) (xy -3.07935 0.27891)
(xy -2.898805 0.232317) (xy -2.700777 0.189016) (xy -2.489181 0.149573) (xy -2.267928 0.114552)
(xy -2.040932 0.084518) (xy -1.812105 0.060035) (xy -1.58536 0.041669) (xy -1.36461 0.029985)
(xy -1.153768 0.025546) (xy -1.141171 0.025522) (xy -1.047717 0.026842)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 0.487051 4.32865) (xy 0.505201 4.354112) (xy 0.518026 4.384655) (xy 0.5207 4.401978)
(xy 0.511277 4.431613) (xy 0.484726 4.474554) (xy 0.443617 4.528078) (xy 0.390524 4.589461)
(xy 0.328018 4.655979) (xy 0.258674 4.724908) (xy 0.185062 4.793524) (xy 0.109756 4.859102)
(xy 0.035327 4.918919) (xy 0.025345 4.926512) (xy -0.034388 4.968039) (xy -0.104026 5.010837)
(xy -0.177208 5.051506) (xy -0.247572 5.086649) (xy -0.308757 5.112866) (xy -0.346075 5.124947)
(xy -0.37108 5.128377) (xy -0.380076 5.11792) (xy -0.381 5.103144) (xy -0.369824 5.072653)
(xy -0.335458 5.037867) (xy -0.328466 5.032358) (xy -0.305784 5.013367) (xy -0.267507 4.979541)
(xy -0.216501 4.933491) (xy -0.155632 4.877826) (xy -0.087767 4.815157) (xy -0.015772 4.748094)
(xy 0.000602 4.73276) (xy 0.118639 4.622579) (xy 0.218985 4.529929) (xy 0.302011 4.45448)
(xy 0.368089 4.395906) (xy 0.41759 4.353876) (xy 0.450885 4.328064) (xy 0.468346 4.31814)
(xy 0.469505 4.318) (xy 0.487051 4.32865)) (layer F.SilkS) (width 0.01))
(fp_poly (pts (xy 0.313054 3.983364) (xy 0.380867 4.008586) (xy 0.406277 4.020345) (xy 0.498585 4.070114)
(xy 0.586655 4.129748) (xy 0.673262 4.201821) (xy 0.761179 4.288906) (xy 0.853177 4.393577)
(xy 0.952031 4.518408) (xy 0.973447 4.546792) (xy 1.073473 4.683022) (xy 1.156787 4.802305)
(xy 1.223228 4.904379) (xy 1.272637 4.988982) (xy 1.304856 5.055853) (xy 1.319724 5.10473)
(xy 1.3208 5.117541) (xy 1.311208 5.176318) (xy 1.284625 5.245043) (xy 1.244337 5.318369)
(xy 1.193632 5.390949) (xy 1.135797 5.457438) (xy 1.081517 5.50674) (xy 1.005268 5.562399)
(xy 0.913891 5.62149) (xy 0.816098 5.678683) (xy 0.720603 5.72865) (xy 0.71124 5.733176)
(xy 0.652898 5.760026) (xy 0.615056 5.774441) (xy 0.596157 5.776581) (xy 0.594642 5.766605)
(xy 0.608954 5.744674) (xy 0.609814 5.743575) (xy 0.626724 5.723291) (xy 0.6574 5.68768)
(xy 0.698689 5.640357) (xy 0.747434 5.584936) (xy 0.800482 5.525034) (xy 0.803102 5.522086)
(xy 0.901948 5.408998) (xy 0.98321 5.31161) (xy 1.047894 5.228314) (xy 1.097007 5.157501)
(xy 1.131554 5.097564) (xy 1.152541 5.046894) (xy 1.160976 5.003883) (xy 1.157863 4.966924)
(xy 1.155521 4.958809) (xy 1.141909 4.929212) (xy 1.117695 4.88685) (xy 1.087357 4.839394)
(xy 1.076774 4.823936) (xy 1.001032 4.720483) (xy 0.919597 4.618413) (xy 0.835342 4.520723)
(xy 0.751142 4.430408) (xy 0.669873 4.350464) (xy 0.594409 4.283888) (xy 0.527626 4.233675)
(xy 0.487403 4.209775) (xy 0.446201 4.190525) (xy 0.410268 4.179124) (xy 0.369998 4.1736)
(xy 0.315783 4.171979) (xy 0.303279 4.17195) (xy 0.249787 4.172693) (xy 0.21009 4.17647)
(xy 0.174925 4.185601) (xy 0.135027 4.202407) (xy 0.087379 4.226031) (xy 0.041321 4.251736)
(xy -0.019235 4.288882) (xy -0.088441 4.333702) (xy -0.160449 4.38243) (xy -0.213733 4.419962)
(xy -0.278772 4.466125) (xy -0.340285 4.508767) (xy -0.393934 4.544956) (xy -0.435384 4.571765)
(xy -0.45893 4.585582) (xy -0.506646 4.60287) (xy -0.539863 4.600593) (xy -0.55655 4.580623)
(xy -0.554677 4.544836) (xy -0.540641 4.510222) (xy -0.520765 4.482514) (xy -0.484921 4.442741)
(xy -0.437065 4.394592) (xy -0.381154 4.341756) (xy -0.321143 4.28792) (xy -0.26099 4.236774)
(xy -0.204651 4.192007) (xy -0.179029 4.173083) (xy -0.118085 4.132186) (xy -0.046495 4.088138)
(xy 0.023336 4.048463) (xy 0.045936 4.036558) (xy 0.125356 3.999551) (xy 0.191929 3.978548)
(xy 0.252285 3.973252) (xy 0.313054 3.983364)) (layer F.SilkS) (width 0.01))
)
(module TestPoint:TestPoint_Pad_1.5x1.5mm (layer B.Cu) (tedit 5A0F774F) (tstamp 61B104B1)
(at 86 50.5)
(descr "SMD rectangular pad as test Point, square 1.5mm side length")
(tags "test point SMD pad rectangle square")
(path /61B0C87F)
(attr virtual)
(fp_text reference TP2 (at 0 1.648) (layer B.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(fp_text value TestPoint_Small (at 0 -1.75) (layer B.Fab)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(fp_line (start -0.95 0.95) (end 0.95 0.95) (layer B.SilkS) (width 0.12))
(fp_line (start 0.95 0.95) (end 0.95 -0.95) (layer B.SilkS) (width 0.12))
(fp_line (start 0.95 -0.95) (end -0.95 -0.95) (layer B.SilkS) (width 0.12))
(fp_line (start -0.95 -0.95) (end -0.95 0.95) (layer B.SilkS) (width 0.12))
(fp_line (start -1.25 1.25) (end 1.25 1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start -1.25 1.25) (end -1.25 -1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.25 -1.25) (end 1.25 1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.25 -1.25) (end -1.25 -1.25) (layer B.CrtYd) (width 0.05))
(fp_text user %R (at 0 1.65) (layer B.Fab)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(pad 1 smd rect (at 0 0) (size 1.5 1.5) (layers B.Cu B.Mask)
(net 1 Earth))
)
(module TestPoint:TestPoint_Pad_1.5x1.5mm (layer B.Cu) (tedit 5A0F774F) (tstamp 61B10897)
(at 50.5 50.5)
(descr "SMD rectangular pad as test Point, square 1.5mm side length")
(tags "test point SMD pad rectangle square")
(path /61B0AF58)
(attr virtual)
(fp_text reference TP1 (at 0 1.648) (layer B.SilkS) hide
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(fp_text value TestPoint_Small (at 0 -1.75) (layer B.Fab)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(fp_line (start -0.95 0.95) (end 0.95 0.95) (layer B.SilkS) (width 0.12))
(fp_line (start 0.95 0.95) (end 0.95 -0.95) (layer B.SilkS) (width 0.12))
(fp_line (start 0.95 -0.95) (end -0.95 -0.95) (layer B.SilkS) (width 0.12))
(fp_line (start -0.95 -0.95) (end -0.95 0.95) (layer B.SilkS) (width 0.12))
(fp_line (start -1.25 1.25) (end 1.25 1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start -1.25 1.25) (end -1.25 -1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.25 -1.25) (end 1.25 1.25) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.25 -1.25) (end -1.25 -1.25) (layer B.CrtYd) (width 0.05))
(fp_text user %R (at 0 1.65) (layer B.Fab)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(pad 1 smd rect (at 0 0) (size 1.5 1.5) (layers B.Cu B.Mask)
(net 1 Earth))
)
(gr_text JLCJLCJLCJLC (at 68 59.5) (layer B.SilkS)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(gr_text "Use with Macintosh 128/512/Plus or Apple Lisa" (at 68 59.5) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(gr_text Quack (at 46 50.5) (layer F.SilkS)
(effects (font (size 2 2) (thickness 0.3)))
)
(gr_arc (start 81.5 55) (end 81.5 57) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B100EF))
(gr_line (start 54.5 57) (end 81.5 57) (layer Edge.Cuts) (width 0.05) (tstamp 61B100E8))
(gr_arc (start 81.5 46) (end 83.5 46) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B100D6))
(gr_line (start 83.5 46) (end 83.5 55) (layer Edge.Cuts) (width 0.05) (tstamp 61B100CF))
(gr_line (start 54.5 44) (end 81.5 44) (layer Edge.Cuts) (width 0.05))
(gr_arc (start 54.5 55) (end 52.5 55) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B10074))
(gr_arc (start 54.5 46) (end 54.5 44) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B1006E))
(gr_line (start 52.5 46) (end 52.5 55) (layer Edge.Cuts) (width 0.05))
(gr_line (start 40 62.8) (end 96 62.8) (layer Edge.Cuts) (width 0.05) (tstamp 61B0A208))
(gr_line (start 38 42) (end 38 60.8) (layer Edge.Cuts) (width 0.05) (tstamp 61B0A1EF))
(gr_arc (start 40 60.8) (end 38 60.8) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B0A1C6))
(gr_arc (start 96 60.8) (end 96 62.8) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B0A1BD))
(gr_line (start 98 42) (end 98 60.8) (layer Edge.Cuts) (width 0.05))
(gr_arc (start 96 42) (end 98 42) (angle -90) (layer Edge.Cuts) (width 0.05) (tstamp 61B0A124))
(gr_arc (start 40 42) (end 40 40) (angle -90) (layer Edge.Cuts) (width 0.05))
(gr_line (start 40 40) (end 96 40) (layer Edge.Cuts) (width 0.05))
(via (at 96 41.999988) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 1))
(segment (start 86 50.5) (end 87.499988 50.5) (width 0.25) (layer B.Cu) (net 1))
(segment (start 87.499988 50.5) (end 96 41.999988) (width 0.25) (layer B.Cu) (net 1))
(via (at 39.999998 42) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 1))
(segment (start 96 41.999988) (end 40.00001 41.999988) (width 0.25) (layer F.Cu) (net 1))
(segment (start 48.499998 50.5) (end 39.999998 42) (width 0.25) (layer B.Cu) (net 1))
(segment (start 50.5 50.5) (end 48.499998 50.5) (width 0.25) (layer B.Cu) (net 1))
(segment (start 96 41.999988) (end 40.00001 41.999988) (width 0.25) (layer B.Cu) (net 1))
(segment (start 40.00001 41.999988) (end 39.999998 42) (width 0.25) (layer F.Cu) (net 1))
(segment (start 40.00001 41.999988) (end 39.999998 42) (width 0.25) (layer B.Cu) (net 1))
(zone (net 1) (net_name Earth) (layer F.Cu) (tstamp 61B0B678) (hatch edge 0.508)
(connect_pads (clearance 0.508))
(min_thickness 0.254)
(fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508))
(polygon
(pts
(xy 97 42) (xy 97 61) (xy 96 62) (xy 40 62) (xy 39 61)
(xy 39 42) (xy 40 41) (xy 96 41)
)
)
(filled_polygon
(pts
(xy 96.873 42.052606) (xy 96.873 60.947394) (xy 95.947394 61.873) (xy 40.052606 61.873) (xy 39.127 60.947394)
(xy 39.127 45.967582) (xy 51.84 45.967582) (xy 51.840001 55.032419) (xy 51.842852 55.061364) (xy 51.842765 55.073781)
(xy 51.843665 55.082952) (xy 51.884466 55.471145) (xy 51.896487 55.529708) (xy 51.907702 55.588501) (xy 51.910366 55.597323)
(xy 52.02579 55.970198) (xy 52.048975 56.025353) (xy 52.071379 56.080806) (xy 52.075706 56.088943) (xy 52.261357 56.432298)
(xy 52.29478 56.481849) (xy 52.327562 56.531946) (xy 52.333387 56.539087) (xy 52.582194 56.839841) (xy 52.624629 56.881981)
(xy 52.666492 56.92473) (xy 52.673592 56.930604) (xy 52.976077 57.177305) (xy 53.025904 57.210409) (xy 53.075259 57.244204)
(xy 53.083365 57.248587) (xy 53.428007 57.431837) (xy 53.483311 57.454631) (xy 53.538295 57.478198) (xy 53.547098 57.480923)
(xy 53.92077 57.593741) (xy 53.979458 57.605361) (xy 54.037961 57.617797) (xy 54.047126 57.61876) (xy 54.435595 57.65685)
(xy 54.435598 57.65685) (xy 54.467581 57.66) (xy 81.532419 57.66) (xy 81.561373 57.657148) (xy 81.573781 57.657235)
(xy 81.582952 57.656335) (xy 81.971145 57.615534) (xy 82.029708 57.603513) (xy 82.088501 57.592298) (xy 82.097323 57.589634)
(xy 82.470198 57.47421) (xy 82.525353 57.451025) (xy 82.580806 57.428621) (xy 82.588943 57.424294) (xy 82.932298 57.238643)
(xy 82.981849 57.20522) (xy 83.031946 57.172438) (xy 83.039087 57.166613) (xy 83.339841 56.917806) (xy 83.381981 56.875371)
(xy 83.42473 56.833508) (xy 83.430604 56.826408) (xy 83.677305 56.523923) (xy 83.710409 56.474096) (xy 83.744204 56.424741)
(xy 83.748587 56.416635) (xy 83.931837 56.071993) (xy 83.954631 56.016689) (xy 83.978198 55.961705) (xy 83.980923 55.952902)
(xy 84.093741 55.57923) (xy 84.105361 55.520542) (xy 84.117797 55.462039) (xy 84.11876 55.452874) (xy 84.15685 55.064405)
(xy 84.15685 55.064402) (xy 84.16 55.032419) (xy 84.16 45.967581) (xy 84.157148 45.938627) (xy 84.157235 45.926219)
(xy 84.156335 45.917047) (xy 84.115534 45.528855) (xy 84.103514 45.470299) (xy 84.092298 45.411498) (xy 84.089634 45.402677)
(xy 83.97421 45.029802) (xy 83.951025 44.974647) (xy 83.928621 44.919194) (xy 83.924294 44.911058) (xy 83.924294 44.911057)
(xy 83.924291 44.911053) (xy 83.738643 44.567702) (xy 83.705187 44.518101) (xy 83.672437 44.468054) (xy 83.666613 44.460913)
(xy 83.417806 44.160158) (xy 83.375371 44.118019) (xy 83.333508 44.075269) (xy 83.326407 44.069396) (xy 83.023923 43.822695)
(xy 82.974107 43.789598) (xy 82.924741 43.755795) (xy 82.916635 43.751413) (xy 82.571993 43.568163) (xy 82.516687 43.545368)
(xy 82.461704 43.521802) (xy 82.452901 43.519077) (xy 82.07923 43.406259) (xy 82.020542 43.394639) (xy 81.962039 43.382203)
(xy 81.952874 43.38124) (xy 81.564405 43.34315) (xy 81.564402 43.34315) (xy 81.532419 43.34) (xy 54.467581 43.34)
(xy 54.438627 43.342852) (xy 54.426219 43.342765) (xy 54.417047 43.343665) (xy 54.028855 43.384466) (xy 53.970299 43.396486)
(xy 53.911498 43.407702) (xy 53.902677 43.410366) (xy 53.529802 43.52579) (xy 53.474647 43.548975) (xy 53.419194 43.571379)
(xy 53.411062 43.575704) (xy 53.411057 43.575706) (xy 53.411053 43.575709) (xy 53.067702 43.761357) (xy 53.018101 43.794813)
(xy 52.968054 43.827563) (xy 52.960913 43.833387) (xy 52.660158 44.082194) (xy 52.618019 44.124629) (xy 52.575269 44.166492)
(xy 52.569396 44.173593) (xy 52.322695 44.476077) (xy 52.289598 44.525893) (xy 52.255795 44.575259) (xy 52.251413 44.583365)
(xy 52.068163 44.928007) (xy 52.045368 44.983313) (xy 52.021802 45.038296) (xy 52.019077 45.047099) (xy 51.906259 45.42077)
(xy 51.894639 45.479458) (xy 51.882203 45.537961) (xy 51.88124 45.547126) (xy 51.84315 45.935595) (xy 51.84 45.967582)
(xy 39.127 45.967582) (xy 39.127 42.052606) (xy 40.052606 41.127) (xy 95.947394 41.127)
)
)
)
(zone (net 1) (net_name Earth) (layer B.Cu) (tstamp 61B0B675) (hatch edge 0.508)
(connect_pads (clearance 0.508))
(min_thickness 0.254)
(fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508))
(polygon
(pts
(xy 97 42) (xy 97 61) (xy 96 62) (xy 40 62) (xy 39 61)
(xy 39 42) (xy 40 41) (xy 96 41)
)
)
(filled_polygon
(pts
(xy 96.873 42.052606) (xy 96.873 60.947394) (xy 95.947394 61.873) (xy 40.052606 61.873) (xy 39.127 60.947394)
(xy 39.127 51.25) (xy 49.111928 51.25) (xy 49.124188 51.374482) (xy 49.160498 51.49418) (xy 49.219463 51.604494)
(xy 49.298815 51.701185) (xy 49.395506 51.780537) (xy 49.50582 51.839502) (xy 49.625518 51.875812) (xy 49.75 51.888072)
(xy 50.21425 51.885) (xy 50.373 51.72625) (xy 50.373 50.627) (xy 49.27375 50.627) (xy 49.115 50.78575)
(xy 49.111928 51.25) (xy 39.127 51.25) (xy 39.127 49.75) (xy 49.111928 49.75) (xy 49.115 50.21425)
(xy 49.27375 50.373) (xy 50.373 50.373) (xy 50.373 49.27375) (xy 50.627 49.27375) (xy 50.627 50.373)
(xy 50.647 50.373) (xy 50.647 50.627) (xy 50.627 50.627) (xy 50.627 51.72625) (xy 50.78575 51.885)
(xy 51.25 51.888072) (xy 51.374482 51.875812) (xy 51.49418 51.839502) (xy 51.604494 51.780537) (xy 51.701185 51.701185)
(xy 51.780537 51.604494) (xy 51.839502 51.49418) (xy 51.840001 51.492536) (xy 51.840001 55.032419) (xy 51.842852 55.061364)
(xy 51.842765 55.073781) (xy 51.843665 55.082952) (xy 51.884466 55.471145) (xy 51.896487 55.529708) (xy 51.907702 55.588501)
(xy 51.910366 55.597323) (xy 52.02579 55.970198) (xy 52.048975 56.025353) (xy 52.071379 56.080806) (xy 52.075706 56.088943)
(xy 52.261357 56.432298) (xy 52.29478 56.481849) (xy 52.327562 56.531946) (xy 52.333387 56.539087) (xy 52.582194 56.839841)
(xy 52.624629 56.881981) (xy 52.666492 56.92473) (xy 52.673592 56.930604) (xy 52.976077 57.177305) (xy 53.025904 57.210409)
(xy 53.075259 57.244204) (xy 53.083365 57.248587) (xy 53.428007 57.431837) (xy 53.483311 57.454631) (xy 53.538295 57.478198)
(xy 53.547098 57.480923) (xy 53.92077 57.593741) (xy 53.979458 57.605361) (xy 54.037961 57.617797) (xy 54.047126 57.61876)
(xy 54.435595 57.65685) (xy 54.435598 57.65685) (xy 54.467581 57.66) (xy 81.532419 57.66) (xy 81.561373 57.657148)
(xy 81.573781 57.657235) (xy 81.582952 57.656335) (xy 81.971145 57.615534) (xy 82.029708 57.603513) (xy 82.088501 57.592298)
(xy 82.097323 57.589634) (xy 82.470198 57.47421) (xy 82.525353 57.451025) (xy 82.580806 57.428621) (xy 82.588943 57.424294)
(xy 82.932298 57.238643) (xy 82.981849 57.20522) (xy 83.031946 57.172438) (xy 83.039087 57.166613) (xy 83.339841 56.917806)
(xy 83.381981 56.875371) (xy 83.42473 56.833508) (xy 83.430604 56.826408) (xy 83.677305 56.523923) (xy 83.710409 56.474096)
(xy 83.744204 56.424741) (xy 83.748587 56.416635) (xy 83.931837 56.071993) (xy 83.954631 56.016689) (xy 83.978198 55.961705)
(xy 83.980923 55.952902) (xy 84.093741 55.57923) (xy 84.105361 55.520542) (xy 84.117797 55.462039) (xy 84.11876 55.452874)
(xy 84.15685 55.064405) (xy 84.15685 55.064402) (xy 84.16 55.032419) (xy 84.16 51.25) (xy 84.611928 51.25)
(xy 84.624188 51.374482) (xy 84.660498 51.49418) (xy 84.719463 51.604494) (xy 84.798815 51.701185) (xy 84.895506 51.780537)
(xy 85.00582 51.839502) (xy 85.125518 51.875812) (xy 85.25 51.888072) (xy 85.71425 51.885) (xy 85.873 51.72625)
(xy 85.873 50.627) (xy 86.127 50.627) (xy 86.127 51.72625) (xy 86.28575 51.885) (xy 86.75 51.888072)
(xy 86.874482 51.875812) (xy 86.99418 51.839502) (xy 87.104494 51.780537) (xy 87.201185 51.701185) (xy 87.280537 51.604494)
(xy 87.339502 51.49418) (xy 87.375812 51.374482) (xy 87.388072 51.25) (xy 87.385 50.78575) (xy 87.22625 50.627)
(xy 86.127 50.627) (xy 85.873 50.627) (xy 84.77375 50.627) (xy 84.615 50.78575) (xy 84.611928 51.25)
(xy 84.16 51.25) (xy 84.16 49.75) (xy 84.611928 49.75) (xy 84.615 50.21425) (xy 84.77375 50.373)
(xy 85.873 50.373) (xy 85.873 49.27375) (xy 86.127 49.27375) (xy 86.127 50.373) (xy 87.22625 50.373)
(xy 87.385 50.21425) (xy 87.388072 49.75) (xy 87.375812 49.625518) (xy 87.339502 49.50582) (xy 87.280537 49.395506)
(xy 87.201185 49.298815) (xy 87.104494 49.219463) (xy 86.99418 49.160498) (xy 86.874482 49.124188) (xy 86.75 49.111928)
(xy 86.28575 49.115) (xy 86.127 49.27375) (xy 85.873 49.27375) (xy 85.71425 49.115) (xy 85.25 49.111928)
(xy 85.125518 49.124188) (xy 85.00582 49.160498) (xy 84.895506 49.219463) (xy 84.798815 49.298815) (xy 84.719463 49.395506)
(xy 84.660498 49.50582) (xy 84.624188 49.625518) (xy 84.611928 49.75) (xy 84.16 49.75) (xy 84.16 45.967581)
(xy 84.157148 45.938627) (xy 84.157235 45.926219) (xy 84.156335 45.917047) (xy 84.115534 45.528855) (xy 84.103514 45.470299)
(xy 84.092298 45.411498) (xy 84.089634 45.402677) (xy 83.97421 45.029802) (xy 83.951025 44.974647) (xy 83.928621 44.919194)
(xy 83.924294 44.911058) (xy 83.924294 44.911057) (xy 83.924291 44.911053) (xy 83.738643 44.567702) (xy 83.705187 44.518101)
(xy 83.672437 44.468054) (xy 83.666613 44.460913) (xy 83.417806 44.160158) (xy 83.375371 44.118019) (xy 83.333508 44.075269)
(xy 83.326407 44.069396) (xy 83.023923 43.822695) (xy 82.974107 43.789598) (xy 82.924741 43.755795) (xy 82.916635 43.751413)
(xy 82.571993 43.568163) (xy 82.516687 43.545368) (xy 82.461704 43.521802) (xy 82.452901 43.519077) (xy 82.07923 43.406259)
(xy 82.020542 43.394639) (xy 81.962039 43.382203) (xy 81.952874 43.38124) (xy 81.564405 43.34315) (xy 81.564402 43.34315)
(xy 81.532419 43.34) (xy 54.467581 43.34) (xy 54.438627 43.342852) (xy 54.426219 43.342765) (xy 54.417047 43.343665)
(xy 54.028855 43.384466) (xy 53.970299 43.396486) (xy 53.911498 43.407702) (xy 53.902677 43.410366) (xy 53.529802 43.52579)
(xy 53.474647 43.548975) (xy 53.419194 43.571379) (xy 53.411062 43.575704) (xy 53.411057 43.575706) (xy 53.411053 43.575709)
(xy 53.067702 43.761357) (xy 53.018101 43.794813) (xy 52.968054 43.827563) (xy 52.960913 43.833387) (xy 52.660158 44.082194)
(xy 52.618019 44.124629) (xy 52.575269 44.166492) (xy 52.569396 44.173593) (xy 52.322695 44.476077) (xy 52.289598 44.525893)
(xy 52.255795 44.575259) (xy 52.251413 44.583365) (xy 52.068163 44.928007) (xy 52.045368 44.983313) (xy 52.021802 45.038296)
(xy 52.019077 45.047099) (xy 51.906259 45.42077) (xy 51.894639 45.479458) (xy 51.882203 45.537961) (xy 51.88124 45.547126)
(xy 51.84315 45.935595) (xy 51.84 45.967582) (xy 51.84 49.507463) (xy 51.839502 49.50582) (xy 51.780537 49.395506)
(xy 51.701185 49.298815) (xy 51.604494 49.219463) (xy 51.49418 49.160498) (xy 51.374482 49.124188) (xy 51.25 49.111928)
(xy 50.78575 49.115) (xy 50.627 49.27375) (xy 50.373 49.27375) (xy 50.21425 49.115) (xy 49.75 49.111928)
(xy 49.625518 49.124188) (xy 49.50582 49.160498) (xy 49.395506 49.219463) (xy 49.298815 49.298815) (xy 49.219463 49.395506)
(xy 49.160498 49.50582) (xy 49.124188 49.625518) (xy 49.111928 49.75) (xy 39.127 49.75) (xy 39.127 42.052606)
(xy 40.052606 41.127) (xy 95.947394 41.127)
)
)
)
)

View File

@ -0,0 +1,248 @@
update=2021 December 08, Wednesday 14:30:39
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
ViaDiameter1=0.8
ViaDrill1=0.4
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0
SolderMaskMinWidth=0
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=0
[pcbnew/Layer.F.Adhes]
Enabled=0
[pcbnew/Layer.B.Paste]
Enabled=0
[pcbnew/Layer.F.Paste]
Enabled=0
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=0
[pcbnew/Layer.Cmts.User]
Enabled=0
[pcbnew/Layer.Eco1.User]
Enabled=0
[pcbnew/Layer.Eco2.User]
Enabled=0
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

View File

@ -0,0 +1,54 @@
EESchema Schematic File Version 4
EELAYER 30 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title "Quack back panel"
Date "2021-12-08"
Rev "1.0"
Comp "Lostwave"
Comment1 "https://68kmla.org"
Comment2 "https://github.com/quack/quack"
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L power:Earth #PWR0101
U 1 1 61B0AB0B
P 3000 3000
F 0 "#PWR0101" H 3000 2750 50 0001 C CNN
F 1 "Earth" H 3000 2850 50 0001 C CNN
F 2 "" H 3000 3000 50 0001 C CNN
F 3 "~" H 3000 3000 50 0001 C CNN
1 3000 3000
1 0 0 -1
$EndComp
$Comp
L Connector:TestPoint_Small TP1
U 1 1 61B0AF58
P 3000 2500
F 0 "TP1" H 3048 2546 50 0000 L CNN
F 1 "TestPoint_Small" H 3048 2455 50 0000 L CNN
F 2 "TestPoint:TestPoint_Pad_1.5x1.5mm" H 3200 2500 50 0001 C CNN
F 3 "~" H 3200 2500 50 0001 C CNN
1 3000 2500
1 0 0 -1
$EndComp
Wire Wire Line
3000 3000 3000 2750
$Comp
L Connector:TestPoint_Small TP2
U 1 1 61B0C87F
P 3000 2750
F 0 "TP2" H 3048 2796 50 0000 L CNN
F 1 "TestPoint_Small" H 3048 2705 50 0000 L CNN
F 2 "TestPoint:TestPoint_Pad_1.5x1.5mm" H 3200 2750 50 0001 C CNN
F 3 "~" H 3200 2750 50 0001 C CNN
1 3000 2750
1 0 0 -1
$EndComp
Connection ~ 3000 2750
Wire Wire Line
3000 2750 3000 2500
$EndSCHEMATC

Binary file not shown.

View File

@ -1,23 +1,71 @@
# Hello World Example
Starts a FreeRTOS task to print "Hello World"
# Quack Mouse Converter[![Badge License]][License]
See the README.md file in the upper level 'examples' directory for more information about examples.
A dongle that allows various retro systems to use the `Apple Desktop Bus` <br>
as well as `Bluetooth 2+` mice through their `quadrature` mouse ports.
### LED Error codes
<br>
<br>
<br>
| Color | Status | Description |
|-------|--------|-------------------------|
| Green | On | Quack is running |
| Green | Off | No power |
| Green | Fast | Quack is starting up |
| Green | Slow | Mouse battery low |
| Blue | Off | Bluetooth disabled |
| Blue | On | Bluetooth connected |
| Blue | Fast | Bluetooth starting up |
| Blue | Slow | Bluetooth not connected |
| Amber | Pulse | Mouse activity |
| Amber | Slow | ADB mouse not detected |
| Red | Off | No errors detected |
| Red | On | Configuration error |
| Red | Pulse | Invalid mouse data* |
<div align = center>
[![Button Documentation]][Documentation]
[![Button Firmware]][Firmware]
[![Button PCB]][PCB]
[![Button Changelog]][Changelog]
<br>
<br>
<img
src = 'Resources/Preview.png'
width = 500
/>
</div>
<br>
<br>
## Supported
#### Systems
<kbd>Macintosh 128 / 512 / Plus</kbd><kbd>Apple Lisa</kbd>
#### Connection Types
<kbd>Apple Desktop Bus</kbd><kbd>Bluetooth 2+</kbd>
<br>
<br>
### Unsupported
- `ADB`  ➞  `Bluetooth LE`for **Non-Windows 10**
<br>
<!----------------------------------------------------------------------------->
[Documentation]: https://github.com/demik/quack/wiki
[Changelog]: ChangeLog.md
[Firmware]: main/README.md
[License]: LICENSE
[PCB]: EDA/ChangeLog.md
<!-------------------------------[ Badges ]----------------------------------->
[Badge License]: https://img.shields.io/badge/License-Apache_2.0-961b1f?style=for-the-badge&labelColor=D22128
<!-------------------------------[ Buttons ]----------------------------------->
[Button Documentation]: https://img.shields.io/badge/Documentation-0099E5?style=for-the-badge&logoColor=white&logo=BookStack
[Button Changelog]: https://img.shields.io/badge/Changelog-21375A?style=for-the-badge&logoColor=white&logo=AzureArtifacts
[Button Firmware]: https://img.shields.io/badge/Firmware-E5426E?style=for-the-badge&logoColor=white&logo=ROS
[Button PCB]: https://img.shields.io/badge/PCB-007c40?style=for-the-badge&logoColor=white&logo=PowerApps

BIN
Resources/Preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

BIN
Resources/board.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -10,4 +10,4 @@ set(include_dirs ".")
idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "${include_dirs}"
REQUIRES esp_hid)
REQUIRES driver esp_hid nvs_flash spi_flash)

20
main/README.md Normal file
View File

@ -0,0 +1,20 @@
# Quack Firmware source code
### Supported SDK versions:
The code is designed to be build with ESP-IDF SDK version 4.2.3. To workaround some patchs or limitations of this specific release, you need to apply the patch located in the SDK subfolder
### Unsupported mouse conversions:
Functions are grouped into "domains" in different files. Each functions has a prefix for its own domain.
For example, adb_init() is the init function for the ADB Bus and is located in the adb.c source file.
List of relevant files:
- adb.* Apple Desktop Bus related functions
- blue.* Bluetooth related functions
- esp_hid_gap.* HID GAP library from Espressif
- gpio.* raw GPIO related functions
- led.* LED related functions
- m4848.h Header for Apple Hockey Puck mouse over Bluetooth emulation
- main.c Everything start here
- quad.c Quadrature related functions (mouse port)

View File

@ -1,75 +1,13 @@
diff --git a/components/bt/host/bluedroid/bta/hh/bta_hh_le.c b/components/bt/host/bluedroid/bta/hh/bta_hh_le.c
index 6c86cb9be..8fdf1a1dc 100644
--- a/components/bt/host/bluedroid/bta/hh/bta_hh_le.c
+++ b/components/bt/host/bluedroid/bta/hh/bta_hh_le.c
@@ -498,7 +498,7 @@ tBTA_HH_LE_RPT *bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT *p_head, UINT8 mode,
UINT8 i;
#if BTA_HH_DEBUG == TRUE
- APPL_TRACE_DEBUG("bta_hh_le_find_rpt_by_idtype: r_type: %d rpt_id: %d", r_type, rpt_id);
+ :required:("bta_hh_le_find_rpt_by_idtype: r_type: %d rpt_id: %d", r_type, rpt_id);
#endif
for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++) {
diff --git a/components/esp_hid/include/esp_hidh.h b/components/esp_hid/include/esp_hidh.h
index b1a826430..bedcb42b6 100644
--- a/components/esp_hid/include/esp_hidh.h
+++ b/components/esp_hid/include/esp_hidh.h
@@ -100,6 +100,7 @@ typedef union {
typedef struct {
esp_event_handler_t callback;
+ uint16_t event_stack_size;
} esp_hidh_config_t;
/**
diff --git a/components/esp_hid/src/ble_hidh.c b/components/esp_hid/src/ble_hidh.c
index 5fe54f2fa..28cc35e29 100644
--- a/components/esp_hid/src/ble_hidh.c
+++ b/components/esp_hid/src/ble_hidh.c
@@ -617,7 +617,7 @@ esp_err_t esp_ble_hidh_init(const esp_hidh_config_t *config)
.queue_size = 5,
.task_name = "esp_ble_hidh_events",
.task_priority = uxTaskPriorityGet(NULL),
- .task_stack_size = 2048,
+ .task_stack_size = config->event_stack_size > 0 ? config->event_stack_size : 2048,
.task_core_id = tskNO_AFFINITY
};
ret = esp_event_loop_create(&event_task_args, &event_loop_handle);
diff --git a/components/esp_hid/src/bt_hidh.c b/components/esp_hid/src/bt_hidh.c
index 1a17e6aa3..6ae12958f 100644
index 6f0410e302..59dfc0b07f 100644
--- a/components/esp_hid/src/bt_hidh.c
+++ b/components/esp_hid/src/bt_hidh.c
@@ -320,7 +320,7 @@ esp_err_t esp_bt_hidh_init(const esp_hidh_config_t *config)
.queue_size = 5,
.task_name = "esp_bt_hidh_events",
.task_priority = uxTaskPriorityGet(NULL),
- .task_stack_size = 2048,
+ .task_stack_size = config->event_stack_size > 0 ? config->event_stack_size : 2048,
.task_core_id = tskNO_AFFINITY
};
esp_err_t ret = esp_event_loop_create(&event_task_args, &event_loop_handle);
@@ -386,6 +386,23 @@ void bta_hh_co_data(uint8_t handle, uint8_t *p_rpt, uint16_t len, tBTA_HH_PROTO_
ESP_LOGE(TAG, "Device Not Found: handle %u", handle);
return;
}
+
+ /*
+ * quack patch: mode is always ESP_HID_PROTOCOL_MODE_BOOT even if the device is in BOOT mode
+ * BTA_HH_PROTO_RPT_MODE from Bluedroid is 0
+ * BOOT report id is also questionable, assume than an REPORT mode with a lengh of 3 or 4 is a BOOT packet
+ */
+ if (len >= 2 + 1 && p_rpt[0] == 2 && mode == 0) {
+ esp_hidh_event_data_t p = {0};
+ p.input.dev = dev;
+ p.feature.report_id = 2;
+ p.feature.usage = ESP_HID_USAGE_MOUSE;
+ p.feature.data = p_rpt + 1;
+ p.input.length = len - 1;
+ esp_event_post_to(event_loop_handle, ESP_HIDH_EVENTS, ESP_HIDH_INPUT_EVENT, &p, sizeof(esp_hidh_event_data_t), portMAX_DELAY);
+ return ;
+ }
+
report = esp_hidh_dev_get_input_report_by_id_and_proto(dev, p_rpt[0], mode ? ESP_HID_PROTOCOL_MODE_BOOT : ESP_HID_PROTOCOL_MODE_REPORT);
if (report == NULL) {
ESP_LOGE(TAG, "Report Not Found: %d mode: %s", p_rpt[0], mode ? "BOOT" : "REPORT");
@@ -673,7 +673,7 @@ static void esp_hh_cb(esp_hidh_cb_event_t event, esp_hidh_cb_param_t *param)
if (param->data_ind.len == 9 && *(param->data_ind.data) == 1) {
has_report_id = true;
_usage = ESP_HID_USAGE_KEYBOARD;
- } else if (param->data_ind.len == 4 && *(param->data_ind.data) == 2) {
+ } else if (param->data_ind.len >= 4 && *(param->data_ind.data) == 2) {
has_report_id = true;
_usage = ESP_HID_USAGE_MOUSE;
} else {

View File

@ -24,12 +24,13 @@
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_chip_info.h"
#include "esp_private/periph_ctrl.h"
#include "driver/rmt.h"
#include "driver/periph_ctrl.h"
#include "soc/periph_defs.h"
#include "soc/rmt_reg.h"
@ -58,6 +59,7 @@ static void adb_rx_setup(void);
static void adb_tx_as(void);
static void adb_tx_one(void);
static void adb_tx_setup(void);
static void adb_tx_stop(void);
static void adb_tx_zero(void);
/* functions */
@ -126,7 +128,7 @@ inline bool adb_is_host(void) {
void adb_probe(void) {
uint16_t register3;
ESP_LOGI(TAG, "Probing for mouse...");
ESP_LOGI(TAG, "Probing for mouse");
xTaskNotify(t_yellow, LED_SLOW, eSetValueWithOverwrite);
/* for some reason, RMT misses the first exchange sometimes. Flush the device should give it time */
@ -135,12 +137,52 @@ void adb_probe(void) {
vTaskDelay(12 / portTICK_PERIOD_MS);
while (true) {
adb_tx_cmd(ADB_MOUSE|ADB_TALK|ADB_REG3);
register3 = adb_rx_mouse();
ESP_LOGD("ADB", "Device $3 register3: %x", register3);
ESP_LOGD("ADB", "Device $3 register3: %04x", register3);
if (register3 && (register3 & ADB_H_ALL) == ADB_H_ERR)
ESP_LOGE(TAG, "Mouse failed self init test");
/*
* try to unglue composite devices (Kensington)
* the idea is to move detected devices to $9, and check $3 again
* if there is something again at $3, it may be a composite device, or the user
* plugged two devices.
* if there is nothing anymore, move back $9 to $3
*
* we will handle that further down the line by checking the handler
*/
if (register3 & ADB_H_ALL) {
ESP_LOGI(TAG, "\tMoving $3 to $9 to check for composite devices");
adb_tx_listen(ADB_MOUSE|ADB_LISTEN|ADB_REG3, (ADB_TMP<<4)|ADB_H_MOVE);
vTaskDelay(7 / portTICK_PERIOD_MS);
ESP_LOGI(TAG, "\tChecking $3 again…");
adb_tx_cmd(ADB_MOUSE|ADB_TALK|ADB_REG3);
register3 = adb_rx_mouse();
if (register3) {
adb_tx_cmd(ADB_TMP|ADB_TALK|ADB_REG3);
register3 = adb_rx_mouse();
ESP_LOGI(TAG, "\t… something was there, $9 handler: $%02x", register3 & ADB_H_ALL);
xTaskNotify(t_red, LED_ONCE, eSetValueWithOverwrite);
}
else {
ESP_LOGI(TAG, "\t… nothing, moving $9 back to $3");
adb_tx_listen(ADB_TMP|ADB_LISTEN|ADB_REG3, (ADB_MOUSE<<4)|ADB_H_MOVE);
}
/* restore register3 from $3 for handler detection */
vTaskDelay(7 / portTICK_PERIOD_MS);
adb_tx_cmd(ADB_MOUSE|ADB_TALK|ADB_REG3);
register3 = adb_rx_mouse();
}
/* Accept all known handlers */
if (((register3 & ADB_H_ALL) == ADB_H_C100) || ((register3 & ADB_H_ALL) == ADB_H_C200) ||
((register3 & ADB_H_ALL) == ADB_H_MTRC) || ((register3 & ADB_H_ALL) == ADB_H_KSGT)) {
ESP_LOGI(TAG, "… detected mouse at $3");
if ((register3 & ADB_H_ALL) == ADB_H_C100) {
ESP_LOGI(TAG, "... detected mouse at $3");
break;
}
@ -163,6 +205,16 @@ void adb_probe(void) {
case ADB_H_C200:
ESP_LOGD(TAG, "Mouse running at 200cpi");
break;
case ADB_H_MTRC:
ESP_LOGD(TAG, "MacTRAC running at default cpi");
break;
case ADB_H_KSGT:
ESP_LOGD(TAG, "Kensington detected, switching to standard device");
adb_tx_listen(ADB_MOUSE|ADB_LISTEN|ADB_REG3, (ADB_KML1<<4)|ADB_H_MOVE);
adb_tx_listen(ADB_TMP|ADB_LISTEN|ADB_REG3, (ADB_MOUSE<<4)|ADB_H_MOVE);
adb_tx_listen(ADB_MOUSE|ADB_LISTEN|ADB_REG3, 0x6000|(ADB_MOUSE<<4)|ADB_H_C200);
ESP_LOGD(TAG, "Kensington running at 200cpi");
break;
default:
ESP_LOGE(TAG, "Mouse running with unknow handler: %x", register3 & ADB_H_ALL);
}
@ -189,9 +241,9 @@ static void adb_rmt_reset() {
void adb_task_host(void *pvParameters) {
/* Classic Apple Mouse Protocol is 16 bits long */
uint16_t data;
uint8_t last = 0;
int8_t move = 0;
uint8_t state = ADB_S_PROBE;
uint8_t last = 0;
int8_t move = 0;
uint8_t state = ADB_S_PROBE;
/* put green led to steady if BT is disabled. Otherwise BT init will do it */
if (gpio_get_level(GPIO_BTOFF) == 0)
@ -259,7 +311,7 @@ void adb_task_host(void *pvParameters) {
else
state = ADB_S_KEEP;
}
ESP_LOGD("ADB", "Check mouse presence %x", data);
ESP_LOGD("ADB", "Check mouse presence %04x", data);
}
}
}
@ -392,11 +444,15 @@ static inline void adb_rx_setup() {
}
static inline void adb_tx_as() {
/* send attention (800 µs low) + sync (70 µs high) */
/*
* send attention (800 µs low) + sync (65 µs high).
* AN591 mentions 70 µs which is a mistake, make some devices angry
*/
gpio_set_level(GPIO_ADB, 0);
ets_delay_us(800-1);
esp_rom_delay_us(800-1);
gpio_set_level(GPIO_ADB, 1);
ets_delay_us(70-1);
esp_rom_delay_us(65-1);
}
void IRAM_ATTR adb_tx_cmd(unsigned char cmd) {
@ -414,13 +470,12 @@ void IRAM_ATTR adb_tx_cmd(unsigned char cmd) {
cmd & 0x01 ? adb_tx_one() : adb_tx_zero();
/* stop bit */
adb_tx_zero();
adb_tx_stop();
adb_rx_setup();
}
void IRAM_ATTR adb_tx_data(uint16_t data) {
adb_tx_setup();
adb_tx_one();
/* send data 2 bytes (unrolled loop) */
@ -442,24 +497,27 @@ void IRAM_ATTR adb_tx_data(uint16_t data) {
data & 0x01 ? adb_tx_one() : adb_tx_zero();
/* stop bit */
adb_tx_zero();
adb_tx_stop();
adb_rx_setup();
}
void adb_tx_listen(unsigned char cmd, uint16_t data) {
adb_tx_cmd(cmd);
/* Stop to start is between 160-240µS. Go for around 160 + time for GPIO setup */
ets_delay_us(160);
/*
* Stop to start is between 160-240µS. Go for around 160 + time for GPIO setup
* values from AN591 Datasheet minus the estimated call to esp_rom_delay_us
*/
esp_rom_delay_us(160);
adb_tx_data(data);
}
static inline void adb_tx_one() {
/* values from AN591 Datasheet minus the estimated call to ets_delay_us */
gpio_set_level(GPIO_ADB, 0);
ets_delay_us(ADB_1_LOW - 1);
esp_rom_delay_us(ADB_1_LOW - 1);
gpio_set_level(GPIO_ADB, 1);
ets_delay_us(ADB_1_HIGH - 1);
esp_rom_delay_us(ADB_1_HIGH - 1);
}
void adb_tx_reset() {
@ -470,9 +528,9 @@ void adb_tx_reset() {
*/
gpio_set_level(GPIO_ADB, 0);
ets_delay_us(ADB_RESET);
esp_rom_delay_us(ADB_RESET);
gpio_set_level(GPIO_ADB, 1);
ets_delay_us(500);
esp_rom_delay_us(500);
}
static inline void adb_tx_setup() {
@ -480,10 +538,16 @@ static inline void adb_tx_setup() {
gpio_set_level(GPIO_DIR, 1);
}
static inline void adb_tx_zero() {
/* values from AN591 Datasheet minus the estimated call to ets_delay_us */
static inline void adb_tx_stop() {
gpio_set_level(GPIO_ADB, 0);
ets_delay_us(ADB_0_LOW - 1);
esp_rom_delay_us(ADB_S_LOW - 1);
gpio_set_level(GPIO_ADB, 1);
ets_delay_us(ADB_0_HIGH - 1);
esp_rom_delay_us(ADB_S_HIGH - 1);
}
static inline void adb_tx_zero() {
gpio_set_level(GPIO_ADB, 0);
esp_rom_delay_us(ADB_0_LOW - 1);
gpio_set_level(GPIO_ADB, 1);
esp_rom_delay_us(ADB_0_HIGH - 1);
}

View File

@ -43,6 +43,8 @@ void adb_tx_reset(void);
#define ADB_0_HIGH 35
#define ADB_1_LOW 35
#define ADB_1_HIGH 65
#define ADB_S_LOW 70
#define ADB_S_HIGH 30
/* Classic Apple Mouse Protocol bitmasks */
#define ADB_CMP_B1 (1<<15)
@ -58,16 +60,20 @@ void adb_tx_reset(void);
#define ADB_REG3 0x3
/* Device addresses */
#define ADB_MOUSE (3<<4)
#define ADB_TMP (9<<4)
#define ADB_MOUSE (3<<4) // main device
#define ADB_KML1 (8<<4) // disabled Kensington device
#define ADB_TMP (9<<4) // temporary device
/* Various stuff */
#define ADB_B_UP 0
#define ADB_B_DOWN 1
#define ADB_H_ALL 0xff // Handlers bitmask
#define ADB_H_ERR 0x00 // Handler 0 (Self init error)
#define ADB_H_C100 0x01 // Handler 1 (Classic @ 100cpi)
#define ADB_H_C200 0x02 // Handler 2 (Classic @ 200cpi)
#define ADB_H_MTRC 0x2f // Handler for MacTRAC 2.0
#define ADB_H_KSGT 0x32 // Handler for Kensington devices
#define ADB_H_MOVE 0xfe // Move to another address
/* Host states */

View File

@ -25,6 +25,7 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
@ -33,12 +34,16 @@
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_bt_defs.h"
#if CONFIG_BT_BLE_ENABLED
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"
#include "esp_gatt_defs.h"
#endif
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp_timer.h"
#include "esp_hid_common.h"
#include "esp_hidd.h"
#include "esp_hidh.h"
#include "esp_hid_gap.h"
@ -57,6 +62,7 @@ TaskHandle_t t_adb2hid;
extern TaskHandle_t t_click;
static esp_hidd_dev_t *hid_dev = NULL;
extern QueueHandle_t q_qx, q_qy;
uint8_t blue_pointers; // mouse count
/* private functions */
static void blue_d_connect(void);
@ -71,8 +77,8 @@ static esp_hid_raw_report_map_t *blue_hid_rm_get(esp_hidh_dev_t *dev);
void blue_set_boot_protocol(esp_hidh_dev_t *dev);
static bool blue_support_boot(esp_hidh_dev_t *dev);
/* direct calls to bluedroid */
extern void BTA_HhSetProtoMode(uint8_t handle, uint8_t t_type);
/* direct calls to esp_hid_* */
void bt_gap_event_handler(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param);
/* Device specific functions blue_d_* */
static void blue_d_callback(void *handler_args, esp_event_base_t base, int32_t id, void *event_data)
@ -129,22 +135,21 @@ static void blue_d_connect() {
static void blue_d_disconnect(esp_hidd_event_data_t *dev) {
ESP_LOGI(TAG, "Host disconnected, reason: %s",
esp_hid_disconnect_reason_str(esp_hidd_dev_transport_get(dev->disconnect.dev), dev->disconnect.reason));
#if CONFIG_BT_BLE_ENABLED
esp_hid_ble_gap_adv_start();
#endif
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
}
static void blue_d_init() {
esp_err_t ret;
ret = esp_hid_ble_gap_adv_init(ESP_HID_APPEARANCE_MOUSE, m4848_config.device_name);
ESP_ERROR_CHECK( ret );
if ((ret = esp_ble_gatts_register_callback(esp_hidd_gatts_event_handler)) != ESP_OK) {
ESP_LOGE(TAG, "GATTS register callback failed: %d", ret);
if ((ret = esp_bt_gap_register_callback(bt_gap_event_handler)) != ESP_OK) {
ESP_LOGE(TAG, "BT GAP register callback failed: %d", ret);
return;
}
ESP_ERROR_CHECK(esp_hidd_dev_init(&m4848_config, ESP_HID_TRANSPORT_BLE, blue_d_callback, &hid_dev));
ESP_ERROR_CHECK(esp_hidd_dev_init(&m4848_config, ESP_HID_TRANSPORT_BT, blue_d_callback, &hid_dev));
xTaskCreate(blue_adb2hid, "ADB2BT", 2 * 1024, NULL, tskIDLE_PRIORITY + 1, &t_adb2hid);
}
@ -157,19 +162,23 @@ static void blue_d_start()
{
ESP_LOGD(TAG, "Bluetooth stack started");
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
#if CONFIG_BT_BLE_ENABLED
esp_hid_ble_gap_adv_start();
#endif
}
/*
* Called by the ADB stack from adb_task_host on mouse activity
* Convert the 16bit ADB data to a 3 bytes HID INPUT REPORT matching the m4848
*
* The format is also BOOT compatible so don't bother to check what mode we are in
*/
void blue_adb2hid(void *pvParameters) {
uint16_t data = 0;
uint8_t buffer[3] = {0, 0, 0};
int8_t move = 0;
unsigned int tmp;
long unsigned int tmp;
ESP_LOGD(TAG, "ADB2BT started on core %d", xPortGetCoreID());
@ -270,7 +279,9 @@ void blue_h_close(esp_hidh_event_data_t *p) {
ESP_LOGI(TAG, "closed connection with device " ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX(bda));
esp_hidh_dev_free(p->close.dev);
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
blue_pointers--;
if (! blue_pointers)
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
}
static void blue_handle_button(uint8_t buttons) {
@ -309,6 +320,7 @@ static void blue_h_init(void) {
ESP_ERROR_CHECK(esp_hidh_init(&config));
blue_pointers = 0;
xTaskCreatePinnedToCore(blue_scan, "blue_scan", 6 * 1024, NULL, 2, NULL, 0);
}
@ -328,9 +340,7 @@ void blue_init(void)
ESP_LOGD(TAG, "Starting Bluetooth init on core %d", xPortGetCoreID());
ESP_ERROR_CHECK(ret);
/* ESP_BT_MODE_CLASSIC_BT doesn't work, it freezes esp_hidh_init */
ESP_ERROR_CHECK(esp_hid_gap_init(ESP_BT_MODE_BTDM));
ESP_ERROR_CHECK(esp_ble_gattc_register_callback(esp_hidh_gattc_event_handler));
ESP_ERROR_CHECK(esp_hid_gap_init(ESP_BT_MODE_CLASSIC_BT));
esp_log_level_set("event", ESP_LOG_INFO);
/* complains about wrong data len on BOOT mode and CCONTROL */
@ -369,8 +379,22 @@ void blue_h_input(esp_hidh_dev_t *dev, uint8_t *data, uint16_t length) {
uint8_t i;
int8_t x, y;
//ESP_LOG_BUFFER_HEX(TAG, data, length);
buttons = data[0];
/*
* A friend of mine did this for a beer, it helps a little with high DPI mouses
* This is a precalculated table that looks like a squadhed arctan()
*/
const unsigned char hid2quad[] = {
0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0E, 0x0F,
0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0x1A, 0x1C, 0x1D, 0x1E, 0x20, 0x21, 0x22, 0x23,
0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28
};
/*
* Do some checks before parsing data. We sould't get anything wrong in theory,
* but we sometimes to get shit from either mouse or bluetooth stack
@ -401,28 +425,44 @@ void blue_h_input(esp_hidh_dev_t *dev, uint8_t *data, uint16_t length) {
blue_handle_button(buttons);
/* quadrature use 7 bits x/y offsets, bluetooth BOOT uses 8 bits */
/*
* this try to help avoiding issues with high DPI mouses:
* - reduce bluetooth movement speed a little bit before 40 pixels per poll
* - go slower after 40 pixels per poll just to avoid too big jumps
*/
x = data[1];
y = data[2];
/* reduce bluetooth movement speed as well before notifying */
if (x != 0) {
if (x == 1 || x == -1) {
xQueueSendToBack(q_qx, &x, 0);
if (x < 0) {
if (x < -40)
x = ((x + 40) / 2) - 40;
else
x = -1 * hid2quad[(x * -1) - 1];
}
else {
x /= 2;
xQueueSendToBack(q_qx, &x, 0);
if (x > 40)
x = ((x - 40) / 2) + 40;
else
x = hid2quad[x - 1];
}
xQueueSendToBack(q_qx, &x, 0);
}
if (y != 0) {
if (y == 1 || y == -1) {
xQueueSendToBack(q_qy, &y, 0);
if (y < 0) {
if (y < -40)
y = ((y + 40) / 2) - 40;
else
y = -1 * hid2quad[(y * -1) - 1];
}
else {
y /= 2;
xQueueSendToBack(q_qy, &y, 0);
if (y > 40)
y = ((y - 40) / 2) + 40;
else
y = hid2quad[y - 1];
}
xQueueSendToBack(q_qy, &y, 0);
}
}
@ -441,6 +481,7 @@ void blue_h_open(esp_hidh_event_data_t *p) {
ESP_LOGE(TAG, "Mouse does not support boot protocol !");
}
blue_pointers++;
xTaskNotify(t_blue, LED_ON, eSetValueWithOverwrite);
gpio_output_enable();
}
@ -508,18 +549,20 @@ void blue_scan(void *pvParameters) {
ESP_LOGI(TAG, "starting scan on core %d…", xPortGetCoreID());
esp_hid_scan(BLUE_SCAN_DURATION, &len, &results);
ESP_LOGI(TAG, "scan returned %u result(s)", len);
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
/* don't put the slow blink is a device reconnected while scanning */
if (blue_pointers == 0)
xTaskNotify(t_blue, LED_SLOW, eSetValueWithOverwrite);
if (len) {
esp_hid_scan_result_t *r = results;
while (r) {
ESP_LOGI(TAG, "found %s %s device: " ESP_BD_ADDR_STR ", RSSI: %d, NAME: %s",
(r->transport == ESP_HID_TRANSPORT_BLE) ? "BLE" : "BT",
esp_hid_cod_major_str(r->bt.cod.major),
ESP_BD_ADDR_HEX(r->bda), r->rssi, r->name ? r->name : "");
/*
* as of v1.4.5, esp_hid_gap will print detected devices in console (handle_bt_device_result())
* just look for something that looks like Bluetooth Classic mouse
*/
/* search for something that looks like Bluetooth Classic mouse */
if (r->transport == ESP_HID_TRANSPORT_BT &&
strcmp("PERIPHERAL", esp_hid_cod_major_str(r->bt.cod.major)) == 0
&& (r->bt.cod.minor & ESP_HID_COD_MIN_MOUSE)) {
@ -543,56 +586,8 @@ void blue_scan(void *pvParameters) {
void blue_set_boot_protocol(esp_hidh_dev_t *dev) {
configASSERT(dev != NULL);
/*
* /!\ Disclaimer /!\
* This is ugly. We are accessing directly bluedroid and need the hidden handle to do that
* Extract it from a private esp_hidh_dev_s struct and call BTA_HhSetProtoMode directly.
*/
struct decoy_dev_s {
struct esp_hidh_dev_s *next;
esp_hid_device_config_t config;
esp_hid_usage_t usage;
esp_hid_transport_t transport;
bool connected;
bool opened;
int status;
size_t reports_len;
void *reports;
void *tmp;
size_t tmp_len;
xSemaphoreHandle semaphore;
esp_err_t (*close) (esp_hidh_dev_t *dev);
esp_err_t (*report_write) (esp_hidh_dev_t *dev, size_t map_index, size_t report_id, int report_type, uint8_t *data, size_t len);
esp_err_t (*report_read) (esp_hidh_dev_t *dev, size_t map_index, size_t report_id, int report_type, size_t max_length, uint8_t *value, size_t *value_len);
void (*dump) (esp_hidh_dev_t *dev, FILE *fp);
esp_bd_addr_t bda;
struct {
esp_bt_cod_t cod;
int handle;
uint8_t sub_class;
uint8_t app_id;
uint16_t attr_mask;
} bt;
TAILQ_ENTRY(esp_hidh_dev_s) devices;
};
struct decoy_dev_s *pass_that_handle;
pass_that_handle = (struct decoy_dev_s *)dev;
ESP_LOGI(TAG, "switching " ESP_BD_ADDR_STR " (%i) to protocol mode boot" ,
ESP_BD_ADDR_HEX(pass_that_handle->bda), pass_that_handle->bt.handle);
//ESP_LOG_BUFFER_HEX(TAG, dev, sizeof(struct decoy_dev_s));
/* bluedroid/bta/include/bta_hh_api.h */
BTA_HhSetProtoMode(pass_that_handle->bt.handle, 0x01);
ESP_LOGI(TAG, "switching " ESP_BD_ADDR_STR " to protocol mode boot", ESP_BD_ADDR_HEX(esp_hidh_dev_bda_get(dev)));
esp_hidh_dev_set_protocol(dev, ESP_HID_PROTOCOL_MODE_BOOT);
}
static bool blue_support_boot(esp_hidh_dev_t *dev) {

View File

@ -1,19 +1,13 @@
// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string.h>
#include <stdbool.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
@ -24,8 +18,11 @@
static const char *TAG = "ESP_HID_GAP";
// uncomment to print all devices that were seen during a scan
#define GAP_DBG_PRINTF(...) //printf(__VA_ARGS__)
//static const char * gap_bt_prop_type_names[5] = {"","BDNAME","COD","RSSI","EIR"};
#define GAP_DBG_PRINTF(...) printf(__VA_ARGS__)
#if CONFIG_BT_HID_HOST_ENABLED
static const char * gap_bt_prop_type_names[5] = {"","BDNAME","COD","RSSI","EIR"};
#endif
static esp_hid_scan_result_t *bt_scan_results = NULL;
static size_t num_bt_scan_results = 0;
@ -33,11 +30,11 @@ static size_t num_bt_scan_results = 0;
static esp_hid_scan_result_t *ble_scan_results = NULL;
static size_t num_ble_scan_results = 0;
static xSemaphoreHandle bt_hidh_cb_semaphore = NULL;
static SemaphoreHandle_t bt_hidh_cb_semaphore = NULL;
#define WAIT_BT_CB() xSemaphoreTake(bt_hidh_cb_semaphore, portMAX_DELAY)
#define SEND_BT_CB() xSemaphoreGive(bt_hidh_cb_semaphore)
static xSemaphoreHandle ble_hidh_cb_semaphore = NULL;
static SemaphoreHandle_t ble_hidh_cb_semaphore = NULL;
#define WAIT_BLE_CB() xSemaphoreTake(ble_hidh_cb_semaphore, portMAX_DELAY)
#define SEND_BLE_CB() xSemaphoreGive(ble_hidh_cb_semaphore)
@ -71,6 +68,7 @@ const char *bt_gap_evt_str(uint8_t event)
return bt_gap_evt_names[event];
}
#if CONFIG_BT_BLE_ENABLED
const char *esp_ble_key_type_str(esp_ble_key_type_t key_type)
{
const char *key_str = NULL;
@ -109,6 +107,7 @@ const char *esp_ble_key_type_str(esp_ble_key_type_t key_type)
}
return key_str;
}
#endif /* CONFIG_BT_BLE_ENABLED */
void esp_hid_scan_results_free(esp_hid_scan_result_t *results)
{
@ -123,6 +122,7 @@ void esp_hid_scan_results_free(esp_hid_scan_result_t *results)
}
}
#if (CONFIG_BT_HID_HOST_ENABLED || CONFIG_BT_BLE_ENABLED)
static esp_hid_scan_result_t *find_scan_result(esp_bd_addr_t bda, esp_hid_scan_result_t *results)
{
esp_hid_scan_result_t *r = results;
@ -134,7 +134,9 @@ static esp_hid_scan_result_t *find_scan_result(esp_bd_addr_t bda, esp_hid_scan_r
}
return NULL;
}
#endif /* (CONFIG_BT_HID_HOST_ENABLED || CONFIG_BT_BLE_ENABLED) */
#if CONFIG_BT_HID_HOST_ENABLED
static void add_bt_scan_result(esp_bd_addr_t bda, esp_bt_cod_t *cod, esp_bt_uuid_t *uuid, uint8_t *name, uint8_t name_len, int rssi)
{
esp_hid_scan_result_t *r = find_scan_result(bda, bt_scan_results);
@ -186,7 +188,9 @@ static void add_bt_scan_result(esp_bd_addr_t bda, esp_bt_cod_t *cod, esp_bt_uuid
bt_scan_results = r;
num_bt_scan_results++;
}
#endif
#if CONFIG_BT_BLE_ENABLED
static void add_ble_scan_result(esp_bd_addr_t bda, esp_ble_addr_type_t addr_type, uint16_t appearance, uint8_t *name, uint8_t name_len, int rssi)
{
if (find_scan_result(bda, ble_scan_results)) {
@ -220,13 +224,14 @@ static void add_ble_scan_result(esp_bd_addr_t bda, esp_ble_addr_type_t addr_type
ble_scan_results = r;
num_ble_scan_results++;
}
#endif /* CONFIG_BT_BLE_ENABLED */
void print_uuid(esp_bt_uuid_t *uuid)
{
if (uuid->len == ESP_UUID_LEN_16) {
GAP_DBG_PRINTF("UUID16: 0x%04x", uuid->uuid.uuid16);
} else if (uuid->len == ESP_UUID_LEN_32) {
GAP_DBG_PRINTF("UUID32: 0x%08x", uuid->uuid.uuid32);
GAP_DBG_PRINTF("UUID32: 0x%08"PRIx32, uuid->uuid.uuid32);
} else if (uuid->len == ESP_UUID_LEN_128) {
GAP_DBG_PRINTF("UUID128: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x", uuid->uuid.uuid128[0],
uuid->uuid.uuid128[1], uuid->uuid.uuid128[2], uuid->uuid.uuid128[3],
@ -237,6 +242,7 @@ void print_uuid(esp_bt_uuid_t *uuid)
}
}
#if CONFIG_BT_HID_HOST_ENABLED
static void handle_bt_device_result(struct disc_res_param *disc_res)
{
GAP_DBG_PRINTF("BT : " ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX(disc_res->bda));
@ -325,7 +331,9 @@ static void handle_bt_device_result(struct disc_res_param *disc_res)
add_bt_scan_result(disc_res->bda, cod, &uuid, name, name_len, rssi);
}
}
#endif
#if CONFIG_BT_BLE_ENABLED
static void handle_ble_device_result(struct ble_scan_result_evt_param *scan_rst)
{
@ -371,15 +379,18 @@ static void handle_ble_device_result(struct ble_scan_result_evt_param *scan_rst)
add_ble_scan_result(scan_rst->bda, scan_rst->ble_addr_type, appearance, adv_name, adv_name_len, scan_rst->rssi);
}
}
#endif /* CONFIG_BT_BLE_ENABLED */
#warning here1
#if CONFIG_BT_HID_HOST_ENABLED
/*
* BT GAP
* */
static void bt_gap_event_handler(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param)
#warning here2
void bt_gap_event_handler(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param)
{
switch (event) {
switch (event) {
case ESP_BT_GAP_DISC_STATE_CHANGED_EVT: {
ESP_LOGV(TAG, "BT GAP DISC_STATE %s", (param->disc_st_chg.state == ESP_BT_GAP_DISCOVERY_STARTED) ? "START" : "STOP");
if (param->disc_st_chg.state == ESP_BT_GAP_DISCOVERY_STOPPED) {
@ -392,10 +403,10 @@ static void bt_gap_event_handler(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_para
break;
}
case ESP_BT_GAP_KEY_NOTIF_EVT:
ESP_LOGI(TAG, "BT GAP KEY_NOTIF passkey:%d", param->key_notif.passkey);
ESP_LOGI(TAG, "BT GAP KEY_NOTIF passkey:%"PRIu32, param->key_notif.passkey);
break;
default:
ESP_LOGV(TAG, "BT GAP EVENT %s", bt_gap_evt_str(event));
ESP_LOGW(TAG, "BT GAP EVENT %s", bt_gap_evt_str(event));
break;
}
}
@ -403,9 +414,12 @@ static void bt_gap_event_handler(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_para
static esp_err_t init_bt_gap(void)
{
esp_err_t ret;
#if (CONFIG_BT_SSP_ENABLED)
/* Set default parameters for Secure Simple Pairing */
esp_bt_sp_param_t param_type = ESP_BT_SP_IOCAP_MODE;
esp_bt_io_cap_t iocap = ESP_BT_IO_CAP_IO;
esp_bt_gap_set_security_param(param_type, &iocap, sizeof(uint8_t));
#endif
/*
* Set default parameters for Legacy Pairing
* Use fixed pin code
@ -440,7 +454,9 @@ static esp_err_t start_bt_scan(uint32_t seconds)
}
return ret;
}
#endif
#if CONFIG_BT_BLE_ENABLED
/*
* BLE GAP
* */
@ -506,13 +522,13 @@ static void ble_gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_p
case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: // ESP_IO_CAP_OUT
// The app will receive this evt when the IO has Output capability and the peer device IO has Input capability.
// Show the passkey number to the user to input it in the peer device.
ESP_LOGI(TAG, "BLE GAP PASSKEY_NOTIF passkey:%d", param->ble_security.key_notif.passkey);
ESP_LOGI(TAG, "BLE GAP PASSKEY_NOTIF passkey:%"PRIu32, param->ble_security.key_notif.passkey);
break;
case ESP_GAP_BLE_NC_REQ_EVT: // ESP_IO_CAP_IO
// The app will receive this event when the IO has DisplayYesNO capability and the peer device IO also has DisplayYesNo capability.
// show the passkey number to the user to confirm it with the number displayed by peer device.
ESP_LOGI(TAG, "BLE GAP NC_REQ passkey:%d", param->ble_security.key_notif.passkey);
ESP_LOGI(TAG, "BLE GAP NC_REQ passkey:%"PRIu32, param->ble_security.key_notif.passkey);
esp_ble_confirm_reply(param->ble_security.key_notif.bd_addr, true);
break;
@ -662,6 +678,7 @@ esp_err_t esp_hid_ble_gap_adv_start(void)
};
return esp_ble_gap_start_advertising(&hidd_adv_params);
}
#endif /* CONFIG_BT_BLE_ENABLED */
/*
* CONTROLLER INIT
@ -671,11 +688,16 @@ static esp_err_t init_low_level(uint8_t mode)
{
esp_err_t ret;
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
#if CONFIG_IDF_TARGET_ESP32
bt_cfg.mode = mode;
#endif
#if CONFIG_BT_HID_HOST_ENABLED
if (mode & ESP_BT_MODE_CLASSIC_BT) {
bt_cfg.mode = mode;
bt_cfg.bt_max_acl_conn = 3;
bt_cfg.bt_max_sync_conn = 3;
} else {
} else
#endif
{
ret = esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
if (ret) {
ESP_LOGE(TAG, "esp_bt_controller_mem_release failed: %d", ret);
@ -705,26 +727,25 @@ static esp_err_t init_low_level(uint8_t mode)
ESP_LOGE(TAG, "esp_bluedroid_enable failed: %d", ret);
return ret;
}
#if CONFIG_BT_HID_HOST_ENABLED
if (mode & ESP_BT_MODE_CLASSIC_BT) {
ret = init_bt_gap();
if (ret) {
return ret;
}
}
#endif
#if CONFIG_BT_BLE_ENABLED
if (mode & ESP_BT_MODE_BLE) {
ret = init_ble_gap();
if (ret) {
return ret;
}
}
#endif /* CONFIG_BT_BLE_ENABLED */
return ret;
}
esp_err_t esp_hid_gap_init(uint8_t mode)
{
esp_err_t ret;
@ -771,14 +792,21 @@ esp_err_t esp_hid_scan(uint32_t seconds, size_t *num_results, esp_hid_scan_resul
return ESP_FAIL;
}
#if CONFIG_BT_BLE_ENABLED
if (start_ble_scan(seconds) == ESP_OK) {
if (start_bt_scan(seconds) == ESP_OK) {
WAIT_BT_CB();
}
WAIT_BLE_CB();
} else {
return ESP_FAIL;
}
#endif /* CONFIG_BT_BLE_ENABLED */
#if CONFIG_BT_HID_HOST_ENABLED
if (start_bt_scan(seconds) == ESP_OK) {
WAIT_BT_CB();
} else {
return ESP_FAIL;
}
#endif
*num_results = num_bt_scan_results + num_ble_scan_results;
*results = bt_scan_results;

View File

@ -1,31 +1,51 @@
// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
/*
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _ESP_HID_GAP_H_
#define _ESP_HID_GAP_H_
#define HIDH_IDLE_MODE 0x00
#define HIDH_BLE_MODE 0x01
#define HIDH_BT_MODE 0x02
#define HIDH_BTDM_MODE 0x03
#if CONFIG_BT_HID_HOST_ENABLED
#if CONFIG_BT_BLE_ENABLED
#define HID_HOST_MODE HIDH_BTDM_MODE
#else
#define HID_HOST_MODE HIDH_BT_MODE
#endif
#elif CONFIG_BT_BLE_ENABLED
#define HID_HOST_MODE HIDH_BLE_MODE
#elif CONFIG_BT_NIMBLE_ENABLED
#define HID_HOST_MODE HIDH_BLE_MODE
#else
#define HID_HOST_MODE HIDH_IDLE_MODE
#endif
#include "esp_err.h"
#include "esp_log.h"
#include "esp_bt.h"
#if !CONFIG_BT_NIMBLE_ENABLED
#include "esp_bt_defs.h"
#include "esp_bt_main.h"
#include "esp_gap_bt_api.h"
#endif
#include "esp_hid_common.h"
#if CONFIG_BT_BLE_ENABLED
#include "esp_gattc_api.h"
#include "esp_gatt_defs.h"
#include "esp_gap_ble_api.h"
#include "esp_gap_bt_api.h"
#include "esp_hid_common.h"
#endif
#if CONFIG_BT_NIMBLE_ENABLED
#include "nimble/ble.h"
#endif
#ifdef __cplusplus
extern "C" {
@ -33,13 +53,18 @@ extern "C" {
typedef struct esp_hidh_scan_result_s {
struct esp_hidh_scan_result_s *next;
#if CONFIG_BT_NIMBLE_ENABLED
uint8_t bda[6];
#else
esp_bd_addr_t bda;
#endif
esp_bd_addr_t bda;
const char *name;
int8_t rssi;
esp_hid_usage_t usage;
esp_hid_transport_t transport; //BT, BLE or USB
union {
#if !CONFIG_BT_NIMBLE_ENABLED
struct {
esp_bt_cod_t cod;
esp_bt_uuid_t uuid;
@ -48,6 +73,12 @@ typedef struct esp_hidh_scan_result_s {
esp_ble_addr_type_t addr_type;
uint16_t appearance;
} ble;
#else
struct {
uint8_t addr_type;
uint16_t appearance;
} ble;
#endif
};
} esp_hid_scan_result_t;
@ -58,8 +89,10 @@ void esp_hid_scan_results_free(esp_hid_scan_result_t *results);
esp_err_t esp_hid_ble_gap_adv_init(uint16_t appearance, const char *device_name);
esp_err_t esp_hid_ble_gap_adv_start(void);
#if !CONFIG_BT_NIMBLE_ENABLED
void print_uuid(esp_bt_uuid_t *uuid);
const char *ble_addr_type_str(esp_ble_addr_type_t ble_addr_type);
#endif
#ifdef __cplusplus
}

View File

@ -25,7 +25,6 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "gpio.h"

View File

@ -27,7 +27,6 @@
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "led.h"
#include "gpio.h"
@ -164,7 +163,7 @@ const char *led_gpio_name(uint8_t id) {
}
void led_init(void) {
/* blink allds LEDs once */
/* blink alls LEDs once */
gpio_set_level(GPIO_GREENLED, 1);
gpio_set_level(GPIO_BLUELED, 1);
gpio_set_level(GPIO_YELLOWLED, 1);
@ -185,7 +184,7 @@ void led_init(void) {
void led_task(void *pvParameters) {
unsigned int color = (unsigned int)pvParameters;
unsigned int mode = LED_OFF;
long unsigned int mode = LED_OFF;
TickType_t wait = portMAX_DELAY;
/* start only if there is a led specified */

View File

@ -24,10 +24,11 @@
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_flash.h"
#include "esp_hidh.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_chip_info.h"
#include "adb.h"
#include "blue.h"
@ -40,20 +41,22 @@ static const char* TAG = "quack";
void app_main(void)
{
uint32_t flash_size;
esp_flash_get_size(NULL, &flash_size);
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
ESP_LOGI(TAG, "This is %s chip with %d CPU cores, WiFi%s%s, "
"revision %d, %dMB %s flash",
"revision %d, %" PRIu32 "MB %s flash",
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "",
chip_info.revision,
spi_flash_get_chip_size() / (1024 * 1024),
chip_info.revision, flash_size / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
ESP_LOGI(TAG, "Minimum free heap size: %d bytes", esp_get_minimum_free_heap_size());
ESP_LOGI(TAG, "Minimum free heap size: %" PRIu32 " bytes", esp_get_minimum_free_heap_size());
ESP_LOGI(TAG, "");
ESP_LOGI(TAG, "\\_o< \\_o< \\_o< \\_O<");
ESP_LOGI(TAG, "");

View File

@ -28,7 +28,6 @@
#include "esp_system.h"
#include "esp_err.h"
#include "esp_log.h"
#include "driver/timer.h"
#include "esp_timer.h"
#include "quad.h"
@ -40,8 +39,8 @@ esp_timer_handle_t quad_qx, quad_qy;
QueueHandle_t q_qx, q_qy;
/* static functions */
static void IRAM_ATTR quad_timer(void* arg);
/* ISR functions */
static void IRAM_ATTR quad_isr(void* arg);
/* phases */
const bool q1[] = {true, false, false, true};
@ -51,6 +50,10 @@ const bool q2[] = {true, true, false, false};
void quad_init(void) {
esp_timer_create_args_t args;
/* create quadrature queues */
q_qx = xQueueCreate(4, sizeof(int8_t));
q_qy = xQueueCreate(4, sizeof(int8_t));
/* create quadrature tasks */
xTaskCreate(quad_click, "CLICK", 1024, NULL, tskIDLE_PRIORITY + 1, &t_click);
xTaskCreate(quad_move_x, "QX", 4 * 1024, NULL, tskIDLE_PRIORITY + 1, &t_qx);
@ -66,23 +69,23 @@ void quad_init(void) {
gpio_set_level(GPIO_QY2, q2[0]);
/* create timers for quadrature phases */
args.callback = quad_timer;
args.callback = quad_isr;
args.arg = t_qx;
args.name = "quad_qx";
args.dispatch_method = ESP_TIMER_ISR;
ESP_ERROR_CHECK(esp_timer_create(&args, &quad_qx));
args.callback = quad_timer;
args.callback = quad_isr;
args.arg = t_qy;
args.name = "quad_qy";
args.dispatch_method = ESP_TIMER_ISR;
ESP_ERROR_CHECK(esp_timer_create(&args, &quad_qy));
q_qx = xQueueCreate(4, sizeof(int8_t));
q_qy = xQueueCreate(4, sizeof(int8_t));
ESP_LOGI("quad", "Quadrature tasks started on core %d", xPortGetCoreID());
}
void quad_click(void *pvParameters) {
unsigned int click = 0;
long unsigned int click = 0;
(void)pvParameters;
@ -165,7 +168,7 @@ void IRAM_ATTR quad_move_y(void *pvParameters) {
}
/* simple ISR function. Resume the task that called the oneshot timer */
static void IRAM_ATTR quad_timer(void* arg) {
static void IRAM_ATTR quad_isr(void* arg) {
BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
vTaskNotifyGiveFromISR(arg, &pxHigherPriorityTaskWoken);

1488
sdkconfig

File diff suppressed because it is too large Load Diff