Compare commits

...
Sign in to create a new pull request.

153 commits

Author SHA1 Message Date
rbaron
5214f904f1
Merge pull request #214 from ryanrolds/rolds/msec_sleep
Adjusting sleep durations to be milliseconds. Needed for FCC 15b testing.
2024-09-06 09:08:33 +02:00
Ryan R. Olds
20693143ae Fixing build failure 2024-09-05 13:27:16 -07:00
Ryan R. Olds
2e5f89b228 Adjusting code 2024-09-03 16:25:14 -07:00
Ryan R. Olds
2dc7144de1 Switching sleep to to msec. Will aid FCC 15b testing 2024-09-03 16:23:28 -07:00
rbaron
5f671b0170
Merge pull request #207 from seime/debug_log_photo
Log photo adc value, not soil adc
2024-06-04 19:02:55 +02:00
Arne Seime
21dd14d7f3 Remove obsolete logging of soil voltage (always 0) 2024-06-04 16:55:30 +02:00
rbaron
f8c28cebd6
Merge pull request #208 from mrred2k/main
Add link to new case from Printables to README.md
2024-06-04 09:19:08 +02:00
rbaron
8ef2b5b748
Update README.md
- Parasite -> b-parasite
- Link directly to English website instead of german
2024-06-04 09:08:42 +02:00
mrred2k
4e0f3911bd Added a new case 2024-06-03 21:30:17 +02:00
Arne Seime
20d98d02a0 Log photo adc value, not soil adc 2024-06-03 10:21:51 +02:00
rbaron
ccdbaaf142
Merge pull request #194 from mrred2k/main
Include Printables link to 3D printable holder in README.md
2024-04-30 08:02:30 +02:00
mrred2k
57cf5aa0e5 Fixed Typos, deleted model 2024-04-29 21:18:27 +02:00
rbaron
e7e4b77eef
Merge pull request #188 from jrhbcn/main
Report battery percentage in BLE BTHOME_V2 protocol
2024-04-20 13:49:11 +02:00
jrhbcn
dc02480da9
Update encoding.c to fix formatting errors 2024-04-20 13:41:03 +02:00
jrhbcn
4796bfab5f
Update encoding.c
Changes in BTHOME_V2 protocol:
- Reduce resolution of humidity and moisture to 1 byte
- Add battery percentage
2024-04-20 13:10:36 +02:00
rbaron
e62521d2ae
Merge pull request #177 from ScottG489/patch-1
Small typo fix in BLE sample README
2024-03-07 19:15:37 +01:00
rbaron
16c4d23c47
Merge pull request #182 from oleo65/change-d1-component-part-no
Change d1 component part no
2024-03-04 19:07:17 +01:00
Ole Odendahl
15920b1ae4
Reflected changes to D1 in kicad files. 2024-02-25 16:03:26 +01:00
Ole Odendahl
d26eab5825
Updated BOM to changed inventory of JLCPCB.
Changed D1 to equivalent component.
2024-02-25 15:57:46 +01:00
rbaron
c7aaf5b388
Merge pull request #180 from jhbruhn/patch-1 2024-02-14 23:05:36 +01:00
Jan-Henrik Bruhn
905978e8c9
Only read positive voltages in adc.c
The ADC sometimes responds with negative voltages read on the ADC input due to noise. This can lead to very high illuminance readings at night (4095 << 4 to be exact due to two's complement :) ).
This commit caps ADC readings at 0.
2024-02-14 11:59:14 +01:00
Scott Giminiani
4c0fe9b4c6
Small typo fix in BLE sample README 2024-01-07 09:20:30 -08:00
rbaron
dd373ea235
Merge pull request #176 from victorhooi/patch-1
Fix broken link for ALS-PT19 datasheet
2024-01-01 22:53:51 +01:00
Victor Hooi
25a5941777
Fix broken link for ALS-PT19 datasheet 2024-01-01 23:02:42 +11:00
rbaron
37ea3a1062
Merge pull request #165 from rbaron/nrf2.5
Update to nRF Connect SDK 2.5
2023-11-08 08:33:01 +01:00
rbaron
d3ddd089bd
Merge pull request #166 from rbaron/nrf52833-flashfix
Fix nRF52833 flash partitions
2023-11-08 08:32:27 +01:00
rbaron
28c2809b04 Fix nRF52833 flash partitions
The nRF52833 has only 512 kB of flash. The .dts file was incorrect, as a
product of having it forked from the nRF52840 .dts files, which has 1 MB
of flash.

The new, correct partitions are closely related to the
[nrf52833dk](ec52722861/boards/arm/nrf52833dk_nrf52833/nrf52833dk_nrf52833.dts (L215)).
2023-11-07 21:32:09 +01:00
rbaron
ad3cd4194f Remove PM configs from soil_read_loop 2023-11-07 21:18:20 +01:00
rbaron
171a1eb4a0 Uses newwer FIXED_PARTITION_ID for fs_mount_t
... This is what new samples use, but there should be no functional
difference.
2023-11-07 20:57:54 +01:00
rbaron
5199ceaa50 Update to nRF Connect SDK 2.5 2023-11-07 18:31:32 +01:00
rbaron
7de5115705
Merge pull request #163 from rbaron/nrf-2.4.2
Bump nrf-connect sdk version to 2.4
2023-10-21 17:34:02 +02:00
rbaron
d5ed701c45 Simplify actions -- no artifacts 2023-10-21 17:26:55 +02:00
rbaron
141071a414 Refactor github actions
Reason: https://github.com/NordicPlayground/nrf-docker/pull/75
2023-10-21 17:21:39 +02:00
rbaron
35618227d5 Also bump in devcontainer.json 2023-10-21 10:30:36 +02:00
rbaron
77c204397e Bump nrf-connect sdk version to 2.4.2
Manually tested with both ble and zigbee samples.
2023-10-21 10:28:18 +02:00
mrred2k
5d2b648b22 Added the link to the holder
Added the 3d Printed holder from printables. Also available in "case"
2023-08-29 11:30:49 +02:00
mrred2k
da1642514a Created a holder for 10 b-parasides
Created a simple 3d printable holder for dealing with a bigger number of b-parasides.
2023-08-29 11:22:59 +02:00
rbaron
85ca1a67bc
Merge pull request #153 from rbaron/ble-bthomev2-def
[ble sample] Sets BTHome V2 as the default encoding
2023-07-23 18:45:15 +02:00
rbaron
e68c113513 [ble sample] Sets BTHome V2 as the default encoding
This change has been planned for a while, and BTHome v2 + Home Assistant
is currently the most convenient, hassle-free and maintained way to
interface with the BLE sample currently.
2023-07-23 18:39:01 +02:00
rbaron
e0481994b2
Merge pull request #152 from rbaron/ble-assert
[ble] __ASSERT initialization & sensor reading
2023-07-23 18:35:15 +02:00
rbaron
9ea5c7b4d0 Make init & loop fns static 2023-07-23 18:30:23 +02:00
rbaron
1a5acd02a5 [ble] __ASSERT initialization & sensor reading
After we tracked down a rare, annoying bug for the zigbee sample in #150,
this PR does something similar for the ble sample. If there's an error
either initializing the board of reading the sensors, __ASSERT will
reboot the system, instead of letting it hang forever.
2023-07-23 18:10:28 +02:00
rbaron
8fb45f7165
Merge pull request #150 from rbaron/zb-wdt
[zigbee sample] Fix rare infinite loop bug & introduce watchdog
2023-07-23 17:51:21 +02:00
rbaron
9fdd15626a Better error handling for SHTC3 reading 2023-07-15 11:07:35 +02:00
rbaron
c70eb600a3 [zigbee sample] Introduce watchdog for sensor task 2023-07-15 09:45:34 +02:00
rbaron
95ec660cb6
Merge pull request #146 from rbaron/zb-debug++
Fix (minor?) issues with the ZigBee sample
2023-07-15 09:25:18 +02:00
rbaron
d84a6422fe
Merge pull request #148 from Judman/main
Slightly Modified High Airflow Case
2023-07-03 08:05:06 +02:00
Judman
8c21fe73d5
Replace Current High Airflow Cases 2023-07-02 11:33:26 -05:00
Judman
0a73159ce9
Delete b_parasite_case_high_airflow_v2.stl 2023-07-02 11:29:08 -05:00
Judman
105016e24c
Slightly Modified High Airflow Case
Removed the circular supports the extended all the way to the build plate and left small bumps at the top of the case. Replaced with slightly wider and flatter supports that fit within the case constraints. Also slightly enlarged the PCB groove. I found it way too tight and ended up ripping off a batter holder and pads during removal.
2023-07-01 22:41:25 -05:00
rbaron
bc3d834b20 Make it mandatory to select a factory reset method
... in order to avoid unhappy surprises
2023-07-01 08:26:21 +02:00
rbaron
37aff683ad LOG_INF -> LOG_DBG 2023-07-01 08:04:17 +02:00
rbaron
c86f04e406 Nuclear reset option if recurring sensor task cannot be rescheduled
Famous last words: "this should never happen"
2023-07-01 08:04:17 +02:00
rbaron
7f42dd0c00 Add missing prst_led_off after stopping LED flashing timer 2023-07-01 08:04:17 +02:00
rbaron
46feb542cc More fixes to the ZigBee sample
- 🚨 Missing `break` statements in `zboss_signal_handler`
- Makes `zboss_signal_handler` return fast. According to the
  [docs](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.thread_zigbee.v2.0.0%2Fgroup__zb__comm__signals.html):
  "Signal processing should not do long operations synchronously". I
  removed calls to `prst_flash_led` (essentially a huge sync delay) and `debug_counters_increment`,
  which were blocking. I'll try migrating the debug_counters to
  non-blocking separately
- Main sensor reading task is started for the first time upon
  the `ZB_ZDO_SIGNAL_SKIP_STARTUP` signal. This is what the
  [weather_station sample](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/applications/zigbee_weather_station/README.html) does. It should have no functional difference, but there's [some special handling for alarms started from the ZigBee task](0469247dc4/subsys/zigbee/osif/zb_nrf_platform.c (L426))
2023-07-01 08:04:17 +02:00
rbaron
62a99cc716 Reintroduced accidentally deleted comment 2023-07-01 08:04:17 +02:00
rbaron
90f99bd5b0 Fixes (minor?) issues with the ZigBee sample
1. zigbee_configure_sleepy_behavior must be called before zigbee_enable - [source
docs](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/libraries/zigbee/zigbee_app_utils.html#c.zigbee_configure_sleepy_behavior)

2. zb_zdo_pim_set_long_poll_interval must be called after the network is joined - [source docs](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/zboss/3.5.2.0/group__zdo__poll__control.html#ga3aae8929b30e71c872f937771b89c768).
On top of that, the argument for the call was incorrect - it expects ms directly.

3. Removed the unecessary CONFIG_PM, seems like there's no impact in power consumption. Could it cause some weirdness?

4. Implemented CONFIG_PRST_ZB_FACTORY_RESET_DISABLED=y to fully disable factory resetting. May aid debugging.

5. Implemented multi/single channel support. Helps with battery life when scanning networks
2023-07-01 08:04:15 +02:00
rbaron
5882312a77 [zb] Debugging changes:
- Disables double reset
- Fully reset with zb_reset() on reset watchdog instead of
  user_input_indicate()
- Debug counters before/after sensors read
2023-07-01 08:03:42 +02:00
rbaron
a4a02257f9
Merge pull request #147 from rbaron/zb-sw1-factory-reset
[ZigBee sample] Implements factory reset via SW1 button (hardware v2.0.0+)
2023-07-01 07:55:45 +02:00
rbaron
f9f122b818 Formatting 2023-06-27 21:34:49 +02:00
rbaron
d5891f4a6f [ZigBee sample] Implements factory reset via SW1 button (hardware v2.0.0+) 2023-06-27 21:28:56 +02:00
rbaron
56c5fa7ba0
Merge pull request #133 from rbaron/zb_debug_counters
[ZigBee Sample] Introduce debug counters
2023-06-27 19:08:53 +02:00
rbaron
f6b4600044
Merge pull request #140 from rbaron/config_board_revision_code
Introduce CONFIG_BOARD_REVISION_CODE
2023-06-15 18:36:22 +02:00
rbaron
afa53f0e94 Introduce CONFIG_BOARD_REVISION_CODE
Beside having a `CONFIG_BOARD_REVISION` Kconfig string that represents
our semantic versioning for board revisions, the ZigBee sample requires
an integer representation of it. Instead of conditioning the integer
version on the string version only for that sample and having to touch
the ZigBee sample whenever we add a revision, I decided to have a
board-wide config, so that both string and int versions live close to
each other.

Fixes #138.
2023-06-15 07:45:55 +02:00
rbaron
426195184d
Merge pull request #136 from rbaron/code-of-conduct
Create CODE_OF_CONDUCT.md
2023-06-09 18:58:59 +02:00
rbaron
c9df52fd5f
Create CODE_OF_CONDUCT.md
As endearing as it is to get unactionable hate messages, I would rather we focus our efforts on having fun and fostering a small, great, positive, welcoming community, as it's has been so far.

This code of conduct is from https://www.contributor-covenant.org/, based on Mozilla's. I hope we never have to enforce it, and it sucks that we even have to think about these things. But at least this makes it a little more explicit about what's unacceptable behavior.
2023-06-09 09:27:46 +02:00
rbaron
930239e385 Cleanup + double_reset counter 2023-06-07 08:26:05 +02:00
rbaron
015ce94bbd Cleanup 2023-06-07 08:10:23 +02:00
rbaron
987c4f52c0 Removes async debug counters API - not needed 2023-06-07 08:08:34 +02:00
rbaron
509350457f [ZigBee sample] Introduce debug counters
In the effort to increse reliability of the Zigbee sample, #126 and #130
introduced handling for possibly rare, hard-to-debug events that may be
occurring. While these changes seem to help in practive, we don't know
exactly how often, if ever, they are triggered.

This PR introduces debug_counters in hope to add some visilibty in these
hard-to-debug, rare conditions.

Calling `prst_debug_counters_increment("some_counter")` will increment a
value stored in flash. These values are then dumped via logging when the
device boots. Moving forward we can also consider exposing these values
via a ZigBee cluster.
2023-06-07 08:08:34 +02:00
rbaron
bcc5a853d0
Merge pull request #130 from oleo65/zigbee-schedule-steering-restart
Zigbee schedule steering restart
2023-06-07 08:07:44 +02:00
Ole Odendahl
3aa33cdd89
Fixed api of restart watchdog. 2023-06-02 11:39:52 +02:00
Ole Odendahl
ce748c4759
Added restart watchdog timeout to Kconfig. 2023-06-02 11:31:58 +02:00
Ole Odendahl
5cede82dc5
Changing api of restart handler to only expose needed functions.
This encapsulates the low level timer logic from the caller.
2023-06-02 11:16:49 +02:00
Ole Odendahl
9285a6bc41
Added comment to describe nordic funny function name. 2023-06-02 11:15:46 +02:00
Ole Odendahl
6f10dc9e19
Fixed clang format. 2023-06-02 11:07:47 +02:00
Ole Odendahl
c52d5f7a48
Added steering restart handler to signal handler steering branch.
Made the device flash less frequently to save power on unexpected connection drops.
2023-06-02 11:07:47 +02:00
Ole Odendahl
727138415e
Added restart handler module. 2023-06-02 11:07:46 +02:00
Ole Odendahl
69c0ed3694
Separated two signals for better debugging and possibly different handling. 2023-06-02 11:07:46 +02:00
Ole Odendahl
ba786eb298
Moving steering successful flashing to success if branch. 2023-06-02 11:00:17 +02:00
rbaron
6580cf40a2
Merge pull request #126 from MJDSys/fix_KRKNWK-12017
Implement workaround for errata KRKNWK-12017
2023-05-31 21:21:08 +02:00
Matthew Dawson
54b1c48638
Implement workaround for errata KRKNWK-12017
Nordic has published an errata for the nRF Connect SDK for versions
>1.8.0 where a Zigbee End Device can end up getting stuck if the
parent device does not acknowledge the "Device Announcement packet".

They have a suggested workaround to implement in the SDK, which has
been adapted for the custom signal handler used here.

This is an effort to solve issues where my parasites would occasionally
drop off my network and require a reboot.  After 24Hrs, I've not yet
had a device disappear but it has taken >weeks before a device would
fail.  Unforunately it's hard to debug the board as the chips are in a
low power state when this occurs.
2023-05-10 10:45:30 -04:00
rbaron
e56a7748b0
Update kitspace.yaml
#125
2023-05-08 08:58:08 +02:00
rbaron
117b257336
Update README.md
Fix wiki link
2023-05-03 19:56:07 +02:00
rbaron
70d716520d
Update cases options in README.md 2023-04-19 21:41:53 +02:00
rbaron
414427df5b
Merge pull request #121 from mneuhaus/patch-1
Add Link to another Case to the Readme
2023-04-19 21:32:18 +02:00
Marc Neuhaus
fbf8e09f0d
Add Link to another Case to the Readme 2023-04-19 09:23:28 +02:00
rbaron
0ca44f737b
Merge pull request #120 from rbaron/ble-nonconn
[ble] Make advertising non-connectable
2023-04-16 14:26:41 +02:00
rbaron
7ac6d98b3b [ble] Make advertising non-connectable
I've been debugging a Shelly [bluetooth
proxy](https://www.home-assistant.io/integrations/shelly/#bluetooth-support)
feature, which didn't like b-parasite's advertising. It swallowed it before proxying it to HA.

I compared to both ATC and the legacy b-parasite advertising
(pre-nrf-connect) and found it to be related to the
non-connectable/non-scannable settings. Until this PR, we were
mistankenly settings the advertising to scannable, although with no
scannable data. The Zephyr code that sets this parameter based on the
scannable data is [here](c0fcd35531/subsys/bluetooth/host/adv.c (L860)).

My bet is that some scanners like ESPHome are okay with this, but Shelly
is not. Either way, I believe this PR makes the advertisements more
compliant.
2023-04-16 12:28:23 +02:00
rbaron
9ff5180cd7
Merge pull request #117 from rbaron/hardware-v2
Version 2.0.0
2023-03-30 19:30:06 +02:00
rbaron
fdf4609131 Update README.md with photo of v2.0.0 board 2023-03-30 19:20:33 +02:00
rbaron
00d11f50a7 Remove hardware-v2 from workflow triggers 2023-03-30 07:57:37 +02:00
rbaron
caec746c26 Mentions input sample in README.md 2023-03-30 07:57:07 +02:00
rbaron
cb40173b6b Remove debug info 2023-03-29 21:46:41 +02:00
rbaron
ebc26fcccd Cleanups 2023-03-29 21:42:41 +02:00
rbaron
dbded329a4 Build input sample as part of the CI 2023-03-29 21:30:16 +02:00
rbaron
e82c1b6bc1 Implements button handling
- DTS bindings
- Debouncing logic
- New `input` for testing and interrupt power profiling
2023-03-29 21:28:24 +02:00
rbaron
2c052cd376
Merge pull request #116 from oleo65/zigbee-identify-callback
Added zigbee identify callback
2023-03-27 19:36:59 +02:00
Ole Odendahl
20d6c893bf
Added callback for handling identify button action as declared in identify cluster. 2023-03-27 12:20:03 +02:00
rbaron
02b3970ffc Shorten job names 2023-03-19 16:45:55 +01:00
rbaron
6c618d946c Fixes workflow matrix variables and debug 2023-03-19 16:37:33 +01:00
rbaron
ead6fd434d Refactor github actions into parallel jobs 2023-03-19 16:26:12 +01:00
rbaron
bf9f4e1b5b Get GitHub to build some samples for 2.0.0 2023-03-19 15:26:58 +01:00
rbaron
a6995d1ce8 Update date on pcbnew 2023-03-19 15:06:39 +01:00
rbaron
c7128ef163 Generate fabrication files 2023-03-19 15:06:39 +01:00
rbaron
5eef25f86b Updates SW1 location and pin
Previous, SW1 was too close to RST, making it difficult to press one
without pressing another. After changing its position, it was more
convenient to route SW1 to pin 10 on U1 - That's P0.30/AIN6 both on
nRF52840 (C) and nRF52833 (E) modules.
2023-03-19 15:06:39 +01:00
rbaron
19e0354113 Fixes Q1 in PCB layout. I think 2023-03-19 15:06:39 +01:00
rbaron
5cc40a41f6 Set calibration coefficients for 2.0.0 2023-03-19 15:06:39 +01:00
rbaron
7f652ce75d BIG YIKES - Fix wrong symbol/footprint for MMBT3906 (Q1)
I previously used a basic 2N3906 and then changed its footprint to
SOT-23. This led to the wrong pin assignment.
This commit fixes it by using the correct symbol and footprint for it.

Note that the PCB layout still needs fixing.
2023-03-19 15:06:39 +01:00
rbaron
b34bc60a0a Actually use the devicetree calibration coeffs 2023-03-19 15:06:39 +01:00
rbaron
2f7a25e266 Add devicetree calibration coeffs to nrf52833 board 2023-03-19 15:06:39 +01:00
rbaron
e24530b7c3 Fix devicetree-coeffs bug 2023-03-19 15:06:39 +01:00
rbaron
1983f31af9 Store calibration polynomial in devicetree
This will enable us to transparently use different calibration for
different board revisions. The 2.0.0 revision changes the sensing
circuitry and will need its own coeffs.

In this commit, both models are run in parallel for debugging.
2023-03-19 15:06:39 +01:00
rbaron
dbf288138e Add 2.0.0 board revision & CONFIG_BOARD_REVISION Kconfig 2023-03-19 15:06:39 +01:00
rbaron
53f806a8e5 Fix stale silkscreen 1.2.0 -> 2.0.0 2023-03-19 15:06:39 +01:00
rbaron
cfc5491849 Plotted gerbers 2023-03-19 15:06:39 +01:00
rbaron
8dceb6c7cc Plot PDF & generate BOM 2023-03-19 15:06:39 +01:00
rbaron
a79c1579f3 Fix drawing 2023-03-19 15:06:39 +01:00
rbaron
e71eaf9823 Routed 0.10 to a new test pad 2023-03-19 15:06:39 +01:00
rbaron
df6e327947 Slightly better routing 2023-03-19 15:06:39 +01:00
rbaron
b3ae950ee0 Adds sketch of RC circuit in silkscreen 2023-03-19 15:06:39 +01:00
rbaron
1a2dcbb70b Initial routing complete 2023-03-19 15:06:39 +01:00
rbaron
03a281fada New PWM testpoint and added LCSC part # for the E73 module 2023-03-19 15:06:39 +01:00
rbaron
123149d3d2 Some initial hardware changes for the 2.0.0 revision
- Simplified the fast discharge circuit to use a single PNP BJT instead
of two NPN BJTs
- Swapped nRF52 module's footprint for one with larger pads
- Added a user button tied to P0.12 (same as Button 2 from [nrf52840_dk](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_nrf52840_dk%2FUG%2Fdk%2Fhw_buttons_leds.html))
- Added a reset switch

These are only schematic changes - PCB layout is stale and needs to be
recreated.
2023-03-19 15:06:39 +01:00
rbaron
d5a548a110
Merge pull request #110 from lonewolf896/main
Modified the high airflow case
2023-03-11 07:28:47 +01:00
Garrett Elkins
1ffc876ad0
Add files via upload 2023-03-10 21:17:13 -08:00
Garrett Elkins
34ddee5ea3
Delete b-parasite-high-airflow.stl 2023-03-10 21:17:00 -08:00
Garrett Elkins
3959abbf03
Delete b_parasite_case_high_airflow.stl 2023-03-10 21:16:52 -08:00
Garrett Elkins
2bff7d8741
Delete b-parasite-high-airflow.3mf 2023-03-10 21:16:18 -08:00
Garrett Elkins
abe8845c4b
Delete b_parasite_case_high_airflow.3mf 2023-03-10 21:16:04 -08:00
Garrett Elkins
40a8676e59
updated high airflow model
modified the high airflow model to increase the print reliability
2023-03-10 21:15:26 -08:00
rbaron
5e315ba9cd [ble] Update connection interval docs & power profile
Closes #98
2023-02-12 16:13:55 +01:00
rbaron
7be5fe1669 [ble] Bumps default advertising interval to [30, 40] ms
This makes the BLE sample use the same parameters as the legacy
firmware, and immproves the range.
2023-02-12 16:02:51 +01:00
rbaron
d292190d31
Merge pull request #103 from MJDSys/fix_battery_information 2023-02-02 08:14:47 +01:00
Matthew Dawson
d3bcc13749
Fix battery quantity/size reporting
The API for reporting information requires a pointer to the data value,
and cannot deal with a constant directly.  The current quantity/size
returned by the device are random values from memory.

Instead move these values into the prst_batt_attrs_t struct and
set their values in prst_zb_attrs_init.
2023-02-02 00:43:13 -05:00
rbaron
4b277bd62f
Merge pull request #12 from kitspace-forks/main 2023-01-31 07:54:05 +01:00
Kaspar Emanuel
ee708db400 Add gerbers field to kitspace.yaml 2023-01-30 22:42:11 +00:00
Kaspar Emanuel
05e25d166a Add kitspace.yaml 2023-01-30 22:42:03 +00:00
rbaron
997bfb7518
Merge pull request #102 from rbaron/ble-adv-int
Make advertisement intervals configurable
2023-01-28 11:52:00 +01:00
rbaron
28db7224a6 Make advertisement intervals configurable
We were previously relying on the default values (100ms, 150ms). This
PR makes it easier to test and configure parameters for different
tradeoffs between range / power consumption (#98).
2023-01-28 11:44:17 +01:00
rbaron
41ba531fba
Merge pull request #101 from MJDSys/zigbee_2.2_sdk 2023-01-23 11:12:55 +01:00
Matthew Dawson
424b471eb8
Update containers to use SDK 2.2.0
The zigbee sample no longer compiles with SDK 2.1, so update the used
docker image to 2.2.0.
2023-01-22 19:03:34 -05:00
Matthew Dawson
af47848b80
Update Zigbee example to work with SDK 2.2.0
The new SDK requires 802.15.4 to be enabled in the board DTS file.

Also disable IPv6 explicitly to avoid compile errors related to its
network stack, since it is not used currently.

Closes #94
2023-01-22 02:51:24 -05:00
rbaron
119055b97a
Merge pull request #95 from derrohrbach/issue/missing-counter
Fix: Counter was missing
2023-01-14 11:31:59 +01:00
Marvin Rohrbach
ee38d4561a Fix: Counter was missing 2023-01-12 08:12:18 +00:00
rbaron
1fbd971c4f
Merge pull request #91 from rbaron/zigbee-double-reset
[zb] Implement a double-reset factory resetting method
2022-12-27 19:35:36 +01:00
rbaron
5d25499ae1 [zb] Implement double-reset factory resetting method 2022-12-27 19:22:01 +01:00
rbaron
8105bfcd7b Ensures sensor-reading callback is always rescheduled 2022-12-26 11:06:26 +01:00
rbaron
98433502af Default PRST_ZB_SLEEP_DURATION_SEC to 60s 2022-12-24 18:37:00 +01:00
rbaron
14399dffb4 Fix artifact uploading in GitHub build-and-upload action 2022-12-24 17:22:15 +01:00
rbaron
54792ce35f
Merge pull request #81 from rbaron/zigbee-sample
Introduce an experimental/educactional/exploratory Zigbee firmware sample
2022-12-24 10:29:38 +01:00
rbaron
a34b1f8721
Merge pull request #89 from rbaron/nrf52833-adc-fix
Fix ADC config for nRF52833
2022-12-24 09:48:12 +01:00
rbaron
c76b8dc289 Fix ADC config for nRF52833 2022-12-21 18:40:48 +01:00
109 changed files with 175074 additions and 18814 deletions

View file

@ -1,6 +1,6 @@
{
"name": "nrf-connect:v2.1",
"image": "nordicplayground/nrfconnect-sdk:v2.1-branch",
"name": "nrf-connect:v2.4",
"image": "nordicplayground/nrfconnect-sdk:v2.5-branch",
"features": {
},
"customizations": {

View file

@ -1,5 +0,0 @@
FROM nordicplayground/nrfconnect-sdk:v2.1-branch
COPY build.sh /build.sh
ENTRYPOINT ["/build.sh"]

View file

@ -1,27 +1,27 @@
name: 'Build'
description: 'Builds a nrf-connect sample for b-parasite'
name: "Build"
description: "Builds a nrf-connect sample for b-parasite"
inputs:
sample-dir:
description: 'Sample directory to build'
description: "Sample directory to build"
required: true
board:
description: 'Board definition to use'
description: "Board definition to use"
default: bparasite_nrf52840
revision:
description: 'Board revision use'
default: '1.2.0'
description: "Board revision use"
default: "2.0.0"
cmake-extra:
description: 'Extra CMake arguments'
default: ''
output-bin:
description: 'Name of the .hex output'
required: true
description: "Extra CMake arguments"
default: ""
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.sample-dir }}
- ${{ inputs.board }}
- ${{ inputs.revision }}
- ${{ inputs.cmake-extra }}
- ${{ inputs.output-bin }}
using: "composite"
steps:
- run: |
docker run --rm -v ${GITHUB_WORKSPACE}:/repo \
nordicplayground/nrfconnect-sdk:v2.5-branch \
west build \
--build-dir /repo/${{ inputs.sample-dir }}/build \
--pristine \
--board ${{ inputs.board }}@${{ inputs.revision }} \
/repo/${{ inputs.sample-dir }} -- ${{ inputs.cmake-extra }}
shell: bash

View file

@ -1,21 +0,0 @@
#!/bin/bash
set -eux -o pipefail
SAMPLE_DIR=$1
BOARD=$2
REVISION=$3
CMAKE_EXTRA=$4
OUTPUT_BIN=$5
TODAY=$(date +'%Y-%m-%d')
# Replaces occurrences of "__TODAY__" with $TODAY in $CMAKE_EXTRA.
CMAKE_EXTRA="${CMAKE_EXTRA/__TODAY__/"$TODAY"}"
cd "${GITHUB_WORKSPACE}/${SAMPLE_DIR}"
echo $CMAKE_EXTRA
west build --build-dir ./build --pristine --board "${BOARD}@${REVISION}" -- $CMAKE_EXTRA
mv build/zephyr/zephyr.hex build/zephyr/"${OUTPUT_BIN}"

View file

@ -1,33 +0,0 @@
name: 'Build and upload artifact'
description: 'Builds a nrf-connect sample for b-parasite'
inputs:
sample-dir:
description: 'Sample directory to build'
required: true
board:
description: 'Board definition to use'
required: true
revision:
description: 'Board revision use'
default: '1.2.0'
cmake-extra:
description: 'Extra CMake arguments'
default: ''
output-bin:
description: 'Name of the .hex output'
required: true
runs:
using: "composite"
steps:
- uses: ./.github/actions/build
with:
sample-dir: ${{ inputs.sample-dir }}
board: ${{ inputs.board }}
revision: ${{ inputs.revision }}
cmake-extra: ${{ inputs.cmake-extra }}
output-bin: ${{ inputs.output-bin }}
- uses: actions/upload-artifact@v3
with:
name: sample-binaries
path: code/nrf-connect/samples/ble/build/zephyr/${{ inputs.output-bin }}

View file

@ -6,77 +6,106 @@ on:
pull_request:
branches:
- main
jobs:
build:
lint:
runs-on: ubuntu-latest
name: Check format & build samples
name: Check code format
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Check clang-format
uses: jidicula/clang-format-action@v4.9.0
with:
check-path: 'code/nrf-connect'
check-path: "code/nrf-connect"
exclude-regex: '\/build\/'
build-blinky:
runs-on: ubuntu-latest
name: Build blinky
needs:
- lint
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build blinky
uses: ./.github/actions/build
with:
sample-dir: code/nrf-connect/samples/blinky
board: bparasite_nrf52840
revision: 2.0.0
output-bin: blinky_nrf52840.hex
build-input:
runs-on: ubuntu-latest
name: Build input
needs:
- lint
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build input
uses: ./.github/actions/build
with:
sample-dir: code/nrf-connect/samples/input
board: bparasite_nrf52840
revision: 2.0.0
output-bin: input_nrf52840.hex
build-soil-read-loop:
runs-on: ubuntu-latest
name: Build soil_read_loop
needs:
- lint
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build soil_read_loop
uses: ./.github/actions/build
with:
sample-dir: code/nrf-connect/samples/soil_read_loop
board: bparasite_nrf52840
revision: 2.0.0
output-bin: soil_read_loop_nrf52840.hex
- name: Build ble_nrf52840_1_2_0_default.hex
uses: ./.github/actions/build_and_upload
build-ble:
strategy:
matrix:
soc: [nrf52840, nrf52833]
revision: [1.1.0, 1.2.0, 2.0.0]
runs-on: ubuntu-latest
name: Build ble ${{ matrix.soc }}@${{ matrix.revision }}
needs:
- lint
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build
uses: ./.github/actions/build
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52840
revision: '1.2.0'
output-bin: ble_nrf52840_1_2_0_default.hex
- name: Build ble_nrf52840_1_1_0_default.hex
uses: ./.github/actions/build_and_upload
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52840
revision: '1.1.0'
output-bin: ble_nrf52840_1_1_0_default.hex
- name: Build ble_nrf52840_1_0_0_default.hex
uses: ./.github/actions/build_and_upload
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52840
revision: '1.0.0'
output-bin: ble_nrf52840_1_0_0_default.hex
- name: Build ble_test_nrf52840_bthomev1_1s.hex
uses: ./.github/actions/build_and_upload
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52840
revision: '1.2.0'
cmake-extra: -DCONFIG_PRST_BLE_ENCODING_BTHOME_V1=y -DCONFIG_PRST_SLEEP_DURATION_SEC=1
output-bin: ble_test_nrf52840_bthomev1_1s.hex
- name: Build ble_test_nrf52840_bthomev2_1s.hex
uses: ./.github/actions/build_and_upload
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52840
revision: '1.2.0'
cmake-extra: -DCONFIG_PRST_BLE_ENCODING_BTHOME_V2=y -DCONFIG_PRST_SLEEP_DURATION_SEC=1
output-bin: ble_test_nrf52840_bthomev2_1s.hex
- name: Build ble_nrf52833_default.hex
uses: ./.github/actions/build_and_upload
with:
sample-dir: code/nrf-connect/samples/ble
board: bparasite_nrf52833
output-bin: ble_nrf52833_default.hex
- name: Build zigbee_nrf528340_default.hex
uses: ./.github/actions/build_and_upload
board: bparasite_${{ matrix.soc }}
revision: ${{ matrix.revision }}
cmake-extra: -DCONFIG_PRST_BLE_ENCODING_BTHOME_V2=y -DCONFIG_PRST_SLEEP_DURATION_MSEC=1000 -DCONFIG_PRSTLIB_LOG_LEVEL_DBG=y
output-bin: ble_${{ matrix.soc }}_${{ matrix.revision }}_debug.hex
build-zigbee:
strategy:
matrix:
soc: [nrf52840, nrf52833]
revision: [1.2.0, 2.0.0]
runs-on: ubuntu-latest
name: Build zigbee ${{ matrix.soc }}@${{ matrix.revision }}
needs:
- lint
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build
uses: ./.github/actions/build
with:
sample-dir: code/nrf-connect/samples/zigbee
board: bparasite_nrf52840
output-bin: zigbee_nrf52840_default.hex
cmake-extra: -DPRST_ZB_BUILD_DATE=__TODAY__
board: bparasite_${{ matrix.soc }}
revision: ${{ matrix.revision }}
cmake-extra: -DCONFIG_PRSTLIB_LOG_LEVEL_DBG=y
output-bin: zigbee_${{ matrix.soc }}_${{ matrix.revision }}_debug.hex

128
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
rbaron.net/contact.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View file

@ -2,7 +2,7 @@
# b-parasite
<p align="center">
<img src="img/resized/img1.jpg" width="512px" border="0" alt="PCB front and back photo" />
<img src="img/resized/b-parasite-2.0.0.jpg" width="512px" border="0" alt="PCB front and back photo" />
</p>
b-parasite is an open source soil moisture and ambient temperature/humidity/light sensor.
@ -10,7 +10,7 @@ b-parasite is an open source soil moisture and ambient temperature/humidity/ligh
# Features
* Capacitive Soil moisture sensor - see [this blog post](https://rbaron.net/blog/2021/04/05/How-capacitive-soil-moisture-sensors-work.html), [this Twitter thread](https://twitter.com/rbaron_/status/1367182806368071685), and [this post](https://wemakethings.net/2012/09/26/capacitance_measurement/) for nice resources on how they work
* Air temperature and humidity sensor using a [Sensirion's SHTC3](https://www.sensirion.com/en/environmental-sensors/humidity-sensors/digital-humidity-sensor-shtc3-our-new-standard-for-consumer-electronics/)
* Light sensor using an [ALS-PT19](https://everlighteurope.com/ambient-light-sensors/7/ALSPT19315CL177TR8.html) phototransistor
* Light sensor using an [ALS-PT19](https://en.everlight.com/wp-content/plugins/ItemRelationship/product_files/pdf/ALS-PT19-315C-L177-TR8_V8.pdf) phototransistor
* Powered by a common CR2032 coin cell, potentially for over two years
* Support for [nRF52840](https://www.nordicsemi.com/products/nrf52840) and [nRF52833](https://www.nordicsemi.com/products/nrf52833) modules
* Open hardware and open source design
@ -20,13 +20,14 @@ This repository also hosts a few different firmware samples for b-parasite.
|Sample|Description|Extra Documentation|
|---|---|---|
|[samples/ble](./code/nrf-connect/samples/ble)|This is the most battle-tested and useful firmware. It periodically reads all sensors and broadcast them via Bluetooth Low Energy (BLE). It works with [Home Assistant](https://www.home-assistant.io/) out of the box. |[Docs](./code/nrf-connect/samples/ble/README.md)|
|[samples/ble](./code/nrf-connect/samples/ble)|This is the most battle-tested and useful firmware. It periodically reads all sensors and broadcast them via Bluetooth Low Energy (BLE). It works with [Home Assistant](https://www.home-assistant.io/) + [BTHome](https://bthome.io/) out of the box. |[Docs](./code/nrf-connect/samples/ble/README.md)|
|[samples/zigbee](./code/nrf-connect/samples/zigbee)| An experimental/educational/exploratory basic Zigbee sample built on [nRF Connect + ZBOSS](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_zigbee.html). It integrates with [Home Assistant](https://www.home-assistant.io/) via [ZHA](https://www.home-assistant.io/integrations/zha) or [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)|
|[samples/blinky](./code/nrf-connect/samples/blinky)| The classic "Hello, world" |-|
|[samples/soil_read_loop](./code/nrf-connect/samples/soil_read_loop)| Read the soil moisture sensor on a loop. Useful for experimenting and calibrating the sensor. |-|
|[samples/soil_read_loop](./code/nrf-connect/samples/soil_read_loop)| Reads the soil moisture sensor on a loop. Useful for experimenting and calibrating the sensor. |-|
|[samples/input](./code/nrf-connect/samples/input)| Handles button presses. Useful for power profiling GPIO interrupts and testing debouncing for push switches on [boards that have them](https://github.com/rbaron/b-parasite/wiki/Hardware-Versions). |-|
# Documentation
Information about how to order, assemble, build the samples, protect the sensor and flash the firmware is on [the Wiki](https://github.com/rbaron/b-parasite/wiki/How-to-Program).
Information about how to order, assemble, build the samples, protect the sensor and flash the firmware is on [the Wiki](https://github.com/rbaron/b-parasite/wiki).
# Repository Organization
* [code/nrf-connect/](./code/nrf-connect/) - Common library and samples, built with Nordic's [nRF Connect SDK](https://www.nordicsemi.com/Products/Development-software/nrf-connect-sdk).
@ -40,8 +41,20 @@ Information about how to order, assemble, build the samples, protect the sensor
</p>
# Case
A 3D printable case model can be found in [case/](case/).
![Render of the 3D printable case](./img/case/screenshot.png)
<p align="center">
<img src="img/case/screenshot.png" alt="Render of the original 3D printable case" />
</p>
We have three different 3D-printable cases:
1. Original snap-on case - [case/Top.stl](./case/Top.stl), [case/Bottom.stl](./case/Bottom.stl)
2. High airflow - [case/b_parasite_case_high_airflow.stl](./case/b_parasite_case_high_airflow.stl)
3. Mushroom-style - available on [Printables](https://www.printables.com/model/456571-mushroomcap-for-b-parasite-soil-moisture-sensor)
4. b-parasite Hat - available on [Printables](https://www.printables.com/model/901220-waterproof-case-for-b-parasite-soil-moisture-air-s)
# Accessories
Designs and hardware to help you, when building your own:
1. Desk holder for b-parasites [Printables](https://www.printables.com/de/model/566974-b-parasite-holder)
# License
The hardware and associated design files are released under the [Creative Commons CC BY-SA 4.0 license](https://creativecommons.org/licenses/by-sa/4.0/).

View file

@ -11,4 +11,4 @@ add_library(prstlib STATIC
)
target_include_directories(prstlib PRIVATE include)
target_link_libraries(prstlib PUBLIC zephyr_interface)
target_link_libraries(prstlib PUBLIC zephyr_interface kernel)

View file

@ -4,6 +4,14 @@ if BOARD_BPARASITE_NRF52833
config BOARD
default "bparasite_nrf52833"
config BOARD_REVISION
string "Board revision."
default "1.0.0"
config BOARD_REVISION_CODE
int "Board revision code. An integer representation of the board revision."
default 1
config BT_CTLR
default BT

View file

@ -45,4 +45,4 @@
low-power-enable;
};
};
};
};

View file

@ -10,10 +10,11 @@
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_partition;
zephyr,ieee802154 = &ieee802154;
};
zephyr,user {
io-channels = <&adc 0>, <&adc 1>, <&adc 2>;
io-channels = <&adc 0>, <&adc 2>;
};
leds {
@ -27,9 +28,9 @@
buttons {
compatible = "gpio-keys";
button0: button_0 {
// P0.12.
gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 0";
// P0.30.
gpios = <&gpio0 30 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button SW1";
};
};
@ -39,28 +40,45 @@
pulse = <PWM_USEC(1)>;
};
soil_calibration_coeffs: soil_calibration_coeffs {
compatible = "soil-calibration-coeffs";
dry = <306000 101000 (-11700)>;
wet = <19000 (-4980) 3420>;
};
ctrl {
compatible = "gpio-keys";
fast_disch: fast_disch {
// P0.25.
gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
label = "Fast discharge circuitry";
};
};
};
&uicr {
gpio-as-nreset;
};
&gpiote {
status = "okay";
};
&gpio0 {
status = "okay";
// For low-power EDGE interrupts.
// See github.com/zephyrproject-rtos/zephyr/issues/28499.
sense-edge-mask = <0xffffffff>;
};
&gpio1 {
status = "okay";
};
&ieee802154 {
status = "okay";
};
&uart0 {
compatible = "nordic,nrf-uart";
status = "disabled";
@ -108,17 +126,6 @@
};
// Photo.
channel@1 {
reg = <1>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
// P0.02.
zephyr,input-positive = <NRF_SAADC_AIN0>;
zephyr,resolution = <10>;
};
// Battery.
channel@2 {
reg = <2>;
@ -132,7 +139,6 @@
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
@ -140,33 +146,23 @@
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x00000000 0x0000C000>;
reg = <0x000000000 0xC000>;
};
slot0_partition: partition@c000 {
label = "image-0";
reg = <0x0000C000 0x00067000>;
reg = <0x0000C000 0x32000>;
};
slot1_partition: partition@73000 {
slot1_partition: partition@3e000 {
label = "image-1";
reg = <0x00073000 0x00067000>;
reg = <0x0003E000 0x32000>;
};
scratch_partition: partition@da000 {
scratch_partition: partition@70000 {
label = "image-scratch";
reg = <0x000da000 0x0001e000>;
reg = <0x00070000 0xA000>;
};
/*
* The flash starting at 0x000f8000 and ending at
* 0x000fffff is reserved for use by the application.
*/
/*
* Storage partition will be used by FCB/LittleFS/NVS
* if enabled.
*/
storage_partition: partition@f8000 {
storage_partition: partition@7a000 {
label = "storage";
reg = <0x000f8000 0x00008000>;
reg = <0x0007A000 0x00006000>;
};
};
};
};

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="1.1.0"
CONFIG_BOARD_REVISION_CODE=2

View file

@ -12,7 +12,7 @@
ldr_enable: ldr_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Fast discharge circuitry";
label = "LDR supply";
};
};
};
@ -27,4 +27,4 @@
zephyr,input-positive = <NRF_SAADC_AIN0>;
zephyr,resolution = <10>;
};
};
};

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="1.2.0"
CONFIG_BOARD_REVISION_CODE=3

View file

@ -11,7 +11,7 @@
photo_transistor_enable: photo_transistor_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Fast discharge circuitry";
label = "Phototransistor supply";
};
};
};
@ -26,4 +26,4 @@
zephyr,input-positive = <NRF_SAADC_AIN0>;
zephyr,resolution = <10>;
};
};
};

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="2.0.0"
CONFIG_BOARD_REVISION_CODE=4

View file

@ -0,0 +1,35 @@
/ {
photo_transistor: photo_transistor {
compatible = "voltage-divider";
output-ohms = <470>;
io-channels = <&adc 1>;
};
soil_calibration_coeffs: soil_calibration_coeffs {
compatible = "soil-calibration-coeffs";
dry = <334000 110000 (-15300)>;
wet = <299000 (-83100) 11200>;
};
ctrl {
compatible = "gpio-keys";
photo_transistor_enable: photo_transistor_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Phototransistor supply";
};
};
};
&adc {
channel@1 {
reg = <1>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
// P0.02.
zephyr,input-positive = <NRF_SAADC_AIN0>;
zephyr,resolution = <10>;
};
};

View file

@ -16,6 +16,4 @@ CONFIG_GPIO=y
CONFIG_CONSOLE=y
CONFIG_RTT_CONSOLE=y
CONFIG_GPIO_AS_PINRESET=y
CONFIG_PINCTRL=y

View file

@ -4,6 +4,14 @@ if BOARD_BPARASITE_NRF52840
config BOARD
default "bparasite_nrf52840"
config BOARD_REVISION
string "Board revision."
default "1.0.0"
config BOARD_REVISION_CODE
int "Board revision code. An integer representation of the board revision."
default 1
config BT_CTLR
default BT

View file

@ -10,10 +10,11 @@
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_partition;
zephyr,ieee802154 = &ieee802154;
};
zephyr,user {
io-channels = <&adc 0>, <&adc 2>;
io-channels = <&adc 0>, <&adc 2>;
};
leds {
@ -27,9 +28,9 @@
buttons {
compatible = "gpio-keys";
button0: button_0 {
// P0.12.
gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 0";
// P0.30.
gpios = <&gpio0 30 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button SW1";
};
};
@ -39,6 +40,12 @@
pulse = <PWM_USEC(1)>;
};
soil_calibration_coeffs: soil_calibration_coeffs {
compatible = "soil-calibration-coeffs";
dry = <306000 101000 (-11700)>;
wet = <19000 (-4980) 3420>;
};
ctrl {
compatible = "gpio-keys";
fast_disch: fast_disch {
@ -49,18 +56,29 @@
};
};
&uicr {
gpio-as-nreset;
};
&gpiote {
status = "okay";
};
&gpio0 {
status = "okay";
// For low-power EDGE interrupts.
// github.com/zephyrproject-rtos/zephyr/issues/28499
sense-edge-mask = <0xffffffff>;
};
&gpio1 {
status = "okay";
};
&ieee802154 {
status = "okay";
};
&uart0 {
compatible = "nordic,nrf-uart";
status = "disabled";

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="1.1.0"
CONFIG_BOARD_REVISION_CODE=2

View file

@ -12,7 +12,7 @@
ldr_enable: ldr_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Fast discharge circuitry";
label = "LDR supply";
};
};
};

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="1.2.0"
CONFIG_BOARD_REVISION_CODE=3

View file

@ -11,7 +11,7 @@
photo_transistor_enable: photo_transistor_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Fast discharge circuitry";
label = "Phototransistor supply";
};
};
};

View file

@ -0,0 +1,2 @@
CONFIG_BOARD_REVISION="2.0.0"
CONFIG_BOARD_REVISION_CODE=4

View file

@ -0,0 +1,35 @@
/ {
photo_transistor: photo_transistor {
compatible = "voltage-divider";
output-ohms = <470>;
io-channels = <&adc 1>;
};
soil_calibration_coeffs: soil_calibration_coeffs {
compatible = "soil-calibration-coeffs";
dry = <334000 110000 (-15300)>;
wet = <299000 (-83100) 11200>;
};
ctrl {
compatible = "gpio-keys";
photo_transistor_enable: photo_transistor_enable {
// P0.29.
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
label = "Phototransistor supply";
};
};
};
&adc {
channel@1 {
reg = <1>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
// P0.02.
zephyr,input-positive = <NRF_SAADC_AIN0>;
zephyr,resolution = <10>;
};
};

View file

@ -16,6 +16,4 @@ CONFIG_GPIO=y
CONFIG_CONSOLE=y
CONFIG_RTT_CONSOLE=y
CONFIG_GPIO_AS_PINRESET=y
CONFIG_PINCTRL=y

View file

@ -1,4 +1,3 @@
# Hello
description: A fixed frequency & pulse PWM.

View file

@ -0,0 +1,25 @@
description: >
Calibration coefficients for the soil sensing circuit. We have two polynomials whose input variable
is the battery voltage in Volts. The evaluated polynomial corresponds to the estimated ADC value,
assumed to be 10 bits, so in [0, 1024). The two polynomials are:
dry: For estimation of the fully dry state, given the battery voltage
wet: For estimation of the fully dry state, given the battery voltage
Note that each poly coefficient is specified as 1000 times its real values. This is because we can't
directly represent floating points in devicetree. The final evaluated value should be divided by
1000.0f in code.
compatible: soil-calibration-coeffs
include: base.yaml
properties:
dry:
type: array
required: true
description: The coefficients * 1000, as integers. 0th degree first, then 1st and 2nd last.
wet:
type: array
required: true
description: The coefficients * 1000, as integers. 0th degree first, then 1st and 2nd last.

View file

@ -1,7 +1,24 @@
#ifndef _PRST_BUTTON_H_
#define _PRST_BUTTON_H_
// Inits button driver and registers callback.
#include <stdbool.h>
typedef enum {
PRST_BUTTON_SW1 = 0,
} prst_button_t;
typedef void (*prst_button_callback_t)(prst_button_t button, bool is_active);
// Inits button driver.
int prst_button_init();
#endif // _PRST_BUTTON_H_
// Configures ISR and calls callback on debounced button press/release.
int prst_button_register_callback(prst_button_callback_t callback);
// Returns:
// 1 if button is active
// 0 if button is inactive
// -1 on error
int prst_button_poll(prst_button_t prst_button);
#endif // _PRST_BUTTON_H_

View file

@ -5,13 +5,13 @@
#define PRST_TO_STRING(x) PRST_STRINGIFY(x)
#define PRST_LOCATION __FILE__ ":" PRST_TO_STRING(__LINE__)
#define RET_IF_ERR_MSG(expr, msg) \
{ \
int err = (expr); \
if (err) { \
LOG_ERR("Error: " msg " in " PRST_LOCATION); \
return err; \
} \
#define RET_IF_ERR_MSG(expr, msg) \
{ \
int err = (expr); \
if (err) { \
LOG_ERR("Error %d: " msg " in " PRST_LOCATION, err); \
return err; \
} \
}
#define RET_IF_ERR(expr) RET_IF_ERR_MSG(expr, "")

View file

@ -1,6 +1,7 @@
#include "prstlib/adc.h"
#include <math.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/adc.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/pwm.h>
@ -16,6 +17,10 @@ static const struct pwm_dt_spec soil_pwm_dt =
PWM_DT_SPEC_GET(DT_NODELABEL(soil_pwm));
static const uint32_t pulse = DT_PROP(DT_NODELABEL(soil_pwm), pulse);
// Calibration coefficients for the soil sensing circuit.
static const int dry_coeffs[3] = DT_PROP(DT_NODELABEL(soil_calibration_coeffs), dry);
static const int wet_coeffs[3] = DT_PROP(DT_NODELABEL(soil_calibration_coeffs), wet);
struct gpio_dt_spec fast_disch_dt =
GPIO_DT_SPEC_GET(DT_NODELABEL(fast_disch), gpios);
@ -79,13 +84,19 @@ static void set_battery_percent(const prst_adc_read_t* read, prst_batt_t* out) {
return;
}
static inline float eval_poly(const int coeffs[3], float x) {
// The coefficients are specified times 1000, as a workaround the lack of support for floating
// points in devicetree bindings.
return (coeffs[0] + coeffs[1] * x + coeffs[2] * x * x) / 1000.0f;
}
static inline float get_soil_moisture_percent(float battery_voltage,
int16_t raw_adc_output) {
const double x = battery_voltage;
const double dry = -11.7f * x * x + 101.0f * x + 306.0f;
const double wet = 3.42f * x * x - 4.98f * x + 19.0f;
const float x = battery_voltage;
const float dry = eval_poly(dry_coeffs, x);
const float wet = eval_poly(wet_coeffs, x);
const float percent = (raw_adc_output - dry) / (wet - dry);
LOG_DBG("Read soil moisture: %.2f | Raw %u | Batt: %.2f | Dry: %.2f | Wet: %.2f",
LOG_DBG("Read soil moisture 2: %.2f | Raw %u | Batt: %.2f | Dry: %.2f | Wet: %.2f",
100.0f * percent, raw_adc_output, x, dry, wet);
return percent;
}
@ -97,6 +108,7 @@ static int read_adc_spec(const struct adc_dt_spec* spec, prst_adc_read_t* out) {
int32_t val_mv = buf;
RET_IF_ERR(adc_raw_to_millivolts_dt(spec, &val_mv));
val_mv = MAX(0, val_mv);
out->raw = buf;
out->millivolts = val_mv;
@ -121,6 +133,12 @@ int prst_adc_init() {
RET_IF_ERR(gpio_pin_configure_dt(&ldr_enable_dt, GPIO_OUTPUT));
#endif
for (size_t idx = 0; idx < ARRAY_SIZE(dry_coeffs); idx++) {
LOG_DBG("Dry coeff %d: %d\n", idx, dry_coeffs[idx]);
}
for (size_t idx = 0; idx < ARRAY_SIZE(wet_coeffs); idx++) {
LOG_DBG("Wet coeff %d: %d\n", idx, wet_coeffs[idx]);
}
return 0;
}

View file

@ -1,6 +1,7 @@
#include "prstlib/button.h"
#include <zephyr/drivers/gpio.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include "prstlib/led.h"
@ -8,23 +9,60 @@
LOG_MODULE_REGISTER(button, CONFIG_PRSTLIB_LOG_LEVEL);
static struct k_work_delayable button_pressed_delayable;
static struct gpio_dt_spec button =
GPIO_DT_SPEC_GET(DT_NODELABEL(button0), gpios);
static struct gpio_callback cb_data;
static void button_pressed(const struct device *dev, struct gpio_callback *cb,
uint32_t pins) {
LOG_INF("Button pressed");
prst_led_toggle();
static prst_button_callback_t user_callback = NULL;
static void maybe_call_user_callback(prst_button_t button, bool is_active) {
if (user_callback != NULL) {
user_callback(button, is_active);
} else {
LOG_WRN("No user callback registered for button %d", button);
}
}
static void button_pressed_cb(struct k_work *work) {
int button_state = prst_button_poll(PRST_BUTTON_SW1);
if (button_state < 0) {
LOG_ERR("Failed to poll button");
return;
}
return maybe_call_user_callback(PRST_BUTTON_SW1, button_state);
}
static void button_pressed_isr(const struct device *dev, struct gpio_callback *cb,
uint32_t pins) {
k_work_reschedule(&button_pressed_delayable, K_MSEC(10));
}
int prst_button_init() {
RET_IF_ERR(!device_is_ready(button.port));
RET_IF_ERR(gpio_pin_configure_dt(&button, GPIO_INPUT));
// EDGE interrupts consume more power! Just use a LEVEL one.
RET_IF_ERR(gpio_pin_interrupt_configure_dt(&button, GPIO_INT_LEVEL_ACTIVE));
gpio_init_callback(&cb_data, button_pressed, BIT(button.pin));
RET_IF_ERR(gpio_add_callback(button.port, &cb_data));
return 0;
}
}
int prst_button_register_callback(prst_button_callback_t callback) {
k_work_init_delayable(&button_pressed_delayable, button_pressed_cb);
// EDGE interrupts seem to consume more power than LEVEL ones.
// For GPIO_INT_EDGE_BOTH: 16 uA idle.
// For GPIO_INT_LEVEL_ACTIVE: 3 uA idle.
// Related issue:
// https://github.com/zephyrproject-rtos/zephyr/issues/28499
// Apparently sense-edge-mask brings the power consumption down to
// 3 uA for EDGE interrupts too.
RET_IF_ERR(gpio_pin_interrupt_configure_dt(&button, GPIO_INT_EDGE_BOTH));
gpio_init_callback(&cb_data, button_pressed_isr, BIT(button.pin));
RET_IF_ERR(gpio_add_callback(button.port, &cb_data));
user_callback = callback;
return 0;
}
int prst_button_poll(prst_button_t prst_button) {
RET_CHECK(prst_button == PRST_BUTTON_SW1, "Invalid button");
return gpio_pin_get_dt(&button);
}

View file

@ -16,10 +16,9 @@ int prst_sensors_read_all(prst_sensors_t *sensors) {
LOG_DBG("Batt: %d mV (%.2f%%)", sensors->batt.adc_read.millivolts,
100 * sensors->batt.percentage);
LOG_DBG("Soil: %.0f %% (%d mV)", 100 * sensors->soil.percentage,
sensors->soil.adc_read.millivolts);
LOG_DBG("Soil: %.0f %%", 100 * sensors->soil.percentage);
LOG_DBG("Photo: %u lx (%d mV)", sensors->photo.brightness,
sensors->soil.adc_read.millivolts);
sensors->photo.adc_read.millivolts);
LOG_DBG("Temp: %f oC", sensors->shtc3.temp_c);
LOG_DBG("Humi: %.0f %%", 100 * sensors->shtc3.rel_humi);
LOG_DBG("--------------------------------------------------");

View file

@ -32,11 +32,10 @@ int prst_shtc3_read(prst_shtc3_read_t *out) {
// Reading in normal (not low power) mode can take up to 12.1 ms, according to
// the datasheet.
k_msleep(15);
k_msleep(20);
while (i2c_read_dt(&shtc3, buff, 6) != 0) {
k_msleep(10);
}
// Read response.
RET_IF_ERR(i2c_read_dt(&shtc3, buff, 6));
// Put the sensor in sleep mode.
RET_IF_ERR(write_cmd(PRST_SHTC3_CMD_SLEEP));

View file

@ -2,17 +2,25 @@
source "Kconfig.zephyr"
rsource "../../prstlib/Kconfig"
config PRST_SLEEP_DURATION_SEC
int "Sleep duration in seconds"
default 600
config PRST_SLEEP_DURATION_MSEC
int "Sleep duration in milliseconds"
default 600000
config PRST_BLE_ADV_DURATION_SEC
int "Advertising duration in seconds"
default 1
config PRST_BLE_ADV_DURATION_MSEC
int "Advertising duration in milliseconds"
default 1000
config PRST_BLE_MIN_ADV_INTERVAL
int "Minimum advertising interval in milliseconds"
default 30
config PRST_BLE_MAX_ADV_INTERVAL
int "Maximum advertising interval in milliseconds"
default 40
choice PRST_BLE_ENCODING
prompt "b-parasite BLE encoding"
default PRST_BLE_ENCODING_BPARASITE_V2
default PRST_BLE_ENCODING_BTHOME_V2
config PRST_BLE_ENCODING_BPARASITE_V2
bool "Uses the custom b-parasite protocol v2 for encoding advertising packets"

View file

@ -1,5 +1,5 @@
# Bluetooth Low Energy (BLE)
In this saple, b-parasite sensors are periodically read and broadcast using Bluetooth Low Energy (BLE) dvertising packets.
In this sample, b-parasite sensors are periodically read and broadcast using Bluetooth Low Energy (BLE) dvertising packets.
## Configuration
Available configurations and their default values are in [`Kconfig`](./Kconfig). They are set in [`prj.conf`](./prj.conf). Here are some notable examples.
@ -8,7 +8,7 @@ Available configurations and their default values are in [`Kconfig`](./Kconfig).
To save energy, the board spends most of the time in a "deep sleep" state, in which most peripherals and radio are completely turned off. The period of sleep is controlled by the `PRST_SLEEP_DURATION_SEC` config.
### Advertising Duration
When it wakes up, the sample reads all sensors and keep broadcasting advertising packets for `PRST_BLE_ADV_DURATION_SEC` before going back to sleep.
When it wakes up, the sample reads all sensors and keep broadcasting advertising packets for `PRST_BLE_ADV_DURATION_MSEC` before going back to sleep.
### Advertising Packet Encoding
There are different ways to encode the sensor data in a BLE advertising packet.
@ -22,11 +22,10 @@ This is what a typical deployment with BTHome looks like:
![Topology with BTHome + Home Assistant](./media/drawings/ble-bthome-encoding.png)
There are two versions of BTHome encodings supported by this sample:
* `PRST_BLE_ENCODING_BTHOME_V2=y` (**default**) uses the [BTHome V2](https://bthome.io/format/), supported by Home Assistant since version `2022.12`
* `PRST_BLE_ENCODING_BTHOME_V1=y` uses the [legacy BTHome V1](https://bthome.io/v1/), which was briefly in use
* `PRST_BLE_ENCODING_BTHOME_V2=y` uses the [BTHome V2](https://bthome.io/format/), which is not yet (as of early Dec/2022) in the stable Home Assistant release. This will soon become the default.
#### b-parasite Encoding
`PRST_BLE_ENCODING_BPARASITE_V2=y` selects the "legacy" encoding, used historically inn this project. This is the encoding that the [`b_parasite`](https://esphome.io/components/sensor/b_parasite.html) ESPHome component understands.
`PRST_BLE_ENCODING_BPARASITE_V2=y` selects the legacy encoding, used historically in this project. This is the encoding that the [`b_parasite`](https://esphome.io/components/sensor/b_parasite.html) ESPHome component understands.
With this encoding and a ESPHome + `b_parasite` component, this is an usual deployment topology:
@ -43,8 +42,14 @@ While in deep sleep, the board consumes around `3.0 uA`:
![Sleep current consumption](./media/power-profile/sleep.png)
In the active broadcasting state, with default settings, the average current consumption is around `344 uA`:
In the active broadcasting state, the average power consumption is highly dependant on the advertising interval.
![Broadcasting current consumption](./media/power-profile/broadcasting.png)
With the default settings (in the `[30, 40] ms` range), we see an average of around `810 uA`:
With a `200 mAh` CR2032 battery, we can use [this spreadsheet](https://docs.google.com/spreadsheets/d/157JQiX20bGkTrlbvWbWRrs_WViL3MgVZffSCWRR7uAI/edit#gid=0) to estimate the battery life to over two years. Note that this is a simplified model and results in practice may vary.
![Broadcasting with 30 ms current consumption](./media/power-profile/broadcasting-30.png)
If for example we lower the connection interval to the SDK defaults (`[100, 150] ms`, roughly trading off range for power), the average current consumption is around `345 uA`:
![Broadcasting with 100ms current consumption](./media/power-profile/broadcasting-100.png)
With a `200 mAh` CR2032 battery, we can use [this spreadsheet](https://docs.google.com/spreadsheets/d/157JQiX20bGkTrlbvWbWRrs_WViL3MgVZffSCWRR7uAI/edit#gid=0) to estimate the battery life to over two years. Note that this is a simplified model and results in practice may vary.

View file

@ -13,4 +13,4 @@
"${workspaceFolder}"
]
}
}
}

View file

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

View file

@ -11,14 +11,17 @@ CONFIG_BT_DEVICE_NAME="prst"
CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
CONFIG_SERIAL=n
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
CONFIG_ASSERT=y
# Application config - see all options in Kconfig.
# CONFIG_PRST_BLE_ENCODING_BTHOME_V1=y
# CONFIG_PRST_SLEEP_DURATION_SEC=1
# CONFIG_PRST_BLE_ENCODING_BTHOME_V2=y
# CONFIG_PRST_SLEEP_DURATION_MSEC=1000
# prstlib config - ser all options in prstlib/Kconfig.
# CONFIG_PRSTLIB_LOG_LEVEL_DBG=y

View file

@ -17,8 +17,6 @@ static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME),
};
static const struct bt_data sd[] = {};
static bt_addr_le_t mac_addr;
static int set_user_defined_bt_addr(const char *addr_str) {
@ -55,12 +53,21 @@ int prst_ble_init() {
return 0;
}
#define PRST_MS_TO_INTERVAL(value_ms) ((uint16_t)(value_ms) / 0.625f)
int prst_ble_adv_start() {
// If BT_LE_ADV_NCONN_IDENTITY, this function will advertise with a static MAC
// address programmed in the chip. If BT_LE_ADV_NCONN, this function returns
// advertises with a random MAC each time.
return bt_le_adv_start(BT_LE_ADV_NCONN_IDENTITY, ad, ARRAY_SIZE(ad), sd,
ARRAY_SIZE(sd));
return bt_le_adv_start(
BT_LE_ADV_PARAM(
BT_LE_ADV_OPT_USE_IDENTITY,
PRST_MS_TO_INTERVAL(CONFIG_PRST_BLE_MIN_ADV_INTERVAL),
PRST_MS_TO_INTERVAL(CONFIG_PRST_BLE_MAX_ADV_INTERVAL),
/*_peer=*/NULL),
ad,
ARRAY_SIZE(ad),
// sd == NULL is required to set advertising to non-connectable. See
// https://github.com/zephyrproject-rtos/zephyr/blob/c0fcd35531611bbe35376c62a9e50744d6904940/subsys/bluetooth/host/adv.c#L860
/*sd=*/NULL,
/*sd_len=*/0);
}
int prst_ble_adv_stop() {

View file

@ -24,7 +24,10 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors,
#endif
// 4 bits for a small wrap-around counter for deduplicating messages on the
// receiver.
// out[3] = sensors->run_counter & 0x0f;
static uint8_t run_counter;
out[3] = run_counter++ & 0x0f;
out[4] = sensors->batt.adc_read.millivolts >> 8;
out[5] = sensors->batt.adc_read.millivolts & 0xff;
int16_t temp_centicelsius = 100 * sensors->shtc3.temp_c;
@ -101,33 +104,36 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors,
out[4] = temp_val & 0xff;
out[5] = temp_val >> 8;
// Humidity.
out[6] = 0x03;
// Value. Factor 0.01, over 100%.
uint16_t humi_val = 10000 * sensors->shtc3.rel_humi;
out[7] = humi_val & 0xff;
out[8] = humi_val >> 8;
out[6] = 0x2E;
// Value. Factor 1 over 100%.
uint8_t humi_val = 100 * sensors->shtc3.rel_humi + 0.5f;
out[7] = humi_val;
// Illuminance.
out[9] = 0x05;
out[8] = 0x05;
// Value. Factor of 0.01.
uint32_t lux_val = sensors->photo.brightness * 100;
out[10] = lux_val & 0xff;
out[11] = (lux_val >> 8) & 0xff;
out[12] = (lux_val >> 16) & 0xff;
out[9] = lux_val & 0xff;
out[10] = (lux_val >> 8) & 0xff;
out[11] = (lux_val >> 16) & 0xff;
// Battery voltage.
out[13] = 0x0c;
out[12] = 0x0c;
// Value. Factor of 0.001.
uint16_t batt_val = sensors->batt.adc_read.millivolts;
out[14] = batt_val & 0xff;
out[15] = batt_val >> 8;
out[13] = batt_val & 0xff;
out[14] = batt_val >> 8;
// Soil moisture.
out[16] = 0x14;
// Factor of 0.01, so we need to multiply our the value in 100% by 1/0.01 = 100.
uint16_t soil_val = 10000 * sensors->soil.percentage;
out[17] = soil_val & 0xff;
out[18] = soil_val >> 8;
out[15] = 0x2F;
// Factor of 1 over 100%
uint8_t soil_val = 100 * sensors->soil.percentage + 0.5f;
out[16] = soil_val;
// Battery percentage.
out[17] = 0x01;
// Value. Factor 1 over 100%
uint8_t batt_percentage_val = 100 * sensors->batt.percentage + 0.5f;
out[18] = batt_percentage_val;
#endif // Encoding protocols
LOG_HEXDUMP_DBG(out, out_len, "Encoded BLE adv: ");
return 0;
}
}

View file

@ -14,25 +14,29 @@
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);
int main(void) {
static int prst_init() {
RET_IF_ERR(prst_adc_init());
RET_IF_ERR(prst_led_init());
RET_IF_ERR(prst_button_init());
RET_IF_ERR(prst_ble_init());
return 0;
}
RET_IF_ERR(prst_led_flash(2));
static int prst_loop(prst_sensors_t *sensors) {
RET_IF_ERR(prst_sensors_read_all(sensors));
RET_IF_ERR(prst_ble_adv_set_data(sensors));
RET_IF_ERR(prst_ble_adv_start());
k_msleep(CONFIG_PRST_BLE_ADV_DURATION_MSEC);
RET_IF_ERR(prst_ble_adv_stop());
return 0;
}
int main(void) {
__ASSERT(!prst_init(), "Error in prst_init()");
prst_led_flash(2);
prst_sensors_t sensors;
while (true) {
RET_IF_ERR(prst_sensors_read_all(&sensors));
RET_IF_ERR(prst_ble_adv_set_data(&sensors));
RET_IF_ERR(prst_ble_adv_start());
k_sleep(K_SECONDS(CONFIG_PRST_BLE_ADV_DURATION_SEC));
RET_IF_ERR(prst_ble_adv_stop());
k_sleep(K_SECONDS(CONFIG_PRST_SLEEP_DURATION_SEC));
__ASSERT(!prst_loop(&sensors), "Error in prst_loop()");
k_msleep(CONFIG_PRST_SLEEP_DURATION_MSEC);
}
}

View file

@ -0,0 +1,2 @@
build
build_*

View file

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.20.0)
# Pull in the dts/ and boards/ from prstlib.
set(DTS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../prstlib)
set(BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../prstlib)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(input)
target_sources(app PRIVATE src/main.c)
add_subdirectory(../../prstlib prstlib)
target_include_directories(app PRIVATE ../../prstlib/include)
target_link_libraries(app PUBLIC prstlib)

View file

@ -0,0 +1,3 @@
source "Kconfig.zephyr"
rsource "../../prstlib/Kconfig"

View file

@ -0,0 +1,16 @@
{
"folders": [
{
"path": "."
},
{
"path": "../../prstlib"
}
],
"settings": {
"C_Cpp.autoAddFileAssociations": false,
"nrf-connect.applications": [
"${workspaceFolder}"
]
}
}

View file

@ -0,0 +1,16 @@
CONFIG_LOG=y
CONFIG_PWM=y
CONFIG_I2C=y
CONFIG_ADC=y
CONFIG_GPIO=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_SERIAL=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
CONFIG_PRSTLIB_LOG_LEVEL_DBG=y

View file

@ -0,0 +1,47 @@
#include <prstlib/adc.h>
#include <prstlib/button.h>
#include <prstlib/led.h>
#include <prstlib/macros.h>
#include <prstlib/sensors.h>
#include <prstlib/shtc3.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);
void button_pressed_cb(prst_button_t button, bool is_active) {
if (is_active) {
LOG_INF("Button pressed (debounced)");
prst_led_on();
} else {
LOG_INF("Button released (debounced)");
prst_led_off();
}
}
int main(void) {
RET_IF_ERR(prst_adc_init());
RET_IF_ERR(prst_led_init());
RET_IF_ERR(prst_button_init());
RET_IF_ERR(prst_led_flash(2));
prst_sensors_t sensors;
// Read the sensors just to ensure they'll be put to a low
// power mode afterward.
RET_IF_ERR(prst_sensors_read_all(&sensors));
int initial_button_state = prst_button_poll(PRST_BUTTON_SW1);
RET_CHECK(initial_button_state >= 0, "Failed to poll button");
LOG_INF("Initial button state: %s", initial_button_state ? "active" : "inactive");
RET_IF_ERR(prst_button_register_callback(button_pressed_cb));
RET_IF_ERR(prst_led_flash(2));
while (true) {
LOG_INF("Main loop.");
k_sleep(K_FOREVER);
}
return 0;
}

View file

@ -5,6 +5,4 @@ CONFIG_PWM_LOG_LEVEL_DBG=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_ADC=y
CONFIG_GPIO=y
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_USE_SEGGER_RTT=y

View file

@ -13,4 +13,4 @@
"${workspaceFolder}"
]
}
}
}

View file

@ -12,10 +12,16 @@ include_directories(src)
target_sources(app PRIVATE
src/main.c
src/debug_counters.c
src/double_reset_detector.c
src/factory_reset.c
src/flash_fs.c
src/prst_zb_attrs.c
src/prst_zb_soil_moisture_defs.c
src/restart_handler.c
src/watchdog.c
)
add_subdirectory(../../prstlib prstlib)
target_include_directories(app PRIVATE ../../prstlib/include)
target_link_libraries(app PUBLIC prstlib)
target_link_libraries(app PUBLIC prstlib)

View file

@ -3,11 +3,11 @@ rsource "../../prstlib/Kconfig"
config PRST_ZB_SLEEP_DURATION_SEC
int "Sleep duration between waking up and reading sensors in seconds."
default 600
default 60
config PRST_ZB_PARENT_POLL_INTERVAL_SEC
int "Interval for when b-parasite polls its parent for data in seconds."
default 60
default 10
config PRST_ZB_BUILD_DATE
string "Zigbee basic cluster build date attribute. Max 16 bytes."
@ -19,4 +19,26 @@ config PRST_ZB_MODEL_ID
config PRST_ZB_HARDWARE_VERSION
int "Zigbee basic cluster hardware version attribute. 1 byte."
default 2
default BOARD_REVISION_CODE
choice PRST_ZB_FACTORY_RESET_METHOD
bool "Factory reset method"
default PRST_ZB_FACTORY_RESET_VIA_SW1
config PRST_ZB_FACTORY_RESET_VIA_DOUBLE_RESET
bool "Double resetting factory resets the device."
config PRST_ZB_FACTORY_RESET_VIA_RESET_PIN
bool "Resetting via the reset pin will factory reset the device. Power cycling through battery replacement will not."
config PRST_ZB_FACTORY_RESET_VIA_SW1
bool "Resetting while pressing and holding SW1 for 5 seconds will factory reset the device. Only available on v2.0.0+ hardware revisions."
config PRST_ZB_FACTORY_RESET_DISABLED
bool "No factory reset procedure."
endchoice # PRST_ZB_FACTORY_RESET_METHOD
config PRST_ZB_RESTART_WATCHDOG_TIMEOUT_SEC
int "Duration after the device will restart the rejoin procedure if a network has not been successfully joined."
default 3600

View file

@ -16,15 +16,24 @@ These [clusters](https://en.wikipedia.org/wiki/Zigbee#Cluster_library) are defin
The sample will first boot and start looking for a Zigbee coordinator - in pairing mode. The onboard LED will be flashing once a second while in this mode. Once a suitable network is found, the LED will briefly flash 3 times and remain off.
### Factory Reset
Most Zigbee devices provide a physical button to "factory reset" it - causing it to forget its joined network and look for a new one.
A factory reset will make b-parasite forget its network pairing information and switch to pairing mode. There are two (mutually exclusive) methods to perform a factory reset, controlled by the `CONFIG_PRST_ZB_FACTORY_RESET_METHOD` config flag.
#### Factory Reset Method 1 (default) - Double reset
Resetting b-parasite twice in the timestamp of 5 seconds will perform a factory reset. With this method, both shorting the `RST` pin to ground and removing-inserting the battery counts as a reset.
For better results, wait > 1 and < 5 seconds second between the resets. The LED will flash a total of 8 times to indicate it worked.
#### Factory Reset Method 2 - Reset Pin
In this method, there's a distinction between two reset modes.
b-parasite has no physical buttons, and the implemented work around is to distinguish between two *reset modes*:
#### Power up mode
The device enters this mode when it is powered. For example, swapping an old battery or connecting to eternal power. This is the "usual" reset mode, and joined networks will be remembered.
#### Reset pin mode
If the device's RESET pin is briefly grounded, the device will effectively be **factory reset**. The device will leave its previous network and start looking for a new one.
While it works, this method can be finicky - an accidental pin reset will perform an unwanted factory reset.
## Configs
Available options in `Kconfig`. Notable options:
* `CONFIG_PRST_ZB_SLEEP_DURATION_SEC`: amount of time (in seconds) the device sleeps between reading all sensors and updating its clusters

View file

@ -5,8 +5,8 @@ CONFIG_I2C=y
CONFIG_ADC=y
CONFIG_GPIO=y
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
@ -29,15 +29,44 @@ CONFIG_CRYPTO_NRF_ECB=y
CONFIG_CRYPTO_INIT_PRIORITY=80
# Networking
CONFIG_NET_IPV6=n
CONFIG_NET_IPV6_MLD=n
CONFIG_NET_IPV6_NBR_CACHE=n
CONFIG_NET_IPV6_RA_RDNSS=n
CONFIG_NET_IP_ADDR_CHECK=n
CONFIG_NET_UDP=n
##
## ZigBee Channel Selection
##
# Get Zigbee to scan every channel.
CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y
# By default only scans channel 11 (ZigBee2MQTT default) and 15 (ZHA default).
# Comment to scan all channels - this will make pairing consume more energy.
# CONFIG_ZIGBEE_CHANNEL_MASK=0x8800
# Uncomment to set a specific channel - this will make pairing more energy efficient.
# CONFIG_ZIGBEE_CHANNEL=11
# Enable API for powering down unused RAM parts.
# https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/nrf/ug_zigbee_configuring.html#power-saving-during-sleep
CONFIG_RAM_POWER_DOWN_LIBRARY=y
# LittleFS.
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_LITTLEFS=y
CONFIG_WATCHDOG=y
CONFIG_HWINFO=y
CONFIG_ASSERT=y
# Uncomment for debug log level.
# CONFIG_LOG_DEFAULT_LEVEL=4
# Factory reset method selection. Only hardware revision 2.0.0+ has button SW1. Earlier
# revisions must select a different method. See Kconfig for options.
# CONFIG_PRST_ZB_FACTORY_RESET_VIA_SW1=y

View file

@ -0,0 +1,106 @@
#include "debug_counters.h"
#include <prstlib/macros.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(debug_counters, CONFIG_LOG_DEFAULT_LEVEL);
static const char kDebugCountersDir[] = "/lfs/debug_counters";
#define PRST_MAX_COUNTER_NAME_LENGTH 64
#define PRST_MAX_FILE_NAME_LENGTH (sizeof(kDebugCountersDir) + 1 + PRST_MAX_COUNTER_NAME_LENGTH)
static int mk_filename(const char* counter_name, char* buff, size_t buff_size) {
RET_CHECK(strlen(counter_name) <= PRST_MAX_COUNTER_NAME_LENGTH, "Counter name too long");
strcpy(buff, kDebugCountersDir);
strcat(buff, "/");
strcat(buff, counter_name);
return 0;
}
static int read_counter_file(struct fs_file_t* file, prst_debug_counter_t* value) {
int n_read = fs_read(file, value, sizeof(prst_debug_counter_t));
if (n_read != sizeof(prst_debug_counter_t)) {
LOG_WRN("fs_read returned %d, expected %d, assuming first access", n_read, sizeof(prst_debug_counter_t));
*value = 0;
}
return 0;
}
int prst_debug_counters_init() {
struct fs_dirent entry;
int err = fs_stat(kDebugCountersDir, &entry);
if (err == 0) {
LOG_DBG("Directory %s already exists", kDebugCountersDir);
return 0;
} else if (err == -ENOENT) {
LOG_DBG("Creating directory %s", kDebugCountersDir);
return fs_mkdir(kDebugCountersDir);
}
LOG_ERR("Unexpected error in fs_stat for %s: %d", kDebugCountersDir, err);
return err;
}
int prst_debug_counters_increment(const char* counter_name) {
char filename[PRST_MAX_FILE_NAME_LENGTH];
RET_IF_ERR(mk_filename(counter_name, filename, sizeof(filename)));
LOG_DBG("Incrementing counter %s", filename);
// Open the file.
struct fs_file_t file;
fs_file_t_init(&file);
RET_IF_ERR(fs_open(&file, filename, FS_O_CREATE | FS_O_RDWR));
// Read the current value.
prst_debug_counter_t value;
RET_IF_ERR(read_counter_file(&file, &value));
// Increment the value.
value++;
// Write back to file.
RET_CHECK(fs_seek(&file, 0, SEEK_SET) == 0, "Unable to seek");
ssize_t written = fs_write(&file, &value, sizeof(value));
if (written != sizeof(value)) {
LOG_ERR("fs_write returned %d, expected %d", written, sizeof(value));
}
RET_IF_ERR(fs_sync(&file));
return fs_close(&file);
}
int prst_debug_counters_get(const char* counter_name, prst_debug_counter_t* value) {
char filename[PRST_MAX_FILE_NAME_LENGTH];
RET_IF_ERR(mk_filename(counter_name, filename, sizeof(filename)));
LOG_DBG("Getting counter %s", filename);
// Open the file.
struct fs_file_t file;
fs_file_t_init(&file);
RET_IF_ERR(fs_open(&file, filename, FS_O_CREATE | FS_O_READ));
// Read the current value.
RET_IF_ERR(read_counter_file(&file, value));
return fs_close(&file);
}
int prst_debug_counters_get_all(prst_debug_counters_callback_t callback) {
LOG_DBG("Getting all counters from %s", kDebugCountersDir);
struct fs_dir_t dirp;
fs_dir_t_init(&dirp);
static struct fs_dirent entry;
RET_IF_ERR(fs_opendir(&dirp, kDebugCountersDir));
prst_debug_counter_t value;
for (;;) {
RET_IF_ERR(fs_readdir(&dirp, &entry));
// End of directory;
if (entry.name[0] == 0) {
break;
}
LOG_DBG("Found %s", entry.name);
prst_debug_counters_get(entry.name, &value);
callback(entry.name, value);
}
return fs_closedir(&dirp);
}

View file

@ -0,0 +1,18 @@
#ifndef _PRST_DEBUG_COUNTERS_H_
#define _PRST_DEBUG_COUNTERS_H_
#include <stdint.h>
typedef uint32_t prst_debug_counter_t;
typedef void (*prst_debug_counters_callback_t)(const char* counter_name, prst_debug_counter_t value);
int prst_debug_counters_init();
int prst_debug_counters_increment(const char* counter_name);
int prst_debug_counters_get(const char* counter_name, prst_debug_counter_t* value);
int prst_debug_counters_get_all(prst_debug_counters_callback_t callback);
#endif // _PRST_DEBUG_COUNTERS_H_

View file

@ -0,0 +1,66 @@
#include "double_reset_detector.h"
#include <prstlib/macros.h>
#include <string.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include "debug_counters.h"
LOG_MODULE_REGISTER(double_reset_detector, CONFIG_LOG_DEFAULT_LEVEL);
static const char *flag_filename = "/lfs/reset_flag";
static const char flag_prefix[] = "prst-rst-count";
static struct fs_file_t flag_file;
static int erase_flag() {
return fs_unlink(flag_filename);
}
void erase_flag_callback(struct k_work *work) {
LOG_INF("Erasing double reset flag.");
if (erase_flag() != 0) {
LOG_ERR("Error deleting flag");
}
}
K_WORK_DELAYABLE_DEFINE(erase_flag_work, erase_flag_callback);
int prst_detect_double_reset(prst_double_reset_callback_t on_double_reset) {
fs_file_t_init(&flag_file);
RET_IF_ERR(fs_open(&flag_file, flag_filename, FS_O_CREATE | FS_O_RDWR));
char buff[sizeof(flag_prefix)];
RET_CHECK(fs_read(&flag_file, buff, sizeof(buff)) >= 0, "Unable to read file");
// Consider it a double reset if the flag is present in the FS.
if (strcmp(buff, flag_prefix) == 0) {
RET_IF_ERR(fs_close(&flag_file));
RET_IF_ERR(erase_flag());
prst_debug_counters_increment("double_reset");
return on_double_reset();
}
// Rewind file.
RET_IF_ERR(fs_seek(&flag_file, 0, SEEK_SET));
// Write the flag and erase it after some time.
ssize_t written = fs_write(&flag_file, flag_prefix, sizeof(flag_prefix));
if (written != sizeof(flag_prefix)) {
LOG_ERR("fs_write returned %d, expected %d", written, sizeof(flag_prefix));
return -1;
}
RET_IF_ERR(fs_close(&flag_file));
// Schedule the erasure of the flag after some time.
RET_CHECK(k_work_schedule(&erase_flag_work, K_SECONDS(5)) == 1,
"Work not scheduled");
return 0;
}

View file

@ -0,0 +1,8 @@
#ifndef _PRST_ZB_DOUBLE_RESET_DETECTOR_H_
#define _PRST_ZB_DOUBLE_RESET_DETECTOR_H_
typedef int (*prst_double_reset_callback_t)();
int prst_detect_double_reset(prst_double_reset_callback_t on_double_reset);
#endif // _PRST_ZB_DOUBLE_RESET_DETECTOR_H_

View file

@ -0,0 +1,75 @@
#include "factory_reset.h"
#include <hal/nrf_power.h>
#include <prstlib/button.h>
#include <prstlib/led.h>
#include <zephyr/logging/log.h>
#include <zigbee/zigbee_app_utils.h>
#include "double_reset_detector.h"
LOG_MODULE_REGISTER(factory_reset, CONFIG_LOG_DEFAULT_LEVEL);
static int factory_reset() {
LOG_WRN("Factory resetting device");
zb_bdb_reset_via_local_action(/*param=*/0);
return 0;
}
#if CONFIG_PRST_ZB_FACTORY_RESET_VIA_DOUBLE_RESET
int double_reset_handler() {
LOG_WRN("Called double reset handler");
prst_led_flash(5);
return factory_reset();
}
#endif // CONFIG_PRST_ZB_FACTORY_RESET_VIA_DOUBLE_RESET
#if CONFIG_PRST_ZB_FACTORY_RESET_VIA_RESET_PIN
static int factory_reset_if_reset_via_reset_pin() {
uint32_t reset_reason = nrf_power_resetreas_get(NRF_POWER);
// If we're resetting via the RESET pin (e.g.: reset pin shorting, firmware flashing).
if (reset_reason & 0x1) {
LOG_WRN("Manual reset / re-flashing detected - erasing pairing info");
return factory_reset();
} else { // It's a power-on cycle (e.g.: swapping battery, first boot).
LOG_INF("Power-on cycle - keeping pairing info");
}
return 0;
}
#endif // CONFIG_PRST_ZB_FACTORY_RESET_VIA_RESET_PIN
#if CONFIG_PRST_ZB_FACTORY_RESET_VIA_SW1
static void timer_do_reset(zb_uint8_t unused_param) {
LOG_WRN("SW1 button was pressed for 5 seconds, factory resetting device");
prst_led_flash(/*times=*/5);
factory_reset();
}
static void sw1_factory_reset_check_timer_cb(struct k_timer *timer_id) {
if (!prst_button_poll(PRST_BUTTON_SW1)) {
LOG_DBG("SW1 button was released, will not factory reset device");
return;
}
ZB_SCHEDULE_APP_CALLBACK(timer_do_reset, /*param=*/0);
}
K_TIMER_DEFINE(sw1_factory_reset_check_timer, sw1_factory_reset_check_timer_cb, NULL);
#endif
int prst_zb_factory_reset_check() {
#if CONFIG_PRST_ZB_FACTORY_RESET_VIA_DOUBLE_RESET
return prst_detect_double_reset(double_reset_handler);
#elif CONFIG_PRST_ZB_FACTORY_RESET_VIA_RESET_PIN
return factory_reset_if_reset_via_reset_pin();
#elif CONFIG_PRST_ZB_FACTORY_RESET_VIA_SW1
if (prst_button_poll(PRST_BUTTON_SW1)) {
LOG_DBG("SW1 pressed. Scheduling timer");
k_timer_start(&sw1_factory_reset_check_timer, K_SECONDS(5), K_NO_WAIT);
}
return 0;
#elif CONFIG_PRST_ZB_FACTORY_RESET_DISABLED
return 0;
#else
#error "No factory reset method selected -- explicitly select CONFIG_PRST_ZB_FACTORY_RESET_DISABLED=y to disable it"
#endif // CONFIG_PRST_ZB_FACTORY_RESET_VIA_RESET_PIN
}

View file

@ -0,0 +1,6 @@
#ifndef _PRST_ZB_FACTORY_RESET_H_
#define _PRST_ZB_FACTORY_RESET_H_
int prst_zb_factory_reset_check();
#endif // _PRST_ZB_FACTORY_RESET_H_

View file

@ -0,0 +1,26 @@
#include "flash_fs.h"
#include <prstlib/macros.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(flash_fs, CONFIG_LOG_DEFAULT_LEVEL);
FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage);
static struct fs_mount_t lfs_storage_mnt = {
.type = FS_LITTLEFS,
.fs_data = &storage,
.storage_dev = (void *)FIXED_PARTITION_ID(storage_partition),
.mnt_point = "/lfs",
};
int prst_flash_fs_init() {
// TODO: if booting for the first time after a full flash erase, fs_mount will
// complain (via a LOG_ERR) and then automatically format the flash. It all works,
// but avoiding a scary red message would be ideal. Maybe somehow check if it's
// formatted before mounting?
RET_IF_ERR(fs_mount(&lfs_storage_mnt));
return 0;
}

View file

@ -0,0 +1,9 @@
#ifndef _PRST_FLASH_FS_H_
#define _PRST_FLASH_FS_H_
#include <stddef.h>
// Initializes and mounts littlefs.
int prst_flash_fs_init();
#endif // _PRST_FLASH_FS_H_

View file

@ -1,5 +1,3 @@
#include <dk_buttons_and_leds.h>
#include <hal/nrf_power.h>
#include <math.h>
#include <prstlib/adc.h>
#include <prstlib/button.h>
@ -12,16 +10,20 @@
#include <zboss_api.h>
#include <zboss_api_addons.h>
#include <zcl/zb_zcl_power_config.h>
#include <zephyr/drivers/hwinfo.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zigbee/zigbee_app_utils.h>
#include <zigbee/zigbee_error_handler.h>
#include "debug_counters.h"
#include "factory_reset.h"
#include "flash_fs.h"
#include "prst_zb_attrs.h"
#include "prst_zb_endpoint_defs.h"
#include "prst_zb_soil_moisture_defs.h"
#define FACTORY_RESET_BUTTON DK_BTN4_MSK
#include "restart_handler.h"
#include "watchdog.h"
LOG_MODULE_REGISTER(app, CONFIG_LOG_DEFAULT_LEVEL);
@ -29,17 +31,8 @@ static struct zb_device_ctx dev_ctx;
static prst_sensors_t sensors;
static void maybe_erase_pairing_info(struct k_timer *timer) {
uint32_t reset_reason = nrf_power_resetreas_get(NRF_POWER);
// If we're resetting via the RESET pin (e.g.: reset pin shorting, firmware flashing).
if (reset_reason & 0x1) {
LOG_WRN("Manual reset / re-flashing detected - erasing pairing info");
// TODO: consider zb_bdb_reset_via_local_action(/*param=*/0);
zigbee_erase_persistent_storage(/*erase=*/true);
} else { // It's a power-on cycle (e.g.: swapping battery, first boot).
LOG_INF("Power-on cycle - keeping pairing info");
}
}
static bool joining_signal_received = false;
static bool stack_initialised = false;
static void led_flashing_cb(struct k_timer *timer) {
prst_led_toggle();
@ -82,8 +75,8 @@ ZB_ZCL_DECLARE_REL_HUMIDITY_MEASUREMENT_ATTRIB_LIST(
ZB_ZCL_DECLARE_POWER_CONFIG_BATTERY_ATTRIB_LIST_EXT(
batt_attr_list,
&dev_ctx.batt_attrs.voltage,
/*battery_size=*/ZB_ZCL_POWER_CONFIG_BATTERY_SIZE_OTHER,
/*battery_quantity=*/1,
/*battery_size=*/&dev_ctx.batt_attrs.size,
/*battery_quantity=*/&dev_ctx.batt_attrs.quantity,
/*battery_rated_voltage=*/NULL,
/*battery_alarm_mask=*/NULL,
/*battery_voltage_min_threshold=*/NULL,
@ -126,43 +119,33 @@ ZBOSS_DECLARE_DEVICE_CTX_1_EP(
app_template_ctx,
app_template_ep);
void zboss_signal_handler(zb_bufid_t bufid) {
// See zigbee_default_signal_handler() for all available signals.
zb_zdo_app_signal_type_t sig = zb_get_app_signal(bufid, /*sg_p=*/NULL);
zb_ret_t status = ZB_GET_APP_SIGNAL_STATUS(bufid);
switch (sig) {
case ZB_BDB_SIGNAL_STEERING: // New network.
case ZB_BDB_SIGNAL_DEVICE_REBOOT: { // Previously joined network.
LOG_DBG("Steering complete. Status: %d", status);
prst_led_flash(/*times=*/3);
if (status == RET_OK) {
k_timer_stop(&led_flashing_timer);
prst_led_off();
}
break;
}
case ZB_ZDO_SIGNAL_SKIP_STARTUP:
case ZB_ZDO_SIGNAL_LEAVE: {
LOG_DBG("Will restart flashing");
k_timer_start(&led_flashing_timer, K_NO_WAIT, K_SECONDS(1));
break;
}
}
ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid));
if (bufid) {
zb_buf_free(bufid);
}
void identify_cb(zb_bufid_t bufid) {
LOG_DBG("Remote identify command called");
prst_led_flash(15);
}
void update_sensors_cb(zb_uint8_t arg) {
LOG_INF("Updating sensors");
LOG_DBG("Updating sensors");
if (prst_sensors_read_all(&sensors)) {
LOG_ERR("Unable to read sensors");
return;
// Reschedule the same callback.
zb_ret_t ret = ZB_SCHEDULE_APP_ALARM(
update_sensors_cb,
/*param=*/0,
ZB_MILLISECONDS_TO_BEACON_INTERVAL(1000 * CONFIG_PRST_ZB_SLEEP_DURATION_SEC));
if (ret != RET_OK) {
prst_debug_counters_increment("sens_cb_schedule_err");
__ASSERT(false, "Unable to schedule sensor update callback");
}
__ASSERT(!prst_watchdog_feed(), "Failed to feed watchdog");
prst_debug_counters_increment("sensors_read_before");
if (prst_sensors_read_all(&sensors)) {
prst_debug_counters_increment("sensors_read_error");
__ASSERT(false, "Unable to read sensors");
}
prst_debug_counters_increment("sensors_read_after");
// Battery voltage in units of 100 mV.
uint8_t batt_voltage = sensors.batt.adc_read.millivolts / 100;
prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_POWER_CONFIG,
@ -198,35 +181,151 @@ void update_sensors_cb(zb_uint8_t arg) {
prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT,
ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID,
&log_lux);
}
ZB_SCHEDULE_APP_ALARM(update_sensors_cb,
/*param=*/0,
ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_SLEEP_DURATION_SEC);
void zboss_signal_handler(zb_bufid_t bufid) {
// See zigbee_default_signal_handler() for all available signals.
zb_zdo_app_signal_hdr_t *sig_hndler = NULL;
zb_zdo_app_signal_type_t sig = zb_get_app_signal(bufid, /*sg_p=*/&sig_hndler);
zb_ret_t status = ZB_GET_APP_SIGNAL_STATUS(bufid);
switch (sig) {
case ZB_BDB_SIGNAL_STEERING: // New network.
case ZB_BDB_SIGNAL_DEVICE_REBOOT: { // Previously joined network.
LOG_DBG("Steering complete. Status: %d", status);
if (status == RET_OK) {
LOG_DBG("Steering successful. Status: %d", status);
k_timer_stop(&led_flashing_timer);
prst_led_off();
prst_restart_watchdog_stop();
// Update the long polling parent interval - needs to be done after joining.
zb_zdo_pim_set_long_poll_interval(1000 * CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC);
} else {
LOG_DBG("Steering failed. Status: %d", status);
prst_restart_watchdog_start();
// Power saving.
k_timer_stop(&led_flashing_timer);
prst_led_off();
}
joining_signal_received = true;
break;
}
case ZB_BDB_SIGNAL_DEVICE_FIRST_START:
joining_signal_received = true;
break;
case ZB_ZDO_SIGNAL_LEAVE:
if (status == RET_OK) {
k_timer_start(&led_flashing_timer, K_NO_WAIT, K_SECONDS(1));
zb_zdo_signal_leave_params_t *leave_params = ZB_ZDO_SIGNAL_GET_PARAMS(sig_hndler, zb_zdo_signal_leave_params_t);
LOG_DBG("Network left (leave type: %d)", leave_params->leave_type);
/* Set joining_signal_received to false so broken rejoin procedure can be detected correctly. */
if (leave_params->leave_type == ZB_NWK_LEAVE_TYPE_REJOIN) {
joining_signal_received = false;
}
}
break;
case ZB_ZDO_SIGNAL_SKIP_STARTUP: {
stack_initialised = true;
LOG_DBG("Started zigbee stack and waiting for connection to network.");
k_timer_start(&led_flashing_timer, K_NO_WAIT, K_SECONDS(1));
// Kick off main sensor update task.
ZB_ERROR_CHECK(ZB_SCHEDULE_APP_ALARM(update_sensors_cb,
/*param=*/0,
ZB_MILLISECONDS_TO_BEACON_INTERVAL(1000)));
__ASSERT_NO_MSG(!prst_watchdog_start());
break;
}
case ZB_NLME_STATUS_INDICATION: {
zb_zdo_signal_nlme_status_indication_params_t *nlme_status_ind =
ZB_ZDO_SIGNAL_GET_PARAMS(sig_hndler, zb_zdo_signal_nlme_status_indication_params_t);
if (nlme_status_ind->nlme_status.status == ZB_NWK_COMMAND_STATUS_PARENT_LINK_FAILURE) {
/* Check for broken rejoin procedure and restart the device to recover.
This implements Nordic's suggested workaround for errata KRKNWK-12017, which effects
the recent nRF Connect SDK (v1.8.0 - v2.3.0 at time of writing).
For details see: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/known_issues.html?v=v2-3-0
*/
if (stack_initialised && !joining_signal_received) {
zb_reset(0);
}
}
break;
}
}
ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid));
if (bufid) {
zb_buf_free(bufid);
}
}
void dump_counter(const char *counter_name, prst_debug_counter_t value) {
LOG_INF("- %s: %d", counter_name, value);
}
int log_reset_reason_counter() {
uint32_t cause;
const char *reset_counter_str = "reset_cause_unknown";
RET_IF_ERR(hwinfo_get_reset_cause(&cause));
RET_IF_ERR(hwinfo_clear_reset_cause());
if (cause & RESET_PIN) {
reset_counter_str = "reset_cause_pin";
} else if (cause & RESET_SOFTWARE) {
// Includes fatal errors from __ASSERT, ZB_ERROR_CHECK and friends.
reset_counter_str = "reset_cause_software";
} else if (cause & RESET_BROWNOUT) {
reset_counter_str = "reset_cause_brownout";
} else if (cause & RESET_POR) {
reset_counter_str = "reset_cause_power_on";
} else if (cause & RESET_WATCHDOG) {
reset_counter_str = "reset_cause_watchdog";
} else if (cause & RESET_DEBUG) {
reset_counter_str = "reset_cause_debug";
} else if (cause & RESET_LOW_POWER_WAKE) {
reset_counter_str = "reset_cause_low_power";
} else if (cause & RESET_CPU_LOCKUP) {
reset_counter_str = "reset_cause_cpu_lockup";
} else if (cause & RESET_HARDWARE) {
reset_counter_str = "reset_cause_hardware";
} else if (cause & RESET_USER) {
reset_counter_str = "reset_cause_user";
}
return prst_debug_counters_increment(reset_counter_str);
}
int main(void) {
RET_IF_ERR(prst_adc_init());
RET_IF_ERR(prst_led_init());
RET_IF_ERR(prst_button_init());
RET_IF_ERR(prst_flash_fs_init());
RET_IF_ERR(prst_debug_counters_init());
maybe_erase_pairing_info(NULL);
// Initialize sensors - quickly put them into low power mode.
__ASSERT_NO_MSG(!prst_sensors_read_all(&sensors));
register_factory_reset_button(FACTORY_RESET_BUTTON);
prst_debug_counters_increment("boot");
log_reset_reason_counter();
LOG_INF("Dumping debug counters:");
prst_debug_counters_get_all(dump_counter);
__ASSERT_NO_MSG(!prst_zb_factory_reset_check());
prst_zb_attrs_init(&dev_ctx);
ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx);
update_sensors_cb(/*arg=*/0);
prst_led_flash(2);
k_msleep(100);
zb_zdo_pim_set_long_poll_interval(
ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC);
power_down_unused_ram();
ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(PRST_ZIGBEE_ENDPOINT, identify_cb);
RET_IF_ERR(prst_led_flash(2));
zigbee_enable();
zigbee_configure_sleepy_behavior(/*enable=*/true);
power_down_unused_ram();
zigbee_enable();
prst_debug_counters_increment("main_finish");
return 0;
}

View file

@ -24,6 +24,9 @@ void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) {
dev_ctx->basic_attr.hw_version = CONFIG_PRST_ZB_HARDWARE_VERSION;
dev_ctx->batt_attrs.quantity = 1;
dev_ctx->batt_attrs.size = ZB_ZCL_POWER_CONFIG_BATTERY_SIZE_OTHER;
dev_ctx->identify_attr.identify_time =
ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE;
}

View file

@ -19,6 +19,10 @@ typedef struct {
zb_uint8_t voltage;
// Units of 0.5%. 0x00 (0%) - 0xc8 (100%) (optional, reportable).
zb_uint8_t percentage;
// Whole number of battery cells used to power device
zb_uint8_t quantity;
// Enumeration of battery size
enum zb_zcl_power_config_battery_size_e size;
} prst_batt_attrs_t;
// Soil moisture cluster.

View file

@ -0,0 +1,34 @@
#include "restart_handler.h"
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zigbee/zigbee_app_utils.h>
#include "debug_counters.h"
LOG_MODULE_REGISTER(restart_handler, CONFIG_LOG_DEFAULT_LEVEL);
void callback_work_handler(struct k_work *work) {
LOG_INF("Running restart callback_work_handler.");
prst_debug_counters_increment("steering_watchdog_restart");
// If the device is not commissioned, the rejoin procedure is started.
user_input_indicate();
}
K_WORK_DEFINE(callback_work, callback_work_handler);
// Runs in an ISR context. We offload the actual work to a workqueue.
static void restart_network_steering_cb(struct k_timer *timer) {
LOG_INF("Triggered restart_network_steering_cb. Offloading work.");
k_work_submit(&callback_work);
}
K_TIMER_DEFINE(restart_timer, restart_network_steering_cb, NULL);
void prst_restart_watchdog_start() {
k_timer_start(&restart_timer, K_SECONDS(CONFIG_PRST_ZB_RESTART_WATCHDOG_TIMEOUT_SEC), K_MSEC(0));
}
void prst_restart_watchdog_stop() {
k_timer_stop(&restart_timer);
}

View file

@ -0,0 +1,7 @@
#ifndef _PRST_ZB_RESTART_HANDLER_H_
#define _PRST_ZB_RESTART_HANDLER_H_
void prst_restart_watchdog_start();
void prst_restart_watchdog_stop();
#endif // _PRST_ZB_RESTART_HANDLER_H_

View file

@ -0,0 +1,47 @@
#include "watchdog.h"
#include <prstlib/macros.h>
#include <zephyr/device.h>
#include <zephyr/drivers/watchdog.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#define PRST_ZB_WATCHDOG_TIMEOUT_SEC (2 * CONFIG_PRST_ZB_SLEEP_DURATION_SEC)
LOG_MODULE_REGISTER(watchdog, CONFIG_LOG_DEFAULT_LEVEL);
typedef struct {
const struct device *const wdt;
int wtd_channel_id;
} wtd_data_t;
static wtd_data_t wtd_data = {
.wdt = DEVICE_DT_GET(DT_NODELABEL(wdt)),
};
int prst_watchdog_start() {
static const struct wdt_timeout_cfg wdt_settings = {
.window = {
.min = 0,
.max = PRST_ZB_WATCHDOG_TIMEOUT_SEC * MSEC_PER_SEC,
},
// NULL callback means use the default, which is the system reset.
.callback = NULL,
.flags = WDT_FLAG_RESET_SOC};
RET_IF_ERR(!device_is_ready(wtd_data.wdt));
// Install timeout.
wtd_data.wtd_channel_id = wdt_install_timeout(wtd_data.wdt, &wdt_settings);
RET_CHECK(wtd_data.wtd_channel_id >= 0, "Failed to install watchdog timeout.");
// Start watchdog.
RET_IF_ERR(wdt_setup(wtd_data.wdt, WDT_OPT_PAUSE_HALTED_BY_DBG));
return 0;
}
int prst_watchdog_feed() {
RET_IF_ERR(wdt_feed(wtd_data.wdt, wtd_data.wtd_channel_id));
return 0;
}

View file

@ -0,0 +1,8 @@
#ifndef _PRST_ZB_WATCHDOG_H_
#define _PRST_ZB_WATCHDOG_H_
int prst_watchdog_start();
int prst_watchdog_feed();
#endif // _PRST_ZB_WATCHDOG_H_

BIN
img/resized/b-parasite-2.0.0.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 KiB

View file

@ -1,6 +1,7 @@
(fp_lib_table
(lib (name kicad)(type KiCad)(uri ${KIPRJMOD}/lib/kicad)(options "")(descr ""))
(lib (name nrfmicro)(type KiCad)(uri ${KIPRJMOD}/lib/nrfmicro)(options "")(descr ""))
(lib (name OSHW-logo)(type Legacy)(uri ${KIPRJMOD}/lib/oshw/OSHW-logo.mod)(options "")(descr ""))
(lib (name snapeda)(type KiCad)(uri ${KIPRJMOD}/lib/snapeda)(options "")(descr ""))
(lib (name "kicad")(type "KiCad")(uri "${KIPRJMOD}/lib/kicad")(options "")(descr ""))
(lib (name "nrfmicro")(type "KiCad")(uri "${KIPRJMOD}/lib/nrfmicro")(options "")(descr ""))
(lib (name "OSHW-logo")(type "Legacy")(uri "${KIPRJMOD}/lib/oshw/OSHW-logo.mod")(options "")(descr ""))
(lib (name "snapeda")(type "KiCad")(uri "${KIPRJMOD}/lib/snapeda")(options "")(descr ""))
(lib (name "b-parasite")(type "KiCad")(uri "${KIPRJMOD}/lib/b-parasite")(options "")(descr ""))
)

File diff suppressed because it is too large Load diff

View file

@ -1,79 +1,40 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.2-1)-1*
G04 #@! TF.CreationDate,2021-10-09T10:13:21+02:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,1.2.0*
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.1-0*
G04 #@! TF.CreationDate,2023-03-19T14:40:06+01:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,2.0.0*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Bot*
G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (5.1.2-1)-1) date 2021-10-09 10:13:21*
G04 Created by KiCad (PCBNEW 7.0.1-0) date 2023-03-19 14:40:06*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.100000*%
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10RoundRect,0.051000X-2.550000X2.550000X-2.550000X-2.550000X2.550000X-2.550000X2.550000X2.550000X0*%
%ADD11C,17.902000*%
G04 APERTURE END LIST*
D10*
G36*
X69701000Y-70301000D02*
G01*
X64499000Y-70301000D01*
X64499000Y-65099000D01*
X69701000Y-65099000D01*
X69701000Y-70301000D01*
X69701000Y-70301000D01*
G37*
G36*
X69710909Y-46292981D02*
G01*
X71339887Y-46967726D01*
X71339888Y-46967727D01*
X72805930Y-47947304D01*
X74052696Y-49194070D01*
X74707228Y-50173648D01*
X75032274Y-50660113D01*
X75707019Y-52289091D01*
X76051000Y-54018402D01*
X76051000Y-55781598D01*
X75707019Y-57510909D01*
X75032274Y-59139887D01*
X75032273Y-59139888D01*
X74052696Y-60605930D01*
X72805930Y-61852696D01*
X71826352Y-62507228D01*
X71339887Y-62832274D01*
X69710909Y-63507019D01*
X67981598Y-63851000D01*
X66218402Y-63851000D01*
X64489091Y-63507019D01*
X62860113Y-62832274D01*
X62373648Y-62507228D01*
X61394070Y-61852696D01*
X60147304Y-60605930D01*
X59167727Y-59139888D01*
X59167726Y-59139887D01*
X58492981Y-57510909D01*
X58149000Y-55781598D01*
X58149000Y-54018402D01*
X58492981Y-52289091D01*
X59167726Y-50660113D01*
X59492772Y-50173648D01*
X60147304Y-49194070D01*
X61394070Y-47947304D01*
X62860112Y-46967727D01*
X62860113Y-46967726D01*
X64489091Y-46292981D01*
X66218402Y-45949000D01*
X67981598Y-45949000D01*
X69710909Y-46292981D01*
X69710909Y-46292981D01*
G37*
G36*
X69701000Y-44701000D02*
G01*
X64499000Y-44701000D01*
X64499000Y-39499000D01*
X69701000Y-39499000D01*
X69701000Y-44701000D01*
X69701000Y-44701000D01*
G37*
X67100000Y-42355000D03*
X67100000Y-67955000D03*
D11*
X67100000Y-55155000D03*
M02*

View file

@ -1,18 +1,19 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.2-1)-1*
G04 #@! TF.CreationDate,2021-10-09T10:13:21+02:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,1.2.0*
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.1-0*
G04 #@! TF.CreationDate,2023-03-19T14:40:06+01:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,2.0.0*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (5.1.2-1)-1) date 2021-10-09 10:13:21*
G04 Created by KiCad (PCBNEW 7.0.1-0) date 2023-03-19 14:40:06*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10R,5.100000X5.100000*%
G04 APERTURE END LIST*
D10*
X67100000Y-42100000D03*
X67100000Y-67700000D03*
X67100000Y-42355000D03*
X67100000Y-67955000D03*
M02*

View file

@ -1,74 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.2-1)-1*
G04 #@! TF.CreationDate,2021-10-09T10:13:21+02:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,1.2.0*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (5.1.2-1)-1) date 2021-10-09 10:13:21*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
%ADD10C,0.120000*%
G04 APERTURE END LIST*
D10*
X58000000Y-99000000D02*
X78000000Y-99000000D01*
X64350000Y-70450000D02*
X64350000Y-65650000D01*
X69850000Y-70450000D02*
X64350000Y-70450000D01*
X69850000Y-65650000D02*
X69850000Y-70450000D01*
X69850000Y-39350000D02*
X69850000Y-44150000D01*
X64350000Y-39350000D02*
X69850000Y-39350000D01*
X64350000Y-44150000D02*
X64350000Y-39350000D01*
X57600000Y-65450000D02*
X57600000Y-58750000D01*
X57600000Y-44350000D02*
X57600000Y-51050000D01*
X77950000Y-58850000D02*
X73150000Y-65650000D01*
X77950000Y-50950000D02*
X77950000Y-58850000D01*
X73150000Y-44100000D02*
X77950000Y-50950000D01*
X57598536Y-51053615D02*
G75*
G03X57600000Y-58750000I9501464J-3846385D01*
G01*
X76750000Y-45200000D02*
X76783333Y-45300000D01*
X76816666Y-45333333D01*
X76883333Y-45366666D01*
X76983333Y-45366666D01*
X77050000Y-45333333D01*
X77083333Y-45300000D01*
X77116666Y-45233333D01*
X77116666Y-44966666D01*
X76416666Y-44966666D01*
X76416666Y-45200000D01*
X76450000Y-45266666D01*
X76483333Y-45300000D01*
X76550000Y-45333333D01*
X76616666Y-45333333D01*
X76683333Y-45300000D01*
X76716666Y-45266666D01*
X76750000Y-45200000D01*
X76750000Y-44966666D01*
X76416666Y-45566666D02*
X76416666Y-45966666D01*
X77116666Y-45766666D02*
X76416666Y-45766666D01*
X77116666Y-46566666D02*
X77116666Y-46166666D01*
X77116666Y-46366666D02*
X76416666Y-46366666D01*
X76516666Y-46300000D01*
X76583333Y-46233333D01*
X76616666Y-46166666D01*
M02*

View file

@ -0,0 +1,46 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.1-0*
G04 #@! TF.CreationDate,2023-03-19T14:40:06+01:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,2.0.0*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 7.0.1-0) date 2023-03-19 14:40:06*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.120000*%
G04 APERTURE END LIST*
D10*
X58000000Y-99000000D02*
X78000000Y-99000000D01*
X57600000Y-65705000D02*
X57600000Y-59005000D01*
X69850000Y-39605000D02*
X69850000Y-44405000D01*
X64350000Y-70705000D02*
X64350000Y-65905000D01*
X77950000Y-59105000D02*
X73150000Y-65905000D01*
X57600000Y-44605000D02*
X57600000Y-51305000D01*
X64350000Y-44405000D02*
X64350000Y-39605000D01*
X77950000Y-51205000D02*
X77950000Y-59105000D01*
X64350000Y-39605000D02*
X69850000Y-39605000D01*
X69850000Y-65905000D02*
X69850000Y-70705000D01*
X69850000Y-70705000D02*
X64350000Y-70705000D01*
X73150000Y-44355000D02*
X77950000Y-51205000D01*
X57598537Y-51308615D02*
G75*
G03*
X57600001Y-59005000I9501463J-3846385D01*
G01*
M02*

View file

@ -1,45 +1,53 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.2-1)-1*
G04 #@! TF.CreationDate,2021-10-09T10:13:21+02:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,1.2.0*
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,7.0.1-0*
G04 #@! TF.CreationDate,2023-03-19T14:40:06+01:00*
G04 #@! TF.ProjectId,parasite,70617261-7369-4746-952e-6b696361645f,2.0.0*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (5.1.2-1)-1) date 2021-10-09 10:13:21*
G04 Created by KiCad (PCBNEW 7.0.1-0) date 2023-03-19 14:40:06*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 #@! TA.AperFunction,Profile*
%ADD10C,0.050000*%
G04 #@! TD*
G04 APERTURE END LIST*
D10*
X79000000Y-143000000D02*
X79000000Y-30000000D01*
X57000000Y-30000000D02*
X57000000Y-143000000D01*
X60000000Y-27000000D02*
X76000000Y-27000000D01*
X68999999Y-152999999D02*
X79000000Y-143000000D01*
X67000002Y-152999998D02*
G75*
G03*
X68999998Y-152999998I999998J999999D01*
G01*
X67000001Y-152999999D02*
X57000000Y-143000000D01*
X68999999Y-152999999D02*
X79000000Y-143000000D01*
X57000000Y-30000000D02*
X57000000Y-143000000D01*
X79000000Y-143000000D02*
X79000000Y-30000000D01*
X76414214Y-68000000D02*
G75*
G02X67000001Y-152999999I-999999J999999D01*
G03*
X76414214Y-68000000I-1414214J0D01*
G01*
X60000000Y-27000000D02*
G75*
G03*
X57000000Y-30000000I0J-3000000D01*
G01*
X62414214Y-68000000D02*
G75*
G03X62414214Y-68000000I-1414214J0D01*
G03*
X62414214Y-68000000I-1414214J0D01*
G01*
X76414214Y-68000000D02*
X79000000Y-30000000D02*
G75*
G03X76414214Y-68000000I-1414214J0D01*
G01*
X57000000Y-30000000D02*
G75*
G02X60000000Y-27000000I3000000J0D01*
G01*
X76000000Y-27000000D02*
G75*
G02X79000000Y-30000000I0J-3000000D01*
G03*
X76000000Y-27000000I-3000000J0D01*
G01*
M02*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,62 +1,67 @@
M48
; DRILL file {KiCad (5.1.2-1)-1} date 2021 October 09, Saturday 10:12:47
; FORMAT={3:3/ absolute / metric / suppress leading zeros}
; #@! TF.CreationDate,2021-10-09T10:12:47+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(5.1.2-1)-1
; DRILL file {KiCad 7.0.1-0} date 2023 March 19, Sunday 14:40:27
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2023-03-19T14:40:27+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,7.0.1-0
; #@! TF.FileFunction,MixedPlating,1,2
FMAT,2
METRIC,TZ
T1C0.400
METRIC
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T1C0.300
%
G90
G05
T1
X58400Y-50400
X59200Y-42000
X59200Y-43100
X59200Y-44200
X59600Y-35400
X59600Y-36300
X59600Y-37200
X59700Y-33500
X60900Y-45600
X62100Y-35600
X62925Y-31530
X63000Y-33800
X63500Y-38200
X63500Y-49600
X63500Y-50500
X63500Y-51400
X63600Y-41600
X63600Y-42700
X63800Y-64300
X64100Y-55238
X64700Y-38200
X65800Y-38200
X65800Y-61100
X65863Y-55238
X67100Y-38200
X67100Y-67700
X67199Y-55038
X67800Y-67000
X68550Y-66250
X68700Y-60700
X69500Y-34400
X69500Y-34400
X69900Y-37400
X69900Y-38400
X70800Y-36300
X71300Y-52400
X71600Y-37700
X71800Y-34700
X72200Y-52400
X73119Y-42600
X74494Y-47510
X74700Y-45700
X74800Y-53800
X74800Y-54700
X75100Y-31800
X75300Y-43200
X75900Y-40300
X76100Y-38200
X58.078Y-41.312
X58.078Y-42.201
X58.078Y-43.09
X58.078Y-43.979
X59.602Y-48.297
X59.856Y-64.172
X59.983Y-36.613
X60.237Y-47.535
X60.618Y-64.172
X60.999Y-36.613
X60.999Y-46.9
X61.38Y-64.172
X62.142Y-64.172
X62.269Y-36.359
X62.269Y-51.472
X62.523Y-34.454
X64.682Y-32.168
X65.063Y-45.63
X65.698Y-32.168
X66.714Y-32.168
X67.603Y-44.995
X67.603Y-45.63
X67.857Y-32.168
X68.873Y-32.168
X69.254Y-37.375
X69.254Y-38.137
X69.254Y-38.899
X69.762Y-32.168
X70.143Y-45.63
X70.148Y-44.995
X70.397Y-48.678
X70.397Y-49.44
X70.397Y-50.202
X70.397Y-50.964
X70.397Y-51.726
X73.468Y-36.623
X73.468Y-37.893
X73.468Y-42.973
X74.969Y-63.918
X75.096Y-33.184
X75.223Y-34.708
X75.223Y-36.74
X75.604Y-49.059
X75.731Y-63.918
X75.858Y-50.329
X76.366Y-44.233
X76.493Y-48.678
X76.493Y-63.918
X76.62Y-54.393
X76.62Y-58.965
X77.255Y-63.918
T0
M30

View file

@ -0,0 +1,523 @@
(footprint "LOGO" (version 20210606) (generator bitmap2component) (layer "F.Cu")
(at 0 0)
(attr board_only exclude_from_pos_files exclude_from_bom)
(fp_text reference "G***" (at 0 0) (layer F.SilkS)
(effects (font (thickness 0.3)))
)
(fp_text value "LOGO" (at 0.75 0) (layer F.SilkS) hide
(effects (font (thickness 0.3)))
)
(fp_poly (pts (xy -1.344936 10.301429) (xy -1.127149 10.302122) (xy -0.902519 10.303472) (xy -0.673995 10.305476) (xy -0.444525 10.308126) (xy -0.217059 10.311420) (xy 0.005455 10.315350) (xy 0.220068 10.319913)
(xy 0.423831 10.325104) (xy 0.613796 10.330916) (xy 0.617739 10.331049) (xy 0.924560 10.341309) (xy 1.196968 10.350191) (xy 1.436864 10.357727) (xy 1.646145 10.363952) (xy 1.826710 10.368898)
(xy 1.980459 10.372600) (xy 2.109288 10.375089) (xy 2.215098 10.376400) (xy 2.299786 10.376567) (xy 2.365252 10.375622) (xy 2.413393 10.373599) (xy 2.446109 10.370531) (xy 2.465297 10.366453)
(xy 2.470958 10.363651) (xy 2.514999 10.342288) (xy 2.571759 10.329734) (xy 2.626031 10.327923) (xy 2.662605 10.338790) (xy 2.663108 10.339197) (xy 2.667196 10.346649) (xy 2.670842 10.363107)
(xy 2.674070 10.390475) (xy 2.676904 10.430655) (xy 2.679368 10.485552) (xy 2.681487 10.557067) (xy 2.683284 10.647104) (xy 2.684783 10.757566) (xy 2.686010 10.890357) (xy 2.686987 11.047379)
(xy 2.687739 11.230535) (xy 2.688290 11.441729) (xy 2.688664 11.682863) (xy 2.688885 11.955842) (xy 2.688978 12.262567) (xy 2.688984 12.382045) (xy 2.689019 12.699978) (xy 2.689061 12.983534)
(xy 2.689013 13.234673) (xy 2.688779 13.455356) (xy 2.688262 13.647543) (xy 2.687367 13.813194) (xy 2.685997 13.954271) (xy 2.684056 14.072733) (xy 2.681448 14.170540) (xy 2.678076 14.249654)
(xy 2.673845 14.312034) (xy 2.668657 14.359642) (xy 2.662417 14.394436) (xy 2.655029 14.418379) (xy 2.646395 14.433430) (xy 2.636421 14.441549) (xy 2.625010 14.444698) (xy 2.612065 14.444836)
(xy 2.597490 14.443924) (xy 2.587768 14.443689) (xy 2.530578 14.444387) (xy 2.489127 14.445136) (xy 2.465602 14.445187) (xy 2.407950 14.445092) (xy 2.318383 14.444858) (xy 2.199111 14.444493)
(xy 2.052346 14.444005) (xy 1.880297 14.443403) (xy 1.685176 14.442694) (xy 1.469194 14.441887) (xy 1.234562 14.440989) (xy 0.983490 14.440009) (xy 0.718189 14.438954) (xy 0.440871 14.437833)
(xy 0.153746 14.436654) (xy 0.127181 14.436544) (xy -0.240200 14.435115) (xy -0.572991 14.434037) (xy -0.872938 14.433333) (xy -1.141785 14.433026) (xy -1.381280 14.433139) (xy -1.593167 14.433694)
(xy -1.779192 14.434713) (xy -1.941102 14.436221) (xy -2.080641 14.438239) (xy -2.199556 14.440790) (xy -2.299592 14.443897) (xy -2.382496 14.447583) (xy -2.450012 14.451870) (xy -2.503887 14.456781)
(xy -2.545866 14.462339) (xy -2.577696 14.468567) (xy -2.590325 14.471932) (xy -2.634041 14.468544) (xy -2.652062 14.453995) (xy -2.662235 14.432720) (xy -2.667891 14.395257) (xy -2.669292 14.335893)
(xy -2.666700 14.248914) (xy -2.664018 14.193827) (xy -2.646920 13.853077) (xy -2.632789 13.533487) (xy -2.621414 13.226757) (xy -2.620059 13.180398) (xy -2.459122 13.180398) (xy -2.458995 13.359012)
(xy -2.457712 13.532736) (xy -2.456950 13.592849) (xy -2.447978 14.222251) (xy -0.447272 14.233926) (xy -0.176178 14.235627) (xy 0.087734 14.237512) (xy 0.341826 14.239552) (xy 0.583461 14.241714)
(xy 0.810003 14.243967) (xy 1.018815 14.246282) (xy 1.207259 14.248626) (xy 1.372700 14.250969) (xy 1.512500 14.253279) (xy 1.624022 14.255526) (xy 1.704629 14.257679) (xy 1.751686 14.259706)
(xy 1.753290 14.259817) (xy 1.851538 14.265609) (xy 1.970981 14.270852) (xy 2.096479 14.274965) (xy 2.212053 14.277359) (xy 2.470958 14.280686) (xy 2.470864 12.595529) (xy 2.470726 12.346816)
(xy 2.470350 12.105398) (xy 2.469756 11.874162) (xy 2.468961 11.655995) (xy 2.467984 11.453784) (xy 2.466842 11.270416) (xy 2.465554 11.108778) (xy 2.464138 10.971756) (xy 2.462612 10.862237)
(xy 2.460993 10.783108) (xy 2.459301 10.737257) (xy 2.459197 10.735623) (xy 2.447624 10.560873) (xy 2.300314 10.544850) (xy 2.263785 10.542841) (xy 2.193273 10.540906) (xy 2.091131 10.539058)
(xy 1.959714 10.537314) (xy 1.801376 10.535688) (xy 1.618471 10.534198) (xy 1.413353 10.532857) (xy 1.188376 10.531682) (xy 0.945894 10.530687) (xy 0.688262 10.529889) (xy 0.417833 10.529303)
(xy 0.136962 10.528943) (xy -0.140795 10.528827) (xy -2.434593 10.528827) (xy -2.437347 10.574249) (xy -2.437844 10.601597) (xy -2.438145 10.661308) (xy -2.438254 10.749403) (xy -2.438176 10.861908)
(xy -2.437915 10.994846) (xy -2.437476 11.144242) (xy -2.436864 11.306120) (xy -2.436403 11.410014) (xy -2.435998 11.594338) (xy -2.436418 11.782783) (xy -2.437593 11.968867) (xy -2.439452 12.146107)
(xy -2.441923 12.308021) (xy -2.444934 12.448125) (xy -2.448414 12.559936) (xy -2.449314 12.581902) (xy -2.453189 12.697644) (xy -2.456157 12.841470) (xy -2.458155 13.005135) (xy -2.459122 13.180398)
(xy -2.620059 13.180398) (xy -2.612582 12.924587) (xy -2.606083 12.618678) (xy -2.601703 12.300731) (xy -2.599233 11.962446) (xy -2.598463 11.624570) (xy -2.598684 11.367817) (xy -2.599498 11.142636)
(xy -2.600893 10.949706) (xy -2.602860 10.789704) (xy -2.605386 10.663310) (xy -2.608463 10.571200) (xy -2.612078 10.514055) (xy -2.616221 10.492551) (xy -2.616309 10.492489) (xy -2.634220 10.463971)
(xy -2.625428 10.425613) (xy -2.593072 10.388308) (xy -2.584514 10.382233) (xy -2.541608 10.351697) (xy -2.510541 10.325637) (xy -2.487035 10.320180) (xy -2.430147 10.315427) (xy -2.342826 10.311372)
(xy -2.228021 10.308011) (xy -2.088680 10.305338) (xy -1.927753 10.303349) (xy -1.748187 10.302038) (xy -1.552932 10.301399) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -1.455563 7.524156) (xy -1.400578 7.530357) (xy -1.367034 7.543565) (xy -1.350017 7.564994) (xy -1.344612 7.595856) (xy -1.344492 7.603229) (xy -1.346074 7.620031) (xy -1.354746 7.631761)
(xy -1.376394 7.639716) (xy -1.416907 7.645189) (xy -1.482173 7.649476) (xy -1.573949 7.653693) (xy -1.682102 7.659787) (xy -1.757210 7.667512) (xy -1.802547 7.677326) (xy -1.820473 7.688131)
(xy -1.826130 7.714878) (xy -1.829685 7.772110) (xy -1.830987 7.854028) (xy -1.829888 7.954833) (xy -1.828608 8.003574) (xy -1.826323 8.116160) (xy -1.826755 8.210007) (xy -1.829759 8.279818)
(xy -1.835192 8.320299) (xy -1.837350 8.326071) (xy -1.869291 8.353447) (xy -1.908997 8.352511) (xy -1.942458 8.324041) (xy -1.944708 8.320110) (xy -1.953136 8.284035) (xy -1.958593 8.214581)
(xy -1.960940 8.114596) (xy -1.960292 8.001747) (xy -1.959766 7.903060) (xy -1.961319 7.817572) (xy -1.964678 7.751852) (xy -1.969570 7.712466) (xy -1.972634 7.704568) (xy -2.002380 7.697089)
(xy -2.057021 7.701304) (xy -2.127724 7.715388) (xy -2.205656 7.737514) (xy -2.281983 7.765857) (xy -2.293612 7.770916) (xy -2.354502 7.795982) (xy -2.392683 7.805186) (xy -2.417290 7.800171)
(xy -2.425336 7.794587) (xy -2.448137 7.756604) (xy -2.450342 7.709598) (xy -2.431237 7.672166) (xy -2.430079 7.671181) (xy -2.382952 7.646088) (xy -2.305379 7.620783) (xy -2.203225 7.596341)
(xy -2.082360 7.573839) (xy -1.948650 7.554355) (xy -1.807964 7.538965) (xy -1.666168 7.528746) (xy -1.649507 7.527925) (xy -1.536901 7.523750) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 7.936598 6.667652) (xy 7.956077 6.728764) (xy 7.957940 6.742475) (xy 7.967024 6.822389) (xy 8.066953 6.818134) (xy 8.136406 6.817507) (xy 8.201227 6.820676) (xy 8.227058 6.823711)
(xy 8.268339 6.834978) (xy 8.282290 6.855310) (xy 8.281564 6.873388) (xy 8.273752 6.894694) (xy 8.252557 6.910873) (xy 8.210656 6.925386) (xy 8.140725 6.941691) (xy 8.133965 6.943121)
(xy 8.065830 6.958635) (xy 8.012061 6.973050) (xy 7.982143 6.983762) (xy 7.979530 6.985527) (xy 7.974057 7.009160) (xy 7.971555 7.059748) (xy 7.971681 7.128060) (xy 7.974096 7.204867)
(xy 7.978459 7.280937) (xy 7.984429 7.347039) (xy 7.991666 7.393943) (xy 7.995032 7.405775) (xy 8.024851 7.441539) (xy 8.074580 7.447906) (xy 8.112659 7.437505) (xy 8.137704 7.414663)
(xy 8.165765 7.370443) (xy 8.177090 7.346661) (xy 8.210988 7.291213) (xy 8.246145 7.268104) (xy 8.276219 7.274142) (xy 8.294870 7.306132) (xy 8.295757 7.360880) (xy 8.285766 7.401404)
(xy 8.244001 7.477996) (xy 8.174089 7.535575) (xy 8.105031 7.566696) (xy 8.032764 7.587877) (xy 7.980136 7.591533) (xy 7.943931 7.582403) (xy 7.909142 7.551835) (xy 7.882789 7.490571)
(xy 7.864426 7.397010) (xy 7.853606 7.269553) (xy 7.852971 7.255987) (xy 7.848235 7.172266) (xy 7.842278 7.101235) (xy 7.835920 7.051210) (xy 7.830860 7.031495) (xy 7.812738 7.021235)
(xy 7.774553 7.024781) (xy 7.723554 7.038194) (xy 7.668114 7.053465) (xy 7.635135 7.056809) (xy 7.612513 7.047516) (xy 7.593808 7.030575) (xy 7.567470 6.998253) (xy 7.558226 6.976824)
(xy 7.574059 6.942016) (xy 7.613204 6.909906) (xy 7.663128 6.889159) (xy 7.689950 6.885732) (xy 7.760889 6.882632) (xy 7.803016 6.869538) (xy 7.823716 6.839652) (xy 7.830373 6.786176)
(xy 7.830758 6.756109) (xy 7.833315 6.691054) (xy 7.842301 6.654167) (xy 7.859690 6.637552) (xy 7.860481 6.637239) (xy 7.903831 6.636170) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -0.069152 6.999999) (xy 0.009217 7.030947) (xy 0.114030 7.079954) (xy 0.166686 7.106142) (xy 0.249144 7.146358) (xy 0.322462 7.179662) (xy 0.379294 7.202885) (xy 0.412293 7.212859)
(xy 0.414564 7.213018) (xy 0.450892 7.228918) (xy 0.470929 7.268917) (xy 0.472389 7.285210) (xy 0.456959 7.299903) (xy 0.424791 7.311869) (xy 0.381014 7.330692) (xy 0.328534 7.363493)
(xy 0.311236 7.376552) (xy 0.257430 7.413017) (xy 0.187532 7.451982) (xy 0.136266 7.476295) (xy 0.070015 7.505542) (xy 0.009694 7.533315) (xy -0.024184 7.549847) (xy -0.067200 7.570083)
(xy -0.094721 7.573665) (xy -0.122882 7.561829) (xy -0.129653 7.557930) (xy -0.145733 7.541701) (xy -0.152891 7.511614) (xy -0.152447 7.458808) (xy -0.149876 7.422216) (xy -0.140376 7.303862)
(xy -0.937749 7.302430) (xy -1.143215 7.301750) (xy -1.370231 7.300457) (xy -1.608941 7.298644) (xy -1.849491 7.296399) (xy -2.082024 7.293815) (xy -2.296685 7.290982) (xy -2.461874 7.288375)
(xy -2.635579 7.285675) (xy -2.810401 7.283543) (xy -2.980110 7.282012) (xy -3.138475 7.281118) (xy -3.279264 7.280897) (xy -3.396247 7.281383) (xy -3.483192 7.282610) (xy -3.483870 7.282626)
(xy -3.779113 7.289501) (xy -3.779361 7.364815) (xy -3.784884 7.449792) (xy -3.800491 7.502622) (xy -3.825732 7.521836) (xy -3.827378 7.521888) (xy -3.858205 7.513966) (xy -3.906208 7.493943)
(xy -3.929730 7.482382) (xy -3.980146 7.457863) (xy -4.052310 7.424668) (xy -4.099279 7.403791) (xy -3.888126 7.403791) (xy -3.879042 7.412875) (xy -3.869957 7.403791) (xy -3.879042 7.394706)
(xy -3.888126 7.403791) (xy -4.099279 7.403791) (xy -4.134453 7.388157) (xy -4.179099 7.368827) (xy -4.256720 7.334412) (xy -4.325749 7.301703) (xy -4.376648 7.275325) (xy -4.394971 7.264141)
(xy -4.426782 7.231114) (xy -4.423595 7.203777) (xy -4.386503 7.183567) (xy -4.325497 7.172702) (xy -4.246905 7.155521) (xy -4.144956 7.116394) (xy -4.048217 7.070346) (xy -3.967820 7.030204)
(xy -3.912761 7.004934) (xy -3.876191 6.992550) (xy -3.851258 6.991065) (xy -3.831111 6.998492) (xy -3.821300 7.004526) (xy -3.793192 7.031474) (xy -3.780989 7.071704) (xy -3.779113 7.112733)
(xy -3.779113 7.193298) (xy -3.438448 7.198616) (xy -3.365952 7.199387) (xy -3.260696 7.199986) (xy -3.126258 7.200413) (xy -2.966214 7.200668) (xy -2.784142 7.200753) (xy -2.583619 7.200667)
(xy -2.368222 7.200410) (xy -2.141529 7.199984) (xy -1.907117 7.199388) (xy -1.668563 7.198622) (xy -1.612482 7.198419) (xy -0.127182 7.192903) (xy -0.127182 7.158512) (xy -0.054507 7.158512)
(xy -0.047859 7.173467) (xy -0.042394 7.170624) (xy -0.040220 7.149062) (xy -0.042394 7.146399) (xy -0.053196 7.148893) (xy -0.054507 7.158512) (xy -0.127182 7.158512) (xy -0.127182 7.131188)
(xy -0.136613 7.077882) (xy -0.157242 7.052651) (xy -0.178029 7.024938) (xy -0.176102 7.006642) (xy -0.158760 6.988732) (xy -0.124127 6.986222) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -4.620270 -4.718515) (xy -4.604591 -4.704592) (xy -4.561799 -4.664391) (xy -4.573133 -3.049864) (xy -4.584468 -1.435336) (xy -4.545806 -1.435336) (xy -4.504627 -1.420171) (xy -4.481366 -1.383223)
(xy -4.482860 -1.337316) (xy -4.487697 -1.326324) (xy -4.517670 -1.297214) (xy -4.542843 -1.289986) (xy -4.554423 -1.288533) (xy -4.563195 -1.281215) (xy -4.569556 -1.263595) (xy -4.573905 -1.231235)
(xy -4.576640 -1.179698) (xy -4.578159 -1.104545) (xy -4.578860 -1.001340) (xy -4.579113 -0.885730) (xy -4.579260 -0.825805) (xy -4.579576 -0.731587) (xy -4.580052 -0.605121) (xy -4.580679 -0.448451)
(xy -4.581447 -0.263623) (xy -4.582348 -0.052680) (xy -4.583372 0.182334) (xy -4.584510 0.439372) (xy -4.585754 0.716392) (xy -4.587093 1.011347) (xy -4.588520 1.322195) (xy -4.590024 1.646890)
(xy -4.591597 1.983388) (xy -4.593230 2.329644) (xy -4.594913 2.683614) (xy -4.596368 2.987132) (xy -4.598472 3.416625) (xy -4.600493 3.811128) (xy -4.602445 4.171991) (xy -4.604345 4.500561)
(xy -4.606207 4.798187) (xy -4.608048 5.066218) (xy -4.609882 5.306001) (xy -4.611727 5.518885) (xy -4.613596 5.706218) (xy -4.615507 5.869348) (xy -4.617473 6.009625) (xy -4.619512 6.128395)
(xy -4.621638 6.227008) (xy -4.623868 6.306813) (xy -4.626216 6.369156) (xy -4.628699 6.415387) (xy -4.631331 6.446854) (xy -4.634130 6.464905) (xy -4.636675 6.470724) (xy -4.620566 6.471880)
(xy -4.569445 6.473014) (xy -4.484639 6.474124) (xy -4.367475 6.475205) (xy -4.219279 6.476254) (xy -4.041378 6.477269) (xy -3.835097 6.478245) (xy -3.601763 6.479178) (xy -3.342703 6.480067)
(xy -3.059242 6.480907) (xy -2.752708 6.481695) (xy -2.424427 6.482428) (xy -2.075725 6.483103) (xy -1.707928 6.483715) (xy -1.322364 6.484262) (xy -0.920357 6.484740) (xy -0.503235 6.485146)
(xy -0.072325 6.485476) (xy 0.371048 6.485728) (xy 0.825558 6.485897) (xy 1.289877 6.485981) (xy 1.386704 6.485988) (xy 1.943590 6.486019) (xy 2.465283 6.486066) (xy 2.952925 6.486134)
(xy 3.407661 6.486228) (xy 3.830634 6.486356) (xy 4.222989 6.486523) (xy 4.585868 6.486735) (xy 4.920416 6.486998) (xy 5.227777 6.487318) (xy 5.509093 6.487702) (xy 5.765509 6.488156)
(xy 5.998170 6.488685) (xy 6.208217 6.489296) (xy 6.396795 6.489994) (xy 6.565049 6.490786) (xy 6.714121 6.491678) (xy 6.845155 6.492676) (xy 6.959296 6.493786) (xy 7.057686 6.495014)
(xy 7.141471 6.496367) (xy 7.211792 6.497849) (xy 7.269795 6.499468) (xy 7.316622 6.501229) (xy 7.353418 6.503138) (xy 7.381327 6.505202) (xy 7.401492 6.507427) (xy 7.415056 6.509818)
(xy 7.423165 6.512382) (xy 7.426960 6.515125) (xy 7.427587 6.518053) (xy 7.427585 6.518061) (xy 7.425813 6.520991) (xy 7.420896 6.523739) (xy 7.411689 6.526311) (xy 7.397045 6.528713)
(xy 7.375817 6.530954) (xy 7.346860 6.533039) (xy 7.309026 6.534976) (xy 7.261170 6.536772) (xy 7.202145 6.538433) (xy 7.130805 6.539967) (xy 7.046004 6.541379) (xy 6.946594 6.542678)
(xy 6.831430 6.543870) (xy 6.699366 6.544962) (xy 6.549254 6.545961) (xy 6.379950 6.546873) (xy 6.190305 6.547706) (xy 5.979174 6.548466) (xy 5.745411 6.549161) (xy 5.487869 6.549798)
(xy 5.205401 6.550382) (xy 4.896862 6.550921) (xy 4.561105 6.551423) (xy 4.196984 6.551893) (xy 3.803352 6.552339) (xy 3.379063 6.552767) (xy 2.922971 6.553185) (xy 2.433929 6.553600)
(xy 1.910790 6.554017) (xy 1.378146 6.554426) (xy -4.665171 6.558995) (xy -4.694366 6.514437) (xy -4.697162 6.508158) (xy -4.699754 6.497371) (xy -4.702144 6.480886) (xy -4.704333 6.457512)
(xy -4.706323 6.426057) (xy -4.708115 6.385331) (xy -4.709711 6.334143) (xy -4.711112 6.271301) (xy -4.712319 6.195615) (xy -4.713333 6.105894) (xy -4.714157 6.000946) (xy -4.714791 5.879581)
(xy -4.715236 5.740608) (xy -4.715495 5.582835) (xy -4.715569 5.405072) (xy -4.715458 5.206128) (xy -4.715165 4.984811) (xy -4.714691 4.739931) (xy -4.714036 4.470297) (xy -4.713203 4.174718)
(xy -4.712193 3.852002) (xy -4.711008 3.500960) (xy -4.709647 3.120399) (xy -4.708114 2.709128) (xy -4.706410 2.265958) (xy -4.704535 1.789696) (xy -4.702491 1.279152) (xy -4.700903 0.886620)
(xy -4.699034 0.438303) (xy -4.697108 -0.000694) (xy -4.695132 -0.428973) (xy -4.693117 -0.845139) (xy -4.691072 -1.247797) (xy -4.689007 -1.635552) (xy -4.686931 -2.007007) (xy -4.684853 -2.360767)
(xy -4.682784 -2.695437) (xy -4.680733 -3.009620) (xy -4.678708 -3.301922) (xy -4.676720 -3.570947) (xy -4.674778 -3.815299) (xy -4.672892 -4.033583) (xy -4.671070 -4.224402) (xy -4.669323 -4.386362)
(xy -4.667660 -4.518067) (xy -4.666091 -4.618121) (xy -4.664624 -4.685129) (xy -4.663270 -4.717695) (xy -4.662814 -4.720716) (xy -4.646133 -4.732346) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.486015 6.024894) (xy 0.512064 6.059193) (xy 0.524185 6.110796) (xy 0.521409 6.164191) (xy 0.502766 6.203865) (xy 0.497494 6.208467) (xy 0.467158 6.227308) (xy 0.454220 6.231902)
(xy 0.432150 6.222362) (xy 0.410946 6.208467) (xy 0.388379 6.177171) (xy 0.384093 6.124292) (xy 0.384763 6.114921) (xy 0.399570 6.054702) (xy 0.428811 6.020470) (xy 0.467739 6.016447)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 3.296852 -4.383197) (xy 3.367139 -4.348281) (xy 3.423567 -4.301186) (xy 3.437047 -4.283379) (xy 3.441554 -4.258827) (xy 3.445542 -4.203928) (xy 3.448772 -4.124674) (xy 3.451007 -4.027056)
(xy 3.452009 -3.917062) (xy 3.452031 -3.906295) (xy 3.468998 -3.067169) (xy 3.517019 -2.219024) (xy 3.595391 -1.370504) (xy 3.703412 -0.530254) (xy 3.751588 -0.218026) (xy 3.873054 0.502934)
(xy 3.999963 1.194365) (xy 4.133635 1.862841) (xy 4.275390 2.514938) (xy 4.426549 3.157228) (xy 4.442949 3.224079) (xy 4.502325 3.462588) (xy 4.556385 3.673404) (xy 4.607391 3.864370)
(xy 4.657611 4.043329) (xy 4.709307 4.218125) (xy 4.764745 4.396602) (xy 4.826189 4.586604) (xy 4.895905 4.795974) (xy 4.902224 4.814735) (xy 4.964508 4.998364) (xy 5.017646 5.152132)
(xy 5.063467 5.280818) (xy 5.103800 5.389203) (xy 5.140475 5.482065) (xy 5.175321 5.564183) (xy 5.210169 5.640338) (xy 5.246847 5.715308) (xy 5.247304 5.716215) (xy 5.316631 5.854001)
(xy 5.355858 5.707441) (xy 5.398652 5.562639) (xy 5.451966 5.410639) (xy 5.518147 5.245577) (xy 5.599541 5.061593) (xy 5.694929 4.860157) (xy 5.804169 4.638746) (xy 5.908474 4.435457)
(xy 6.011838 4.243388) (xy 6.118254 4.055637) (xy 6.231715 3.865303) (xy 6.356214 3.665484) (xy 6.495743 3.449276) (xy 6.619921 3.261302) (xy 6.696459 3.146896) (xy 6.767830 3.041530)
(xy 6.836989 2.941134) (xy 6.906888 2.841637) (xy 6.980479 2.738969) (xy 7.060718 2.629059) (xy 7.150555 2.507837) (xy 7.252945 2.371232) (xy 7.370839 2.215174) (xy 7.507193 2.035592)
(xy 7.549188 1.980400) (xy 7.653376 1.843017) (xy 7.758939 1.702902) (xy 7.861836 1.565484) (xy 7.958025 1.436194) (xy 8.043462 1.320459) (xy 8.114108 1.223711) (xy 8.157844 1.162804)
(xy 8.265648 1.013160) (xy 8.356872 0.892322) (xy 8.433871 0.798082) (xy 8.499001 0.728232) (xy 8.554618 0.680565) (xy 8.603077 0.652872) (xy 8.646735 0.642946) (xy 8.687945 0.648579)
(xy 8.701302 0.653431) (xy 8.749043 0.688898) (xy 8.780780 0.741791) (xy 8.789102 0.798051) (xy 8.785823 0.813808) (xy 8.768663 0.839050) (xy 8.729886 0.882525) (xy 8.675060 0.938355)
(xy 8.609753 1.000661) (xy 8.602622 1.007240) (xy 8.535121 1.071283) (xy 8.466287 1.140913) (xy 8.393809 1.218909) (xy 8.315380 1.308049) (xy 8.228688 1.411111) (xy 8.131424 1.530873)
(xy 8.021278 1.670113) (xy 7.895942 1.831610) (xy 7.753105 2.018140) (xy 7.656702 2.144997) (xy 7.409783 2.473887) (xy 7.185535 2.779651) (xy 6.981773 3.065671) (xy 6.796310 3.335328)
(xy 6.626962 3.592003) (xy 6.471543 3.839076) (xy 6.327867 4.079930) (xy 6.193749 4.317943) (xy 6.067003 4.556499) (xy 5.958919 4.771417) (xy 5.838028 5.026727) (xy 5.738102 5.257689)
(xy 5.657633 5.468508) (xy 5.595111 5.663393) (xy 5.549030 5.846548) (xy 5.522980 5.987519) (xy 5.502847 6.091325) (xy 5.477546 6.161697) (xy 5.443397 6.201508) (xy 5.396720 6.213631)
(xy 5.333835 6.200940) (xy 5.278040 6.178758) (xy 5.252008 6.165695) (xy 5.228878 6.149103) (xy 5.206713 6.125242) (xy 5.183578 6.090375) (xy 5.157535 6.040764) (xy 5.126650 5.972671)
(xy 5.088987 5.882358) (xy 5.042608 5.766087) (xy 4.985579 5.620120) (xy 4.976204 5.595994) (xy 4.842102 5.235665) (xy 4.708188 4.846718) (xy 4.576828 4.436808) (xy 4.450387 4.013587)
(xy 4.331232 3.584711) (xy 4.221727 3.157834) (xy 4.218143 3.143204) (xy 4.161146 2.908056) (xy 4.108388 2.685440) (xy 4.058878 2.470568) (xy 4.011625 2.258653) (xy 3.965636 2.044906)
(xy 3.919922 1.824539) (xy 3.873490 1.592766) (xy 3.825350 1.344797) (xy 3.774510 1.075846) (xy 3.719979 0.781124) (xy 3.660766 0.455843) (xy 3.653905 0.417882) (xy 3.565758 -0.087061)
(xy 3.489298 -0.562476) (xy 3.424008 -1.013061) (xy 3.369368 -1.443515) (xy 3.324862 -1.858536) (xy 3.289970 -2.262822) (xy 3.264175 -2.661072) (xy 3.246959 -3.057983) (xy 3.239716 -3.338520)
(xy 3.236649 -3.480286) (xy 3.233090 -3.609695) (xy 3.229216 -3.722464) (xy 3.225205 -3.814311) (xy 3.221235 -3.880953) (xy 3.217483 -3.918107) (xy 3.215415 -3.924464) (xy 3.194264 -3.912121)
(xy 3.178537 -3.896000) (xy 3.154600 -3.876486) (xy 3.105811 -3.843224) (xy 3.038833 -3.800559) (xy 2.960328 -3.752832) (xy 2.944188 -3.743272) (xy 2.840269 -3.680805) (xy 2.749479 -3.622923)
(xy 2.666573 -3.565354) (xy 2.586303 -3.503824) (xy 2.503425 -3.434063) (xy 2.412691 -3.351797) (xy 2.308856 -3.252754) (xy 2.186674 -3.132662) (xy 2.151576 -3.097783) (xy 2.043300 -2.988755)
(xy 1.924492 -2.866891) (xy 1.797611 -2.734882) (xy 1.665117 -2.595422) (xy 1.529471 -2.451203) (xy 1.393131 -2.304917) (xy 1.258558 -2.159258) (xy 1.128213 -2.016917) (xy 1.004554 -1.880588)
(xy 0.890042 -1.752962) (xy 0.787136 -1.636733) (xy 0.698298 -1.534593) (xy 0.625986 -1.449234) (xy 0.572660 -1.383350) (xy 0.540781 -1.339632) (xy 0.533598 -1.326796) (xy 0.510434 -1.288980)
(xy 0.485624 -1.271900) (xy 0.484144 -1.271817) (xy 0.462212 -1.257966) (xy 0.419933 -1.218110) (xy 0.359441 -1.154792) (xy 0.282868 -1.070559) (xy 0.192346 -0.967954) (xy 0.090009 -0.849523)
(xy -0.022011 -0.717810) (xy -0.141581 -0.575360) (xy -0.266569 -0.424718) (xy -0.394841 -0.268428) (xy -0.524266 -0.109036) (xy -0.652711 0.050915) (xy -0.778042 0.208879) (xy -0.898128 0.362311)
(xy -1.010835 0.508667) (xy -1.038528 0.545064) (xy -1.284986 0.876056) (xy -1.531525 1.219146) (xy -1.776608 1.571705) (xy -2.018703 1.931104) (xy -2.256272 2.294716) (xy -2.487782 2.659911)
(xy -2.711696 3.024062) (xy -2.926481 3.384539) (xy -3.130599 3.738714) (xy -3.322518 4.083959) (xy -3.500700 4.417645) (xy -3.663612 4.737144) (xy -3.809717 5.039826) (xy -3.937481 5.323064)
(xy -4.045369 5.584230) (xy -4.131845 5.820693) (xy -4.147646 5.868526) (xy -4.184068 5.977473) (xy -4.213861 6.055986) (xy -4.239763 6.108738) (xy -4.264512 6.140405) (xy -4.290846 6.155663)
(xy -4.317909 6.159227) (xy -4.365543 6.144939) (xy -4.407835 6.110098) (xy -4.431627 6.066736) (xy -4.433191 6.053784) (xy -4.426427 6.014795) (xy -4.407480 5.948046) (xy -4.378368 5.859229)
(xy -4.341108 5.754032) (xy -4.297719 5.638144) (xy -4.250219 5.517254) (xy -4.200624 5.397053) (xy -4.198520 5.392093) (xy -4.072181 5.107734) (xy -3.924630 4.798999) (xy -3.757883 4.469459)
(xy -3.573954 4.122681) (xy -3.374861 3.762235) (xy -3.162617 3.391690) (xy -2.939238 3.014616) (xy -2.706741 2.634581) (xy -2.467140 2.255155) (xy -2.222450 1.879908) (xy -2.174496 1.807797)
(xy -1.763544 1.210393) (xy -1.324329 0.606914) (xy -0.862435 0.004502) (xy -0.383445 -0.589699) (xy 0.107056 -1.168547) (xy 0.488668 -1.598856) (xy 0.757368 -1.894438) (xy 1.017601 -2.178220)
(xy 1.267904 -2.448677) (xy 1.506816 -2.704287) (xy 1.732874 -2.943523) (xy 1.944617 -3.164861) (xy 2.140582 -3.366777) (xy 2.319308 -3.547747) (xy 2.479332 -3.706246) (xy 2.619193 -3.840749)
(xy 2.737429 -3.949733) (xy 2.775340 -3.983229) (xy 2.880382 -4.081595) (xy 2.965365 -4.175325) (xy 3.015892 -4.244345) (xy 3.065185 -4.316977) (xy 3.107255 -4.362579) (xy 3.150313 -4.387019)
(xy 3.202569 -4.396162) (xy 3.229324 -4.396853) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.499878 5.614359) (xy 0.521281 5.651195) (xy 0.527636 5.703113) (xy 0.519629 5.754821) (xy 0.497948 5.791026) (xy 0.491752 5.795212) (xy 0.446689 5.812180) (xy 0.414617 5.800828)
(xy 0.389442 5.769336) (xy 0.370269 5.717817) (xy 0.374166 5.667446) (xy 0.395782 5.625732) (xy 0.429767 5.600185) (xy 0.470767 5.598314) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.499878 5.196476) (xy 0.521281 5.233312) (xy 0.527636 5.285231) (xy 0.519629 5.336938) (xy 0.497948 5.373143) (xy 0.491752 5.377329) (xy 0.446689 5.394298) (xy 0.414617 5.382946)
(xy 0.389442 5.351453) (xy 0.370269 5.299935) (xy 0.374166 5.249563) (xy 0.395782 5.207849) (xy 0.429767 5.182302) (xy 0.470767 5.180431) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.486369 4.767375) (xy 0.515290 4.802695) (xy 0.526862 4.865139) (xy 0.526895 4.869241) (xy 0.515826 4.931367) (xy 0.486868 4.969381) (xy 0.446401 4.979481) (xy 0.400800 4.957864)
(xy 0.391927 4.949703) (xy 0.367636 4.902716) (xy 0.367193 4.846038) (xy 0.390091 4.796949) (xy 0.396602 4.790298) (xy 0.445129 4.762226) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.496698 4.357635) (xy 0.521680 4.402647) (xy 0.526895 4.451359) (xy 0.515826 4.513485) (xy 0.486868 4.551498) (xy 0.446401 4.561598) (xy 0.400800 4.539982) (xy 0.391927 4.531821)
(xy 0.367004 4.486412) (xy 0.365557 4.433507) (xy 0.383982 4.384496) (xy 0.418674 4.350770) (xy 0.451884 4.342346) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.491352 3.934742) (xy 0.505093 3.946266) (xy 0.523687 3.984794) (xy 0.527452 4.037217) (xy 0.517556 4.087992) (xy 0.495168 4.121574) (xy 0.491752 4.123681) (xy 0.448723 4.140603)
(xy 0.417160 4.131744) (xy 0.393445 4.109263) (xy 0.368459 4.063085) (xy 0.366679 4.013985) (xy 0.383092 3.969281) (xy 0.412684 3.936293) (xy 0.450441 3.922341) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.490233 3.515999) (xy 0.505093 3.528383) (xy 0.522880 3.567431) (xy 0.525362 3.621468) (xy 0.513247 3.672868) (xy 0.498344 3.696055) (xy 0.456921 3.722108) (xy 0.417071 3.712601)
(xy 0.393445 3.691380) (xy 0.367761 3.644559) (xy 0.365414 3.595122) (xy 0.381445 3.550309) (xy 0.410898 3.517359) (xy 0.448814 3.503509) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.494609 3.103007) (xy 0.521564 3.145710) (xy 0.526895 3.190962) (xy 0.515364 3.247680) (xy 0.485830 3.289849) (xy 0.445886 3.306718) (xy 0.445136 3.306724) (xy 0.413215 3.294810)
(xy 0.391927 3.278173) (xy 0.370934 3.237564) (xy 0.364087 3.183151) (xy 0.372097 3.132562) (xy 0.385179 3.110500) (xy 0.420600 3.092298) (xy 0.445136 3.088698) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.494609 2.685124) (xy 0.521564 2.727827) (xy 0.526895 2.773080) (xy 0.515364 2.829797) (xy 0.485830 2.871966) (xy 0.445886 2.888835) (xy 0.445136 2.888841) (xy 0.413215 2.876928)
(xy 0.391927 2.860290) (xy 0.370934 2.819681) (xy 0.364087 2.765268) (xy 0.372097 2.714679) (xy 0.385179 2.692618) (xy 0.420600 2.674415) (xy 0.445136 2.670815) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.489872 2.268094) (xy 0.516754 2.306039) (xy 0.526486 2.355457) (xy 0.516782 2.405039) (xy 0.486515 2.442675) (xy 0.447499 2.466152) (xy 0.421000 2.466051) (xy 0.391927 2.442407)
(xy 0.370934 2.401799) (xy 0.364087 2.347386) (xy 0.372097 2.296796) (xy 0.385179 2.274735) (xy 0.420087 2.257031) (xy 0.448130 2.252932) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.490176 1.851093) (xy 0.517394 1.893007) (xy 0.524001 1.951471) (xy 0.523473 1.956527) (xy 0.504588 2.001969) (xy 0.467976 2.033439) (xy 0.425911 2.041323) (xy 0.417882 2.039209)
(xy 0.381753 2.014057) (xy 0.365562 1.967226) (xy 0.363654 1.934070) (xy 0.375230 1.874074) (xy 0.410573 1.841468) (xy 0.448130 1.835050) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.472227 1.423196) (xy 0.506520 1.449581) (xy 0.508087 1.452310) (xy 0.524853 1.507227) (xy 0.522266 1.561675) (xy 0.505093 1.595221) (xy 0.468959 1.613303) (xy 0.424002 1.615566)
(xy 0.386547 1.602874) (xy 0.374404 1.588285) (xy 0.364049 1.535551) (xy 0.367342 1.480739) (xy 0.383019 1.441347) (xy 0.385179 1.438970) (xy 0.426084 1.419040) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.474936 1.009202) (xy 0.506871 1.041060) (xy 0.522998 1.087676) (xy 0.516818 1.141920) (xy 0.512366 1.152987) (xy 0.483105 1.185293) (xy 0.441282 1.200151) (xy 0.400532 1.195838)
(xy 0.374494 1.170634) (xy 0.374404 1.170402) (xy 0.363760 1.115789) (xy 0.368271 1.060677) (xy 0.386298 1.021433) (xy 0.389629 1.018283) (xy 0.433690 0.999233) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.477969 0.596435) (xy 0.510678 0.630662) (xy 0.516536 0.646380) (xy 0.520311 0.710576) (xy 0.499957 0.758629) (xy 0.460784 0.784232) (xy 0.408103 0.781079) (xy 0.404256 0.779697)
(xy 0.376378 0.761235) (xy 0.364839 0.726440) (xy 0.363376 0.693225) (xy 0.370250 0.639026) (xy 0.387705 0.602308) (xy 0.390393 0.599766) (xy 0.433184 0.584403) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.482832 0.174283) (xy 0.495289 0.194392) (xy 0.499389 0.236830) (xy 0.499642 0.263447) (xy 0.498306 0.317414) (xy 0.490494 0.345001) (xy 0.470506 0.356160) (xy 0.444483 0.359695)
(xy 0.401401 0.359665) (xy 0.376350 0.352124) (xy 0.365070 0.320899) (xy 0.363820 0.271740) (xy 0.371301 0.221241) (xy 0.386214 0.185996) (xy 0.389629 0.182518) (xy 0.427843 0.167408)
(xy 0.457762 0.166667) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.499642 -0.154435) (xy 0.497991 -0.100177) (xy 0.489934 -0.072417) (xy 0.470814 -0.061361) (xy 0.454220 -0.058885) (xy 0.409698 -0.061098) (xy 0.384908 -0.069770) (xy 0.368915 -0.100731)
(xy 0.366471 -0.161316) (xy 0.366740 -0.165320) (xy 0.371939 -0.214827) (xy 0.383859 -0.238018) (xy 0.411142 -0.244866) (xy 0.436051 -0.245279) (xy 0.499642 -0.245279) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -6.136217 -0.877083) (xy -6.068221 -0.839232) (xy -6.026484 -0.779299) (xy -6.013877 -0.708584) (xy -6.024575 -0.638007) (xy -6.060343 -0.586085) (xy -6.126694 -0.544927) (xy -6.128898 -0.543919)
(xy -6.209706 -0.515564) (xy -6.279346 -0.513287) (xy -6.352015 -0.537148) (xy -6.367886 -0.544921) (xy -6.416140 -0.566081) (xy -6.443107 -0.567558) (xy -6.453210 -0.558547) (xy -6.467944 -0.504620)
(xy -6.453529 -0.445066) (xy -6.414765 -0.387208) (xy -6.356454 -0.338370) (xy -6.288558 -0.307367) (xy -6.238061 -0.295839) (xy -6.190354 -0.295943) (xy -6.129641 -0.308337) (xy -6.104817 -0.315025)
(xy -6.036697 -0.331484) (xy -5.974232 -0.342447) (xy -5.941476 -0.345208) (xy -5.902267 -0.340252) (xy -5.887919 -0.319682) (xy -5.886696 -0.301758) (xy -5.895888 -0.268223) (xy -5.928947 -0.242638)
(xy -5.955777 -0.230668) (xy -5.994728 -0.217859) (xy -6.050506 -0.202713) (xy -6.112979 -0.187551) (xy -6.172014 -0.174694) (xy -6.217479 -0.166464) (xy -6.239242 -0.165182) (xy -6.239782 -0.165609)
(xy -6.256362 -0.170169) (xy -6.295642 -0.178708) (xy -6.304578 -0.180530) (xy -6.417324 -0.220325) (xy -6.512371 -0.291407) (xy -6.540422 -0.322118) (xy -6.573788 -0.365980) (xy -6.589737 -0.404112)
(xy -6.593061 -0.452637) (xy -6.591052 -0.492486) (xy -6.569969 -0.592657) (xy -6.530994 -0.673553) (xy -6.361342 -0.673553) (xy -6.336368 -0.657864) (xy -6.313663 -0.652073) (xy -6.232003 -0.648537)
(xy -6.168869 -0.675904) (xy -6.159228 -0.684391) (xy -6.142457 -0.707067) (xy -6.154066 -0.726594) (xy -6.167243 -0.736948) (xy -6.214529 -0.760027) (xy -6.263237 -0.754473) (xy -6.310620 -0.728920)
(xy -6.352802 -0.696155) (xy -6.361342 -0.673553) (xy -6.530994 -0.673553) (xy -6.524087 -0.687888) (xy -6.459337 -0.771687) (xy -6.381652 -0.837565) (xy -6.296964 -0.879033) (xy -6.227444 -0.890272)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.461287 -0.664473) (xy 0.494855 -0.633517) (xy 0.508480 -0.573279) (xy 0.508726 -0.561648) (xy 0.501699 -0.506259) (xy 0.478205 -0.475737) (xy 0.473583 -0.473029) (xy 0.442669 -0.457843)
(xy 0.422217 -0.459014) (xy 0.395171 -0.473845) (xy 0.372550 -0.501692) (xy 0.363713 -0.554908) (xy 0.363376 -0.572875) (xy 0.365972 -0.624161) (xy 0.377501 -0.650570) (xy 0.403578 -0.663405)
(xy 0.409034 -0.664845) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.473424 -1.077691) (xy 0.501004 -1.038669) (xy 0.508726 -0.978122) (xy 0.501265 -0.922890) (xy 0.476542 -0.892589) (xy 0.473583 -0.890911) (xy 0.438779 -0.875099) (xy 0.414699 -0.879000)
(xy 0.384089 -0.905900) (xy 0.381545 -0.908441) (xy 0.353043 -0.955419) (xy 0.347588 -1.007509) (xy 0.362682 -1.054017) (xy 0.395827 -1.084249) (xy 0.423972 -1.090129) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -7.475577 -1.756685) (xy -7.432165 -1.736711) (xy -7.417015 -1.699783) (xy -7.421683 -1.672403) (xy -7.440284 -1.645777) (xy -7.480024 -1.635081) (xy -7.500402 -1.634168) (xy -7.562322 -1.627749)
(xy -7.623484 -1.612762) (xy -7.672369 -1.592926) (xy -7.697456 -1.571958) (xy -7.698080 -1.570373) (xy -7.685283 -1.555243) (xy -7.645764 -1.528627) (xy -7.585753 -1.494352) (xy -7.515716 -1.458321)
(xy -7.433035 -1.414994) (xy -7.361385 -1.372364) (xy -7.308901 -1.335532) (xy -7.287311 -1.315168) (xy -7.254953 -1.251638) (xy -7.256510 -1.191201) (xy -7.291081 -1.139862) (xy -7.316259 -1.121854)
(xy -7.375653 -1.099787) (xy -7.457385 -1.085180) (xy -7.548027 -1.079082) (xy -7.634150 -1.082542) (xy -7.689964 -1.092668) (xy -7.739154 -1.113817) (xy -7.791214 -1.146936) (xy -7.835961 -1.184119)
(xy -7.863213 -1.217457) (xy -7.867096 -1.230212) (xy -7.857329 -1.256665) (xy -7.842309 -1.280601) (xy -7.825766 -1.299476) (xy -7.807280 -1.303040) (xy -7.776273 -1.290051) (xy -7.737839 -1.268353)
(xy -7.675091 -1.237664) (xy -7.611129 -1.214835) (xy -7.590022 -1.209852) (xy -7.531584 -1.204602) (xy -7.473888 -1.207827) (xy -7.427010 -1.217818) (xy -7.401031 -1.232867) (xy -7.399146 -1.242192)
(xy -7.418761 -1.260683) (xy -7.468263 -1.291238) (xy -7.544015 -1.331902) (xy -7.642379 -1.380715) (xy -7.752900 -1.432598) (xy -7.841981 -1.481021) (xy -7.895971 -1.529046) (xy -7.916074 -1.578040)
(xy -7.911094 -1.612346) (xy -7.896434 -1.639434) (xy -7.869116 -1.662075) (xy -7.821583 -1.684892) (xy -7.748702 -1.711673) (xy -7.636514 -1.744487) (xy -7.544583 -1.759384) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -7.899569 -1.984655) (xy -7.873022 -1.962604) (xy -7.869813 -1.923660) (xy -7.889723 -1.878599) (xy -7.902021 -1.863475) (xy -7.924698 -1.830157) (xy -7.955472 -1.773161) (xy -7.989049 -1.702586)
(xy -8.002626 -1.671531) (xy -8.047194 -1.567874) (xy -8.093445 -1.462264) (xy -8.137979 -1.362289) (xy -8.177394 -1.275538) (xy -8.208290 -1.209600) (xy -8.222464 -1.180973) (xy -8.253861 -1.146724)
(xy -8.295709 -1.129814) (xy -8.334496 -1.133690) (xy -8.351141 -1.148136) (xy -8.368452 -1.184063) (xy -8.393711 -1.247831) (xy -8.424424 -1.332478) (xy -8.458094 -1.431041) (xy -8.492224 -1.536557)
(xy -8.504214 -1.575134) (xy -8.530150 -1.655407) (xy -8.556151 -1.728937) (xy -8.578070 -1.784245) (xy -8.585544 -1.800220) (xy -8.603205 -1.858972) (xy -8.594929 -1.907568) (xy -8.563673 -1.937930)
(xy -8.532872 -1.944063) (xy -8.494611 -1.936939) (xy -8.465898 -1.911632) (xy -8.442739 -1.862241) (xy -8.421140 -1.782866) (xy -8.419808 -1.777030) (xy -8.401519 -1.705287) (xy -8.378286 -1.626894)
(xy -8.352835 -1.549586) (xy -8.327895 -1.481098) (xy -8.306191 -1.429166) (xy -8.290450 -1.401525) (xy -8.286554 -1.398999) (xy -8.275319 -1.414388) (xy -8.252045 -1.456172) (xy -8.219972 -1.517782)
(xy -8.182346 -1.592645) (xy -8.142407 -1.674190) (xy -8.103398 -1.755844) (xy -8.068562 -1.831038) (xy -8.041142 -1.893199) (xy -8.033034 -1.912799) (xy -7.996742 -1.961714) (xy -7.943435 -1.986272)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -2.854341 -1.430780) (xy -2.826027 -1.412322) (xy -2.811888 -1.387780) (xy -2.800135 -1.350544) (xy -2.812338 -1.323980) (xy -2.832459 -1.306020) (xy -2.877539 -1.279612) (xy -2.927600 -1.276420)
(xy -2.966047 -1.284339) (xy -2.995872 -1.308306) (xy -3.010661 -1.350339) (xy -3.006172 -1.393805) (xy -2.997659 -1.408319) (xy -2.964323 -1.426751) (xy -2.911553 -1.435217) (xy -2.904396 -1.435336)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -2.442361 -1.429264) (xy -2.424211 -1.421432) (xy -2.393400 -1.385737) (xy -2.391680 -1.347464) (xy -2.412773 -1.312357) (xy -2.450396 -1.286159) (xy -2.498271 -1.274614) (xy -2.550118 -1.283466)
(xy -2.566345 -1.291441) (xy -2.592009 -1.324589) (xy -2.596410 -1.370553) (xy -2.578104 -1.411690) (xy -2.576338 -1.413534) (xy -2.541580 -1.429160) (xy -2.490599 -1.434732) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -2.014178 -1.418365) (xy -1.975845 -1.389684) (xy -1.962232 -1.355095) (xy -1.978117 -1.315550) (xy -2.018326 -1.287607) (xy -2.071688 -1.275085) (xy -2.127033 -1.281802) (xy -2.148462 -1.291441)
(xy -2.174127 -1.324589) (xy -2.178528 -1.370553) (xy -2.160222 -1.411690) (xy -2.158455 -1.413534) (xy -2.117459 -1.433856) (xy -2.065375 -1.434278) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -1.598862 -1.428954) (xy -1.566218 -1.413600) (xy -1.566152 -1.413534) (xy -1.544914 -1.372013) (xy -1.552895 -1.328805) (xy -1.584574 -1.292881) (xy -1.634431 -1.273213) (xy -1.653362 -1.271817)
(xy -1.701953 -1.281512) (xy -1.733824 -1.300368) (xy -1.758487 -1.343741) (xy -1.751867 -1.385358) (xy -1.718610 -1.418030) (xy -1.663362 -1.434566) (xy -1.646614 -1.435336) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -1.196223 -1.427935) (xy -1.151181 -1.404390) (xy -1.127739 -1.366139) (xy -1.126467 -1.353577) (xy -1.142391 -1.315477) (xy -1.182200 -1.287082) (xy -1.233951 -1.272042) (xy -1.285699 -1.274006)
(xy -1.322690 -1.293620) (xy -1.342619 -1.334525) (xy -1.338464 -1.380668) (xy -1.312078 -1.414961) (xy -1.309349 -1.416528) (xy -1.252426 -1.433179) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -0.744948 -1.413440) (xy -0.716539 -1.373555) (xy -0.715916 -1.371233) (xy -0.716475 -1.319135) (xy -0.747563 -1.285519) (xy -0.807516 -1.272012) (xy -0.817597 -1.271817) (xy -0.869494 -1.278775)
(xy -0.905623 -1.296079) (xy -0.908245 -1.298834) (xy -0.923383 -1.341548) (xy -0.912108 -1.387286) (xy -0.879647 -1.421211) (xy -0.862742 -1.427945) (xy -0.796498 -1.432657) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -0.357852 -1.428769) (xy -0.316560 -1.403216) (xy -0.295280 -1.360667) (xy -0.299211 -1.314967) (xy -0.309066 -1.298834) (xy -0.344490 -1.279487) (xy -0.397248 -1.272556) (xy -0.450653 -1.278101)
(xy -0.488015 -1.296181) (xy -0.489834 -1.298198) (xy -0.505363 -1.339131) (xy -0.492320 -1.379612) (xy -0.457862 -1.412561) (xy -0.409146 -1.430898) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.057457 -1.424242) (xy 0.092720 -1.401133) (xy 0.121100 -1.372283) (xy 0.122816 -1.343527) (xy 0.113291 -1.319374) (xy 0.091428 -1.286851) (xy 0.057077 -1.273596) (xy 0.022192 -1.271817)
(xy -0.028794 -1.277211) (xy -0.065207 -1.290499) (xy -0.069042 -1.293620) (xy -0.089677 -1.335541) (xy -0.077642 -1.379794) (xy -0.050464 -1.407053) (xy 0.005326 -1.432645) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -4.104400 -1.425513) (xy -4.066350 -1.398152) (xy -4.058794 -1.356412) (xy -4.069814 -1.326324) (xy -4.101306 -1.301057) (xy -4.151388 -1.289661) (xy -4.204746 -1.292924) (xy -4.246072 -1.311630)
(xy -4.251307 -1.317003) (xy -4.264879 -1.356272) (xy -4.262270 -1.389679) (xy -4.250517 -1.418356) (xy -4.226914 -1.431698) (xy -4.180174 -1.435293) (xy -4.170036 -1.435336) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -3.753135 -1.432180) (xy -3.745797 -1.431728) (xy -3.694391 -1.427025) (xy -3.669580 -1.416430) (xy -3.661677 -1.392050) (xy -3.661016 -1.362661) (xy -3.662860 -1.323985) (xy -3.674849 -1.304601)
(xy -3.706672 -1.296617) (xy -3.745797 -1.293595) (xy -3.799278 -1.292601) (xy -3.827566 -1.300955) (xy -3.841337 -1.322171) (xy -3.842408 -1.325390) (xy -3.846880 -1.374301) (xy -3.842408 -1.399932)
(xy -3.829569 -1.422753) (xy -3.803370 -1.432331) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -3.263392 -1.424254) (xy -3.229133 -1.394327) (xy -3.224608 -1.350534) (xy -3.234049 -1.326324) (xy -3.257034 -1.301913) (xy -3.298343 -1.291342) (xy -3.334270 -1.289986) (xy -3.385651 -1.292561)
(xy -3.412128 -1.304010) (xy -3.424990 -1.329920) (xy -3.426504 -1.335644) (xy -3.426132 -1.387897) (xy -3.395176 -1.421465) (xy -3.334938 -1.435090) (xy -3.323308 -1.435336) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -5.387984 -1.488261) (xy -5.283154 -1.487227) (xy -5.202051 -1.485547) (xy -5.148963 -1.483177) (xy -5.136447 -1.482014) (xy -5.071319 -1.470676) (xy -5.039642 -1.455324) (xy -5.038542 -1.432912)
(xy -5.062206 -1.403296) (xy -5.076048 -1.394055) (xy -5.099917 -1.386529) (xy -5.137975 -1.380369) (xy -5.194385 -1.375225) (xy -5.273307 -1.370749) (xy -5.378903 -1.366591) (xy -5.515335 -1.362403)
(xy -5.566391 -1.360993) (xy -5.730972 -1.356505) (xy -5.918177 -1.351348) (xy -6.114305 -1.345903) (xy -6.305659 -1.340552) (xy -6.478537 -1.335674) (xy -6.519920 -1.334497) (xy -6.663979 -1.330484)
(xy -6.775736 -1.327765) (xy -6.859209 -1.326520) (xy -6.918418 -1.326926) (xy -6.957382 -1.329160) (xy -6.980118 -1.333401) (xy -6.990646 -1.339825) (xy -6.992983 -1.348612) (xy -6.992071 -1.355387)
(xy -6.985376 -1.371341) (xy -6.968147 -1.381916) (xy -6.933636 -1.388538) (xy -6.875097 -1.392632) (xy -6.803982 -1.395115) (xy -6.706572 -1.398618) (xy -6.639801 -1.402432) (xy -6.604678 -1.406180)
(xy -6.602215 -1.409482) (xy -6.633422 -1.411961) (xy -6.699308 -1.413236) (xy -6.755528 -1.413269) (xy -6.856802 -1.415457) (xy -6.927618 -1.422782) (xy -6.966397 -1.434855) (xy -6.971562 -1.451287)
(xy -6.957786 -1.463127) (xy -6.934930 -1.466446) (xy -6.880027 -1.469698) (xy -6.797367 -1.472838) (xy -6.691239 -1.475820) (xy -6.565936 -1.478601) (xy -6.425746 -1.481136) (xy -6.274960 -1.483381)
(xy -6.117868 -1.485291) (xy -5.958761 -1.486822) (xy -5.801929 -1.487928) (xy -5.651662 -1.488567) (xy -5.512250 -1.488692) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -6.401911 -2.338935) (xy -6.350350 -2.307768) (xy -6.305596 -2.246958) (xy -6.292032 -2.183687) (xy -6.305170 -2.122397) (xy -6.340524 -2.067529) (xy -6.393607 -2.023524) (xy -6.459932 -1.994823)
(xy -6.535013 -1.985867) (xy -6.614362 -2.001097) (xy -6.646214 -2.014916) (xy -6.692235 -2.037369) (xy -6.716884 -2.043406) (xy -6.731025 -2.033382) (xy -6.739972 -2.017967) (xy -6.756553 -1.971936)
(xy -6.749566 -1.929344) (xy -6.716391 -1.879338) (xy -6.702607 -1.863160) (xy -6.631814 -1.801818) (xy -6.552183 -1.772210) (xy -6.458268 -1.772981) (xy -6.395518 -1.786699) (xy -6.327398 -1.803158)
(xy -6.264933 -1.814120) (xy -6.232177 -1.816882) (xy -6.193058 -1.812012) (xy -6.178705 -1.791444) (xy -6.177397 -1.772099) (xy -6.189376 -1.730883) (xy -6.209552 -1.710107) (xy -6.237155 -1.700463)
(xy -6.287717 -1.686705) (xy -6.350997 -1.671186) (xy -6.416754 -1.656262) (xy -6.474747 -1.644285) (xy -6.514736 -1.637609) (xy -6.526380 -1.637283) (xy -6.545885 -1.641892) (xy -6.586958 -1.650516)
(xy -6.595279 -1.652204) (xy -6.705801 -1.690898) (xy -6.797397 -1.756344) (xy -6.863685 -1.843931) (xy -6.865541 -1.847483) (xy -6.883892 -1.920142) (xy -6.875595 -2.005478) (xy -6.844272 -2.096064)
(xy -6.816877 -2.143808) (xy -6.649786 -2.143808) (xy -6.634198 -2.126732) (xy -6.595250 -2.118843) (xy -6.544666 -2.119870) (xy -6.494171 -2.129537) (xy -6.455488 -2.147572) (xy -6.454471 -2.148369)
(xy -6.432369 -2.180400) (xy -6.441812 -2.209395) (xy -6.478128 -2.229346) (xy -6.521640 -2.234764) (xy -6.555699 -2.224513) (xy -6.597166 -2.199991) (xy -6.632874 -2.170543) (xy -6.649654 -2.145517)
(xy -6.649786 -2.143808) (xy -6.816877 -2.143808) (xy -6.793544 -2.184472) (xy -6.727034 -2.263278) (xy -6.648364 -2.325053) (xy -6.626680 -2.337246) (xy -6.557113 -2.357397) (xy -6.477227 -2.357430)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -5.435598 -2.685512) (xy -5.387053 -2.679900) (xy -5.393658 -2.262017) (xy -5.396258 -2.140854) (xy -5.399918 -2.030691) (xy -5.404348 -1.937128) (xy -5.409258 -1.865764) (xy -5.414355 -1.822197)
(xy -5.417009 -1.812339) (xy -5.448371 -1.785109) (xy -5.489912 -1.784924) (xy -5.523429 -1.807930) (xy -5.536211 -1.841562) (xy -5.538701 -1.902204) (xy -5.535033 -1.957822) (xy -5.529396 -2.036403)
(xy -5.524619 -2.132684) (xy -5.521596 -2.228028) (xy -5.521304 -2.243849) (xy -5.520674 -2.321437) (xy -5.522682 -2.369396) (xy -5.528650 -2.394412) (xy -5.539901 -2.403167) (xy -5.552805 -2.403059)
(xy -5.598614 -2.403258) (xy -5.641204 -2.412287) (xy -5.666504 -2.426600) (xy -5.668670 -2.432258) (xy -5.658375 -2.452773) (xy -5.630956 -2.494246) (xy -5.591609 -2.548959) (xy -5.576407 -2.569248)
(xy -5.528434 -2.630228) (xy -5.493996 -2.666375) (xy -5.466517 -2.683120) (xy -5.439420 -2.685893) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -5.822731 -2.233547) (xy -5.764042 -2.229577) (xy -5.733747 -2.223736) (xy -5.709522 -2.198453) (xy -5.707970 -2.160986) (xy -5.727718 -2.130254) (xy -5.756797 -2.120737) (xy -5.812250 -2.112575)
(xy -5.884126 -2.106269) (xy -5.962472 -2.102316) (xy -6.037335 -2.101215) (xy -6.098763 -2.103466) (xy -6.136804 -2.109567) (xy -6.137247 -2.109728) (xy -6.169781 -2.136785) (xy -6.175102 -2.174646)
(xy -6.152550 -2.209309) (xy -6.142253 -2.215956) (xy -6.109447 -2.223808) (xy -6.050720 -2.229690) (xy -5.976443 -2.233406) (xy -5.896989 -2.234757) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -5.250916 -5.145844) (xy -5.196747 -5.112125) (xy -5.159394 -5.074807) (xy -5.145126 -5.037065) (xy -5.145389 -4.989486) (xy -5.152734 -4.939650) (xy -5.168849 -4.915885) (xy -5.190236 -4.909055)
(xy -5.226430 -4.916739) (xy -5.253953 -4.954477) (xy -5.284908 -4.994744) (xy -5.334275 -5.010856) (xy -5.338440 -5.011293) (xy -5.381012 -5.009790) (xy -5.417944 -4.991346) (xy -5.461914 -4.949932)
(xy -5.503655 -4.896189) (xy -5.520003 -4.852547) (xy -5.519738 -4.844843) (xy -5.496850 -4.802854) (xy -5.445022 -4.762439) (xy -5.371539 -4.728032) (xy -5.290546 -4.705389) (xy -5.188246 -4.683837)
(xy -5.116793 -4.665670) (xy -5.071060 -4.649163) (xy -5.045918 -4.632591) (xy -5.037958 -4.620384) (xy -5.041665 -4.587409) (xy -5.072934 -4.560253) (xy -5.122990 -4.544946) (xy -5.149789 -4.543541)
(xy -5.195715 -4.548636) (xy -5.262104 -4.560680) (xy -5.332547 -4.576579) (xy -5.455314 -4.613438) (xy -5.545167 -4.655951) (xy -5.605418 -4.706960) (xy -5.639382 -4.769303) (xy -5.650372 -4.845822)
(xy -5.650381 -4.848981) (xy -5.639930 -4.927972) (xy -5.605778 -4.997782) (xy -5.543362 -5.066211) (xy -5.503860 -5.099408) (xy -5.419453 -5.147622) (xy -5.333141 -5.163183) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -5.632332 -5.432475) (xy -5.601660 -5.404946) (xy -5.601847 -5.368364) (xy -5.632933 -5.317742) (xy -5.633232 -5.317361) (xy -5.652973 -5.285223) (xy -5.683752 -5.226888) (xy -5.722196 -5.149517)
(xy -5.764935 -5.060272) (xy -5.808597 -4.966314) (xy -5.849810 -4.874804) (xy -5.885202 -4.792903) (xy -5.911403 -4.727774) (xy -5.913650 -4.721749) (xy -5.936457 -4.667032) (xy -5.959859 -4.620953)
(xy -5.962089 -4.617278) (xy -5.997266 -4.586944) (xy -6.041098 -4.579704) (xy -6.078209 -4.597627) (xy -6.081243 -4.601252) (xy -6.096971 -4.631441) (xy -6.120783 -4.688684) (xy -6.149904 -4.765354)
(xy -6.181562 -4.853827) (xy -6.212982 -4.946478) (xy -6.241392 -5.035683) (xy -6.251412 -5.069099) (xy -6.274538 -5.141946) (xy -6.298279 -5.207049) (xy -6.317862 -5.251421) (xy -6.319496 -5.254373)
(xy -6.335565 -5.307953) (xy -6.325872 -5.356064) (xy -6.294613 -5.388402) (xy -6.261770 -5.396138) (xy -6.232664 -5.392990) (xy -6.210042 -5.379806) (xy -6.190792 -5.350973) (xy -6.171802 -5.300880)
(xy -6.149961 -5.223914) (xy -6.135841 -5.169027) (xy -6.103950 -5.051228) (xy -6.074246 -4.957660) (xy -6.047945 -4.891578) (xy -6.026265 -4.856234) (xy -6.016879 -4.851073) (xy -6.004218 -4.866624)
(xy -5.979742 -4.909169) (xy -5.946510 -4.972551) (xy -5.907582 -5.050611) (xy -5.866016 -5.137190) (xy -5.824873 -5.226130) (xy -5.787211 -5.311272) (xy -5.780728 -5.326451) (xy -5.740370 -5.398595)
(xy -5.695653 -5.436397) (xy -5.647763 -5.439010) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 3.990137 -7.045483) (xy 4.241593 -7.040415) (xy 4.258945 -6.991001) (xy 4.266361 -6.946350) (xy 4.247174 -6.909546) (xy 4.242915 -6.904699) (xy 4.225829 -6.889309) (xy 4.202971 -6.878884)
(xy 4.167559 -6.872476) (xy 4.112808 -6.869137) (xy 4.031938 -6.867921) (xy 3.978970 -6.867811) (xy 3.881306 -6.868429) (xy 3.813371 -6.870841) (xy 3.768565 -6.875890) (xy 3.740293 -6.884416)
(xy 3.721955 -6.897261) (xy 3.718338 -6.901038) (xy 3.692397 -6.949171) (xy 3.692945 -6.998263) (xy 3.713475 -7.029632) (xy 3.743999 -7.039235) (xy 3.808187 -7.044838) (xy 3.906972 -7.046496)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 3.810274 -7.309089) (xy 3.940839 -7.308576) (xy 4.073375 -7.307730) (xy 4.202774 -7.306587) (xy 4.323927 -7.305182) (xy 4.431728 -7.303551) (xy 4.521068 -7.301730) (xy 4.586840 -7.299754)
(xy 4.623935 -7.297660) (xy 4.630133 -7.296579) (xy 4.648871 -7.266950) (xy 4.646703 -7.227172) (xy 4.628505 -7.199702) (xy 4.606147 -7.195844) (xy 4.552749 -7.192321) (xy 4.473430 -7.189170)
(xy 4.373312 -7.186429) (xy 4.257514 -7.184136) (xy 4.131157 -7.182327) (xy 3.999362 -7.181040) (xy 3.867249 -7.180313) (xy 3.739938 -7.180182) (xy 3.622550 -7.180686) (xy 3.520205 -7.181861)
(xy 3.438023 -7.183745) (xy 3.381126 -7.186375) (xy 3.354633 -7.189789) (xy 3.353570 -7.190398) (xy 3.343683 -7.217478) (xy 3.343852 -7.256693) (xy 3.352323 -7.291504) (xy 3.365772 -7.305413)
(xy 3.409870 -7.307099) (xy 3.481477 -7.308275) (xy 3.575485 -7.308974) (xy 3.686786 -7.309234) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 4.639907 -9.669345) (xy 4.751876 -9.667153) (xy 4.841021 -9.662666) (xy 4.910040 -9.655756) (xy 4.961627 -9.646295) (xy 4.998478 -9.634153) (xy 5.023289 -9.619203) (xy 5.037025 -9.604040)
(xy 5.050424 -9.556432) (xy 5.042732 -9.501331) (xy 5.017704 -9.459683) (xy 4.987031 -9.441496) (xy 4.941354 -9.432200) (xy 4.874866 -9.431539) (xy 4.781764 -9.439256) (xy 4.720663 -9.446524)
(xy 4.654224 -9.453317) (xy 4.561943 -9.460504) (xy 4.454300 -9.467377) (xy 4.341774 -9.473225) (xy 4.299039 -9.475067) (xy 4.010454 -9.486699) (xy 4.024653 -8.745031) (xy 4.027897 -8.573089)
(xy 4.031015 -8.402986) (xy 4.033912 -8.240326) (xy 4.036491 -8.090709) (xy 4.038656 -7.959738) (xy 4.040310 -7.853015) (xy 4.041359 -7.776143) (xy 4.041462 -7.767168) (xy 4.044070 -7.530973)
(xy 4.234088 -7.526195) (xy 4.318471 -7.525489) (xy 4.428005 -7.526647) (xy 4.551565 -7.529440) (xy 4.678026 -7.533641) (xy 4.751144 -7.536765) (xy 4.884178 -7.542157) (xy 4.985250 -7.543673)
(xy 5.058609 -7.540504) (xy 5.108503 -7.531842) (xy 5.139177 -7.516877) (xy 5.154879 -7.494801) (xy 5.159857 -7.464804) (xy 5.159943 -7.458909) (xy 5.144281 -7.414680) (xy 5.106598 -7.377885)
(xy 5.060850 -7.361081) (xy 5.051429 -7.361277) (xy 5.014838 -7.365042) (xy 4.963693 -7.370234) (xy 4.960086 -7.370598) (xy 4.913020 -7.376698) (xy 4.842835 -7.387386) (xy 4.762154 -7.400705)
(xy 4.733569 -7.405663) (xy 4.688329 -7.412789) (xy 4.639599 -7.418452) (xy 4.583448 -7.422718) (xy 4.515948 -7.425654) (xy 4.433169 -7.427327) (xy 4.331180 -7.427803) (xy 4.206052 -7.427149)
(xy 4.053855 -7.425431) (xy 3.870659 -7.422717) (xy 3.797278 -7.421523) (xy 3.608601 -7.418489) (xy 3.452956 -7.416263) (xy 3.327045 -7.414918) (xy 3.227570 -7.414530) (xy 3.151233 -7.415173)
(xy 3.094737 -7.416921) (xy 3.054782 -7.419849) (xy 3.028071 -7.424031) (xy 3.011307 -7.429542) (xy 3.001190 -7.436457) (xy 2.998310 -7.439579) (xy 2.982590 -7.474839) (xy 2.991789 -7.500701)
(xy 3.001855 -7.510747) (xy 3.020810 -7.518480) (xy 3.053217 -7.524282) (xy 3.103636 -7.528535) (xy 3.176630 -7.531622) (xy 3.276761 -7.533925) (xy 3.408590 -7.535826) (xy 3.411131 -7.535858)
(xy 3.541463 -7.537542) (xy 3.640072 -7.539328) (xy 3.711567 -7.541723) (xy 3.760561 -7.545234) (xy 3.791664 -7.550369) (xy 3.809488 -7.557635) (xy 3.818644 -7.567539) (xy 3.823742 -7.580589)
(xy 3.823957 -7.581280) (xy 3.827833 -7.595104) (xy 3.831202 -7.611785) (xy 3.834205 -7.634546) (xy 3.836982 -7.666611) (xy 3.839674 -7.711204) (xy 3.842420 -7.771549) (xy 3.845362 -7.850870)
(xy 3.848638 -7.952389) (xy 3.852391 -8.079333) (xy 3.856759 -8.234923) (xy 3.861883 -8.422384) (xy 3.864067 -8.503005) (xy 3.869778 -8.719760) (xy 3.874215 -8.902932) (xy 3.877370 -9.055254)
(xy 3.879235 -9.179458) (xy 3.879799 -9.278278) (xy 3.879055 -9.354446) (xy 3.876993 -9.410695) (xy 3.873605 -9.449757) (xy 3.868882 -9.474366) (xy 3.862815 -9.487253) (xy 3.860872 -9.489135)
(xy 3.837005 -9.493409) (xy 3.783938 -9.495470) (xy 3.708743 -9.495262) (xy 3.618495 -9.492727) (xy 3.585754 -9.491331) (xy 3.328805 -9.479427) (xy 3.298304 -9.525977) (xy 3.278608 -9.569959)
(xy 3.286325 -9.607135) (xy 3.293260 -9.616599) (xy 3.305399 -9.624351) (xy 3.326473 -9.630695) (xy 3.360212 -9.635933) (xy 3.410346 -9.640367) (xy 3.480605 -9.644301) (xy 3.574721 -9.648036)
(xy 3.696423 -9.651877) (xy 3.849441 -9.656124) (xy 3.909898 -9.657732) (xy 4.140112 -9.663436) (xy 4.336721 -9.667358) (xy 4.502421 -9.669370) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 6.135435 -10.290202) (xy 6.162680 -10.251080) (xy 6.195588 -10.186402) (xy 6.231775 -10.093797) (xy 6.248039 -10.014259) (xy 6.243772 -9.953469) (xy 6.223979 -9.921136) (xy 6.187019 -9.909651)
(xy 6.149270 -9.928618) (xy 6.117831 -9.973018) (xy 6.106387 -10.004294) (xy 6.073484 -10.082397) (xy 6.028723 -10.126745) (xy 5.974538 -10.136678) (xy 5.913361 -10.111531) (xy 5.865131 -10.070065)
(xy 5.793751 -9.980066) (xy 5.751563 -9.891718) (xy 5.739366 -9.809111) (xy 5.757957 -9.736337) (xy 5.791309 -9.691885) (xy 5.878965 -9.625802) (xy 5.976699 -9.589646) (xy 6.091826 -9.581064)
(xy 6.128738 -9.583329) (xy 6.215394 -9.587258) (xy 6.270694 -9.580450) (xy 6.298334 -9.561744) (xy 6.302013 -9.529979) (xy 6.301823 -9.528974) (xy 6.278328 -9.496447) (xy 6.227408 -9.471926)
(xy 6.157340 -9.456663) (xy 6.076403 -9.451910) (xy 5.992876 -9.458917) (xy 5.932117 -9.473080) (xy 5.806206 -9.526384) (xy 5.708450 -9.597457) (xy 5.641542 -9.684320) (xy 5.639794 -9.687617)
(xy 5.616062 -9.769668) (xy 5.619118 -9.865667) (xy 5.646995 -9.967346) (xy 5.697726 -10.066438) (xy 5.744789 -10.128715) (xy 5.816558 -10.200310) (xy 5.884070 -10.243336) (xy 5.956860 -10.262845)
(xy 6.002818 -10.265379) (xy 6.054454 -10.269102) (xy 6.089270 -10.278488) (xy 6.095636 -10.283548) (xy 6.114033 -10.300105) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.394028 -12.601339) (xy 0.442772 -12.568276) (xy 0.462341 -12.547009) (xy 0.477166 -12.519475) (xy 0.489162 -12.478660) (xy 0.500245 -12.417553) (xy 0.512329 -12.329138) (xy 0.515936 -12.300286)
(xy 0.529855 -12.197206) (xy 0.546030 -12.092138) (xy 0.562290 -11.998507) (xy 0.574413 -11.938576) (xy 0.604812 -11.803977) (xy 0.645924 -11.917517) (xy 0.678780 -11.996452) (xy 0.719499 -12.078541)
(xy 0.746197 -12.124792) (xy 0.789972 -12.198763) (xy 0.837599 -12.286490) (xy 0.882382 -12.375004) (xy 0.917628 -12.451337) (xy 0.928404 -12.477758) (xy 0.962556 -12.521754) (xy 1.015578 -12.542869)
(xy 1.075181 -12.536914) (xy 1.087263 -12.531890) (xy 1.118360 -12.510434) (xy 1.136229 -12.476285) (xy 1.147031 -12.418147) (xy 1.157745 -12.354697) (xy 1.171525 -12.299286) (xy 1.177575 -12.282118)
(xy 1.191903 -12.242707) (xy 1.212019 -12.180872) (xy 1.233857 -12.109165) (xy 1.236419 -12.100429) (xy 1.257007 -12.033241) (xy 1.271629 -11.996455) (xy 1.283149 -11.985223) (xy 1.294430 -11.994701)
(xy 1.296719 -11.998337) (xy 1.331765 -12.054561) (xy 1.377358 -12.124727) (xy 1.428425 -12.201372) (xy 1.479892 -12.277034) (xy 1.526685 -12.344250) (xy 1.563730 -12.395559) (xy 1.585416 -12.422926)
(xy 1.634060 -12.452453) (xy 1.700652 -12.465048) (xy 1.769920 -12.458500) (xy 1.789072 -12.452420) (xy 1.810985 -12.431532) (xy 1.842081 -12.386566) (xy 1.876328 -12.326444) (xy 1.882931 -12.313573)
(xy 1.925116 -12.234269) (xy 1.972593 -12.151661) (xy 2.012640 -12.087430) (xy 2.048261 -12.035163) (xy 2.070680 -12.009126) (xy 2.086345 -12.004982) (xy 2.101702 -12.018394) (xy 2.106498 -12.024294)
(xy 2.122228 -12.042711) (xy 2.139552 -12.057680) (xy 2.162045 -12.069453) (xy 2.193284 -12.078285) (xy 2.236842 -12.084429) (xy 2.296295 -12.088140) (xy 2.375219 -12.089670) (xy 2.477189 -12.089275)
(xy 2.605780 -12.087207) (xy 2.764568 -12.083721) (xy 2.898372 -12.080505) (xy 3.099777 -12.075578) (xy 3.267967 -12.071335) (xy 3.406053 -12.067565) (xy 3.517146 -12.064058) (xy 3.604359 -12.060603)
(xy 3.670801 -12.056989) (xy 3.719585 -12.053004) (xy 3.753822 -12.048439) (xy 3.776624 -12.043083) (xy 3.791101 -12.036724) (xy 3.800365 -12.029152) (xy 3.807527 -12.020155) (xy 3.808494 -12.018832)
(xy 3.821157 -12.006807) (xy 3.842697 -11.997449) (xy 3.878255 -11.990068) (xy 3.932974 -11.983968) (xy 4.011994 -11.978457) (xy 4.120457 -11.972841) (xy 4.164693 -11.970796) (xy 4.288241 -11.965020)
(xy 4.415469 -11.958772) (xy 4.535398 -11.952613) (xy 4.637047 -11.947101) (xy 4.687553 -11.944165) (xy 4.878326 -11.932597) (xy 4.964270 -12.043331) (xy 5.015241 -12.102668) (xy 5.062092 -12.145932)
(xy 5.095971 -12.165548) (xy 5.138647 -12.167624) (xy 5.200194 -12.160830) (xy 5.246218 -12.151530) (xy 5.300810 -12.136792) (xy 5.337519 -12.119698) (xy 5.366373 -12.091956) (xy 5.397398 -12.045280)
(xy 5.418845 -12.008839) (xy 5.464549 -11.919694) (xy 5.484662 -11.848961) (xy 5.479402 -11.789471) (xy 5.448984 -11.734057) (xy 5.427932 -11.709382) (xy 5.362962 -11.660230) (xy 5.281178 -11.627912)
(xy 5.192450 -11.613332) (xy 5.106645 -11.617393) (xy 5.033634 -11.640999) (xy 4.995311 -11.669757) (xy 4.967338 -11.693129) (xy 4.932248 -11.703955) (xy 4.877580 -11.705288) (xy 4.854574 -11.704243)
(xy 4.797864 -11.704850) (xy 4.715447 -11.710426) (xy 4.617478 -11.720080) (xy 4.514114 -11.732922) (xy 4.491989 -11.736039) (xy 4.383633 -11.750107) (xy 4.273468 -11.761754) (xy 4.173514 -11.769868)
(xy 4.095789 -11.773339) (xy 4.087733 -11.773391) (xy 3.942632 -11.773391) (xy 3.942500 -11.232869) (xy 3.943262 -11.079321) (xy 3.945476 -10.922455) (xy 3.948927 -10.770241) (xy 3.953400 -10.630647)
(xy 3.958678 -10.511640) (xy 3.964403 -10.422942) (xy 3.986437 -10.153537) (xy 4.359706 -10.154936) (xy 4.512518 -10.155457) (xy 4.633023 -10.155457) (xy 4.725251 -10.154503) (xy 4.793234 -10.152160)
(xy 4.841002 -10.147998) (xy 4.872586 -10.141581) (xy 4.892016 -10.132478) (xy 4.903323 -10.120255) (xy 4.910538 -10.104480) (xy 4.913767 -10.095416) (xy 4.922629 -10.054310) (xy 4.907732 -10.025251)
(xy 4.889574 -10.009114) (xy 4.850525 -9.981579) (xy 4.821356 -9.979079) (xy 4.785622 -10.001603) (xy 4.776348 -10.009022) (xy 4.733191 -10.032454) (xy 4.692017 -10.027428) (xy 4.655473 -10.021997)
(xy 4.591088 -10.020803) (xy 4.507108 -10.023826) (xy 4.446257 -10.028016) (xy 4.314068 -10.034551) (xy 4.172110 -10.034733) (xy 4.046088 -10.028738) (xy 3.963473 -10.023104) (xy 3.893071 -10.020185)
(xy 3.843523 -10.020226) (xy 3.824976 -10.022445) (xy 3.798760 -10.026009) (xy 3.743321 -10.029410) (xy 3.665773 -10.032343) (xy 3.573230 -10.034501) (xy 3.530748 -10.035112) (xy 3.261302 -10.038269)
(xy 3.261302 -10.147282) (xy 3.517471 -10.152306) (xy 3.773640 -10.157331) (xy 3.795867 -10.424839) (xy 3.802779 -10.534528) (xy 3.808040 -10.674113) (xy 3.811524 -10.837184) (xy 3.813106 -11.017333)
(xy 3.812658 -11.208148) (xy 3.812230 -11.255229) (xy 3.806366 -11.818112) (xy 3.732335 -11.812761) (xy 3.666948 -11.816679) (xy 3.635283 -11.835150) (xy 3.612971 -11.852991) (xy 3.585665 -11.845756)
(xy 3.573047 -11.838240) (xy 3.536778 -11.824274) (xy 3.485966 -11.823215) (xy 3.433905 -11.830062) (xy 3.389366 -11.834808) (xy 3.314352 -11.839854) (xy 3.214720 -11.844934) (xy 3.096328 -11.849783)
(xy 2.965033 -11.854133) (xy 2.826693 -11.857720) (xy 2.822646 -11.857810) (xy 2.668735 -11.861432) (xy 2.547137 -11.863977) (xy 2.453829 -11.864310) (xy 2.384788 -11.861291) (xy 2.335989 -11.853784)
(xy 2.303408 -11.840651) (xy 2.283021 -11.820755) (xy 2.270806 -11.792958) (xy 2.262737 -11.756124) (xy 2.254792 -11.709114) (xy 2.252544 -11.696662) (xy 2.226858 -11.615050) (xy 2.186709 -11.560859)
(xy 2.135044 -11.537767) (xy 2.124751 -11.537196) (xy 2.078675 -11.553420) (xy 2.033167 -11.595998) (xy 1.996581 -11.655789) (xy 1.983562 -11.691697) (xy 1.962702 -11.742527) (xy 1.926613 -11.808219)
(xy 1.882777 -11.875268) (xy 1.878902 -11.880640) (xy 1.848348 -11.924027) (xy 5.003551 -11.924027) (xy 5.006932 -11.869079) (xy 5.016111 -11.815809) (xy 5.029093 -11.776863) (xy 5.039992 -11.764695)
(xy 5.067854 -11.756474) (xy 5.117056 -11.741498) (xy 5.150858 -11.731081) (xy 5.213604 -11.712319) (xy 5.253843 -11.704625) (xy 5.283798 -11.708379) (xy 5.315690 -11.723959) (xy 5.337088 -11.736854)
(xy 5.377955 -11.770856) (xy 5.394596 -11.812728) (xy 5.387842 -11.869684) (xy 5.360869 -11.943500) (xy 5.334111 -11.996264) (xy 5.303873 -12.025831) (xy 5.257331 -12.044121) (xy 5.250624 -12.045967)
(xy 5.182869 -12.053240) (xy 5.113891 -12.043169) (xy 5.054536 -12.019238) (xy 5.015647 -11.984930) (xy 5.007958 -11.968009) (xy 5.003551 -11.924027) (xy 1.848348 -11.924027) (xy 1.827734 -11.953298)
(xy 1.775874 -12.030689) (xy 1.735813 -12.094012) (xy 1.677278 -12.191182) (xy 1.592208 -12.041335) (xy 1.546267 -11.952118) (xy 1.501532 -11.851354) (xy 1.466351 -11.758123) (xy 1.461016 -11.741474)
(xy 1.435790 -11.664854) (xy 1.414152 -11.615354) (xy 1.391438 -11.584705) (xy 1.362988 -11.564638) (xy 1.360616 -11.563392) (xy 1.310984 -11.545548) (xy 1.266510 -11.548721) (xy 1.224588 -11.575623)
(xy 1.182611 -11.628968) (xy 1.137974 -11.711469) (xy 1.088071 -11.825839) (xy 1.073407 -11.862407) (xy 0.986112 -12.083110) (xy 0.922217 -12.012387) (xy 0.869223 -11.939432) (xy 0.823803 -11.844410)
(xy 0.783886 -11.722249) (xy 0.754357 -11.600787) (xy 0.733291 -11.506545) (xy 0.716255 -11.442446) (xy 0.700219 -11.402986) (xy 0.682155 -11.382663) (xy 0.659034 -11.375974) (xy 0.631235 -11.377078)
(xy 0.593722 -11.384556) (xy 0.571291 -11.404480) (xy 0.554393 -11.447049) (xy 0.549321 -11.464521) (xy 0.520295 -11.563453) (xy 0.486842 -11.670516) (xy 0.450822 -11.780501) (xy 0.414094 -11.888193)
(xy 0.378517 -11.988383) (xy 0.345950 -12.075858) (xy 0.318253 -12.145406) (xy 0.297285 -12.191816) (xy 0.284905 -12.209876) (xy 0.283545 -12.209554) (xy 0.265952 -12.184907) (xy 0.238054 -12.138637)
(xy 0.209996 -12.088280) (xy 0.179578 -12.032995) (xy 0.151855 -11.990479) (xy 0.121737 -11.959131) (xy 0.084136 -11.937351) (xy 0.033965 -11.923539) (xy -0.033867 -11.916094) (xy -0.124446 -11.913417)
(xy -0.242861 -11.913906) (xy -0.340314 -11.915208) (xy -0.464768 -11.917616) (xy -0.584906 -11.921115) (xy -0.693117 -11.925394) (xy -0.781787 -11.930143) (xy -0.843305 -11.935053) (xy -0.851932 -11.936058)
(xy -0.972032 -11.951357) (xy -1.053791 -11.864626) (xy -1.124230 -11.799936) (xy -1.187203 -11.767019) (xy -1.249594 -11.764263) (xy -1.318285 -11.790056) (xy -1.334178 -11.798963) (xy -1.420421 -11.869183)
(xy -1.478355 -11.960132) (xy -1.500002 -12.042544) (xy -1.374987 -12.042544) (xy -1.368988 -11.972761) (xy -1.339880 -11.910044) (xy -1.301608 -11.872596) (xy -1.248816 -11.848636) (xy -1.196421 -11.854617)
(xy -1.138757 -11.892004) (xy -1.105837 -11.923284) (xy -1.045638 -11.986867) (xy -1.009036 -12.032255) (xy -0.993307 -12.066302) (xy -0.995726 -12.095862) (xy -1.013569 -12.127792) (xy -1.020633 -12.137647)
(xy -1.075745 -12.193509) (xy -1.143386 -12.221674) (xy -1.210277 -12.227611) (xy -1.275522 -12.211926) (xy -1.326135 -12.170363) (xy -1.359996 -12.111157) (xy -1.374987 -12.042544) (xy -1.500002 -12.042544)
(xy -1.503706 -12.056644) (xy -1.506778 -12.106178) (xy -1.498017 -12.140849) (xy -1.471359 -12.175195) (xy -1.442516 -12.203331) (xy -1.391321 -12.244325) (xy -1.327052 -12.285894) (xy -1.260533 -12.322074)
(xy -1.202584 -12.346899) (xy -1.168095 -12.354615) (xy -1.135786 -12.342749) (xy -1.088181 -12.311994) (xy -1.034658 -12.270138) (xy -0.984594 -12.224969) (xy -0.947365 -12.184276) (xy -0.932875 -12.159258)
(xy -0.921736 -12.114876) (xy -0.710689 -12.125643) (xy -0.600738 -12.131215) (xy -0.473155 -12.137625) (xy -0.346604 -12.143936) (xy -0.271806 -12.147638) (xy -0.043969 -12.158866) (xy -0.004899 -12.226751)
(xy 0.033614 -12.286233) (xy 0.085376 -12.356301) (xy 0.143557 -12.428746) (xy 0.201327 -12.495358) (xy 0.251854 -12.547930) (xy 0.286733 -12.577265) (xy 0.344992 -12.604734) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -6.523779 -11.872380) (xy -6.510432 -11.848866) (xy -6.499451 -11.828848) (xy -6.474022 -11.821019) (xy -6.424259 -11.822806) (xy -6.413950 -11.823757) (xy -6.314336 -11.817606) (xy -6.230115 -11.778543)
(xy -6.161314 -11.706583) (xy -6.129247 -11.651345) (xy -6.093591 -11.539380) (xy -6.086571 -11.416095) (xy -6.105775 -11.289055) (xy -6.148791 -11.165820) (xy -6.213207 -11.053952) (xy -6.296612 -10.961014)
(xy -6.365344 -10.911070) (xy -6.443124 -10.875411) (xy -6.521168 -10.856396) (xy -6.588494 -10.855903) (xy -6.622532 -10.867096) (xy -6.711830 -10.937648) (xy -6.773814 -11.030868) (xy -6.808998 -11.147775)
(xy -6.816036 -11.230579) (xy -6.688312 -11.230579) (xy -6.679225 -11.166529) (xy -6.668299 -11.136538) (xy -6.629520 -11.077369) (xy -6.582636 -11.028245) (xy -6.536913 -10.997816) (xy -6.513650 -10.992132)
(xy -6.474201 -11.002624) (xy -6.426290 -11.028491) (xy -6.417410 -11.034737) (xy -6.335975 -11.110933) (xy -6.273569 -11.201654) (xy -6.231269 -11.300605) (xy -6.210149 -11.401491) (xy -6.211283 -11.498018)
(xy -6.235747 -11.583892) (xy -6.284616 -11.652818) (xy -6.308517 -11.672359) (xy -6.364445 -11.695460) (xy -6.428430 -11.698888) (xy -6.488834 -11.684733) (xy -6.534016 -11.655085) (xy -6.549527 -11.629081)
(xy -6.572409 -11.599014) (xy -6.594109 -11.591703) (xy -6.620893 -11.574901) (xy -6.645009 -11.529911) (xy -6.665133 -11.464858) (xy -6.679941 -11.387869) (xy -6.688109 -11.307067) (xy -6.688312 -11.230579)
(xy -6.816036 -11.230579) (xy -6.818161 -11.255580) (xy -6.816075 -11.326016) (xy -6.806459 -11.393399) (xy -6.786868 -11.469604) (xy -6.754855 -11.566507) (xy -6.753091 -11.571523) (xy -6.721050 -11.655920)
(xy -6.687429 -11.733711) (xy -6.656926 -11.794518) (xy -6.640002 -11.821345) (xy -6.597136 -11.863557) (xy -6.555912 -11.881096) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -2.759860 -13.251935) (xy -2.750946 -13.242429) (xy -2.729882 -13.237112) (xy -2.678017 -13.233509) (xy -2.600841 -13.231535) (xy -2.503847 -13.231106) (xy -2.392525 -13.232138) (xy -2.272368 -13.234546)
(xy -2.148867 -13.238247) (xy -2.027514 -13.243156) (xy -1.913799 -13.249189) (xy -1.813215 -13.256261) (xy -1.805144 -13.256933) (xy -1.736879 -13.261761) (xy -1.695622 -13.260804) (xy -1.672276 -13.252397)
(xy -1.657744 -13.234875) (xy -1.654700 -13.229395) (xy -1.647057 -13.180860) (xy -1.665369 -13.129205) (xy -1.702912 -13.087199) (xy -1.738663 -13.069949) (xy -1.770609 -13.066866) (xy -1.832835 -13.065054)
(xy -1.919305 -13.064533) (xy -2.023980 -13.065320) (xy -2.140826 -13.067433) (xy -2.188010 -13.068610) (xy -2.309854 -13.071358) (xy -2.423647 -13.072939) (xy -2.522890 -13.073341) (xy -2.601085 -13.072550)
(xy -2.651731 -13.070554) (xy -2.661731 -13.069570) (xy -2.734407 -13.059746) (xy -2.734620 -12.245636) (xy -2.734760 -12.051329) (xy -2.735150 -11.890115) (xy -2.735913 -11.758749) (xy -2.737168 -11.653985)
(xy -2.739038 -11.572580) (xy -2.741645 -11.511289) (xy -2.745109 -11.466866) (xy -2.749553 -11.436067) (xy -2.755098 -11.415648) (xy -2.761865 -11.402363) (xy -2.766415 -11.396629) (xy -2.790472 -11.363203)
(xy -2.797997 -11.342395) (xy -2.812591 -11.319980) (xy -2.826737 -11.312030) (xy -2.851630 -11.309242) (xy -2.908084 -11.306714) (xy -2.991321 -11.304536) (xy -3.096565 -11.302803) (xy -3.219037 -11.301605)
(xy -3.353962 -11.301036) (xy -3.396830 -11.301002) (xy -3.554531 -11.301229) (xy -3.679715 -11.302036) (xy -3.776200 -11.303608) (xy -3.847802 -11.306132) (xy -3.898340 -11.309792) (xy -3.931632 -11.314774)
(xy -3.951496 -11.321266) (xy -3.960977 -11.328466) (xy -3.966967 -11.351449) (xy -3.970819 -11.403935) (xy -3.972516 -11.486730) (xy -3.972042 -11.600642) (xy -3.969380 -11.746477) (xy -3.964515 -11.925041)
(xy -3.957429 -12.137141) (xy -3.948107 -12.383582) (xy -3.936531 -12.665173) (xy -3.931459 -12.783400) (xy -3.920361 -13.039403) (xy -4.143291 -13.051390) (xy -4.251427 -13.056373) (xy -4.366998 -13.060343)
(xy -4.473899 -13.062809) (xy -4.535972 -13.063377) (xy -4.705723 -13.063377) (xy -4.706038 -12.768133) (xy -4.704956 -12.666866) (xy -4.701747 -12.538213) (xy -4.696740 -12.391045) (xy -4.690260 -12.234230)
(xy -4.682636 -12.076639) (xy -4.676303 -11.962242) (xy -4.646254 -11.451593) (xy -4.688954 -11.393838) (xy -4.706761 -11.370366) (xy -4.724182 -11.352609) (xy -4.746639 -11.339181) (xy -4.779555 -11.328697)
(xy -4.828351 -11.319774) (xy -4.898450 -11.311027) (xy -4.995273 -11.301070) (xy -5.087268 -11.292114) (xy -5.215978 -11.279923) (xy -5.313420 -11.271634) (xy -5.384449 -11.267184) (xy -5.433916 -11.266504)
(xy -5.466676 -11.269530) (xy -5.487579 -11.276194) (xy -5.501481 -11.286431) (xy -5.501517 -11.286467) (xy -5.517438 -11.316369) (xy -5.522867 -11.353915) (xy -5.517193 -11.383753) (xy -5.505721 -11.391846)
(xy -5.495267 -11.404971) (xy -5.497681 -11.416756) (xy -5.493754 -11.447884) (xy -5.477644 -11.471263) (xy -5.460941 -11.482728) (xy -5.433694 -11.490879) (xy -5.390307 -11.496238) (xy -5.325184 -11.499328)
(xy -5.232727 -11.500672) (xy -5.160916 -11.500859) (xy -4.873784 -11.500859) (xy -4.862429 -11.557636) (xy -4.857686 -11.601903) (xy -4.854236 -11.676996) (xy -4.852035 -11.777430) (xy -4.851039 -11.897720)
(xy -4.851202 -12.032378) (xy -4.852480 -12.175919) (xy -4.854829 -12.322857) (xy -4.858204 -12.467706) (xy -4.862561 -12.604979) (xy -4.867854 -12.729192) (xy -4.872641 -12.814049) (xy -4.894682 -13.155208)
(xy -4.850067 -13.199823) (xy -4.829469 -13.219180) (xy -4.809078 -13.231273) (xy -4.781190 -13.236945) (xy -4.738099 -13.237039) (xy -4.672100 -13.232398) (xy -4.605695 -13.226565) (xy -4.515327 -13.221022)
(xy -4.400909 -13.217779) (xy -4.274662 -13.216986) (xy -4.148810 -13.218788) (xy -4.096940 -13.220433) (xy -3.980642 -13.224374) (xy -3.895503 -13.225898) (xy -3.836410 -13.224781) (xy -3.798248 -13.220802)
(xy -3.775906 -13.213737) (xy -3.766232 -13.206014) (xy -3.761161 -13.181329) (xy -3.757709 -13.123773) (xy -3.755823 -13.036775) (xy -3.755448 -12.923762) (xy -3.756532 -12.788162) (xy -3.759022 -12.633405)
(xy -3.762863 -12.462917) (xy -3.768002 -12.280128) (xy -3.774387 -12.088465) (xy -3.781963 -11.891356) (xy -3.789363 -11.720734) (xy -3.801329 -11.459137) (xy -3.576738 -11.471249) (xy -3.464220 -11.477392)
(xy -3.340395 -11.484271) (xy -3.223078 -11.490892) (xy -3.156831 -11.494696) (xy -2.961517 -11.506030) (xy -2.961517 -12.339780) (xy -2.961443 -12.535989) (xy -2.961144 -12.698980) (xy -2.960501 -12.831870)
(xy -2.959399 -12.937780) (xy -2.957719 -13.019828) (xy -2.955344 -13.081132) (xy -2.952157 -13.124813) (xy -2.948042 -13.153987) (xy -2.942879 -13.171775) (xy -2.936553 -13.181296) (xy -2.929721 -13.185390)
(xy -2.892979 -13.209710) (xy -2.874185 -13.230242) (xy -2.840339 -13.254901) (xy -2.796705 -13.262679) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 7.005625 -12.306397) (xy 7.061631 -12.274759) (xy 7.105026 -12.230345) (xy 7.131419 -12.179957) (xy 7.136419 -12.130400) (xy 7.115635 -12.088477) (xy 7.098532 -12.075009) (xy 7.073398 -12.066903)
(xy 7.047845 -12.080383) (xy 7.016772 -12.114220) (xy 6.961437 -12.161748) (xy 6.904405 -12.172990) (xy 6.845993 -12.147938) (xy 6.812440 -12.117673) (xy 6.765389 -12.056845) (xy 6.748008 -12.005006)
(xy 6.761548 -11.960707) (xy 6.807258 -11.922499) (xy 6.886387 -11.888936) (xy 7.000184 -11.858567) (xy 7.043885 -11.849336) (xy 7.141988 -11.825248) (xy 7.204131 -11.799549) (xy 7.230662 -11.771972)
(xy 7.221935 -11.742251) (xy 7.205004 -11.726905) (xy 7.165499 -11.708478) (xy 7.110663 -11.703607) (xy 7.034432 -11.712472) (xy 6.931402 -11.735091) (xy 6.806193 -11.773257) (xy 6.714449 -11.817984)
(xy 6.653568 -11.871397) (xy 6.620947 -11.935624) (xy 6.613448 -11.995061) (xy 6.620054 -12.062702) (xy 6.643700 -12.121370) (xy 6.690126 -12.183503) (xy 6.711014 -12.206450) (xy 6.786380 -12.272868)
(xy 6.862506 -12.308639) (xy 6.941401 -12.318455) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 6.635481 -12.595241) (xy 6.662028 -12.573190) (xy 6.665237 -12.534246) (xy 6.645327 -12.489185) (xy 6.633029 -12.474061) (xy 6.610352 -12.440744) (xy 6.579578 -12.383747) (xy 6.546001 -12.313173)
(xy 6.532424 -12.282118) (xy 6.487856 -12.178461) (xy 6.441605 -12.072851) (xy 6.397071 -11.972876) (xy 6.357656 -11.886125) (xy 6.326760 -11.820186) (xy 6.312586 -11.791560) (xy 6.281189 -11.757311)
(xy 6.239341 -11.740400) (xy 6.200554 -11.744276) (xy 6.183909 -11.758723) (xy 6.166598 -11.794650) (xy 6.141339 -11.858418) (xy 6.110626 -11.943065) (xy 6.076956 -12.041627) (xy 6.042826 -12.147143)
(xy 6.030836 -12.185720) (xy 6.004900 -12.265994) (xy 5.978899 -12.339524) (xy 5.956980 -12.394831) (xy 5.949506 -12.410807) (xy 5.931845 -12.469559) (xy 5.940122 -12.518155) (xy 5.971377 -12.548517)
(xy 6.002178 -12.554650) (xy 6.040439 -12.547525) (xy 6.069152 -12.522218) (xy 6.092311 -12.472828) (xy 6.113910 -12.393452) (xy 6.115242 -12.387616) (xy 6.133531 -12.315874) (xy 6.156765 -12.237481)
(xy 6.182215 -12.160173) (xy 6.207155 -12.091685) (xy 6.228859 -12.039752) (xy 6.244600 -12.012111) (xy 6.248496 -12.009585) (xy 6.259731 -12.024974) (xy 6.283006 -12.066759) (xy 6.315078 -12.128369)
(xy 6.352704 -12.203232) (xy 6.392643 -12.284776) (xy 6.431652 -12.366431) (xy 6.466488 -12.441625) (xy 6.493908 -12.503785) (xy 6.502016 -12.523385) (xy 6.538308 -12.572301) (xy 6.591615 -12.596858)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -6.147453 -13.732288) (xy -6.101865 -13.725821) (xy -6.082062 -13.710551) (xy -6.077494 -13.677394) (xy -6.077468 -13.672032) (xy -6.080037 -13.639440) (xy -6.093928 -13.621531) (xy -6.128417 -13.611548)
(xy -6.168312 -13.605844) (xy -6.243237 -13.592665) (xy -6.305322 -13.575204) (xy -6.346432 -13.556240) (xy -6.358807 -13.540758) (xy -6.343329 -13.527859) (xy -6.301285 -13.502846) (xy -6.238921 -13.469213)
(xy -6.162485 -13.430453) (xy -6.154968 -13.426753) (xy -6.061291 -13.379090) (xy -5.995470 -13.341047) (xy -5.951644 -13.308698) (xy -5.923952 -13.278114) (xy -5.917170 -13.267420) (xy -5.893217 -13.199976)
(xy -5.903542 -13.142523) (xy -5.947558 -13.097445) (xy -5.960997 -13.089789) (xy -6.028289 -13.067528) (xy -6.116684 -13.055017) (xy -6.212102 -13.052918) (xy -6.300464 -13.061892) (xy -6.341330 -13.071908)
(xy -6.424870 -13.108375) (xy -6.479301 -13.153017) (xy -6.502318 -13.202848) (xy -6.491615 -13.254880) (xy -6.487721 -13.261502) (xy -6.473027 -13.273122) (xy -6.446947 -13.269890) (xy -6.401447 -13.250008)
(xy -6.374444 -13.236172) (xy -6.303196 -13.207318) (xy -6.224644 -13.188652) (xy -6.149040 -13.181205) (xy -6.086636 -13.186007) (xy -6.048363 -13.203391) (xy -6.046147 -13.215854) (xy -6.063216 -13.233624)
(xy -6.103225 -13.259076) (xy -6.169829 -13.294586) (xy -6.249700 -13.334266) (xy -6.335913 -13.377728) (xy -6.413484 -13.419405) (xy -6.474797 -13.455028) (xy -6.512239 -13.480327) (xy -6.515987 -13.483578)
(xy -6.551192 -13.534039) (xy -6.555142 -13.584516) (xy -6.527724 -13.626800) (xy -6.518062 -13.633813) (xy -6.463762 -13.660156) (xy -6.387848 -13.686646) (xy -6.303223 -13.709855) (xy -6.222792 -13.726354)
(xy -6.159460 -13.732713) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -6.540773 -13.953648) (xy -6.510101 -13.926119) (xy -6.510288 -13.889537) (xy -6.541373 -13.838915) (xy -6.541672 -13.838534) (xy -6.561413 -13.806397) (xy -6.592192 -13.748062) (xy -6.630637 -13.670691)
(xy -6.673376 -13.581445) (xy -6.717038 -13.487487) (xy -6.758251 -13.395977) (xy -6.793643 -13.314076) (xy -6.819843 -13.248947) (xy -6.822090 -13.242922) (xy -6.844898 -13.188205) (xy -6.868300 -13.142126)
(xy -6.870529 -13.138452) (xy -6.905707 -13.108117) (xy -6.949538 -13.100877) (xy -6.986650 -13.118800) (xy -6.989684 -13.122425) (xy -7.005412 -13.152615) (xy -7.029223 -13.209857) (xy -7.058345 -13.286527)
(xy -7.090002 -13.375000) (xy -7.121423 -13.467651) (xy -7.149833 -13.556856) (xy -7.159852 -13.590272) (xy -7.182979 -13.663119) (xy -7.206719 -13.728222) (xy -7.226302 -13.772594) (xy -7.227937 -13.775546)
(xy -7.244005 -13.829126) (xy -7.234313 -13.877237) (xy -7.203054 -13.909575) (xy -7.170211 -13.917311) (xy -7.141105 -13.914163) (xy -7.118482 -13.900979) (xy -7.099232 -13.872146) (xy -7.080242 -13.822053)
(xy -7.058401 -13.745087) (xy -7.044281 -13.690201) (xy -7.012391 -13.572401) (xy -6.982687 -13.478834) (xy -6.956386 -13.412751) (xy -6.934705 -13.377407) (xy -6.925320 -13.372246) (xy -6.912659 -13.387797)
(xy -6.888183 -13.430342) (xy -6.854951 -13.493724) (xy -6.816022 -13.571784) (xy -6.774457 -13.658363) (xy -6.733313 -13.747303) (xy -6.695652 -13.832445) (xy -6.689168 -13.847624) (xy -6.648811 -13.919768)
(xy -6.604094 -13.957570) (xy -6.556204 -13.960184) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.966951 -14.121966) (xy 0.995291 -14.109011) (xy 1.048349 -14.092284) (xy 1.115216 -14.075182) (xy 1.122738 -14.073470) (xy 1.274522 -14.032545) (xy 1.398640 -13.984929) (xy 1.493814 -13.932000)
(xy 1.558771 -13.875134) (xy 1.592233 -13.815708) (xy 1.592924 -13.755099) (xy 1.559569 -13.694685) (xy 1.513429 -13.651832) (xy 1.452931 -13.614611) (xy 1.388050 -13.587504) (xy 1.362607 -13.581179)
(xy 1.318028 -13.570602) (xy 1.294672 -13.559008) (xy 1.293598 -13.555168) (xy 1.308969 -13.538224) (xy 1.345755 -13.503753) (xy 1.397571 -13.457633) (xy 1.430794 -13.428890) (xy 1.494646 -13.372248)
(xy 1.534469 -13.330923) (xy 1.555341 -13.298475) (xy 1.562336 -13.268466) (xy 1.562518 -13.261813) (xy 1.554936 -13.214734) (xy 1.531489 -13.198102) (xy 1.491120 -13.212012) (xy 1.432772 -13.256560)
(xy 1.412105 -13.275442) (xy 1.354209 -13.326994) (xy 1.279456 -13.389581) (xy 1.200357 -13.452843) (xy 1.166276 -13.479074) (xy 1.080366 -13.548378) (xy 1.024165 -13.604650) (xy 0.995119 -13.651572)
(xy 0.990672 -13.692825) (xy 0.999921 -13.718643) (xy 1.033722 -13.747372) (xy 1.085413 -13.749553) (xy 1.144635 -13.726538) (xy 1.198315 -13.707754) (xy 1.262788 -13.702077) (xy 1.329160 -13.707798)
(xy 1.388537 -13.723211) (xy 1.432026 -13.746606) (xy 1.450732 -13.776276) (xy 1.450361 -13.785244) (xy 1.430532 -13.811284) (xy 1.384891 -13.843667) (xy 1.322341 -13.877990) (xy 1.251781 -13.909853)
(xy 1.182113 -13.934853) (xy 1.122239 -13.948589) (xy 1.119318 -13.948940) (xy 1.050382 -13.952584) (xy 0.989289 -13.948647) (xy 0.943734 -13.938592) (xy 0.921410 -13.923884) (xy 0.923651 -13.911695)
(xy 0.929849 -13.886916) (xy 0.935435 -13.832986) (xy 0.940252 -13.757086) (xy 0.944143 -13.666400) (xy 0.946953 -13.568110) (xy 0.948524 -13.469400) (xy 0.948700 -13.377451) (xy 0.947323 -13.299448)
(xy 0.944239 -13.242573) (xy 0.939289 -13.214008) (xy 0.938878 -13.213269) (xy 0.909374 -13.194869) (xy 0.867028 -13.191988) (xy 0.831367 -13.204757) (xy 0.824350 -13.212499) (xy 0.819368 -13.236922)
(xy 0.813737 -13.291520) (xy 0.807912 -13.370148) (xy 0.802351 -13.466661) (xy 0.797650 -13.571333) (xy 0.793214 -13.690002) (xy 0.790729 -13.777699) (xy 0.790520 -13.839753) (xy 0.792914 -13.881493)
(xy 0.798240 -13.908249) (xy 0.806822 -13.925350) (xy 0.818989 -13.938125) (xy 0.820209 -13.939191) (xy 0.846171 -13.970891) (xy 0.852768 -13.993698) (xy 0.852922 -14.062105) (xy 0.876371 -14.105696)
(xy 0.898818 -14.120228) (xy 0.945024 -14.130988) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 1.243692 12.862108) (xy 1.265410 12.874154) (xy 1.312809 12.890080) (xy 1.375950 12.906582) (xy 1.380773 12.907689) (xy 1.536314 12.949978) (xy 1.664030 12.999235) (xy 1.762201 13.054282)
(xy 1.829109 13.113941) (xy 1.863034 13.177032) (xy 1.863292 13.238510) (xy 1.838684 13.277807) (xy 1.789368 13.320664) (xy 1.725519 13.360458) (xy 1.657312 13.390569) (xy 1.611267 13.402527)
(xy 1.541443 13.413692) (xy 1.678689 13.542862) (xy 1.736222 13.599285) (xy 1.782435 13.648921) (xy 1.811515 13.685268) (xy 1.818561 13.699284) (xy 1.817413 13.759402) (xy 1.799689 13.787330)
(xy 1.765984 13.782908) (xy 1.716889 13.745971) (xy 1.701928 13.731277) (xy 1.665114 13.696754) (xy 1.607713 13.646475) (xy 1.537631 13.587237) (xy 1.464069 13.526878) (xy 1.379993 13.458185)
(xy 1.320892 13.407005) (xy 1.282974 13.368652) (xy 1.262446 13.338437) (xy 1.255518 13.311673) (xy 1.258395 13.283673) (xy 1.260403 13.275129) (xy 1.278518 13.238443) (xy 1.315033 13.227579)
(xy 1.322127 13.227539) (xy 1.376631 13.237411) (xy 1.417167 13.254148) (xy 1.495219 13.278165) (xy 1.593260 13.273060) (xy 1.639735 13.262278) (xy 1.686810 13.243827) (xy 1.706039 13.219020)
(xy 1.707868 13.203158) (xy 1.701215 13.173761) (xy 1.677757 13.147187) (xy 1.632243 13.119850) (xy 1.559424 13.088159) (xy 1.514020 13.070645) (xy 1.436006 13.046850) (xy 1.358737 13.032736)
(xy 1.288596 13.028100) (xy 1.231971 13.032742) (xy 1.195248 13.046459) (xy 1.184811 13.069048) (xy 1.189663 13.080907) (xy 1.195675 13.108131) (xy 1.200621 13.163862) (xy 1.204444 13.240866)
(xy 1.207085 13.331906) (xy 1.208488 13.429747) (xy 1.208593 13.527154) (xy 1.207344 13.616889) (xy 1.204681 13.691719) (xy 1.200548 13.744407) (xy 1.195160 13.767417) (xy 1.160329 13.787326)
(xy 1.117890 13.786542) (xy 1.085307 13.766450) (xy 1.080646 13.758333) (xy 1.076117 13.730549) (xy 1.071732 13.672878) (xy 1.067809 13.591767) (xy 1.064665 13.493668) (xy 1.062754 13.395339)
(xy 1.061619 13.272202) (xy 1.062231 13.180791) (xy 1.064857 13.116523) (xy 1.069763 13.074814) (xy 1.077217 13.051084) (xy 1.083264 13.043364) (xy 1.100709 13.011799) (xy 1.108287 12.964224)
(xy 1.108297 12.962521) (xy 1.116646 12.911828) (xy 1.136733 12.874017) (xy 1.136848 12.873901) (xy 1.175123 12.850970) (xy 1.216114 12.846570) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -1.459705 11.794769) (xy -1.436778 11.814303) (xy -1.408410 11.859096) (xy -1.378924 11.919404) (xy -1.352647 11.985488) (xy -1.333902 12.047603) (xy -1.327015 12.093662) (xy -1.336830 12.151003)
(xy -1.363016 12.181169) (xy -1.398090 12.184398) (xy -1.434570 12.160929) (xy -1.464974 12.111000) (xy -1.472321 12.089033) (xy -1.501873 12.020460) (xy -1.543402 11.971589) (xy -1.590325 11.948746)
(xy -1.617195 11.949858) (xy -1.662173 11.974744) (xy -1.714382 12.022749) (xy -1.765475 12.084164) (xy -1.807106 12.149276) (xy -1.826771 12.193697) (xy -1.844927 12.273740) (xy -1.836618 12.335946)
(xy -1.799445 12.389704) (xy -1.770021 12.415761) (xy -1.687137 12.472431) (xy -1.606790 12.503572) (xy -1.515455 12.513117) (xy -1.446409 12.509830) (xy -1.355964 12.506153) (xy -1.299017 12.513883)
(xy -1.274438 12.533420) (xy -1.281096 12.565165) (xy -1.282644 12.567759) (xy -1.325085 12.605143) (xy -1.393027 12.629900) (xy -1.477521 12.640965) (xy -1.569620 12.637274) (xy -1.660376 12.617762)
(xy -1.671531 12.614035) (xy -1.790968 12.558186) (xy -1.884928 12.484443) (xy -1.910615 12.455174) (xy -1.945228 12.385516) (xy -1.960251 12.297009) (xy -1.955031 12.201816) (xy -1.929046 12.112407)
(xy -1.863006 11.990812) (xy -1.787168 11.903569) (xy -1.700387 11.849734) (xy -1.601520 11.828368) (xy -1.583085 11.827897) (xy -1.527537 11.824411) (xy -1.494900 11.815157) (xy -1.489843 11.808396)
(xy -1.475536 11.794610) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.022139 12.344028) (xy 0.083534 12.365793) (xy 0.093373 12.372961) (xy 0.136266 12.409299) (xy 0.096866 12.442808) (xy 0.066395 12.460466) (xy 0.018640 12.473284) (xy -0.053446 12.482719)
(xy -0.122398 12.488105) (xy -0.211791 12.496200) (xy -0.298654 12.507877) (xy -0.369191 12.521139) (xy -0.391868 12.527074) (xy -0.473107 12.548046) (xy -0.528312 12.552239) (xy -0.563871 12.539282)
(xy -0.582632 12.516013) (xy -0.593833 12.464657) (xy -0.576508 12.420433) (xy -0.536646 12.394187) (xy -0.513659 12.391127) (xy -0.471688 12.387734) (xy -0.407020 12.378775) (xy -0.332538 12.366070)
(xy -0.320898 12.363874) (xy -0.183780 12.342987) (xy -0.068200 12.336399) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 2.193336 12.312187) (xy 2.211361 12.313778) (xy 2.238298 12.340430) (xy 2.245405 12.384432) (xy 2.230620 12.431441) (xy 2.228704 12.434486) (xy 2.220556 12.445922) (xy 2.210134 12.455125)
(xy 2.193578 12.462434) (xy 2.167029 12.468185) (xy 2.126625 12.472716) (xy 2.068507 12.476365) (xy 1.988815 12.479468) (xy 1.883689 12.482364) (xy 1.749269 12.485389) (xy 1.613999 12.488212)
(xy 1.466311 12.491499) (xy 1.325893 12.495060) (xy 1.198047 12.498729) (xy 1.088075 12.502338) (xy 1.001279 12.505720) (xy 0.942962 12.508705) (xy 0.926609 12.509952) (xy 0.860713 12.512068)
(xy 0.810231 12.505838) (xy 0.794885 12.499856) (xy 0.768449 12.468672) (xy 0.763090 12.446958) (xy 0.766265 12.421017) (xy 0.778607 12.400844) (xy 0.804343 12.385478) (xy 0.847697 12.373964)
(xy 0.912895 12.365343) (xy 1.004163 12.358655) (xy 1.125727 12.352944) (xy 1.188266 12.350554) (xy 1.329299 12.345147) (xy 1.485531 12.338765) (xy 1.642960 12.332007) (xy 1.787585 12.325467)
(xy 1.871387 12.321454) (xy 1.976202 12.316776) (xy 2.069030 12.313576) (xy 2.143525 12.311999) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -0.131947 12.116954) (xy -0.046752 12.126920) (xy 0.010850 12.143407) (xy 0.043663 12.166945) (xy 0.054491 12.198062) (xy 0.054506 12.199478) (xy 0.038571 12.237266) (xy -0.000520 12.266943)
(xy -0.049696 12.283237) (xy -0.095886 12.280874) (xy -0.116547 12.268490) (xy -0.139108 12.262389) (xy -0.190254 12.256015) (xy -0.262248 12.250145) (xy -0.342143 12.245779) (xy -0.554149 12.236695)
(xy -0.559842 12.177646) (xy -0.565536 12.118598) (xy -0.396323 12.114477) (xy -0.247536 12.112983) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 1.809751 11.211556) (xy 1.878469 11.219190) (xy 1.908919 11.228965) (xy 1.936912 11.260684) (xy 1.944063 11.289913) (xy 1.942690 11.307474) (xy 1.934611 11.319654) (xy 1.913882 11.327818)
(xy 1.874561 11.333334) (xy 1.810706 11.337568) (xy 1.718426 11.341797) (xy 1.630182 11.346566) (xy 1.554431 11.352449) (xy 1.498982 11.358717) (xy 1.471643 11.364639) (xy 1.471140 11.364922)
(xy 1.462680 11.381814) (xy 1.457187 11.422377) (xy 1.454501 11.489977) (xy 1.454460 11.587982) (xy 1.456039 11.682034) (xy 1.457940 11.801018) (xy 1.457585 11.888625) (xy 1.454702 11.949760)
(xy 1.449023 11.989328) (xy 1.440276 12.012236) (xy 1.437653 12.015844) (xy 1.399931 12.043173) (xy 1.364736 12.035441) (xy 1.345131 12.010779) (xy 1.338373 11.980200) (xy 1.332780 11.919716)
(xy 1.328722 11.835748) (xy 1.326571 11.734721) (xy 1.326323 11.684813) (xy 1.325508 11.585835) (xy 1.323257 11.500236) (xy 1.319859 11.434334) (xy 1.315604 11.394446) (xy 1.312596 11.385506)
(xy 1.282486 11.382349) (xy 1.227995 11.389528) (xy 1.158831 11.404792) (xy 1.084700 11.425888) (xy 1.015310 11.450566) (xy 0.994943 11.459185) (xy 0.921569 11.485957) (xy 0.872754 11.488312)
(xy 0.845257 11.465235) (xy 0.835838 11.415708) (xy 0.835765 11.409292) (xy 0.841072 11.375196) (xy 0.863138 11.352224) (xy 0.911177 11.330946) (xy 0.912983 11.330284) (xy 0.999099 11.304038)
(xy 1.105435 11.279749) (xy 1.225592 11.258068) (xy 1.353172 11.239645) (xy 1.481776 11.225131) (xy 1.605006 11.215178) (xy 1.716464 11.210436) )(layer F.SilkS) (width 0.000000)
)
)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,29 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#(c) SnapEDA 2016 (snapeda.com)
#This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA) with Design Exception 1.0
#
# B3U-1000P
#
DEF B3U-1000P S 0 40 Y N 1 L N
F0 "S" -100 100 50 H V L BNN
F1 "B3U-1000P" -100 -100 50 H V L BNN
F2 "SW_B3U-1000P" 0 0 50 H I L BNN
F3 "" 0 0 50 H I L BNN
F4 "None" 0 0 50 H I L BNN "PACKAGE"
F5 "B3U-1000P" 0 0 50 H I L BNN "MP"
F6 "Omron" 0 0 50 H I L BNN "MF"
F7 "Unavailable" 0 0 50 H I L BNN "AVAILABILITY"
F8 "Tactile Switch SPST-NO Top Actuated Surface Mount" 0 0 50 H I L BNN "DESCRIPTION"
F9 "None" 0 0 50 H I L BNN "PRICE"
DRAW
P 2 0 0 6 -100 0 110 84 N
C 100 0 13 0 0 6 N
P 2 0 0 6 200 0 115 0 N
P 2 0 0 6 -100 0 -200 0 N
X ~ 1 -300 0 100 R 40 40 0 0 P
X ~ 2 300 0 100 L 40 40 0 0 P
ENDDRAW
ENDDEF
#
# End Library

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,56 @@
(footprint "E73-2G4M08S1C-modified" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 61D2FB58)
(attr through_hole)
(fp_text reference "REF**" (at -3.175 -10.16) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 62c63d1a-e221-4784-bc74-9a7cdd5bb2e8)
)
(fp_text value "E73-2G4M08S1C" (at 1.905 10.795) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 1bfcb033-dbb4-482e-a363-6f517218fc19)
)
(fp_line (start -6.5 -9.5) (end -6.5 9) (layer "F.SilkS") (width 0.127) (tstamp 64a139a1-2b6a-4995-aba9-e720c1c31ad6))
(fp_line (start 6.5 -9.5) (end -6.5 -9.5) (layer "F.SilkS") (width 0.127) (tstamp bb76de72-eeb8-4e41-aaf2-395dc1f75530))
(fp_line (start 6.5 9) (end 6.5 -9.5) (layer "F.SilkS") (width 0.127) (tstamp d7bc56f6-74f9-4f91-b973-bc4802c7f7e4))
(fp_line (start -6.5 9) (end 6.5 9) (layer "F.SilkS") (width 0.127) (tstamp e9755b38-3198-4ac8-90c4-d11a0b164f87))
(fp_poly (pts
(xy -19.5 -9.5)
(xy 19.5 -9.5)
(xy 19.5 -6)
(xy -19.5 -6)
) (layer "Dwgs.User") (width 0.01) (fill solid) (tstamp 51732324-a780-4005-a624-eab32e6658df))
(pad "1" smd rect (at -6.5 -5.03) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2a3afbfc-f820-4f85-8adc-4889c8e1b6e7))
(pad "2" smd rect (at -6.5 -3.76) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp db0e211a-914d-4a5d-8b4e-556553c54b32))
(pad "3" smd rect (at -6.5 -2.49) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp fc8ecbdc-77f0-4c85-9f37-5ca83f63bbb1))
(pad "4" smd rect (at -6.5 -1.22) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 34440ace-6738-45cc-9855-dde9bd553c56))
(pad "5" smd rect (at -6.5 0.05) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b10ced4c-8d3a-451a-baed-886677f32040))
(pad "6" smd rect (at -6.5 1.32) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 47f33dc4-397c-41e0-91ca-adda3ae4b759))
(pad "7" smd rect (at -6.5 2.59) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 9ebca351-ca9f-4578-bab5-0149df1dfb6d))
(pad "8" smd rect (at -6.5 3.86) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 8b72ea5e-7238-4d4e-bb92-f1974db80348))
(pad "9" smd rect (at -6.5 5.13) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 32dd1dfa-02d5-4ed5-9804-0e13538946f5))
(pad "10" smd rect (at -6.5 6.4) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2dfc0e17-3908-45f6-a4e8-d94fcbe026cb))
(pad "11" smd rect (at -4.44 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp d03b33f9-87fe-4b5a-85e5-b11a4f9751b9))
(pad "13" smd rect (at -3.17 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 28b704cf-85ae-41be-931a-21cab6b04490))
(pad "15" smd rect (at -1.9 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a691d471-4d8c-4137-89fd-ee32bfecd7f3))
(pad "17" smd rect (at -0.63 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6f9c8787-2311-4c54-9acc-43f64531c084))
(pad "19" smd rect (at 0.64 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 325de6ca-6520-48cc-9032-e8248658195e))
(pad "21" smd rect (at 1.91 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 21755008-b7b9-4118-be9b-eea02a310c76))
(pad "23" smd rect (at 3.18 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3bdc1582-33c4-4ef9-ad6c-c58828a6d257))
(pad "25" smd rect (at 4.45 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 25575f13-1b0a-4119-bfb3-0cdde6ec8270))
(pad "26" smd rect (at 6.5 6.4) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp dc441d22-7d4a-45a0-990e-2b6aa19e9c6c))
(pad "27" smd rect (at 6.5 5.13) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp e620f6ca-4521-498d-a4b4-ec8b76a342bd))
(pad "29" smd rect (at 6.5 3.86) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a4506d62-c23f-4d90-bc1d-a077fbe3926d))
(pad "31" smd rect (at 6.5 2.59) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 5e1f905f-5a17-413b-895d-b1b86ab25a2c))
(pad "33" smd rect (at 6.5 1.32) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7bf2b13a-0a61-4504-8fd7-6e72d745055c))
(pad "35" smd rect (at 6.5 0.05) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp deed76d2-22fd-42ca-92b9-d5fbb35960c2))
(pad "37" smd rect (at 6.5 -1.22) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 1bc74e9d-dc7f-4e6a-9fce-2cd4619cfd5e))
(pad "39" smd rect (at 6.5 -2.49) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 010d2f36-bef8-463c-a402-9b24dbdaef1a))
(pad "41" smd rect (at 6.5 -3.76) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 00ccbb40-9fae-4674-abd1-2f29aee9214d))
(pad "43" smd rect (at 6.5 -5.03) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7338a6cc-4638-43ec-8cd3-3a76bae7b46b))
(model "${KIPRJMOD}/lib/E73-2G4M08S1C.step"
(offset (xyz 6.5 -9 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 -90))
)
)

View file

@ -0,0 +1,71 @@
(footprint "E73-2G4M08S1C" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 61CC75CB)
(attr through_hole)
(fp_text reference "REF**" (at -3.175 -10.16) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 62c63d1a-e221-4784-bc74-9a7cdd5bb2e8)
)
(fp_text value "E73-2G4M08S1C" (at 1.905 10.795) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 1bfcb033-dbb4-482e-a363-6f517218fc19)
)
(fp_line (start -6.5 -9.5) (end -6.5 9) (layer "F.SilkS") (width 0.127) (tstamp 64a139a1-2b6a-4995-aba9-e720c1c31ad6))
(fp_line (start 6.5 -9.5) (end -6.5 -9.5) (layer "F.SilkS") (width 0.127) (tstamp bb76de72-eeb8-4e41-aaf2-395dc1f75530))
(fp_line (start 6.5 9) (end 6.5 -9.5) (layer "F.SilkS") (width 0.127) (tstamp d7bc56f6-74f9-4f91-b973-bc4802c7f7e4))
(fp_line (start -6.5 9) (end 6.5 9) (layer "F.SilkS") (width 0.127) (tstamp e9755b38-3198-4ac8-90c4-d11a0b164f87))
(fp_poly (pts
(xy -19.5 -9.5)
(xy 19.5 -9.5)
(xy 19.5 -6)
(xy -19.5 -6)
) (layer "Dwgs.User") (width 0.01) (fill solid) (tstamp 51732324-a780-4005-a624-eab32e6658df))
(pad "1" smd rect (at -6.5 -5.03) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2a3afbfc-f820-4f85-8adc-4889c8e1b6e7))
(pad "2" smd rect (at -6.5 -3.76) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp db0e211a-914d-4a5d-8b4e-556553c54b32))
(pad "3" smd rect (at -6.5 -2.49) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp fc8ecbdc-77f0-4c85-9f37-5ca83f63bbb1))
(pad "4" smd rect (at -6.5 -1.22) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 34440ace-6738-45cc-9855-dde9bd553c56))
(pad "5" smd rect (at -6.5 0.05) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b10ced4c-8d3a-451a-baed-886677f32040))
(pad "6" smd rect (at -6.5 1.32) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 47f33dc4-397c-41e0-91ca-adda3ae4b759))
(pad "7" smd rect (at -6.5 2.59) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 9ebca351-ca9f-4578-bab5-0149df1dfb6d))
(pad "8" smd rect (at -6.5 3.86) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 8b72ea5e-7238-4d4e-bb92-f1974db80348))
(pad "9" smd rect (at -6.5 5.13) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 32dd1dfa-02d5-4ed5-9804-0e13538946f5))
(pad "10" smd rect (at -6.5 6.4) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2dfc0e17-3908-45f6-a4e8-d94fcbe026cb))
(pad "11" smd rect (at -4.44 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp d03b33f9-87fe-4b5a-85e5-b11a4f9751b9))
(pad "12" smd rect (at -3.81 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 9d4fdaf1-0082-4f91-b123-3b30eaf39376))
(pad "13" smd rect (at -3.17 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 28b704cf-85ae-41be-931a-21cab6b04490))
(pad "14" smd rect (at -2.54 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp fdb9b12b-8a9f-4d42-b2ac-38e6ed117ebf))
(pad "15" smd rect (at -1.9 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a691d471-4d8c-4137-89fd-ee32bfecd7f3))
(pad "16" smd rect (at -1.27 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp aea0a9bf-c3f0-491f-9f46-775c907175b8))
(pad "17" smd rect (at -0.63 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6f9c8787-2311-4c54-9acc-43f64531c084))
(pad "18" smd rect (at 0 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6d520754-68d8-4942-8352-d8883ee61a70))
(pad "19" smd rect (at 0.64 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 325de6ca-6520-48cc-9032-e8248658195e))
(pad "20" smd rect (at 1.27 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp db424427-2f96-4cf2-ba5f-5e91d51c9f48))
(pad "21" smd rect (at 1.91 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 21755008-b7b9-4118-be9b-eea02a310c76))
(pad "22" smd rect (at 2.54 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7e12b4a0-973f-4ea2-9d48-a3f84a86dd3a))
(pad "23" smd rect (at 3.18 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3bdc1582-33c4-4ef9-ad6c-c58828a6d257))
(pad "24" smd rect (at 3.81 6.9) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 320d39f9-b5a0-4bcd-a732-ddb2c4a82265))
(pad "25" smd rect (at 4.45 9) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 25575f13-1b0a-4119-bfb3-0cdde6ec8270))
(pad "26" smd rect (at 6.5 6.4) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp dc441d22-7d4a-45a0-990e-2b6aa19e9c6c))
(pad "27" smd rect (at 6.5 5.13) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp e620f6ca-4521-498d-a4b4-ec8b76a342bd))
(pad "28" smd rect (at 4.4 4.495) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a7da3f28-0850-4aff-b9b7-bee40228a244))
(pad "29" smd rect (at 6.5 3.86) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a4506d62-c23f-4d90-bc1d-a077fbe3926d))
(pad "30" smd rect (at 4.4 3.225) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0f4e07dc-1a0e-4c35-9a3c-f00d559fe996))
(pad "31" smd rect (at 6.5 2.59) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 5e1f905f-5a17-413b-895d-b1b86ab25a2c))
(pad "32" smd rect (at 4.4 1.955) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp efa49ef2-2430-471b-bd0c-616fbea629dc))
(pad "33" smd rect (at 6.5 1.32) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7bf2b13a-0a61-4504-8fd7-6e72d745055c))
(pad "34" smd rect (at 4.4 0.685) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp bff972dd-76be-4541-b2ca-5bebd42b1f2b))
(pad "35" smd rect (at 6.5 0.05) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp deed76d2-22fd-42ca-92b9-d5fbb35960c2))
(pad "36" smd rect (at 4.4 -0.585) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp aa1a89ee-4433-4df9-9903-9df5b5a78a55))
(pad "37" smd rect (at 6.5 -1.22) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 1bc74e9d-dc7f-4e6a-9fce-2cd4619cfd5e))
(pad "38" smd rect (at 4.4 -1.855) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b4c8dc4b-9c34-4698-ac73-a37131d6b8e3))
(pad "39" smd rect (at 6.5 -2.49) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 010d2f36-bef8-463c-a402-9b24dbdaef1a))
(pad "40" smd rect (at 4.4 -3.125) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 852b4a80-9987-4f8f-90e1-c268e85a7e12))
(pad "41" smd rect (at 6.5 -3.76) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 00ccbb40-9fae-4674-abd1-2f29aee9214d))
(pad "42" smd rect (at 4.4 -4.395) (size 0.9 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7e1fbde0-d64c-4303-8a99-35bf2573cf2c))
(pad "43" smd rect (at 6.5 -5.03) (size 2 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7338a6cc-4638-43ec-8cd3-3a76bae7b46b))
(model "${KIPRJMOD}/lib/E73-2G4M08S1C.step"
(offset (xyz 6.5 -9 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 -90))
)
)

View file

@ -0,0 +1,63 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#(c) SnapEDA 2016 (snapeda.com)
#This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA) with Design Exception 1.0
#
# E73-2G4M08S1C
#
DEF E73-2G4M08S1C U 0 40 Y Y 3 L N
F0 "U" -600 800 50 H V L BNN
F1 "E73-2G4M08S1C" -600 -1000 50 H V L BNN
F2 "E73-2G4M08S1C" 0 0 50 H I L BNN
F3 "" 0 0 50 H I L BNN
DRAW
S -600 -900 100 800 1 0 10 f
X GND@1 5 -700 200 100 R 40 40 1 0 B
X VDD 19 -700 400 100 R 40 40 1 0 B
X GND@2 21 -700 100 100 R 40 40 1 0 B
X VDDH 23 -700 700 100 R 40 40 1 0 B
X GND@3 24 -700 0 100 R 40 40 1 0 B
X DCCH 25 -700 600 100 R 40 40 1 0 B
X P0.18/RESET 26 -700 -200 100 R 40 40 1 0 B
X VBUS 27 -700 -600 100 R 40 40 1 0 B
X DM 29 -700 -700 100 R 40 40 1 0 B
X DP 31 -700 -800 100 R 40 40 1 0 B
X SWDIO 37 -700 -300 100 R 40 40 1 0 B
X SWDCLK 39 -700 -400 100 R 40 40 1 0 B
S -200 -1200 400 1200 2 0 10 f
X P0.03/AIN1 3 500 800 100 L 40 40 2 0 B
X P0.28/AIN4 4 500 -800 100 L 40 40 2 0 B
X P0.02/AIN0 7 500 900 100 L 40 40 2 0 B
X P0.29/AIN5 8 500 -900 100 L 40 40 2 0 B
X P0.31/AIN7 9 500 -1100 100 L 40 40 2 0 B
X P0.30/AIN6 10 500 -1000 100 L 40 40 2 0 B
X P0.00/XL1 11 500 1100 100 L 40 40 2 0 B
X P0.26 12 500 -700 100 L 40 40 2 0 B
X P0.01/XL2 13 500 1000 100 L 40 40 2 0 B
X P0.06 14 500 500 100 L 40 40 2 0 B
X P0.05/AIN3 15 500 600 100 L 40 40 2 0 B
X P0.08 16 500 300 100 L 40 40 2 0 B
X P0.04/AIN2 18 500 700 100 L 40 40 2 0 B
X P0.12 20 500 0 100 L 40 40 2 0 B
X P0.07 22 500 400 100 L 40 40 2 0 B
X P0.15 28 500 -200 100 L 40 40 2 0 B
X P0.17 30 500 -300 100 L 40 40 2 0 B
X P0.20 32 500 -400 100 L 40 40 2 0 B
X P0.13 33 500 -100 100 L 40 40 2 0 B
X P0.22 34 500 -500 100 L 40 40 2 0 B
X P0.24 35 500 -600 100 L 40 40 2 0 B
X P0.09/NFC1 41 500 200 100 L 40 40 2 0 B
X P0.10/NFC2 43 500 100 100 L 40 40 2 0 B
S -100 -500 300 400 3 0 10 f
X P1.11 1 400 -300 100 L 40 40 3 0 B
X P1.10 2 400 -200 100 L 40 40 3 0 B
X P1.13 6 400 -400 100 L 40 40 3 0 B
X P1.09 17 400 -100 100 L 40 40 3 0 B
X P1.00 36 400 300 100 L 40 40 3 0 B
X P1.02 38 400 200 100 L 40 40 3 0 B
X P1.04 40 400 100 100 L 40 40 3 0 B
X P1.06 42 400 0 100 L 40 40 3 0 B
ENDDRAW
ENDDEF
#
# End Library

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,32 @@
(footprint SW_B3U-1000P (layer F.Cu) (tedit 6367FB92)
(descr "")
(fp_text reference REF** (at 0.475 -2.335 0) (layer F.SilkS)
(effects (font (size 1.0 1.0) (thickness 0.15)))
)
(fp_text value SW_B3U-1000P (at 4.92 2.265 0) (layer F.Fab)
(effects (font (size 1.0 1.0) (thickness 0.15)))
)
(pad 1 smd rect (at -1.7 0.0 90.0) (size 1.7 0.8) (layers F.Cu F.Mask F.Paste))
(pad 2 smd rect (at 1.7 0.0 90.0) (size 1.7 0.8) (layers F.Cu F.Mask F.Paste))
(fp_line (start -1.5 1.25) (end -1.5 -1.25) (layer F.Fab) (width 0.127))
(fp_line (start 1.5 -1.25) (end 1.5 1.25) (layer F.Fab) (width 0.127))
(fp_line (start 1.5 1.25) (end -1.5 1.25) (layer F.Fab) (width 0.127))
(fp_line (start -1.5 1.25) (end 1.5 1.25) (layer F.SilkS) (width 0.127))
(fp_line (start -1.75 1.1) (end -2.35 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.35 1.1) (end -2.35 -1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.35 -1.1) (end -1.75 -1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.75 -1.1) (end 2.35 -1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.35 -1.1) (end 2.35 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.35 1.1) (end 1.75 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.75 1.1) (end 1.75 1.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.75 1.5) (end -1.75 1.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.75 1.5) (end -1.75 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.75 -1.1) (end -1.75 -1.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.75 -1.5) (end 1.75 -1.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.75 -1.5) (end 1.75 -1.1) (layer F.CrtYd) (width 0.05))
(fp_circle (center -2.7 -0.2) (end -2.6 -0.2) (layer F.SilkS) (width 0.2))
(fp_circle (center -2.7 -0.2) (end -2.6 -0.2) (layer F.Fab) (width 0.2))
(fp_line (start -1.5 -1.25) (end 1.5 -1.25) (layer F.SilkS) (width 0.127))
(fp_line (start 1.5 -1.25) (end -1.5 -1.25) (layer F.Fab) (width 0.127))
)

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more