Watch
0
0
Fork
You've already forked esp32-c_its-companion
0

Compare commits

..
Author SHA1 Message Date
Jannik Beyerstedt
afe19e7f3e TMP: Add message generator 2026-08-10 13:18:28 +02:00
39 changed files with 5963 additions and 96053 deletions

194
Cargo.lock generated
View file

@ -166,29 +166,6 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "bt-hci"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "211713d2e9fb4793ce4360a712c0764264aff6be48932ccf02ca2a331c0436a9"
dependencies = [
"btuuid",
"embassy-sync 0.8.0",
"embedded-io 0.7.1",
"embedded-io-async 0.7.0",
"futures-intrusive",
"heapless 0.9.2",
]
[[package]]
name = "btuuid"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5f48f1e9b0aad0a4f05d17bdeae0fa20ff798e272a03a6940ca27ad9c5a6ae7"
dependencies = [
"uuid",
]
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.20.2" version = "3.20.2"
@ -267,15 +244,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa" checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa"
[[package]]
name = "convert_case"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f"
dependencies = [
"unicode-segmentation",
]
[[package]] [[package]]
name = "cordyceps" name = "cordyceps"
version = "0.3.4" version = "0.3.4"
@ -988,7 +956,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23fbff98b06a96b6ce3791ecec5c668524052a068e23aacd23afe17ddba844ce" checksum = "23fbff98b06a96b6ce3791ecec5c668524052a068e23aacd23afe17ddba844ce"
dependencies = [ dependencies = [
"allocator-api2", "allocator-api2",
"bt-hci",
"cfg-if", "cfg-if",
"docsplay", "docsplay",
"document-features", "document-features",
@ -1185,14 +1152,11 @@ name = "esp32-c_its-companion"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"assert_float_eq", "assert_float_eq",
"bt-hci",
"c-its-parser", "c-its-parser",
"chrono", "chrono",
"critical-section", "critical-section",
"crossbeam-queue", "crossbeam-queue",
"embassy-executor", "embassy-executor",
"embassy-futures",
"embassy-sync 0.7.2",
"embassy-time", "embassy-time",
"embassy_gps", "embassy_gps",
"embedded-graphics", "embedded-graphics",
@ -1215,9 +1179,6 @@ dependencies = [
"profont", "profont",
"prost", "prost",
"prost-build", "prost-build",
"static_cell",
"tinytga",
"trouble-host",
"ublox", "ublox",
] ]
@ -1359,52 +1320,12 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "futures"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-channel"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.32" version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
[[package]]
name = "futures-intrusive"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
dependencies = [
"futures-core",
"lock_api",
]
[[package]]
name = "futures-io"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
[[package]] [[package]]
name = "futures-sink" name = "futures-sink"
version = "0.3.32" version = "0.3.32"
@ -1424,10 +1345,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink",
"futures-task", "futures-task",
"pin-project-lite", "pin-project-lite",
"slab",
] ]
[[package]] [[package]]
@ -1642,18 +1561,6 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "js-sys"
version = "0.3.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08"
dependencies = [
"cfg-if",
"futures-util",
"once_cell",
"wasm-bindgen",
]
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.5.0" version = "1.5.0"
@ -1696,15 +1603,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
[[package]]
name = "lock_api"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
dependencies = [
"scopeguard",
]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.29" version = "0.4.29"
@ -2286,12 +2184,6 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "semver" name = "semver"
version = "1.0.28" version = "1.0.28"
@ -2369,12 +2261,6 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.15.1" version = "1.15.1"
@ -2423,15 +2309,6 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "static_cell"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23"
dependencies = [
"portable-atomic",
]
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.11.1" version = "0.11.1"
@ -2530,16 +2407,6 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "tinytga"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "477839bd612acb4d0551915eaf6eef8cc1b3a9dd58e18e9c2b746c78614a25d5"
dependencies = [
"embedded-graphics",
"nom",
]
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "1.1.1+spec-1.1.0" version = "1.1.1+spec-1.1.0"
@ -2631,39 +2498,6 @@ dependencies = [
"tracing-log", "tracing-log",
] ]
[[package]]
name = "trouble-host"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1df7817cead4b83dfbeeaa59736ecbc97c30b21dc3bfc0cc2ce8a6687f70b37a"
dependencies = [
"bt-hci",
"embassy-futures",
"embassy-sync 0.7.2",
"embassy-time",
"embedded-io 0.7.1",
"futures",
"heapless 0.9.2",
"rand_core 0.6.4",
"static_cell",
"trouble-host-macros",
"zerocopy",
]
[[package]]
name = "trouble-host-macros"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d809ae05f510cf8f1d863749281eb28e049d9ae4ad52d92ea7a0ac068a0e17c"
dependencies = [
"convert_case",
"darling 0.20.11",
"proc-macro2",
"quote",
"syn 2.0.117",
"uuid",
]
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.20.0" version = "1.20.0"
@ -2705,12 +2539,6 @@ version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-segmentation"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.14" version = "0.1.14"
@ -2742,8 +2570,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"js-sys",
"wasm-bindgen",
] ]
[[package]] [[package]]
@ -3049,26 +2875,6 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "zerocopy"
version = "0.8.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.117",
]
[[package]] [[package]]
name = "zmij" name = "zmij"
version = "1.0.21" version = "1.0.21"

View file

@ -14,6 +14,12 @@ name = "test"
path = "./src/test.rs" path = "./src/test.rs"
required-features = ["std", "cam"] required-features = ["std", "cam"]
[[bin]]
## run with cargo run --target host-tuple --bin test-proto --no-default-features -F std,uart,cam
name = "test-proto"
path = "./src/test-proto.rs"
required-features = ["std", "uart", "cam"]
[features] [features]
default = ["esp", "spat", "gnss_ubx", "screen"] default = ["esp", "spat", "gnss_ubx", "screen"]
@ -23,8 +29,6 @@ esp = [
"dep:esp-rtos", "dep:esp-rtos",
"dep:esp-bootloader-esp-idf", "dep:esp-bootloader-esp-idf",
"dep:embassy-executor", "dep:embassy-executor",
"dep:embassy-futures",
"dep:embassy-sync",
"dep:embassy-time", "dep:embassy-time",
"dep:embedded-io", "dep:embedded-io",
"dep:embedded-io-async", "dep:embedded-io-async",
@ -32,7 +36,6 @@ esp = [
"dep:esp-backtrace", "dep:esp-backtrace",
"dep:esp-println", "dep:esp-println",
"dep:esp-radio", "dep:esp-radio",
"dep:bt-hci",
"esp32-cits-core/esp32c5", "esp32-cits-core/esp32c5",
"esp32-cits-core/log-04", "esp32-cits-core/log-04",
] ]
@ -53,11 +56,9 @@ spat = ["c-its-parser/spatem", "c-its-parser/mapem"]
# enable some debug printing (without enabling debug logging of the ESP RTOS) # enable some debug printing (without enabling debug logging of the ESP RTOS)
spat_debug = [] spat_debug = []
# enable ST7789 based display # enable ST7789 based display
screen = ["dep:mipidsi", "dep:embedded-graphics", "dep:embedded-hal-bus", "dep:profont", "dep:tinytga"] screen = ["dep:mipidsi", "dep:embedded-graphics", "dep:embedded-hal-bus", "dep:profont"]
# enable I/O via UART # enable I/O via UART
uart = ["_uart", "_gnss"] uart = ["_uart", "_gnss", "dep:prost"]
# enable I/O via BLE
ble = ["_gnss"]
# internal feature, that any UART I/O is enabled # internal feature, that any UART I/O is enabled
_uart = [] _uart = []
@ -71,7 +72,6 @@ esp-rtos = { version = "0.3.0", optional = true, features = [
"embassy", "embassy",
"esp-alloc", "esp-alloc",
"esp-radio", "esp-radio",
"embassy",
"esp32c5", "esp32c5",
"log-04", "log-04",
] } ] }
@ -80,16 +80,14 @@ esp-bootloader-esp-idf = { version = "0.5.0", optional = true, features = ["esp3
log = "0.4.27" log = "0.4.27"
critical-section = "1.2.0" critical-section = "1.2.0"
bt-hci = { version = "0.8.0", optional = true }
embassy-executor = { version = "0.10.0", optional = true, features = ["log"] } embassy-executor = { version = "0.10.0", optional = true, features = ["log"] }
embassy-futures = { version = "0.1.2", optional = true }
embassy-sync = { version = "0.7", optional = true }
embassy-time = { version = "0.5.0", optional = true, features = ["log"] } embassy-time = { version = "0.5.0", optional = true, features = ["log"] }
embedded-io = { version = "0.7.1", optional = true } embedded-io = { version = "0.7.1", optional = true }
embedded-io-async = { version = "0.7.0", optional = true } embedded-io-async = { version = "0.7.0", optional = true }
esp-alloc = { version = "0.10.0", optional = true } esp-alloc = { version = "0.10.0", optional = true }
esp-backtrace = { version = "0.19.0", optional = true, features = [ esp-backtrace = { version = "0.19.0", optional = true, features = [
"esp32c5", "esp32c5",
"panic-handler",
"println", "println",
] } ] }
esp-println = { version = "0.17.0", optional = true, default-features = false, features = ["colors", "critical-section", "jtag-serial", "esp32c5", "log-04"] } esp-println = { version = "0.17.0", optional = true, default-features = false, features = ["colors", "critical-section", "jtag-serial", "esp32c5", "log-04"] }
@ -100,10 +98,7 @@ esp-radio = { version = "0.18.0", optional = true, features = [
"unstable", "unstable",
"wifi", "wifi",
"sniffer", "sniffer",
"ble",
] } ] }
trouble-host = { version = "0.6.0", features = ["gatt", "central", "derive", "default-packet-pool"] }
static_cell = "2"
embassy_gps = { version = "0.1.0", optional = true, default-features = false, features = ["esp", "log-04"], git = "https://github.com/jbeyerstedt/embassy_gps.git", branch = "feat/rework-gpsfix" } embassy_gps = { version = "0.1.0", optional = true, default-features = false, features = ["esp", "log-04"], git = "https://github.com/jbeyerstedt/embassy_gps.git", branch = "feat/rework-gpsfix" }
esp32-cits-core = { version = "0.1.0", default-features = false, git = "https://git.hamburg.ccc.de/jtbx/esp32-cits-core", branch = "main" } esp32-cits-core = { version = "0.1.0", default-features = false, git = "https://git.hamburg.ccc.de/jtbx/esp32-cits-core", branch = "main" }
@ -122,8 +117,7 @@ geo-types = { version = "0.7.19", default-features = false }
mipidsi = { version = "0.10.0", optional = true } mipidsi = { version = "0.10.0", optional = true }
num-traits = { version = "0.2.19", default-features = false, features = ["libm"] } num-traits = { version = "0.2.19", default-features = false, features = ["libm"] }
profont = { version = "0.7.0", optional = true } profont = { version = "0.7.0", optional = true }
prost = { version = "0.14", default-features = false, features = ["derive"] } prost = { version = "0.14", optional = true, default-features = false, features = ["derive"] }
tinytga = { version = "0.5.0", optional = true }
ublox = { version = "0.10", optional = true, default-features = false, features = ["alloc", "ubx_proto27"] } ublox = { version = "0.10", optional = true, default-features = false, features = ["alloc", "ubx_proto27"] }
[dev-dependencies] [dev-dependencies]

View file

@ -8,7 +8,7 @@ The code is currently tailored to:
- U-Blox M10Q GNSS (connected on GPIO12 (RX), GPIO11 (TX), and GPIO25 (reset)) - U-Blox M10Q GNSS (connected on GPIO12 (RX), GPIO11 (TX), and GPIO25 (reset))
or Seeed XIAO L67K (connected on GPIO12 (RX), GPIO11 (TX), GPIO1 (wakeup) and GPIO25 (reset)) or Seeed XIAO L67K (connected on GPIO12 (RX), GPIO11 (TX), GPIO1 (wakeup) and GPIO25 (reset))
only available with `gnss_ubx` or `gnss_l67k` feature (which is included in `spat` feature) only available with `gnss_ubx` or `gnss_l67k` feature (which is included in `spat` feature)
- Some ST7789 240*280px screen (connected on GPIO8 (SCL/ SCK), GPIO10 (SDA/ MOSI), GPIO7 (reset), GPIO23 (DC), GPIO24 (CS), GPIO0 (BL)) - Some ST7789 172*320px screen (connected on GPIO8 (SCL/ SCK), GPIO10 (SDA/ MOSI), GPIO7 (reset), GPIO23 (DC), GPIO24 (CS), TODO GPIO0 (BL))
only available with `screen` feature (which is included in `spat` feature) only available with `screen` feature (which is included in `spat` feature)
## Features ## Features
@ -55,13 +55,6 @@ This is **not** implemented in this application!
### UART ### UART
Enable UART I/O protocol according to [docs/uart-protocol.md](./docs/uart-protocol.md). Enable UART I/O protocol according to [docs/uart-protocol.md](./docs/uart-protocol.md).
### BLE
Enable BLE I/O protocol according to [docs/ble-protocol.md](./docs/ble-protocol.md).
Enabling `denm` feature or `cam` feature is recommended, otherwise no data will be received.
Note: When changing the set of supported messages on the BLE interface, you may need to turn bluetooth off and on again on your client device.
Otherwise the client may not re-scan the service's characteristics and still use the previous set of characteristics.
## Usage ## Usage
@ -77,7 +70,7 @@ rustup target add riscv32imac-unknown-none-elf
cargo install espflash --locked cargo install espflash --locked
``` ```
(Project was setup using esp-generate with the options `--chip esp32c5 -o esp32c5-wroom-1-psram -o alloc -o log -o unstable-hal -o wifi -o esp-backtrace -o embassy -o ble-trouble`.) (Project was setup using esp-generate with the options `--chip esp32c5 -o esp32c5-wroom-1-psram -o alloc -o log -o unstable-hal -o wifi -o esp-backtrace -o embassy`.)
To use the proper rustfmt features, enable the nightly toolchain: To use the proper rustfmt features, enable the nightly toolchain:
```shell ```shell
@ -100,8 +93,7 @@ Officially supported feature combinations are:
- `esp,spat,gnss_ubx,screen` (default features, "standalone") - `esp,spat,gnss_ubx,screen` (default features, "standalone")
- `esp,spat,gnss_ubx,screen,cam_tx` ("standalone with CAM") - `esp,spat,gnss_ubx,screen,cam_tx` ("standalone with CAM")
- `esp,spat,gnss_ubx,screen,cam_tx,cam,denm` - `esp,spat,gnss_ubx,screen,cam_tx,cam,denm`
- `esp,uart,cam,denm` ("smartphone companion with UART") - `esp,uart,cam,denm` ("smartphone companion")
- `esp,ble,cam,denm,cam_tx` ("smartphone companion with BLE")
Connect your ESP32-C5 and run: Connect your ESP32-C5 and run:
@ -119,16 +111,3 @@ The unit tests in this project are meant to be run on the host:
``` ```
cargo test --target host-tuple --bin test --no-default-features -F std,spat cargo test --target host-tuple --bin test --no-default-features -F std,spat
``` ```
## Tips and Tricks
### Create TGA Assets
Images are loaded as TGA assets, but shall not have an alpha channel.
You can convert them using [ImageMagick](https://imagemagick.org) like this:
```shell
# resize to 25px height, adding a black background to the white symbol and vice versa
magick Sinnbild_Radfahrer_StVO_1992-200px-white.png -resize x25 -background black -alpha background -flatten -alpha off -verbose Sinnbild_Radfahrer_StVO_1992-25px-white.tga
magick Sinnbild_Radfahrer_StVO_1992-200px-black.png -resize x25 -background white -alpha background -flatten -alpha off -verbose Sinnbild_Radfahrer_StVO_1992-25px-black.tga
```

View file

@ -19,16 +19,12 @@ V2X data is exposed via the service UUID `c0b70000-d4f4-4000-ada8-f99a02ee315c`
UUID | Type | Description UUID | Type | Description
------------------------------------- | --------------- | ----------- ------------------------------------- | --------------- | -----------
c0b70001-d4f4-4001-ada8-f99a02ee315c | `PositionState` | Set position from external source c0b70001-d4f4-4001-ada8-f99a02ee315c | `PositionState` | Set position from external source
c0b70001-d4f4-4002-ada8-f99a02ee315c | `RawNotify` | Raw message notification c0b70001-d4f4-4001-ada8-f99a02ee315c | `RawMsgRx` | Raw CAM message (de-duplicated/ rate-limited)
c0b70001-d4f4-4003-ada8-f99a02ee315c | `RawMsgRx` | Raw CAM message (de-duplicated/ rate-limited) c0b70001-d4f4-4002-ada8-f99a02ee315c | `CamEvent` | Latest received CAM
c0b70001-d4f4-4004-ada8-f99a02ee315c | `CamEvent` | Latest received CAM c0b70001-d4f4-4003-ada8-f99a02ee315c | `RawMsgRx` | Raw DENM message (de-duplicated/ rate-limited)
c0b70001-d4f4-4005-ada8-f99a02ee315c | `RawMsgRx` | Raw DENM message (de-duplicated/ rate-limited) c0b70001-d4f4-4004-ada8-f99a02ee315c | `DenmEvent` | Latest received DENM
c0b70001-d4f4-4006-ada8-f99a02ee315c | `DenmEvent` | Latest received DENM c0b70001-d4f4-4005-ada8-f99a02ee315c | `RawMsgRx` | Raw MAPEM message (de-duplicated/ rate-limited)
c0b70001-d4f4-4007-ada8-f99a02ee315c | `RawMsgRx` | Raw MAPEM message (de-duplicated/ rate-limited) c0b70001-d4f4-4006-ada8-f99a02ee315c | `RawMsgRx` | Raw SPATEM message (de-duplicated/ rate-limited)
c0b70001-d4f4-4008-ada8-f99a02ee315c | `RawMsgRx` | Raw SPATEM message (de-duplicated/ rate-limited)
Since a modern BLE notification can only fit up tp 251 bytes of payload, the raw messages can only be polled.
Please subscribe to `c0b70001-d4f4-4002-ada8-f99a02ee315c` and use the message ID to determine from which service to read the incoming value.
## Message Format ## Message Format
@ -39,65 +35,15 @@ All data types are defined in one `.proto` file: [c_its-messages.proto](./c_its-
When there's no GNSS receiver connected to the ESP, position, heading and speed information can be set using a `PositionState` message (see [c_its-messages.proto](./c_its-messages.proto)). When there's no GNSS receiver connected to the ESP, position, heading and speed information can be set using a `PositionState` message (see [c_its-messages.proto](./c_its-messages.proto)).
Maximum message size (assuming realistic value ranges):
field name | tag size | (max.) data size
----------------- | -------- | ---------
timestamp_ms | 1 | 8 (I64)
position | 1 | 1 (LEN(10)) + sub-fields below
\+ latitude_deg | 1 | 4 (I32)
\+ longitude_deg | 1 | 4 (I32)
heading | 1 | 2 (VARINT(3600))
speed | 1 | 2 (VARINT(~163 m/s))
**SUM** | 6 + | 21 = 27 byte
### DENM Event ### DENM Event
Each received DENM will be "published" as a `DenmEvent` message (see [c_its-messages.proto](./c_its-messages.proto)). Each received DENM will be "published" as a `DenmEvent` message (see [c_its-messages.proto](./c_its-messages.proto)).
Repetitions of the same message (e.g. no changes to the validity timeframe and location) may be dropped by the BLE server. Repetitions of the same message (e.g. no changes to the validity timeframe and location) may be dropped by the BLE server.
Maximum message size (assuming realistic value ranges):
field name | tag size | (max.) data size
----------------- | -------- | ---------
timestamp | 1 | 8 (I64)
validity_end_ts | 1 | 8 (I64)
station_id | 1 | 8 (I64)
seq_num | 1 | 3 (VARINT(65535))
event_position | 1 | 1 (LEN(10)) + sub-fields below
\+ latitude_deg | 1 | 4 (I32)
\+ longitude_deg | 1 | 4 (I32)
event_heading_deg | 1 | 1 (VARINT(360))
direction | 1 | 1 (VARINT(3))
cause_code | 1 | 1 (VARINT(127))
sub_cause_code | 1 | 1 (VARINT(127))
**SUM** | 11 + | 40 = 51 byte
Note: Cause code and sub-cause code are technically 0..255 in the ASN.1 spec, but that's mainly to ensure backwards-compatibility of the CHOICE with the old wire format.
Realistically only cause codes up to 100 are defined and common sub-cause codes use values up to 22.
### CAM Event ### CAM Event
Each received (low-frequency) CAM will be "published" as a `CamEvent` message (see [c_its-messages.proto](./c_its-messages.proto)). Each received (low-frequency) CAM will be "published" as a `CamEvent` message (see [c_its-messages.proto](./c_its-messages.proto)).
Maximum message size (assuming realistic value ranges):
field name | tag size | (max.) data size
--------------------- | -------- | ---------
station_id | 1 | 8 (I64)
station_type | 1 | 1 (VARINT(15))
position | 1 | 1 (LEN(10)) + sub-fields below
\+ latitude_deg | 1 | 4 (I32)
\+ longitude_deg | 1 | 4 (I32)
vehicle_role | 1 | 1 (VARINT(15))
vehicle_data | 1 | 1 (LEN(11)) + sub-fields below
\+ heading_deg | 1 | 2 (VARINT(360))
\+ speed | 1 | 2 (VARINT(~163 m/s))
\+ vehicle_length_dm | 1 | 2 (VARINT(1023))
\+ vehicle_width_dm | 1 | 1 (VARINT(62))
**SUM** | 11 + | 27 = 38 byte
### Raw Received Message ### Raw Received Message
Received V2X messages will be "published" as a `RawMsgRx` message (see [c_its-messages.proto](./c_its-messages.proto)). Received V2X messages will be "published" as a `RawMsgRx` message (see [c_its-messages.proto](./c_its-messages.proto)).
@ -105,20 +51,3 @@ Repetitions of the same message should be dropped by the BLE server.
Consecutive messages with no relevant changes may be dropped by the BLE server while keeping some minimal publishing rate, e.g.: Consecutive messages with no relevant changes may be dropped by the BLE server while keeping some minimal publishing rate, e.g.:
- only publish MAPEMs every 10 seconds (since content doesn't change, but client may be restarted after first MAPEM from an intersection was received) - only publish MAPEMs every 10 seconds (since content doesn't change, but client may be restarted after first MAPEM from an intersection was received)
- drop high-frequency CAMs (only publish "full" CAMs which include the low-frequency container) - drop high-frequency CAMs (only publish "full" CAMs which include the low-frequency container)
Maximum message size (assuming realistic value ranges):
field name | tag size | (max.) data size
--------------------- | -------- | ---------
msg_type | 1 | 1 (VARINT(21))
payload | 1 | 2+1394 (LEN(1394) + payload)
**SUM** | 2 + | 1397 = 1399 byte
### Raw Message Notification
Maximum message size (assuming realistic value ranges):
field name | tag size | (max.) data size
--------------------- | -------- | ---------
msg_type | 1 | 1 (VARINT(21))
**SUM** | 1 + | 1 = 2 byte

View file

@ -71,10 +71,6 @@ message RawMsgTx {
optional uint32 stationType = 6; // for source position vector optional uint32 stationType = 6; // for source position vector
} }
message RawNotify {
required uint32 message_type = 1; // ITS `MessageId` integer value
}
// ------------------------------ // ------------------------------
// Messages // Messages
// ------------------------------ // ------------------------------
@ -87,7 +83,7 @@ message PositionState {
} }
message DenmEvent { message DenmEvent {
required fixed64 timestamp = 1; // DENM reference time as UNIX time (in seconds) required fixed64 timestamp = 1; // DENM reference time as UNIX time
required fixed64 validity_end_ts = 2; // UNIX time when event validity ends (from denm.management.validityDuration) required fixed64 validity_end_ts = 2; // UNIX time when event validity ends (from denm.management.validityDuration)
required fixed32 station_id = 3; // unique ID of the event when combined with `seq_num` required fixed32 station_id = 3; // unique ID of the event when combined with `seq_num`
required uint32 seq_num = 4; // unique ID of the event when combined with `station_id` required uint32 seq_num = 4; // unique ID of the event when combined with `station_id`

View file

@ -9,14 +9,10 @@ extended=${2:-false}
features_base=( features_base=(
uart,cam,denm uart,cam,denm
ble,cam,denm,cam_tx
uart,ble,cam,denm
spat,gnss_ubx,screen spat,gnss_ubx,screen
spat,gnss_ubx,screen,cam_tx spat,gnss_ubx,screen,cam_tx
) )
features_more=( features_more=(
spat,gnss_ubx,screen,ble
spat,gnss_ubx,screen,ble,cam_tx
spat,gnss_ubx,screen,cam,denm spat,gnss_ubx,screen,cam,denm
spat,gnss_ubx,screen,cam_tx,cam,denm spat,gnss_ubx,screen,cam_tx,cam,denm
) )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"board": { "board": {
"active_layer": 25, "active_layer": 0,
"active_layer_preset": "", "active_layer_preset": "",
"auto_track_width": true, "auto_track_width": true,
"hidden_netclasses": [], "hidden_netclasses": [],

View file

@ -38,25 +38,6 @@
"zx": -2.1759660739917308e-08, "zx": -2.1759660739917308e-08,
"zy": 0.6427874565124512, "zy": 0.6427874565124512,
"zz": 0.7660446763038635 "zz": 0.7660446763038635
},
{
"name": "ISO-front-sideways",
"ww": 1.0,
"wx": 12.766021728515625,
"wy": 18.745622634887695,
"wz": -19.07516098022461,
"xw": 0.0,
"xx": 0.3144621253013611,
"xy": -0.9000988006591797,
"xz": 0.30155274271965027,
"yw": 0.0,
"yx": 0.9491636157035828,
"yy": 0.29337260127067566,
"yz": -0.11412015557289124,
"zw": 0.0,
"zx": 0.014252186752855778,
"zy": 0.32210931181907654,
"zz": 0.9465939402580261
} }
], ],
"design_settings": { "design_settings": {
@ -311,7 +292,7 @@
"internal_id": "", "internal_id": "",
"mfg": "", "mfg": "",
"mpn": "", "mpn": "",
"sch_revision": "v1.0" "sch_revision": "v0.1"
}, },
"layer_pairs": [], "layer_pairs": [],
"layer_presets": [], "layer_presets": [],
@ -622,7 +603,6 @@
"netlist": "", "netlist": "",
"plot": "", "plot": "",
"specctra_dsn": "", "specctra_dsn": "",
"step": "",
"vrml": "" "vrml": ""
}, },
"page_layout_descr_file": "" "page_layout_descr_file": ""
@ -695,24 +675,12 @@
"label": "Datasheet", "label": "Datasheet",
"name": "Datasheet", "name": "Datasheet",
"show": true "show": true
},
{
"group_by": false,
"label": "Description",
"name": "Description",
"show": false
},
{
"group_by": false,
"label": "#",
"name": "${ITEM_NUMBER}",
"show": false
} }
], ],
"filter_string": "", "filter_string": "",
"group_symbols": true, "group_symbols": true,
"include_excluded_from_bom": true, "include_excluded_from_bom": true,
"name": "", "name": "Default Editing",
"sort_asc": true, "sort_asc": true,
"sort_field": "Reference" "sort_field": "Reference"
}, },
@ -757,7 +725,7 @@
"uuid": "9ad468b0-d7e4-4d4a-b652-c4a81a952e30" "uuid": "9ad468b0-d7e4-4d4a-b652-c4a81a952e30"
} }
], ],
"used_designators": "H1-4,C1,#PWR1-11,J1-2,SW1,TP1-5,U1-2,#FLG1-3", "used_designators": "C1,#PWR1-10,J1-2,SW1,TP1,U1-2,#FLG1-3",
"variants": [] "variants": []
}, },
"sheets": [ "sheets": [

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,118 +0,0 @@
(footprint "Mounting_Wuerth_WA-SNSN-2.0mm_H8mm_709653000"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(descr "Mounting Hardware, drill hole 2.0mm, height 8, Wuerth electronics 709653000 (https://www.we-online.com/components/products/datasheet/709653000.pdf)")
(tags "Mounting 2.0mm 709653000")
(property "Reference" "REF**"
(at 0 -3.95 0)
(layer "F.SilkS")
(uuid "276ecaff-3259-4bdb-a318-4e4bcec61921")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Value" "Mounting_Wuerth_WA-SNSN-2.0mm_H8mm_709653000"
(at 0 3.95 0)
(layer "F.Fab")
(uuid "c83307ee-1780-4e7c-ba49-6db91bf6d85c")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "76a81e5b-f76a-4297-b483-e56d634ec233")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "e8a2abe1-8c02-4d58-a78a-5aafa491e78a")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "KiLib_Generator" "mounting_hardware/Wuerth_SMT_spacer"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "7b7b4b98-57da-4b83-8a3a-d56209527a94")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(attr smd allow_soldermask_bridges)
(duplicate_pad_numbers_are_jumpers no)
(fp_circle
(center 0 0)
(end 1.75 0)
(stroke
(width 0.05)
(type solid)
)
(fill no)
(layer "F.CrtYd")
(uuid "03f6d4cc-b111-4551-92b5-a505d52ec32e")
)
(fp_circle
(center 0 0)
(end 1 0)
(stroke
(width 0.1)
(type solid)
)
(fill no)
(layer "F.Fab")
(uuid "51af9f8e-3050-418a-8fce-682c9308e104")
)
(fp_text user "${REFERENCE}"
(at 0 0 0)
(layer "F.Fab")
(uuid "25803184-0736-480c-b1a8-58343859c491")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(pad "" np_thru_hole circle
(at 0 0)
(size 2 2)
(drill 2)
(layers "*.Cu" "*.Mask")
(uuid "3cc834fb-6d81-4fd9-b1d5-2b09965b58a5")
)
(embedded_fonts no)
(model "${KIPRJMOD}/library/Mounting_Wuerth_WA-SNSN-2.0mm_H8mm_709653000.stp"
(offset
(xyz 0 0 4)
)
(scale
(xyz 1 1 1)
)
(rotate
(xyz -0 -0 -0)
)
)
)

View file

@ -1,118 +0,0 @@
(footprint "Mounting_Wuerth_WA-SNSR-3.0mm_H8mm_702910000"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(descr "Mounting Hardware, drill hole 3.0mm, height 8, Wuerth electronics 702910000 (https://www.we-online.com/components/products/datasheet/702910000.pdf)")
(tags "Mounting 3.0mm 702910000")
(property "Reference" "REF**"
(at 0 -3.95 0)
(layer "F.SilkS")
(uuid "519123da-9027-4dc9-983e-c1af92c74bca")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Value" "Mounting_Wuerth_WA-SNSR-3.0mm_H8mm_709653000"
(at 0 3.95 0)
(layer "F.Fab")
(uuid "657f373c-6469-4c2a-8d0a-45c1248a0096")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "4824841d-86d1-4c9e-82c6-3320ce9c3bc5")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "0b9c08cb-3ab2-4558-b34e-9ca94d9161ee")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "KiLib_Generator" "mounting_hardware/Wuerth_SMT_spacer"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "87f455aa-fb50-4a44-92ee-bcc8e5cdbb49")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(attr smd allow_soldermask_bridges)
(duplicate_pad_numbers_are_jumpers no)
(fp_circle
(center 0 0)
(end 2.05 0)
(stroke
(width 0.05)
(type solid)
)
(fill no)
(layer "F.CrtYd")
(uuid "23751fc5-61f6-4371-b602-56236ab6fac9")
)
(fp_circle
(center 0 0)
(end 1.5 0)
(stroke
(width 0.1)
(type solid)
)
(fill no)
(layer "F.Fab")
(uuid "c9ae63b4-7ec4-4016-9343-cf80bfc3df37")
)
(fp_text user "${REFERENCE}"
(at 0 0 0)
(layer "F.Fab")
(uuid "b42331e0-1e08-435a-b246-24a914b45f86")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(pad "" np_thru_hole circle
(at 0 0)
(size 3 3)
(drill 3)
(layers "*.Cu" "*.Mask")
(uuid "e8b39436-1604-4ea9-bc81-e168da01c5eb")
)
(embedded_fonts no)
(model "${KIPRJMOD}/library/Mounting_Wuerth_WA-SNSR-3.0mm_H8mm_702910000.stp"
(offset
(xyz 0 0 8)
)
(scale
(xyz 1 1 1)
)
(rotate
(xyz -180 -0 -0)
)
)
)

View file

@ -1,881 +0,0 @@
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/
/* OPTION: strings as raw bytes, not using required /X/ escapes */
FILE_DESCRIPTION(
/* description */ ('Unknown'),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ '702910000',
/* time_stamp */ '2019-02-18T11:42:06+01:00',
/* author */ ('Unknown'),
/* organization */ ('Unknown'),
/* preprocessor_version */ 'ST-DEVELOPER v16.7',
/* originating_system */ 'DEX',
/* authorisation */ $);
FILE_SCHEMA (('AUTOMOTIVE_DESIGN {1 0 10303 214 3 1 1}'));
ENDSEC;
DATA;
#10=PROPERTY_DEFINITION_REPRESENTATION(#14,#12);
#11=PROPERTY_DEFINITION_REPRESENTATION(#15,#13);
#12=REPRESENTATION('',(#16),#811);
#13=REPRESENTATION('',(#17),#811);
#14=PROPERTY_DEFINITION('pmi validation property','',#816);
#15=PROPERTY_DEFINITION('pmi validation property','',#816);
#16=VALUE_REPRESENTATION_ITEM('number of annotations',COUNT_MEASURE(0.));
#17=VALUE_REPRESENTATION_ITEM('number of views',COUNT_MEASURE(0.));
#18=SHAPE_REPRESENTATION_RELATIONSHIP('','',#439,#19);
#19=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#437),#811);
#20=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#688,#689,#690,#691),(#692,#693,
#694,#695),(#696,#697,#698,#699),(#700,#701,#702,#703),(#704,#705,#706,
#707),(#708,#709,#710,#711),(#712,#713,#714,#715),(#716,#717,#718,#719),
(#720,#721,#722,#723),(#724,#725,#726,#727)),.RULED_SURF.,.F.,.F.,.F.,(4,
2,2,2,4),(4,4),(0.,0.25,0.5,0.75,1.),(0.,1.),.UNSPECIFIED.);
#21=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#729,#730,#731,#732),(#733,#734,
#735,#736),(#737,#738,#739,#740),(#741,#742,#743,#744),(#745,#746,#747,
#748),(#749,#750,#751,#752),(#753,#754,#755,#756),(#757,#758,#759,#760),
(#761,#762,#763,#764),(#765,#766,#767,#768)),.RULED_SURF.,.F.,.F.,.F.,(4,
2,2,2,4),(4,4),(0.,0.25,0.5,0.75,1.),(0.,1.),.UNSPECIFIED.);
#22=B_SPLINE_CURVE_WITH_KNOTS('',3,(#630,#631,#632,#633,#634,#635,#636),
.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000392245374696745,0.000784490749393491,
0.00117673612409024,0.00156898149878698),.UNSPECIFIED.);
#23=B_SPLINE_CURVE_WITH_KNOTS('',3,(#644,#645,#646,#647,#648,#649,#650),
.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000392245374696745,0.000784490749393491,
0.00117673612409024,0.00156898149878698),.UNSPECIFIED.);
#24=B_SPLINE_CURVE_WITH_KNOTS('',3,(#780,#781,#782,#783,#784,#785,#786),
.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000396668400197497,0.000793336800394994,
0.00119000520059249,0.00158667360078999),.UNSPECIFIED.);
#25=B_SPLINE_CURVE_WITH_KNOTS('',3,(#791,#792,#793,#794,#795,#796,#797),
.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000396668400197497,0.000793336800394994,
0.00119000520059249,0.00158667360078999),.UNSPECIFIED.);
#26=CYLINDRICAL_SURFACE('',#449,2.);
#27=CYLINDRICAL_SURFACE('',#456,1.45);
#28=CYLINDRICAL_SURFACE('',#459,1.45);
#29=CYLINDRICAL_SURFACE('',#469,1.05);
#30=CYLINDRICAL_SURFACE('',#470,0.5);
#31=CYLINDRICAL_SURFACE('',#475,0.5);
#32=LINE('',#593,#72);
#33=LINE('',#595,#73);
#34=LINE('',#599,#74);
#35=LINE('',#601,#75);
#36=LINE('',#603,#76);
#37=LINE('',#605,#77);
#38=LINE('',#607,#78);
#39=LINE('',#609,#79);
#40=LINE('',#611,#80);
#41=LINE('',#613,#81);
#42=LINE('',#615,#82);
#43=LINE('',#617,#83);
#44=LINE('',#619,#84);
#45=LINE('',#622,#85);
#46=LINE('',#626,#86);
#47=LINE('',#628,#87);
#48=LINE('',#638,#88);
#49=LINE('',#642,#89);
#50=LINE('',#654,#90);
#51=LINE('',#656,#91);
#52=LINE('',#660,#92);
#53=LINE('',#662,#93);
#54=LINE('',#667,#94);
#55=LINE('',#671,#95);
#56=LINE('',#673,#96);
#57=LINE('',#675,#97);
#58=LINE('',#677,#98);
#59=LINE('',#681,#99);
#60=LINE('',#683,#100);
#61=LINE('',#685,#101);
#62=LINE('',#772,#102);
#63=LINE('',#774,#103);
#64=LINE('',#778,#104);
#65=LINE('',#788,#105);
#66=LINE('',#789,#106);
#67=LINE('',#799,#107);
#68=LINE('',#801,#108);
#69=LINE('',#802,#109);
#70=LINE('',#806,#110);
#71=LINE('',#808,#111);
#72=VECTOR('',#482,1000.);
#73=VECTOR('',#483,1000.);
#74=VECTOR('',#486,1000.);
#75=VECTOR('',#487,1000.);
#76=VECTOR('',#490,1000.);
#77=VECTOR('',#491,1000.);
#78=VECTOR('',#492,1000.);
#79=VECTOR('',#493,1000.);
#80=VECTOR('',#496,1000.);
#81=VECTOR('',#497,1000.);
#82=VECTOR('',#498,1000.);
#83=VECTOR('',#499,1000.);
#84=VECTOR('',#502,1000.);
#85=VECTOR('',#505,1000.);
#86=VECTOR('',#510,1000.);
#87=VECTOR('',#511,1000.);
#88=VECTOR('',#512,1000.);
#89=VECTOR('',#515,1000.);
#90=VECTOR('',#520,1000.);
#91=VECTOR('',#521,1000.);
#92=VECTOR('',#524,1000.);
#93=VECTOR('',#525,1000.);
#94=VECTOR('',#532,1000.);
#95=VECTOR('',#535,1000.);
#96=VECTOR('',#538,1000.);
#97=VECTOR('',#539,1000.);
#98=VECTOR('',#540,1000.);
#99=VECTOR('',#547,1000.);
#100=VECTOR('',#548,1000.);
#101=VECTOR('',#549,1000.);
#102=VECTOR('',#562,1000.);
#103=VECTOR('',#563,1000.);
#104=VECTOR('',#568,1000.);
#105=VECTOR('',#569,1000.);
#106=VECTOR('',#570,1000.);
#107=VECTOR('',#571,1000.);
#108=VECTOR('',#574,1000.);
#109=VECTOR('',#575,1000.);
#110=VECTOR('',#582,1000.);
#111=VECTOR('',#585,1000.);
#112=ORIENTED_EDGE('',*,*,#228,.F.);
#113=ORIENTED_EDGE('',*,*,#229,.T.);
#114=ORIENTED_EDGE('',*,*,#230,.T.);
#115=ORIENTED_EDGE('',*,*,#231,.T.);
#116=ORIENTED_EDGE('',*,*,#232,.T.);
#117=ORIENTED_EDGE('',*,*,#233,.T.);
#118=ORIENTED_EDGE('',*,*,#234,.F.);
#119=ORIENTED_EDGE('',*,*,#235,.T.);
#120=ORIENTED_EDGE('',*,*,#236,.F.);
#121=ORIENTED_EDGE('',*,*,#237,.T.);
#122=ORIENTED_EDGE('',*,*,#230,.F.);
#123=ORIENTED_EDGE('',*,*,#238,.F.);
#124=ORIENTED_EDGE('',*,*,#232,.F.);
#125=ORIENTED_EDGE('',*,*,#239,.F.);
#126=ORIENTED_EDGE('',*,*,#240,.F.);
#127=ORIENTED_EDGE('',*,*,#241,.F.);
#128=ORIENTED_EDGE('',*,*,#242,.T.);
#129=ORIENTED_EDGE('',*,*,#243,.F.);
#130=ORIENTED_EDGE('',*,*,#244,.T.);
#131=ORIENTED_EDGE('',*,*,#245,.F.);
#132=ORIENTED_EDGE('',*,*,#246,.F.);
#133=ORIENTED_EDGE('',*,*,#228,.T.);
#134=ORIENTED_EDGE('',*,*,#247,.F.);
#135=ORIENTED_EDGE('',*,*,#248,.F.);
#136=ORIENTED_EDGE('',*,*,#249,.F.);
#137=ORIENTED_EDGE('',*,*,#250,.T.);
#138=ORIENTED_EDGE('',*,*,#251,.F.);
#139=ORIENTED_EDGE('',*,*,#252,.F.);
#140=ORIENTED_EDGE('',*,*,#253,.F.);
#141=ORIENTED_EDGE('',*,*,#250,.F.);
#142=ORIENTED_EDGE('',*,*,#254,.T.);
#143=ORIENTED_EDGE('',*,*,#255,.T.);
#144=ORIENTED_EDGE('',*,*,#256,.T.);
#145=ORIENTED_EDGE('',*,*,#257,.T.);
#146=ORIENTED_EDGE('',*,*,#258,.T.);
#147=ORIENTED_EDGE('',*,*,#259,.F.);
#148=ORIENTED_EDGE('',*,*,#253,.T.);
#149=ORIENTED_EDGE('',*,*,#256,.F.);
#150=ORIENTED_EDGE('',*,*,#260,.F.);
#151=ORIENTED_EDGE('',*,*,#261,.T.);
#152=ORIENTED_EDGE('',*,*,#262,.T.);
#153=ORIENTED_EDGE('',*,*,#263,.F.);
#154=ORIENTED_EDGE('',*,*,#257,.F.);
#155=ORIENTED_EDGE('',*,*,#262,.F.);
#156=ORIENTED_EDGE('',*,*,#264,.F.);
#157=ORIENTED_EDGE('',*,*,#265,.F.);
#158=ORIENTED_EDGE('',*,*,#231,.F.);
#159=ORIENTED_EDGE('',*,*,#237,.F.);
#160=ORIENTED_EDGE('',*,*,#266,.T.);
#161=ORIENTED_EDGE('',*,*,#239,.T.);
#162=ORIENTED_EDGE('',*,*,#267,.F.);
#163=ORIENTED_EDGE('',*,*,#268,.T.);
#164=ORIENTED_EDGE('',*,*,#269,.F.);
#165=ORIENTED_EDGE('',*,*,#260,.T.);
#166=ORIENTED_EDGE('',*,*,#255,.F.);
#167=ORIENTED_EDGE('',*,*,#261,.F.);
#168=ORIENTED_EDGE('',*,*,#269,.T.);
#169=ORIENTED_EDGE('',*,*,#270,.T.);
#170=ORIENTED_EDGE('',*,*,#264,.T.);
#171=ORIENTED_EDGE('',*,*,#271,.F.);
#172=ORIENTED_EDGE('',*,*,#235,.F.);
#173=ORIENTED_EDGE('',*,*,#243,.T.);
#174=ORIENTED_EDGE('',*,*,#241,.T.);
#175=ORIENTED_EDGE('',*,*,#265,.T.);
#176=ORIENTED_EDGE('',*,*,#270,.F.);
#177=ORIENTED_EDGE('',*,*,#268,.F.);
#178=ORIENTED_EDGE('',*,*,#272,.T.);
#179=ORIENTED_EDGE('',*,*,#266,.F.);
#180=ORIENTED_EDGE('',*,*,#236,.T.);
#181=ORIENTED_EDGE('',*,*,#271,.T.);
#182=ORIENTED_EDGE('',*,*,#240,.T.);
#183=ORIENTED_EDGE('',*,*,#273,.F.);
#184=ORIENTED_EDGE('',*,*,#272,.F.);
#185=ORIENTED_EDGE('',*,*,#274,.F.);
#186=ORIENTED_EDGE('',*,*,#275,.F.);
#187=ORIENTED_EDGE('',*,*,#245,.T.);
#188=ORIENTED_EDGE('',*,*,#276,.T.);
#189=ORIENTED_EDGE('',*,*,#277,.T.);
#190=ORIENTED_EDGE('',*,*,#278,.T.);
#191=ORIENTED_EDGE('',*,*,#275,.T.);
#192=ORIENTED_EDGE('',*,*,#279,.T.);
#193=ORIENTED_EDGE('',*,*,#280,.T.);
#194=ORIENTED_EDGE('',*,*,#281,.T.);
#195=ORIENTED_EDGE('',*,*,#259,.T.);
#196=ORIENTED_EDGE('',*,*,#248,.T.);
#197=ORIENTED_EDGE('',*,*,#282,.F.);
#198=ORIENTED_EDGE('',*,*,#280,.F.);
#199=ORIENTED_EDGE('',*,*,#283,.T.);
#200=ORIENTED_EDGE('',*,*,#249,.T.);
#201=ORIENTED_EDGE('',*,*,#283,.F.);
#202=ORIENTED_EDGE('',*,*,#279,.F.);
#203=ORIENTED_EDGE('',*,*,#274,.T.);
#204=ORIENTED_EDGE('',*,*,#267,.T.);
#205=ORIENTED_EDGE('',*,*,#254,.F.);
#206=ORIENTED_EDGE('',*,*,#247,.T.);
#207=ORIENTED_EDGE('',*,*,#233,.F.);
#208=ORIENTED_EDGE('',*,*,#238,.T.);
#209=ORIENTED_EDGE('',*,*,#242,.F.);
#210=ORIENTED_EDGE('',*,*,#281,.F.);
#211=ORIENTED_EDGE('',*,*,#282,.T.);
#212=ORIENTED_EDGE('',*,*,#246,.T.);
#213=ORIENTED_EDGE('',*,*,#284,.T.);
#214=ORIENTED_EDGE('',*,*,#276,.F.);
#215=ORIENTED_EDGE('',*,*,#244,.F.);
#216=ORIENTED_EDGE('',*,*,#234,.T.);
#217=ORIENTED_EDGE('',*,*,#229,.F.);
#218=ORIENTED_EDGE('',*,*,#251,.T.);
#219=ORIENTED_EDGE('',*,*,#258,.F.);
#220=ORIENTED_EDGE('',*,*,#263,.T.);
#221=ORIENTED_EDGE('',*,*,#273,.T.);
#222=ORIENTED_EDGE('',*,*,#278,.F.);
#223=ORIENTED_EDGE('',*,*,#285,.F.);
#224=ORIENTED_EDGE('',*,*,#252,.T.);
#225=ORIENTED_EDGE('',*,*,#285,.T.);
#226=ORIENTED_EDGE('',*,*,#277,.F.);
#227=ORIENTED_EDGE('',*,*,#284,.F.);
#228=EDGE_CURVE('',#286,#287,#324,.T.);
#229=EDGE_CURVE('',#286,#288,#32,.T.);
#230=EDGE_CURVE('',#288,#289,#33,.T.);
#231=EDGE_CURVE('',#289,#290,#325,.T.);
#232=EDGE_CURVE('',#290,#291,#34,.T.);
#233=EDGE_CURVE('',#291,#287,#35,.T.);
#234=EDGE_CURVE('',#292,#288,#36,.T.);
#235=EDGE_CURVE('',#292,#293,#37,.T.);
#236=EDGE_CURVE('',#294,#293,#38,.T.);
#237=EDGE_CURVE('',#294,#289,#39,.T.);
#238=EDGE_CURVE('',#291,#295,#40,.T.);
#239=EDGE_CURVE('',#296,#290,#41,.T.);
#240=EDGE_CURVE('',#297,#296,#42,.T.);
#241=EDGE_CURVE('',#295,#297,#43,.T.);
#242=EDGE_CURVE('',#298,#295,#44,.T.);
#243=EDGE_CURVE('',#292,#295,#326,.F.);
#244=EDGE_CURVE('',#292,#299,#45,.T.);
#245=EDGE_CURVE('',#298,#299,#327,.T.);
#246=EDGE_CURVE('',#286,#300,#46,.T.);
#247=EDGE_CURVE('',#301,#287,#47,.F.);
#248=EDGE_CURVE('',#302,#301,#22,.T.);
#249=EDGE_CURVE('',#303,#302,#48,.T.);
#250=EDGE_CURVE('',#303,#304,#328,.T.);
#251=EDGE_CURVE('',#305,#304,#49,.F.);
#252=EDGE_CURVE('',#300,#305,#23,.T.);
#253=EDGE_CURVE('',#306,#306,#329,.T.);
#254=EDGE_CURVE('',#303,#307,#50,.T.);
#255=EDGE_CURVE('',#307,#308,#51,.T.);
#256=EDGE_CURVE('',#308,#309,#330,.T.);
#257=EDGE_CURVE('',#309,#310,#52,.T.);
#258=EDGE_CURVE('',#310,#304,#53,.T.);
#259=EDGE_CURVE('',#311,#311,#331,.T.);
#260=EDGE_CURVE('',#312,#308,#54,.T.);
#261=EDGE_CURVE('',#312,#313,#332,.T.);
#262=EDGE_CURVE('',#313,#309,#55,.T.);
#263=EDGE_CURVE('',#310,#314,#56,.T.);
#264=EDGE_CURVE('',#315,#313,#57,.T.);
#265=EDGE_CURVE('',#314,#315,#58,.T.);
#266=EDGE_CURVE('',#294,#296,#333,.T.);
#267=EDGE_CURVE('',#316,#307,#59,.T.);
#268=EDGE_CURVE('',#316,#317,#60,.T.);
#269=EDGE_CURVE('',#312,#317,#61,.T.);
#270=EDGE_CURVE('',#317,#315,#334,.T.);
#271=EDGE_CURVE('',#293,#297,#335,.T.);
#272=EDGE_CURVE('',#316,#314,#336,.F.);
#273=EDGE_CURVE('',#314,#318,#62,.T.);
#274=EDGE_CURVE('',#319,#316,#63,.T.);
#275=EDGE_CURVE('',#318,#319,#337,.T.);
#276=EDGE_CURVE('',#299,#320,#64,.T.);
#277=EDGE_CURVE('',#320,#321,#24,.T.);
#278=EDGE_CURVE('',#321,#318,#65,.F.);
#279=EDGE_CURVE('',#319,#322,#66,.T.);
#280=EDGE_CURVE('',#322,#323,#25,.T.);
#281=EDGE_CURVE('',#323,#298,#67,.F.);
#282=EDGE_CURVE('',#323,#301,#68,.T.);
#283=EDGE_CURVE('',#322,#302,#69,.T.);
#284=EDGE_CURVE('',#300,#320,#70,.T.);
#285=EDGE_CURVE('',#305,#321,#71,.T.);
#286=VERTEX_POINT('',#591);
#287=VERTEX_POINT('',#592);
#288=VERTEX_POINT('',#594);
#289=VERTEX_POINT('',#596);
#290=VERTEX_POINT('',#598);
#291=VERTEX_POINT('',#600);
#292=VERTEX_POINT('',#604);
#293=VERTEX_POINT('',#606);
#294=VERTEX_POINT('',#608);
#295=VERTEX_POINT('',#612);
#296=VERTEX_POINT('',#614);
#297=VERTEX_POINT('',#616);
#298=VERTEX_POINT('',#620);
#299=VERTEX_POINT('',#623);
#300=VERTEX_POINT('',#627);
#301=VERTEX_POINT('',#629);
#302=VERTEX_POINT('',#637);
#303=VERTEX_POINT('',#639);
#304=VERTEX_POINT('',#641);
#305=VERTEX_POINT('',#643);
#306=VERTEX_POINT('',#652);
#307=VERTEX_POINT('',#655);
#308=VERTEX_POINT('',#657);
#309=VERTEX_POINT('',#659);
#310=VERTEX_POINT('',#661);
#311=VERTEX_POINT('',#665);
#312=VERTEX_POINT('',#668);
#313=VERTEX_POINT('',#670);
#314=VERTEX_POINT('',#674);
#315=VERTEX_POINT('',#676);
#316=VERTEX_POINT('',#682);
#317=VERTEX_POINT('',#684);
#318=VERTEX_POINT('',#773);
#319=VERTEX_POINT('',#775);
#320=VERTEX_POINT('',#779);
#321=VERTEX_POINT('',#787);
#322=VERTEX_POINT('',#790);
#323=VERTEX_POINT('',#798);
#324=CIRCLE('',#442,2.);
#325=CIRCLE('',#443,1.45);
#326=CIRCLE('',#447,1.41666666666667);
#327=CIRCLE('',#448,1.05);
#328=CIRCLE('',#450,2.);
#329=CIRCLE('',#451,2.);
#330=CIRCLE('',#453,1.45);
#331=CIRCLE('',#455,1.05);
#332=CIRCLE('',#457,1.45);
#333=CIRCLE('',#460,1.45);
#334=CIRCLE('',#463,1.65);
#335=CIRCLE('',#464,1.65);
#336=CIRCLE('',#465,1.41666666666667);
#337=CIRCLE('',#468,1.05);
#338=EDGE_LOOP('',(#112,#113,#114,#115,#116,#117));
#339=EDGE_LOOP('',(#118,#119,#120,#121,#122));
#340=EDGE_LOOP('',(#123,#124,#125,#126,#127));
#341=EDGE_LOOP('',(#128,#129,#130,#131));
#342=EDGE_LOOP('',(#132,#133,#134,#135,#136,#137,#138,#139));
#343=EDGE_LOOP('',(#140));
#344=EDGE_LOOP('',(#141,#142,#143,#144,#145,#146));
#345=EDGE_LOOP('',(#147));
#346=EDGE_LOOP('',(#148));
#347=EDGE_LOOP('',(#149,#150,#151,#152));
#348=EDGE_LOOP('',(#153,#154,#155,#156,#157));
#349=EDGE_LOOP('',(#158,#159,#160,#161));
#350=EDGE_LOOP('',(#162,#163,#164,#165,#166));
#351=EDGE_LOOP('',(#167,#168,#169,#170));
#352=EDGE_LOOP('',(#171,#172,#173,#174));
#353=EDGE_LOOP('',(#175,#176,#177,#178));
#354=EDGE_LOOP('',(#179,#180,#181,#182));
#355=EDGE_LOOP('',(#183,#184,#185,#186));
#356=EDGE_LOOP('',(#187,#188,#189,#190,#191,#192,#193,#194));
#357=EDGE_LOOP('',(#195));
#358=EDGE_LOOP('',(#196,#197,#198,#199));
#359=EDGE_LOOP('',(#200,#201,#202,#203,#204,#205));
#360=EDGE_LOOP('',(#206,#207,#208,#209,#210,#211));
#361=EDGE_LOOP('',(#212,#213,#214,#215,#216,#217));
#362=EDGE_LOOP('',(#218,#219,#220,#221,#222,#223));
#363=EDGE_LOOP('',(#224,#225,#226,#227));
#364=FACE_BOUND('',#338,.T.);
#365=FACE_BOUND('',#339,.T.);
#366=FACE_BOUND('',#340,.T.);
#367=FACE_BOUND('',#341,.T.);
#368=FACE_BOUND('',#342,.T.);
#369=FACE_BOUND('',#343,.T.);
#370=FACE_BOUND('',#344,.T.);
#371=FACE_BOUND('',#345,.T.);
#372=FACE_BOUND('',#346,.T.);
#373=FACE_BOUND('',#347,.T.);
#374=FACE_BOUND('',#348,.T.);
#375=FACE_BOUND('',#349,.T.);
#376=FACE_BOUND('',#350,.T.);
#377=FACE_BOUND('',#351,.T.);
#378=FACE_BOUND('',#352,.T.);
#379=FACE_BOUND('',#353,.T.);
#380=FACE_BOUND('',#354,.T.);
#381=FACE_BOUND('',#355,.T.);
#382=FACE_BOUND('',#356,.T.);
#383=FACE_BOUND('',#357,.T.);
#384=FACE_BOUND('',#358,.T.);
#385=FACE_BOUND('',#359,.T.);
#386=FACE_BOUND('',#360,.T.);
#387=FACE_BOUND('',#361,.T.);
#388=FACE_BOUND('',#362,.T.);
#389=FACE_BOUND('',#363,.T.);
#390=PLANE('',#441);
#391=PLANE('',#444);
#392=PLANE('',#445);
#393=PLANE('',#446);
#394=PLANE('',#452);
#395=PLANE('',#454);
#396=PLANE('',#458);
#397=PLANE('',#461);
#398=PLANE('',#462);
#399=PLANE('',#466);
#400=PLANE('',#467);
#401=PLANE('',#471);
#402=PLANE('',#472);
#403=PLANE('',#473);
#404=PLANE('',#474);
#405=ADVANCED_FACE('',(#364),#390,.F.);
#406=ADVANCED_FACE('',(#365),#391,.T.);
#407=ADVANCED_FACE('',(#366),#392,.T.);
#408=ADVANCED_FACE('',(#367),#393,.T.);
#409=ADVANCED_FACE('',(#368,#369),#26,.T.);
#410=ADVANCED_FACE('',(#370),#394,.F.);
#411=ADVANCED_FACE('',(#371,#372),#395,.T.);
#412=ADVANCED_FACE('',(#373),#27,.T.);
#413=ADVANCED_FACE('',(#374),#396,.T.);
#414=ADVANCED_FACE('',(#375),#28,.T.);
#415=ADVANCED_FACE('',(#376),#397,.T.);
#416=ADVANCED_FACE('',(#377),#398,.T.);
#417=ADVANCED_FACE('',(#378),#20,.T.);
#418=ADVANCED_FACE('',(#379),#21,.T.);
#419=ADVANCED_FACE('',(#380),#399,.T.);
#420=ADVANCED_FACE('',(#381),#400,.T.);
#421=ADVANCED_FACE('',(#382,#383),#29,.F.);
#422=ADVANCED_FACE('',(#384),#30,.F.);
#423=ADVANCED_FACE('',(#385),#401,.F.);
#424=ADVANCED_FACE('',(#386),#402,.F.);
#425=ADVANCED_FACE('',(#387),#403,.F.);
#426=ADVANCED_FACE('',(#388),#404,.F.);
#427=ADVANCED_FACE('',(#389),#31,.F.);
#428=CLOSED_SHELL('',(#405,#406,#407,#408,#409,#410,#411,#412,#413,#414,
#415,#416,#417,#418,#419,#420,#421,#422,#423,#424,#425,#426,#427));
#429=STYLED_ITEM('',(#430),#437);
#430=PRESENTATION_STYLE_ASSIGNMENT((#431));
#431=SURFACE_STYLE_USAGE(.BOTH.,#432);
#432=SURFACE_SIDE_STYLE('',(#433));
#433=SURFACE_STYLE_FILL_AREA(#434);
#434=FILL_AREA_STYLE('',(#435));
#435=FILL_AREA_STYLE_COLOUR('',#436);
#436=COLOUR_RGB('',0.645180702209473,0.678915679454803,0.699999988079071);
#437=MANIFOLD_SOLID_BREP('',#428);
#438=SHAPE_DEFINITION_REPRESENTATION(#816,#439);
#439=SHAPE_REPRESENTATION('702910000',(#440),#811);
#440=AXIS2_PLACEMENT_3D('',#588,#476,#477);
#441=AXIS2_PLACEMENT_3D('',#589,#478,#479);
#442=AXIS2_PLACEMENT_3D('',#590,#480,#481);
#443=AXIS2_PLACEMENT_3D('',#597,#484,#485);
#444=AXIS2_PLACEMENT_3D('',#602,#488,#489);
#445=AXIS2_PLACEMENT_3D('',#610,#494,#495);
#446=AXIS2_PLACEMENT_3D('',#618,#500,#501);
#447=AXIS2_PLACEMENT_3D('',#621,#503,#504);
#448=AXIS2_PLACEMENT_3D('',#624,#506,#507);
#449=AXIS2_PLACEMENT_3D('',#625,#508,#509);
#450=AXIS2_PLACEMENT_3D('',#640,#513,#514);
#451=AXIS2_PLACEMENT_3D('',#651,#516,#517);
#452=AXIS2_PLACEMENT_3D('',#653,#518,#519);
#453=AXIS2_PLACEMENT_3D('',#658,#522,#523);
#454=AXIS2_PLACEMENT_3D('',#663,#526,#527);
#455=AXIS2_PLACEMENT_3D('',#664,#528,#529);
#456=AXIS2_PLACEMENT_3D('',#666,#530,#531);
#457=AXIS2_PLACEMENT_3D('',#669,#533,#534);
#458=AXIS2_PLACEMENT_3D('',#672,#536,#537);
#459=AXIS2_PLACEMENT_3D('',#678,#541,#542);
#460=AXIS2_PLACEMENT_3D('',#679,#543,#544);
#461=AXIS2_PLACEMENT_3D('',#680,#545,#546);
#462=AXIS2_PLACEMENT_3D('',#686,#550,#551);
#463=AXIS2_PLACEMENT_3D('',#687,#552,#553);
#464=AXIS2_PLACEMENT_3D('',#728,#554,#555);
#465=AXIS2_PLACEMENT_3D('',#769,#556,#557);
#466=AXIS2_PLACEMENT_3D('',#770,#558,#559);
#467=AXIS2_PLACEMENT_3D('',#771,#560,#561);
#468=AXIS2_PLACEMENT_3D('',#776,#564,#565);
#469=AXIS2_PLACEMENT_3D('',#777,#566,#567);
#470=AXIS2_PLACEMENT_3D('',#800,#572,#573);
#471=AXIS2_PLACEMENT_3D('',#803,#576,#577);
#472=AXIS2_PLACEMENT_3D('',#804,#578,#579);
#473=AXIS2_PLACEMENT_3D('',#805,#580,#581);
#474=AXIS2_PLACEMENT_3D('',#807,#583,#584);
#475=AXIS2_PLACEMENT_3D('',#809,#586,#587);
#476=DIRECTION('',(0.,0.,1.));
#477=DIRECTION('',(1.,0.,0.));
#478=DIRECTION('',(0.,0.,-1.));
#479=DIRECTION('',(-1.,0.,0.));
#480=DIRECTION('',(0.,0.,-1.));
#481=DIRECTION('',(1.,0.,0.));
#482=DIRECTION('',(0.,-1.,0.));
#483=DIRECTION('',(1.,0.,0.));
#484=DIRECTION('',(0.,0.,-1.));
#485=DIRECTION('',(-1.,0.,0.));
#486=DIRECTION('',(-1.,0.,0.));
#487=DIRECTION('',(0.,-1.,0.));
#488=DIRECTION('',(0.,1.,0.));
#489=DIRECTION('',(0.,0.,1.));
#490=DIRECTION('',(0.,0.,-1.));
#491=DIRECTION('',(0.499793860084399,-9.39075625001479E-16,-0.866144386013057));
#492=DIRECTION('',(1.,1.00665644535995E-16,0.));
#493=DIRECTION('',(0.,0.,-1.));
#494=DIRECTION('',(0.,-1.,0.));
#495=DIRECTION('',(0.,0.,-1.));
#496=DIRECTION('',(0.,0.,1.));
#497=DIRECTION('',(0.,0.,-1.));
#498=DIRECTION('',(-1.,-5.03328222679975E-16,0.));
#499=DIRECTION('',(0.499793860084399,5.63445375000888E-16,-0.866144386013057));
#500=DIRECTION('',(0.,0.,1.));
#501=DIRECTION('',(1.,0.,0.));
#502=DIRECTION('',(0.,-1.,0.));
#503=DIRECTION('',(0.,0.,1.));
#504=DIRECTION('',(-1.,0.,0.));
#505=DIRECTION('',(0.,-1.,0.));
#506=DIRECTION('',(0.,0.,1.));
#507=DIRECTION('',(1.,0.,0.));
#508=DIRECTION('',(0.,0.,-1.));
#509=DIRECTION('',(-1.,0.,0.));
#510=DIRECTION('',(0.,0.,-1.));
#511=DIRECTION('',(0.,0.,-1.));
#512=DIRECTION('',(0.,0.,-1.));
#513=DIRECTION('',(0.,0.,-1.));
#514=DIRECTION('',(1.,0.,0.));
#515=DIRECTION('',(0.,0.,-1.));
#516=DIRECTION('',(0.,0.,-1.));
#517=DIRECTION('',(1.,0.,0.));
#518=DIRECTION('',(0.,0.,-1.));
#519=DIRECTION('',(-1.,0.,0.));
#520=DIRECTION('',(0.,1.,0.));
#521=DIRECTION('',(-1.,0.,0.));
#522=DIRECTION('',(0.,0.,-1.));
#523=DIRECTION('',(1.,0.,0.));
#524=DIRECTION('',(1.,0.,0.));
#525=DIRECTION('',(0.,1.,0.));
#526=DIRECTION('',(0.,0.,-1.));
#527=DIRECTION('',(-1.,0.,0.));
#528=DIRECTION('',(0.,0.,-1.));
#529=DIRECTION('',(-1.,0.,0.));
#530=DIRECTION('',(0.,0.,-1.));
#531=DIRECTION('',(-1.,0.,0.));
#532=DIRECTION('',(0.,0.,-1.));
#533=DIRECTION('',(0.,0.,-1.));
#534=DIRECTION('',(1.,0.,0.));
#535=DIRECTION('',(0.,0.,-1.));
#536=DIRECTION('',(0.,1.,0.));
#537=DIRECTION('',(0.,0.,1.));
#538=DIRECTION('',(0.,0.,1.));
#539=DIRECTION('',(1.,1.00665644535995E-16,0.));
#540=DIRECTION('',(-0.499793860084399,-5.63445375000888E-16,-0.866144386013057));
#541=DIRECTION('',(0.,0.,-1.));
#542=DIRECTION('',(-1.,0.,0.));
#543=DIRECTION('',(0.,0.,-1.));
#544=DIRECTION('',(-1.,0.,0.));
#545=DIRECTION('',(0.,-1.,0.));
#546=DIRECTION('',(0.,0.,-1.));
#547=DIRECTION('',(0.,0.,-1.));
#548=DIRECTION('',(-0.499793860084398,-3.75630250000592E-16,-0.866144386013058));
#549=DIRECTION('',(-1.,-5.03328222679975E-16,0.));
#550=DIRECTION('',(0.,0.,-1.));
#551=DIRECTION('',(-1.,0.,0.));
#552=DIRECTION('',(0.,0.,-1.));
#553=DIRECTION('',(1.,0.,0.));
#554=DIRECTION('',(0.,0.,-1.));
#555=DIRECTION('',(-1.,0.,0.));
#556=DIRECTION('',(0.,0.,1.));
#557=DIRECTION('',(1.,0.,0.));
#558=DIRECTION('',(0.,0.,-1.));
#559=DIRECTION('',(-1.,0.,0.));
#560=DIRECTION('',(0.,0.,1.));
#561=DIRECTION('',(1.,0.,0.));
#562=DIRECTION('',(0.,-1.,0.));
#563=DIRECTION('',(0.,-1.,0.));
#564=DIRECTION('',(0.,0.,1.));
#565=DIRECTION('',(1.,0.,0.));
#566=DIRECTION('',(0.,0.,-1.));
#567=DIRECTION('',(-1.,0.,0.));
#568=DIRECTION('',(0.,0.,-1.));
#569=DIRECTION('',(0.,0.,-1.));
#570=DIRECTION('',(0.,0.,-1.));
#571=DIRECTION('',(0.,0.,-1.));
#572=DIRECTION('',(0.,-1.,0.));
#573=DIRECTION('',(0.,0.,-1.));
#574=DIRECTION('',(0.,-1.,0.));
#575=DIRECTION('',(0.,-1.,0.));
#576=DIRECTION('',(-1.,0.,0.));
#577=DIRECTION('',(0.,0.,1.));
#578=DIRECTION('',(1.,0.,0.));
#579=DIRECTION('',(0.,0.,-1.));
#580=DIRECTION('',(1.,0.,0.));
#581=DIRECTION('',(0.,0.,-1.));
#582=DIRECTION('',(0.,-1.,0.));
#583=DIRECTION('',(-1.,0.,0.));
#584=DIRECTION('',(0.,0.,1.));
#585=DIRECTION('',(0.,-1.,0.));
#586=DIRECTION('',(0.,-1.,0.));
#587=DIRECTION('',(0.,0.,-1.));
#588=CARTESIAN_POINT('',(0.,0.,0.));
#589=CARTESIAN_POINT('',(0.,0.,8.));
#590=CARTESIAN_POINT('',(0.,0.,8.));
#591=CARTESIAN_POINT('',(0.499999999999999,1.93649167310371,8.));
#592=CARTESIAN_POINT('',(0.499999999999999,-1.93649167310371,8.));
#593=CARTESIAN_POINT('',(0.499999999999999,0.,8.));
#594=CARTESIAN_POINT('',(0.499999999999999,1.25,8.));
#595=CARTESIAN_POINT('',(-0.734846922834953,1.25,8.));
#596=CARTESIAN_POINT('',(0.734846922834953,1.25,8.));
#597=CARTESIAN_POINT('',(0.,0.,8.));
#598=CARTESIAN_POINT('',(0.734846922834953,-1.25,8.));
#599=CARTESIAN_POINT('',(0.734846922834953,-1.25,8.));
#600=CARTESIAN_POINT('',(0.499999999999999,-1.25,8.));
#601=CARTESIAN_POINT('',(0.499999999999999,0.,8.));
#602=CARTESIAN_POINT('',(-0.734846922834953,1.25,9.7));
#603=CARTESIAN_POINT('',(0.499999999999999,1.25,9.7));
#604=CARTESIAN_POINT('',(0.499999999999999,1.25,10.7));
#605=CARTESIAN_POINT('',(0.5,1.25,10.7));
#606=CARTESIAN_POINT('',(1.0770329614269,1.25,9.7));
#607=CARTESIAN_POINT('',(-1.0770329614269,1.25,9.7));
#608=CARTESIAN_POINT('',(0.734846922834953,1.25,9.7));
#609=CARTESIAN_POINT('',(0.734846922834953,1.25,9.7));
#610=CARTESIAN_POINT('',(0.734846922834953,-1.25,9.7));
#611=CARTESIAN_POINT('',(0.499999999999999,-1.25,9.7));
#612=CARTESIAN_POINT('',(0.499999999999999,-1.25,10.7));
#613=CARTESIAN_POINT('',(0.734846922834953,-1.25,9.7));
#614=CARTESIAN_POINT('',(0.734846922834953,-1.25,9.7));
#615=CARTESIAN_POINT('',(1.0770329614269,-1.25,9.7));
#616=CARTESIAN_POINT('',(1.0770329614269,-1.25,9.7));
#617=CARTESIAN_POINT('',(0.5,-1.25,10.7));
#618=CARTESIAN_POINT('',(-0.166666666666667,0.,10.7));
#619=CARTESIAN_POINT('',(0.499999999999999,2.,10.7));
#620=CARTESIAN_POINT('',(0.499999999999999,-0.92330926563097,10.7));
#621=CARTESIAN_POINT('',(-0.166666666666667,0.,10.7));
#622=CARTESIAN_POINT('',(0.499999999999999,2.,10.7));
#623=CARTESIAN_POINT('',(0.499999999999999,0.92330926563097,10.7));
#624=CARTESIAN_POINT('',(0.,0.,10.7));
#625=CARTESIAN_POINT('',(0.,0.,8.));
#626=CARTESIAN_POINT('',(0.499999999999999,1.93649167310371,8.));
#627=CARTESIAN_POINT('',(0.5,1.93649167310371,7.5));
#628=CARTESIAN_POINT('',(0.499999999999999,-1.93649167310371,8.));
#629=CARTESIAN_POINT('',(0.5,-1.93649167310371,7.5));
#630=CARTESIAN_POINT('',(-0.5,-1.93649167310371,7.5));
#631=CARTESIAN_POINT('',(-0.5,-1.93649167310371,7.36732590992954));
#632=CARTESIAN_POINT('',(-0.391615224949693,-1.96876008086858,7.10921940416794));
#633=CARTESIAN_POINT('',(-0.000700928109579746,-2.01560793470406,6.94545674937007));
#634=CARTESIAN_POINT('',(0.391749546033954,-1.96880788341309,7.10895478596038));
#635=CARTESIAN_POINT('',(0.5,-1.93649167310371,7.36732245034812));
#636=CARTESIAN_POINT('',(0.5,-1.93649167310371,7.5));
#637=CARTESIAN_POINT('',(-0.499999999999999,-1.93649167310371,7.5));
#638=CARTESIAN_POINT('',(-0.499999999999999,-1.93649167310371,8.));
#639=CARTESIAN_POINT('',(-0.499999999999999,-1.93649167310371,8.));
#640=CARTESIAN_POINT('',(0.,0.,8.));
#641=CARTESIAN_POINT('',(-0.499999999999999,1.93649167310371,8.));
#642=CARTESIAN_POINT('',(-0.499999999999999,1.93649167310371,8.));
#643=CARTESIAN_POINT('',(-0.499999999999999,1.93649167310371,7.5));
#644=CARTESIAN_POINT('',(0.5,1.93649167310371,7.5));
#645=CARTESIAN_POINT('',(0.5,1.93649167310371,7.36732590992954));
#646=CARTESIAN_POINT('',(0.391615224949693,1.96876008086858,7.10921940416794));
#647=CARTESIAN_POINT('',(0.000700928109579746,2.01560793470406,6.94545674937007));
#648=CARTESIAN_POINT('',(-0.391749546033954,1.96880788341309,7.10895478596038));
#649=CARTESIAN_POINT('',(-0.5,1.93649167310371,7.36732245034812));
#650=CARTESIAN_POINT('',(-0.5,1.93649167310371,7.5));
#651=CARTESIAN_POINT('',(0.,0.,0.));
#652=CARTESIAN_POINT('',(2.,0.,0.));
#653=CARTESIAN_POINT('',(0.,0.,8.));
#654=CARTESIAN_POINT('',(-0.499999999999999,0.,8.));
#655=CARTESIAN_POINT('',(-0.499999999999999,-1.25,8.));
#656=CARTESIAN_POINT('',(0.734846922834953,-1.25,8.));
#657=CARTESIAN_POINT('',(-0.734846922834953,-1.25,8.));
#658=CARTESIAN_POINT('',(0.,0.,8.));
#659=CARTESIAN_POINT('',(-0.734846922834953,1.25,8.));
#660=CARTESIAN_POINT('',(-0.734846922834953,1.25,8.));
#661=CARTESIAN_POINT('',(-0.499999999999999,1.25,8.));
#662=CARTESIAN_POINT('',(-0.499999999999999,0.,8.));
#663=CARTESIAN_POINT('',(0.,0.,0.));
#664=CARTESIAN_POINT('',(0.,0.,0.));
#665=CARTESIAN_POINT('',(-1.05,0.,0.));
#666=CARTESIAN_POINT('',(0.,0.,9.7));
#667=CARTESIAN_POINT('',(-0.734846922834953,-1.25,9.7));
#668=CARTESIAN_POINT('',(-0.734846922834952,-1.25,9.7));
#669=CARTESIAN_POINT('',(0.,0.,9.7));
#670=CARTESIAN_POINT('',(-0.734846922834953,1.25,9.7));
#671=CARTESIAN_POINT('',(-0.734846922834953,1.25,9.7));
#672=CARTESIAN_POINT('',(-0.734846922834953,1.25,9.7));
#673=CARTESIAN_POINT('',(-0.499999999999999,1.25,9.7));
#674=CARTESIAN_POINT('',(-0.499999999999999,1.25,10.7));
#675=CARTESIAN_POINT('',(-1.0770329614269,1.25,9.7));
#676=CARTESIAN_POINT('',(-1.0770329614269,1.25,9.7));
#677=CARTESIAN_POINT('',(-0.5,1.25,10.7));
#678=CARTESIAN_POINT('',(0.,0.,9.7));
#679=CARTESIAN_POINT('',(0.,0.,9.7));
#680=CARTESIAN_POINT('',(0.734846922834953,-1.25,9.7));
#681=CARTESIAN_POINT('',(-0.499999999999999,-1.25,9.7));
#682=CARTESIAN_POINT('',(-0.499999999999999,-1.25,10.7));
#683=CARTESIAN_POINT('',(-0.5,-1.25,10.7));
#684=CARTESIAN_POINT('',(-1.0770329614269,-1.25,9.7));
#685=CARTESIAN_POINT('',(1.0770329614269,-1.25,9.7));
#686=CARTESIAN_POINT('',(0.,0.,9.7));
#687=CARTESIAN_POINT('',(0.,0.,9.7));
#688=CARTESIAN_POINT('',(0.5,1.25,10.7));
#689=CARTESIAN_POINT('',(0.692344320475634,1.25,10.3666666666667));
#690=CARTESIAN_POINT('',(0.884688640951268,1.25,10.0333333333333));
#691=CARTESIAN_POINT('',(1.0770329614269,1.25,9.7));
#692=CARTESIAN_POINT('',(0.725319250851116,1.12982973287941,10.7));
#693=CARTESIAN_POINT('',(0.902266400715755,1.1184394274587,10.3666666666667));
#694=CARTESIAN_POINT('',(1.07921355058039,1.10704912203799,10.0333333333333));
#695=CARTESIAN_POINT('',(1.25616070044503,1.09565881661728,9.7));
#696=CARTESIAN_POINT('',(0.916816640213016,0.947699549988587,10.7));
#697=CARTESIAN_POINT('',(1.07835606434254,0.932605888726666,10.3666666666667));
#698=CARTESIAN_POINT('',(1.23989548847205,0.917512227464744,10.0333333333333));
#699=CARTESIAN_POINT('',(1.40143491260157,0.902418566202822,9.7));
#700=CARTESIAN_POINT('',(1.17941331597253,0.510038423722738,10.7));
#701=CARTESIAN_POINT('',(1.3190866150766,0.497572908733931,10.3666666666667));
#702=CARTESIAN_POINT('',(1.45875991418068,0.485107393745123,10.0333333333333));
#703=CARTESIAN_POINT('',(1.59843321328476,0.472641878756316,9.7));
#704=CARTESIAN_POINT('',(1.25,0.255198097349998,10.7));
#705=CARTESIAN_POINT('',(1.38333333333333,0.248927921309766,10.3666666666667));
#706=CARTESIAN_POINT('',(1.51666666666667,0.242657745269535,10.0333333333333));
#707=CARTESIAN_POINT('',(1.65,0.236387569229303,9.7));
#708=CARTESIAN_POINT('',(1.25,-0.255198097349998,10.7));
#709=CARTESIAN_POINT('',(1.38333333333333,-0.248927921309767,10.3666666666667));
#710=CARTESIAN_POINT('',(1.51666666666667,-0.242657745269535,10.0333333333333));
#711=CARTESIAN_POINT('',(1.65,-0.236387569229304,9.7));
#712=CARTESIAN_POINT('',(1.17941331597253,-0.510038423722738,10.7));
#713=CARTESIAN_POINT('',(1.3190866150766,-0.497572908733931,10.3666666666667));
#714=CARTESIAN_POINT('',(1.45875991418068,-0.485107393745123,10.0333333333333));
#715=CARTESIAN_POINT('',(1.59843321328476,-0.472641878756316,9.7));
#716=CARTESIAN_POINT('',(0.916816640213016,-0.947699549988587,10.7));
#717=CARTESIAN_POINT('',(1.07835606434254,-0.932605888726666,10.3666666666667));
#718=CARTESIAN_POINT('',(1.23989548847205,-0.917512227464744,10.0333333333333));
#719=CARTESIAN_POINT('',(1.40143491260157,-0.902418566202823,9.7));
#720=CARTESIAN_POINT('',(0.725319250851116,-1.1298297328794,10.7));
#721=CARTESIAN_POINT('',(0.902266400715755,-1.1184394274587,10.3666666666667));
#722=CARTESIAN_POINT('',(1.07921355058039,-1.10704912203799,10.0333333333333));
#723=CARTESIAN_POINT('',(1.25616070044503,-1.09565881661728,9.7));
#724=CARTESIAN_POINT('',(0.5,-1.25,10.7));
#725=CARTESIAN_POINT('',(0.692344320475634,-1.25,10.3666666666667));
#726=CARTESIAN_POINT('',(0.884688640951268,-1.25,10.0333333333333));
#727=CARTESIAN_POINT('',(1.0770329614269,-1.25,9.7));
#728=CARTESIAN_POINT('',(0.,0.,9.7));
#729=CARTESIAN_POINT('',(-0.5,-1.25,10.7));
#730=CARTESIAN_POINT('',(-0.692344320475633,-1.25,10.3666666666667));
#731=CARTESIAN_POINT('',(-0.884688640951267,-1.25,10.0333333333333));
#732=CARTESIAN_POINT('',(-1.0770329614269,-1.25,9.7));
#733=CARTESIAN_POINT('',(-0.725319250851116,-1.12982973287941,10.7));
#734=CARTESIAN_POINT('',(-0.902266400715754,-1.1184394274587,10.3666666666667));
#735=CARTESIAN_POINT('',(-1.07921355058039,-1.10704912203799,10.0333333333333));
#736=CARTESIAN_POINT('',(-1.25616070044503,-1.09565881661728,9.7));
#737=CARTESIAN_POINT('',(-0.916816640213016,-0.947699549988587,10.7));
#738=CARTESIAN_POINT('',(-1.07835606434254,-0.932605888726666,10.3666666666667));
#739=CARTESIAN_POINT('',(-1.23989548847205,-0.917512227464744,10.0333333333333));
#740=CARTESIAN_POINT('',(-1.40143491260157,-0.902418566202823,9.7));
#741=CARTESIAN_POINT('',(-1.17941331597253,-0.510038423722738,10.7));
#742=CARTESIAN_POINT('',(-1.3190866150766,-0.497572908733931,10.3666666666667));
#743=CARTESIAN_POINT('',(-1.45875991418068,-0.485107393745124,10.0333333333333));
#744=CARTESIAN_POINT('',(-1.59843321328476,-0.472641878756317,9.7));
#745=CARTESIAN_POINT('',(-1.25,-0.255198097349998,10.7));
#746=CARTESIAN_POINT('',(-1.38333333333333,-0.248927921309767,10.3666666666667));
#747=CARTESIAN_POINT('',(-1.51666666666667,-0.242657745269535,10.0333333333333));
#748=CARTESIAN_POINT('',(-1.65,-0.236387569229304,9.7));
#749=CARTESIAN_POINT('',(-1.25,0.255198097349998,10.7));
#750=CARTESIAN_POINT('',(-1.38333333333333,0.248927921309767,10.3666666666667));
#751=CARTESIAN_POINT('',(-1.51666666666667,0.242657745269535,10.0333333333333));
#752=CARTESIAN_POINT('',(-1.65,0.236387569229303,9.7));
#753=CARTESIAN_POINT('',(-1.17941331597253,0.510038423722738,10.7));
#754=CARTESIAN_POINT('',(-1.3190866150766,0.497572908733931,10.3666666666667));
#755=CARTESIAN_POINT('',(-1.45875991418068,0.485107393745123,10.0333333333333));
#756=CARTESIAN_POINT('',(-1.59843321328476,0.472641878756316,9.7));
#757=CARTESIAN_POINT('',(-0.916816640213016,0.947699549988587,10.7));
#758=CARTESIAN_POINT('',(-1.07835606434254,0.932605888726666,10.3666666666667));
#759=CARTESIAN_POINT('',(-1.23989548847205,0.917512227464744,10.0333333333333));
#760=CARTESIAN_POINT('',(-1.40143491260157,0.902418566202823,9.7));
#761=CARTESIAN_POINT('',(-0.725319250851116,1.1298297328794,10.7));
#762=CARTESIAN_POINT('',(-0.902266400715755,1.1184394274587,10.3666666666667));
#763=CARTESIAN_POINT('',(-1.07921355058039,1.10704912203799,10.0333333333333));
#764=CARTESIAN_POINT('',(-1.25616070044503,1.09565881661728,9.7));
#765=CARTESIAN_POINT('',(-0.5,1.25,10.7));
#766=CARTESIAN_POINT('',(-0.692344320475634,1.25,10.3666666666667));
#767=CARTESIAN_POINT('',(-0.884688640951268,1.25,10.0333333333333));
#768=CARTESIAN_POINT('',(-1.0770329614269,1.25,9.7));
#769=CARTESIAN_POINT('',(0.166666666666667,0.,10.7));
#770=CARTESIAN_POINT('',(0.,0.,9.7));
#771=CARTESIAN_POINT('',(-0.166666666666667,0.,10.7));
#772=CARTESIAN_POINT('',(-0.499999999999999,2.,10.7));
#773=CARTESIAN_POINT('',(-0.499999999999999,0.92330926563097,10.7));
#774=CARTESIAN_POINT('',(-0.499999999999999,2.,10.7));
#775=CARTESIAN_POINT('',(-0.499999999999999,-0.92330926563097,10.7));
#776=CARTESIAN_POINT('',(0.,0.,10.7));
#777=CARTESIAN_POINT('',(0.,0.,12.1053835479525));
#778=CARTESIAN_POINT('',(0.499999999999999,0.92330926563097,12.1053835479525));
#779=CARTESIAN_POINT('',(0.5,0.92330926563097,7.5));
#780=CARTESIAN_POINT('',(0.5,0.92330926563097,7.5));
#781=CARTESIAN_POINT('',(0.5,0.92330926563097,7.36567916523348));
#782=CARTESIAN_POINT('',(0.39185959136086,0.990558811691349,7.11049974475692));
#783=CARTESIAN_POINT('',(0.00120616049583702,1.07969742410131,6.94480710580172));
#784=CARTESIAN_POINT('',(-0.392294058610171,0.990649962249719,7.11027504431027));
#785=CARTESIAN_POINT('',(-0.5,0.92330926563097,7.36560847719262));
#786=CARTESIAN_POINT('',(-0.5,0.92330926563097,7.5));
#787=CARTESIAN_POINT('',(-0.5,0.92330926563097,7.5));
#788=CARTESIAN_POINT('',(-0.499999999999999,0.92330926563097,12.1053835479525));
#789=CARTESIAN_POINT('',(-0.499999999999999,-0.92330926563097,12.1053835479525));
#790=CARTESIAN_POINT('',(-0.499999999999999,-0.92330926563097,7.5));
#791=CARTESIAN_POINT('',(-0.5,-0.92330926563097,7.5));
#792=CARTESIAN_POINT('',(-0.5,-0.92330926563097,7.36567916523348));
#793=CARTESIAN_POINT('',(-0.39185959136086,-0.990558811691349,7.11049974475692));
#794=CARTESIAN_POINT('',(-0.00120616049583702,-1.07969742410131,6.94480710580172));
#795=CARTESIAN_POINT('',(0.392294058610171,-0.990649962249719,7.11027504431027));
#796=CARTESIAN_POINT('',(0.5,-0.92330926563097,7.36560847719262));
#797=CARTESIAN_POINT('',(0.5,-0.92330926563097,7.5));
#798=CARTESIAN_POINT('',(0.5,-0.92330926563097,7.5));
#799=CARTESIAN_POINT('',(0.499999999999999,-0.92330926563097,12.1053835479525));
#800=CARTESIAN_POINT('',(0.,2.,7.5));
#801=CARTESIAN_POINT('',(0.5,2.,7.5));
#802=CARTESIAN_POINT('',(-0.499999999999999,2.,7.5));
#803=CARTESIAN_POINT('',(-0.499999999999999,2.,10.7));
#804=CARTESIAN_POINT('',(0.499999999999999,2.,7.5));
#805=CARTESIAN_POINT('',(0.499999999999999,2.,7.5));
#806=CARTESIAN_POINT('',(0.5,2.,7.5));
#807=CARTESIAN_POINT('',(-0.499999999999999,2.,10.7));
#808=CARTESIAN_POINT('',(-0.499999999999999,2.,7.5));
#809=CARTESIAN_POINT('',(0.,2.,7.5));
#810=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#429),
#811);
#811=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#812))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#815,#814,#813))
REPRESENTATION_CONTEXT('702910000','TOP_LEVEL_ASSEMBLY_PART')
);
#812=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.005),#815,
'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model');
#813=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#814=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#815=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#816=PRODUCT_DEFINITION_SHAPE('','',#817);
#817=PRODUCT_DEFINITION('','',#819,#818);
#818=PRODUCT_DEFINITION_CONTEXT('',#825,'design');
#819=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#821,
.NOT_KNOWN.);
#820=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#821));
#821=PRODUCT('702910000','702910000','702910000',(#823));
#822=PRODUCT_CATEGORY('','');
#823=PRODUCT_CONTEXT('',#825,'mechanical');
#824=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2010,#825);
#825=APPLICATION_CONTEXT(
'core data for automotive mechanical design processes');
ENDSEC;
END-ISO-10303-21;

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@
(property "Reference" "REF**" (property "Reference" "REF**"
(at 7.312 -21.336 0) (at 7.312 -21.336 0)
(layer "F.SilkS") (layer "F.SilkS")
(uuid "7289cb19-d22c-4d43-99dc-a37a7af09173") (uuid "95a6896c-2eab-4f28-adc5-7fd64550efd1")
(effects (effects
(font (font
(size 0.78232 0.78232) (size 0.78232 0.78232)
@ -18,7 +18,7 @@
(property "Value" "Val**" (property "Value" "Val**"
(at 8.89 -10.795 0) (at 8.89 -10.795 0)
(layer "F.Fab") (layer "F.Fab")
(uuid "bdcd11a5-c8fd-480a-82a6-c8e8bcd29311") (uuid "ead571aa-8f25-4413-9dd8-3ecea3d8b1b5")
(effects (effects
(font (font
(size 0.536448 0.536448) (size 0.536448 0.536448)
@ -31,7 +31,7 @@
(unlocked yes) (unlocked yes)
(layer "F.Fab") (layer "F.Fab")
(hide yes) (hide yes)
(uuid "11c7907a-4c88-4cd1-aade-56cc3ffbce3d") (uuid "e0e614f2-f99b-42a7-87d5-6d40f74c047a")
(effects (effects
(font (font
(size 1.27 1.27) (size 1.27 1.27)
@ -44,7 +44,7 @@
(unlocked yes) (unlocked yes)
(layer "F.Fab") (layer "F.Fab")
(hide yes) (hide yes)
(uuid "d2820fe3-6b02-4bb3-95b7-3d3fff9c7376") (uuid "074d8848-2ba7-4146-8c49-a0cf65e2aa82")
(effects (effects
(font (font
(size 1.27 1.27) (size 1.27 1.27)
@ -61,7 +61,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "2c59f052-4924-49c7-bf3a-da8f762581f4") (uuid "e72c3c07-5bc8-4f5f-97cd-36412308e250")
) )
(fp_line (fp_line
(start 1.905 -0.082) (start 1.905 -0.082)
@ -71,7 +71,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "2ed15d83-c91c-402e-985a-9eaa24c859ff") (uuid "e3e0ab25-f18a-4068-92e8-92a17b4caf05")
) )
(fp_line (fp_line
(start 4.595 -21.037) (start 4.595 -21.037)
@ -81,7 +81,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "287916b7-11ac-4b79-9dc6-349e8ddc4746") (uuid "4838598f-afa6-445e-b237-7544ae7e9968")
) )
(fp_line (fp_line
(start 5.098728 -22.547) (start 5.098728 -22.547)
@ -91,7 +91,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "e3413d28-3aa9-4963-adb2-639c03a3bf14") (uuid "101b5417-f570-447c-b9f6-42639e5eff3c")
) )
(fp_line (fp_line
(start 13.594 -22.047) (start 13.594 -22.047)
@ -101,7 +101,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "433ee433-18b6-4bfa-bf63-4ea6c8cd91d7") (uuid "37ee6532-c85a-4899-82db-921e02cce4af")
) )
(fp_line (fp_line
(start 15.875 -21.037) (start 15.875 -21.037)
@ -111,7 +111,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "d5635a5e-089c-498e-8414-4a3027ae8397") (uuid "f94b2798-d11f-47d7-8f2c-02478417b6f1")
) )
(fp_line (fp_line
(start 17.78 -1.987) (start 17.78 -1.987)
@ -121,7 +121,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "c3641fdd-4cec-4126-bba9-5e292cf8bf86") (uuid "8c3282cc-86c2-4cf3-a698-856916df5f40")
) )
(fp_arc (fp_arc
(start 0 -19.136) (start 0 -19.136)
@ -132,7 +132,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "ebbdac55-718e-4672-9d5f-44b0d386cc11") (uuid "2a1b788b-cdcf-4a49-acac-d187cf344ffc")
) )
(fp_arc (fp_arc
(start 1.905 -0.082) (start 1.905 -0.082)
@ -143,7 +143,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "09e142d3-8be9-454d-a6e8-68cd0807b882") (uuid "677c2a8e-0212-4651-99b4-af42d29d0bd1")
) )
(fp_arc (fp_arc
(start 4.598728 -22.047272) (start 4.598728 -22.047272)
@ -154,7 +154,7 @@
(type default) (type default)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "6f1ff639-b216-41c7-b291-8df9f6813689") (uuid "b38fc005-51b4-4609-b7e3-78320e82da0d")
) )
(fp_arc (fp_arc
(start 13.094 -22.547) (start 13.094 -22.547)
@ -165,7 +165,7 @@
(type default) (type default)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "33b95cff-53a4-40de-b83a-b01ff651b641") (uuid "46a43512-01fe-440e-b1e8-31a50057cbf8")
) )
(fp_arc (fp_arc
(start 15.875 -21.037) (start 15.875 -21.037)
@ -176,7 +176,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "f5c73dca-587b-474c-9506-85b6a5dbb2a1") (uuid "f77dffb2-d331-43db-9018-069e9fa47c57")
) )
(fp_arc (fp_arc
(start 17.78 -1.987) (start 17.78 -1.987)
@ -187,7 +187,7 @@
(type solid) (type solid)
) )
(layer "F.SilkS") (layer "F.SilkS")
(uuid "b2590c3b-521c-4794-96f4-54b9c7f512c3") (uuid "535b0a70-da0d-4557-a5dd-d25a51ee5468")
) )
(fp_circle (fp_circle
(center -0.21 -20.621) (center -0.21 -20.621)
@ -198,7 +198,7 @@
) )
(fill yes) (fill yes)
(layer "F.SilkS") (layer "F.SilkS")
(uuid "031cf5be-dbf5-48e7-b55c-e80db6fba62a") (uuid "c4f8c64e-4c5d-41c1-8b14-aca8fcf77968")
) )
(fp_circle (fp_circle
(center 1.064 -19.904) (center 1.064 -19.904)
@ -209,7 +209,7 @@
) )
(fill yes) (fill yes)
(layer "F.SilkS") (layer "F.SilkS")
(uuid "a2bb00f9-1e52-4961-9e01-c6a3620a78a9") (uuid "163ea809-1cd6-43c9-968e-14c093715603")
) )
(fp_rect (fp_rect
(start 17.8 0) (start 17.8 0)
@ -220,7 +220,7 @@
) )
(fill no) (fill no)
(layer "F.CrtYd") (layer "F.CrtYd")
(uuid "17d61597-c12f-438e-86cd-26bf95579021") (uuid "477d102d-f2d0-4f67-ad93-9f60da51bd76")
) )
(fp_rect (fp_rect
(start 0 -21) (start 0 -21)
@ -231,7 +231,7 @@
) )
(fill no) (fill no)
(layer "F.Fab") (layer "F.Fab")
(uuid "8fe10542-c51f-49ff-8670-cd7b22b70693") (uuid "e7107e2f-485b-49f6-9f5d-2537ab0ef458")
) )
(fp_circle (fp_circle
(center 1.084 -19.9) (center 1.084 -19.9)
@ -242,7 +242,7 @@
) )
(fill yes) (fill yes)
(layer "F.Fab") (layer "F.Fab")
(uuid "63683cfd-14cc-476e-b4f9-7a4daaf029fc") (uuid "089122fe-193e-4cef-a9b8-54d37cb7fa99")
) )
(pad "1" smd roundrect (pad "1" smd roundrect
(at 0.835 -18.12) (at 0.835 -18.12)
@ -251,7 +251,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "2a534393-88c2-4d7e-9b25-ae881057dc57") (uuid "351f5f05-8bc3-4b53-9daf-3207bd71876b")
) )
(pad "1" thru_hole circle (pad "1" thru_hole circle
(at 1.26 -18.14 180) (at 1.26 -18.14 180)
@ -259,7 +259,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "39971d4a-ede8-4d86-8c78-fed36f7ff078") (uuid "6a16c3b2-8d4e-4efe-a84e-dbc418c7fe79")
) )
(pad "2" smd roundrect (pad "2" smd roundrect
(at 0.835 -15.58) (at 0.835 -15.58)
@ -268,7 +268,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "778730c0-f8ef-4bc5-a2d2-49cef3e1a5c8") (uuid "cfdee4aa-d600-484f-9a5c-2062a00bde1d")
) )
(pad "2" thru_hole circle (pad "2" thru_hole circle
(at 1.26 -15.6 180) (at 1.26 -15.6 180)
@ -276,7 +276,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "60d6e6cf-8424-49f9-b534-0d917feddde6") (uuid "69193d02-4e31-4519-a90d-949c3f48e92c")
) )
(pad "3" smd roundrect (pad "3" smd roundrect
(at 0.835 -13.04) (at 0.835 -13.04)
@ -285,7 +285,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "a37ac89a-0dbc-4480-bd79-40a4874856e2") (uuid "52a69e1c-edab-4079-a491-6bcb12907f61")
) )
(pad "3" thru_hole circle (pad "3" thru_hole circle
(at 1.26 -13.06 180) (at 1.26 -13.06 180)
@ -293,7 +293,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "c3cef52b-cf4a-4b20-94d4-9920f06a32c2") (uuid "a3aed707-7e8b-4b1b-ba96-06cfb9154fcb")
) )
(pad "4" smd roundrect (pad "4" smd roundrect
(at 0.835 -10.5) (at 0.835 -10.5)
@ -302,7 +302,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "9dd4400a-d763-40d5-8df2-4f74596ce0f0") (uuid "1e864c46-432c-460c-af69-13a1c9d0fd2f")
) )
(pad "4" thru_hole circle (pad "4" thru_hole circle
(at 1.26 -10.52 180) (at 1.26 -10.52 180)
@ -310,7 +310,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "1cd9d96b-d96c-4261-9b60-abca04794862") (uuid "eee65312-1942-42a1-a13a-2a28a114ec95")
) )
(pad "5" smd roundrect (pad "5" smd roundrect
(at 0.835 -7.96) (at 0.835 -7.96)
@ -319,7 +319,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "2cf548cf-85f3-43d9-8a36-e08c8bec33e8") (uuid "da854e17-c3b3-4a83-9d47-a379e4d7efa5")
) )
(pad "5" thru_hole circle (pad "5" thru_hole circle
(at 1.26 -7.98 180) (at 1.26 -7.98 180)
@ -327,7 +327,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "72d2d8d9-81dd-49eb-8a57-71820c388d53") (uuid "febdd29f-f361-4b8e-b2b5-7502d3e5fdea")
) )
(pad "6" smd roundrect (pad "6" smd roundrect
(at 0.835 -5.42) (at 0.835 -5.42)
@ -336,7 +336,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "ae17a813-7e06-4aa6-a595-bad75efec978") (uuid "3fde7f90-983d-44c1-939e-47d36175373f")
) )
(pad "6" thru_hole circle (pad "6" thru_hole circle
(at 1.26 -5.44 180) (at 1.26 -5.44 180)
@ -344,7 +344,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "f55385dd-12a0-4f5b-8870-e62c32af2fc8") (uuid "323ef0a5-3407-4ac3-b76f-8ac19e044d1e")
) )
(pad "7" smd roundrect (pad "7" smd roundrect
(at 0.835 -2.88) (at 0.835 -2.88)
@ -353,7 +353,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "f0c853cd-127b-497c-92f2-2d32416b2f9f") (uuid "ebfd6bef-ea17-4635-877b-58b57c784dec")
) )
(pad "7" thru_hole circle (pad "7" thru_hole circle
(at 1.26 -2.9 180) (at 1.26 -2.9 180)
@ -361,7 +361,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "528c9bdf-00d3-41c7-8813-c9575c699c56") (uuid "2b179783-65b0-4d7c-850b-74c9fa3a7a64")
) )
(pad "8" thru_hole circle (pad "8" thru_hole circle
(at 16.5 -2.9) (at 16.5 -2.9)
@ -369,7 +369,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "60c9ec27-aec8-4d4f-9230-0276f8ddf68b") (uuid "5cbc8aa6-fdfd-49e6-b018-da1d4ff342aa")
) )
(pad "8" smd roundrect (pad "8" smd roundrect
(at 17 -2.88) (at 17 -2.88)
@ -378,7 +378,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "d00455ea-b0c0-4d93-bbdc-81c12f7ba57b") (uuid "19eb14d0-5713-47b7-86f2-4bccede8ba54")
) )
(pad "9" thru_hole circle (pad "9" thru_hole circle
(at 16.5 -5.44) (at 16.5 -5.44)
@ -386,7 +386,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "5a2b71de-2780-4ac3-bcea-746f0a78c774") (uuid "e7f197b5-1fc8-47f6-9f49-60ffd6fa2335")
) )
(pad "9" smd roundrect (pad "9" smd roundrect
(at 17 -5.42) (at 17 -5.42)
@ -395,7 +395,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "478f6a86-44ce-4970-ad0e-8db6ddbb0561") (uuid "4c3b83bc-a000-4a70-887c-6b775bc40ee1")
) )
(pad "10" thru_hole circle (pad "10" thru_hole circle
(at 16.5 -7.98) (at 16.5 -7.98)
@ -403,7 +403,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "e35916bc-b96f-4e05-8b66-54d3f88ff104") (uuid "4df7fd17-71d5-4f8f-a3f2-68c6537a767f")
) )
(pad "10" smd roundrect (pad "10" smd roundrect
(at 17 -7.96) (at 17 -7.96)
@ -412,7 +412,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "26063f43-e37a-465a-a2f8-883028ddec3c") (uuid "223d5c33-d2a3-4398-8d3f-544bd6345a86")
) )
(pad "11" thru_hole circle (pad "11" thru_hole circle
(at 16.5 -10.52) (at 16.5 -10.52)
@ -420,7 +420,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "8d60d831-b564-4516-acd6-2bde994c6c2e") (uuid "dad67976-a604-485a-bb37-2d67ea771b2c")
) )
(pad "11" smd roundrect (pad "11" smd roundrect
(at 17 -10.5) (at 17 -10.5)
@ -429,7 +429,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "4e0c2682-5a5c-4228-8522-a5078d124180") (uuid "1f04f1d2-ce82-4256-b122-36f63f189efe")
) )
(pad "12" thru_hole circle (pad "12" thru_hole circle
(at 16.5 -13.06) (at 16.5 -13.06)
@ -437,7 +437,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "e907dfc0-cb14-4296-ab05-c29bb1d0d646") (uuid "c55d522b-9f8b-4fa4-afaa-880f3b1c9c5f")
) )
(pad "12" smd roundrect (pad "12" smd roundrect
(at 17 -13.04) (at 17 -13.04)
@ -446,7 +446,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "9ef1ce16-09d6-4ebb-aa7a-02e3ee0930aa") (uuid "31818d88-bbc0-4c22-b4ed-d6884ef71ebb")
) )
(pad "13" thru_hole circle (pad "13" thru_hole circle
(at 16.5 -15.6) (at 16.5 -15.6)
@ -454,7 +454,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "3761df0d-b80c-4c38-a1b7-dc0fa8ecaa2f") (uuid "e46165bc-b289-44b0-b7f6-6759bba3d4b8")
) )
(pad "13" smd roundrect (pad "13" smd roundrect
(at 17 -15.58) (at 17 -15.58)
@ -463,7 +463,7 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "94236148-baa2-42ed-bc8a-71357064d136") (uuid "3fbf02f8-81da-4fba-bc95-9e47b9abaa05")
) )
(pad "14" thru_hole circle (pad "14" thru_hole circle
(at 16.5 -18.14) (at 16.5 -18.14)
@ -471,7 +471,7 @@
(drill 0.889) (drill 0.889)
(layers "*.Cu" "*.Mask") (layers "*.Cu" "*.Mask")
(remove_unused_layers no) (remove_unused_layers no)
(uuid "b7d37dfd-d04e-4a01-9dc0-7db8666cc822") (uuid "71ca3093-fd4e-46c3-9980-6d986d711719")
) )
(pad "14" smd roundrect (pad "14" smd roundrect
(at 17 -18.12) (at 17 -18.12)
@ -480,55 +480,55 @@
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(solder_mask_margin 0.0508) (solder_mask_margin 0.0508)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "a995d04e-b409-4d6d-9828-c5a7c885040e") (uuid "ce7a6ff3-5c3a-4077-bf86-beedc24debb3")
) )
(pad "15" smd circle (pad "15" smd circle
(at 7.6166 -19.1415) (at 7.6166 -19.1415)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "dd0f7577-6290-4e73-96f2-b8d5a22bfae2") (uuid "7273149b-9aea-4a23-9b4e-db1e0d6c76fc")
) )
(pad "16" smd circle (pad "16" smd circle
(at 10.1566 -19.1415) (at 10.1566 -19.1415)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "bc571b1a-844b-4ede-be8b-eb8d95595714") (uuid "0aef11c3-14ad-4cb5-9b05-95a892988ce8")
) )
(pad "17" smd circle (pad "17" smd circle
(at 7.6166 -16.6015) (at 7.6166 -16.6015)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "62293386-e611-4db9-9b83-9e6397ee899d") (uuid "158a5cbb-af86-4fa6-8d58-6831485085c5")
) )
(pad "18" smd circle (pad "18" smd circle
(at 10.1566 -16.6015) (at 10.1566 -16.6015)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "9296da6b-fa4e-41fb-800c-4e427d70791f") (uuid "3b7bcd8a-c97c-46f6-9faa-4e525d03d6e8")
) )
(pad "19" smd circle (pad "19" smd circle
(at 7.6166 -14.0615) (at 7.6166 -14.0615)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "7b2d4612-967f-421e-80a9-9f8cb0e56a4b") (uuid "ad4ba963-211d-4878-a4cb-255a615c14de")
) )
(pad "20" smd circle (pad "20" smd circle
(at 10.1566 -14.0615) (at 10.1566 -14.0615)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "e9502519-37f6-427d-8ac1-c91a57e60e31") (uuid "8c7e088d-0846-4d7d-9143-5ce3fdb0c4fd")
) )
(pad "21" smd circle (pad "21" smd circle
(at 7.6166 -11.5215) (at 7.6166 -11.5215)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "9cc565e8-a330-4288-8a84-30034925498b") (uuid "c6bbe198-c8c7-4b83-a36e-6a6fdeb3b94f")
) )
(pad "22" smd circle (pad "22" smd circle
(at 10.064 -11.5783) (at 10.064 -11.5783)
(size 1.7 1.7) (size 1.7 1.7)
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(uuid "0ce47caa-4877-4cc0-806c-5f61820a68bf") (uuid "4f1e574b-3b71-4a23-b765-d779726fd3c6")
) )
(pad "23" smd roundrect (pad "23" smd roundrect
(at 7.3086 -4.9683 270) (at 7.3086 -4.9683 270)
@ -536,7 +536,7 @@
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "05334df1-39c8-400d-b0bb-a6659401fe77") (uuid "08d345bf-1b32-499f-94bb-44332eb5115d")
) )
(pad "24" smd roundrect (pad "24" smd roundrect
(at 9.8486 -4.9683 270) (at 9.8486 -4.9683 270)
@ -544,7 +544,7 @@
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "c828c680-7be4-4eb8-8aaa-0abb935706db") (uuid "8b3ca1bb-eee0-4c3d-8f3b-eefea4a68bbb")
) )
(pad "25" smd roundrect (pad "25" smd roundrect
(at 9.949 -8.412 270) (at 9.949 -8.412 270)
@ -552,18 +552,7 @@
(layers "F.Cu" "F.Mask" "F.Paste") (layers "F.Cu" "F.Mask" "F.Paste")
(roundrect_rratio 0.25) (roundrect_rratio 0.25)
(thermal_bridge_angle 45) (thermal_bridge_angle 45)
(uuid "1545b883-dc4a-4fcb-99e4-3b7b29ed142b") (uuid "45570478-e499-45ab-bb97-539cabc4e177")
) )
(embedded_fonts no) (embedded_fonts no)
(model "${KIPRJMOD}/library/Seeed Studio XIAO ESP32-C5.step"
(offset
(xyz 15 8.7 0)
)
(scale
(xyz 1 1 1)
)
(rotate
(xyz -90 -0 -90)
)
)
) )

View file

@ -1,457 +1,445 @@
(footprint "XIAO-ESP32-C5-SMD" (footprint "XIAO-ESP32-C5-SMD"
(version 20260206) (version 20241229)
(generator "pcbnew") (generator "pcbnew")
(generator_version "10.0") (generator_version "9.0")
(layer "F.Cu") (layer "F.Cu")
(property "Reference" "REF**" (property "Reference" "REF**"
(at 7.312 -21.336 0) (at 7.312 -21.336 0)
(layer "F.SilkS") (layer "F.SilkS")
(uuid "557c8d74-068c-42d8-b6ab-85ab4ee867fc") (uuid "a9f5f5dd-597c-45dd-b31d-a35c3963eed2")
(effects (effects
(font (font
(size 0.78232 0.78232) (size 0.78232 0.78232)
(thickness 0.10668) (thickness 0.10668)
) )
(justify left bottom) (justify left bottom)
) )
) )
(property "Value" "Val**" (property "Value" "Val**"
(at 8.89 -10.795 0) (at 8.89 -10.795 0)
(layer "F.Fab") (layer "F.Fab")
(uuid "705e36ff-9a63-4475-ae0c-c8cfa97917f5") (uuid "2d66aca7-e0b3-44df-838e-be285890792c")
(effects (effects
(font (font
(size 0.536448 0.536448) (size 0.536448 0.536448)
(thickness 0.073152) (thickness 0.073152)
) )
) )
) )
(property "Datasheet" "" (property "Datasheet" ""
(at 0 0 0) (at 0 0 0)
(unlocked yes) (unlocked yes)
(layer "F.Fab") (layer "F.Fab")
(hide yes) (hide yes)
(uuid "229b4243-ef3c-470f-a5d9-97b6a42f008c") (uuid "5173b428-b87b-497c-9fd1-0d444c2ced85")
(effects (effects
(font (font
(size 1.27 1.27) (size 1.27 1.27)
(thickness 0.15) (thickness 0.15)
) )
) )
) )
(property "Description" "" (property "Description" ""
(at 0 0 0) (at 0 0 0)
(unlocked yes) (unlocked yes)
(layer "F.Fab") (layer "F.Fab")
(hide yes) (hide yes)
(uuid "7a7b1278-d112-4040-a8cd-6d0400594348") (uuid "ea7181c4-fdca-44f1-ad15-d0627f50a68e")
(effects (effects
(font (font
(size 1.27 1.27) (size 1.27 1.27)
(thickness 0.15) (thickness 0.15)
) )
) )
) )
(duplicate_pad_numbers_are_jumpers no) (fp_line
(fp_line (start 0 -1.987)
(start 0 -1.987) (end 0 -19.132)
(end 0 -19.132) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "df0486b4-d04f-4201-a301-beede6e15862")
(uuid "a66c2840-6ec7-48db-8e31-5d72c9c553bf") )
) (fp_line
(fp_line (start 1.905 -0.082)
(start 1.905 -0.082) (end 15.875 -0.082)
(end 15.875 -0.082) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "f54abd8d-62ed-4b05-8e37-f29acdadc0f8")
(uuid "d257aabf-9b3d-4476-84c1-ba31617c7235") )
) (fp_line
(fp_line (start 4.595 -21.037)
(start 4.595 -21.037) (end 4.598728 -22.047272)
(end 4.598728 -22.047272) (stroke
(stroke (width 0.127)
(width 0.127) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "fead6daa-b9f4-4bd1-a131-b5d2cd3184de")
(uuid "a992b9a7-8dbf-4641-afc9-0ec10e2d7b01") )
) (fp_line
(fp_line (start 5.098728 -22.547)
(start 5.098728 -22.547) (end 13.094 -22.547)
(end 13.094 -22.547) (stroke
(stroke (width 0.127)
(width 0.127) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "b90ae92d-7c1a-4689-bf64-c3528a3ea3ee")
(uuid "b0d13c73-b834-468a-ab90-f79b89266984") )
) (fp_line
(fp_line (start 13.594 -22.047)
(start 13.594 -22.047) (end 13.594 -21.037)
(end 13.594 -21.037) (stroke
(stroke (width 0.127)
(width 0.127) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "b540fbcc-8e06-44d7-95f6-8b142e4c90fb")
(uuid "555b99e7-1219-4a0c-ac7e-db119bda8034") )
) (fp_line
(fp_line (start 15.875 -21.037)
(start 15.875 -21.037) (end 1.905 -21.037)
(end 1.905 -21.037) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "2b80542c-5088-4f89-ae32-3400cf894ca1")
(uuid "a8617b36-ce2c-4e94-9b21-49cec1b78e78") )
) (fp_line
(fp_line (start 17.78 -1.987)
(start 17.78 -1.987) (end 17.78 -19.132)
(end 17.78 -19.132) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "4cd8add0-8a8c-468d-ba6f-b86787c288af")
(uuid "7b2fa456-4c5d-47eb-83a9-9899ae4199ed") )
) (fp_arc
(fp_arc (start 0 -19.136)
(start 0 -19.136) (mid 0.557962 -20.483038)
(mid 0.557962 -20.483038) (end 1.905 -21.041)
(end 1.905 -21.041) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "4d9bf7a5-4ab4-48bb-b8ac-0a5ce4523642")
(uuid "e78b67dd-552c-4fc5-ad57-73bbafc2d044") )
) (fp_arc
(fp_arc (start 1.905 -0.082)
(start 1.905 -0.082) (mid 0.557962 -0.639962)
(mid 0.557962 -0.639962) (end 0 -1.987)
(end 0 -1.987) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "d09661c8-1ad3-40e9-8323-9dabc8f3f98b")
(uuid "88429fe1-7b04-471a-9890-a0b8200a074b") )
) (fp_arc
(fp_arc (start 4.598728 -22.047272)
(start 4.598728 -22.047272) (mid 4.745276 -22.400644)
(mid 4.745276 -22.400644) (end 5.098728 -22.547)
(end 5.098728 -22.547) (stroke
(stroke (width 0.127)
(width 0.127) (type default)
(type default) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "7a58f637-14d7-4804-b127-f1d029b5d1e6")
(uuid "c1959345-d081-4a6d-ad04-f511b2bcd3b3") )
) (fp_arc
(fp_arc (start 13.094 -22.547)
(start 13.094 -22.547) (mid 13.447553 -22.400553)
(mid 13.447553 -22.400553) (end 13.594 -22.047)
(end 13.594 -22.047) (stroke
(stroke (width 0.127)
(width 0.127) (type default)
(type default) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "d0bc8663-987f-4e2e-b464-096a547b822f")
(uuid "3834fecb-644d-483f-af5e-b4ec4ba35133") )
) (fp_arc
(fp_arc (start 15.875 -21.037)
(start 15.875 -21.037) (mid 17.222038 -20.479038)
(mid 17.222038 -20.479038) (end 17.78 -19.132)
(end 17.78 -19.132) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "77004ea5-53a4-40ab-b35c-7bdd22107e34")
(uuid "5e69b2f4-3544-474a-ae1a-7f149ae7eb69") )
) (fp_arc
(fp_arc (start 17.78 -1.987)
(start 17.78 -1.987) (mid 17.222038 -0.639962)
(mid 17.222038 -0.639962) (end 15.875 -0.082)
(end 15.875 -0.082) (stroke
(stroke (width 0.1)
(width 0.1) (type solid)
(type solid) )
) (layer "F.SilkS")
(layer "F.SilkS") (uuid "94189dc1-14b5-4f17-b9d3-0163ed99e583")
(uuid "1191396d-a9ec-434e-886a-91600b65a1f3") )
) (fp_circle
(fp_circle (center -0.21 -20.621)
(center -0.21 -20.621) (end -0.21 -20.875)
(end -0.21 -20.875) (stroke
(stroke (width 0.5)
(width 0.5) (type solid)
(type solid) )
) (fill yes)
(fill yes) (layer "F.SilkS")
(layer "F.SilkS") (uuid "dc606cc5-10bc-4635-81d1-fa27b1e6b4e2")
(uuid "78de167e-67f4-421d-a3d7-f90b03c3b76a") )
) (fp_circle
(fp_circle (center 1.064 -19.904)
(center 1.064 -19.904) (end 1.064 -20.158)
(end 1.064 -20.158) (stroke
(stroke (width 0.5)
(width 0.5) (type solid)
(type solid) )
) (fill yes)
(fill yes) (layer "F.SilkS")
(layer "F.SilkS") (uuid "2b5e2829-6d01-441f-9983-fc4a273ff483")
(uuid "e0ab7501-2085-405d-8904-360e96286f3d") )
) (fp_rect
(fp_rect (start 17.8 0)
(start 17.8 0) (end 0 -21)
(end 0 -21) (stroke
(stroke (width 0.05)
(width 0.05) (type default)
(type default) )
) (fill no)
(fill no) (layer "F.CrtYd")
(layer "F.CrtYd") (uuid "e428eb56-00a2-4249-bb91-d2e5823b2899")
(uuid "68fac093-a80b-43bd-acdd-9174c2b68a7b") )
) (fp_rect
(fp_rect (start 0 -21)
(start 0 -21) (end 17.8 0)
(end 17.8 0) (stroke
(stroke (width 0.1)
(width 0.1) (type default)
(type default) )
) (fill no)
(fill no) (layer "F.Fab")
(layer "F.Fab") (uuid "2133d927-559d-4615-ab92-732772c02d94")
(uuid "75e1e4bf-5495-4543-8162-6f2146eb31a7") )
) (fp_circle
(fp_circle (center 1.084 -19.9)
(center 1.084 -19.9) (end 1.084 -20.154)
(end 1.084 -20.154) (stroke
(stroke (width 0.5)
(width 0.5) (type solid)
(type solid) )
) (fill yes)
(fill yes) (layer "F.Fab")
(layer "F.Fab") (uuid "50e04a65-8ff2-4d1f-be98-2db48101e90a")
(uuid "3f79778e-efc6-4d8a-90fc-9b0956d1e6c8") )
) (pad "1" smd roundrect
(pad "1" smd roundrect (at 0.835 -18.12)
(at 0.835 -18.12) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "c68f6b12-dcf5-46b1-b159-2eef9023b0ac")
(uuid "a66a81ba-530e-4ed7-85fc-abb706366301") )
) (pad "2" smd roundrect
(pad "2" smd roundrect (at 0.835 -15.58)
(at 0.835 -15.58) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "525b09fc-9099-4274-98c3-45f84d0591ab")
(uuid "2e8e6c17-1c83-40e5-886b-8ac9e111d834") )
) (pad "3" smd roundrect
(pad "3" smd roundrect (at 0.835 -13.04)
(at 0.835 -13.04) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "99cc76a7-0a78-4868-871b-c214ecac5525")
(uuid "4c19fb00-2466-4963-9035-7df313ebbd03") )
) (pad "4" smd roundrect
(pad "4" smd roundrect (at 0.835 -10.5)
(at 0.835 -10.5) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "8038b67b-b3bf-4a3e-b790-40857963c957")
(uuid "020dc3ce-b079-4716-befc-21c4a0b166e5") )
) (pad "5" smd roundrect
(pad "5" smd roundrect (at 0.835 -7.96)
(at 0.835 -7.96) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "84711cb2-d222-464e-bcd5-f76af75cc612")
(uuid "94f0b26d-d04c-43cf-8320-ed3ef2490ead") )
) (pad "6" smd roundrect
(pad "6" smd roundrect (at 0.835 -5.42)
(at 0.835 -5.42) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "aabcfc3b-fa72-4e48-95d1-d53474158cc0")
(uuid "e24700dc-8a05-4c4d-a5b3-15a1c457d46d") )
) (pad "7" smd roundrect
(pad "7" smd roundrect (at 0.835 -2.88)
(at 0.835 -2.88) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "3e086061-1f3f-4b1e-9354-920126d40249")
(uuid "62fff5d6-54d1-422b-ad81-95284edc437b") )
) (pad "8" smd roundrect
(pad "8" smd roundrect (at 17 -2.88)
(at 17 -2.88) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "974a7e29-b5d3-475c-b481-2bc14f5b3495")
(uuid "9e877d45-e3c0-44e0-9458-4922630c6a1a") )
) (pad "9" smd roundrect
(pad "9" smd roundrect (at 17 -5.42)
(at 17 -5.42) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "a553cc0b-22bc-49aa-9fb7-680c812e8abd")
(uuid "1d9612e2-d4b8-4c42-b755-355323253c76") )
) (pad "10" smd roundrect
(pad "10" smd roundrect (at 17 -7.96)
(at 17 -7.96) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "b650936d-c436-4d93-abb7-7957add5cfb1")
(uuid "5b31b5e5-b0e6-4ab0-8375-70a97ef6477f") )
) (pad "11" smd roundrect
(pad "11" smd roundrect (at 17 -10.5)
(at 17 -10.5) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "177728f1-7b02-41a6-9de4-bdaee546f6d9")
(uuid "a7eb43c8-fdae-4b4e-8911-e5139f09839b") )
) (pad "12" smd roundrect
(pad "12" smd roundrect (at 17 -13.04)
(at 17 -13.04) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "eb6539ef-4d84-4ae5-bc4e-237dae21b9ef")
(uuid "46ec70bc-5b25-41d9-8f94-d64bca50566e") )
) (pad "13" smd roundrect
(pad "13" smd roundrect (at 17 -15.58)
(at 17 -15.58) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "c8744fbe-93c9-4c54-84bc-435357de679f")
(uuid "0b2adafc-0e12-42c8-82d3-09e4eaec6f34") )
) (pad "14" smd roundrect
(pad "14" smd roundrect (at 17 -18.12)
(at 17 -18.12) (size 2.75 2)
(size 2.75 2) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (solder_mask_margin 0.0508)
(solder_mask_margin 0.0508) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "fd579d63-bbef-4609-9252-aad3f944a314")
(uuid "b80dbfd3-3660-497c-91ee-d31b38368e21") )
) (pad "15" smd circle
(pad "15" smd circle (at 7.6166 -19.1415)
(at 7.6166 -19.1415) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "ad890579-1e55-4b71-9d59-080a59598896")
(uuid "1e713eb0-e2b6-45a1-abce-43bbf4392316") )
) (pad "16" smd circle
(pad "16" smd circle (at 10.1566 -19.1415)
(at 10.1566 -19.1415) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "25d6fdae-01ac-4ca4-8702-55badc8bcbc8")
(uuid "0b9de9dc-04ec-439c-b85b-ce655f2f5cd6") )
) (pad "17" smd circle
(pad "17" smd circle (at 7.6166 -16.6015)
(at 7.6166 -16.6015) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "e73ae295-736f-4acf-8ee1-0c120ebcebea")
(uuid "c845e0bb-80f7-42f3-a5db-d540a8c28762") )
) (pad "18" smd circle
(pad "18" smd circle (at 10.1566 -16.6015)
(at 10.1566 -16.6015) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "7adfba87-f861-42a5-bb73-c3f9fac53180")
(uuid "ac3ee324-2971-4b32-a471-bcb7de28c772") )
) (pad "19" smd circle
(pad "19" smd circle (at 7.6166 -14.0615)
(at 7.6166 -14.0615) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "619dc2a5-519d-48ac-9c78-8c438df2a14d")
(uuid "ed4179a5-d6cb-4841-818a-3e2c9a5fa81d") )
) (pad "20" smd circle
(pad "20" smd circle (at 10.1566 -14.0615)
(at 10.1566 -14.0615) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "aa8b72d0-17bf-47d4-94b1-df9199638a29")
(uuid "032beec7-6d1b-472e-a4a2-afbf49f975b3") )
) (pad "21" smd circle
(pad "21" smd circle (at 7.6166 -11.5215)
(at 7.6166 -11.5215) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "8539b5cc-db2c-4fa4-9ead-b842a1885293")
(uuid "25568581-39b7-4dd1-b81f-5b4a630b9650") )
) (pad "22" smd circle
(pad "22" smd circle (at 10.064 -11.5783)
(at 10.064 -11.5783) (size 1.7 1.7)
(size 1.7 1.7) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (uuid "313edcfe-ad25-4ea7-b786-d8290dfb479a")
(uuid "23bde525-d47d-40b7-84ea-dcf8234b1a5c") )
) (pad "23" smd roundrect
(pad "23" smd roundrect (at 7.3086 -4.9683 270)
(at 7.3086 -4.9683 270) (size 2.5 1.1)
(size 2.5 1.1) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "144d3c3d-6207-433c-9e61-4f75722af865")
(uuid "f3d763d5-6561-4c0f-9670-bb6789ac4352") )
) (pad "24" smd roundrect
(pad "24" smd roundrect (at 9.8486 -4.9683 270)
(at 9.8486 -4.9683 270) (size 2.5 1.1)
(size 2.5 1.1) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "3780a4ef-348c-4241-b04b-2cb4f7127fa2")
(uuid "de0f17f7-8fc6-479b-9cb3-df664992a6e4") )
) (pad "25" smd roundrect
(pad "25" smd roundrect (at 9.949 -8.412 270)
(at 9.949 -8.412 270) (size 3.1 1.9)
(size 3.1 1.9) (layers "F.Cu" "F.Mask" "F.Paste")
(layers "F.Cu" "F.Mask" "F.Paste") (roundrect_rratio 0.25)
(roundrect_rratio 0.25) (thermal_bridge_angle 45)
(thermal_bridge_angle 45) (uuid "00be3957-5a21-4898-8292-59f5f447623f")
(uuid "fcf89ab9-e2b7-4fff-9ab3-5d659c4716b9") )
) (embedded_fonts no)
(embedded_fonts no) )
(model "${KIPRJMOD}/library/Seeed Studio XIAO ESP32-C5.step"
(offset
(xyz 15 8.7 0)
)
(scale
(xyz 1 1 1)
)
(rotate
(xyz -90 -0 -90)
)
)
)

View file

@ -1,330 +0,0 @@
(footprint "apple-ambulance-07mm-silkscreen"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(property "Reference" "G***"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "2b5918f7-603f-4d90-b35f-93f7771c7c5a")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Value" "LOGO"
(at 0.75 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "389520d5-426c-4ad5-96ca-473e9b598336")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "b2d844bc-15e2-445c-a171-507c958fb0ae")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "6069302e-d1cc-475e-9ec2-e8f1b1e0a766")
(effects
(font
(size 1.27 1.27)
)
)
)
(attr board_only exclude_from_pos_files exclude_from_bom)
(duplicate_pad_numbers_are_jumpers no)
(fp_poly
(pts
(xy -3.564006 1.403515) (xy -3.477841 1.418201) (xy -3.477409 1.418311) (xy -3.311575 1.47625) (xy -3.158272 1.561271)
(xy -3.02076 1.67015) (xy -2.902296 1.799665) (xy -2.80614 1.946593) (xy -2.735551 2.107712) (xy -2.716425 2.170804)
(xy -2.698044 2.270948) (xy -2.689557 2.388431) (xy -2.690963 2.510483) (xy -2.702262 2.624336) (xy -2.716425 2.693699)
(xy -2.77566 2.856203) (xy -2.861703 3.007451) (xy -2.970947 3.143618) (xy -3.099784 3.260884) (xy -3.244606 3.355426)
(xy -3.401806 3.423421) (xy -3.406737 3.425031) (xy -3.51052 3.449265) (xy -3.63247 3.463095) (xy -3.760725 3.466236)
(xy -3.883419 3.458403) (xy -3.988688 3.43931) (xy -3.989598 3.439065) (xy -4.154265 3.380019) (xy -4.303264 3.295183)
(xy -4.440832 3.182095) (xy -4.454033 3.169227) (xy -4.572775 3.033788) (xy -4.661492 2.89078) (xy -4.721491 2.737075)
(xy -4.754073 2.569545) (xy -4.761303 2.432252) (xy -4.167311 2.432252) (xy -4.152257 2.536497) (xy -4.110172 2.636271)
(xy -4.045673 2.72544) (xy -3.963374 2.797871) (xy -3.867894 2.84743) (xy -3.850508 2.853192) (xy -3.780827 2.86472)
(xy -3.697271 2.86463) (xy -3.61522 2.853492) (xy -3.576815 2.843039) (xy -3.47951 2.794603) (xy -3.401443 2.725275)
(xy -3.343585 2.640062) (xy -3.30691 2.54397) (xy -3.292389 2.442005) (xy -3.300995 2.339173) (xy -3.333701 2.240482)
(xy -3.391479 2.150936) (xy -3.433973 2.107681) (xy -3.525746 2.046501) (xy -3.630353 2.009563) (xy -3.740415 1.997868)
(xy -3.848554 2.012415) (xy -3.924207 2.041274) (xy -4.006823 2.09932) (xy -4.077345 2.179239) (xy -4.130646 2.272782)
(xy -4.161596 2.371703) (xy -4.167311 2.432252) (xy -4.761303 2.432252) (xy -4.748663 2.252944) (xy -4.70981 2.089807)
(xy -4.643347 1.939497) (xy -4.547876 1.798667) (xy -4.45266 1.693534) (xy -4.31628 1.579375) (xy -4.163124 1.489123)
(xy -3.999316 1.426267) (xy -3.969878 1.418311) (xy -3.883859 1.40358) (xy -3.77933 1.396204) (xy -3.668608 1.396182)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "7752d7a9-942f-4bf8-9357-17306a94d401")
)
(fp_poly
(pts
(xy 5.933658 1.403658) (xy 6.004487 1.406429) (xy 6.059309 1.412056) (xy 6.105957 1.42142) (xy 6.152262 1.435404)
(xy 6.163818 1.439412) (xy 6.330207 1.514264) (xy 6.480315 1.614385) (xy 6.611219 1.736848) (xy 6.719997 1.878726)
(xy 6.803727 2.037089) (xy 6.830589 2.107423) (xy 6.855054 2.205848) (xy 6.870081 2.323058) (xy 6.875185 2.447441)
(xy 6.869883 2.567382) (xy 6.854007 2.669931) (xy 6.813031 2.805683) (xy 6.755203 2.927307) (xy 6.676058 3.042494)
(xy 6.571128 3.158938) (xy 6.56849 3.161579) (xy 6.462413 3.258894) (xy 6.360114 3.332673) (xy 6.252438 3.388308)
(xy 6.13023 3.431194) (xy 6.093984 3.441175) (xy 5.992929 3.459437) (xy 5.874731 3.467883) (xy 5.752404 3.466428)
(xy 5.638967 3.454984) (xy 5.585658 3.444542) (xy 5.42618 3.390141) (xy 5.277218 3.308398) (xy 5.142273 3.202872)
(xy 5.024847 3.077127) (xy 4.928443 2.934723) (xy 4.856563 2.779222) (xy 4.823972 2.669931) (xy 4.807942 2.565727)
(xy 4.802794 2.445638) (xy 4.803359 2.432252) (xy 5.40394 2.432252) (xy 5.418595 2.549248) (xy 5.461436 2.652939)
(xy 5.530774 2.740594) (xy 5.624919 2.809483) (xy 5.643233 2.819114) (xy 5.711573 2.849154) (xy 5.771665 2.864046)
(xy 5.838989 2.867997) (xy 5.907387 2.863892) (xy 5.967479 2.848772) (xy 6.034746 2.819114) (xy 6.128982 2.755368)
(xy 6.201818 2.671708) (xy 6.250892 2.57337) (xy 6.273842 2.465588) (xy 6.268306 2.353598) (xy 6.260436 2.318842)
(xy 6.216702 2.214791) (xy 6.148742 2.126763) (xy 6.06148 2.058537) (xy 5.959841 2.013888) (xy 5.848751 1.996595)
(xy 5.840136 1.996506) (xy 5.726105 2.011219) (xy 5.623684 2.052887) (xy 5.536582 2.117807) (xy 5.468506 2.202275)
(xy 5.423165 2.302586) (xy 5.404265 2.415036) (xy 5.40394 2.432252) (xy 4.803359 2.432252) (xy 4.808046 2.321277)
(xy 4.823213 2.204256) (xy 4.84739 2.107423) (xy 4.915607 1.952101) (xy 5.009378 1.80597) (xy 5.108782 1.692104)
(xy 5.227529 1.588985) (xy 5.353843 1.509207) (xy 5.499074 1.445614) (xy 5.500936 1.444936) (xy 5.551179 1.427688)
(xy 5.595672 1.415871) (xy 5.642442 1.408486) (xy 5.699516 1.404534) (xy 5.774919 1.403016) (xy 5.838989 1.402863)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "499a74da-2188-4a5d-852b-beafe83b1fe5")
)
(fp_poly
(pts
(xy -0.328674 -2.170563) (xy -0.143741 -2.169823) (xy 0.011668 -2.168564) (xy 0.138636 -2.166766)
(xy 0.238244 -2.164409) (xy 0.311574 -2.161471) (xy 0.359707 -2.157932) (xy 0.383725 -2.153772) (xy 0.38529 -2.153105)
(xy 0.422645 -2.126534) (xy 0.447277 -2.101608) (xy 0.451031 -2.095582) (xy 0.454427 -2.08621) (xy 0.457484 -2.071964)
(xy 0.460219 -2.051314) (xy 0.462651 -2.022731) (xy 0.464797 -1.984688) (xy 0.466677 -1.935655) (xy 0.468307 -1.874104)
(xy 0.469706 -1.798505) (xy 0.470893 -1.707331) (xy 0.471885 -1.599052) (xy 0.472699 -1.47214) (xy 0.473356 -1.325065)
(xy 0.473871 -1.1563) (xy 0.474265 -0.964316) (xy 0.474554 -0.747584) (xy 0.474756 -0.504574) (xy 0.474891 -0.233759)
(xy 0.474975 0.06639) (xy 0.475006 0.24164) (xy 0.475359 2.551091) (xy -0.522895 2.551091) (xy -1.521148 2.551091)
(xy -1.521148 0.238895) (xy -1.521148 -0.929276) (xy -1.204242 -0.929276) (xy -1.204144 -0.800708)
(xy -1.203653 -0.699729) (xy -1.202479 -0.622239) (xy -1.20033 -0.564137) (xy -1.196913 -0.521322)
(xy -1.191937 -0.489693) (xy -1.18511 -0.465149) (xy -1.17614 -0.44359) (xy -1.16859 -0.428392) (xy -1.138226 -0.378967)
(xy -1.102126 -0.343806) (xy -1.054637 -0.320693) (xy -0.99011 -0.307409) (xy -0.902891 -0.301738)
(xy -0.844009 -0.301061) (xy -0.665502 -0.301061) (xy -0.665502 -0.91664) (xy -0.665502 -0.924858)
(xy -0.411978 -0.924858) (xy -0.411978 -0.301061) (xy -0.224177 -0.301061) (xy -0.142003 -0.301634)
(xy -0.084445 -0.304053) (xy -0.044441 -0.309369) (xy -0.014926 -0.318635) (xy 0.011163 -0.332902)
(xy 0.017463 -0.337029) (xy 0.047471 -0.358327) (xy 0.071421 -0.380232) (xy 0.089994 -0.406422) (xy 0.103871 -0.440578)
(xy 0.113734 -0.486378) (xy 0.120264 -0.547502) (xy 0.124143 -0.627629) (xy 0.126052 -0.73044) (xy 0.126673 -0.859613)
(xy 0.126713 -0.92695) (xy 0.126519 -1.059785) (xy 0.125793 -1.164803) (xy 0.124321 -1.245877) (xy 0.121887 -1.306878)
(xy 0.118277 -1.351679) (xy 0.113275 -1.384151) (xy 0.106667 -1.408169) (xy 0.099008 -1.426076) (xy 0.072506 -1.466584)
(xy 0.036101 -1.496396) (xy -0.015148 -1.517264) (xy -0.086182 -1.530941) (xy -0.181945 -1.53918)
(xy -0.225795 -1.541247) (xy -0.411978 -1.548656) (xy -0.411978 -0.924858) (xy -0.665502 -0.924858)
(xy -0.665502 -1.532219) (xy -0.830709 -1.541574) (xy -0.935156 -1.54482) (xy -1.013902 -1.540428)
(xy -1.072228 -1.527432) (xy -1.115414 -1.504867) (xy -1.137021 -1.48552) (xy -1.156155 -1.462999)
(xy -1.171293 -1.43833) (xy -1.182897 -1.407684) (xy -1.191429 -1.367229) (xy -1.197354 -1.313136)
(xy -1.201133 -1.241574) (xy -1.203229 -1.148712) (xy -1.204106 -1.030721) (xy -1.204242 -0.929276)
(xy -1.521148 -0.929276) (xy -1.521148 -2.073302) (xy -1.480126 -2.122054) (xy -1.439104 -2.170805)
(xy -0.544212 -2.170805)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "a69ecd92-db58-4467-aaec-668d00b55053")
)
(fp_poly
(pts
(xy 3.420751 -1.819174) (xy 3.530625 -1.817218) (xy 3.620867 -1.813083) (xy 3.695493 -1.806294) (xy 3.758519 -1.796373)
(xy 3.813961 -1.782842) (xy 3.865837 -1.765225) (xy 3.918162 -1.743043) (xy 3.970277 -1.718132) (xy 3.998375 -1.702797)
(xy 4.031507 -1.681607) (xy 4.071624 -1.652945) (xy 4.120678 -1.615192) (xy 4.180618 -1.56673) (xy 4.253398 -1.505941)
(xy 4.340967 -1.431207) (xy 4.445277 -1.340909) (xy 4.56828 -1.23343) (xy 4.711926 -1.107151) (xy 4.790186 -1.038144)
(xy 4.919768 -0.924138) (xy 5.044022 -0.815478) (xy 5.160619 -0.714156) (xy 5.267232 -0.622165) (xy 5.361533 -0.541497)
(xy 5.441194 -0.474144) (xy 5.503887 -0.422099) (xy 5.547285 -0.387355) (xy 5.567732 -0.372633) (xy 5.611519 -0.352992)
(xy 5.683694 -0.328238) (xy 5.78152 -0.299205) (xy 5.902257 -0.266724) (xy 5.983755 -0.246127) (xy 6.222473 -0.185882)
(xy 6.433777 -0.130098) (xy 6.61711 -0.078947) (xy 6.77191 -0.032602) (xy 6.897621 0.008763) (xy 6.993681 0.044977)
(xy 7.059533 0.075867) (xy 7.088757 0.095432) (xy 7.13494 0.150225) (xy 7.179893 0.22986) (xy 7.220276 0.327559)
(xy 7.248471 0.41958) (xy 7.264224 0.480764) (xy 7.270027 0.519999) (xy 7.261344 0.542144) (xy 7.233641 0.552056)
(xy 7.182381 0.554596) (xy 7.122458 0.554585) (xy 6.971928 0.554585) (xy 6.971928 0.793051) (xy 6.97285 0.896717)
(xy 6.975868 0.973298) (xy 6.981353 1.027357) (xy 6.989682 1.063452) (xy 6.995164 1.076452) (xy 7.029512 1.123905)
(xy 7.083427 1.177544) (xy 7.148019 1.229604) (xy 7.2144 1.272325) (xy 7.227268 1.279146) (xy 7.296756 1.314438)
(xy 7.310529 1.195958) (xy 7.319749 1.130238) (xy 7.332202 1.092422) (xy 7.353299 1.078801) (xy 7.388447 1.085664)
(xy 7.439364 1.107583) (xy 7.504623 1.148234) (xy 7.564425 1.203503) (xy 7.608676 1.263315) (xy 7.620613 1.288461)
(xy 7.626097 1.319354) (xy 7.630661 1.378388) (xy 7.634162 1.462022) (xy 7.63646 1.566715) (xy 7.637412 1.688926)
(xy 7.63743 1.70922) (xy 7.63743 2.085373) (xy 7.592536 2.156164) (xy 7.531871 2.225345) (xy 7.444956 2.282166)
(xy 7.330709 2.327133) (xy 7.188049 2.360751) (xy 7.137057 2.36907) (xy 7.083891 2.371223) (xy 7.055748 2.357921)
(xy 7.046248 2.333635) (xy 7.035 2.286292) (xy 7.023872 2.224317) (xy 7.019494 2.194572) (xy 6.985232 2.001184)
(xy 6.937997 1.820923) (xy 6.879292 1.657402) (xy 6.81062 1.514239) (xy 6.733483 1.395048) (xy 6.649383 1.303445)
(xy 6.649027 1.303132) (xy 6.59363 1.257312) (xy 6.539334 1.219827) (xy 6.482323 1.189918) (xy 6.418779 1.166826)
(xy 6.344887 1.149793) (xy 6.256829 1.13806) (xy 6.150788 1.130868) (xy 6.022947 1.127458) (xy 5.86949 1.127071)
(xy 5.767685 1.127929) (xy 5.316095 1.132938) (xy 5.221023 1.179446) (xy 5.110003 1.250785) (xy 5.006329 1.352128)
(xy 4.910503 1.482538) (xy 4.823027 1.641075) (xy 4.744402 1.826802) (xy 4.675133 2.038779) (xy 4.61572 2.276069)
(xy 4.603794 2.332696) (xy 4.588211 2.406507) (xy 4.573939 2.469312) (xy 4.562582 2.514355) (xy 4.555844 2.534723)
(xy 4.538087 2.538555) (xy 4.492067 2.541909) (xy 4.421106 2.544791) (xy 4.32853 2.547206) (xy 4.217661 2.54916)
(xy 4.091824 2.55066) (xy 3.954341 2.551711) (xy 3.808536 2.552319) (xy 3.657734 2.552489) (xy 3.505257 2.552228)
(xy 3.35443 2.551542) (xy 3.208575 2.550436) (xy 3.071017 2.548917) (xy 2.94508 2.54699) (xy 2.834086 2.54466)
(xy 2.74136 2.541935) (xy 2.670225 2.538819) (xy 2.624005 2.535318) (xy 2.606023 2.53144) (xy 2.605941 2.531285)
(xy 2.605066 2.513336) (xy 2.604279 2.465535) (xy 2.603582 2.389719) (xy 2.602979 2.287726) (xy 2.602471 2.161395)
(xy 2.602062 2.012563) (xy 2.601756 1.843069) (xy 2.601554 1.65475) (xy 2.601459 1.449444) (xy 2.601476 1.228989)
(xy 2.601606 0.995223) (xy 2.601852 0.749985) (xy 2.602218 0.495111) (xy 2.602477 0.348596) (xy 2.605615 -1.317759)
(xy 2.955146 -1.317759) (xy 2.955146 -0.763538) (xy 2.955216 -0.616152) (xy 2.955542 -0.497162) (xy 2.956302 -0.403273)
(xy 2.957672 -0.33119) (xy 2.959831 -0.277617) (xy 2.962955 -0.239261) (xy 2.967222 -0.212827) (xy 2.972808 -0.195018)
(xy 2.97989 -0.182542) (xy 2.986837 -0.174092) (xy 3.021094 -0.143478) (xy 3.050218 -0.125897) (xy 3.0722 -0.12321)
(xy 3.122548 -0.120668) (xy 3.197938 -0.118332) (xy 3.295047 -0.116264) (xy 3.410551 -0.114524) (xy 3.541125 -0.113174)
(xy 3.683446 -0.112277) (xy 3.805947 -0.111922) (xy 4.529986 -0.110917) (xy 4.574444 -0.14912) (xy 4.592201 -0.165305)
(xy 4.604601 -0.18197) (xy 4.612777 -0.204937) (xy 4.61786 -0.240027) (xy 4.620984 -0.29306) (xy 4.623282 -0.369858)
(xy 4.624125 -0.404463) (xy 4.625383 -0.487394) (xy 4.62515 -0.56159) (xy 4.623544 -0.619924) (xy 4.620683 -0.655272)
(xy 4.619902 -0.659238) (xy 4.606064 -0.678508) (xy 4.571452 -0.715461) (xy 4.519312 -0.767112) (xy 4.45289 -0.830475)
(xy 4.375435 -0.902563) (xy 4.290192 -0.980391) (xy 4.200409 -1.060972) (xy 4.109333 -1.141321) (xy 4.02021 -1.218451)
(xy 3.936288 -1.289377) (xy 3.919944 -1.302944) (xy 3.875606 -1.336517) (xy 3.830578 -1.362415) (xy 3.780002 -1.381592)
(xy 3.719021 -1.394997) (xy 3.642776 -1.403585) (xy 3.546409 -1.408305) (xy 3.425062 -1.410111) (xy 3.372421 -1.410231)
(xy 3.058641 -1.410231) (xy 3.006894 -1.363995) (xy 2.955146 -1.317759) (xy 2.605615 -1.317759) (xy 2.60655 -1.814286)
(xy 3.126039 -1.818465) (xy 3.287228 -1.819431)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "acbdc647-ec64-4b05-ba49-9ceea1abe1e3")
)
(fp_poly
(pts
(xy -2.050607 -3.469998) (xy -1.628264 -3.469987) (xy -1.235445 -3.469959) (xy -0.871066 -3.469908)
(xy -0.534042 -3.469826) (xy -0.223291 -3.469705) (xy 0.062272 -3.469539) (xy 0.323729 -3.469319)
(xy 0.562166 -3.46904) (xy 0.778665 -3.468693) (xy 0.97431 -3.468271) (xy 1.150184 -3.467767) (xy 1.307373 -3.467173)
(xy 1.446958 -3.466483) (xy 1.570024 -3.465689) (xy 1.677654 -3.464783) (xy 1.770932 -3.463758) (xy 1.850942 -3.462608)
(xy 1.918767 -3.461324) (xy 1.975492 -3.4599) (xy 2.022199 -3.458327) (xy 2.059972 -3.4566) (xy 2.089896 -3.45471)
(xy 2.113053 -3.45265) (xy 2.130528 -3.450413) (xy 2.143403 -3.447991) (xy 2.152763 -3.445378) (xy 2.159692 -3.442566)
(xy 2.165273 -3.439547) (xy 2.166988 -3.438514) (xy 2.211786 -3.402027) (xy 2.249032 -3.357134) (xy 2.250117 -3.355385)
(xy 2.253962 -3.348665) (xy 2.25748 -3.340754) (xy 2.260687 -3.330281) (xy 2.263596 -3.315879) (xy 2.266222 -3.296175)
(xy 2.26858 -3.269801) (xy 2.270684 -3.235386) (xy 2.272549 -3.191561) (xy 2.274189 -3.136955) (xy 2.275619 -3.070198)
(xy 2.276852 -2.98992) (xy 2.277905 -2.894752) (xy 2.27879 -2.783323) (xy 2.279523 -2.654264) (xy 2.280118 -2.506204)
(xy 2.28059 -2.337774) (xy 2.280954 -2.147603) (xy 2.281223 -1.934321) (xy 2.281412 -1.696559) (xy 2.281535 -1.432946)
(xy 2.281609 -1.142113) (xy 2.281645 -0.82269) (xy 2.28166 -0.473306) (xy 2.281662 -0.376326) (xy 2.281722 2.551091)
(xy 1.473612 2.551091) (xy 0.665502 2.551091) (xy 0.665502 0.24812) (xy 0.665511 -0.073073) (xy 0.665504 -0.36413)
(xy 0.665434 -0.626602) (xy 0.665251 -0.862045) (xy 0.664907 -1.072011) (xy 0.664352 -1.258054) (xy 0.663538 -1.421727)
(xy 0.662417 -1.564585) (xy 0.66094 -1.688179) (xy 0.659057 -1.794065) (xy 0.65672 -1.883795) (xy 0.653881 -1.958923)
(xy 0.65049 -2.021002) (xy 0.646499 -2.071587) (xy 0.641859 -2.112229) (xy 0.636521 -2.144484) (xy 0.630437 -2.169904)
(xy 0.623557 -2.190043) (xy 0.615834 -2.206454) (xy 0.607218 -2.220691) (xy 0.59766 -2.234308) (xy 0.587136 -2.248823)
(xy 0.552602 -2.285712) (xy 0.504032 -2.324433) (xy 0.478284 -2.341081) (xy 0.404055 -2.384717) (xy -0.483281 -2.389739)
(xy -0.697834 -2.390716) (xy -0.882319 -2.391027) (xy -1.038352 -2.39065) (xy -1.167548 -2.38956)
(xy -1.271525 -2.387737) (xy -1.351898 -2.385157) (xy -1.410282 -2.381798) (xy -1.448295 -2.377637)
(xy -1.456601 -2.376093) (xy -1.537212 -2.344524) (xy -1.612977 -2.289885) (xy -1.675754 -2.219959)
(xy -1.717402 -2.14253) (xy -1.724275 -2.120148) (xy -1.727031 -2.100692) (xy -1.729533 -2.064505)
(xy -1.731791 -2.010481) (xy -1.733813 -1.93751) (xy -1.735607 -1.844486) (xy -1.737183 -1.730301)
(xy -1.738548 -1.593847) (xy -1.739713 -1.434015) (xy -1.740685 -1.249698) (xy -1.741473 -1.039789)
(xy -1.742087 -0.803179) (xy -1.742534 -0.538761) (xy -1.742824 -0.245426) (xy -1.742965 0.077933)
(xy -1.742982 0.252618) (xy -1.742982 2.551091) (xy -2.025776 2.551091) (xy -2.30857 2.551091) (xy -2.318325 2.380597)
(xy -2.345454 2.170031) (xy -2.401206 1.970426) (xy -2.484079 1.784063) (xy -2.592573 1.613221) (xy -2.725189 1.460182)
(xy -2.880426 1.327227) (xy -3.056784 1.216635) (xy -3.097754 1.195783) (xy -3.289659 1.119032) (xy -3.487713 1.072201)
(xy -3.688713 1.054929) (xy -3.889457 1.066856) (xy -4.086743 1.107622) (xy -4.277367 1.176867) (xy -4.458126 1.274231)
(xy -4.581705 1.36261) (xy -4.73102 1.502051) (xy -4.857182 1.663118) (xy -4.960135 1.84574) (xy -4.960246 1.845976)
(xy -5.019355 1.984478) (xy -5.059821 2.114216) (xy -5.085046 2.248615) (xy -5.097744 2.388371) (xy -5.106958 2.551091)
(xy -6.372194 2.551091) (xy -7.63743 2.551091) (xy -7.63743 2.281721) (xy -7.63743 2.012351) (xy -7.463132 2.012351)
(xy -7.288834 2.012351) (xy -7.288774 -0.645696) (xy -7.288762 -0.985626) (xy -7.288728 -1.295306)
(xy -7.288713 -1.354773) (xy -5.434199 -1.354773) (xy -5.420268 -1.34204) (xy -5.383249 -1.316634)
(xy -5.327668 -1.281435) (xy -5.258046 -1.239324) (xy -5.194463 -1.202122) (xy -4.957292 -1.065317)
(xy -5.049544 -1.010162) (xy -5.109988 -0.974488) (xy -5.183182 -0.931947) (xy -5.254241 -0.891187)
(xy -5.260636 -0.887553) (xy -5.331403 -0.848453) (xy -5.382014 -0.819568) (xy -5.413466 -0.795292)
(xy -5.426756 -0.770018) (xy -5.422882 -0.738139) (xy -5.402841 -0.694049) (xy -5.36763 -0.63214)
(xy -5.320523 -0.550815) (xy -5.277209 -0.474814) (xy -5.23952 -0.40894) (xy -5.210169 -0.357916)
(xy -5.191871 -0.326467) (xy -5.187107 -0.318647) (xy -5.172525 -0.324132) (xy -5.135106 -0.343186)
(xy -5.079367 -0.373372) (xy -5.009822 -0.412254) (xy -4.944873 -0.449371) (xy -4.866901 -0.494066)
(xy -4.798684 -0.532649) (xy -4.744841 -0.562548) (xy -4.709997 -0.581191) (xy -4.69885 -0.586276)
(xy -4.696089 -0.571265) (xy -4.693692 -0.529563) (xy -4.691812 -0.466172) (xy -4.690601 -0.38609)
(xy -4.690206 -0.301061) (xy -4.690206 -0.015846) (xy -4.420836 -0.015846) (xy -4.151466 -0.015846)
(xy -4.151466 -0.301061) (xy -4.150931 -0.392172) (xy -4.149445 -0.471241) (xy -4.147186 -0.533268)
(xy -4.144333 -0.573254) (xy -4.141303 -0.586276) (xy -4.124878 -0.578768) (xy -4.085697 -0.557958)
(xy -4.028433 -0.526412) (xy -3.95776 -0.4867) (xy -3.894178 -0.450473) (xy -3.816412 -0.406572)
(xy -3.748466 -0.369481) (xy -3.694936 -0.341606) (xy -3.660412 -0.32535) (xy -3.649512 -0.322374)
(xy -3.638054 -0.339418) (xy -3.614751 -0.377855) (xy -3.582859 -0.431997) (xy -3.545632 -0.496155)
(xy -3.506328 -0.564639) (xy -3.468202 -0.631761) (xy -3.434509 -0.69183) (xy -3.408505 -0.739159)
(xy -3.393447 -0.768057) (xy -3.391009 -0.774085) (xy -3.404142 -0.784864) (xy -3.440476 -0.808348)
(xy -3.495537 -0.841806) (xy -3.564848 -0.882507) (xy -3.628572 -0.919027) (xy -3.706151 -0.963539)
(xy -3.773122 -1.002933) (xy -3.825012 -1.034498) (xy -3.857348 -1.055523) (xy -3.866134 -1.062977)
(xy -3.853122 -1.073512) (xy -3.81702 -1.096826) (xy -3.76235 -1.130149) (xy -3.693636 -1.170708)
(xy -3.635955 -1.204009) (xy -3.558999 -1.248507) (xy -3.492009 -1.288128) (xy -3.439715 -1.320004)
(xy -3.406845 -1.341266) (xy -3.397839 -1.34843) (xy -3.402874 -1.365321) (xy -3.421137 -1.403665)
(xy -3.449422 -1.457818) (xy -3.484522 -1.522136) (xy -3.523233 -1.590976) (xy -3.562347 -1.658693)
(xy -3.598659 -1.719644) (xy -3.628962 -1.768186) (xy -3.650052 -1.798673) (xy -3.657939 -1.806297)
(xy -3.674411 -1.798786) (xy -3.713638 -1.778012) (xy -3.770924 -1.746549) (xy -3.841574 -1.706967)
(xy -3.903814 -1.671612) (xy -3.98136 -1.6275) (xy -4.048876 -1.589455) (xy -4.101768 -1.560037)
(xy -4.135443 -1.541805) (xy -4.145455 -1.536994) (xy -4.147375 -1.552005) (xy -4.149042 -1.593707)
(xy -4.150349 -1.657099) (xy -4.151192 -1.737181) (xy -4.151466 -1.822209) (xy -4.151466 -2.107424)
(xy -4.420836 -2.107424) (xy -4.690206 -2.107424) (xy -4.690206 -1.822209) (xy -4.690551 -1.731097)
(xy -4.691508 -1.652027) (xy -4.692964 -1.59) (xy -4.694803 -1.550015) (xy -4.696756 -1.536994) (xy -4.711935 -1.544551)
(xy -4.749861 -1.565486) (xy -4.805917 -1.597191) (xy -4.875488 -1.637061) (xy -4.935349 -1.671678)
(xy -5.01254 -1.716117) (xy -5.080173 -1.754363) (xy -5.133525 -1.783799) (xy -5.16787 -1.80181)
(xy -5.178362 -1.806246) (xy -5.189876 -1.793159) (xy -5.213069 -1.757785) (xy -5.244719 -1.705806)
(xy -5.281607 -1.642905) (xy -5.320512 -1.574766) (xy -5.358215 -1.50707) (xy -5.391495 -1.445502)
(xy -5.417131 -1.395742) (xy -5.431904 -1.363475) (xy -5.434199 -1.354773) (xy -7.288713 -1.354773)
(xy -7.288656 -1.576176) (xy -7.28853 -1.829676) (xy -7.288333 -2.057246) (xy -7.288048 -2.260328)
(xy -7.287658 -2.440361) (xy -7.287146 -2.598785) (xy -7.286497 -2.737041) (xy -7.286487 -2.738455)
(xy -6.718403 -2.738455) (xy -6.71632 -2.641971) (xy -6.709211 -2.572017) (xy -6.695784 -2.523654)
(xy -6.674746 -2.491944) (xy -6.649253 -2.47406) (xy -6.619688 -2.467824) (xy -6.561212 -2.463351)
(xy -6.476559 -2.460748) (xy -6.368465 -2.460125) (xy -6.308983 -2.460562) (xy -6.002557 -2.463943)
(xy -5.964348 -2.508401) (xy -5.947373 -2.530542) (xy -5.936323 -2.554353) (xy -5.929941 -2.58697)
(xy -5.92697 -2.635531) (xy -5.926154 -2.707173) (xy -5.926139 -2.72539) (xy -5.926248 -2.741384)
(xy -2.852152 -2.741384) (xy -2.850328 -2.643197) (xy -2.844089 -2.57192) (xy -2.832282 -2.522939)
(xy -2.813758 -2.49164) (xy -2.787365 -2.473412) (xy -2.78504 -2.472445) (xy -2.758036 -2.467741)
(xy -2.705186 -2.463566) (xy -2.632334 -2.460197) (xy -2.545325 -2.457914) (xy -2.461737 -2.457025)
(xy -2.358332 -2.456939) (xy -2.281743 -2.457801) (xy -2.227095 -2.46005) (xy -2.189517 -2.464124)
(xy -2.164138 -2.470463) (xy -2.146085 -2.479505) (xy -2.136908 -2.486275) (xy -2.121283 -2.500851)
(xy -2.110504 -2.51878) (xy -2.103455 -2.546065) (xy -2.099019 -2.588708) (xy -2.096079 -2.65271)
(xy -2.094259 -2.715472) (xy -2.092328 -2.798117) (xy -2.092313 -2.815118) (xy 1.016004 -2.815118)
(xy 1.016254 -2.716803) (xy 1.016665 -2.701463) (xy 1.01907 -2.621878) (xy 1.023691 -2.561649) (xy 1.034474 -2.518086)
(xy 1.055361 -2.488502) (xy 1.090297 -2.470205) (xy 1.143227 -2.460508) (xy 1.218095 -2.456721) (xy 1.318844 -2.456155)
(xy 1.376334 -2.456237) (xy 1.469731 -2.456844) (xy 1.554149 -2.458393) (xy 1.623628 -2.460697) (xy 1.672203 -2.463566)
(xy 1.692119 -2.466173) (xy 1.725411 -2.483238) (xy 1.749128 -2.516422) (xy 1.76445 -2.569625) (xy 1.772561 -2.646751)
(xy 1.774672 -2.738693) (xy 1.774623 -2.817847) (xy 1.771926 -2.87802) (xy 1.762755 -2.921959) (xy 1.743285 -2.952411)
(xy 1.709689 -2.972123) (xy 1.658142 -2.983842) (xy 1.584819 -2.990315) (xy 1.485894 -2.994289) (xy 1.415595 -2.996521)
(xy 1.300563 -2.999321) (xy 1.206299 -2.999682) (xy 1.135932 -2.997659) (xy 1.092592 -2.993311) (xy 1.082512 -2.990509)
(xy 1.053715 -2.970368) (xy 1.033713 -2.937414) (xy 1.021483 -2.88716) (xy 1.016004 -2.815118) (xy -2.092313 -2.815118)
(xy -2.092277 -2.855324) (xy -2.095017 -2.893328) (xy -2.10146 -2.918366) (xy -2.112515 -2.936675)
(xy -2.129096 -2.954492) (xy -2.129191 -2.954587) (xy -2.145736 -2.969934) (xy -2.163352 -2.980864)
(xy -2.187524 -2.988225) (xy -2.223737 -2.992864) (xy -2.277473 -2.995629) (xy -2.354218 -2.997367)
(xy -2.411725 -2.998243) (xy -2.52783 -2.999894) (xy -2.616461 -3.000787) (xy -2.681834 -3.000486)
(xy -2.728164 -2.998557) (xy -2.759668 -2.994567) (xy -2.78056 -2.98808) (xy -2.795057 -2.978662)
(xy -2.807373 -2.965879) (xy -2.81526 -2.956656) (xy -2.831694 -2.934927) (xy -2.842383 -2.910842)
(xy -2.848545 -2.877307) (xy -2.851394 -2.827231) (xy -2.852145 -2.753522) (xy -2.852152 -2.741384)
(xy -5.926248 -2.741384) (xy -5.926667 -2.802648) (xy -5.92909 -2.855359) (xy -5.934666 -2.890659)
(xy -5.944653 -2.915685) (xy -5.960307 -2.937575) (xy -5.964377 -2.942377) (xy -6.002616 -2.986832)
(xy -6.30109 -2.996639) (xy -6.397268 -2.999082) (xy -6.484282 -2.99995) (xy -6.556481 -2.999292)
(xy -6.608213 -2.997158) (xy -6.633616 -2.99368) (xy -6.66858 -2.974935) (xy -6.692807 -2.945891)
(xy -6.70803 -2.901332) (xy -6.715982 -2.836042) (xy -6.718397 -2.744806) (xy -6.718403 -2.738455)
(xy -7.286487 -2.738455) (xy -7.285692 -2.856569) (xy -7.284715 -2.958809) (xy -7.283549 -3.045202)
(xy -7.282179 -3.117188) (xy -7.280586 -3.176207) (xy -7.278754 -3.223699) (xy -7.276666 -3.261106)
(xy -7.274306 -3.289866) (xy -7.271657 -3.311421) (xy -7.268702 -3.32721) (xy -7.265424 -3.338675)
(xy -7.261806 -3.347255) (xy -7.257832 -3.35439) (xy -7.257229 -3.355385) (xy -7.220742 -3.400183)
(xy -7.175849 -3.437429) (xy -7.1741 -3.438514) (xy -7.168725 -3.441602) (xy -7.162357 -3.444481)
(xy -7.153911 -3.447158) (xy -7.142305 -3.449641) (xy -7.126454 -3.451938) (xy -7.105275 -3.454055)
(xy -7.077685 -3.456) (xy -7.042598 -3.45778) (xy -6.998933 -3.459402) (xy -6.945605 -3.460874) (xy -6.88153 -3.462203)
(xy -6.805626 -3.463396) (xy -6.716807 -3.464461) (xy -6.613991 -3.465405) (xy -6.496094 -3.466235)
(xy -6.362033 -3.466958) (xy -6.210722 -3.467583) (xy -6.04108 -3.468115) (xy -5.852022 -3.468563)
(xy -5.642465 -3.468934) (xy -5.411324 -3.469235) (xy -5.157517 -3.469473) (xy -4.879959 -3.469656)
(xy -4.577567 -3.469791) (xy -4.249257 -3.469885) (xy -3.893946 -3.469946) (xy -3.51055 -3.46998)
(xy -3.097985 -3.469996) (xy -2.655168 -3.47) (xy -2.503556 -3.47)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "b464dfb2-d2e3-4a3d-935a-0c4c08170cc6")
)
(embedded_fonts no)
)

View file

@ -1,350 +0,0 @@
(footprint "apple-bicycle-05mm-silkscreen"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(property "Reference" "G***"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "5f9edfeb-afa6-44a5-9971-ad68e214f6b6")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Value" "LOGO"
(at 0.75 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "be1a0545-967a-4e33-8779-26521f4dbdec")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "d6beda4c-1e42-4f1d-b05d-99c01cc85411")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "35d203d7-65f9-41ce-9d7e-c62437ae5955")
(effects
(font
(size 1.27 1.27)
)
)
)
(attr board_only exclude_from_pos_files exclude_from_bom)
(duplicate_pad_numbers_are_jumpers no)
(fp_poly
(pts
(xy -1.551965 -2.479045) (xy -1.442298 -2.478781) (xy -1.381831 -2.478568) (xy -0.82099 -2.4764)
(xy -0.766499 -2.459237) (xy -0.702631 -2.434644) (xy -0.650687 -2.404695) (xy -0.61 -2.36894) (xy -0.586734 -2.338462)
(xy -0.571351 -2.305815) (xy -0.566979 -2.27513) (xy -0.573643 -2.248524) (xy -0.585478 -2.232905)
(xy -0.603357 -2.216335) (xy -0.83718 -2.216295) (xy -0.907675 -2.216156) (xy -0.966339 -2.215678)
(xy -1.014854 -2.214732) (xy -1.054903 -2.213188) (xy -1.088167 -2.210917) (xy -1.116329 -2.20779)
(xy -1.14107 -2.203676) (xy -1.164073 -2.198448) (xy -1.18702 -2.191975) (xy -1.198053 -2.188533)
(xy -1.223677 -2.179377) (xy -1.237393 -2.171822) (xy -1.240594 -2.165075) (xy -1.240379 -2.164386)
(xy -1.237686 -2.156187) (xy -1.231391 -2.136392) (xy -1.221902 -2.106309) (xy -1.20963 -2.067245)
(xy -1.194986 -2.020509) (xy -1.17838 -1.967408) (xy -1.160222 -1.909251) (xy -1.141579 -1.849452)
(xy -1.1211 -1.783741) (xy -1.100781 -1.71858) (xy -1.081197 -1.655811) (xy -1.062921 -1.597275)
(xy -1.04653 -1.544812) (xy -1.032598 -1.500265) (xy -1.0217 -1.465473) (xy -1.016123 -1.447713)
(xy -0.985827 -1.351424) (xy 0.375504 -1.351424) (xy 1.736836 -1.351424) (xy 1.732916 -1.367043)
(xy 1.730216 -1.376861) (xy 1.724199 -1.398154) (xy 1.715298 -1.429413) (xy 1.703943 -1.469128) (xy 1.690567 -1.51579)
(xy 1.675601 -1.567889) (xy 1.659477 -1.623918) (xy 1.656101 -1.635638) (xy 1.583206 -1.888614) (xy 1.495009 -1.890495)
(xy 1.406813 -1.892376) (xy 1.402936 -1.937795) (xy 1.400993 -1.963366) (xy 1.398721 -1.997592) (xy 1.396428 -2.035627)
(xy 1.394754 -2.066183) (xy 1.390449 -2.149153) (xy 1.930087 -2.147269) (xy 2.469725 -2.145385) (xy 2.516143 -2.126802)
(xy 2.588695 -2.09091) (xy 2.655752 -2.044242) (xy 2.715918 -1.988429) (xy 2.767799 -1.9251) (xy 2.809999 -1.855887)
(xy 2.841123 -1.782421) (xy 2.855381 -1.730249) (xy 2.862032 -1.684465) (xy 2.864846 -1.631602) (xy 2.863903 -1.576756)
(xy 2.859282 -1.525021) (xy 2.851558 -1.483402) (xy 2.826133 -1.40872) (xy 2.789833 -1.338315) (xy 2.744074 -1.273724)
(xy 2.690267 -1.216486) (xy 2.629828 -1.168137) (xy 2.564169 -1.130216) (xy 2.505894 -1.107507) (xy 2.479578 -1.100205)
(xy 2.460571 -1.097441) (xy 2.44361 -1.098795) (xy 2.431566 -1.101586) (xy 2.393085 -1.1179) (xy 2.363178 -1.142788)
(xy 2.342708 -1.174082) (xy 2.332536 -1.209614) (xy 2.333525 -1.247217) (xy 2.346538 -1.284723) (xy 2.353816 -1.297009)
(xy 2.365369 -1.311754) (xy 2.380357 -1.324643) (xy 2.401807 -1.337826) (xy 2.432748 -1.353451) (xy 2.434601 -1.354336)
(xy 2.492595 -1.388297) (xy 2.53938 -1.429253) (xy 2.574623 -1.476623) (xy 2.597991 -1.529823) (xy 2.609153 -1.588268)
(xy 2.607777 -1.651377) (xy 2.607038 -1.657183) (xy 2.593091 -1.711526) (xy 2.567474 -1.761351) (xy 2.53169 -1.805153)
(xy 2.487244 -1.841426) (xy 2.435638 -1.868666) (xy 2.379271 -1.8852) (xy 2.363993 -1.886792) (xy 2.33698 -1.888248)
(xy 2.300011 -1.889525) (xy 2.254866 -1.89058) (xy 2.203323 -1.891371) (xy 2.147163 -1.891855) (xy 2.096625 -1.891993)
(xy 1.850376 -1.891993) (xy 1.854637 -1.873411) (xy 1.857095 -1.864283) (xy 1.863007 -1.843122) (xy 1.872102 -1.810881)
(xy 1.884106 -1.768518) (xy 1.898747 -1.716989) (xy 1.915754 -1.657248) (xy 1.934855 -1.590253) (xy 1.955777 -1.516959)
(xy 1.978248 -1.438323) (xy 2.001996 -1.355299) (xy 2.026321 -1.270338) (xy 2.055177 -1.169909) (xy 2.081942 -1.077379)
(xy 2.106451 -0.993299) (xy 2.128537 -0.918223) (xy 2.148034 -0.852704) (xy 2.164777 -0.797294) (xy 2.1786 -0.752546)
(xy 2.189335 -0.719014) (xy 2.196819 -0.69725) (xy 2.200883 -0.687806) (xy 2.201362 -0.687437) (xy 2.273706 -0.702116)
(xy 2.337783 -0.714259) (xy 2.392006 -0.723581) (xy 2.434789 -0.729793) (xy 2.43594 -0.729935) (xy 2.472978 -0.733243)
(xy 2.519949 -0.73555) (xy 2.57331 -0.736855) (xy 2.629516 -0.737158) (xy 2.685023 -0.73646) (xy 2.736289 -0.73476)
(xy 2.779768 -0.732059) (xy 2.800824 -0.729935) (xy 2.948694 -0.705076) (xy 3.091983 -0.667646) (xy 3.230175 -0.617888)
(xy 3.362755 -0.556045) (xy 3.489207 -0.482359) (xy 3.609014 -0.397073) (xy 3.721662 -0.30043) (xy 3.729332 -0.293183)
(xy 3.830054 -0.188162) (xy 3.920721 -0.07448) (xy 4.000775 0.046907) (xy 4.069656 0.175044) (xy 4.126806 0.308974)
(xy 4.171665 0.447743) (xy 4.178965 0.475408) (xy 4.196108 0.547976) (xy 4.208837 0.614925) (xy 4.217663 0.68048)
(xy 4.223095 0.748868) (xy 4.225644 0.824317) (xy 4.225995 0.86491) (xy 4.225429 0.93443) (xy 4.22316 0.994615)
(xy 4.218808 1.04958) (xy 4.211991 1.103438) (xy 4.202328 1.160304) (xy 4.195376 1.195766) (xy 4.160224 1.335099)
(xy 4.112648 1.470037) (xy 4.053239 1.599822) (xy 3.982589 1.723694) (xy 3.901289 1.840894) (xy 3.809931 1.950663)
(xy 3.709106 2.052242) (xy 3.599406 2.144871) (xy 3.481422 2.227792) (xy 3.355747 2.300245) (xy 3.321122 2.317647)
(xy 3.203756 2.36957) (xy 3.084881 2.411233) (xy 2.960944 2.443751) (xy 2.854881 2.464075) (xy 2.810883 2.469535)
(xy 2.756757 2.473524) (xy 2.69569 2.476042) (xy 2.630865 2.477088) (xy 2.56547 2.47666) (xy 2.50269 2.474759)
(xy 2.445709 2.471383) (xy 2.397713 2.466531) (xy 2.381883 2.4642) (xy 2.231865 2.432992) (xy 2.088486 2.390067)
(xy 1.951843 2.335475) (xy 1.822037 2.269265) (xy 1.699164 2.191488) (xy 1.583326 2.102193) (xy 1.486775 2.01362)
(xy 1.385438 1.903759) (xy 1.295637 1.786909) (xy 1.217512 1.663352) (xy 1.151207 1.53337) (xy 1.096866 1.397245)
(xy 1.054629 1.255259) (xy 1.024641 1.107693) (xy 1.023137 1.098031) (xy 1.017196 1.047086) (xy 1.013092 0.986386)
(xy 1.010828 0.919566) (xy 1.01055 0.87309) (xy 1.263636 0.87309) (xy 1.270393 1.005475) (xy 1.290169 1.135844)
(xy 1.322511 1.263253) (xy 1.366967 1.386757) (xy 1.423084 1.505411) (xy 1.490409 1.618272) (xy 1.56849 1.724393)
(xy 1.656873 1.822832) (xy 1.755106 1.912643) (xy 1.766207 1.921723) (xy 1.874983 2.001369) (xy 1.989895 2.069161)
(xy 2.111439 2.125345) (xy 2.240112 2.170169) (xy 2.29841 2.186177) (xy 2.379918 2.203005) (xy 2.469789 2.214852)
(xy 2.563735 2.221483) (xy 2.657466 2.222663) (xy 2.746692 2.218156) (xy 2.79161 2.213259) (xy 2.924232 2.18896)
(xy 3.052276 2.152287) (xy 3.175031 2.103795) (xy 3.291784 2.044036) (xy 3.401823 1.973564) (xy 3.504435 1.892931)
(xy 3.598908 1.80269) (xy 3.68453 1.703395) (xy 3.760588 1.595599) (xy 3.826369 1.479854) (xy 3.875106 1.372073)
(xy 3.918608 1.246096) (xy 3.949085 1.118464) (xy 3.966797 0.990007) (xy 3.972003 0.861559) (xy 3.964962 0.733949)
(xy 3.945933 0.608009) (xy 3.915174 0.484571) (xy 3.872946 0.364466) (xy 3.819507 0.248525) (xy 3.755117 0.13758)
(xy 3.680033 0.032463) (xy 3.594516 -0.065996) (xy 3.498825 -0.156965) (xy 3.393218 -0.239612) (xy 3.367279 -0.257542)
(xy 3.258642 -0.322901) (xy 3.142666 -0.377792) (xy 3.021093 -0.421755) (xy 2.895663 -0.454331) (xy 2.768116 -0.475061)
(xy 2.640194 -0.483486) (xy 2.52404 -0.480003) (xy 2.49193 -0.476924) (xy 2.454985 -0.472454) (xy 2.415657 -0.466998)
(xy 2.376398 -0.460959) (xy 2.339661 -0.454741) (xy 2.307899 -0.448748) (xy 2.283563 -0.443386) (xy 2.269107 -0.439056)
(xy 2.266501 -0.437576) (xy 2.267524 -0.430475) (xy 2.272041 -0.411786) (xy 2.279656 -0.382863) (xy 2.289975 -0.345059)
(xy 2.302606 -0.299729) (xy 2.317153 -0.248227) (xy 2.333222 -0.191908) (xy 2.35042 -0.132127) (xy 2.368351 -0.070236)
(xy 2.386623 -0.007591) (xy 2.404841 0.054454) (xy 2.422611 0.114544) (xy 2.439538 0.171326) (xy 2.455229 0.223446)
(xy 2.46929 0.269548) (xy 2.481326 0.308278) (xy 2.490943 0.338283) (xy 2.497747 0.358208) (xy 2.49919 0.362039)
(xy 2.547855 0.474119) (xy 2.601919 0.576188) (xy 2.660897 0.667509) (xy 2.724305 0.747346) (xy 2.79166 0.814963)
(xy 2.803775 0.825449) (xy 2.840511 0.856512) (xy 2.769989 0.96114) (xy 2.699467 1.065767) (xy 2.672029 1.04698)
(xy 2.62696 1.011877) (xy 2.578645 0.966639) (xy 2.529163 0.913553) (xy 2.480591 0.854906) (xy 2.435008 0.792985)
(xy 2.417502 0.766932) (xy 2.394919 0.729907) (xy 2.369082 0.683564) (xy 2.341634 0.63118) (xy 2.314217 0.576035)
(xy 2.288474 0.521406) (xy 2.266049 0.470571) (xy 2.253286 0.439212) (xy 2.246667 0.420409) (xy 2.23685 0.390063)
(xy 2.224278 0.349646) (xy 2.209391 0.300629) (xy 2.192631 0.244486) (xy 2.174439 0.182687) (xy 2.155257 0.116706)
(xy 2.135525 0.048013) (xy 2.126665 0.016892) (xy 2.107628 -0.050086) (xy 2.08968 -0.113076) (xy 2.073163 -0.170896)
(xy 2.058416 -0.222361) (xy 2.04578 -0.266287) (xy 2.035594 -0.301491) (xy 2.0282 -0.326789) (xy 2.023937 -0.340998)
(xy 2.023017 -0.343718) (xy 2.016648 -0.341811) (xy 2.001269 -0.334614) (xy 1.97965 -0.323462) (xy 1.968342 -0.317356)
(xy 1.854719 -0.247619) (xy 1.749521 -0.167777) (xy 1.653245 -0.078665) (xy 1.566384 0.018879) (xy 1.489436 0.124017)
(xy 1.422895 0.235913) (xy 1.367257 0.353731) (xy 1.323017 0.476632) (xy 1.290671 0.603779) (xy 1.270715 0.734337)
(xy 1.263643 0.867467) (xy 1.263636 0.87309) (xy 1.01055 0.87309) (xy 1.010413 0.850263) (xy 1.011851 0.782111)
(xy 1.015148 0.718746) (xy 1.020311 0.663802) (xy 1.022403 0.648288) (xy 1.048276 0.510902) (xy 1.084697 0.37983)
(xy 1.132677 0.251813) (xy 1.172076 0.165549) (xy 1.243079 0.0354) (xy 1.324662 -0.086415) (xy 1.416558 -0.199623)
(xy 1.518497 -0.303949) (xy 1.630213 -0.39912) (xy 1.751437 -0.484863) (xy 1.881902 -0.560902) (xy 1.883603 -0.561797)
(xy 1.915443 -0.579301) (xy 1.935839 -0.592488) (xy 1.945866 -0.602125) (xy 1.947264 -0.607325) (xy 1.944428 -0.618927)
(xy 1.938623 -0.640729) (xy 1.930537 -0.670298) (xy 1.920855 -0.705201) (xy 1.910264 -0.743006) (xy 1.89945 -0.781278)
(xy 1.889099 -0.817584) (xy 1.879898 -0.849492) (xy 1.872532 -0.874569) (xy 1.867688 -0.89038) (xy 1.86635 -0.894237)
(xy 1.863872 -0.893812) (xy 1.857493 -0.889432) (xy 1.84696 -0.880851) (xy 1.83202 -0.867824) (xy 1.81242 -0.850107)
(xy 1.787907 -0.827455) (xy 1.758228 -0.799621) (xy 1.723132 -0.766362) (xy 1.682364 -0.727432) (xy 1.635672 -0.682587)
(xy 1.582803 -0.631581) (xy 1.523504 -0.574168) (xy 1.457523 -0.510106) (xy 1.384607 -0.439147) (xy 1.304502 -0.361047)
(xy 1.216956 -0.275562) (xy 1.121716 -0.182445) (xy 1.018529 -0.081453) (xy 0.907142 0.027661) (xy 0.787304 0.14514)
(xy 0.658759 0.27123) (xy 0.521257 0.406177) (xy 0.374543 0.550224) (xy 0.281068 0.642028) (xy 0.24793 0.674576)
(xy 0.26873 0.737647) (xy 0.292122 0.829094) (xy 0.302573 0.920667) (xy 0.300542 1.011251) (xy 0.286488 1.099733)
(xy 0.26087 1.184999) (xy 0.224147 1.265934) (xy 0.176779 1.341424) (xy 0.119224 1.410355) (xy 0.051942 1.471613)
(xy -0.024609 1.524083) (xy -0.064193 1.54566) (xy -0.138405 1.576583) (xy -0.219271 1.598874) (xy -0.302332 1.61159)
(xy -0.383126 1.613787) (xy -0.385508 1.613679) (xy -0.446168 1.610779) (xy -0.459039 1.655097) (xy -0.467876 1.685884)
(xy -0.477866 1.721219) (xy -0.485447 1.748403) (xy -0.498986 1.797392) (xy -0.418421 1.797392) (xy -0.337856 1.797392)
(xy -0.337856 1.885235) (xy -0.337856 1.973077) (xy -0.594627 1.973077) (xy -0.851397 1.973077) (xy -0.851397 1.885235)
(xy -0.851397 1.797392) (xy -0.764491 1.797392) (xy -0.677585 1.797392) (xy -0.649162 1.695367) (xy -0.639593 1.66046)
(xy -0.631674 1.630494) (xy -0.625975 1.607711) (xy -0.623063 1.594351) (xy -0.622887 1.591793) (xy -0.629841 1.59055)
(xy -0.648661 1.587706) (xy -0.677819 1.583478) (xy -0.715788 1.578084) (xy -0.761042 1.57174) (xy -0.812054 1.564664)
(xy -0.861533 1.557861) (xy -0.917441 1.550194) (xy -0.96986 1.542982) (xy -1.017093 1.536462) (xy -1.057443 1.530867)
(xy -1.089213 1.526434) (xy -1.110707 1.523397) (xy -1.119556 1.522101) (xy -1.130904 1.520996) (xy -1.138985 1.523636)
(xy -1.14625 1.532457) (xy -1.155151 1.549897) (xy -1.161546 1.563859) (xy -1.181686 1.604506) (xy -1.208177 1.652388)
(xy -1.238976 1.704148) (xy -1.272041 1.756428) (xy -1.305327 1.805872) (xy -1.328361 1.837935) (xy -1.360233 1.877911)
(xy -1.400131 1.923414) (xy -1.445511 1.971893) (xy -1.493827 2.020795) (xy -1.542533 2.06757) (xy -1.589084 2.109665)
(xy -1.630934 2.144529) (xy -1.644912 2.15523) (xy -1.770195 2.240127) (xy -1.900471 2.312521) (xy -2.035543 2.372329)
(xy -2.175217 2.419468) (xy -2.319295 2.453854) (xy -2.371748 2.463024) (xy -2.415333 2.468366) (xy -2.468992 2.472506)
(xy -2.529331 2.47539) (xy -2.592959 2.47697) (xy -2.656484 2.477192) (xy -2.716514 2.476006) (xy -2.769656 2.47336)
(xy -2.809219 2.469635) (xy -2.953542 2.444591) (xy -3.094656 2.406665) (xy -3.231651 2.356296) (xy -3.363613 2.293921)
(xy -3.48963 2.219975) (xy -3.60879 2.134897) (xy -3.720179 2.039123) (xy -3.732485 2.02741) (xy -3.8331 1.921343)
(xy -3.923057 1.807151) (xy -4.002078 1.685359) (xy -4.069887 1.556492) (xy -4.12621 1.421074) (xy -4.170768 1.279631)
(xy -4.203287 1.132688) (xy -4.203441 1.131816) (xy -4.210565 1.081124) (xy -4.216149 1.020754) (xy -4.220071 0.95447)
(xy -4.22221 0.886036) (xy -4.222385 0.836225) (xy -3.96565 0.836225) (xy -3.964796 0.898095) (xy -3.964438 0.91221)
(xy -3.962708 0.965694) (xy -3.960509 1.008971) (xy -3.957522 1.045344) (xy -3.953429 1.07812) (xy -3.947913 1.110604)
(xy -3.94298 1.135195) (xy -3.908255 1.269324) (xy -3.861851 1.396656) (xy -3.803745 1.517233) (xy -3.733915 1.631097)
(xy -3.652339 1.73829) (xy -3.567032 1.830914) (xy -3.466461 1.921634) (xy -3.358533 2.001094) (xy -3.243654 2.069095)
(xy -3.122232 2.125438) (xy -2.994674 2.169924) (xy -2.861386 2.202354) (xy -2.779901 2.215796) (xy -2.7442 2.219059)
(xy -2.698252 2.220832) (xy -2.645231 2.22121) (xy -2.588311 2.220289) (xy -2.530665 2.218164) (xy -2.475468 2.21493)
(xy -2.425894 2.210685) (xy -2.385116 2.205522) (xy -2.373734 2.203558) (xy -2.240804 2.171714) (xy -2.113263 2.127664)
(xy -1.991744 2.071853) (xy -1.87688 2.004727) (xy -1.769305 1.926729) (xy -1.669652 1.838304) (xy -1.578556 1.739897)
(xy -1.496649 1.631953) (xy -1.445945 1.55235) (xy -1.430546 1.525492) (xy -1.418709 1.503253) (xy -1.41159 1.48793)
(xy -1.410347 1.481818) (xy -1.41037 1.48181) (xy -1.417675 1.480682) (xy -1.437432 1.477824) (xy -1.46871 1.473365)
(xy -1.510577 1.467437) (xy -1.562098 1.460172) (xy -1.622343 1.4517) (xy -1.690378 1.442153) (xy -1.765272 1.431661)
(xy -1.846091 1.420356) (xy -1.931904 1.408369) (xy -2.021777 1.39583) (xy -2.047407 1.392258) (xy -2.079472 1.387772)
(xy -1.086308 1.387772) (xy -1.086095 1.389262) (xy -1.078857 1.391067) (xy -1.060324 1.39446) (xy -1.032575 1.399094)
(xy -0.997688 1.404624) (xy -0.957744 1.410703) (xy -0.952148 1.411537) (xy -0.911783 1.417557) (xy -0.876278 1.422898)
(xy -0.847689 1.427247) (xy -0.828072 1.430289) (xy -0.819481 1.431713) (xy -0.819276 1.431765) (xy -0.822574 1.427286)
(xy -0.832836 1.414609) (xy -0.848315 1.395872) (xy -0.861248 1.380381) (xy -0.884997 1.350034) (xy -0.909619 1.315315)
(xy -0.930752 1.282454) (xy -0.935722 1.273957) (xy -0.950194 1.245773) (xy -0.965158 1.212152) (xy -0.979429 1.176318)
(xy -0.991821 1.141493) (xy -1.001149 1.110901) (xy -1.006228 1.087764) (xy -1.006811 1.080659) (xy -1.009425 1.071366)
(xy -1.013568 1.071002) (xy -1.018701 1.080269) (xy -1.020325 1.092513) (xy -1.021939 1.10988) (xy -1.026347 1.137273)
(xy -1.032897 1.171652) (xy -1.04094 1.209973) (xy -1.049822 1.249195) (xy -1.058895 1.286278) (xy -1.067505 1.318179)
(xy -1.071409 1.331157) (xy -1.078994 1.356424) (xy -1.084223 1.376337) (xy -1.086308 1.387772) (xy -2.079472 1.387772)
(xy -2.13927 1.379406) (xy -2.228043 1.366895) (xy -2.312719 1.35487) (xy -2.392286 1.34348) (xy -2.465735 1.332873)
(xy -2.532057 1.323195) (xy -2.590242 1.314594) (xy -2.63928 1.307218) (xy -2.678162 1.301214) (xy -2.705878 1.296729)
(xy -2.721419 1.293912) (xy -2.722981 1.293561) (xy -2.791867 1.270194) (xy -2.854333 1.235926) (xy -2.883156 1.21309)
(xy -2.337875 1.21309) (xy -2.337225 1.216718) (xy -2.329117 1.217722) (xy -2.308732 1.220482) (xy -2.277173 1.224842)
(xy -2.23554 1.23065) (xy -2.184935 1.237748) (xy -2.126461 1.245984) (xy -2.061218 1.255201) (xy -1.990309 1.265245)
(xy -1.914835 1.275962) (xy -1.861586 1.283538) (xy -1.783165 1.294665) (xy -1.708197 1.305229) (xy -1.637828 1.315072)
(xy -1.573208 1.324037) (xy -1.515484 1.331968) (xy -1.465805 1.338706) (xy -1.425318 1.344095) (xy -1.395171 1.347978)
(xy -1.376513 1.350197) (xy -1.371112 1.350672) (xy -1.346879 1.351423) (xy -1.32243 1.272027) (xy -1.295532 1.174241)
(xy -1.276845 1.081439) (xy -1.27343 1.059177) (xy -1.268804 1.027081) (xy -1.311803 1.026928) (xy -1.326247 1.02674)
(xy -1.352876 1.026252) (xy -1.390368 1.025493) (xy -1.437396 1.024492) (xy -1.492637 1.023279) (xy -1.554767 1.021881)
(xy -1.622461 1.020329) (xy -1.694396 1.018652) (xy -1.766986 1.016932) (xy -1.840607 1.015175) (xy -1.910363 1.013515)
(xy -1.975058 1.011979) (xy -2.033492 1.010595) (xy -2.084467 1.009391) (xy -2.126785 1.008397) (xy -2.159248 1.00764)
(xy -2.180656 1.007148) (xy -2.189812 1.006951) (xy -2.189926 1.006949) (xy -2.199435 1.013231) (xy -2.207873 1.030929)
(xy -2.208692 1.033547) (xy -2.21922 1.058379) (xy -2.236732 1.089097) (xy -2.258686 1.122007) (xy -2.282539 1.153409)
(xy -2.305748 1.179608) (xy -2.315519 1.188902) (xy -2.330168 1.203045) (xy -2.337875 1.21309) (xy -2.883156 1.21309)
(xy -2.909604 1.192136) (xy -2.956905 1.1402) (xy -2.995459 1.081498) (xy -3.024492 1.017406) (xy -3.043228 0.949304)
(xy -3.050188 0.88506) (xy -2.918397 0.88506) (xy -2.910627 0.941027) (xy -2.892005 0.995482) (xy -2.862167 1.04687)
(xy -2.820751 1.093636) (xy -2.819391 1.094892) (xy -2.769816 1.131928) (xy -2.714744 1.158025) (xy -2.656366 1.172612)
(xy -2.596875 1.175119) (xy -2.544055 1.166539) (xy -2.484727 1.144092) (xy -2.431035 1.110667) (xy -2.401862 1.085105)
(xy -2.382946 1.06455) (xy -2.366089 1.043351) (xy -2.353155 1.024224) (xy -2.346003 1.009884) (xy -2.345911 1.003437)
(xy -2.35293 1.002761) (xy -2.37193 1.001778) (xy -2.401384 1.000545) (xy -2.439762 0.999117) (xy -2.485537 0.997553)
(xy -2.537181 0.995909) (xy -2.590399 0.994322) (xy -2.646226 0.992644) (xy -2.697652 0.990974) (xy -2.743148 0.98937)
(xy -2.781181 0.987891) (xy -2.810223 0.986597) (xy -2.828741 0.985548) (xy -2.835192 0.984831) (xy -2.831946 0.978982)
(xy -2.821624 0.963376) (xy -2.805062 0.939211) (xy -2.791667 0.919986) (xy -0.854867 0.919986) (xy -0.8542 0.997004)
(xy -0.841729 1.072293) (xy -0.817774 1.144634) (xy -0.782657 1.212805) (xy -0.736698 1.275586) (xy -0.680216 1.331756)
(xy -0.613534 1.380094) (xy -0.599723 1.3883) (xy -0.580088 1.398564) (xy -0.569057 1.401378) (xy -0.564481 1.397659)
(xy -0.561973 1.389316) (xy -0.556194 1.369448) (xy -0.547565 1.33953) (xy -0.536511 1.301036) (xy -0.523455 1.25544)
(xy -0.50882 1.204217) (xy -0.493029 1.148841) (xy -0.490343 1.139409) (xy -0.474142 1.083077) (xy -0.458674 1.030337)
(xy -0.444412 0.982725) (xy -0.431827 0.941776) (xy -0.421394 0.909026) (xy -0.413585 0.886012) (xy -0.408874 0.87427)
(xy -0.408498 0.873628) (xy -0.389378 0.855376) (xy -0.362784 0.843546) (xy -0.334039 0.840211) (xy -0.32542 0.841246)
(xy -0.30418 0.84961) (xy -0.282712 0.864829) (xy -0.279212 0.868146) (xy -0.264222 0.885952) (xy -0.257778 0.903287)
(xy -0.256771 0.918436) (xy -0.258603 0.931132) (xy -0.263821 0.955173) (xy -0.272008 0.988934) (xy -0.282747 1.030791)
(xy -0.295619 1.07912) (xy -0.310208 1.132298) (xy -0.326095 1.1887) (xy -0.327531 1.193727) (xy -0.343263 1.24928)
(xy -0.357563 1.300829) (xy -0.370051 1.346917) (xy -0.380345 1.386087) (xy -0.388061 1.416879) (xy -0.392819 1.437838)
(xy -0.394236 1.447504) (xy -0.394133 1.447897) (xy -0.385416 1.450872) (xy -0.366356 1.451664) (xy -0.339908 1.450504)
(xy -0.309025 1.447623) (xy -0.276662 1.443253) (xy -0.245772 1.437624) (xy -0.2365 1.435553) (xy -0.1628 1.411378)
(xy -0.094287 1.375397) (xy -0.032078 1.328691) (xy 0.022711 1.27234) (xy 0.068964 1.207424) (xy 0.105566 1.135024)
(xy 0.122601 1.087895) (xy 0.133389 1.039121) (xy 0.138817 0.982883) (xy 0.138884 0.924115) (xy 0.133592 0.867754)
(xy 0.122939 0.818736) (xy 0.122593 0.817611) (xy 0.091281 0.73809) (xy 0.049495 0.666657) (xy -0.002186 0.603953)
(xy -0.063183 0.55062) (xy -0.132915 0.507301) (xy -0.174789 0.487973) (xy -0.248651 0.464763) (xy -0.324911 0.454084)
(xy -0.401878 0.455587) (xy -0.477862 0.468922) (xy -0.551173 0.493738) (xy -0.62012 0.529686) (xy -0.683014 0.576417)
(xy -0.705965 0.597918) (xy -0.730915 0.624373) (xy -0.754715 0.652205) (xy -0.774077 0.67744) (xy -0.782844 0.690771)
(xy -0.81951 0.765649) (xy -0.843411 0.842461) (xy -0.854867 0.919986) (xy -2.791667 0.919986) (xy -2.783097 0.907685)
(xy -2.756564 0.869998) (xy -2.7263 0.827347) (xy -2.693141 0.780931) (xy -2.685802 0.770698) (xy -2.668562 0.746661)
(xy -2.349885 0.746661) (xy -2.274663 0.748649) (xy -2.210642 0.750313) (xy -2.140631 0.75208) (xy -2.066099 0.753919)
(xy -1.988517 0.755795) (xy -1.909354 0.757676) (xy -1.830081 0.759527) (xy -1.752168 0.761316) (xy -1.677085 0.763009)
(xy -1.606302 0.764573) (xy -1.541288 0.765974) (xy -1.483514 0.76718) (xy -1.43445 0.768155) (xy -1.395566 0.768868)
(xy -1.368333 0.769285) (xy -1.363249 0.769342) (xy -1.32243 0.769455) (xy -1.293594 0.768797) (xy -1.275226 0.767256)
(xy -1.26581 0.764716) (xy -1.263705 0.761864) (xy -1.265331 0.737451) (xy -1.269282 0.705982) (xy -1.275047 0.669872)
(xy -1.282116 0.631535) (xy -1.289981 0.593386) (xy -1.29813 0.557838) (xy -1.306054 0.527307) (xy -1.313244 0.504206)
(xy -1.319189 0.490949) (xy -1.321362 0.488823) (xy -1.329272 0.488696) (xy -1.349262 0.489335) (xy -1.379924 0.49066)
(xy -1.41985 0.492588) (xy -1.467633 0.495038) (xy -1.521865 0.497929) (xy -1.581138 0.501179) (xy -1.644045 0.504707)
(xy -1.709177 0.508432) (xy -1.775127 0.512271) (xy -1.840488 0.516145) (xy -1.903851 0.51997) (xy -1.963809 0.523666)
(xy -2.018954 0.527151) (xy -2.067878 0.530344) (xy -2.109174 0.533163) (xy -2.141434 0.535527) (xy -2.16325 0.537355)
(xy -2.167306 0.537761) (xy -2.202742 0.541531) (xy -2.276313 0.644096) (xy -2.349885 0.746661) (xy -2.668562 0.746661)
(xy -2.652069 0.723666) (xy -2.620939 0.68021) (xy -2.593262 0.641522) (xy -2.569888 0.608792) (xy -2.551669 0.583213)
(xy -2.539454 0.565974) (xy -2.534094 0.558268) (xy -2.533919 0.557971) (xy -2.540075 0.557778) (xy -2.556502 0.559359)
(xy -2.580138 0.562278) (xy -2.607924 0.566096) (xy -2.636799 0.570375) (xy -2.6637 0.574679) (xy -2.685568 0.578569)
(xy -2.699342 0.581608) (xy -2.699468 0.581644) (xy -2.757484 0.604635) (xy -2.807192 0.637003) (xy -2.848229 0.677193)
(xy -2.880232 0.723649) (xy -2.902836 0.774816) (xy -2.915679 0.829138) (xy -2.918397 0.88506) (xy -3.050188 0.88506)
(xy -3.050891 0.878569) (xy -3.046706 0.80658) (xy -3.032616 0.743314) (xy -3.005297 0.676122) (xy -2.966532 0.613925)
(xy -2.917967 0.558354) (xy -2.861246 0.511041) (xy -2.801079 0.475431) (xy -1.051608 0.475431) (xy -1.051354 0.477193)
(xy -1.046955 0.492878) (xy -1.041365 0.519009) (xy -1.035084 0.552623) (xy -1.028612 0.590757) (xy -1.022452 0.63045)
(xy -1.017102 0.66874) (xy -1.013064 0.702663) (xy -1.012781 0.705409) (xy -1.009206 0.736103) (xy -1.005407 0.761163)
(xy -1.001844 0.777948) (xy -0.999064 0.783825) (xy -0.994021 0.778301) (xy -0.993297 0.773126) (xy -0.990246 0.758128)
(xy -0.981957 0.734268) (xy -0.969726 0.704512) (xy -0.954848 0.671827) (xy -0.938619 0.639181) (xy -0.922336 0.609541)
(xy -0.920515 0.606454) (xy -0.900892 0.576579) (xy -0.876001 0.543036) (xy -0.850223 0.511622) (xy -0.841642 0.50203)
(xy -0.794365 0.450722) (xy -0.84822 0.455025) (xy -0.878738 0.457303) (xy -0.916838 0.459912) (xy -0.956606 0.462458)
(xy -0.978439 0.463768) (xy -1.012642 0.46611) (xy -1.035075 0.46862) (xy -1.047483 0.47162) (xy -1.051608 0.475431)
(xy -2.801079 0.475431) (xy -2.798011 0.473615) (xy -2.736633 0.449658) (xy -2.716551 0.445314) (xy -2.685459 0.440712)
(xy -2.645848 0.436148) (xy -2.60021 0.431918) (xy -2.565042 0.429248) (xy -2.523788 0.426118) (xy -2.487244 0.42281)
(xy -2.457516 0.419558) (xy -2.436711 0.416597) (xy -2.426934 0.414162) (xy -2.426521 0.413818) (xy -2.421954 0.407389)
(xy -2.411964 0.393435) (xy -2.093872 0.393435) (xy -2.089073 0.396961) (xy -2.071104 0.397652) (xy -2.046572 0.3961)
(xy -2.029536 0.394769) (xy -2.000632 0.392679) (xy -1.961479 0.389941) (xy -1.913693 0.386664) (xy -1.858894 0.38296)
(xy -1.798698 0.378938) (xy -1.734726 0.374709) (xy -1.682818 0.371309) (xy -1.619086 0.3671) (xy -1.55958 0.363071)
(xy -1.505639 0.359318) (xy -1.458601 0.35594) (xy -1.419804 0.353034) (xy -1.390587 0.350699) (xy -1.372287 0.349032)
(xy -1.366245 0.348172) (xy -1.367685 0.340947) (xy -1.374712 0.324229) (xy -1.386165 0.300237) (xy -1.400885 0.271188)
(xy -1.417713 0.239301) (xy -1.435487 0.206791) (xy -1.453049 0.175878) (xy -1.469239 0.148779) (xy -1.47673 0.136929)
(xy -1.498232 0.10497) (xy -1.522471 0.070735) (xy -1.545319 0.040007) (xy -1.552813 0.030407) (xy -1.572996 0.006065)
(xy -1.596698 -0.020918) (xy -1.62213 -0.048695) (xy -1.647505 -0.075414) (xy -1.671035 -0.099227)
(xy -1.690933 -0.118285) (xy -1.70541 -0.130736) (xy -1.712463 -0.134766) (xy -1.717375 -0.129412)
(xy -1.729172 -0.114339) (xy -1.746914 -0.090848) (xy -1.769663 -0.060238) (xy -1.79648 -0.023809)
(xy -1.826426 0.017138) (xy -1.858562 0.061302) (xy -1.891949 0.107384) (xy -1.925648 0.154084) (xy -1.95872 0.200101)
(xy -1.990227 0.244134) (xy -2.019229 0.284884) (xy -2.044788 0.32105) (xy -2.065965 0.351333) (xy -2.08182 0.374431)
(xy -2.091415 0.389044) (xy -2.093872 0.393435) (xy -2.411964 0.393435) (xy -2.410175 0.390936) (xy -2.391865 0.365409)
(xy -2.367705 0.331755) (xy -2.338376 0.290922) (xy -2.304557 0.243857) (xy -2.266931 0.191508) (xy -2.226177 0.134823)
(xy -2.182977 0.074749) (xy -2.174103 0.062411) (xy -2.13058 0.001795) (xy -2.089484 -0.055641) (xy -2.051484 -0.10895)
(xy -2.017249 -0.157184) (xy -1.987447 -0.199395) (xy -1.962747 -0.234636) (xy -1.943817 -0.261959)
(xy -1.931326 -0.280417) (xy -1.925944 -0.28906) (xy -1.925779 -0.289534) (xy -1.931673 -0.296373)
(xy -1.947985 -0.30735) (xy -1.972659 -0.321401) (xy -2.00364 -0.337461) (xy -2.032059 -0.351179)
(xy -1.562582 -0.351179) (xy -1.485721 -0.275132) (xy -1.388005 -0.169885) (xy -1.300336 -0.057745)
(xy -1.223615 0.059941) (xy -1.158749 0.181829) (xy -1.121761 0.266706) (xy -1.111669 0.291789) (xy -1.103296 0.312006)
(xy -1.098004 0.324092) (xy -1.097111 0.325831) (xy -1.094186 0.328172) (xy -1.087817 0.329752) (xy -1.076587 0.330538)
(xy -1.05908 0.330495) (xy -1.033881 0.329592) (xy -0.999573 0.327795) (xy -0.954739 0.32507) (xy -0.897963 0.321384)
(xy -0.892591 0.321028) (xy -0.848953 0.318066) (xy -0.810142 0.315293) (xy -0.778082 0.312858) (xy -0.754697 0.31091)
(xy -0.741912 0.309597) (xy -0.740095 0.309226) (xy -0.741903 0.302666) (xy -0.747468 0.284084) (xy -0.756517 0.254357)
(xy -0.768781 0.214361) (xy -0.783987 0.164976) (xy -0.801865 0.107077) (xy -0.822144 0.041544) (xy -0.844552 -0.030748)
(xy -0.868818 -0.10892) (xy -0.894672 -0.192094) (xy -0.921842 -0.279395) (xy -0.935099 -0.321953)
(xy -1.131217 -0.951355) (xy -1.168907 -0.899687) (xy -1.180821 -0.883256) (xy -1.199582 -0.857254)
(xy -1.224169 -0.823102) (xy -1.253565 -0.782216) (xy -1.286748 -0.736017) (xy -1.322699 -0.685923)
(xy -1.360399 -0.633352) (xy -1.38459 -0.599599) (xy -1.562582 -0.351179) (xy -2.032059 -0.351179)
(xy -2.038873 -0.354468) (xy -2.076303 -0.371357) (xy -2.113873 -0.387065) (xy -2.115398 -0.387673)
(xy -2.241754 -0.430732) (xy -2.371531 -0.460982) (xy -2.503633 -0.478354) (xy -2.636964 -0.482776)
(xy -2.770428 -0.474177) (xy -2.902928 -0.452486) (xy -2.949482 -0.441636) (xy -3.074092 -0.40339)
(xy -3.194556 -0.352752) (xy -3.309839 -0.290479) (xy -3.418912 -0.217329) (xy -3.520741 -0.134058)
(xy -3.614295 -0.041426) (xy -3.698542 0.059812) (xy -3.765334 0.157303) (xy -3.816212 0.247591)
(xy -3.861496 0.344623) (xy -3.899528 0.444305) (xy -3.928653 0.542541) (xy -3.938458 0.585408) (xy -3.949088 0.640303)
(xy -3.956823 0.689072) (xy -3.961962 0.735474) (xy -3.964805 0.783272) (xy -3.96565 0.836225) (xy -4.222385 0.836225)
(xy -4.222445 0.819212) (xy -4.220655 0.757763) (xy -4.217062 0.708693) (xy -4.196596 0.572047) (xy -4.163876 0.436204)
(xy -4.119623 0.302886) (xy -4.064558 0.173817) (xy -3.999403 0.050722) (xy -3.924879 -0.064675)
(xy -3.856119 -0.153741) (xy -3.824139 -0.190039) (xy -3.785172 -0.23138) (xy -3.742387 -0.274627)
(xy -3.698952 -0.316641) (xy -3.658036 -0.354284) (xy -3.625193 -0.382478) (xy -3.518293 -0.461693)
(xy -3.40199 -0.532857) (xy -3.278464 -0.594882) (xy -3.149895 -0.64668) (xy -3.018461 -0.687166)
(xy -3.010296 -0.689272) (xy -2.917678 -0.710301) (xy -2.828314 -0.724896) (xy -2.737305 -0.733646)
(xy -2.639752 -0.737144) (xy -2.612201 -0.737265) (xy -2.463018 -0.730628) (xy -2.31779 -0.711184)
(xy -2.176778 -0.679004) (xy -2.040239 -0.634155) (xy -1.908434 -0.576707) (xy -1.805439 -0.521058)
(xy -1.770481 -0.500446) (xy -1.744702 -0.535712) (xy -1.731923 -0.553318) (xy -1.712979 -0.57959)
(xy -1.688687 -0.613386) (xy -1.659862 -0.653564) (xy -1.627319 -0.698981) (xy -1.591873 -0.748496)
(xy -1.554341 -0.800967) (xy -1.515538 -0.855251) (xy -1.476279 -0.910207) (xy -1.437381 -0.964692)
(xy -1.399657 -1.017564) (xy -1.363925 -1.067682) (xy -1.346451 -1.092212) (xy -0.903391 -1.092212)
(xy -0.901761 -1.085561) (xy -0.896363 -1.066849) (xy -0.887453 -1.036912) (xy -0.875289 -0.996591)
(xy -0.860126 -0.946723) (xy -0.842223 -0.888148) (xy -0.821836 -0.821703) (xy -0.799222 -0.748228)
(xy -0.774637 -0.668561) (xy -0.748339 -0.583541) (xy -0.720584 -0.494007) (xy -0.691629 -0.400797)
(xy -0.691122 -0.399165) (xy -0.476377 0.291406) (xy -0.357347 0.29267) (xy -0.238316 0.293934) (xy -0.211376 0.202713)
(xy -0.184436 0.111492) (xy -0.254389 0.109574) (xy -0.324342 0.107656) (xy -0.324342 0.013285) (xy -0.324342 -0.081086)
(xy -0.067572 -0.081086) (xy 0.189199 -0.081086) (xy 0.189199 0.013514) (xy 0.189199 0.108113) (xy 0.0922 0.108113)
(xy -0.0048 0.108113) (xy -0.039564 0.225627) (xy -0.050688 0.263565) (xy -0.060338 0.297114) (xy -0.067902 0.324093)
(xy -0.072765 0.342318) (xy -0.074329 0.349479) (xy -0.068714 0.355636) (xy -0.05428 0.364698) (xy -0.04137 0.371254)
(xy -0.020657 0.382734) (xy 0.005692 0.399811) (xy 0.032975 0.419382) (xy 0.041405 0.425877) (xy 0.063476 0.44278)
(xy 0.081556 0.45577) (xy 0.093076 0.463045) (xy 0.095668 0.463962) (xy 0.100897 0.459188) (xy 0.115259 0.445439)
(xy 0.138248 0.42321) (xy 0.169355 0.392999) (xy 0.208073 0.3553) (xy 0.253896 0.310611) (xy 0.306316 0.259425)
(xy 0.364825 0.20224) (xy 0.428916 0.13955) (xy 0.498082 0.071853) (xy 0.571815 -0.000357) (xy 0.649609 -0.076583)
(xy 0.730955 -0.15633) (xy 0.815347 -0.239102) (xy 0.891889 -0.314206) (xy 1.683663 -1.091275) (xy 0.391374 -1.092981)
(xy 0.260243 -1.093142) (xy 0.132745 -1.093273) (xy 0.009538 -1.093375) (xy -0.108723 -1.093448)
(xy -0.221382 -1.093493) (xy -0.327784 -1.093509) (xy -0.427272 -1.093499) (xy -0.51919 -1.093461)
(xy -0.602884 -1.093397) (xy -0.677697 -1.093306) (xy -0.742972 -1.093189) (xy -0.798056 -1.093046)
(xy -0.84229 -1.092879) (xy -0.875021 -1.092686) (xy -0.895591 -1.092469) (xy -0.903346 -1.092228)
(xy -0.903391 -1.092212) (xy -1.346451 -1.092212) (xy -1.330999 -1.113903) (xy -1.301696 -1.155086)
(xy -1.27683 -1.190088) (xy -1.257217 -1.217767) (xy -1.243674 -1.236981) (xy -1.237014 -1.246589)
(xy -1.236569 -1.247275) (xy -1.235157 -1.25143) (xy -1.23496 -1.258231) (xy -1.236243 -1.26863)
(xy -1.23927 -1.28358) (xy -1.244308 -1.304032) (xy -1.25162 -1.330938) (xy -1.261473 -1.365249)
(xy -1.274131 -1.407918) (xy -1.289859 -1.459897) (xy -1.308923 -1.522136) (xy -1.331588 -1.595588)
(xy -1.351372 -1.659459) (xy -1.37325 -1.729928) (xy -1.393968 -1.796502) (xy -1.413176 -1.858071)
(xy -1.430527 -1.913524) (xy -1.44567 -1.96175) (xy -1.458257 -2.001638) (xy -1.467939 -2.032078)
(xy -1.474368 -2.051959) (xy -1.477194 -2.060169) (xy -1.477273 -2.060316) (xy -1.484271 -2.059402)
(xy -1.500456 -2.054421) (xy -1.522499 -2.04641) (xy -1.525377 -2.045296) (xy -1.599276 -2.020681)
(xy -1.669119 -2.006636) (xy -1.738587 -2.002648) (xy -1.801115 -2.006905) (xy -1.881194 -2.021169)
(xy -1.953319 -2.043625) (xy -2.016632 -2.073779) (xy -2.070278 -2.111134) (xy -2.113399 -2.155195)
(xy -2.145138 -2.205465) (xy -2.145492 -2.206199) (xy -2.155286 -2.228431) (xy -2.161199 -2.24823)
(xy -2.164198 -2.270559) (xy -2.165247 -2.300382) (xy -2.16531 -2.307994) (xy -2.165099 -2.338263)
(xy -2.163518 -2.359024) (xy -2.159759 -2.374275) (xy -2.153017 -2.38801) (xy -2.147348 -2.396968)
(xy -2.12372 -2.422021) (xy -2.089214 -2.443782) (xy -2.046309 -2.461025) (xy -1.997483 -2.472525)
(xy -1.99335 -2.473167) (xy -1.97715 -2.474708) (xy -1.950546 -2.476013) (xy -1.913172 -2.477083)
(xy -1.864663 -2.477924) (xy -1.804653 -2.478537) (xy -1.732777 -2.478926) (xy -1.64867 -2.479094)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "d76f8ff3-0bf0-4f98-b776-87fd70f2a0de")
)
(embedded_fonts no)
)

View file

@ -1,351 +0,0 @@
(footprint "apple-bicycle-10mm-silkscreen"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(property "Reference" "G***"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "8a193dd3-b124-4a53-9aa5-e591a8ea3c82")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Value" "LOGO"
(at 0.75 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "dd6af5f9-6e77-4ce0-9c75-7159e3656f85")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "72b58864-183e-4095-b8e1-d920c0ca69de")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "e4a03b0d-4e57-4dd8-9a56-14a93ebcf376")
(effects
(font
(size 1.27 1.27)
)
)
)
(attr board_only exclude_from_pos_files exclude_from_bom)
(duplicate_pad_numbers_are_jumpers no)
(fp_poly
(pts
(xy -3.104755 -4.959409) (xy -2.885362 -4.958882) (xy -2.764396 -4.958455) (xy -1.642416 -4.954117)
(xy -1.533404 -4.919782) (xy -1.405635 -4.870584) (xy -1.30172 -4.810669) (xy -1.220323 -4.73914)
(xy -1.173779 -4.678168) (xy -1.143006 -4.612856) (xy -1.13426 -4.55147) (xy -1.147591 -4.498244)
(xy -1.171266 -4.466998) (xy -1.207035 -4.433849) (xy -1.674805 -4.43377) (xy -1.815832 -4.433492)
(xy -1.933191 -4.432536) (xy -2.030247 -4.430643) (xy -2.110366 -4.427554) (xy -2.176912 -4.423011)
(xy -2.233251 -4.416754) (xy -2.282747 -4.408526) (xy -2.328765 -4.398066) (xy -2.374671 -4.385116)
(xy -2.396744 -4.37823) (xy -2.448005 -4.359913) (xy -2.475445 -4.3448) (xy -2.481848 -4.331303)
(xy -2.481417 -4.329923) (xy -2.476031 -4.313522) (xy -2.463436 -4.273921) (xy -2.444453 -4.213739)
(xy -2.419903 -4.13559) (xy -2.390607 -4.042093) (xy -2.357386 -3.935863) (xy -2.32106 -3.819517)
(xy -2.283764 -3.699887) (xy -2.242796 -3.56843) (xy -2.202148 -3.438075) (xy -2.162968 -3.312503)
(xy -2.126407 -3.1954) (xy -2.093616 -3.090447) (xy -2.065745 -3.001328) (xy -2.043943 -2.931726)
(xy -2.032785 -2.896196) (xy -1.972179 -2.703567) (xy 0.751209 -2.703567) (xy 3.474597 -2.703567)
(xy 3.466755 -2.734813) (xy 3.461353 -2.754455) (xy 3.449317 -2.797053) (xy 3.431509 -2.859587) (xy 3.408794 -2.939038)
(xy 3.382035 -3.032386) (xy 3.352096 -3.136613) (xy 3.319839 -3.248699) (xy 3.313084 -3.272147) (xy 3.167255 -3.778234)
(xy 2.990815 -3.781997) (xy 2.814375 -3.785759) (xy 2.806619 -3.876621) (xy 2.802732 -3.927777) (xy 2.798187 -3.996247)
(xy 2.793601 -4.072337) (xy 2.790251 -4.133467) (xy 2.781638 -4.299449) (xy 3.861202 -4.29568) (xy 4.940766 -4.291911)
(xy 5.033626 -4.254736) (xy 5.178769 -4.182933) (xy 5.312919 -4.089572) (xy 5.433283 -3.977915) (xy 5.537072 -3.851224)
(xy 5.621495 -3.712762) (xy 5.68376 -3.56579) (xy 5.712282 -3.461419) (xy 5.725587 -3.369827) (xy 5.731218 -3.264073)
(xy 5.729331 -3.154351) (xy 5.720086 -3.050853) (xy 5.704634 -2.967594) (xy 5.65377 -2.818189) (xy 5.581152 -2.677342)
(xy 5.489609 -2.548126) (xy 5.381967 -2.433619) (xy 5.261056 -2.336897) (xy 5.129704 -2.261034) (xy 5.013123 -2.215604)
(xy 4.960476 -2.200996) (xy 4.922451 -2.195466) (xy 4.888522 -2.198176) (xy 4.864427 -2.203758) (xy 4.787445 -2.236396)
(xy 4.727615 -2.286185) (xy 4.686663 -2.348789) (xy 4.666314 -2.419872) (xy 4.668294 -2.495097) (xy 4.694326 -2.57013)
(xy 4.708885 -2.594708) (xy 4.731997 -2.624205) (xy 4.761981 -2.649991) (xy 4.804893 -2.676363) (xy 4.866792 -2.707622)
(xy 4.870498 -2.709392) (xy 4.986518 -2.777332) (xy 5.080112 -2.859267) (xy 5.150616 -2.954032) (xy 5.197365 -3.060459)
(xy 5.219696 -3.177382) (xy 5.216942 -3.303632) (xy 5.215464 -3.315248) (xy 5.187563 -3.423962) (xy 5.136315 -3.523639)
(xy 5.064729 -3.611266) (xy 4.975812 -3.683832) (xy 4.872573 -3.738326) (xy 4.75981 -3.771404) (xy 4.729245 -3.774588)
(xy 4.675205 -3.777501) (xy 4.601247 -3.780055) (xy 4.510933 -3.782167) (xy 4.40782 -3.783749) (xy 4.295469 -3.784717)
(xy 4.194367 -3.784993) (xy 3.701737 -3.784993) (xy 3.710262 -3.747819) (xy 3.71518 -3.729559) (xy 3.727007 -3.687224)
(xy 3.7452 -3.622726) (xy 3.769215 -3.537978) (xy 3.798506 -3.434891) (xy 3.832529 -3.315379) (xy 3.870741 -3.181353)
(xy 3.912596 -3.034726) (xy 3.95755 -2.877411) (xy 4.005059 -2.711319) (xy 4.053722 -2.541353) (xy 4.111449 -2.340442)
(xy 4.164993 -2.155331) (xy 4.214023 -1.987126) (xy 4.258207 -1.836934) (xy 4.297212 -1.705861) (xy 4.330707 -1.595012)
(xy 4.358359 -1.505493) (xy 4.379837 -1.43841) (xy 4.394807 -1.39487) (xy 4.402939 -1.375978) (xy 4.403895 -1.375241)
(xy 4.548622 -1.404605) (xy 4.676811 -1.428899) (xy 4.785286 -1.447547) (xy 4.870875 -1.459974) (xy 4.873177 -1.460259)
(xy 4.947273 -1.466877) (xy 5.04124 -1.471491) (xy 5.14799 -1.474102) (xy 5.260432 -1.474708) (xy 5.371477 -1.473312)
(xy 5.474035 -1.469912) (xy 5.561016 -1.464508) (xy 5.60314 -1.460259) (xy 5.898958 -1.410527) (xy 6.185612 -1.335648)
(xy 6.46207 -1.236105) (xy 6.7273 -1.112386) (xy 6.980271 -0.964975) (xy 7.21995 -0.794358) (xy 7.445305 -0.60102)
(xy 7.46065 -0.586522) (xy 7.662147 -0.376424) (xy 7.843529 -0.148999) (xy 8.003679 0.093839) (xy 8.141479 0.35018)
(xy 8.255809 0.618113) (xy 8.345552 0.895724) (xy 8.360154 0.951069) (xy 8.39445 1.096244) (xy 8.419916 1.230176)
(xy 8.437571 1.361322) (xy 8.448438 1.498136) (xy 8.453538 1.649073) (xy 8.454239 1.730281) (xy 8.453108 1.869358)
(xy 8.448569 1.98976) (xy 8.439862 2.099718) (xy 8.426224 2.207463) (xy 8.406893 2.321226) (xy 8.392985 2.392167)
(xy 8.322663 2.670908) (xy 8.227486 2.940857) (xy 8.108637 3.200496) (xy 7.967299 3.448306) (xy 7.804655 3.682768)
(xy 7.62189 3.902365) (xy 7.420187 4.105576) (xy 7.200728 4.290884) (xy 6.964699 4.45677) (xy 6.713281 4.601715)
(xy 6.644013 4.636527) (xy 6.409217 4.740402) (xy 6.171404 4.823749) (xy 5.923464 4.888802) (xy 5.711282 4.929462)
(xy 5.623263 4.940384) (xy 5.514983 4.948365) (xy 5.392815 4.953402) (xy 5.263132 4.955494) (xy 5.132307 4.954639)
(xy 5.006712 4.950835) (xy 4.89272 4.944081) (xy 4.796704 4.934375) (xy 4.765034 4.929712) (xy 4.464919 4.867279)
(xy 4.178084 4.781406) (xy 3.904726 4.672193) (xy 3.645044 4.539739) (xy 3.399234 4.384143) (xy 3.167495 4.205505)
(xy 2.974341 4.028312) (xy 2.771615 3.808531) (xy 2.591964 3.574768) (xy 2.435673 3.327588) (xy 2.303028 3.067555)
(xy 2.194316 2.795233) (xy 2.109821 2.511185) (xy 2.049829 2.215976) (xy 2.046819 2.196646) (xy 2.034935 2.094728)
(xy 2.026723 1.973296) (xy 2.022196 1.839622) (xy 2.021638 1.746646) (xy 2.527945 1.746646) (xy 2.541463 2.011485)
(xy 2.581025 2.272292) (xy 2.645727 2.527178) (xy 2.734663 2.774251) (xy 2.846927 3.011624) (xy 2.981612 3.237405)
(xy 3.137815 3.449705) (xy 3.314628 3.646634) (xy 3.511146 3.826303) (xy 3.533356 3.84447) (xy 3.750965 4.003804)
(xy 3.98085 4.139423) (xy 4.224002 4.251822) (xy 4.481417 4.341493) (xy 4.598045 4.373518) (xy 4.761103 4.407182)
(xy 4.940894 4.430883) (xy 5.128836 4.444149) (xy 5.316347 4.446509) (xy 5.494847 4.437493) (xy 5.584706 4.427696)
(xy 5.85002 4.379084) (xy 6.106178 4.30572) (xy 6.351753 4.20871) (xy 6.585321 4.08916) (xy 6.805458 3.948178)
(xy 7.010737 3.786869) (xy 7.199733 3.606339) (xy 7.371022 3.407697) (xy 7.523177 3.192047) (xy 7.654775 2.960496)
(xy 7.752275 2.744876) (xy 7.839302 2.492855) (xy 7.900273 2.237523) (xy 7.935707 1.980542) (xy 7.946121 1.723576)
(xy 7.932035 1.468288) (xy 7.893966 1.216341) (xy 7.832433 0.969399) (xy 7.747954 0.729125) (xy 7.641048 0.497182)
(xy 7.512232 0.275234) (xy 7.362026 0.064943) (xy 7.190947 -0.132027) (xy 6.999513 -0.314014) (xy 6.788243 -0.479352)
(xy 6.736351 -0.515221) (xy 6.519019 -0.645974) (xy 6.287006 -0.755784) (xy 6.043795 -0.843734) (xy 5.792867 -0.908904)
(xy 5.537706 -0.950375) (xy 5.281794 -0.96723) (xy 5.049423 -0.960262) (xy 4.985188 -0.954102) (xy 4.911278 -0.94516)
(xy 4.832601 -0.934244) (xy 4.754062 -0.922162) (xy 4.680569 -0.909723) (xy 4.617027 -0.897736) (xy 4.568343 -0.887007)
(xy 4.539423 -0.878347) (xy 4.534209 -0.875384) (xy 4.536256 -0.86118) (xy 4.545291 -0.823792) (xy 4.560525 -0.765929)
(xy 4.581171 -0.690301) (xy 4.606438 -0.599617) (xy 4.63554 -0.496587) (xy 4.667687 -0.383919) (xy 4.702091 -0.264324)
(xy 4.737964 -0.14051) (xy 4.774517 -0.015187) (xy 4.810963 0.108936) (xy 4.846511 0.22915) (xy 4.880375 0.342744)
(xy 4.911766 0.44701) (xy 4.939894 0.539239) (xy 4.963973 0.616721) (xy 4.983212 0.676746) (xy 4.996825 0.716606)
(xy 4.99971 0.72427) (xy 5.097067 0.94849) (xy 5.205223 1.152683) (xy 5.323211 1.335374) (xy 5.450062 1.49509)
(xy 5.584807 1.630359) (xy 5.609043 1.651337) (xy 5.682534 1.71348) (xy 5.541453 1.922791) (xy 5.400372 2.132102)
(xy 5.345482 2.094518) (xy 5.25532 2.024292) (xy 5.158664 1.933792) (xy 5.059672 1.827592) (xy 4.962503 1.710268)
(xy 4.871313 1.586392) (xy 4.836292 1.534273) (xy 4.791113 1.460202) (xy 4.739425 1.367491) (xy 4.684514 1.262696)
(xy 4.629666 1.152377) (xy 4.578168 1.043089) (xy 4.533304 0.941393) (xy 4.507773 0.878658) (xy 4.49453 0.841042)
(xy 4.474892 0.780334) (xy 4.44974 0.699478) (xy 4.419958 0.601419) (xy 4.386429 0.489102) (xy 4.350036 0.365472)
(xy 4.311661 0.233473) (xy 4.272188 0.096051) (xy 4.254463 0.033794) (xy 4.216378 -0.100198) (xy 4.180473 -0.226213)
(xy 4.147429 -0.341883) (xy 4.117928 -0.444839) (xy 4.092649 -0.532715) (xy 4.072273 -0.603142) (xy 4.05748 -0.653752)
(xy 4.048953 -0.682177) (xy 4.047112 -0.687618) (xy 4.034371 -0.683804) (xy 4.003605 -0.669406) (xy 3.960354 -0.647097)
(xy 3.937733 -0.63488) (xy 3.710426 -0.49537) (xy 3.499975 -0.335642) (xy 3.30737 -0.157372) (xy 3.133603 0.037767)
(xy 2.979665 0.2481) (xy 2.846547 0.471953) (xy 2.735242 0.70765) (xy 2.646739 0.953517) (xy 2.58203 1.20788)
(xy 2.542107 1.469064) (xy 2.52796 1.735395) (xy 2.527945 1.746646) (xy 2.021638 1.746646) (xy 2.021364 1.700979)
(xy 2.024241 1.564639) (xy 2.030838 1.437874) (xy 2.041166 1.327957) (xy 2.045351 1.296921) (xy 2.097111 1.022075)
(xy 2.169972 0.759862) (xy 2.265957 0.50376) (xy 2.344776 0.331186) (xy 2.486821 0.070818) (xy 2.650031 -0.172877)
(xy 2.83387 -0.399352) (xy 3.037803 -0.60806) (xy 3.261294 -0.798453) (xy 3.503807 -0.969983) (xy 3.764806 -1.122103)
(xy 3.768208 -1.123892) (xy 3.831907 -1.15891) (xy 3.87271 -1.18529) (xy 3.892769 -1.204571) (xy 3.895566 -1.214974)
(xy 3.889891 -1.238183) (xy 3.878279 -1.281798) (xy 3.862102 -1.340952) (xy 3.842733 -1.410778) (xy 3.821546 -1.486406)
(xy 3.799912 -1.562971) (xy 3.779205 -1.635604) (xy 3.760797 -1.699437) (xy 3.746061 -1.749603) (xy 3.73637 -1.781234)
(xy 3.733695 -1.78895) (xy 3.728738 -1.7881) (xy 3.715976 -1.779337) (xy 3.694904 -1.762171) (xy 3.665015 -1.736111)
(xy 3.625804 -1.700667) (xy 3.576766 -1.65535) (xy 3.517393 -1.599668) (xy 3.447181 -1.533132) (xy 3.365624 -1.455252)
(xy 3.272215 -1.365537) (xy 3.166449 -1.263497) (xy 3.04782 -1.148642) (xy 2.915823 -1.020482) (xy 2.769951 -0.878527)
(xy 2.609698 -0.722286) (xy 2.43456 -0.55127) (xy 2.244029 -0.364987) (xy 2.037601 -0.162949) (xy 1.814769 0.055336)
(xy 1.575027 0.290357) (xy 1.31787 0.542605) (xy 1.042792 0.81257) (xy 0.749287 1.100742) (xy 0.562286 1.284398)
(xy 0.495993 1.349512) (xy 0.537605 1.475687) (xy 0.584401 1.658629) (xy 0.605308 1.841823) (xy 0.601245 2.023041)
(xy 0.573129 2.200052) (xy 0.52188 2.370629) (xy 0.448415 2.532542) (xy 0.353653 2.683563) (xy 0.238513 2.821461)
(xy 0.103912 2.944009) (xy -0.04923 3.048977) (xy -0.128419 3.092144) (xy -0.276882 3.154004) (xy -0.438658 3.198599)
(xy -0.604823 3.224038) (xy -0.766454 3.228434) (xy -0.771221 3.228217) (xy -0.892572 3.222415) (xy -0.91832 3.311074)
(xy -0.935999 3.372666) (xy -0.955986 3.443355) (xy -0.971152 3.497737) (xy -0.998236 3.595742) (xy -0.837064 3.595742)
(xy -0.675892 3.595742) (xy -0.675892 3.771473) (xy -0.675892 3.947205) (xy -1.189569 3.947205) (xy -1.703247 3.947205)
(xy -1.703247 3.771473) (xy -1.703247 3.595742) (xy -1.529388 3.595742) (xy -1.355529 3.595742) (xy -1.298669 3.391637)
(xy -1.279525 3.321804) (xy -1.263684 3.261856) (xy -1.252282 3.216277) (xy -1.246456 3.189551) (xy -1.246104 3.184434)
(xy -1.260017 3.181946) (xy -1.297666 3.176257) (xy -1.355997 3.167799) (xy -1.431956 3.157008) (xy -1.522488 3.144317)
(xy -1.62454 3.13016) (xy -1.723523 3.116551) (xy -1.83537 3.101212) (xy -1.940236 3.086785) (xy -2.034726 3.073741)
(xy -2.115447 3.062549) (xy -2.179005 3.05368) (xy -2.222005 3.047605) (xy -2.239708 3.045012) (xy -2.262408 3.042802)
(xy -2.278574 3.048082) (xy -2.293109 3.06573) (xy -2.310915 3.100619) (xy -2.32371 3.12855) (xy -2.364 3.209867)
(xy -2.416996 3.305656) (xy -2.478611 3.409202) (xy -2.544758 3.51379) (xy -2.611349 3.612705) (xy -2.657429 3.676848)
(xy -2.721189 3.756822) (xy -2.801006 3.847853) (xy -2.89179 3.944835) (xy -2.988448 4.042666) (xy -3.085886 4.136239)
(xy -3.179013 4.220452) (xy -3.262735 4.290199) (xy -3.290699 4.311607) (xy -3.541331 4.481446) (xy -3.801952 4.626273)
(xy -4.072169 4.745921) (xy -4.35159 4.840223) (xy -4.639824 4.909015) (xy -4.744758 4.927358) (xy -4.831952 4.938046)
(xy -4.939297 4.946327) (xy -5.060007 4.952098) (xy -5.187297 4.955258) (xy -5.314381 4.955702) (xy -5.434472 4.953329)
(xy -5.540785 4.948037) (xy -5.619932 4.940585) (xy -5.908654 4.890483) (xy -6.190959 4.814612) (xy -6.465021 4.713847)
(xy -6.729016 4.589062) (xy -6.981117 4.441132) (xy -7.219499 4.27093) (xy -7.442338 4.079332) (xy -7.466955 4.055898)
(xy -7.66824 3.843708) (xy -7.848201 3.615264) (xy -8.006285 3.371615) (xy -8.14194 3.113812) (xy -8.254614 2.842905)
(xy -8.343755 2.559944) (xy -8.408811 2.265978) (xy -8.409118 2.264235) (xy -8.423371 2.162823) (xy -8.434541 2.042051)
(xy -8.442387 1.909449) (xy -8.446666 1.772543) (xy -8.447016 1.672895) (xy -7.933409 1.672895) (xy -7.9317 1.796668)
(xy -7.930985 1.824906) (xy -7.927525 1.931903) (xy -7.923125 2.018478) (xy -7.91715 2.091245) (xy -7.908962 2.156814)
(xy -7.897926 2.221799) (xy -7.888057 2.270994) (xy -7.818589 2.539323) (xy -7.725756 2.794055) (xy -7.609513 3.035274)
(xy -7.469816 3.263063) (xy -7.30662 3.477505) (xy -7.135962 3.662802) (xy -6.934766 3.844291) (xy -6.718852 4.003254)
(xy -6.489034 4.139292) (xy -6.246125 4.252008) (xy -5.990941 4.341003) (xy -5.724294 4.405879) (xy -5.56128 4.432771)
(xy -5.489859 4.4393) (xy -5.397939 4.442847) (xy -5.291869 4.443603) (xy -5.177998 4.44176) (xy -5.062676 4.437508)
(xy -4.952253 4.43104) (xy -4.853078 4.422546) (xy -4.7715 4.412217) (xy -4.74873 4.408289) (xy -4.482801 4.344584)
(xy -4.227651 4.256461) (xy -3.984547 4.14481) (xy -3.754758 4.01052) (xy -3.53955 3.854483) (xy -3.340192 3.677586)
(xy -3.157951 3.48072) (xy -2.994094 3.264775) (xy -2.892658 3.105526) (xy -2.861853 3.051795) (xy -2.838172 3.007307)
(xy -2.82393 2.976652) (xy -2.821443 2.964424) (xy -2.821489 2.964409) (xy -2.836103 2.962153) (xy -2.875629 2.956434)
(xy -2.938202 2.947514) (xy -3.021956 2.935656) (xy -3.125027 2.921122) (xy -3.245549 2.904174) (xy -3.381656 2.885074)
(xy -3.531482 2.864085) (xy -3.693164 2.841469) (xy -3.864835 2.817488) (xy -4.04463 2.792404) (xy -4.095902 2.785256)
(xy -4.160051 2.776282) (xy -2.173194 2.776282) (xy -2.172767 2.779264) (xy -2.158288 2.782875) (xy -2.121212 2.789662)
(xy -2.065698 2.798933) (xy -1.995906 2.809995) (xy -1.915997 2.822157) (xy -1.904802 2.823825) (xy -1.824051 2.835869)
(xy -1.753022 2.846554) (xy -1.695829 2.855253) (xy -1.656583 2.86134) (xy -1.639398 2.864188) (xy -1.638988 2.864293)
(xy -1.645586 2.855332) (xy -1.666114 2.829971) (xy -1.697081 2.792487) (xy -1.722953 2.761497) (xy -1.770464 2.700787)
(xy -1.819721 2.631329) (xy -1.861999 2.565591) (xy -1.871942 2.548591) (xy -1.900893 2.492209) (xy -1.930829 2.42495)
(xy -1.959378 2.353262) (xy -1.984168 2.283593) (xy -2.00283 2.222393) (xy -2.01299 2.176107) (xy -2.014157 2.161892)
(xy -2.019386 2.143303) (xy -2.027674 2.142575) (xy -2.037944 2.161112) (xy -2.041192 2.185607) (xy -2.044421 2.220351)
(xy -2.053239 2.275152) (xy -2.066343 2.343927) (xy -2.082432 2.420589) (xy -2.100202 2.499055) (xy -2.118352 2.57324)
(xy -2.135578 2.637059) (xy -2.143388 2.663022) (xy -2.158561 2.71357) (xy -2.169023 2.753407) (xy -2.173194 2.776282)
(xy -4.160051 2.776282) (xy -4.279677 2.759547) (xy -4.457272 2.734517) (xy -4.626668 2.710461) (xy -4.785844 2.687676)
(xy -4.932782 2.666455) (xy -5.065461 2.647093) (xy -5.181862 2.629887) (xy -5.279965 2.615131) (xy -5.357749 2.60312)
(xy -5.413196 2.594149) (xy -5.444285 2.588513) (xy -5.44741 2.58781) (xy -5.585219 2.541064) (xy -5.710185 2.472511)
(xy -5.767847 2.426826) (xy -4.676994 2.426826) (xy -4.675693 2.434083) (xy -4.659473 2.436092) (xy -4.618693 2.441613)
(xy -4.555557 2.450337) (xy -4.472269 2.461954) (xy -4.371033 2.476155) (xy -4.254053 2.49263) (xy -4.123533 2.51107)
(xy -3.981677 2.531164) (xy -3.830689 2.552603) (xy -3.724162 2.567759) (xy -3.567279 2.590019) (xy -3.417302 2.611153)
(xy -3.276527 2.630844) (xy -3.147252 2.648779) (xy -3.031774 2.664644) (xy -2.932388 2.678124) (xy -2.851393 2.688905)
(xy -2.791084 2.696672) (xy -2.753758 2.701112) (xy -2.742953 2.702062) (xy -2.694475 2.703565) (xy -2.645563 2.54473)
(xy -2.591752 2.349107) (xy -2.554368 2.163454) (xy -2.547537 2.118919) (xy -2.538282 2.054709) (xy -2.624303 2.054403)
(xy -2.653199 2.054027) (xy -2.706472 2.053051) (xy -2.781474 2.051533) (xy -2.875556 2.04953) (xy -2.986068 2.047102)
(xy -3.110361 2.044307) (xy -3.245786 2.041202) (xy -3.389692 2.037846) (xy -3.534912 2.034405) (xy -3.682192 2.030891)
(xy -3.821742 2.027569) (xy -3.951166 2.024496) (xy -4.068065 2.021727) (xy -4.170043 2.01932) (xy -4.254702 2.017331)
(xy -4.319644 2.015816) (xy -4.362472 2.014833) (xy -4.380788 2.014437) (xy -4.381016 2.014434) (xy -4.400039 2.027001)
(xy -4.41692 2.062406) (xy -4.418559 2.067645) (xy -4.43962 2.11732) (xy -4.474653 2.178775) (xy -4.518572 2.244611)
(xy -4.566291 2.307433) (xy -4.612723 2.359843) (xy -4.632269 2.378436) (xy -4.661576 2.406731) (xy -4.676994 2.426826)
(xy -5.767847 2.426826) (xy -5.820756 2.384906) (xy -5.915382 2.281007) (xy -5.992512 2.163571) (xy -6.050593 2.035354)
(xy -6.088074 1.899114) (xy -6.101998 1.770592) (xy -5.838347 1.770592) (xy -5.822802 1.882554) (xy -5.785548 1.991493)
(xy -5.725857 2.094297) (xy -5.643003 2.187854) (xy -5.640282 2.190366) (xy -5.541105 2.264459) (xy -5.430931 2.316667)
(xy -5.314146 2.345848) (xy -5.195131 2.350863) (xy -5.089463 2.333699) (xy -4.970776 2.288793) (xy -4.863362 2.221924)
(xy -4.805002 2.170788) (xy -4.767158 2.129668) (xy -4.733437 2.087258) (xy -4.707561 2.048992) (xy -4.693253 2.020305)
(xy -4.693069 2.007408) (xy -4.707111 2.006057) (xy -4.745122 2.00409) (xy -4.804045 2.001622) (xy -4.880822 1.998766)
(xy -4.972397 1.995637) (xy -5.075712 1.992348) (xy -5.182175 1.989173) (xy -5.293859 1.985817) (xy -5.396739 1.982475)
(xy -5.487754 1.979266) (xy -5.563842 1.976308) (xy -5.62194 1.97372) (xy -5.658986 1.97162) (xy -5.671892 1.970186)
(xy -5.665398 1.958486) (xy -5.644748 1.927265) (xy -5.611616 1.878922) (xy -5.584819 1.840462) (xy -1.710189 1.840462)
(xy -1.708853 1.994538) (xy -1.683904 2.145158) (xy -1.635983 2.289878) (xy -1.56573 2.426256) (xy -1.473786 2.551851)
(xy -1.360794 2.66422) (xy -1.227394 2.760922) (xy -1.199763 2.77734) (xy -1.160484 2.797873) (xy -1.138416 2.803502)
(xy -1.129262 2.796062) (xy -1.124245 2.779371) (xy -1.112683 2.739625) (xy -1.095421 2.679773) (xy -1.073307 2.602764)
(xy -1.047188 2.511548) (xy -1.01791 2.409074) (xy -0.98632 2.298293) (xy -0.980946 2.279425) (xy -0.948536 2.166731)
(xy -0.917592 2.061223) (xy -0.889059 1.965972) (xy -0.863883 1.884053) (xy -0.843012 1.818536) (xy -0.82739 1.772496)
(xy -0.817964 1.749005) (xy -0.817213 1.747721) (xy -0.778962 1.711207) (xy -0.725759 1.68754) (xy -0.668255 1.680869)
(xy -0.651012 1.68294) (xy -0.608522 1.699672) (xy -0.565574 1.730118) (xy -0.558572 1.736754) (xy -0.528583 1.772376)
(xy -0.515693 1.807055) (xy -0.513678 1.83736) (xy -0.517343 1.86276) (xy -0.527782 1.910854) (xy -0.544161 1.978394)
(xy -0.565643 2.06213) (xy -0.591394 2.158815) (xy -0.620579 2.265199) (xy -0.652363 2.378034) (xy -0.655235 2.388089)
(xy -0.686707 2.499224) (xy -0.715316 2.60235) (xy -0.740299 2.694551) (xy -0.760891 2.772911) (xy -0.776328 2.834513)
(xy -0.785847 2.876441) (xy -0.788682 2.895779) (xy -0.788475 2.896564) (xy -0.771037 2.902516) (xy -0.732907 2.9041)
(xy -0.679996 2.901779) (xy -0.618213 2.896016) (xy -0.55347 2.887273) (xy -0.491674 2.876014) (xy -0.473124 2.871869)
(xy -0.325685 2.823507) (xy -0.188624 2.751526) (xy -0.064173 2.658089) (xy 0.045434 2.545357) (xy 0.137966 2.415491)
(xy 0.21119 2.270653) (xy 0.245267 2.17637) (xy 0.26685 2.078796) (xy 0.277708 1.966289) (xy 0.277844 1.848722)
(xy 0.267255 1.735971) (xy 0.245945 1.637908) (xy 0.245252 1.635656) (xy 0.182611 1.476574) (xy 0.099016 1.333669)
(xy -0.004373 1.208227) (xy -0.126398 1.101533) (xy -0.2659 1.014871) (xy -0.34967 0.976206) (xy -0.497434 0.929774)
(xy -0.649995 0.908411) (xy -0.80397 0.911417) (xy -0.955978 0.938093) (xy -1.102639 0.987739) (xy -1.24057 1.059655)
(xy -1.36639 1.15314) (xy -1.412306 1.196153) (xy -1.462219 1.249079) (xy -1.509832 1.304757) (xy -1.548565 1.35524)
(xy -1.566103 1.381909) (xy -1.639455 1.531705) (xy -1.68727 1.68537) (xy -1.710189 1.840462) (xy -5.584819 1.840462)
(xy -5.567674 1.815854) (xy -5.514594 1.740459) (xy -5.45405 1.655135) (xy -5.387715 1.562278) (xy -5.373033 1.541806)
(xy -5.338544 1.493719) (xy -4.70102 1.493719) (xy -4.550537 1.497697) (xy -4.42246 1.501024) (xy -4.2824 1.504561)
(xy -4.133296 1.508239) (xy -3.97809 1.511993) (xy -3.819723 1.515755) (xy -3.661136 1.519459) (xy -3.505268 1.523038)
(xy -3.355062 1.526425) (xy -3.213457 1.529554) (xy -3.083395 1.532357) (xy -2.967817 1.534767) (xy -2.869663 1.536719)
(xy -2.791875 1.538146) (xy -2.737392 1.53898) (xy -2.727222 1.539093) (xy -2.645563 1.539319) (xy -2.587877 1.538004)
(xy -2.55113 1.53492) (xy -2.532294 1.52984) (xy -2.528082 1.524134) (xy -2.531335 1.475294) (xy -2.539239 1.41234)
(xy -2.550772 1.340101) (xy -2.564914 1.263407) (xy -2.580647 1.187088) (xy -2.59695 1.115974) (xy -2.612803 1.054894)
(xy -2.627186 1.008679) (xy -2.63908 0.982159) (xy -2.643426 0.977906) (xy -2.65925 0.977652) (xy -2.699241 0.978931)
(xy -2.760581 0.98158) (xy -2.840455 0.985438) (xy -2.936046 0.990339) (xy -3.044539 0.996123) (xy -3.163117 1.002625)
(xy -3.288963 1.009683) (xy -3.419263 1.017134) (xy -3.551199 1.024816) (xy -3.681954 1.032564) (xy -3.808714 1.040216)
(xy -3.928662 1.04761) (xy -4.038981 1.054582) (xy -4.136856 1.06097) (xy -4.21947 1.06661) (xy -4.284006 1.07134)
(xy -4.32765 1.074997) (xy -4.335765 1.075808) (xy -4.406655 1.083351) (xy -4.553837 1.288535) (xy -4.70102 1.493719)
(xy -5.338544 1.493719) (xy -5.305549 1.447716) (xy -5.243271 1.360782) (xy -5.187902 1.283385) (xy -5.141143 1.217908)
(xy -5.104695 1.166736) (xy -5.080258 1.132249) (xy -5.069536 1.116832) (xy -5.069186 1.11624) (xy -5.081501 1.115853)
(xy -5.114363 1.119017) (xy -5.161649 1.124855) (xy -5.217236 1.132493) (xy -5.275 1.141054) (xy -5.328817 1.149664)
(xy -5.372565 1.157446) (xy -5.400119 1.163525) (xy -5.400373 1.163598) (xy -5.516435 1.209592) (xy -5.615878 1.274346)
(xy -5.697974 1.354747) (xy -5.761996 1.447684) (xy -5.807217 1.550045) (xy -5.832909 1.658718) (xy -5.838347 1.770592)
(xy -6.101998 1.770592) (xy -6.103405 1.757606) (xy -6.095034 1.613589) (xy -6.066846 1.487023) (xy -6.012192 1.352604)
(xy -5.934643 1.228177) (xy -5.837487 1.117006) (xy -5.724013 1.022353) (xy -5.603646 0.951114) (xy -2.103775 0.951114)
(xy -2.103266 0.95464) (xy -2.094466 0.986019) (xy -2.083283 1.038294) (xy -2.070718 1.105539) (xy -2.057772 1.181829)
(xy -2.045447 1.261236) (xy -2.034744 1.337836) (xy -2.026666 1.4057) (xy -2.0261 1.411194) (xy -2.018949 1.472598)
(xy -2.011348 1.522731) (xy -2.004221 1.55631) (xy -1.998659 1.568067) (xy -1.98857 1.557017) (xy -1.987121 1.546663)
(xy -1.981018 1.51666) (xy -1.964436 1.468926) (xy -1.939967 1.409399) (xy -1.910204 1.344012) (xy -1.877738 1.278702)
(xy -1.845161 1.219406) (xy -1.84152 1.213232) (xy -1.802262 1.153466) (xy -1.752468 1.086361) (xy -1.700898 1.023516)
(xy -1.683731 1.004327) (xy -1.589152 0.901683) (xy -1.696891 0.910293) (xy -1.757943 0.914848) (xy -1.834162 0.92007)
(xy -1.91372 0.925163) (xy -1.957397 0.927784) (xy -2.025821 0.932468) (xy -2.0707 0.93749) (xy -2.095522 0.943491)
(xy -2.103775 0.951114) (xy -5.603646 0.951114) (xy -5.597511 0.947483) (xy -5.474721 0.899555) (xy -5.434547 0.890865)
(xy -5.372346 0.881658) (xy -5.293103 0.872528) (xy -5.201803 0.864067) (xy -5.131448 0.858725) (xy -5.048918 0.852464)
(xy -4.975811 0.845846) (xy -4.91634 0.83934) (xy -4.874718 0.833417) (xy -4.855159 0.828544) (xy -4.854333 0.827857)
(xy -4.845196 0.814994) (xy -4.825211 0.78708) (xy -4.188857 0.78708) (xy -4.179257 0.794134) (xy -4.14331 0.795515)
(xy -4.094232 0.79241) (xy -4.060152 0.789748) (xy -4.002329 0.785567) (xy -3.924 0.780089) (xy -3.828403 0.773534)
(xy -3.718775 0.766124) (xy -3.598353 0.758078) (xy -3.470374 0.749617) (xy -3.366532 0.742815) (xy -3.239033 0.734396)
(xy -3.11999 0.726335) (xy -3.012079 0.718828) (xy -2.917977 0.71207) (xy -2.840363 0.706257) (xy -2.781913 0.701585)
(xy -2.745304 0.698249) (xy -2.733217 0.696529) (xy -2.736097 0.682075) (xy -2.750154 0.648631) (xy -2.773067 0.600634)
(xy -2.802515 0.542521) (xy -2.836179 0.478729) (xy -2.871738 0.413692) (xy -2.906871 0.35185) (xy -2.939258 0.297636)
(xy -2.954246 0.273931) (xy -2.99726 0.209996) (xy -3.045752 0.141508) (xy -3.091459 0.080035) (xy -3.106452 0.060829)
(xy -3.146828 0.012134) (xy -3.194244 -0.041847) (xy -3.245122 -0.097415) (xy -3.295885 -0.150868)
(xy -3.342958 -0.198507) (xy -3.382764 -0.236632) (xy -3.411726 -0.261542) (xy -3.425836 -0.269603)
(xy -3.435663 -0.258893) (xy -3.459263 -0.22874) (xy -3.494757 -0.181744) (xy -3.540268 -0.120507)
(xy -3.593916 -0.047631) (xy -3.653823 0.034284) (xy -3.718112 0.122637) (xy -3.784904 0.214826)
(xy -3.85232 0.30825) (xy -3.918482 0.400308) (xy -3.981512 0.488398) (xy -4.039532 0.56992) (xy -4.090664 0.642272)
(xy -4.133028 0.702852) (xy -4.164747 0.749061) (xy -4.183942 0.778296) (xy -4.188857 0.78708) (xy -4.825211 0.78708)
(xy -4.821632 0.782081) (xy -4.785003 0.731013) (xy -4.73667 0.663687) (xy -4.677995 0.581999) (xy -4.61034 0.487844)
(xy -4.535067 0.383118) (xy -4.453538 0.269717) (xy -4.367114 0.149537) (xy -4.349361 0.124855) (xy -4.262293 0.003591)
(xy -4.18008 -0.111312) (xy -4.10406 -0.217958) (xy -4.035571 -0.314452) (xy -3.975951 -0.398897)
(xy -3.926537 -0.469398) (xy -3.888668 -0.524058) (xy -3.86368 -0.560982) (xy -3.852911 -0.578275)
(xy -3.852581 -0.579222) (xy -3.864373 -0.592904) (xy -3.897005 -0.614864) (xy -3.946367 -0.642973)
(xy -4.008346 -0.675102) (xy -4.065197 -0.702544) (xy -3.125995 -0.702544) (xy -2.972231 -0.55041)
(xy -2.776749 -0.339861) (xy -2.601363 -0.115521) (xy -2.447881 0.119915) (xy -2.318114 0.363756)
(xy -2.244118 0.533554) (xy -2.223928 0.583733) (xy -2.207179 0.624178) (xy -2.196592 0.648357) (xy -2.194805 0.651835)
(xy -2.188953 0.656519) (xy -2.176211 0.65968) (xy -2.153746 0.661251) (xy -2.118724 0.661167) (xy -2.068312 0.65936)
(xy -1.999676 0.655764) (xy -1.909985 0.650312) (xy -1.796402 0.642938) (xy -1.785657 0.642227) (xy -1.698357 0.636301)
(xy -1.620714 0.630754) (xy -1.556577 0.625882) (xy -1.509795 0.621985) (xy -1.484217 0.61936) (xy -1.480582 0.618616)
(xy -1.4842 0.605494) (xy -1.495332 0.56832) (xy -1.513436 0.508849) (xy -1.53797 0.428837) (xy -1.56839 0.33004)
(xy -1.604156 0.214212) (xy -1.644724 0.08311) (xy -1.689552 -0.061512) (xy -1.738098 -0.217897)
(xy -1.789819 -0.384291) (xy -1.844174 -0.558938) (xy -1.870695 -0.644078) (xy -2.263035 -1.903216)
(xy -2.338435 -1.799852) (xy -2.362269 -1.766981) (xy -2.399801 -1.714965) (xy -2.448989 -1.646641)
(xy -2.507796 -1.564849) (xy -2.57418 -1.472426) (xy -2.646102 -1.372211) (xy -2.721522 -1.267041)
(xy -2.769915 -1.199516) (xy -3.125995 -0.702544) (xy -4.065197 -0.702544) (xy -4.078831 -0.709125)
(xy -4.15371 -0.742912) (xy -4.22887 -0.774336) (xy -4.231921 -0.775553) (xy -4.484701 -0.861693)
(xy -4.744324 -0.92221) (xy -5.008598 -0.956962) (xy -5.27533 -0.965809) (xy -5.542329 -0.948606)
(xy -5.8074 -0.905214) (xy -5.900532 -0.883506) (xy -6.14982 -0.806995) (xy -6.39081 -0.705692) (xy -6.621439 -0.581113)
(xy -6.839642 -0.434773) (xy -7.043355 -0.268188) (xy -7.230512 -0.082873) (xy -7.399051 0.119656)
(xy -7.53267 0.31469) (xy -7.634455 0.495313) (xy -7.725046 0.68943) (xy -7.801131 0.888847) (xy -7.859397 1.085372)
(xy -7.879012 1.171128) (xy -7.900277 1.280947) (xy -7.915751 1.37851) (xy -7.926032 1.47134) (xy -7.931719 1.56696)
(xy -7.933409 1.672895) (xy -8.447016 1.672895) (xy -8.447136 1.638861) (xy -8.443555 1.51593) (xy -8.436367 1.417763)
(xy -8.395425 1.144399) (xy -8.329968 0.872639) (xy -8.241438 0.605932) (xy -8.131278 0.347727) (xy -8.000934 0.101471)
(xy -7.851846 -0.129385) (xy -7.71429 -0.307564) (xy -7.650312 -0.380178) (xy -7.572358 -0.462883)
(xy -7.486765 -0.5494) (xy -7.399872 -0.633451) (xy -7.318018 -0.708757) (xy -7.252315 -0.76516)
(xy -7.038458 -0.923632) (xy -6.80579 -1.065997) (xy -6.558673 -1.19008) (xy -6.301465 -1.293705)
(xy -6.038527 -1.374698) (xy -6.022193 -1.37891) (xy -5.836908 -1.42098) (xy -5.658133 -1.450177)
(xy -5.476066 -1.467683) (xy -5.280908 -1.47468) (xy -5.225791 -1.474922) (xy -4.927346 -1.461645)
(xy -4.636814 -1.422747) (xy -4.354713 -1.358368) (xy -4.081563 -1.268647) (xy -3.817882 -1.153722)
(xy -3.611838 -1.042394) (xy -3.541904 -1.001159) (xy -3.490331 -1.071708) (xy -3.464766 -1.10693)
(xy -3.42687 -1.159489) (xy -3.378272 -1.227099) (xy -3.320606 -1.307475) (xy -3.255502 -1.398334)
(xy -3.184593 -1.497391) (xy -3.109509 -1.60236) (xy -3.031882 -1.710957) (xy -2.953343 -1.820897)
(xy -2.875525 -1.929897) (xy -2.800059 -2.03567) (xy -2.728575 -2.135933) (xy -2.693618 -2.185005)
(xy -1.807261 -2.185005) (xy -1.804001 -2.1717) (xy -1.793201 -2.134265) (xy -1.775377 -2.074376)
(xy -1.751042 -1.993712) (xy -1.72071 -1.89395) (xy -1.684894 -1.776768) (xy -1.644109 -1.643843)
(xy -1.598868 -1.496854) (xy -1.549685 -1.337478) (xy -1.497075 -1.167393) (xy -1.441551 -0.988277)
(xy -1.383626 -0.801806) (xy -1.382611 -0.798542) (xy -0.953007 0.582967) (xy -0.714882 0.585496)
(xy -0.476758 0.588025) (xy -0.422864 0.405534) (xy -0.36897 0.223043) (xy -0.508913 0.219206) (xy -0.648856 0.21537)
(xy -0.648856 0.026577) (xy -0.648856 -0.162215) (xy -0.135178 -0.162215) (xy 0.378499 -0.162215)
(xy 0.378499 0.027035) (xy 0.378499 0.216284) (xy 0.184449 0.216284) (xy -0.009601 0.216284) (xy -0.079149 0.451375)
(xy -0.101403 0.52727) (xy -0.120708 0.594387) (xy -0.135838 0.648359) (xy -0.145568 0.684818) (xy -0.148696 0.699144)
(xy -0.137464 0.711462) (xy -0.108588 0.72959) (xy -0.082761 0.742705) (xy -0.041324 0.765672) (xy 0.011389 0.799836)
(xy 0.065969 0.838988) (xy 0.082832 0.851981) (xy 0.126988 0.885796) (xy 0.163155 0.911782) (xy 0.186202 0.926336)
(xy 0.191388 0.928172) (xy 0.201848 0.91862) (xy 0.23058 0.891114) (xy 0.27657 0.846646) (xy 0.3388 0.786207)
(xy 0.416258 0.71079) (xy 0.507928 0.621386) (xy 0.612795 0.518988) (xy 0.729844 0.404587) (xy 0.858061 0.279175)
(xy 0.996429 0.143744) (xy 1.143935 -0.000713) (xy 1.299564 -0.153206) (xy 1.462301 -0.312743) (xy 1.63113 -0.47833)
(xy 1.784254 -0.62858) (xy 3.368223 -2.18313) (xy 0.782957 -2.186544) (xy 0.520624 -2.186865) (xy 0.265562 -2.187127)
(xy 0.019082 -2.187331) (xy -0.217503 -2.187477) (xy -0.442881 -2.187567) (xy -0.655741 -2.187601)
(xy -0.85477 -2.18758) (xy -1.038656 -2.187504) (xy -1.206088 -2.187375) (xy -1.355753 -2.187193)
(xy -1.48634 -2.186959) (xy -1.596535 -2.186674) (xy -1.685028 -2.186339) (xy -1.750507 -2.185954)
(xy -1.791659 -2.18552) (xy -1.807172 -2.185038) (xy -1.807261 -2.185005) (xy -2.693618 -2.185005)
(xy -2.662706 -2.2284) (xy -2.604084 -2.310787) (xy -2.554339 -2.380809) (xy -2.515103 -2.436182)
(xy -2.488008 -2.474621) (xy -2.474685 -2.493841) (xy -2.473795 -2.495213) (xy -2.470971 -2.503525)
(xy -2.470576 -2.517131) (xy -2.473142 -2.537936) (xy -2.479199 -2.567844) (xy -2.489277 -2.608758)
(xy -2.503905 -2.662584) (xy -2.523616 -2.731226) (xy -2.548939 -2.816586) (xy -2.580404 -2.92057)
(xy -2.618542 -3.045082) (xy -2.663883 -3.192026) (xy -2.703462 -3.319801) (xy -2.74723 -3.460776)
(xy -2.788677 -3.59396) (xy -2.827104 -3.71713) (xy -2.861814 -3.828066) (xy -2.892108 -3.924544)
(xy -2.917289 -4.004342) (xy -2.936659 -4.065238) (xy -2.94952 -4.105009) (xy -2.955173 -4.121434)
(xy -2.955332 -4.121728) (xy -2.969332 -4.119901) (xy -3.001709 -4.109935) (xy -3.045807 -4.09391)
(xy -3.051566 -4.091681) (xy -3.199402 -4.042438) (xy -3.339126 -4.01434) (xy -3.478099 -4.006362)
(xy -3.603188 -4.014878) (xy -3.763389 -4.043413) (xy -3.907676 -4.088338) (xy -4.034337 -4.148662)
(xy -4.141657 -4.223392) (xy -4.227921 -4.311536) (xy -4.291416 -4.412103) (xy -4.292125 -4.413572)
(xy -4.311719 -4.458048) (xy -4.323548 -4.497656) (xy -4.329546 -4.542326) (xy -4.331646 -4.601989)
(xy -4.331772 -4.617217) (xy -4.33135 -4.67777) (xy -4.328186 -4.719304) (xy -4.320667 -4.749813)
(xy -4.307179 -4.777291) (xy -4.295837 -4.795212) (xy -4.248569 -4.84533) (xy -4.179539 -4.888864)
(xy -4.093706 -4.923361) (xy -3.996027 -4.946367) (xy -3.98776 -4.947651) (xy -3.955352 -4.950734)
(xy -3.90213 -4.953343) (xy -3.827362 -4.955485) (xy -3.730318 -4.957166) (xy -3.610266 -4.958392)
(xy -3.466476 -4.959171) (xy -3.298216 -4.959507)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "0868d6bd-3ab0-4269-afee-424fe0d52dab")
)
(embedded_fonts no)
)

View file

@ -1,269 +0,0 @@
(footprint "apple-trafficlight-04mm-silkscreen"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(property "Reference" "G***"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "1a631dd4-564c-4a45-bbbf-69d23a1fd312")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Value" "LOGO"
(at 0.75 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "ccb90540-f565-4817-8982-09f3cc5d4fa1")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "eba9b9d1-69bc-40db-8b5b-f4def09af8ae")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "ba5491b1-b35b-4178-97bc-edded9dfb49f")
(effects
(font
(size 1.27 1.27)
)
)
)
(attr board_only exclude_from_pos_files exclude_from_bom)
(duplicate_pad_numbers_are_jumpers no)
(fp_poly
(pts
(xy 0.922378 0.944294) (xy 1.128436 0.945307) (xy 1.136221 0.955735) (xy 1.144007 0.966164) (xy 1.024218 1.356924)
(xy 1.001748 1.430055) (xy 0.981459 1.495743) (xy 0.963353 1.55398) (xy 0.947431 1.604758) (xy 0.933698 1.64807)
(xy 0.922154 1.683908) (xy 0.912802 1.712264) (xy 0.905645 1.733132) (xy 0.900686 1.746503) (xy 0.897926 1.752371)
(xy 0.897698 1.752605) (xy 0.892831 1.754364) (xy 0.883195 1.755696) (xy 0.868104 1.756639) (xy 0.846872 1.757228)
(xy 0.818813 1.757499) (xy 0.803643 1.757527) (xy 0.716319 1.757527) (xy 0.716319 1.350404) (xy 0.716319 0.94328)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "8a8b3352-91e2-40fd-9b3b-f4fe7eaf9265")
)
(fp_poly
(pts
(xy -0.724149 0.074371) (xy -0.724149 0.48146) (xy -0.803959 0.48146) (xy -0.831366 0.481393) (xy -0.852036 0.481134)
(xy -0.86706 0.480599) (xy -0.877528 0.479703) (xy -0.884531 0.47836) (xy -0.889161 0.476486) (xy -0.891813 0.47461)
(xy -0.893836 0.471373) (xy -0.897021 0.463973) (xy -0.901464 0.45211) (xy -0.907261 0.435487) (xy -0.914508 0.413803)
(xy -0.923302 0.386759) (xy -0.933738 0.354058) (xy -0.945913 0.315399) (xy -0.959922 0.270483) (xy -0.975862 0.219012)
(xy -0.993829 0.160687) (xy -1.013919 0.095208) (xy -1.017505 0.083497) (xy -1.033755 0.030326) (xy -1.049341 -0.020854)
(xy -1.06411 -0.069532) (xy -1.077908 -0.115196) (xy -1.090585 -0.157337) (xy -1.101986 -0.195441)
(xy -1.11196 -0.228999) (xy -1.120354 -0.257499) (xy -1.127015 -0.28043) (xy -1.131791 -0.297281)
(xy -1.134528 -0.30754) (xy -1.135153 -0.310591) (xy -1.135153 -0.315406) (xy -1.134747 -0.319467)
(xy -1.133319 -0.322838) (xy -1.130255 -0.325583) (xy -1.124941 -0.327767) (xy -1.116764 -0.329453)
(xy -1.10511 -0.330706) (xy -1.089363 -0.331589) (xy -1.068911 -0.332168) (xy -1.04314 -0.332506)
(xy -1.011434 -0.332667) (xy -0.973181 -0.332717) (xy -0.927767 -0.332718) (xy -0.9235 -0.332718)
(xy -0.724149 -0.332718)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "a5eb1233-a39b-467e-a159-04a004e9ca50")
)
(fp_poly
(pts
(xy -0.724149 1.350438) (xy -0.724149 1.757527) (xy -0.805602 1.757527) (xy -0.836065 1.75737) (xy -0.859375 1.756874)
(xy -0.8762 1.756002) (xy -0.887209 1.754716) (xy -0.893071 1.752979) (xy -0.893606 1.752634) (xy -0.895597 1.74832)
(xy -0.899659 1.737115) (xy -0.905605 1.719625) (xy -0.913248 1.696455) (xy -0.922402 1.66821) (xy -0.932879 1.635495)
(xy -0.944492 1.598916) (xy -0.957056 1.559079) (xy -0.970383 1.516588) (xy -0.984285 1.472049) (xy -0.998577 1.426067)
(xy -1.013072 1.379248) (xy -1.027582 1.332196) (xy -1.041921 1.285518) (xy -1.055903 1.239818) (xy -1.069339 1.195701)
(xy -1.082044 1.153774) (xy -1.09383 1.114641) (xy -1.104511 1.078908) (xy -1.113899 1.04718) (xy -1.121809 1.020062)
(xy -1.128053 0.99816) (xy -1.132444 0.982079) (xy -1.134796 0.972424) (xy -1.135153 0.970056) (xy -1.132231 0.959199)
(xy -1.126586 0.951331) (xy -1.124466 0.949535) (xy -1.121848 0.948031) (xy -1.118068 0.946793) (xy -1.11246 0.945794)
(xy -1.104358 0.94501) (xy -1.093098 0.944415) (xy -1.078013 0.943982) (xy -1.058438 0.943685) (xy -1.033709 0.9435)
(xy -1.003158 0.943399) (xy -0.966122 0.943358) (xy -0.921934 0.94335) (xy -0.921084 0.94335) (xy -0.724149 0.94335)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "979ad39e-a13c-46e2-a280-465f40701818")
)
(fp_poly
(pts
(xy -0.724149 -1.209525) (xy -0.724149 -0.802436) (xy -0.805743 -0.802436) (xy -0.833268 -0.80249)
(xy -0.854028 -0.802709) (xy -0.869085 -0.80318) (xy -0.879503 -0.803989) (xy -0.886344 -0.805222)
(xy -0.890671 -0.806965) (xy -0.893548 -0.809303) (xy -0.893791 -0.809567) (xy -0.895798 -0.814217)
(xy -0.899878 -0.825755) (xy -0.905843 -0.843571) (xy -0.913506 -0.867058) (xy -0.92268 -0.895608)
(xy -0.933176 -0.928613) (xy -0.944809 -0.965464) (xy -0.95739 -1.005553) (xy -0.970733 -1.048272)
(xy -0.984649 -1.093013) (xy -0.998952 -1.139168) (xy -1.013455 -1.186129) (xy -1.027969 -1.233287)
(xy -1.042308 -1.280034) (xy -1.056284 -1.325762) (xy -1.06971 -1.369864) (xy -1.082399 -1.41173)
(xy -1.094163 -1.450753) (xy -1.104815 -1.486324) (xy -1.114168 -1.517835) (xy -1.122033 -1.544679)
(xy -1.128225 -1.566247) (xy -1.132556 -1.58193) (xy -1.134838 -1.591121) (xy -1.135153 -1.593139)
(xy -1.132555 -1.603582) (xy -1.127994 -1.610135) (xy -1.125798 -1.611599) (xy -1.122288 -1.612827)
(xy -1.116816 -1.613839) (xy -1.108733 -1.614655) (xy -1.097391 -1.615296) (xy -1.082139 -1.615783)
(xy -1.062331 -1.616135) (xy -1.037316 -1.616374) (xy -1.006447 -1.61652) (xy -0.969074 -1.616593)
(xy -0.924549 -1.616613) (xy -0.922493 -1.616613) (xy -0.724149 -1.616613)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "7ccfab7a-43d7-4bfd-887d-b47f385f8ea8")
)
(fp_poly
(pts
(xy 0.967154 -0.332712) (xy 1.005307 -0.332677) (xy 1.03693 -0.332589) (xy 1.06267 -0.332424) (xy 1.083178 -0.332155)
(xy 1.099102 -0.331758) (xy 1.11109 -0.331209) (xy 1.119792 -0.330483) (xy 1.125857 -0.329555) (xy 1.129934 -0.328399)
(xy 1.132671 -0.326992) (xy 1.134717 -0.325308) (xy 1.13549 -0.32455) (xy 1.141567 -0.314448) (xy 1.141469 -0.307914)
(xy 1.138514 -0.29724) (xy 1.133556 -0.280241) (xy 1.126782 -0.257521) (xy 1.118381 -0.229682) (xy 1.10854 -0.197326)
(xy 1.097446 -0.161056) (xy 1.085288 -0.121473) (xy 1.072253 -0.079182) (xy 1.058529 -0.034783) (xy 1.044304 0.011121)
(xy 1.029765 0.057926) (xy 1.0151 0.105031) (xy 1.000497 0.151833) (xy 0.986144 0.19773) (xy 0.972228 0.24212)
(xy 0.958938 0.284399) (xy 0.94646 0.323966) (xy 0.934983 0.360217) (xy 0.924695 0.392551) (xy 0.915782 0.420366)
(xy 0.908433 0.443057) (xy 0.902836 0.460024) (xy 0.899179 0.470664) (xy 0.897689 0.474346) (xy 0.894994 0.476668)
(xy 0.890989 0.478426) (xy 0.884652 0.479696) (xy 0.874963 0.480557) (xy 0.860899 0.481085) (xy 0.841439 0.481359)
(xy 0.815563 0.481454) (xy 0.803785 0.48146) (xy 0.716319 0.48146) (xy 0.716319 0.074371) (xy 0.716319 -0.332718)
(xy 0.921821 -0.332718)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "1cda6440-0dd3-4a14-bc18-fe7b7a0aeeb7")
)
(fp_poly
(pts
(xy 0.96718 -1.616606) (xy 1.005359 -1.616566) (xy 1.037005 -1.616471) (xy 1.062766 -1.616296) (xy 1.08329 -1.616018)
(xy 1.099225 -1.615614) (xy 1.111218 -1.615059) (xy 1.119918 -1.614329) (xy 1.125972 -1.613401) (xy 1.130028 -1.612252)
(xy 1.132734 -1.610856) (xy 1.134739 -1.609191) (xy 1.135151 -1.608785) (xy 1.140945 -1.601406) (xy 1.143028 -1.596063)
(xy 1.141911 -1.591719) (xy 1.138649 -1.580394) (xy 1.133393 -1.562588) (xy 1.126294 -1.538803) (xy 1.117505 -1.509543)
(xy 1.107176 -1.475308) (xy 1.09546 -1.436601) (xy 1.082508 -1.393923) (xy 1.068472 -1.347777) (xy 1.053503 -1.298665)
(xy 1.037754 -1.247087) (xy 1.025068 -1.20561) (xy 1.002604 -1.132389) (xy 0.982335 -1.06668) (xy 0.96426 -1.008483)
(xy 0.948378 -0.957796) (xy 0.934688 -0.914616) (xy 0.923191 -0.878943) (xy 0.913885 -0.850775) (xy 0.906771 -0.83011)
(xy 0.901847 -0.816946) (xy 0.899113 -0.811281) (xy 0.899079 -0.811243) (xy 0.896253 -0.80839) (xy 0.892934 -0.806231)
(xy 0.888077 -0.804669) (xy 0.880635 -0.803607) (xy 0.869562 -0.80295) (xy 0.853812 -0.8026) (xy 0.832338 -0.802461)
(xy 0.804094 -0.802436) (xy 0.803709 -0.802436) (xy 0.716319 -0.802436) (xy 0.716319 -1.209525) (xy 0.716319 -1.616613)
(xy 0.921821 -1.616613)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "e1c0b9db-64be-41a0-a4c0-c3d3ff72c843")
)
(fp_poly
(pts
(xy 0.044941 -1.985664) (xy 0.069462 -1.983354) (xy 0.088603 -1.979876) (xy 0.089905 -1.979528) (xy 0.123347 -1.967994)
(xy 0.154386 -1.952873) (xy 0.180921 -1.935281) (xy 0.193153 -1.924646) (xy 0.210133 -1.906305) (xy 0.221389 -1.889433)
(xy 0.228168 -1.871932) (xy 0.230327 -1.861938) (xy 0.233114 -1.845601) (xy 0.41698 -1.843644) (xy 0.461315 -1.843183)
(xy 0.498502 -1.842755) (xy 0.529223 -1.842252) (xy 0.554157 -1.841567) (xy 0.573985 -1.840593) (xy 0.589386 -1.839224)
(xy 0.601043 -1.837352) (xy 0.609634 -1.83487) (xy 0.61584 -1.831671) (xy 0.620341 -1.827649) (xy 0.623818 -1.822696)
(xy 0.62695 -1.816704) (xy 0.630147 -1.810115) (xy 0.630756 -1.808845) (xy 0.631332 -1.80742) (xy 0.631877 -1.80563)
(xy 0.632392 -1.803267) (xy 0.632877 -1.800122) (xy 0.633333 -1.795987) (xy 0.633762 -1.790654) (xy 0.634164 -1.783913)
(xy 0.634539 -1.775557) (xy 0.63489 -1.765376) (xy 0.635216 -1.753163) (xy 0.635519 -1.738709) (xy 0.6358 -1.721805)
(xy 0.636058 -1.702243) (xy 0.636296 -1.679814) (xy 0.636514 -1.65431) (xy 0.636713 -1.625522) (xy 0.636894 -1.593242)
(xy 0.637057 -1.557261) (xy 0.637204 -1.517371) (xy 0.637335 -1.473363) (xy 0.637452 -1.425029) (xy 0.637554 -1.37216)
(xy 0.637644 -1.314548) (xy 0.637722 -1.251984) (xy 0.637788 -1.18426) (xy 0.637844 -1.111167) (xy 0.637891 -1.032496)
(xy 0.637929 -0.94804) (xy 0.637959 -0.857589) (xy 0.637982 -0.760935) (xy 0.638 -0.65787) (xy 0.638012 -0.548185)
(xy 0.63802 -0.431672) (xy 0.638025 -0.308122) (xy 0.638027 -0.177326) (xy 0.638027 -0.039077) (xy 0.638027 0.076586)
(xy 0.638025 0.221179) (xy 0.638022 0.358151) (xy 0.638015 0.487709) (xy 0.638004 0.610061) (xy 0.637988 0.725413)
(xy 0.637967 0.833974) (xy 0.63794 0.93595) (xy 0.637906 1.031548) (xy 0.637864 1.120977) (xy 0.637814 1.204443)
(xy 0.637755 1.282154) (xy 0.637686 1.354317) (xy 0.637606 1.42114) (xy 0.637514 1.482829) (xy 0.637411 1.539593)
(xy 0.637294 1.591638) (xy 0.637164 1.639172) (xy 0.63702 1.682402) (xy 0.63686 1.721536) (xy 0.636684 1.756781)
(xy 0.636491 1.788343) (xy 0.636281 1.816432) (xy 0.636053 1.841253) (xy 0.635806 1.863015) (xy 0.635539 1.881924)
(xy 0.635252 1.898188) (xy 0.634943 1.912015) (xy 0.634612 1.923611) (xy 0.634259 1.933184) (xy 0.633882 1.940941)
(xy 0.633481 1.94709) (xy 0.633055 1.951838) (xy 0.632603 1.955393) (xy 0.632124 1.957961) (xy 0.631618 1.95975)
(xy 0.631177 1.960794) (xy 0.623424 1.972258) (xy 0.613903 1.981854) (xy 0.613282 1.982322) (xy 0.602231 1.990429)
(xy 0.002648 1.991274) (xy -0.079699 1.99138) (xy -0.154555 1.991454) (xy -0.22226 1.991492) (xy -0.283151 1.991494)
(xy -0.337567 1.991455) (xy -0.385846 1.991374) (xy -0.428325 1.991248) (xy -0.465345 1.991076) (xy -0.497242 1.990854)
(xy -0.524355 1.99058) (xy -0.547022 1.990251) (xy -0.565582 1.989866) (xy -0.580373 1.989422) (xy -0.591733 1.988916)
(xy -0.600001 1.988346) (xy -0.605514 1.987709) (xy -0.608612 1.987004) (xy -0.608871 1.9869) (xy -0.620806 1.979175)
(xy -0.632376 1.96771) (xy -0.641081 1.955269) (xy -0.644 1.948049) (xy -0.64413 1.943622) (xy -0.644253 1.931608)
(xy -0.64437 1.912247) (xy -0.64448 1.885781) (xy -0.644583 1.852451) (xy -0.644679 1.812497) (xy -0.644768 1.766162)
(xy -0.64485 1.713686) (xy -0.644924 1.65531) (xy -0.644991 1.591275) (xy -0.64505 1.521823) (xy -0.645101 1.447194)
(xy -0.645144 1.36763) (xy -0.645149 1.356493) (xy -0.342395 1.356493) (xy -0.338613 1.404816) (xy -0.327987 1.452639)
(xy -0.310364 1.499218) (xy -0.287676 1.540589) (xy -0.260571 1.576458) (xy -0.227404 1.60966) (xy -0.189817 1.638922)
(xy -0.149452 1.662974) (xy -0.107949 1.680543) (xy -0.106307 1.681087) (xy -0.062233 1.692027) (xy -0.015695 1.697227)
(xy 0.031108 1.69664) (xy 0.075973 1.690219) (xy 0.095278 1.685317) (xy 0.145291 1.666832) (xy 0.190673 1.642225)
(xy 0.231101 1.611764) (xy 0.266257 1.575714) (xy 0.29582 1.534343) (xy 0.311726 1.505054) (xy 0.331187 1.456146)
(xy 0.343068 1.406056) (xy 0.347394 1.355425) (xy 0.344191 1.304891) (xy 0.333485 1.255092) (xy 0.3153 1.206667)
(xy 0.29854 1.174618) (xy 0.283892 1.153162) (xy 0.264494 1.129728) (xy 0.242308 1.10637) (xy 0.219297 1.08514)
(xy 0.197423 1.06809) (xy 0.195373 1.066694) (xy 0.151852 1.041544) (xy 0.106829 1.023723) (xy 0.059346 1.01294)
(xy 0.008444 1.008905) (xy 0.003914 1.008864) (xy -0.045753 1.011607) (xy -0.091574 1.02053) (xy -0.135025 1.036075)
(xy -0.177584 1.058682) (xy -0.190117 1.066719) (xy -0.229951 1.097711) (xy -0.264013 1.133412) (xy -0.292151 1.173077)
(xy -0.314212 1.215961) (xy -0.330041 1.261321) (xy -0.339487 1.308413) (xy -0.342395 1.356493) (xy -0.645149 1.356493)
(xy -0.64518 1.283372) (xy -0.645207 1.19466) (xy -0.645226 1.101736) (xy -0.645237 1.004842) (xy -0.645239 0.904218)
(xy -0.645232 0.800105) (xy -0.645217 0.692744) (xy -0.645193 0.582377) (xy -0.645159 0.469244) (xy -0.645117 0.353587)
(xy -0.645065 0.235647) (xy -0.645004 0.115665) (xy -0.644981 0.074371) (xy -0.341608 0.074371) (xy -0.340189 0.110431)
(xy -0.335846 0.142145) (xy -0.327915 0.172295) (xy -0.315734 0.203665) (xy -0.305695 0.225072) (xy -0.279633 0.269709)
(xy -0.248187 0.308693) (xy -0.211187 0.342196) (xy -0.168465 0.370386) (xy -0.150702 0.379736) (xy -0.117766 0.39451)
(xy -0.087018 0.404747) (xy -0.055739 0.411077) (xy -0.021213 0.414126) (xy 0.000476 0.414633) (xy 0.02525 0.414418)
(xy 0.04513 0.413243) (xy 0.063024 0.4108) (xy 0.081839 0.406781) (xy 0.087302 0.405424) (xy 0.13586 0.389319)
(xy 0.180178 0.36709) (xy 0.219956 0.339377) (xy 0.254897 0.306821) (xy 0.284703 0.270062) (xy 0.309073 0.22974)
(xy 0.327711 0.186495) (xy 0.340318 0.140968) (xy 0.346595 0.093798) (xy 0.346243 0.045626) (xy 0.338964 -0.002908)
(xy 0.32446 -0.051165) (xy 0.312852 -0.078287) (xy 0.287803 -0.122374) (xy 0.257753 -0.160998) (xy 0.223382 -0.194078)
(xy 0.185371 -0.221534) (xy 0.144403 -0.243288) (xy 0.101159 -0.259257) (xy 0.056319 -0.269364) (xy 0.010566 -0.273529)
(xy -0.03542 -0.27167) (xy -0.080956 -0.263709) (xy -0.125363 -0.249566) (xy -0.167957 -0.22916)
(xy -0.208058 -0.202413) (xy -0.244985 -0.169243) (xy -0.265477 -0.146049) (xy -0.295098 -0.103682)
(xy -0.317385 -0.058747) (xy -0.332423 -0.011003) (xy -0.340294 0.03979) (xy -0.341608 0.074371)
(xy -0.644981 0.074371) (xy -0.644977 0.067808) (xy -0.644244 -1.213439) (xy -0.341676 -1.213439)
(xy -0.341397 -1.18726) (xy -0.339986 -1.166001) (xy -0.337162 -1.146796) (xy -0.333467 -1.130059)
(xy -0.317523 -1.081038) (xy -0.295294 -1.036012) (xy -0.267398 -0.995375) (xy -0.234455 -0.959517)
(xy -0.197085 -0.928834) (xy -0.155907 -0.903716) (xy -0.11154 -0.884558) (xy -0.064603 -0.871751)
(xy -0.015717 -0.865689) (xy 0.034501 -0.866764) (xy 0.072668 -0.872491) (xy 0.122622 -0.886631)
(xy 0.16879 -0.907454) (xy 0.210768 -0.934585) (xy 0.248157 -0.967649) (xy 0.280555 -1.006271) (xy 0.307559 -1.050074)
(xy 0.32877 -1.098685) (xy 0.335079 -1.117847) (xy 0.339394 -1.132989) (xy 0.342358 -1.146252) (xy 0.34422 -1.159781)
(xy 0.345229 -1.175721) (xy 0.345631 -1.196214) (xy 0.345683 -1.209525) (xy 0.345454 -1.235208) (xy 0.344578 -1.255147)
(xy 0.34286 -1.271409) (xy 0.340106 -1.286064) (xy 0.337589 -1.296005) (xy 0.320158 -1.345626) (xy 0.296542 -1.390993)
(xy 0.267282 -1.431688) (xy 0.232921 -1.467291) (xy 0.194002 -1.497383) (xy 0.151068 -1.521546) (xy 0.104661 -1.539361)
(xy 0.055324 -1.550409) (xy 0.0036 -1.55427) (xy 0.002997 -1.554271) (xy -0.040014 -1.552231) (xy -0.079076 -1.545607)
(xy -0.117009 -1.53375) (xy -0.150702 -1.51896) (xy -0.195312 -1.493069) (xy -0.234316 -1.461744)
(xy -0.267864 -1.424836) (xy -0.296107 -1.382194) (xy -0.305636 -1.36414) (xy -0.320885 -1.33047)
(xy -0.331432 -1.299674) (xy -0.337949 -1.268935) (xy -0.341112 -1.235435) (xy -0.341676 -1.213439)
(xy -0.644244 -1.213439) (xy -0.643906 -1.803927) (xy -0.635709 -1.814978) (xy -0.626897 -1.824091)
(xy -0.615241 -1.832933) (xy -0.612223 -1.834772) (xy -0.608557 -1.836797) (xy -0.604791 -1.838482)
(xy -0.600215 -1.839859) (xy -0.594115 -1.84096) (xy -0.585779 -1.841816) (xy -0.574493 -1.842459)
(xy -0.559546 -1.842919) (xy -0.540225 -1.843228) (xy -0.515817 -1.843417) (xy -0.485609 -1.843518)
(xy -0.448888 -1.843563) (xy -0.41216 -1.843579) (xy -0.227386 -1.843644) (xy -0.224779 -1.858323)
(xy -0.21641 -1.883775) (xy -0.200999 -1.907962) (xy -0.179309 -1.930235) (xy -0.152102 -1.949945)
(xy -0.12014 -1.966443) (xy -0.084187 -1.979081) (xy -0.082201 -1.979626) (xy -0.063422 -1.983182)
(xy -0.039142 -1.985563) (xy -0.011537 -1.986769) (xy 0.017216 -1.986802)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "a814965a-5fcf-487e-8be3-04dec044943d")
)
(embedded_fonts no)
)

View file

@ -1,269 +0,0 @@
(footprint "apple-trafficlight-10mm-silkscreen"
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(layer "F.Cu")
(property "Reference" "G***"
(at 0 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "4d7586c1-3ff7-479e-83f5-783f9310e42f")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Value" "LOGO"
(at 0.75 0 0)
(layer "F.SilkS")
(hide yes)
(uuid "55cf6da5-cdaa-4d0b-ae8b-12c2f660a258")
(effects
(font
(size 1.5 1.5)
(thickness 0.3)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "8f0b00cf-ae96-4c1a-8dc1-a248afaf6c7e")
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" ""
(at 0 0 0)
(layer "F.Fab")
(hide yes)
(uuid "65a5f430-5831-4cb3-932e-eead2085d8e2")
(effects
(font
(size 1.27 1.27)
)
)
)
(attr board_only exclude_from_pos_files exclude_from_bom)
(duplicate_pad_numbers_are_jumpers no)
(fp_poly
(pts
(xy 2.306478 2.361281) (xy 2.821744 2.363814) (xy 2.841211 2.389891) (xy 2.860679 2.415969) (xy 2.561138 3.393094)
(xy 2.504951 3.575966) (xy 2.454217 3.740224) (xy 2.40894 3.88585) (xy 2.369127 4.012824) (xy 2.334785 4.121128)
(xy 2.305919 4.210743) (xy 2.282534 4.281651) (xy 2.264638 4.333832) (xy 2.252236 4.367268) (xy 2.245335 4.38194)
(xy 2.244766 4.382528) (xy 2.232594 4.386924) (xy 2.208498 4.390256) (xy 2.170762 4.392614) (xy 2.117671 4.394087)
(xy 2.047508 4.394765) (xy 2.009574 4.394835) (xy 1.791213 4.394835) (xy 1.791213 3.376791) (xy 1.791213 2.358747)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "25f07b41-e421-4378-8849-a19e8d30b787")
)
(fp_poly
(pts
(xy -1.810791 0.185972) (xy -1.810791 1.20393) (xy -2.010361 1.20393) (xy -2.078895 1.203761) (xy -2.130582 1.203115)
(xy -2.168149 1.201777) (xy -2.194326 1.199535) (xy -2.211838 1.196178) (xy -2.223414 1.191491) (xy -2.230048 1.186801)
(xy -2.235106 1.178706) (xy -2.24307 1.160201) (xy -2.25418 1.130538) (xy -2.268676 1.088969) (xy -2.286799 1.034747)
(xy -2.308788 0.967123) (xy -2.334884 0.88535) (xy -2.365328 0.78868) (xy -2.400359 0.676365) (xy -2.440218 0.547658)
(xy -2.485146 0.40181) (xy -2.535382 0.238075) (xy -2.54435 0.208792) (xy -2.584985 0.075834) (xy -2.623958 -0.052145)
(xy -2.660888 -0.173868) (xy -2.695393 -0.288056) (xy -2.727091 -0.393431) (xy -2.755601 -0.488715)
(xy -2.780542 -0.572629) (xy -2.801531 -0.643895) (xy -2.818188 -0.701236) (xy -2.83013 -0.743372)
(xy -2.836976 -0.769026) (xy -2.838536 -0.776655) (xy -2.838539 -0.788696) (xy -2.837522 -0.798851)
(xy -2.83395 -0.807281) (xy -2.826289 -0.814145) (xy -2.813002 -0.819605) (xy -2.792555 -0.823821)
(xy -2.763411 -0.826954) (xy -2.724037 -0.829164) (xy -2.672895 -0.830611) (xy -2.608451 -0.831456)
(xy -2.529169 -0.83186) (xy -2.433515 -0.831983) (xy -2.319952 -0.831986) (xy -2.309282 -0.831986)
(xy -1.810791 -0.831986)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "245e12da-5b1d-4fc6-b6ba-603a40cfb4f4")
)
(fp_poly
(pts
(xy -1.810791 3.376878) (xy -1.810791 4.394835) (xy -2.014469 4.394835) (xy -2.090645 4.394442) (xy -2.148933 4.393202)
(xy -2.191004 4.39102) (xy -2.218533 4.387804) (xy -2.233192 4.383462) (xy -2.234531 4.3826) (xy -2.23951 4.371812)
(xy -2.249667 4.343793) (xy -2.264535 4.300058) (xy -2.283648 4.242118) (xy -2.306537 4.171489) (xy -2.332735 4.089684)
(xy -2.361776 3.998216) (xy -2.393192 3.8986) (xy -2.426516 3.792348) (xy -2.461281 3.680974) (xy -2.497019 3.565993)
(xy -2.533264 3.448917) (xy -2.569548 3.331261) (xy -2.605405 3.214538) (xy -2.640366 3.100261) (xy -2.673964 2.989945)
(xy -2.705733 2.885103) (xy -2.735205 2.787248) (xy -2.761914 2.697895) (xy -2.785391 2.618556) (xy -2.80517 2.550746)
(xy -2.820783 2.495978) (xy -2.831764 2.455766) (xy -2.837645 2.431624) (xy -2.838536 2.425702) (xy -2.831232 2.398553)
(xy -2.817115 2.378877) (xy -2.811813 2.374387) (xy -2.805268 2.370626) (xy -2.795815 2.36753) (xy -2.781792 2.365034)
(xy -2.761533 2.363073) (xy -2.733375 2.361584) (xy -2.695655 2.360501) (xy -2.646707 2.35976) (xy -2.584868 2.359296)
(xy -2.508474 2.359044) (xy -2.415862 2.35894) (xy -2.305367 2.35892) (xy -2.303242 2.35892) (xy -1.810791 2.35892)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "08b30c1a-7e22-48f3-90a0-e3eb17ece3cd")
)
(fp_poly
(pts
(xy -1.810791 -3.02451) (xy -1.810791 -2.006552) (xy -2.014823 -2.006552) (xy -2.083651 -2.006687)
(xy -2.135562 -2.007236) (xy -2.173213 -2.008414) (xy -2.199264 -2.010437) (xy -2.21637 -2.013519)
(xy -2.227191 -2.017877) (xy -2.234384 -2.023724) (xy -2.234993 -2.024385) (xy -2.240012 -2.036013)
(xy -2.250214 -2.064863) (xy -2.26513 -2.109414) (xy -2.284292 -2.168146) (xy -2.307231 -2.239537)
(xy -2.333479 -2.322068) (xy -2.362567 -2.414217) (xy -2.394028 -2.514463) (xy -2.427392 -2.621286)
(xy -2.462191 -2.733164) (xy -2.497957 -2.848578) (xy -2.534221 -2.966007) (xy -2.570515 -3.083929)
(xy -2.606371 -3.200824) (xy -2.641319 -3.315171) (xy -2.674892 -3.42545) (xy -2.706622 -3.53014)
(xy -2.736039 -3.627719) (xy -2.762675 -3.716667) (xy -2.786062 -3.795464) (xy -2.805731 -3.862589)
(xy -2.821214 -3.916521) (xy -2.832043 -3.955739) (xy -2.837749 -3.978722) (xy -2.838536 -3.983767)
(xy -2.83204 -4.009881) (xy -2.820637 -4.026268) (xy -2.815145 -4.029929) (xy -2.806368 -4.032998)
(xy -2.792685 -4.035528) (xy -2.772473 -4.037569) (xy -2.74411 -4.039173) (xy -2.705973 -4.04039)
(xy -2.65644 -4.041271) (xy -2.593889 -4.041869) (xy -2.516698 -4.042233) (xy -2.423244 -4.042415)
(xy -2.311906 -4.042467) (xy -2.306764 -4.042467) (xy -1.810791 -4.042467)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "408bdd13-f731-4ce9-9907-838242f0a13a")
)
(fp_poly
(pts
(xy 2.418445 -0.831971) (xy 2.51385 -0.831884) (xy 2.592925 -0.831665) (xy 2.657291 -0.83125) (xy 2.708572 -0.830578)
(xy 2.74839 -0.829587) (xy 2.778368 -0.828214) (xy 2.800129 -0.826398) (xy 2.815295 -0.824076) (xy 2.825489 -0.821187)
(xy 2.832333 -0.817668) (xy 2.837451 -0.813458) (xy 2.839383 -0.811561) (xy 2.854578 -0.7863) (xy 2.854332 -0.769962)
(xy 2.846944 -0.74327) (xy 2.834546 -0.700765) (xy 2.817608 -0.643952) (xy 2.7966 -0.574337) (xy 2.771991 -0.493428)
(xy 2.744251 -0.402731) (xy 2.713849 -0.303753) (xy 2.681254 -0.197999) (xy 2.646936 -0.086976) (xy 2.611364 0.027809)
(xy 2.575008 0.144849) (xy 2.538338 0.262639) (xy 2.501823 0.379672) (xy 2.465932 0.494441) (xy 2.431134 0.60544)
(xy 2.3979 0.711163) (xy 2.366699 0.810102) (xy 2.338 0.900752) (xy 2.312272 0.981606) (xy 2.289986 1.051158)
(xy 2.27161 1.1079) (xy 2.257614 1.150328) (xy 2.248468 1.176933) (xy 2.244742 1.186139) (xy 2.238003 1.191946)
(xy 2.227988 1.196342) (xy 2.212143 1.199519) (xy 2.187913 1.201671) (xy 2.152746 1.202992) (xy 2.104086 1.203676)
(xy 2.039379 1.203915) (xy 2.009927 1.20393) (xy 1.791213 1.20393) (xy 1.791213 0.185972) (xy 1.791213 -0.831986)
(xy 2.305086 -0.831986)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "f2e36a9e-dfbe-4e21-a943-34b86a2ae7ee")
)
(fp_poly
(pts
(xy 2.418511 -4.042447) (xy 2.513981 -4.042348) (xy 2.593114 -4.04211) (xy 2.657532 -4.041673) (xy 2.708853 -4.040979)
(xy 2.748699 -4.039967) (xy 2.778689 -4.038579) (xy 2.800443 -4.036755) (xy 2.815582 -4.034435) (xy 2.825724 -4.03156)
(xy 2.832492 -4.02807) (xy 2.837503 -4.023907) (xy 2.838535 -4.022891) (xy 2.853024 -4.00444) (xy 2.858232 -3.99108)
(xy 2.85544 -3.980218) (xy 2.847282 -3.951897) (xy 2.834138 -3.907371) (xy 2.816387 -3.847897) (xy 2.794409 -3.774729)
(xy 2.768581 -3.689123) (xy 2.739284 -3.592332) (xy 2.706897 -3.485614) (xy 2.671799 -3.370221) (xy 2.634368 -3.247411)
(xy 2.594985 -3.118438) (xy 2.563263 -3.014722) (xy 2.507092 -2.831626) (xy 2.456407 -2.667317) (xy 2.411208 -2.52179)
(xy 2.371493 -2.395042) (xy 2.337262 -2.287069) (xy 2.308512 -2.197866) (xy 2.285242 -2.127428) (xy 2.267452 -2.075753)
(xy 2.255139 -2.042835) (xy 2.248303 -2.028671) (xy 2.248219 -2.028575) (xy 2.241152 -2.021441) (xy 2.232853 -2.016042)
(xy 2.220708 -2.012136) (xy 2.202098 -2.009482) (xy 2.174409 -2.007838) (xy 2.135024 -2.006963) (xy 2.081326 -2.006615)
(xy 2.010701 -2.006552) (xy 2.009738 -2.006552) (xy 1.791213 -2.006552) (xy 1.791213 -3.02451) (xy 1.791213 -4.042467)
(xy 2.305086 -4.042467)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "a7666404-9177-4f83-b6ba-638ec149076b")
)
(fp_poly
(pts
(xy 0.112381 -4.965306) (xy 0.173697 -4.959532) (xy 0.221559 -4.950834) (xy 0.224815 -4.949964) (xy 0.30844 -4.921122)
(xy 0.386056 -4.88331) (xy 0.452407 -4.83932) (xy 0.482995 -4.812727) (xy 0.525454 -4.766863) (xy 0.553602 -4.724674)
(xy 0.570552 -4.680911) (xy 0.575951 -4.65592) (xy 0.58292 -4.615068) (xy 1.042693 -4.610174) (xy 1.153555 -4.609023)
(xy 1.246545 -4.607952) (xy 1.323364 -4.606694) (xy 1.385713 -4.604981) (xy 1.435294 -4.602546) (xy 1.473808 -4.599122)
(xy 1.502956 -4.594441) (xy 1.524438 -4.588235) (xy 1.539956 -4.580236) (xy 1.551212 -4.570177) (xy 1.559906 -4.557791)
(xy 1.567739 -4.54281) (xy 1.575734 -4.526333) (xy 1.577255 -4.523158) (xy 1.578696 -4.519594) (xy 1.580059 -4.515118)
(xy 1.581346 -4.509208) (xy 1.582559 -4.501345) (xy 1.5837 -4.491005) (xy 1.584772 -4.477668) (xy 1.585777 -4.460813)
(xy 1.586717 -4.439917) (xy 1.587593 -4.41446) (xy 1.588409 -4.38392) (xy 1.589167 -4.347776) (xy 1.589868 -4.305507)
(xy 1.590515 -4.25659) (xy 1.591109 -4.200505) (xy 1.591654 -4.13673) (xy 1.592151 -4.064744) (xy 1.592603 -3.984025)
(xy 1.593012 -3.894052) (xy 1.593379 -3.794304) (xy 1.593707 -3.684259) (xy 1.593999 -3.563396) (xy 1.594256 -3.431193)
(xy 1.59448 -3.287129) (xy 1.594674 -3.130683) (xy 1.59484 -2.961333) (xy 1.594981 -2.778558) (xy 1.595097 -2.581836)
(xy 1.595192 -2.370646) (xy 1.595268 -2.144467) (xy 1.595326 -1.902777) (xy 1.59537 -1.645055) (xy 1.5954 -1.370779)
(xy 1.59542 -1.079429) (xy 1.595431 -0.770482) (xy 1.595437 -0.443417) (xy 1.595438 -0.097713) (xy 1.595437 0.191509)
(xy 1.595433 0.553077) (xy 1.595424 0.895586) (xy 1.595406 1.219556) (xy 1.595379 1.525506) (xy 1.59534 1.813954)
(xy 1.595288 2.085417) (xy 1.59522 2.340416) (xy 1.595135 2.579468) (xy 1.595031 2.803091) (xy 1.594906 3.011805)
(xy 1.594757 3.206127) (xy 1.594584 3.386577) (xy 1.594384 3.553672) (xy 1.594156 3.707931) (xy 1.593897 3.849873)
(xy 1.593606 3.980016) (xy 1.59328 4.098879) (xy 1.592918 4.206979) (xy 1.592519 4.304836) (xy 1.592079 4.392968)
(xy 1.591598 4.471893) (xy 1.591072 4.542131) (xy 1.590502 4.604198) (xy 1.589884 4.658615) (xy 1.589216 4.705899)
(xy 1.588497 4.746569) (xy 1.587725 4.781143) (xy 1.586899 4.81014) (xy 1.586015 4.834078) (xy 1.585072 4.853476)
(xy 1.584069 4.868852) (xy 1.583004 4.880725) (xy 1.581873 4.889613) (xy 1.580677 4.896035) (xy 1.579412 4.900509)
(xy 1.578308 4.903118) (xy 1.558921 4.931787) (xy 1.535113 4.955781) (xy 1.53356 4.956953) (xy 1.505926 4.977225)
(xy 0.006624 4.979338) (xy -0.199292 4.979603) (xy -0.386477 4.979787) (xy -0.555778 4.979883) (xy -0.708041 4.979886)
(xy -0.844112 4.979789) (xy -0.964836 4.979587) (xy -1.07106 4.979273) (xy -1.163629 4.978841) (xy -1.24339 4.978286)
(xy -1.311189 4.9776) (xy -1.36787 4.976779) (xy -1.414281 4.975816) (xy -1.451267 4.974705) (xy -1.479674 4.97344)
(xy -1.500348 4.972015) (xy -1.514135 4.970424) (xy -1.521881 4.96866) (xy -1.522528 4.9684) (xy -1.552373 4.949082)
(xy -1.581304 4.920413) (xy -1.603071 4.889305) (xy -1.610371 4.871249) (xy -1.610696 4.860179) (xy -1.611004 4.830136)
(xy -1.611296 4.781723) (xy -1.611571 4.715543) (xy -1.611829 4.632198) (xy -1.612069 4.532292) (xy -1.612291 4.416427)
(xy -1.612496 4.285206) (xy -1.612681 4.139232) (xy -1.612848 3.979108) (xy -1.612996 3.805437) (xy -1.613124 3.618822)
(xy -1.613233 3.419866) (xy -1.613245 3.392017) (xy -0.856184 3.392017) (xy -0.846726 3.512853) (xy -0.820155 3.632439)
(xy -0.776088 3.748914) (xy -0.719355 3.852364) (xy -0.651577 3.942058) (xy -0.56864 4.025081) (xy -0.474651 4.098254)
(xy -0.373714 4.158397) (xy -0.269934 4.202331) (xy -0.265829 4.20369) (xy -0.155617 4.231048) (xy -0.039244 4.24405)
(xy 0.077788 4.242581) (xy 0.189978 4.226526) (xy 0.238251 4.214267) (xy 0.363314 4.168044) (xy 0.476793 4.106514)
(xy 0.577887 4.030343) (xy 0.665797 3.940198) (xy 0.739723 3.836745) (xy 0.779497 3.763506) (xy 0.82816 3.641206)
(xy 0.857869 3.515955) (xy 0.868688 3.389347) (xy 0.860678 3.262982) (xy 0.833906 3.138456) (xy 0.788433 3.017366)
(xy 0.746524 2.937225) (xy 0.709895 2.883572) (xy 0.661389 2.824974) (xy 0.605912 2.766565) (xy 0.548371 2.713477)
(xy 0.493673 2.670843) (xy 0.488547 2.667352) (xy 0.37972 2.604464) (xy 0.267136 2.559899) (xy 0.148401 2.532935)
(xy 0.021116 2.522847) (xy 0.009787 2.522745) (xy -0.114408 2.529602) (xy -0.228986 2.551916) (xy -0.33764 2.590787)
(xy -0.444062 2.647317) (xy -0.4754 2.667415) (xy -0.575008 2.744914) (xy -0.660185 2.834186) (xy -0.730546 2.93337)
(xy -0.78571 3.040606) (xy -0.825293 3.154032) (xy -0.848912 3.27179) (xy -0.856184 3.392017) (xy -1.613245 3.392017)
(xy -1.613321 3.209172) (xy -1.61339 2.987342) (xy -1.613437 2.754979) (xy -1.613464 2.512687) (xy -1.613469 2.261068)
(xy -1.613452 2.000725) (xy -1.613414 1.732261) (xy -1.613353 1.456279) (xy -1.61327 1.173382) (xy -1.613164 0.884173)
(xy -1.613035 0.589255) (xy -1.612882 0.28923) (xy -1.612824 0.185972) (xy -0.854216 0.185972) (xy -0.850667 0.276143)
(xy -0.839807 0.355446) (xy -0.819976 0.430839) (xy -0.789517 0.509281) (xy -0.764412 0.562812) (xy -0.699242 0.674428)
(xy -0.620609 0.771913) (xy -0.528089 0.855689) (xy -0.421258 0.926179) (xy -0.376841 0.949561) (xy -0.294483 0.986503)
(xy -0.217594 1.012103) (xy -0.139379 1.027931) (xy -0.053043 1.035555) (xy 0.001191 1.036824) (xy 0.063141 1.036286)
(xy 0.112852 1.033348) (xy 0.157597 1.027239) (xy 0.204645 1.017189) (xy 0.218307 1.013796) (xy 0.33973 0.973523)
(xy 0.450549 0.917937) (xy 0.550019 0.84864) (xy 0.637392 0.767231) (xy 0.711922 0.675312) (xy 0.772863 0.574484)
(xy 0.819469 0.466347) (xy 0.850993 0.352502) (xy 0.866688 0.23455) (xy 0.865808 0.114092) (xy 0.847607 -0.007272)
(xy 0.811338 -0.12794) (xy 0.782311 -0.195762) (xy 0.719675 -0.306006) (xy 0.644532 -0.402587) (xy 0.558585 -0.485306)
(xy 0.463537 -0.553963) (xy 0.361093 -0.608358) (xy 0.252957 -0.648293) (xy 0.140832 -0.673566) (xy 0.026422 -0.683979)
(xy -0.088569 -0.679331) (xy -0.202437 -0.659424) (xy -0.313478 -0.624057) (xy -0.419989 -0.573032)
(xy -0.520265 -0.506147) (xy -0.612604 -0.423205) (xy -0.663846 -0.365206) (xy -0.737914 -0.259265)
(xy -0.793646 -0.1469) (xy -0.831249 -0.027513) (xy -0.850932 0.099499) (xy -0.854216 0.185972) (xy -1.612824 0.185972)
(xy -1.612815 0.169561) (xy -1.610981 -3.034298) (xy -0.854387 -3.034298) (xy -0.853688 -2.968836)
(xy -0.85016 -2.915675) (xy -0.843099 -2.867653) (xy -0.833859 -2.825799) (xy -0.79399 -2.703219)
(xy -0.738404 -2.590629) (xy -0.668648 -2.489011) (xy -0.586273 -2.399347) (xy -0.492826 -2.32262)
(xy -0.389856 -2.259812) (xy -0.278913 -2.211904) (xy -0.161544 -2.17988) (xy -0.039299 -2.164721)
(xy 0.086273 -2.167409) (xy 0.181712 -2.18173) (xy 0.306628 -2.217088) (xy 0.422073 -2.269159) (xy 0.527044 -2.337003)
(xy 0.620537 -2.419682) (xy 0.70155 -2.516258) (xy 0.769077 -2.625792) (xy 0.822116 -2.747346) (xy 0.837893 -2.795263)
(xy 0.848681 -2.833127) (xy 0.856094 -2.866293) (xy 0.860751 -2.900123) (xy 0.863272 -2.93998) (xy 0.864279 -2.991227)
(xy 0.864409 -3.02451) (xy 0.863837 -3.088734) (xy 0.861644 -3.138591) (xy 0.857348 -3.179256) (xy 0.850464 -3.215903)
(xy 0.844169 -3.240761) (xy 0.800582 -3.364842) (xy 0.741527 -3.478287) (xy 0.66836 -3.580047) (xy 0.582439 -3.669074)
(xy 0.485119 -3.744323) (xy 0.377759 -3.804744) (xy 0.261715 -3.849291) (xy 0.138344 -3.876917) (xy 0.009003 -3.886573)
(xy 0.007497 -3.886575) (xy -0.100056 -3.881474) (xy -0.197735 -3.864909) (xy -0.292588 -3.835261)
(xy -0.376841 -3.798278) (xy -0.488392 -3.733534) (xy -0.585923 -3.655204) (xy -0.669813 -3.562913)
(xy -0.740437 -3.456283) (xy -0.764265 -3.411138) (xy -0.802396 -3.326943) (xy -0.828769 -3.249935)
(xy -0.845068 -3.173069) (xy -0.852977 -3.089301) (xy -0.854387 -3.034298) (xy -1.610981 -3.034298)
(xy -1.610136 -4.510859) (xy -1.589639 -4.538493) (xy -1.567604 -4.56128) (xy -1.538457 -4.583392)
(xy -1.530911 -4.58799) (xy -1.521742 -4.593052) (xy -1.512327 -4.597266) (xy -1.500884 -4.600711)
(xy -1.48563 -4.603464) (xy -1.464784 -4.605605) (xy -1.436565 -4.607211) (xy -1.399188 -4.608361)
(xy -1.350874 -4.609134) (xy -1.289838 -4.609607) (xy -1.214301 -4.609861) (xy -1.122479 -4.609972)
(xy -1.030637 -4.610013) (xy -0.568595 -4.610174) (xy -0.562076 -4.64688) (xy -0.541149 -4.710526)
(xy -0.502612 -4.771008) (xy -0.448374 -4.826703) (xy -0.380341 -4.875989) (xy -0.300419 -4.917244)
(xy -0.210516 -4.948846) (xy -0.20555 -4.950209) (xy -0.158591 -4.959101) (xy -0.097876 -4.965054)
(xy -0.028848 -4.96807) (xy 0.043052 -4.968153)
)
(stroke
(width 0)
(type solid)
)
(fill yes)
(layer "F.SilkS")
(uuid "27120424-522c-4840-8ba4-fb1c9d5b47b1")
)
(embedded_fonts no)
)

View file

@ -1,6 +0,0 @@
#!/bin/sh
## Builds common config for smartphone connected device
## -> receive CAM and DENMs via BLE and send CAMs based on position data received from BLE
cargo run --release --no-default-features -F esp,cam,denm,ble,cam_tx

View file

@ -1,6 +0,0 @@
#!/bin/sh
## Builds common config for smartphone connected device
## -> only receive CAM and DENMs via UART and BLE
cargo run --release --no-default-features -F esp,cam,denm,uart,ble

View file

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
## Builds common config for smartphone connected device ## Builds common config for smartphone connected device
## -> only receive CAM and DENMs via UART ## -> only receive CAM and DENMs via UART (TODO: and BLE)
cargo run --release --no-default-features -F esp,cam,denm,uart cargo run --release --no-default-features -F esp,cam,denm,uart

View file

@ -106,53 +106,7 @@ pub struct GlosaSignalInfo {
pub struct SignalGroupData { pub struct SignalGroupData {
pub phase: SignalPhase, pub phase: SignalPhase,
pub maneuver: map::Maneuvers, pub maneuver: map::Maneuvers,
pub usages: Vec<map::UsageType>, pub end_sec: Option<i16>,
pub timing: Option<TimingData>,
}
#[cfg(feature = "spat")]
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[allow(clippy::struct_field_names)]
pub struct TimingData {
pub min_end_sec: i16,
pub likely_end_sec: Option<i16>,
pub max_end_sec: Option<i16>,
}
#[cfg(feature = "spat")]
impl TimingData {
pub fn new(value: &map::SignalGroup, now: chrono::DateTime<chrono::Utc>) -> Option<Self> {
let min = value
.min_end_time()
.map(|val| Self::time_to_duration_sec(now, val));
let likely_end_sec = value
.likely_time()
.map(|val| Self::time_to_duration_sec(now, val));
let max_end_sec = value
.max_end_time()
.map(|val| Self::time_to_duration_sec(now, val));
min.map(|min_end_sec| Self {
min_end_sec,
likely_end_sec,
max_end_sec,
})
}
fn time_to_duration_sec(
now: chrono::DateTime<chrono::Utc>,
time_point: chrono::DateTime<chrono::Utc>,
) -> i16 {
use core::ops::Sub as _;
use num_traits::Float as _;
let dur = time_point.sub(now).as_seconds_f32();
#[allow(clippy::cast_possible_truncation)]
let duration_sec = dur.round() as i16;
duration_sec
}
} }
#[cfg(feature = "spat")] #[cfg(feature = "spat")]
@ -309,7 +263,6 @@ impl State {
} }
#[cfg(feature = "spat")] #[cfg(feature = "spat")]
#[allow(clippy::too_many_lines)]
pub fn run_glosa(&mut self) -> GlosaOutput { pub fn run_glosa(&mut self) -> GlosaOutput {
let Some(own_heading) = self.pos.heading_deg else { let Some(own_heading) = self.pos.heading_deg else {
use alloc::string::ToString; use alloc::string::ToString;
@ -384,30 +337,52 @@ impl State {
}), }),
) )
} else { } else {
// get signal groups which are in our approach and have a maneuver // get signal groups which are in our approach
let mut approach_sig_grps = intersection let mut approach_sig_grps = intersection
.signal_groups() .signal_groups()
.iter() .iter()
.filter_map(|i| { .filter(|i| {
if let Some(maneuver) = i.maneuvers() info.signal_groups
&& info .iter()
.signal_groups .find(|sg_id| **sg_id == i.id())
.iter() .is_some()
.find(|sg_id| **sg_id == i.id()) })
.is_some() .collect::<Vec<_>>();
{
let phase = i // sort signal groups by maneuver
approach_sig_grps.sort_by_key(|v| v.maneuvers());
// display signal phases
let sig_grps = approach_sig_grps
.iter()
.filter_map(|sig| {
if let Some(manv) = sig.maneuvers() {
use core::ops::Sub;
use num_traits::Float;
let phase = sig
.phase() .phase()
.map(core::convert::Into::into) .map(core::convert::Into::into)
.unwrap_or_default(); .unwrap_or_default();
let timing = TimingData::new(i, self.time.and_utc());
let usages = i.source_lane_usages().to_vec(); let end_sec = sig
.likely_time()
.or_else(|| sig.min_end_time())
.map(|time| {
let dur =
time.sub(self.time.and_utc()).as_seconds_f32();
#[allow(clippy::cast_possible_truncation)]
let end_sec = dur.round() as i16;
end_sec
});
Some(SignalGroupData { Some(SignalGroupData {
phase, phase,
maneuver, maneuver: manv,
usages, end_sec,
timing,
}) })
} else { } else {
None None
@ -415,39 +390,11 @@ impl State {
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
// sort signal groups by maneuver
approach_sig_grps.sort_by_key(|v| v.maneuver);
// // display signal phases
// let sig_grps = approach_sig_grps
// .iter()
// .filter_map(|sig| {
// if let Some(maneuver) = sig.sig_group.maneuvers() {
// let phase = sig
// .sig_group
// .phase()
// .map(core::convert::Into::into)
// .unwrap_or_default();
// let timing =
// TimingData::new(&sig.sig_group, self.time.and_utc());
// Some(SignalGroupData {
// phase,
// maneuver,
// timing,
// usages: sig.lane_types.clone(),
// })
// } else {
// None
// }
// })
// .collect::<Vec<_>>();
( (
None, None,
GlosaOutput::Locked(GlosaSignalInfo { GlosaOutput::Locked(GlosaSignalInfo {
intersection_id: intersection.id(), intersection_id: intersection.id(),
signal_groups: approach_sig_grps, signal_groups: sig_grps,
}), }),
) // keep state, return signal groups ) // keep state, return signal groups
} }

View file

@ -173,12 +173,6 @@ impl Intersection {
{ {
sig_grp.likely_time = Some(likely.to_datetime_from_moy(moy, year)); sig_grp.likely_time = Some(likely.to_datetime_from_moy(moy, year));
} }
if let Some(max) = &timing.max_end_time
&& !max.is_out_of_range()
&& !max.is_unknown()
{
sig_grp.max_end_time = Some(max.to_datetime_from_moy(moy, year));
}
} }
} }
} else { } else {
@ -191,35 +185,27 @@ impl Intersection {
fn collect_signal_groups(lanes: &[Lane]) -> Vec<SignalGroup> { fn collect_signal_groups(lanes: &[Lane]) -> Vec<SignalGroup> {
let mut connections = lanes let mut connections = lanes
.iter() .iter()
.flat_map(ConnectionExt::from_lane) .flat_map(|i| i.connections.clone())
.filter(|i| i.conn.signal_group.is_some()) .filter(|i| i.signal_group.is_some())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
connections.sort_by_key(|i| i.conn.signal_group.unwrap_or_default()); connections.sort_by_key(|i| i.signal_group.unwrap_or_default());
let chunks = connections.chunk_by(|a, b| a.conn.signal_group == b.conn.signal_group); let chunks = connections.chunk_by(|a, b| a.signal_group == b.signal_group);
chunks chunks
.map(|chunk| { .map(|chunk| {
let (sig_grp_id, maneuvers, mut target_lanes, mut source_lane_usages) = let (sig_grp_id, maneuvers, mut target_lanes) = chunk.iter().fold(
chunk.iter().fold( (None, Maneuvers::default(), vec![]),
(None, Maneuvers::default(), vec![], vec![]), |(sig_grp_id, maneuvers, mut lanes), i| {
|(sig_grp_id, maneuvers, mut lanes, mut usages), i| { let new_maneuvers = i
let new_maneuvers = i .maneuvers
.conn .map(|v| core::ops::Add::add(maneuvers, v))
.maneuvers .unwrap_or_default();
.map(|v| core::ops::Add::add(maneuvers, v)) lanes.push(i.target_lane_id);
.unwrap_or_default();
lanes.push(i.conn.target_lane_id);
let lane_usages = i.source_lane_usages.clone(); (i.signal_group, new_maneuvers, lanes)
usages.extend_from_slice(&lane_usages); },
);
usages.sort_unstable();
usages.dedup(); // TODO: only do this after all lanes were added?
(i.conn.signal_group, new_maneuvers, lanes, usages)
},
);
// unwrap is fine since we removed all connections without signal group beforehand // unwrap is fine since we removed all connections without signal group beforehand
let id = sig_grp_id.unwrap(); let id = sig_grp_id.unwrap();
@ -234,11 +220,9 @@ impl Intersection {
SignalGroup { SignalGroup {
id, id,
maneuvers, maneuvers,
source_lane_usages,
target_lanes, target_lanes,
phase: None, phase: None,
min_end_time: None, min_end_time: None,
max_end_time: None,
likely_time: None, likely_time: None,
} }
}) })
@ -411,28 +395,6 @@ impl From<&etsi_its_dsrc::Connection> for Connection {
} }
} }
#[derive(Debug, Clone)]
#[allow(unused)]
struct ConnectionExt {
source_lane_id: u8,
source_lane_usages: Vec<UsageType>,
conn: Connection,
}
impl ConnectionExt {
fn from_lane(value: &Lane) -> Vec<Self> {
value
.connections
.iter()
.map(|conn| Self {
source_lane_id: value.id,
source_lane_usages: value.usages.clone(),
conn: *conn,
})
.collect()
}
}
/// Different view on a lane connection /// Different view on a lane connection
/// ///
/// Technically this data is redundant with the `Connection` data of a `Lane`, /// Technically this data is redundant with the `Connection` data of a `Lane`,
@ -442,14 +404,13 @@ impl ConnectionExt {
pub struct SignalGroup { pub struct SignalGroup {
id: u8, id: u8,
maneuvers: Option<Maneuvers>, maneuvers: Option<Maneuvers>,
source_lane_usages: Vec<UsageType>, // for easier signal group evaluation target_lanes: Vec<u8>, // mainly for debugging
target_lanes: Vec<u8>, // mainly for debugging
// SPAT data // SPAT data
/// current signal phase /// current signal phase
phase: Option<etsi_its_dsrc::MovementPhaseState>, phase: Option<etsi_its_dsrc::MovementPhaseState>,
min_end_time: Option<chrono::DateTime<chrono::Utc>>, min_end_time: Option<chrono::DateTime<chrono::Utc>>,
max_end_time: Option<chrono::DateTime<chrono::Utc>>, // max_end_time: Option<chrono::DateTime<chrono::Utc>>,
likely_time: Option<chrono::DateTime<chrono::Utc>>, likely_time: Option<chrono::DateTime<chrono::Utc>>,
} }
@ -473,9 +434,6 @@ impl SignalGroup {
pub fn maneuvers(&self) -> Option<Maneuvers> { pub fn maneuvers(&self) -> Option<Maneuvers> {
self.maneuvers self.maneuvers
} }
pub fn source_lane_usages(&self) -> &[UsageType] {
&self.source_lane_usages
}
pub fn phase(&self) -> Option<etsi_its_dsrc::MovementPhaseState> { pub fn phase(&self) -> Option<etsi_its_dsrc::MovementPhaseState> {
self.phase self.phase
} }
@ -485,9 +443,6 @@ impl SignalGroup {
pub fn likely_time(&self) -> Option<chrono::prelude::DateTime<chrono::prelude::Utc>> { pub fn likely_time(&self) -> Option<chrono::prelude::DateTime<chrono::prelude::Utc>> {
self.likely_time self.likely_time
} }
pub fn max_end_time(&self) -> Option<chrono::prelude::DateTime<chrono::prelude::Utc>> {
self.max_end_time
}
pub fn phase_to_str(&self) -> Option<String> { pub fn phase_to_str(&self) -> Option<String> {
self.phase.map(|v| { self.phase.map(|v| {

View file

@ -1,416 +0,0 @@
#![allow(
clippy::needless_borrows_for_generic_args,
reason = "gatt_service creates false positives"
)]
use core::cell::RefCell;
use critical_section::Mutex;
use crossbeam_queue::ArrayQueue;
use esp_backtrace as _;
use log::{info, warn};
use trouble_host::prelude::*;
use crate::io;
pub const CONTROLLER_SLOTS: usize = 20;
const CONNECTIONS_MAX: usize = 1;
const L2CAP_CHANNELS_MAX: usize = 1;
pub static CLIENT_CONNECTED: Mutex<RefCell<bool>> = Mutex::new(RefCell::new(false));
pub static TX_DATA: Mutex<RefCell<Option<ArrayQueue<BleSendable>>>> =
Mutex::new(RefCell::new(None));
pub static RX_DATA: Mutex<RefCell<Option<io::msg::PositionState>>> = Mutex::new(RefCell::new(None));
pub enum BleSendable {
#[cfg(feature = "cam")]
CamRaw(io::msg::RawMsgRx),
#[cfg(feature = "cam")]
Cam(io::msg::CamEvent),
#[cfg(feature = "denm")]
DenmRaw(io::msg::RawMsgRx),
#[cfg(feature = "denm")]
Denm(io::msg::DenmEvent),
#[cfg(feature = "spat")]
MapemRaw(io::msg::RawMsgRx),
#[cfg(feature = "spat")]
SpatemRaw(io::msg::RawMsgRx),
}
#[gatt_server]
struct Server {
c_its_events: CITSEvents,
}
#[gatt_service(uuid = "c0b70000-d4f4-4000-ada8-f99a02ee315c")]
struct CITSEvents {
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "Position", read, value = "PositionState proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4001-ada8-f99a02ee315c", write)]
position: [u8; 27],
#[cfg(any(feature = "cam", feature = "denm", feature = "spat"))]
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "Raw_Notify", read, value = "Raw Message Notification", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4002-ada8-f99a02ee315c", read, notify, value = [0u8; io::msg::RawNotify::PROTO_SIZE])]
raw_notify: [u8; io::msg::RawNotify::PROTO_SIZE],
#[cfg(feature = "cam")]
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "CAM", read, value = "RawMsgRx proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4003-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
cam_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
#[cfg(feature = "cam")]
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "CAM_Event", read, value = "CamEvent proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4004-ada8-f99a02ee315c", read, notify, value = [0u8; io::msg::CamEvent::PROTO_SIZE])]
cam_event: [u8; io::msg::CamEvent::PROTO_SIZE],
#[cfg(feature = "denm")]
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "DENM", read, value = "RawMsgRx proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4005-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
denm_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
#[cfg(feature = "denm")]
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "DENM_Event", read, value = "DenmEvent proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4006-ada8-f99a02ee315c", read, notify, value = [0u8; io::msg::DenmEvent::PROTO_SIZE])]
denm_event: [u8; io::msg::DenmEvent::PROTO_SIZE],
#[cfg(feature = "spat")]
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "MAPEM", read, value = "RawMsgRx proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4007-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
mapem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
#[cfg(feature = "spat")]
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "SPATEM", read, value = "RawMsgRx proto msg", type = &'static str)]
#[characteristic(uuid = "c0b70001-d4f4-4008-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
spatem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
}
/// Creates the BLE controller
pub fn make_controller(
bt_peripheral: esp_hal::peripherals::BT<'static>,
) -> bt_hci::controller::ExternalController<
esp_radio::ble::controller::BleConnector<'static>,
CONTROLLER_SLOTS,
> {
critical_section::with(|cs| {
TX_DATA.borrow(cs).replace(Some(ArrayQueue::new(2)));
});
let transport = esp_radio::ble::controller::BleConnector::new(
bt_peripheral,
esp_radio::ble::Config::default(),
)
.unwrap();
bt_hci::controller::ExternalController::<_, { CONTROLLER_SLOTS }>::new(transport)
}
/// Run the BLE stack.
#[embassy_executor::task]
pub async fn run(
controller: bt_hci::controller::ExternalController<
esp_radio::ble::controller::BleConnector<'static>,
CONTROLLER_SLOTS,
>,
name: alloc::string::String,
) {
let mut resources: HostResources<DefaultPacketPool, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX> =
HostResources::new();
let stack = trouble_host::new(controller, &mut resources);
let Host {
mut peripheral,
runner,
..
} = stack.build();
let mut features = alloc::vec![];
if cfg!(feature = "cam") {
features.push("cam");
}
if cfg!(feature = "denm") {
features.push("denm");
}
if cfg!(feature = "spat") {
features.push("mapem");
features.push("spatem");
}
info!(
"Starting advertising and GATT service for {}",
features.join(",")
);
let server = Server::new_with_config(GapConfig::Peripheral(PeripheralConfig {
name: &name,
appearance: &appearance::UNKNOWN,
}))
.unwrap();
let _ = embassy_futures::join::join(ble_task(runner), async {
loop {
match advertise(&mut peripheral, &server).await {
Ok(conn) => {
info!("BLE: New client connected");
// set up tasks when the connection is established to a central, so they don't run when no one is connected.
let a = gatt_events_task(&server, &conn);
let b = publishing_task(&server, &conn);
// run until any task ends (usually because the connection has been closed), then return to advertising state.
embassy_futures::select::select(a, b).await;
critical_section::with(|cs| {
let value_ref = CLIENT_CONNECTED.borrow(cs);
let _ = value_ref.replace(false);
});
}
Err(e) => {
panic!("BLE ADV: fatal error: {e:?}");
}
}
}
})
.await;
}
pub fn update(payload: BleSendable) {
critical_section::with(|cs| {
// only add to queue when someone is connected
if *CLIENT_CONNECTED.borrow(cs).borrow() {
let queue_rc = TX_DATA.borrow(cs).borrow();
// unwrap is fine b/c we stored something in it before
let queue = queue_rc.as_ref().unwrap();
if queue.push(payload).is_err() {
log::error!("BLE TX queue is full");
}
}
});
}
/// Create an advertiser to use to connect to a BLE Central, and wait for it to connect.
async fn advertise<'values, 'server, C: Controller>(
peripheral: &mut Peripheral<'values, C, DefaultPacketPool>,
server: &'server Server<'values>,
) -> Result<GattConnection<'values, 'server, DefaultPacketPool>, BleHostError<C::Error>> {
let mut advertiser_data = [0; 35];
let service_uuid = Uuid::from(0xc0b7_0000_d4f4_4000_ada8_f99a_02ee_315c_u128)
.as_raw()
.try_into()
.unwrap();
let len = AdStructure::encode_slice(
&[
AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED),
AdStructure::ServiceUuids128(&[service_uuid]),
],
&mut advertiser_data[..],
)?;
let advertiser = peripheral
.advertise(
&trouble_host::advertise::AdvertisementParameters {
timeout: Some(embassy_time::Duration::from_secs(2)),
..Default::default()
},
Advertisement::ConnectableScannableUndirected {
adv_data: &advertiser_data[..len],
scan_data: &[],
},
)
.await?;
// info!("[adv] advertising {len} bytes");
let conn = advertiser.accept().await?.with_attribute_server(server)?;
// info!("[adv] connection established");
Ok(conn)
}
async fn ble_task<C: Controller, P: PacketPool>(mut runner: Runner<'_, C, P>) {
loop {
if let Err(e) = runner.run().await {
panic!("BLE Task: fatal error {e:?}");
}
}
}
/// Stream Events until the connection closes.
///
/// This function will handle the GATT events and process them.
/// This is how we interact with read and write requests.
async fn gatt_events_task<P: PacketPool>(
server: &Server<'_>,
conn: &GattConnection<'_, '_, P>,
) -> Result<(), Error> {
let reason = loop {
match conn.next().await {
GattConnectionEvent::Disconnected { reason } => break reason,
GattConnectionEvent::Gatt { event } => {
match &event {
GattEvent::Write(event)
if event.handle() == server.c_its_events.position.handle =>
{
use prost::Message as _;
// parse and send to main thread
match io::msg::PositionState::decode(event.data()) {
Ok(data) => {
critical_section::with(|cs| {
let rx_data_ref = RX_DATA.borrow(cs);
let _ = rx_data_ref.replace(Some(data));
});
}
Err(err) => log::error!("BLE: Failed to parse input: {err:?}"),
}
}
_ => {}
}
// This step is also performed at drop(), but writing it explicitly is necessary
// in order to ensure reply is sent.
match event.accept() {
Ok(reply) => reply.send().await,
Err(e) => warn!("BLE: error sending response: {e:?}"),
}
}
_ => {} // ignore other Gatt Connection Events
}
};
info!("BLE: disconnected b/c {reason:?}");
Ok(())
}
#[allow(clippy::too_many_lines)]
async fn publishing_task<P: PacketPool>(server: &Server<'_>, conn: &GattConnection<'_, '_, P>) {
critical_section::with(|cs| {
let value_ref = CLIENT_CONNECTED.borrow(cs);
let _ = value_ref.replace(true);
});
loop {
embassy_time::Timer::after(embassy_time::Duration::from_millis(10)).await;
let mut new_data = None;
critical_section::with(|cs| {
let queue_rc = TX_DATA.borrow(cs).borrow();
// unwrap is fine b/c we stored something in it before
let queue = queue_rc.as_ref().unwrap();
if let Some(data) = queue.pop() {
new_data = Some(data);
}
});
match new_data {
#[cfg(feature = "cam")]
Some(BleSendable::Cam(cam_event)) => match cam_event.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.cam_event.notify(conn, &value).await {
warn!("BLE: failed notifying connection of new CAM event: {err:?}");
}
}
Err(err) => warn!("BLE: CAM event {err}"),
},
#[cfg(feature = "denm")]
Some(BleSendable::Denm(denm_event)) => match denm_event.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.denm_event.notify(conn, &value).await {
warn!("BLE: failed notifying connection of new DENM event: {err:?}");
}
}
Err(err) => warn!("BLE: DENM event {err}"),
},
#[cfg(feature = "cam")]
Some(BleSendable::CamRaw(raw_msg)) => match raw_msg.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.cam_raw.set(server, &value) {
warn!("BLE: failed setting new raw CAM value: {err:?}");
}
if let Err(err) = send_raw_notify(
server,
conn,
c_its_parser::standards::extensions::ItsMessageId::Cam,
)
.await
{
warn!("BLE: {err}");
}
}
Err(err) => warn!("BLE: Raw CAM too big: {err}"),
},
#[cfg(feature = "denm")]
Some(BleSendable::DenmRaw(raw_msg)) => match raw_msg.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.denm_raw.set(server, &value) {
warn!("BLE: failed setting new raw DENM value: {err:?}");
}
if let Err(err) = send_raw_notify(
server,
conn,
c_its_parser::standards::extensions::ItsMessageId::Denm,
)
.await
{
warn!("BLE: {err}");
}
}
Err(err) => warn!("BLE: Raw DENM {err}"),
},
#[cfg(feature = "spat")]
Some(BleSendable::MapemRaw(raw_msg)) => match raw_msg.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.mapem_raw.set(server, &value) {
warn!("BLE: failed setting new raw MAPEM value: {err:?}");
}
if let Err(err) = send_raw_notify(
server,
conn,
c_its_parser::standards::extensions::ItsMessageId::Mapem,
)
.await
{
warn!("BLE: {err}");
}
}
Err(err) => warn!("BLE: Raw MAPEM {err}"),
},
#[cfg(feature = "spat")]
Some(BleSendable::SpatemRaw(raw_msg)) => match raw_msg.serialize_ble_proto() {
Ok(value) => {
if let Err(err) = server.c_its_events.spatem_raw.set(server, &value) {
warn!("BLE: failed setting new raw SPATEM value: {err:?}");
}
if let Err(err) = send_raw_notify(
server,
conn,
c_its_parser::standards::extensions::ItsMessageId::Spatem,
)
.await
{
warn!("BLE: {err}");
}
}
Err(err) => warn!("BLE: Raw SPATEM {err}"),
},
None => {}
}
}
}
async fn send_raw_notify<P: PacketPool>(
server: &Server<'_>,
conn: &GattConnection<'_, '_, P>,
msg_id: c_its_parser::standards::extensions::ItsMessageId,
) -> Result<(), alloc::string::String> {
let notify_buf = io::msg::RawNotify::from(msg_id)
.serialize_ble_proto()
.expect("BLE: Raw notify too big");
server
.c_its_events
.raw_notify
.notify(conn, &notify_buf)
.await
.map_err(|err| alloc::format!("failed notifying connection of new raw {msg_id:?}: {err:?}"))
}

360
src/io.rs
View file

@ -1,14 +1,16 @@
//! UART and BLE I/O Protocol //! UART/ BLE I/O Protocol
pub mod msg { pub mod msg {
#![allow(clippy::all, clippy::pedantic, clippy::nursery, dead_code)] #![allow(clippy::all, clippy::pedantic, clippy::nursery, dead_code)]
include!(concat!(env!("OUT_DIR"), "/c_its_io.rs")); include!(concat!(env!("OUT_DIR"), "/c_its_io.rs"));
} }
#[cfg(feature = "uart")] use alloc::string::ToString;
use alloc::vec::Vec;
use c_its_parser::gn as geonetworking; use c_its_parser::gn as geonetworking;
use log::error;
#[cfg(feature = "uart")]
impl From<msg::RawMsgRx> for msg::SerialOutputMsg { impl From<msg::RawMsgRx> for msg::SerialOutputMsg {
fn from(value: msg::RawMsgRx) -> Self { fn from(value: msg::RawMsgRx) -> Self {
use msg::serial_output_msg::Payload; use msg::serial_output_msg::Payload;
@ -19,7 +21,6 @@ impl From<msg::RawMsgRx> for msg::SerialOutputMsg {
} }
} }
#[cfg(feature = "uart")]
impl From<msg::DenmEvent> for msg::SerialOutputMsg { impl From<msg::DenmEvent> for msg::SerialOutputMsg {
fn from(value: msg::DenmEvent) -> Self { fn from(value: msg::DenmEvent) -> Self {
use msg::serial_output_msg::Payload; use msg::serial_output_msg::Payload;
@ -31,110 +32,22 @@ impl From<msg::DenmEvent> for msg::SerialOutputMsg {
} }
impl msg::RawMsgRx { impl msg::RawMsgRx {
#[cfg(feature = "uart")] pub fn serialize_uart_proto(&self) -> Vec<u8> {
pub fn serialize_uart_proto(&self) -> alloc::vec::Vec<u8> {
serialize_serial_msg(&Into::<msg::SerialOutputMsg>::into(self.clone())) serialize_serial_msg(&Into::<msg::SerialOutputMsg>::into(self.clone()))
} }
} }
#[cfg(feature = "denm")]
impl msg::DenmEvent { impl msg::DenmEvent {
#[cfg(feature = "ble")] #[allow(unused)]
pub const PROTO_SIZE: usize = 51; pub fn serialize_uart_proto(&self) -> Vec<u8> {
serialize_serial_msg(&Into::<msg::SerialOutputMsg>::into(*self))
#[cfg(feature = "ble")]
pub fn serialize_ble_proto(&self) -> Result<[u8; Self::PROTO_SIZE], alloc::string::String> {
use prost::Message as _;
let mut data = [0u8; Self::PROTO_SIZE];
let mut mut_buf = &mut data[..];
if let Err(err) = self.encode(&mut mut_buf) {
Err(alloc::format!("Buffer too small: {err:?}"))
} else {
Ok(data)
}
} }
} }
#[cfg(feature = "cam")]
impl msg::CamEvent {
#[cfg(feature = "ble")]
pub const PROTO_SIZE: usize = 38;
#[cfg(feature = "ble")]
pub fn serialize_ble_proto(&self) -> Result<[u8; Self::PROTO_SIZE], alloc::string::String> {
use prost::Message as _;
let mut data = [0u8; Self::PROTO_SIZE];
let mut mut_buf = &mut data[..];
if let Err(err) = self.encode(&mut mut_buf) {
Err(alloc::format!("Buffer too small: {err:?}"))
} else {
Ok(data)
}
}
}
#[cfg(any(feature = "cam", feature = "denm", feature = "spat"))]
impl msg::RawMsgRx {
#[cfg(feature = "ble")]
pub const PROTO_SIZE: usize = 1400;
#[cfg(feature = "ble")]
pub fn serialize_ble_proto(&self) -> Result<[u8; Self::PROTO_SIZE], alloc::string::String> {
use prost::Message as _;
let mut data = [0u8; Self::PROTO_SIZE];
let mut mut_buf = &mut data[..];
if let Err(err) = self.encode(&mut mut_buf) {
Err(alloc::format!("Buffer too small: {err:?}"))
} else {
Ok(data)
}
}
}
#[cfg(all(
feature = "ble",
any(feature = "cam", feature = "denm", feature = "spat")
))]
impl From<c_its_parser::standards::extensions::ItsMessageId> for msg::RawNotify {
fn from(value: c_its_parser::standards::extensions::ItsMessageId) -> Self {
let message_type = value.as_u8().into();
Self { message_type }
}
}
#[cfg(any(feature = "cam", feature = "denm", feature = "spat"))]
impl msg::RawNotify {
#[cfg(feature = "ble")]
pub const PROTO_SIZE: usize = 2;
#[cfg(feature = "ble")]
pub fn serialize_ble_proto(self) -> Result<[u8; Self::PROTO_SIZE], alloc::string::String> {
use prost::Message as _;
let mut data = [0u8; Self::PROTO_SIZE];
let mut mut_buf = &mut data[..];
if let Err(err) = self.encode(&mut mut_buf) {
Err(alloc::format!("Buffer too small: {err:?}"))
} else {
Ok(data)
}
}
}
#[cfg(feature = "uart")]
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Parser { pub struct Parser {
buffer: alloc::vec::Vec<u8>, buffer: alloc::vec::Vec<u8>,
} }
#[cfg(feature = "uart")]
impl Parser { impl Parser {
const SOF_LEN: u16 = 4; const SOF_LEN: u16 = 4;
const SOF1: u8 = 0x56; const SOF1: u8 = 0x56;
@ -178,7 +91,7 @@ impl Parser {
Ok(data) => { Ok(data) => {
output.push(data); output.push(data);
} }
Err(err) => log::error!("Failed to parse input: {err:?}"), Err(err) => error!("Failed to parse input: {err:?}"),
} }
// consume buffer // consume buffer
@ -209,8 +122,7 @@ impl Parser {
} }
} }
#[cfg(feature = "uart")] fn serialize_serial_msg<T>(msg: &T) -> Vec<u8>
fn serialize_serial_msg<T>(msg: &T) -> alloc::vec::Vec<u8>
where where
T: prost::Message, T: prost::Message,
{ {
@ -229,7 +141,6 @@ where
out out
} }
#[cfg(any(feature = "uart", feature = "ble"))]
impl From<msg::PositionState> for crate::applogic::GnssFix { impl From<msg::PositionState> for crate::applogic::GnssFix {
fn from(value: msg::PositionState) -> Self { fn from(value: msg::PositionState) -> Self {
let time = let time =
@ -258,7 +169,6 @@ impl From<msg::PositionState> for crate::applogic::GnssFix {
} }
} }
#[cfg(feature = "uart")]
impl From<msg::PositionState> for esp32_cits_core::PosVel { impl From<msg::PositionState> for esp32_cits_core::PosVel {
fn from(value: msg::PositionState) -> Self { fn from(value: msg::PositionState) -> Self {
let position = geo_types::Point::new( let position = geo_types::Point::new(
@ -284,7 +194,6 @@ impl From<msg::PositionState> for esp32_cits_core::PosVel {
} }
} }
#[cfg(feature = "uart")]
impl From<msg::ItsPosition> for esp32_cits_core::PosVel { impl From<msg::ItsPosition> for esp32_cits_core::PosVel {
fn from(value: msg::ItsPosition) -> Self { fn from(value: msg::ItsPosition) -> Self {
let latitude_deg = f64::from(value.latitude) / 10_000_000.; let latitude_deg = f64::from(value.latitude) / 10_000_000.;
@ -299,7 +208,6 @@ impl From<msg::ItsPosition> for esp32_cits_core::PosVel {
} }
} }
#[cfg(feature = "uart")]
impl esp32_cits_core::tx::GnItsPayload for msg::RawMsgTx { impl esp32_cits_core::tx::GnItsPayload for msg::RawMsgTx {
fn make_eh( fn make_eh(
&self, &self,
@ -315,8 +223,6 @@ impl esp32_cits_core::tx::GnItsPayload for msg::RawMsgTx {
), ),
alloc::string::String, alloc::string::String,
> { > {
use alloc::string::ToString as _;
let station_type = self let station_type = self
.station_type .station_type
.and_then(|v| { .and_then(|v| {
@ -390,20 +296,14 @@ impl esp32_cits_core::tx::GnItsPayload for msg::RawMsgTx {
fn make_payload( fn make_payload(
&self, &self,
) -> Result< ) -> Result<(Vec<u8>, c_its_parser::standards::extensions::ItsMessageId), alloc::string::String>
( {
alloc::vec::Vec<u8>,
c_its_parser::standards::extensions::ItsMessageId,
),
alloc::string::String,
> {
#[allow(clippy::cast_possible_truncation)] #[allow(clippy::cast_possible_truncation)]
let message_id = (self.message_type as u8).try_into()?; let message_id = (self.message_type as u8).try_into()?;
Ok((self.payload.clone(), message_id)) Ok((self.payload.clone(), message_id))
} }
} }
#[cfg(feature = "uart")]
impl msg::RawMsgTx { impl msg::RawMsgTx {
fn make_geobcast( fn make_geobcast(
address: [u8; 6], address: [u8; 6],
@ -484,243 +384,12 @@ impl msg::RawMsgTx {
} }
} }
#[cfg(feature = "cam")]
impl From<&alloc::boxed::Box<c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions::CAM>>
for msg::CamEvent
{
fn from(
value: &alloc::boxed::Box<c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions::CAM>,
) -> Self {
use c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions;
let station_id = value.header.station_id.0;
let station_type = u32::from(value.cam.cam_parameters.basic_container.station_type.0);
let position = value
.cam
.cam_parameters
.basic_container
.reference_position
.clone()
.into();
let vehicle_role = value
.cam
.cam_parameters
.low_frequency_container
.as_ref()
.and_then(|v| match v {
cam_pdu_descriptions::LowFrequencyContainer::basicVehicleContainerLowFrequency(
basic_vehicle_container_low_frequency,
) => Some(basic_vehicle_container_low_frequency.vehicle_role as u32),
_ => None,
});
let vehicle_data = match &value.cam.cam_parameters.high_frequency_container {
cam_pdu_descriptions::HighFrequencyContainer::basicVehicleContainerHighFrequency(
basic_vehicle_container_high_frequency,
) => Some(basic_vehicle_container_high_frequency.into()),
_ => None,
};
Self {
station_id,
station_type,
position,
vehicle_role,
vehicle_data,
}
}
}
#[cfg(feature = "cam")]
impl From<&c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions::BasicVehicleContainerHighFrequency> for msg::VehicleContainer {
fn from(value: &c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions::BasicVehicleContainerHighFrequency) -> Self {
let heading_deg = if value.heading.heading_value.is_unavailable() {
None
} else {
Some(u32::from(value.heading.heading_value.0))
};
let speed = if value.speed.speed_value.is_unavailable() {
None
} else {
Some(u32::from(value.speed.speed_value.0))
};
let vehicle_length_dm = if value.vehicle_length.vehicle_length_value.is_unavailable() {
None
} else {
Some(u32::from(value.vehicle_length.vehicle_length_value.0))
};
let vehicle_width_dm = if value.vehicle_width.is_unavailable() {
None
} else {
Some(u32::from(value.vehicle_width.0))
};
Self { heading_deg, speed, vehicle_length_dm, vehicle_width_dm }
}
}
#[cfg(feature = "denm")]
impl From<&alloc::boxed::Box<c_its_parser::standards::denm_2_2_1::denm_pdu_description::DENM>>
for msg::DenmEvent
{
fn from(
value: &alloc::boxed::Box<c_its_parser::standards::denm_2_2_1::denm_pdu_description::DENM>,
) -> Self {
let denm_mgmt = &value.denm.management;
let station_id = value.header.station_id.0; // TODO: or from action ID?
let ref_time = chrono::DateTime::<chrono::Utc>::from(denm_mgmt.reference_time.clone());
let end_time = ref_time + chrono::Duration::seconds(denm_mgmt.validity_duration.0.into());
#[allow(clippy::cast_sign_loss)]
let timestamp = ref_time.timestamp_millis() as u64;
#[allow(clippy::cast_sign_loss)]
let validity_end_ts = end_time.timestamp_millis() as u64;
let seq_num = denm_mgmt.action_id.sequence_number.0.into();
let event_position = Some(denm_mgmt.event_position.clone().into());
let event_heading_deg = value
.denm
.location
.as_ref()
.and_then(|v| v.event_position_heading.clone())
.map(|v| {
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
let conv = v.value.as_deg() as u32;
conv
});
let direction = denm_mgmt
.traffic_direction
.map(|v| msg::TrafficDir::from(v) as i32);
let cc_tuple = value
.denm
.situation
.as_ref()
.map(|v| v.event_type.cc_and_scc.to_u8_tuple());
let cause_code = cc_tuple.map(|v| v.0.into());
let sub_cause_code = cc_tuple.map(|v| v.1.into());
Self {
timestamp,
validity_end_ts,
station_id,
seq_num,
event_position,
event_heading_deg,
direction,
cause_code,
sub_cause_code,
}
}
}
#[cfg(feature = "cam")]
impl From<c_its_parser::standards::cdd_1_3_1_1::its_container::ReferencePosition>
for msg::Position
{
fn from(value: c_its_parser::standards::cdd_1_3_1_1::its_container::ReferencePosition) -> Self {
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
let latitude_deg = value.latitude.as_deg() as f32;
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
let longitude_deg = value.longitude.as_deg() as f32;
Self {
latitude_deg,
longitude_deg,
}
}
}
#[cfg(feature = "denm")]
impl From<c_its_parser::standards::cdd_2_2_1::etsi_its_cdd::ReferencePosition> for msg::Position {
fn from(value: c_its_parser::standards::cdd_2_2_1::etsi_its_cdd::ReferencePosition) -> Self {
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
let latitude_deg = value.latitude.as_deg() as f32;
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
let longitude_deg = value.longitude.as_deg() as f32;
Self {
latitude_deg,
longitude_deg,
}
}
}
#[cfg(feature = "denm")]
impl From<c_its_parser::standards::cdd_2_2_1::etsi_its_cdd::TrafficDirection> for msg::TrafficDir {
fn from(value: c_its_parser::standards::cdd_2_2_1::etsi_its_cdd::TrafficDirection) -> Self {
use c_its_parser::standards::cdd_2_2_1::etsi_its_cdd::TrafficDirection;
match value {
TrafficDirection::allTrafficDirections => Self::AllDirections,
TrafficDirection::sameAsReferenceDirection_upstreamOfReferencePosition => {
Self::Upstream
}
TrafficDirection::sameAsReferenceDirection_downstreamOfReferencePosition => {
Self::Downstream
}
TrafficDirection::oppositeToReferenceDirection => Self::Opposite,
}
}
}
#[cfg(any(feature = "cam", feature = "denm", feature = "spat"))]
impl TryFrom<&c_its_parser::ItsMessage<'_>> for msg::RawMsgRx {
type Error = alloc::string::String;
fn try_from(value: &c_its_parser::ItsMessage<'_>) -> Result<Self, Self::Error> {
let msg_id = c_its_parser::standards::extensions::ItsMessageId::from(value);
let payload = match value {
#[cfg(feature = "denm")]
c_its_parser::ItsMessage::DenmV1 {
geonetworking: _,
transport: _,
etsi,
} => etsi.encode_to_uper(),
#[cfg(feature = "denm")]
c_its_parser::ItsMessage::DenmV2 {
geonetworking: _,
transport: _,
etsi,
} => etsi.encode_to_uper(),
#[cfg(any(feature = "cam", feature = "cam_tx"))]
c_its_parser::ItsMessage::Cam {
geonetworking: _,
transport: _,
etsi,
} => etsi.encode_to_uper(),
#[cfg(feature = "spat")]
c_its_parser::ItsMessage::Spatem {
geonetworking: _,
transport: _,
etsi,
} => etsi.encode_to_uper(),
#[cfg(feature = "spat")]
c_its_parser::ItsMessage::Mapem {
geonetworking: _,
transport: _,
etsi,
} => etsi.encode_to_uper(),
}?;
Ok(Self {
msg_type: msg_id.as_u8().into(),
payload,
})
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::init_test_env_logger; use crate::init_test_env_logger;
#[cfg(feature = "uart")]
impl From<msg::RawMsgTx> for msg::SerialInputMsg { impl From<msg::RawMsgTx> for msg::SerialInputMsg {
fn from(value: msg::RawMsgTx) -> Self { fn from(value: msg::RawMsgTx) -> Self {
use msg::serial_input_msg::Payload; use msg::serial_input_msg::Payload;
@ -731,7 +400,6 @@ mod tests {
} }
} }
#[cfg(feature = "uart")]
impl From<msg::PositionState> for msg::SerialInputMsg { impl From<msg::PositionState> for msg::SerialInputMsg {
fn from(value: msg::PositionState) -> Self { fn from(value: msg::PositionState) -> Self {
use msg::serial_input_msg::Payload; use msg::serial_input_msg::Payload;
@ -745,9 +413,7 @@ mod tests {
// manual example data: // manual example data:
// SerialInputMsg(RawMsgTx): 5632582b0040123e0a340202c173256817284029d5b3400f1feaf01ffffffc23b7743e00000fc0007e8138250737feebfff600000dffff7ffff1ce40400010011807220028020d0a // SerialInputMsg(RawMsgTx): 5632582b0040123e0a340202c173256817284029d5b3400f1feaf01ffffffc23b7743e00000fc0007e8138250737feebfff600000dffff7ffff1ce40400010011807220028020d0a
// SerialInputMsg(PositionState): 5632582b00170a1509a0bbe2a29f010000120a0d00002842150000b8410d0a // SerialInputMsg(PositionState): 5632582b00170a1509a0bbe2a29f010000120a0d00002842150000b8410d0a
// PositionState: 09a0bbe2a29f010000120a0d00002842150000b841
#[cfg(feature = "uart")]
#[test] #[test]
fn uart_parser() { fn uart_parser() {
// generate some test UART input messages // generate some test UART input messages

View file

@ -18,9 +18,6 @@ compile_error!("feature \"cam_tx\" needs a time and position source (either GNSS
// we can't have both GNSS drivers enabled at the same time // we can't have both GNSS drivers enabled at the same time
#[cfg(all(feature = "gnss_ubx", feature = "gnss_l67k"))] #[cfg(all(feature = "gnss_ubx", feature = "gnss_l67k"))]
compile_error!("feature \"gnss_ubx\" and feature \"gnss_l67k\" cannot be enabled at the same time"); compile_error!("feature \"gnss_ubx\" and feature \"gnss_l67k\" cannot be enabled at the same time");
// at least one V2X feature needs to be enabled
#[cfg(not(any(feature = "spat", feature = "cam", feature = "denm")))]
compile_error!("at least one V2X feature (\"spat\", \"cam\" or \"denm\") needs to be enabled");
use alloc::string::ToString as _; use alloc::string::ToString as _;
use alloc::vec::Vec; use alloc::vec::Vec;
@ -39,7 +36,7 @@ use embassy_gps::gps::l76k;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::clock::CpuClock; use esp_hal::clock::CpuClock;
use esp_hal::timer::timg::TimerGroup; use esp_hal::timer::timg::TimerGroup;
#[cfg(target_arch = "riscv32")] #[cfg(all(target_arch = "riscv32", feature = "spat"))]
use esp_println::println; use esp_println::println;
use esp32_cits_core::radio; use esp32_cits_core::radio;
use geonetworking::Decode as _; use geonetworking::Decode as _;
@ -48,11 +45,9 @@ use log::{error, info, warn};
extern crate alloc; extern crate alloc;
mod applogic; mod applogic;
#[cfg(feature = "ble")]
mod ble;
mod cache; mod cache;
mod geo_alg; mod geo_alg;
#[cfg(any(feature = "uart", feature = "ble"))] #[cfg(feature = "uart")]
mod io; mod io;
#[cfg(feature = "screen")] #[cfg(feature = "screen")]
mod screen; mod screen;
@ -68,9 +63,9 @@ const GN_IS_MOBILE: bool = true;
#[cfg(feature = "cam_tx")] #[cfg(feature = "cam_tx")]
const OWN_STATION_TYPE: ItsStationType = ItsStationType::Cyclist; const OWN_STATION_TYPE: ItsStationType = ItsStationType::Cyclist;
#[cfg(feature = "cam_tx")] #[cfg(feature = "cam_tx")]
const OWN_VEHICLE_WIDTH: u8 = 7; // in 10cm steps! const OWN_VEHICLE_WIDTH: u8 = 5; // in 10cm steps!
#[cfg(feature = "cam_tx")] #[cfg(feature = "cam_tx")]
const OWN_VEHICLE_LENGTH: u16 = 18; // in 10cm steps! const OWN_VEHICLE_LENGTH: u16 = 20; // in 10cm steps!
#[cfg(feature = "_uart")] #[cfg(feature = "_uart")]
const SERIAL_FIFO_SIZE_THLD: u8 = 100; // hardware has max. 128 byte const SERIAL_FIFO_SIZE_THLD: u8 = 100; // hardware has max. 128 byte
@ -78,26 +73,6 @@ const SERIAL_FIFO_SIZE_THLD: u8 = 100; // hardware has max. 128 byte
// For more information see: <https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/app_image_format.html#application-description> // For more information see: <https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/app_image_format.html#application-description>
esp_bootloader_esp_idf::esp_app_desc!(); esp_bootloader_esp_idf::esp_app_desc!();
// Print a backtrace and reset (instead of halting)
#[panic_handler]
fn panic_handler(info: &core::panic::PanicInfo) -> ! {
println!("");
println!("====================== PANIC ======================");
println!("{}", info);
println!("\nBacktrace:");
let backtrace = esp_backtrace::Backtrace::capture();
for frame in backtrace.frames() {
println!("- 0x{:x}", frame.program_counter());
}
println!("================== BACKTRACE END ==================");
// reboot
println!("-> Doing a SW reset after panic...\n");
esp_hal::system::software_reset();
}
#[cfg(feature = "_gnss")] #[cfg(feature = "_gnss")]
static GNSS_UPDATE: Mutex<RefCell<Option<applogic::GnssFix>>> = Mutex::new(RefCell::new(None)); static GNSS_UPDATE: Mutex<RefCell<Option<applogic::GnssFix>>> = Mutex::new(RefCell::new(None));
static WIFI_RX_QUEUE: Mutex<RefCell<Option<ArrayQueue<Vec<u8>>>>> = Mutex::new(RefCell::new(None)); static WIFI_RX_QUEUE: Mutex<RefCell<Option<ArrayQueue<Vec<u8>>>>> = Mutex::new(RefCell::new(None));
@ -114,7 +89,7 @@ static SERIAL: Mutex<RefCell<Option<esp_hal::uart::Uart<'static, esp_hal::Blocki
#[esp_rtos::main] #[esp_rtos::main]
async fn main(spawner: Spawner) -> ! { async fn main(spawner: Spawner) -> ! {
// generator version: 1.3.0 // generator version: 1.3.0
// generator parameters: --chip esp32c5 -o esp32c5-wroom-1-psram -o alloc -o log -o unstable-hal -o wifi -o esp-backtrace -o embassy -o ble-trouble // generator parameters: --chip esp32c5 -o esp32c5-wroom-1-psram -o alloc -o log -o unstable-hal -o wifi -o esp-backtrace -o embassy
esp_println::logger::init_logger_from_env(); esp_println::logger::init_logger_from_env();
@ -132,8 +107,6 @@ async fn main(spawner: Spawner) -> ! {
// - GPIO28 // - GPIO28
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 65536); esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 65536);
// COEX needs more RAM - so we've added some more
esp_alloc::heap_allocator!(size: 64 * 1024);
esp_alloc::psram_allocator!(peripherals.PSRAM, esp_hal::psram); esp_alloc::psram_allocator!(peripherals.PSRAM, esp_hal::psram);
let timg0 = TimerGroup::new(peripherals.TIMG0); let timg0 = TimerGroup::new(peripherals.TIMG0);
@ -154,8 +127,8 @@ async fn main(spawner: Spawner) -> ! {
let mut spi_buffer = [0_u8; 512]; let mut spi_buffer = [0_u8; 512];
#[cfg(feature = "screen")] #[cfg(feature = "screen")]
let mut screen = { let mut screen = {
// 240*280px in portrait orientation // 172*320px in landscape orientation
let (display, size) = screen::make_large_display( let (display, width, height) = screen::make_small_display(
peripherals.GPIO8, peripherals.GPIO8,
peripherals.GPIO10, peripherals.GPIO10,
peripherals.GPIO7, peripherals.GPIO7,
@ -167,7 +140,7 @@ async fn main(spawner: Spawner) -> ! {
) )
.expect("Fatal error building screen"); .expect("Fatal error building screen");
let mut screen = screen::Handler::new(display, size); let mut screen = screen::Handler::new(display, width, height);
let _ = screen let _ = screen
.update(screen::ScreenState::Initial) .update(screen::ScreenState::Initial)
@ -215,20 +188,6 @@ async fn main(spawner: Spawner) -> ! {
let mac = esp_hal::efuse::base_mac_address(); let mac = esp_hal::efuse::base_mac_address();
info!("WiFi MAC: {mac}"); info!("WiFi MAC: {mac}");
// Setup BLE
#[cfg(feature = "ble")]
{
let controller = ble::make_controller(peripherals.BT);
let serial = &mac.as_bytes()[3..6];
let name = alloc::format!(
"ESP32 C-ITS {:02x}{:02x}{:02x}",
serial[0],
serial[1],
serial[2]
);
spawner.spawn(ble::run(controller, name).expect("Failed to spawn BLE task"));
}
// Setup GNSS: // Setup GNSS:
// Seeed XIAO L67K: // Seeed XIAO L67K:
// RX: D7/ GPIO12 // RX: D7/ GPIO12
@ -379,22 +338,15 @@ async fn main(spawner: Spawner) -> ! {
println!("{}", ubx::pretty_print_nav_sat(packet)); println!("{}", ubx::pretty_print_nav_sat(packet));
} }
ublox::proto27::PacketRef::NavPvt(pvt) => { ublox::proto27::PacketRef::NavPvt(pvt) => {
// error can be ignored b/c it's just when no GNSS fix yet match applogic::GnssFix::try_from(pvt) {
if let Ok(pos_state) = applogic::GnssFix::try_from(pvt) { Ok(pos_state) => {
critical_section::with(|cs| { critical_section::with(|cs| {
let gnss_update_ref = GNSS_UPDATE.borrow(cs); let gnss_update_ref = GNSS_UPDATE.borrow(cs);
gnss_update_ref.replace(Some(pos_state)); gnss_update_ref.replace(Some(pos_state));
}); });
}
Err(err) => warn!("{err}"),
} }
// update GNSS HB on screen
let _ = screen.update_gnss(pvt);
}
ublox::proto27::PacketRef::AckNak(nak) => {
error!("UBX: {nak:?}");
}
ublox::proto27::PacketRef::AckAck(ack) => {
info!("UBX: {ack:?}");
} }
_ => { _ => {
println!("UBX: {packet_ref:?}"); println!("UBX: {packet_ref:?}");
@ -413,17 +365,6 @@ async fn main(spawner: Spawner) -> ! {
} }
} }
#[cfg(feature = "ble")]
{
critical_section::with(|cs| {
let mut data_rc = ble::RX_DATA.borrow(cs).borrow_mut();
if let Some(pos) = data_rc.take() {
let gnss_update_ref = GNSS_UPDATE.borrow(cs);
gnss_update_ref.replace(Some(pos.into()));
}
});
}
#[cfg(feature = "_gnss")] #[cfg(feature = "_gnss")]
{ {
let mut new_position = false; let mut new_position = false;
@ -474,9 +415,8 @@ async fn main(spawner: Spawner) -> ! {
if let applogic::GlosaOutput::Locked(data) = &glosa_data { if let applogic::GlosaOutput::Locked(data) = &glosa_data {
for sig in &data.signal_groups { for sig in &data.signal_groups {
let duration_str = sig let duration_str = sig
.timing .end_sec
.as_ref() .map(|v| alloc::format!("for {v} s"))
.map(|v| alloc::format!("for {} s", v.min_end_sec))
.unwrap_or_default(); .unwrap_or_default();
println!("GLOSA: {} {} {duration_str}", sig.maneuver, sig.phase); println!("GLOSA: {} {} {duration_str}", sig.maneuver, sig.phase);
} }
@ -513,36 +453,16 @@ async fn main(spawner: Spawner) -> ! {
ItsMessage::Mapem { ItsMessage::Mapem {
geonetworking: _, geonetworking: _,
transport: _, transport: _,
ref etsi, etsi,
} => { } => state.handle_mapem(&etsi),
state.handle_mapem(etsi);
// Send data to BLE thread
#[cfg(feature = "ble")]
match io::msg::RawMsgRx::try_from(&msg) {
Ok(data) => {
ble::update(ble::BleSendable::MapemRaw(data));
}
Err(err) => warn!("Failed to create RawMsgRx: {err}"),
}
}
#[cfg(feature = "spat")] #[cfg(feature = "spat")]
ItsMessage::Spatem { ItsMessage::Spatem {
geonetworking: _, geonetworking: _,
transport: _, transport: _,
ref etsi, etsi,
} => { } => {
if state.initialized() { if state.initialized() {
state.handle_spatem(etsi); state.handle_spatem(&etsi);
}
// Send data to BLE thread
#[cfg(feature = "ble")]
match io::msg::RawMsgRx::try_from(&msg) {
Ok(data) => {
ble::update(ble::BleSendable::SpatemRaw(data));
}
Err(err) => warn!("Failed to create RawMsgRx: {err}"),
} }
} }
@ -550,49 +470,18 @@ async fn main(spawner: Spawner) -> ! {
ItsMessage::Cam { ItsMessage::Cam {
geonetworking: _, geonetworking: _,
transport: _, transport: _,
ref etsi, etsi,
} => { } => {
#[cfg(feature = "cam")] #[cfg(feature = "cam")]
applogic::cam::handle_cam(etsi); applogic::cam::handle_cam(&etsi);
// Send data to BLE thread
#[cfg(all(feature = "ble", feature = "cam"))]
{
ble::update(ble::BleSendable::Cam(etsi.into()));
// raw data only when it's a full CAM
if etsi.cam.cam_parameters.low_frequency_container.is_some() {
match io::msg::RawMsgRx::try_from(&msg) {
Ok(data) => {
ble::update(ble::BleSendable::CamRaw(data));
}
Err(err) => warn!("Failed to create RawMsgRx: {err}"),
}
}
}
} }
#[cfg(feature = "denm")] #[cfg(feature = "denm")]
ItsMessage::DenmV2 { ItsMessage::DenmV2 {
geonetworking: _, geonetworking: _,
transport: _, transport: _,
ref etsi, etsi,
} => { } => applogic::denm::handle_denm(&etsi),
applogic::denm::handle_denm(etsi);
// Send data to BLE thread
#[cfg(feature = "ble")]
{
ble::update(ble::BleSendable::Denm(etsi.into()));
match io::msg::RawMsgRx::try_from(&msg) {
Ok(data) => {
ble::update(ble::BleSendable::DenmRaw(data));
}
Err(err) => warn!("Failed to create RawMsgRx: {err}"),
}
}
}
#[cfg(feature = "denm")] #[cfg(feature = "denm")]
ItsMessage::DenmV1 { ItsMessage::DenmV1 {
geonetworking: _, geonetworking: _,
@ -875,8 +764,6 @@ async fn gnss_ubx_config(reset_pin: esp_hal::peripherals::GPIO25<'static>) {
cfg_data: &[ cfg_data: &[
ublox::cfg_val::CfgVal::Uart1OutProtNmea(false), ublox::cfg_val::CfgVal::Uart1OutProtNmea(false),
ublox::cfg_val::CfgVal::Uart1OutProtUbx(true), ublox::cfg_val::CfgVal::Uart1OutProtUbx(true),
// CFG-RATE-MEAS
ublox::cfg_val::CfgVal::RateMeas(500),
// CFG-MSGOUT-UBX_NAV_PVT_UART1 // CFG-MSGOUT-UBX_NAV_PVT_UART1
ublox::cfg_val::CfgVal::MsgOutUbxNavPvtUart1(1), ublox::cfg_val::CfgVal::MsgOutUbxNavPvtUart1(1),
// CFG-MSGOUT-UBX_NAV_SAT_UART1 // CFG-MSGOUT-UBX_NAV_SAT_UART1

View file

@ -5,28 +5,17 @@ use embedded_graphics::{geometry, mono_font, pixelcolor, primitives, text};
use crate::applogic; use crate::applogic;
pub struct DisplaySize {
width: u16,
height: u16,
offset_top: i32,
corner_radius: i32,
}
pub struct Handler<D> pub struct Handler<D>
where where
D: DrawTarget<Color = pixelcolor::Rgb565>, D: DrawTarget<Color = pixelcolor::Rgb565>,
{ {
target: D, target: D,
size: DisplaySize, width: u16,
height: u16,
// internal state // internal state
prev_state: ScreenState, prev_state: ScreenState,
hb_state: bool, hb_state: bool,
gnss_hb_state: bool,
// assets
#[cfg(feature = "spat")]
bike_image: tinytga::Tga<'static, pixelcolor::Rgb565>,
} }
#[derive(Debug, Default, PartialEq, Eq)] #[derive(Debug, Default, PartialEq, Eq)]
@ -90,27 +79,16 @@ where
const DEFAULT_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> = const DEFAULT_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> =
mono_font::MonoTextStyle::new(&profont::PROFONT_24_POINT, Self::COLOR_FG); mono_font::MonoTextStyle::new(&profont::PROFONT_24_POINT, Self::COLOR_FG);
const MID_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> =
mono_font::MonoTextStyle::new(&profont::PROFONT_18_POINT, Self::COLOR_FG);
const SMALL_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> = const SMALL_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> =
mono_font::MonoTextStyle::new(&profont::PROFONT_14_POINT, Self::COLOR_FG); mono_font::MonoTextStyle::new(&profont::PROFONT_14_POINT, Self::COLOR_FG);
const BIG_HEIGHT_THLD: u16 = 172; pub fn new(target: D, width: u16, height: u16) -> Self {
pub fn new(target: D, display_size: DisplaySize) -> Self {
#[cfg(feature = "spat")]
let data = include_bytes!("../graphics/Sinnbild_Radfahrer_StVO_1992-25px-white.tga");
#[cfg(feature = "spat")]
let bike_image = tinytga::Tga::from_slice(data).expect("Failed to parse TGA image");
Self { Self {
target, target,
size: display_size, width,
height,
prev_state: ScreenState::Uninitialized, prev_state: ScreenState::Uninitialized,
hb_state: false, hb_state: false,
gnss_hb_state: false,
#[cfg(feature = "spat")]
bike_image,
} }
} }
@ -137,19 +115,18 @@ where
// Update indicator/ heartbeat // Update indicator/ heartbeat
{ {
let update_ind_dia = 10; let update_ind_dia = 10;
let circle_x_pos = let circle_x_pos = i32::from(self.width) - update_ind_dia - 10;
i32::from(self.size.width) - update_ind_dia - self.size.corner_radius;
text::Text::with_alignment( text::Text::with_alignment(
"HB", "HB",
geometry::Point::new(circle_x_pos - 5, 10 + self.size.offset_top), geometry::Point::new(circle_x_pos - 5, 10),
Self::SMALL_TEXT_STYLE, Self::SMALL_TEXT_STYLE,
text::Alignment::Right, text::Alignment::Right,
) )
.draw(&mut self.target)?; .draw(&mut self.target)?;
primitives::Circle::new( primitives::Circle::new(
geometry::Point::new(circle_x_pos, 2 + self.size.offset_top), geometry::Point::new(circle_x_pos, 2),
update_ind_dia.cast_unsigned(), update_ind_dia.cast_unsigned(),
) )
.into_styled(if self.hb_state { .into_styled(if self.hb_state {
@ -166,89 +143,13 @@ where
Ok(()) Ok(())
} }
// on big screns: uses full screen width and height from 250 to 280 pixels
#[cfg(feature = "gnss_ubx")]
pub fn update_gnss(
&mut self,
pvt: &ublox::nav_pvt::proto27::NavPvtRef,
) -> Result<(), D::Error> {
use alloc::string::ToString as _;
// this only applies to big screens
if !self.is_big_height() {
return Ok(());
}
let num_sat = pvt.num_satellites();
let fix_str = match pvt.fix_type() {
ublox::GnssFixType::NoFix
| ublox::GnssFixType::DeadReckoningOnly
| ublox::GnssFixType::TimeOnlyFix => {
alloc::format!("{num_sat:2} sat")
}
ublox::GnssFixType::Fix2D => "2D fix".to_string(),
ublox::GnssFixType::Fix3D | ublox::GnssFixType::GPSPlusDeadReckoning => {
"3D fix".to_string()
}
_ => " ".to_string(),
};
// clear area and write information
// note: text position is x baseline, not top left corner
primitives::Rectangle::new(
geometry::Point::new(0, 250 + self.size.offset_top),
geometry::Size::new(self.size.width.into(), 20),
)
.into_styled(Self::BK_STYLE)
.draw(&mut self.target)?;
let colon = if self.gnss_hb_state { ":" } else { " " };
let message = alloc::format!(
"{fix_str}{colon} {:2.0}km/h, {:3.0}°",
pvt.ground_speed_2d() * 3.6,
pvt.heading_motion()
);
text::Text::with_alignment(
&message,
geometry::Point::new(self.size.corner_radius / 2, 265 + self.size.offset_top),
Self::SMALL_TEXT_STYLE,
text::Alignment::Left,
)
.draw(&mut self.target)?;
self.gnss_hb_state = !self.gnss_hb_state;
Ok(())
}
/// Clears the screen, but keeps the GNSS status row
fn clear(&mut self) -> Result<(), D::Error> fn clear(&mut self) -> Result<(), D::Error>
where
D: DrawTarget<Color = pixelcolor::Rgb565>,
{
// this only differes from clear_all on big screens
if self.is_big_height() {
#[allow(clippy::cast_sign_loss)]
let max_y = (250 + self.size.offset_top) as u32;
primitives::Rectangle::new(
geometry::Point::new(0, 0),
geometry::Size::new(self.size.width.into(), max_y),
)
.into_styled(Self::BK_STYLE)
.draw(&mut self.target)
} else {
self.clear_all()
}
}
fn clear_all(&mut self) -> Result<(), D::Error>
where where
D: DrawTarget<Color = pixelcolor::Rgb565>, D: DrawTarget<Color = pixelcolor::Rgb565>,
{ {
primitives::Rectangle::new( primitives::Rectangle::new(
geometry::Point::new(0, 0), geometry::Point::new(0, 0),
geometry::Size::new(self.size.width.into(), self.size.height.into()), geometry::Size::new(self.width.into(), self.height.into()),
) )
.into_styled(Self::BK_STYLE) .into_styled(Self::BK_STYLE)
.draw(&mut self.target)?; .draw(&mut self.target)?;
@ -256,10 +157,6 @@ where
Ok(()) Ok(())
} }
fn is_big_height(&self) -> bool {
self.size.height > Self::BIG_HEIGHT_THLD
}
#[allow(unused)] #[allow(unused)]
pub fn test_img(&mut self) -> Result<(), D::Error> { pub fn test_img(&mut self) -> Result<(), D::Error> {
mipidsi::TestImage::new().draw(&mut self.target)?; mipidsi::TestImage::new().draw(&mut self.target)?;
@ -274,7 +171,7 @@ where
text::Text::with_alignment( text::Text::with_alignment(
msg, msg,
geometry::Point::new(i32::from(self.size.width) / 2, 40 + self.size.offset_top), geometry::Point::new(i32::from(self.width) / 2, 40),
Self::DEFAULT_TEXT_STYLE, Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center, text::Alignment::Center,
) )
@ -289,8 +186,8 @@ where
self.clear()?; self.clear()?;
text::Text::with_alignment( text::Text::with_alignment(
"Searching...", "No upcoming SPAT",
geometry::Point::new(i32::from(self.size.width) / 2, 130 + self.size.offset_top), geometry::Point::new(i32::from(self.width) / 2, 130),
Self::DEFAULT_TEXT_STYLE, Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center, text::Alignment::Center,
) )
@ -312,7 +209,7 @@ where
text::Text::with_alignment( text::Text::with_alignment(
&text, &text,
geometry::Point::new(i32::from(self.size.width) / 2, 130 + self.size.offset_top), geometry::Point::new(i32::from(self.width) / 2, 130),
Self::DEFAULT_TEXT_STYLE, Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center, text::Alignment::Center,
) )
@ -321,10 +218,7 @@ where
Ok(()) Ok(())
} }
// uses full screen width and height #[allow(unused)]
// - from 0 to 105+67 = 172 pixels for small screens
// - from 0 to 105+67+20 = 192 pixels for big screens
#[allow(unused, clippy::too_many_lines)]
fn draw_glosa( fn draw_glosa(
&mut self, &mut self,
data: &applogic::GlosaSignalInfo, data: &applogic::GlosaSignalInfo,
@ -332,39 +226,32 @@ where
) -> Result<(), D::Error> { ) -> Result<(), D::Error> {
let num_signals = data.signal_groups.len(); let num_signals = data.signal_groups.len();
let is_big_height = self.is_big_height();
if let Some(prev) = prev_data if let Some(prev) = prev_data
&& prev.signal_groups.len() != num_signals && prev.signal_groups.len() != num_signals
{ {
// clear everything if number of signals has changed // clear everything if number of signals has changed
self.clear(); self.clear();
} else { } else {
// only clear maneuver and timing area otherwise (lane type will clear itself) // only clear maneuver and timing area otherwise
let sig_total_height = 67 + if is_big_height { 20 } else { 0 };
primitives::Rectangle::new( primitives::Rectangle::new(
geometry::Point::new(0, 105 + self.size.offset_top), geometry::Point::new(0, 105),
geometry::Size::new(self.size.width.into(), sig_total_height), geometry::Size::new(self.width.into(), 67),
) )
.into_styled(Self::BK_STYLE) .into_styled(Self::BK_STYLE)
.draw(&mut self.target)?; .draw(&mut self.target)?;
} }
// do nothing more when no signals
if num_signals == 0 {
return Ok(());
}
// draw intersection ID // draw intersection ID
text::Text::new( text::Text::new(
&alloc::format!("#{}", data.intersection_id), &alloc::format!("#{}", data.intersection_id),
geometry::Point::new(self.size.corner_radius + 5, 10 + self.size.offset_top), geometry::Point::new(15, 10),
Self::SMALL_TEXT_STYLE, Self::SMALL_TEXT_STYLE,
) )
.draw(&mut self.target)?; .draw(&mut self.target)?;
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] #[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
let sig_width = i32::from(self.size.width) / (num_signals as i32); let sig_width = i32::from(self.width) / (num_signals as i32);
for (idx, sig) in data.signal_groups.iter().enumerate() { for (idx, sig) in data.signal_groups.iter().enumerate() {
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] #[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
@ -382,92 +269,35 @@ where
applogic::SignalPhase::RedYellow | applogic::SignalPhase::Yellow => Self::YE_STYLE, applogic::SignalPhase::RedYellow | applogic::SignalPhase::Yellow => Self::YE_STYLE,
}; };
primitives::Circle::new( primitives::Circle::new(
geometry::Point::new(offset + circle_margin, 15 + self.size.offset_top), geometry::Point::new(offset + circle_margin, 15),
circle_dia.cast_unsigned(), circle_dia.cast_unsigned(),
) )
.into_styled(style) .into_styled(style)
.draw(&mut self.target)?; .draw(&mut self.target)?;
// mark bike lanes which are not a vehicle lane, too // TODO: draw lane type?
let lane_symbol_y_pos = 75;
if sig.usages.contains(&applogic::v2x::map::UsageType::Vehicle) {
// clear area
primitives::Rectangle::new(
geometry::Point::new(
centerline - (45 / 2),
lane_symbol_y_pos + self.size.offset_top,
),
geometry::Size::new(45, 25),
)
.into_styled(Self::BK_STYLE)
.draw(&mut self.target)?;
} else if sig.usages.contains(&applogic::v2x::map::UsageType::Bike) {
// bike symbol (45x25px)
embedded_graphics::image::Image::new(
&self.bike_image,
geometry::Point::new(
centerline - (45 / 2) + 1,
lane_symbol_y_pos + self.size.offset_top,
),
)
.draw(&mut self.target)?;
} else {
text::Text::with_alignment(
"?",
geometry::Point::new(centerline, lane_symbol_y_pos + 24 + self.size.offset_top),
Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center,
)
.draw(&mut self.target)?;
}
// draw maneuver // draw maneuver
text::Text::with_alignment( text::Text::with_alignment(
&maneuver_to_str(sig.maneuver), &maneuver_to_str(sig.maneuver),
geometry::Point::new(centerline, 130 + self.size.offset_top), geometry::Point::new(centerline, 130),
Self::DEFAULT_TEXT_STYLE, Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center, text::Alignment::Center,
) )
.draw(&mut self.target)?; .draw(&mut self.target)?;
// draw timing indicator(s) // draw timing indicator
if let Some(timing) = &sig.timing { if let Some(end_sec) = sig.end_sec {
if let (Some(likely), Some(max)) = (timing.likely_end_sec, timing.max_end_sec) { text::Text::with_alignment(
text::Text::with_alignment( &alloc::format!("{end_sec}s"),
&alloc::format!("{likely}s"), geometry::Point::new(centerline, 160),
geometry::Point::new(centerline, 160 + self.size.offset_top), Self::DEFAULT_TEXT_STYLE,
Self::DEFAULT_TEXT_STYLE, text::Alignment::Center,
text::Alignment::Center, )
) .draw(&mut self.target)?;
.draw(&mut self.target)?;
// only for big screen
if is_big_height {
// TODO: show as diff to likely time?
text::Text::with_alignment(
&alloc::format!("{}-{max}", timing.min_end_sec),
geometry::Point::new(centerline, 185 + self.size.offset_top),
Self::MID_TEXT_STYLE,
text::Alignment::Center,
)
.draw(&mut self.target)?;
}
} else {
text::Text::with_alignment(
&alloc::format!("{}s", timing.min_end_sec),
geometry::Point::new(centerline, 160 + self.size.offset_top),
Self::DEFAULT_TEXT_STYLE,
text::Alignment::Center,
)
.draw(&mut self.target)?;
}
} }
} }
// if is_big_height {
// // TODO: Add ETA
// }
Ok(()) Ok(())
} }
@ -475,9 +305,9 @@ where
fn draw_slash_screen(&mut self) -> Result<(), D::Error> { fn draw_slash_screen(&mut self) -> Result<(), D::Error> {
let text_style = mono_font::MonoTextStyle::new(&profont::PROFONT_18_POINT, Self::COLOR_FG); let text_style = mono_font::MonoTextStyle::new(&profont::PROFONT_18_POINT, Self::COLOR_FG);
self.clear_all()?; self.clear()?;
let sig_width = i32::from(self.size.width) / 3; let sig_width = i32::from(self.width) / 3;
let circle_dia = 50; let circle_dia = 50;
let circle_margin = (sig_width - circle_dia) / 2; let circle_margin = (sig_width - circle_dia) / 2;
@ -489,7 +319,7 @@ where
let offset = (idx as i32) * sig_width; let offset = (idx as i32) * sig_width;
primitives::Circle::new( primitives::Circle::new(
geometry::Point::new(offset + circle_margin, 15 + self.size.offset_top), geometry::Point::new(offset + circle_margin, 15),
circle_dia.cast_unsigned(), circle_dia.cast_unsigned(),
) )
.into_styled(*style) .into_styled(*style)
@ -497,17 +327,10 @@ where
} }
// draw welcome text // draw welcome text
let centerline = i32::from(self.size.width) / 2; let centerline = i32::from(self.width) / 2;
embedded_graphics::image::Image::new(
&self.bike_image,
geometry::Point::new(centerline - (45 / 2) + 1, 75 + self.size.offset_top),
)
.draw(&mut self.target)?;
text::Text::with_alignment( text::Text::with_alignment(
"C-ITS Signal Phase\nWaiting for GNSS...", "C-ITS Signal Phase Display\nWaiting for GNSS fix...",
geometry::Point::new(centerline, 130 + self.size.offset_top), geometry::Point::new(centerline, 130),
text_style, text_style,
text::Alignment::Center, text::Alignment::Center,
) )
@ -530,7 +353,7 @@ fn maneuver_to_str(value: applogic::v2x::map::Maneuvers) -> alloc::string::Strin
/// ///
/// # Errors /// # Errors
/// Human-readable fatal errors /// Human-readable fatal errors
#[allow(unused, clippy::too_many_arguments, clippy::type_complexity)] #[allow(clippy::too_many_arguments, clippy::type_complexity)]
pub fn make_small_display<IoScl, IoSda, IoRes, IoDc, IoCs, IoBl, Spi>( pub fn make_small_display<IoScl, IoSda, IoRes, IoDc, IoCs, IoBl, Spi>(
scl: IoScl, scl: IoScl,
sda: IoSda, sda: IoSda,
@ -555,7 +378,8 @@ pub fn make_small_display<IoScl, IoSda, IoRes, IoDc, IoCs, IoBl, Spi>(
mipidsi::models::ST7789, mipidsi::models::ST7789,
esp_hal::gpio::Output<'_>, esp_hal::gpio::Output<'_>,
>, >,
DisplaySize, u16,
u16,
), ),
alloc::string::String, alloc::string::String,
> >
@ -572,15 +396,10 @@ where
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static, esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
Spi: esp_hal::spi::master::Instance + 'static, Spi: esp_hal::spi::master::Instance + 'static,
{ {
const DISPLAY_WIDTH: u16 = 320;
const DISPLAY_HEIGHT: u16 = 172;
const DISPLAY_HIDDEN_X: u16 = 34; // somehow this display has 34 px of invisible space on the left (in native orientation) const DISPLAY_HIDDEN_X: u16 = 34; // somehow this display has 34 px of invisible space on the left (in native orientation)
let size = DisplaySize {
width: 320,
height: 172,
offset_top: 0,
corner_radius: 10,
};
let (spi, cs) = setup_st7789_spi(scl, sda, cs, spi) let (spi, cs) = setup_st7789_spi(scl, sda, cs, spi)
.map_err(|err| alloc::format!("Failed to build SPI config: {err}"))?; .map_err(|err| alloc::format!("Failed to build SPI config: {err}"))?;
@ -594,101 +413,18 @@ where
let spi_device = embedded_hal_bus::spi::ExclusiveDevice::new_no_delay(spi, cs) let spi_device = embedded_hal_bus::spi::ExclusiveDevice::new_no_delay(spi, cs)
.map_err(|err| alloc::format!("Failed to initialize SPI device: {err}"))?; .map_err(|err| alloc::format!("Failed to initialize SPI device: {err}"))?;
// Note: height and width are swapped b/c of 90° display rotation
let display = mipidsi::Builder::new( let display = mipidsi::Builder::new(
mipidsi::models::ST7789, mipidsi::models::ST7789,
mipidsi::interface::SpiInterface::new(spi_device, dc_output, spi_buffer), mipidsi::interface::SpiInterface::new(spi_device, dc_output, spi_buffer),
) )
.display_size(size.height + DISPLAY_HIDDEN_X, size.width) .display_size(DISPLAY_HEIGHT + DISPLAY_HIDDEN_X, DISPLAY_WIDTH)
.reset_pin(rst_output) .reset_pin(rst_output)
.invert_colors(mipidsi::options::ColorInversion::Inverted) .invert_colors(mipidsi::options::ColorInversion::Inverted)
.orientation(mipidsi::options::Orientation::new().rotate(mipidsi::options::Rotation::Deg90)) .orientation(mipidsi::options::Orientation::new().rotate(mipidsi::options::Rotation::Deg90))
.init(&mut display_delay) .init(&mut display_delay)
.map_err(|err| alloc::format!("Failed to initialize display: {err:?}"))?; .map_err(|err| alloc::format!("Failed to initialize display: {err:?}"))?;
Ok((display, size)) Ok((display, DISPLAY_WIDTH, DISPLAY_HEIGHT))
}
/// Creates an [`mipidsi::Display`], width, height tuple for an ST7789 240*280px screen in portrait orientation
///
/// # Errors
/// Human-readable fatal errors
#[allow(unused, clippy::too_many_arguments, clippy::type_complexity)]
pub fn make_large_display<IoScl, IoSda, IoRes, IoDc, IoCs, IoBl, Spi>(
scl: IoScl,
sda: IoSda,
res: IoRes,
dc: IoDc,
cs: IoCs,
bl: IoBl,
spi: Spi,
spi_buffer: &mut [u8],
) -> Result<
(
mipidsi::Display<
mipidsi::interface::SpiInterface<
'_,
embedded_hal_bus::spi::ExclusiveDevice<
esp_hal::spi::master::Spi<'_, esp_hal::Blocking>,
esp_hal::gpio::Output<'_>,
embedded_hal_bus::spi::NoDelay,
>,
esp_hal::gpio::Output<'_>,
>,
mipidsi::models::ST7789,
esp_hal::gpio::Output<'_>,
>,
DisplaySize,
),
alloc::string::String,
>
where
IoScl: esp_hal::gpio::interconnect::PeripheralOutput<'static>,
IoSda: esp_hal::gpio::interconnect::PeripheralOutput<'static>,
IoRes:
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
IoDc:
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
IoCs:
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
IoBl:
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
Spi: esp_hal::spi::master::Instance + 'static,
{
const DISPLAY_HIDDEN_Y: u16 = 20; // somehow this display has 20 px of invisible space on the top (in native orientation)
let size = DisplaySize {
width: 240,
height: 280 + DISPLAY_HIDDEN_Y,
offset_top: DISPLAY_HIDDEN_Y.into(),
corner_radius: 30,
};
let (spi, cs) = setup_st7789_spi(scl, sda, cs, spi)
.map_err(|err| alloc::format!("Failed to build SPI config: {err}"))?;
let output_config = esp_hal::gpio::OutputConfig::default();
let dc_output = esp_hal::gpio::Output::new(dc, esp_hal::gpio::Level::Low, output_config);
let rst_output = esp_hal::gpio::Output::new(res, esp_hal::gpio::Level::High, output_config);
let _ = esp_hal::gpio::Output::new(bl, esp_hal::gpio::Level::High, output_config); // enable backlight
let mut display_delay = esp_hal::delay::Delay::new();
let spi_device = embedded_hal_bus::spi::ExclusiveDevice::new_no_delay(spi, cs)
.map_err(|err| alloc::format!("Failed to initialize SPI device: {err}"))?;
let display = mipidsi::Builder::new(
mipidsi::models::ST7789,
mipidsi::interface::SpiInterface::new(spi_device, dc_output, spi_buffer),
)
.display_size(size.width, size.height + DISPLAY_HIDDEN_Y)
.reset_pin(rst_output)
.invert_colors(mipidsi::options::ColorInversion::Inverted)
.orientation(mipidsi::options::Orientation::new().rotate(mipidsi::options::Rotation::Deg0))
.init(&mut display_delay)
.map_err(|err| alloc::format!("Failed to initialize display: {err:?}"))?;
Ok((display, size))
} }
/// Builds the SPI interface for the ST7789 display /// Builds the SPI interface for the ST7789 display

96
src/test-proto.rs Normal file
View file

@ -0,0 +1,96 @@
#![cfg(not(target_arch = "riscv32"))]
#![allow(unused)]
extern crate alloc;
mod applogic;
mod io;
use esp32_cits_core::tx;
fn main() {
use prost::Message as _;
// env_logger::init();
// generate some test UART messages as hex strings
let raw_its = input_from_raw(io::msg::RawMsgTx {
payload: [0xaa, 0xbb, 0xcc, 0xdd].to_vec(),
message_type: 1,
gn_transport: io::msg::GnTransport::Shb.into(),
gn_area: io::msg::GnArea {
area: None,
position: None,
dist_a: None,
dist_b: None,
angle: None,
},
hop_limit: 2,
station_type: None,
});
println!("{}", serialize_serial_msg_hex(&raw_its));
let pos = io::msg::PositionState {
timestamp_ms: 1785144196000,
position: io::msg::Position {
latitude_deg: 42.,
longitude_deg: 23.,
},
heading: None,
speed: None,
};
println!("{}", serialize_serial_msg_hex(&input_from_position(pos)));
// generate test BLE message as hex strings
println!("{}", buf_to_hex(&pos.encode_to_vec()));
}
fn input_from_raw(value: io::msg::RawMsgTx) -> io::msg::SerialInputMsg {
use io::msg::serial_input_msg::Payload;
io::msg::SerialInputMsg {
payload: Some(Payload::TxMsg(value)),
}
}
fn input_from_position(value: io::msg::PositionState) -> io::msg::SerialInputMsg {
use io::msg::serial_input_msg::Payload;
io::msg::SerialInputMsg {
payload: Some(Payload::Position(value)),
}
}
pub(crate) fn serialize_serial_msg_hex(msg: &io::msg::SerialInputMsg) -> alloc::string::String {
use prost::Message as _;
let mut msg_buf = msg.encode_to_vec();
let sof = [0x56u8, 0x32, 0x58, 0x2B];
let eof = [0x0du8, 0x0a];
let len: [u8; 2] = (msg_buf.len() as u16).to_be_bytes();
let mut out = sof.to_vec();
out.extend_from_slice(&len);
out.append(&mut msg_buf);
out.extend_from_slice(&eof);
buf_to_hex(&out)
}
pub(crate) fn buf_to_hex(data: &[u8]) -> alloc::string::String {
let mut hex_str = alloc::string::String::default();
for c in data {
hex_str.push_str(format!("{c:02x}").as_str());
}
hex_str
}
// /// Initializes the env-logger to be used inside tests
// fn init_test_env_logger() {
// let _ = env_logger::builder()
// .format_timestamp(None)
// .filter_level(log::LevelFilter::Debug)
// .is_test(true)
// .try_init();
// }