Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bfccf7f22 | ||
| db4dffa7b3 |
63 changed files with 270 additions and 123678 deletions
|
|
@ -1,2 +1,2 @@
|
|||
stack-size-threshold = 1024
|
||||
doc-valid-idents = ["WiFi", "GeoNetworking", "QoS", ".."]
|
||||
doc-valid-idents = ["WiFi", ".."]
|
||||
|
|
|
|||
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -24,7 +24,3 @@ target/
|
|||
|
||||
# Ignore .DS_Store file in mac
|
||||
**/.DS_Store
|
||||
|
||||
# Ignore KiCad backups and lock files
|
||||
hardware/c_its-companion/c_its-companion-backups/
|
||||
*.kicad_pro.lck
|
||||
|
|
|
|||
623
Cargo.lock
generated
623
Cargo.lock
generated
|
|
@ -17,92 +17,24 @@ version = "0.3.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c583acf993cf4245c4acb0a2cc2ab1f9cc097de73411bb6d3647ff6af2b1013d"
|
||||
|
||||
[[package]]
|
||||
name = "anstream"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-parse",
|
||||
"anstyle-query",
|
||||
"anstyle-wincon",
|
||||
"colorchoice",
|
||||
"is_terminal_polyfill",
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-parse"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
||||
dependencies = [
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-query"
|
||||
version = "1.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
|
||||
dependencies = [
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-wincon"
|
||||
version = "3.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"once_cell_polyfill",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
|
||||
[[package]]
|
||||
name = "arbitrary-int"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "993a810118f8f37e9c4411c86f1c4c940a09a7ab34b7bf2d88d06f50c553fab7"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
|
||||
|
||||
[[package]]
|
||||
name = "assert_float_eq"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd9777fd8234cccd34019d9e26d70c8247f9baf24c8fdc0b56c548cf943af2ed"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
||||
|
||||
[[package]]
|
||||
name = "az"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.13.1"
|
||||
|
|
@ -137,9 +69,9 @@ checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
|||
|
||||
[[package]]
|
||||
name = "bitvec"
|
||||
version = "1.1.1"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837"
|
||||
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
|
||||
dependencies = [
|
||||
"funty",
|
||||
"radium",
|
||||
|
|
@ -166,29 +98,6 @@ dependencies = [
|
|||
"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]]
|
||||
name = "bumpalo"
|
||||
version = "3.20.2"
|
||||
|
|
@ -215,9 +124,8 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
|||
|
||||
[[package]]
|
||||
name = "c-its-parser"
|
||||
version = "2.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7e94d9990b20498f621f164f23ae198c4365115eb4191ae106352ec74d4a4110"
|
||||
version = "2.1.0"
|
||||
source = "git+https://github.com/consider-it/C-ITS-Parser.git?branch=feat%2Frasn-tweaks#f3208f5d2d1e14265809c652ce62d0668d1f3af6"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"etherparse",
|
||||
|
|
@ -255,27 +163,12 @@ dependencies = [
|
|||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
||||
|
||||
[[package]]
|
||||
name = "const-default"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "cordyceps"
|
||||
version = "0.3.4"
|
||||
|
|
@ -624,21 +517,6 @@ dependencies = [
|
|||
"heapless 0.9.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embassy_gps"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/jbeyerstedt/embassy_gps.git?branch=feat%2Frework-gpsfix#75f1a67a69372234330c0c9618a953c415380b99"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"embassy-futures",
|
||||
"embassy-time",
|
||||
"embedded-io-async 0.7.0",
|
||||
"esp-hal",
|
||||
"heapless 0.9.2",
|
||||
"log",
|
||||
"nmea",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-can"
|
||||
version = "0.4.1"
|
||||
|
|
@ -648,29 +526,6 @@ dependencies = [
|
|||
"nb 1.1.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-graphics"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e8da660bb0c829b34a56a965490597f82a55e767b91f9543be80ce8ccb416fe"
|
||||
dependencies = [
|
||||
"az",
|
||||
"byteorder",
|
||||
"embedded-graphics-core",
|
||||
"float-cmp",
|
||||
"micromath",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-graphics-core"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95743bef3ff70fcba3930246c4e6872882bbea0dcc6da2ca860112e0cd4bd09f"
|
||||
dependencies = [
|
||||
"az",
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-hal"
|
||||
version = "0.2.7"
|
||||
|
|
@ -696,16 +551,6 @@ dependencies = [
|
|||
"embedded-hal 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-hal-bus"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "513e0b3a8fb7d3013a8ae17a834283f170deaf7d0eeab0a7c1a36ad4dd356d22"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
"embedded-hal 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-io"
|
||||
version = "0.6.1"
|
||||
|
|
@ -772,45 +617,12 @@ dependencies = [
|
|||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "env_filter"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
|
||||
dependencies = [
|
||||
"log",
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "env_logger"
|
||||
version = "0.11.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
"env_filter",
|
||||
"jiff",
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "esp-alloc"
|
||||
version = "0.10.0"
|
||||
|
|
@ -988,7 +800,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "23fbff98b06a96b6ce3791ecec5c668524052a068e23aacd23afe17ddba844ce"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"bt-hci",
|
||||
"cfg-if",
|
||||
"docsplay",
|
||||
"document-features",
|
||||
|
|
@ -1184,22 +995,13 @@ dependencies = [
|
|||
name = "esp32-c_its-companion"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"assert_float_eq",
|
||||
"bt-hci",
|
||||
"c-its-parser",
|
||||
"chrono",
|
||||
"critical-section",
|
||||
"crossbeam-queue",
|
||||
"embassy-executor",
|
||||
"embassy-futures",
|
||||
"embassy-sync 0.7.2",
|
||||
"embassy-time",
|
||||
"embassy_gps",
|
||||
"embedded-graphics",
|
||||
"embedded-hal-bus",
|
||||
"embedded-io 0.7.1",
|
||||
"embedded-io-async 0.7.0",
|
||||
"env_logger",
|
||||
"esp-alloc",
|
||||
"esp-backtrace",
|
||||
"esp-bootloader-esp-idf",
|
||||
|
|
@ -1207,30 +1009,7 @@ dependencies = [
|
|||
"esp-println",
|
||||
"esp-radio",
|
||||
"esp-rtos",
|
||||
"esp32-cits-core",
|
||||
"geo-types",
|
||||
"log",
|
||||
"mipidsi",
|
||||
"num-traits",
|
||||
"profont",
|
||||
"prost",
|
||||
"prost-build",
|
||||
"static_cell",
|
||||
"tinytga",
|
||||
"trouble-host",
|
||||
"ublox",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "esp32-cits-core"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.hamburg.ccc.de/jtbx/esp32-cits-core?branch=main#a6d0ea6ca2da130fde2b84060a34ef45e772a459"
|
||||
dependencies = [
|
||||
"c-its-parser",
|
||||
"chrono",
|
||||
"esp-hal",
|
||||
"esp-radio",
|
||||
"geo-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1298,40 +1077,19 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "etherparse"
|
||||
version = "0.21.0"
|
||||
version = "0.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17304d06addb3283cdc4bd528e42dd95e73c8ee2d6492ffce415e93660885449"
|
||||
checksum = "3ac016aaf11dfe643edcd088a166234bfcb72e7f06691abfcf21e9af524037f4"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
|
||||
|
||||
[[package]]
|
||||
name = "find-msvc-tools"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
||||
|
||||
[[package]]
|
||||
name = "fixedbitset"
|
||||
version = "0.5.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
|
||||
|
||||
[[package]]
|
||||
name = "float-cmp"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fnv"
|
||||
version = "1.0.7"
|
||||
|
|
@ -1359,52 +1117,12 @@ version = "2.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "futures-core"
|
||||
version = "0.3.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "futures-sink"
|
||||
version = "0.3.32"
|
||||
|
|
@ -1424,10 +1142,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"pin-project-lite",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1472,11 +1188,13 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "geonetworking"
|
||||
version = "0.4.0"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6da6fde770112587d5f5f7af439546e35bd35aa77a9e3e47e9968056783fe50d"
|
||||
checksum = "ea4f48e7b1cdf91ad77ec1e4c5617aee3666a929288f4a3f11e473b67d3a6314"
|
||||
dependencies = [
|
||||
"arbitrary-int",
|
||||
"bitvec",
|
||||
"bitvec-nom2",
|
||||
"bytes",
|
||||
"nom",
|
||||
"num",
|
||||
"num-traits",
|
||||
|
|
@ -1597,12 +1315,6 @@ dependencies = [
|
|||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is_terminal_polyfill"
|
||||
version = "1.70.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.13.0"
|
||||
|
|
@ -1642,18 +1354,6 @@ dependencies = [
|
|||
"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]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
|
|
@ -1684,27 +1384,12 @@ version = "0.10.6"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b23ac50abb8261cb38c6e2a7192d3302e0836dac1628f6a93b82b4fad185897"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
|
||||
|
||||
[[package]]
|
||||
name = "litrs"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "log"
|
||||
version = "0.4.29"
|
||||
|
|
@ -1739,35 +1424,12 @@ version = "2.8.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
||||
|
||||
[[package]]
|
||||
name = "micromath"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "mipidsi"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "790ebd28bd67addbccf41b1c0c188c26bb9f5bdcd91d4d6da9bd558e20d97a1d"
|
||||
dependencies = [
|
||||
"embedded-graphics-core",
|
||||
"embedded-hal 1.0.0",
|
||||
"heapless 0.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "multimap"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
|
||||
|
||||
[[package]]
|
||||
name = "nb"
|
||||
version = "0.1.3"
|
||||
|
|
@ -1783,20 +1445,6 @@ version = "1.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
|
||||
|
||||
[[package]]
|
||||
name = "nmea"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2086c773d18da556c05ca235596d163c00379027189bafe2209ae40ebd19717c"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"cfg-if",
|
||||
"chrono",
|
||||
"heapless 0.8.0",
|
||||
"nom",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
|
|
@ -1914,29 +1562,12 @@ version = "1.21.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell_polyfill"
|
||||
version = "1.70.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
|
||||
|
||||
[[package]]
|
||||
name = "petgraph"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
|
||||
dependencies = [
|
||||
"fixedbitset",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.17"
|
||||
|
|
@ -2007,66 +1638,6 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "profont"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "016681370a9dd6e7ddb4c1a959922fd59dc45e5ebaa5ff5b13090267898ced34"
|
||||
dependencies = [
|
||||
"embedded-graphics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prost"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"prost-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prost-build"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"itertools",
|
||||
"log",
|
||||
"multimap",
|
||||
"petgraph",
|
||||
"prettyplease",
|
||||
"prost",
|
||||
"prost-types",
|
||||
"regex",
|
||||
"syn 2.0.117",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prost-derive"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"itertools",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prost-types"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a"
|
||||
dependencies = [
|
||||
"prost",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
|
|
@ -2109,8 +1680,7 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
|
|||
[[package]]
|
||||
name = "rasn"
|
||||
version = "0.28.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88235e585f2f3fc26ad809c79a84dd77e6a7203eb7d12e5bcaab89fc036d3d90"
|
||||
source = "git+https://github.com/consider-it/rasn.git?branch=feat%2Ffeature-flags#2f7833af4339cac3be1775c2cd262e735f5e8ad0"
|
||||
dependencies = [
|
||||
"bitvec",
|
||||
"bitvec-nom2",
|
||||
|
|
@ -2124,7 +1694,6 @@ dependencies = [
|
|||
"num-traits",
|
||||
"once_cell",
|
||||
"rasn-derive",
|
||||
"serde_json",
|
||||
"snafu",
|
||||
"xml-no-std",
|
||||
]
|
||||
|
|
@ -2132,8 +1701,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rasn-derive"
|
||||
version = "0.28.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11dcd4dab09ceadedb3e2bedf340deb583f0e25bba9ad966b5655c2fb62b1392"
|
||||
source = "git+https://github.com/consider-it/rasn.git?branch=feat%2Ffeature-flags#2f7833af4339cac3be1775c2cd262e735f5e8ad0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"rasn-derive-impl",
|
||||
|
|
@ -2143,8 +1711,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "rasn-derive-impl"
|
||||
version = "0.28.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f121c276d3f2fba8caabc870288de3f81abdb0bb94d5510651e58e1e00a7b9e7"
|
||||
source = "git+https://github.com/consider-it/rasn.git?branch=feat%2Ffeature-flags#2f7833af4339cac3be1775c2cd262e735f5e8ad0"
|
||||
dependencies = [
|
||||
"either",
|
||||
"itertools",
|
||||
|
|
@ -2154,18 +1721,6 @@ dependencies = [
|
|||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
|
|
@ -2179,9 +1734,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.11"
|
||||
version = "0.8.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
|
||||
[[package]]
|
||||
name = "riscv"
|
||||
|
|
@ -2255,19 +1810,6 @@ dependencies = [
|
|||
"svgbobdoc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
|
|
@ -2286,12 +1828,6 @@ version = "1.0.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.28"
|
||||
|
|
@ -2369,12 +1905,6 @@ version = "1.3.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
|
|
@ -2423,15 +1953,6 @@ version = "1.2.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "strsim"
|
||||
version = "0.11.1"
|
||||
|
|
@ -2500,18 +2021,6 @@ version = "1.0.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.27.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.4.1"
|
||||
|
|
@ -2530,16 +2039,6 @@ dependencies = [
|
|||
"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]]
|
||||
name = "toml_datetime"
|
||||
version = "1.1.1+spec-1.1.0"
|
||||
|
|
@ -2631,68 +2130,12 @@ dependencies = [
|
|||
"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]]
|
||||
name = "typenum"
|
||||
version = "1.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
|
||||
|
||||
[[package]]
|
||||
name = "ublox"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5bcc96bd937066775fb87034e1dbf6d7165a8975c74ddec1105e31b4a050538b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"chrono",
|
||||
"num-traits",
|
||||
"ublox_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ublox_derive"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f5eda7d1c1151a40ae85c7c065a19959909573535034e18e1015b738993cd2c0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ufmt-write"
|
||||
version = "0.1.0"
|
||||
|
|
@ -2705,12 +2148,6 @@ version = "1.0.24"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.14"
|
||||
|
|
@ -2729,12 +2166,6 @@ version = "0.2.11"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
|
|
@ -2742,8 +2173,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3049,26 +2478,6 @@ dependencies = [
|
|||
"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]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
|
|
|
|||
119
Cargo.toml
119
Cargo.toml
|
|
@ -3,135 +3,56 @@ edition = "2024"
|
|||
name = "esp32-c_its-companion"
|
||||
rust-version = "1.88"
|
||||
version = "0.1.0"
|
||||
default-run = "esp32-c_its-companion"
|
||||
|
||||
[[bin]]
|
||||
name = "esp32-c_its-companion"
|
||||
path = "./src/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "test"
|
||||
path = "./src/test.rs"
|
||||
required-features = ["std", "cam"]
|
||||
|
||||
[features]
|
||||
default = ["esp", "spat", "gnss_ubx", "screen"]
|
||||
|
||||
# build for ESP (needed to build test for `host-tuple`)
|
||||
esp = [
|
||||
"dep:esp-hal",
|
||||
"dep:esp-rtos",
|
||||
"dep:esp-bootloader-esp-idf",
|
||||
"dep:embassy-executor",
|
||||
"dep:embassy-futures",
|
||||
"dep:embassy-sync",
|
||||
"dep:embassy-time",
|
||||
"dep:embedded-io",
|
||||
"dep:embedded-io-async",
|
||||
"dep:esp-alloc",
|
||||
"dep:esp-backtrace",
|
||||
"dep:esp-println",
|
||||
"dep:esp-radio",
|
||||
"dep:bt-hci",
|
||||
"esp32-cits-core/esp32c5",
|
||||
"esp32-cits-core/log-04",
|
||||
]
|
||||
std = ["c-its-parser/std", "esp32-cits-core/std"]
|
||||
|
||||
# enable u-blox GNSS module
|
||||
gnss_ubx = ["_gnss", "_uart", "dep:ublox"]
|
||||
# enable L67K GNSS module
|
||||
gnss_l67k = ["_gnss", "dep:embassy_gps"]
|
||||
# echo CAM data on serial
|
||||
cam = ["c-its-parser/cam"]
|
||||
# send CAM autonomously
|
||||
cam_tx = ["c-its-parser/cam"]
|
||||
# echo DENM events on serial and BLE
|
||||
denm = ["c-its-parser/denm"]
|
||||
# evaluate SPAT information
|
||||
spat = ["c-its-parser/spatem", "c-its-parser/mapem"]
|
||||
# enable some debug printing (without enabling debug logging of the ESP RTOS)
|
||||
spat_debug = []
|
||||
# enable ST7789 based display
|
||||
screen = ["dep:mipidsi", "dep:embedded-graphics", "dep:embedded-hal-bus", "dep:profont", "dep:tinytga"]
|
||||
# enable I/O via UART
|
||||
uart = ["_uart", "_gnss"]
|
||||
# enable I/O via BLE
|
||||
ble = ["_gnss"]
|
||||
|
||||
# internal feature, that any UART I/O is enabled
|
||||
_uart = []
|
||||
# internal feature, that any GNSS source is enabled
|
||||
_gnss = []
|
||||
|
||||
[dependencies]
|
||||
esp-hal = { version = "~1.1.0", optional = true, features = ["esp32c5", "log-04", "unstable"] }
|
||||
esp-hal = { version = "~1.1.0", features = ["esp32c5", "log-04", "unstable"] }
|
||||
|
||||
esp-rtos = { version = "0.3.0", optional = true, features = [
|
||||
esp-rtos = { version = "0.3.0", features = [
|
||||
"embassy",
|
||||
"esp-alloc",
|
||||
"esp-radio",
|
||||
"embassy",
|
||||
"esp32c5",
|
||||
"log-04",
|
||||
] }
|
||||
|
||||
esp-bootloader-esp-idf = { version = "0.5.0", optional = true, features = ["esp32c5", "log-04"] }
|
||||
esp-bootloader-esp-idf = { version = "0.5.0", features = ["esp32c5", "log-04"] }
|
||||
log = "0.4.27"
|
||||
|
||||
critical-section = "1.2.0"
|
||||
bt-hci = { version = "0.8.0", optional = true }
|
||||
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"] }
|
||||
embedded-io = { version = "0.7.1", optional = true }
|
||||
embedded-io-async = { version = "0.7.0", optional = true }
|
||||
esp-alloc = { version = "0.10.0", optional = true }
|
||||
esp-backtrace = { version = "0.19.0", optional = true, features = [
|
||||
embassy-executor = { version = "0.10.0", features = ["log"] }
|
||||
embassy-time = { version = "0.5.0", features = ["log"] }
|
||||
embedded-io = "0.7.1"
|
||||
embedded-io-async = "0.7.0"
|
||||
esp-alloc = "0.10.0"
|
||||
esp-backtrace = { version = "0.19.0", features = [
|
||||
"esp32c5",
|
||||
"panic-handler",
|
||||
"println",
|
||||
] }
|
||||
esp-println = { version = "0.17.0", optional = true, default-features = false, features = ["colors", "critical-section", "jtag-serial", "esp32c5", "log-04"] }
|
||||
esp-radio = { version = "0.18.0", optional = true, features = [
|
||||
esp-println = { version = "0.17.0", features = ["esp32c5", "log-04"] }
|
||||
esp-radio = { version = "0.18.0", features = [
|
||||
"esp-alloc",
|
||||
"esp32c5",
|
||||
"log-04",
|
||||
"unstable",
|
||||
"wifi",
|
||||
"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" }
|
||||
esp32-cits-core = { version = "0.1.0", default-features = false, git = "https://git.hamburg.ccc.de/jtbx/esp32-cits-core", branch = "main" }
|
||||
embedded-hal-bus = { version = "0.3.0", optional = true }
|
||||
embedded-graphics = { version = "0.8.2", optional = true }
|
||||
# needs newer GN with removed bitvec dependency
|
||||
c-its-parser = { version = "2.4.0", default-features = false, features = [
|
||||
c-its-parser = { version = "2.1.0", git = "https://github.com/consider-it/C-ITS-Parser.git", branch = "feat/rasn-tweaks", default-features = false, features = [
|
||||
"time",
|
||||
"geo",
|
||||
"libm",
|
||||
"transport",
|
||||
"mapem",
|
||||
"spatem",
|
||||
"cam", # TODO: for initial setup only
|
||||
] }
|
||||
chrono = { version = "0.4.44", default-features = false, features = ["alloc"] }
|
||||
crossbeam-queue = { version = "0.3.12", default-features = false, features = ["alloc"] }
|
||||
geo-types = { version = "0.7.19", default-features = false }
|
||||
mipidsi = { version = "0.10.0", optional = true }
|
||||
num-traits = { version = "0.2.19", default-features = false, features = ["libm"] }
|
||||
profont = { version = "0.7.0", optional = true }
|
||||
prost = { version = "0.14", 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"] }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_float_eq = "1.2.0"
|
||||
env_logger = "0.11.10"
|
||||
|
||||
[build-dependencies]
|
||||
prost-build = "0.14"
|
||||
|
||||
|
||||
# For fine tuning these settings, please refer to https://doc.rust-lang.org/cargo/reference/profiles.html
|
||||
|
|
@ -147,6 +68,14 @@ lto = 'fat'
|
|||
opt-level = 's'
|
||||
strip = "debuginfo"
|
||||
|
||||
## cargo build --release && espflash save-image --chip esp32c5 target/riscv32imac-unknown-none-elf/release/esp32-c_its-companion out.bin
|
||||
# default rasn, debug 2, strip default: 1,904,496 byte
|
||||
# default rasn, debug 2, strip true: 1,904,592 byte
|
||||
# default rasn, debug default, strip default: 1,905,312 byte
|
||||
# only UPER, debug 2, strip default: 1,229,840 byte
|
||||
# only UPER, debug 2, strip true: 1,229,760 byte
|
||||
# only UPER, debug default, strip default: 1,231,136 byte
|
||||
|
||||
[profile.release-dbg]
|
||||
inherits = "release"
|
||||
strip = false
|
||||
|
|
|
|||
107
Readme.md
107
Readme.md
|
|
@ -1,68 +1,7 @@
|
|||
# ESP32-C5 C-ITS Companion/ Visualizer
|
||||
# ESP32-C5 C-ITS Visualizer
|
||||
|
||||
Displays different C-ITS receive-only use cases for cheap.
|
||||
|
||||
## Hardware Requirements
|
||||
The code is currently tailored to:
|
||||
- Seeed XIAO ESP32-C5 (8MB PSRAM)
|
||||
- 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))
|
||||
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))
|
||||
only available with `screen` feature (which is included in `spat` feature)
|
||||
|
||||
## Features
|
||||
|
||||
### GNSS
|
||||
Enable u-blox or L67K GNSS module and in main application logic/ state.
|
||||
|
||||
### SPAT
|
||||
Takes the current position and heading from the GNSS receiver and displays the signal phases of the upcoming intersection.
|
||||
The upcoming intersection is selected when the own position is "inside" some ingress approach of the intersection.
|
||||
The display will show the current phase and remaining time for all signal groups of the bike-able lanes in the approach.
|
||||
|
||||
### DENM
|
||||
TODO: Not implemented yet!
|
||||
|
||||
Shall "publish" the most relevant information of a DENMs via BLE
|
||||
|
||||
### CAM
|
||||
Just prints a line for each received CAM.
|
||||
|
||||
### CAM-TX
|
||||
Generates and transmits a CAM when a GNSS update was received.
|
||||
Depends on the `gnss` feature.
|
||||
|
||||
Note: In germany, using the 5875 to 5915 MHz frequency band is only permitted for C-ITS use cases which implement transmit power reduction measures with at least 30 dB reduction range (or equivalent measures) and have a maximum EIRP of 33 dBm.
|
||||
This is based on EU regulation 2014/53/EU, so it applies to other EU countries in similar ways.
|
||||
The relevant harmonized standard is ETSI EN 302 571 which mandates (excerpt of most relevant points):
|
||||
|
||||
- a maximum power spectral density of 23 dBm/Mhz EIRP
|
||||
- transmit power control (TCP) in a range from 3 dBm up to the maximum output power of the equipment
|
||||
* used for CEN DSRC and HDR DSRC interference mitigation by implementing measures from ETSI TS 102 792
|
||||
+ Mode A or B: Output power less than 10 dBm EIRP and less than -65 or -45 dBm/MHz EIRP in CEN DSRC band -> **needs to be measured**
|
||||
+ Mode C: Maximum transmission time of less than 1 ms and at least a few 100 ms between transmission (realistically) -> **can't be ensured with big messages**
|
||||
+ Mode D: "any" realistically possible transmission time, but at least 500 ms between transmissions for ~5 ITS stations/ 1000ms for 10 ITS stations -> **safe to assume when we only send CAMs at 1 Hz**
|
||||
+ But modes C and D also need to:
|
||||
- use protected zone information from CAM messages
|
||||
- use a protected zone database, e.g. from www.asecap-pzdb.com
|
||||
* used for dynamic congestion control (DCC)
|
||||
+ mandatory mechanism described in ETSI EN 302 571, chapter 4.2.10
|
||||
|
||||
This is **not** implemented in this application!
|
||||
**So legally, you're not allowed to send with this.**
|
||||
|
||||
### UART
|
||||
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
|
||||
|
||||
### Toolchain Installation
|
||||
|
|
@ -77,7 +16,7 @@ rustup target add riscv32imac-unknown-none-elf
|
|||
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:
|
||||
```shell
|
||||
|
|
@ -85,50 +24,8 @@ rustup component add --toolchain nightly rustfmt
|
|||
```
|
||||
|
||||
### Build and Flash
|
||||
In default configuration only signal phases (SPAT) data is displayed for the upcoming intersection.
|
||||
Additional features are available through feature flags:
|
||||
|
||||
- `esp`: Run on ESP (required as feature flag to enable unit tests on host)
|
||||
- `std`: Run on system with `std` library
|
||||
- `spat`: Enable signal phase (and intersection map) data
|
||||
- `spat_debug`: Enable additional debug information for the SPAT/ GLOSA use case
|
||||
- `denm`: Enable DENMs
|
||||
- `cam`: Enable CAMs
|
||||
- `cam_tx`: Enable CAM generation and transmission (needs time and position source)
|
||||
|
||||
Officially supported feature combinations are:
|
||||
- `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,cam,denm`
|
||||
- `esp,uart,cam,denm` ("smartphone companion with UART")
|
||||
- `esp,ble,cam,denm,cam_tx` ("smartphone companion with BLE")
|
||||
|
||||
Connect your ESP32-C5 and run:
|
||||
|
||||
```
|
||||
# default configuration
|
||||
cargo run --release
|
||||
|
||||
# for e.g. also enable DENM feature
|
||||
cargo run --release -F denm
|
||||
```
|
||||
|
||||
### Run Unit Tests on Host
|
||||
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
|
||||
```
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||
|
|
|
|||
24
build.rs
24
build.rs
|
|
@ -1,23 +1,7 @@
|
|||
use std::env;
|
||||
|
||||
fn main() -> std::io::Result<()> {
|
||||
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap();
|
||||
|
||||
if target_arch == "riscv32" {
|
||||
linker_be_nice();
|
||||
// make sure linkall.x is the last linker script (otherwise might cause problems with flip-link)
|
||||
println!("cargo:rustc-link-arg=-Tlinkall.x");
|
||||
}
|
||||
|
||||
let descriptor_path =
|
||||
std::path::PathBuf::from(env::var("OUT_DIR").unwrap()).join("proto_descriptor.bin");
|
||||
|
||||
prost_build::Config::new()
|
||||
.file_descriptor_set_path(&descriptor_path)
|
||||
.compile_well_known_types()
|
||||
.compile_protos(&["docs/c_its-messages.proto"], &["docs/"])?;
|
||||
|
||||
Ok(())
|
||||
fn main() {
|
||||
linker_be_nice();
|
||||
// make sure linkall.x is the last linker script (otherwise might cause problems with flip-link)
|
||||
println!("cargo:rustc-link-arg=-Tlinkall.x");
|
||||
}
|
||||
|
||||
fn linker_be_nice() {
|
||||
|
|
|
|||
|
|
@ -1,124 +0,0 @@
|
|||
# Bluetooth LE Protocol
|
||||
|
||||
Some data is made available via BLE so that a smartphone app can be used to display it in other use cases.
|
||||
|
||||
## General
|
||||
|
||||
The BLE protocol contains some standardized services, but can also transport custom services.
|
||||
Each service is compromised of a set of characteristics which can be read or clients can even subscribe for changes.
|
||||
|
||||
Sadly we can't use any of the standardized service/ profiles to transmit V2X data.
|
||||
Even notifications about DENMs can't be transmitted since the Alert Notification Profile is only meant for the companion device to query notifications from the phone, but not the other way around.
|
||||
|
||||
So we will only use the Device Information Service to announce ourselves and use a custom service for everything else.
|
||||
|
||||
## V2X BLE Service
|
||||
|
||||
V2X data is exposed via the service UUID `c0b70000-d4f4-4000-ada8-f99a02ee315c` (randomly generated UUID, with byte 3 and 4 set to zero) using the following characteristics:
|
||||
|
||||
UUID | Type | Description
|
||||
------------------------------------- | --------------- | -----------
|
||||
c0b70001-d4f4-4001-ada8-f99a02ee315c | `PositionState` | Set position from external source
|
||||
c0b70001-d4f4-4002-ada8-f99a02ee315c | `RawNotify` | Raw message notification
|
||||
c0b70001-d4f4-4003-ada8-f99a02ee315c | `RawMsgRx` | Raw CAM message (de-duplicated/ rate-limited)
|
||||
c0b70001-d4f4-4004-ada8-f99a02ee315c | `CamEvent` | Latest received CAM
|
||||
c0b70001-d4f4-4005-ada8-f99a02ee315c | `RawMsgRx` | Raw DENM message (de-duplicated/ rate-limited)
|
||||
c0b70001-d4f4-4006-ada8-f99a02ee315c | `DenmEvent` | Latest received DENM
|
||||
c0b70001-d4f4-4007-ada8-f99a02ee315c | `RawMsgRx` | Raw MAPEM 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
|
||||
|
||||
Messages are encoded according to the [Protocol Buffers](https://protobuf.dev/) specification since it provides decent binary size and has parser libraries for many programming languages.
|
||||
All data types are defined in one `.proto` file: [c_its-messages.proto](./c_its-messages.proto).
|
||||
|
||||
### Position State Input
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Received V2X messages will be "published" as a `RawMsgRx` message (see [c_its-messages.proto](./c_its-messages.proto)).
|
||||
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.:
|
||||
- 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)
|
||||
|
||||
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
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
syntax = "proto2";
|
||||
|
||||
package c_its_io;
|
||||
|
||||
// ------------------------------
|
||||
// Data Types
|
||||
// ------------------------------
|
||||
|
||||
message Position {
|
||||
required float latitude_deg = 1;
|
||||
required float longitude_deg = 2;
|
||||
}
|
||||
|
||||
enum TrafficDir {
|
||||
// for all directions of traffic
|
||||
ALL_DIRECTIONS = 0;
|
||||
// for the direction of traffic according to the reference direction, and the portion of traffic upstream of the reference position
|
||||
UPSTREAM = 1;
|
||||
// for the direction of traffic according to the reference direction, and the portion of traffic downstream of the reference position
|
||||
DOWNSTREAM = 2;
|
||||
// for the direction of traffic opposite to the reference direction
|
||||
OPPOSITE = 3;
|
||||
}
|
||||
|
||||
message VehicleContainer {
|
||||
optional uint32 heading_deg = 1; // vehicle heading in degrees, if not "unavailable"
|
||||
optional uint32 speed = 2; // vehicle speed in 1/100 m/s, if not "unavailable"
|
||||
optional uint32 vehicle_length_dm = 3; // vehicle length in 1/10 m, if not "unavailable"
|
||||
optional uint32 vehicle_width_dm = 4; // vehicle width in 1/10 m, if not "unavailable"
|
||||
}
|
||||
|
||||
|
||||
// GeoNetworking Destination Area Shape
|
||||
enum GNAreaShape {
|
||||
ETSI_AREASHAPE_CIRCLE = 0;
|
||||
ETSI_AREASHAPE_RECTANGLE = 1;
|
||||
ETSI_AREASHAPE_ELLIPSIS = 2;
|
||||
}
|
||||
|
||||
// GeoNetworking Destination Area/ Source Position
|
||||
message ITSPosition {
|
||||
required int32 latitude = 1; // Latitude in 1/10th of micro degrees
|
||||
required int32 longitude = 2; // Longitude in 1/10th of micro degrees
|
||||
}
|
||||
|
||||
// GeoNetworking Destination Area
|
||||
message GNArea {
|
||||
optional GNAreaShape area = 1;
|
||||
optional ITSPosition position = 2;
|
||||
optional int32 distA = 3; // Distance A of the geometric shape in meters
|
||||
optional int32 distB = 4; // Distance B of the geometric shape in meters, mandatory for rectangle and ellipsis
|
||||
optional int32 angle = 5; // Angle of the geometric shape in degrees, mandatory for rectangle and ellipsis
|
||||
}
|
||||
|
||||
// GeoNetworking Transport
|
||||
enum GNTransport {
|
||||
GN_TRANSPORT_GAC = 3; // Geographically-Scoped Anycast
|
||||
GN_TRANSPORT_GBC = 4; // Geographically-Scoped broadcast
|
||||
GN_TRANSPORT_TSB = 5; // Topologically-scoped broadcast
|
||||
GN_TRANSPORT_SHB = 7; // Single hop broadcast
|
||||
}
|
||||
|
||||
message RawMsgTx {
|
||||
required bytes payload = 1; // as UPER
|
||||
required uint32 message_type = 2; // ITS `MessageId` integer value
|
||||
|
||||
required GNTransport gnTransport = 3;
|
||||
required GNArea gnArea = 4;
|
||||
required uint32 hopLimit = 5;
|
||||
|
||||
optional uint32 stationType = 6; // for source position vector
|
||||
}
|
||||
|
||||
message RawNotify {
|
||||
required uint32 message_type = 1; // ITS `MessageId` integer value
|
||||
}
|
||||
|
||||
// ------------------------------
|
||||
// Messages
|
||||
// ------------------------------
|
||||
|
||||
message PositionState {
|
||||
required sfixed64 timestamp_ms = 1; // current UNIX time in milliseconds
|
||||
required Position position = 2;
|
||||
optional uint32 heading = 3; // heading in 1/10 deg
|
||||
optional uint32 speed = 4; // speed in 1/100 m/s
|
||||
}
|
||||
|
||||
message DenmEvent {
|
||||
required fixed64 timestamp = 1; // DENM reference time as UNIX time (in seconds)
|
||||
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 uint32 seq_num = 4; // unique ID of the event when combined with `station_id`
|
||||
optional Position event_position = 5; // event location (from denm.management.eventPosition)
|
||||
optional uint32 event_heading_deg = 6; // event heading (from denm.location.eventPositionHeading)
|
||||
optional TrafficDir direction = 7; // relevance traffic direction (from denm.management.trafficDirection)
|
||||
optional uint32 cause_code = 8;
|
||||
optional uint32 sub_cause_code = 9;
|
||||
}
|
||||
|
||||
message CamEvent {
|
||||
required fixed32 station_id = 1; // Station ID of the vehicle
|
||||
required uint32 station_type = 2; // ITS `StationType`
|
||||
required Position position = 3; // vehicle position
|
||||
optional uint32 vehicle_role = 4; // ITS `VehicleRole`
|
||||
optional VehicleContainer vehicle_data = 5; // speed, etc unless CAM contains an RSU container
|
||||
}
|
||||
|
||||
message RawMsgRx {
|
||||
required uint32 msg_type = 1; // ITS message type (`MessageId` from PDU header)
|
||||
required bytes payload = 2; // UPER message with Geonetworking and BTP headers
|
||||
}
|
||||
|
||||
message SerialOutputMsg {
|
||||
oneof payload {
|
||||
DenmEvent denm = 1;
|
||||
RawMsgRx rx_msg = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message SerialInputMsg {
|
||||
oneof payload {
|
||||
PositionState position = 1;
|
||||
RawMsgTx tx_msg = 2;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# UART Protocol
|
||||
|
||||
If enabled using the `TODO` feature flag, all received messages are transmitted on UART using the protocol described in this document.
|
||||
The serial communication can also be used to send V2X data.
|
||||
|
||||
## Message Format
|
||||
|
||||
The UART communication is using a custom framing protocol to encapsulate binary messages.
|
||||
The payload is:
|
||||
|
||||
- a `SerialOutputMsg` for transmissions from the ESP to the host or
|
||||
- a `SerialInputMsg` for transmissions from the host to the ESP
|
||||
|
||||
in binary [Proto](https://protobuf.dev/) serialization according to the [c_its-messages.proto](./c_its-messages.proto) definition.
|
||||
|
||||
Each transmission:
|
||||
- starts with a Start of Frame (SOF) sequence: `0x56, 0x32, 0x58, 0x2B` ("V2X+")
|
||||
- followed by a 16-bit big-endian length field
|
||||
- followed by the payload
|
||||
- followed by an End of Frame (EOF) sequence `0x0d, 0x0a`
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
#!/bin/bash
|
||||
## Build/ Test/ Clippy all supported feature permutations
|
||||
set -eu
|
||||
|
||||
mode=${1:-help}
|
||||
wasm_target="--chrome --headless"
|
||||
extended=${2:-false}
|
||||
|
||||
|
||||
features_base=(
|
||||
uart,cam,denm
|
||||
ble,cam,denm,cam_tx
|
||||
uart,ble,cam,denm
|
||||
spat,gnss_ubx,screen
|
||||
spat,gnss_ubx,screen,cam_tx
|
||||
)
|
||||
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_tx,cam,denm
|
||||
)
|
||||
features_test=(
|
||||
spat,cam,denm,uart
|
||||
)
|
||||
|
||||
|
||||
runBuild () {
|
||||
for feat in "${features[@]}"; do
|
||||
echo "cargo build for $feat ..."
|
||||
cargo build --release --no-default-features -F esp,$feat
|
||||
done
|
||||
}
|
||||
|
||||
runTest () {
|
||||
for feat in "${features_test[@]}"; do
|
||||
echo "cargo test for $feat ..."
|
||||
cargo test --target host-tuple --bin test --no-default-features -F std,$feat
|
||||
done
|
||||
}
|
||||
|
||||
runClippy () {
|
||||
for feat in "${features[@]}"; do
|
||||
echo "clippy for $feat ..."
|
||||
cargo clippy --no-default-features -F esp,$feat -- -Wclippy::pedantic
|
||||
done
|
||||
}
|
||||
|
||||
if [ $extended == "--more" ]; then
|
||||
echo "running with extended feature list"
|
||||
features=( "${features_base[@]}" "${features_more[@]}" )
|
||||
else
|
||||
echo "running standard feature list"
|
||||
features=( "${features_base[@]}" )
|
||||
fi
|
||||
|
||||
case $mode in
|
||||
build)
|
||||
runBuild
|
||||
;;
|
||||
clippy)
|
||||
runClippy
|
||||
;;
|
||||
test)
|
||||
runTest
|
||||
;;
|
||||
all)
|
||||
runBuild
|
||||
runClippy
|
||||
runTest
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [build | clippy | test | all] [--more]"
|
||||
esac
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 145 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 142 KiB |
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
|
|
@ -1,138 +0,0 @@
|
|||
{
|
||||
"board": {
|
||||
"active_layer": 25,
|
||||
"active_layer_preset": "",
|
||||
"auto_track_width": true,
|
||||
"hidden_netclasses": [],
|
||||
"hidden_nets": [],
|
||||
"high_contrast_mode": 0,
|
||||
"net_color_mode": 1,
|
||||
"opacity": {
|
||||
"images": 0.6,
|
||||
"pads": 1.0,
|
||||
"shapes": 1.0,
|
||||
"tracks": 1.0,
|
||||
"vias": 1.0,
|
||||
"zones": 0.6
|
||||
},
|
||||
"prototype_zone_fills": false,
|
||||
"selection_filter": {
|
||||
"dimensions": true,
|
||||
"footprints": true,
|
||||
"graphics": true,
|
||||
"keepouts": true,
|
||||
"lockedItems": false,
|
||||
"otherItems": true,
|
||||
"pads": true,
|
||||
"text": true,
|
||||
"tracks": true,
|
||||
"vias": true,
|
||||
"zones": true
|
||||
},
|
||||
"visible_items": [
|
||||
"vias",
|
||||
"footprint_text",
|
||||
"footprint_anchors",
|
||||
"ratsnest",
|
||||
"grid",
|
||||
"footprints_front",
|
||||
"footprints_back",
|
||||
"footprint_values",
|
||||
"footprint_references",
|
||||
"tracks",
|
||||
"drc_errors",
|
||||
"drawing_sheet",
|
||||
"bitmaps",
|
||||
"pads",
|
||||
"zones",
|
||||
"drc_warnings",
|
||||
"drc_exclusions",
|
||||
"locked_item_shadows",
|
||||
"conflict_shadows",
|
||||
"shapes",
|
||||
"board_outline_area",
|
||||
"ly_points"
|
||||
],
|
||||
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
|
||||
"zone_display_mode": 0
|
||||
},
|
||||
"git": {
|
||||
"integration_disabled": false,
|
||||
"repo_type": "",
|
||||
"repo_username": "",
|
||||
"ssh_key": ""
|
||||
},
|
||||
"meta": {
|
||||
"filename": "c_its-companion.kicad_prl",
|
||||
"version": 5
|
||||
},
|
||||
"net_inspector_panel": {
|
||||
"col_hidden": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"col_order": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9
|
||||
],
|
||||
"col_widths": [
|
||||
156,
|
||||
141,
|
||||
103,
|
||||
71,
|
||||
103,
|
||||
103,
|
||||
103,
|
||||
74,
|
||||
103,
|
||||
103
|
||||
],
|
||||
"custom_group_rules": [],
|
||||
"expanded_rows": [],
|
||||
"filter_by_net_name": true,
|
||||
"filter_by_netclass": true,
|
||||
"filter_text": "",
|
||||
"group_by_constraint": false,
|
||||
"group_by_netclass": false,
|
||||
"show_time_domain_details": false,
|
||||
"show_unconnected_nets": false,
|
||||
"show_zero_pad_nets": false,
|
||||
"sort_ascending": true,
|
||||
"sorting_column": 0
|
||||
},
|
||||
"open_jobsets": [],
|
||||
"project": {
|
||||
"files": []
|
||||
},
|
||||
"schematic": {
|
||||
"hierarchy_collapsed": [],
|
||||
"selection_filter": {
|
||||
"graphics": true,
|
||||
"images": true,
|
||||
"labels": true,
|
||||
"lockedItems": false,
|
||||
"otherItems": true,
|
||||
"pins": true,
|
||||
"ruleAreas": true,
|
||||
"symbols": true,
|
||||
"text": true,
|
||||
"wires": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,776 +0,0 @@
|
|||
{
|
||||
"board": {
|
||||
"3dviewports": [
|
||||
{
|
||||
"name": "ISO-back",
|
||||
"ww": 1.0,
|
||||
"wx": 23.768348693847656,
|
||||
"wy": 1.82621169090271,
|
||||
"wz": -13.010103225708008,
|
||||
"xw": 0.0,
|
||||
"xx": -0.6424655318260193,
|
||||
"xy": 0.5901128053665161,
|
||||
"xz": -0.4888812303543091,
|
||||
"yw": 0.0,
|
||||
"yx": 0.7663145065307617,
|
||||
"yy": 0.49455612897872925,
|
||||
"yz": -0.41009292006492615,
|
||||
"zw": 0.0,
|
||||
"zx": -0.00022190232994034886,
|
||||
"zy": -0.638107419013977,
|
||||
"zz": -0.7699472904205322
|
||||
},
|
||||
{
|
||||
"name": "ISO-front",
|
||||
"ww": 1.0,
|
||||
"wx": 4.608643054962158,
|
||||
"wy": 18.730253219604492,
|
||||
"wz": -27.170215606689453,
|
||||
"xw": 0.0,
|
||||
"xx": 0.6427879333496094,
|
||||
"xy": -0.5868241190910339,
|
||||
"xz": 0.49240362644195557,
|
||||
"yw": 0.0,
|
||||
"yx": 0.7660443186759949,
|
||||
"yy": 0.4924042820930481,
|
||||
"yz": -0.4131760001182556,
|
||||
"zw": 0.0,
|
||||
"zx": -2.1759660739917308e-08,
|
||||
"zy": 0.6427874565124512,
|
||||
"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": {
|
||||
"defaults": {
|
||||
"apply_defaults_to_fp_barcodes": false,
|
||||
"apply_defaults_to_fp_dimensions": false,
|
||||
"apply_defaults_to_fp_fields": false,
|
||||
"apply_defaults_to_fp_shapes": false,
|
||||
"apply_defaults_to_fp_text": false,
|
||||
"board_outline_line_width": 0.05,
|
||||
"copper_line_width": 0.2,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.05,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": true,
|
||||
"text_position": 0,
|
||||
"units_format": 0
|
||||
},
|
||||
"fab_line_width": 0.1,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.1,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.8,
|
||||
"height": 1.27,
|
||||
"width": 1.27
|
||||
},
|
||||
"silk_line_width": 0.1,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.1,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"border_display_style": 2,
|
||||
"border_hatch_pitch": 0.5,
|
||||
"corner_radius": 0.0,
|
||||
"corner_smoothing": 0,
|
||||
"fill_mode": 0,
|
||||
"hatch_gap": 1.5,
|
||||
"hatch_orientation": 0.0,
|
||||
"hatch_smoothing_level": 0,
|
||||
"hatch_smoothing_value": 0.1,
|
||||
"hatch_thickness": 1.0,
|
||||
"min_clearance": 0.5,
|
||||
"min_island_area": 10.0,
|
||||
"min_thickness": 0.25,
|
||||
"pad_connection": 1,
|
||||
"remove_islands": 0,
|
||||
"thermal_relief_gap": 0.5,
|
||||
"thermal_relief_spoke_width": 0.5
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [
|
||||
{
|
||||
"gap": 0.0,
|
||||
"via_gap": 0.0,
|
||||
"width": 0.0
|
||||
}
|
||||
],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"connection_width": "warning",
|
||||
"copper_edge_clearance": "error",
|
||||
"copper_sliver": "warning",
|
||||
"courtyards_overlap": "error",
|
||||
"creepage": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"footprint": "error",
|
||||
"footprint_filters_mismatch": "ignore",
|
||||
"footprint_symbol_field_mismatch": "warning",
|
||||
"footprint_symbol_mismatch": "warning",
|
||||
"footprint_type_mismatch": "ignore",
|
||||
"hole_clearance": "error",
|
||||
"hole_to_hole": "warning",
|
||||
"holes_co_located": "warning",
|
||||
"invalid_outline": "error",
|
||||
"isolated_copper": "warning",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"lib_footprint_issues": "warning",
|
||||
"lib_footprint_mismatch": "warning",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"mirrored_text_on_front_layer": "warning",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"missing_tuning_profile": "warning",
|
||||
"net_conflict": "warning",
|
||||
"nonmirrored_text_on_back_layer": "warning",
|
||||
"npth_inside_courtyard": "error",
|
||||
"padstack": "warning",
|
||||
"pth_inside_courtyard": "error",
|
||||
"shorting_items": "error",
|
||||
"silk_edge_clearance": "warning",
|
||||
"silk_over_copper": "warning",
|
||||
"silk_overlap": "warning",
|
||||
"skew_out_of_range": "error",
|
||||
"solder_mask_bridge": "error",
|
||||
"starved_thermal": "error",
|
||||
"text_height": "warning",
|
||||
"text_on_edge_cuts": "error",
|
||||
"text_thickness": "warning",
|
||||
"through_hole_pad_without_hole": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_angle": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_not_centered_on_via": "ignore",
|
||||
"track_on_post_machined_layer": "error",
|
||||
"track_segment_length": "error",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"tuning_profile_track_geometries": "ignore",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rules": {
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.0,
|
||||
"min_connection": 0.0,
|
||||
"min_copper_edge_clearance": 0.5,
|
||||
"min_groove_width": 0.0,
|
||||
"min_hole_clearance": 0.25,
|
||||
"min_hole_to_hole": 0.25,
|
||||
"min_microvia_diameter": 0.2,
|
||||
"min_microvia_drill": 0.1,
|
||||
"min_resolved_spokes": 2,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_text_height": 0.8,
|
||||
"min_text_thickness": 0.08,
|
||||
"min_through_hole_diameter": 0.3,
|
||||
"min_track_width": 0.2,
|
||||
"min_via_annular_width": 0.1,
|
||||
"min_via_diameter": 0.5,
|
||||
"solder_mask_to_copper_clearance": 0.005,
|
||||
"use_height_for_length_calcs": true
|
||||
},
|
||||
"teardrop_options": [
|
||||
{
|
||||
"td_onpthpad": true,
|
||||
"td_onroundshapesonly": false,
|
||||
"td_onsmdpad": true,
|
||||
"td_ontrackend": false,
|
||||
"td_onvia": true
|
||||
}
|
||||
],
|
||||
"teardrop_parameters": [
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_round_shape",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
},
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_rect_shape",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
},
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_track_end",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
}
|
||||
],
|
||||
"track_widths": [
|
||||
0.0
|
||||
],
|
||||
"tuning_pattern_settings": {
|
||||
"diff_pair_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 1.0
|
||||
},
|
||||
"diff_pair_skew_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 0.6
|
||||
},
|
||||
"single_track_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 0.6
|
||||
}
|
||||
},
|
||||
"via_dimensions": [
|
||||
{
|
||||
"diameter": 0.0,
|
||||
"drill": 0.0
|
||||
}
|
||||
],
|
||||
"zones_allow_external_fillets": false
|
||||
},
|
||||
"ipc2581": {
|
||||
"bom_rev": "",
|
||||
"dist": "",
|
||||
"distpn": "",
|
||||
"internal_id": "",
|
||||
"mfg": "",
|
||||
"mpn": "",
|
||||
"sch_revision": "v1.0"
|
||||
},
|
||||
"layer_pairs": [],
|
||||
"layer_presets": [],
|
||||
"viewports": []
|
||||
},
|
||||
"boards": [],
|
||||
"component_class_settings": {
|
||||
"assignments": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"sheet_component_classes": {
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"erc": {
|
||||
"erc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"pin_map": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
]
|
||||
],
|
||||
"rule_severities": {
|
||||
"bus_definition_conflict": "error",
|
||||
"bus_entry_needed": "error",
|
||||
"bus_to_bus_conflict": "error",
|
||||
"bus_to_net_conflict": "error",
|
||||
"different_unit_footprint": "error",
|
||||
"different_unit_net": "error",
|
||||
"duplicate_reference": "error",
|
||||
"duplicate_sheet_names": "error",
|
||||
"endpoint_off_grid": "warning",
|
||||
"extra_units": "error",
|
||||
"field_name_whitespace": "warning",
|
||||
"footprint_filter": "ignore",
|
||||
"footprint_link_issues": "warning",
|
||||
"four_way_junction": "ignore",
|
||||
"ground_pin_not_ground": "warning",
|
||||
"hier_label_mismatch": "error",
|
||||
"isolated_pin_label": "warning",
|
||||
"label_dangling": "error",
|
||||
"label_multiple_wires": "warning",
|
||||
"lib_symbol_issues": "warning",
|
||||
"lib_symbol_mismatch": "warning",
|
||||
"missing_bidi_pin": "warning",
|
||||
"missing_input_pin": "warning",
|
||||
"missing_power_pin": "error",
|
||||
"missing_unit": "warning",
|
||||
"multiple_net_names": "warning",
|
||||
"net_not_bus_member": "warning",
|
||||
"no_connect_connected": "warning",
|
||||
"no_connect_dangling": "warning",
|
||||
"pin_not_connected": "error",
|
||||
"pin_not_driven": "error",
|
||||
"pin_to_pin": "warning",
|
||||
"power_pin_not_driven": "error",
|
||||
"same_local_global_label": "warning",
|
||||
"similar_label_and_power": "warning",
|
||||
"similar_labels": "warning",
|
||||
"similar_power": "warning",
|
||||
"simulation_model_issue": "ignore",
|
||||
"single_global_label": "ignore",
|
||||
"stacked_pin_name": "warning",
|
||||
"unannotated": "error",
|
||||
"unconnected_wire_endpoint": "warning",
|
||||
"undefined_netclass": "error",
|
||||
"unit_value_mismatch": "error",
|
||||
"unresolved_variable": "error",
|
||||
"wire_dangling": "error"
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "c_its-companion.kicad_pro",
|
||||
"version": 3
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 12,
|
||||
"clearance": 0.2,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"priority": 2147483647,
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.2,
|
||||
"tuning_profile": "",
|
||||
"via_diameter": 0.6,
|
||||
"via_drill": 0.3,
|
||||
"wire_width": 6
|
||||
},
|
||||
{
|
||||
"name": "Power",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"priority": 0,
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.5,
|
||||
"tuning_profile": ""
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 5
|
||||
},
|
||||
"net_colors": null,
|
||||
"netclass_assignments": null,
|
||||
"netclass_patterns": [
|
||||
{
|
||||
"netclass": "Power",
|
||||
"pattern": "GND"
|
||||
},
|
||||
{
|
||||
"netclass": "Power",
|
||||
"pattern": "+3V3"
|
||||
},
|
||||
{
|
||||
"netclass": "Power",
|
||||
"pattern": "/BAT*"
|
||||
},
|
||||
{
|
||||
"netclass": "Power",
|
||||
"pattern": "/V_*"
|
||||
}
|
||||
]
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"plot": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"annotation": {
|
||||
"method": 0,
|
||||
"sort_order": 0
|
||||
},
|
||||
"bom_export_filename": "${PROJECTNAME}.csv",
|
||||
"bom_fmt_presets": [],
|
||||
"bom_fmt_settings": {
|
||||
"field_delimiter": ",",
|
||||
"keep_line_breaks": false,
|
||||
"keep_tabs": false,
|
||||
"name": "CSV",
|
||||
"ref_delimiter": ",",
|
||||
"ref_range_delimiter": "",
|
||||
"string_delimiter": "\""
|
||||
},
|
||||
"bom_presets": [],
|
||||
"bom_settings": {
|
||||
"exclude_dnp": false,
|
||||
"fields_ordered": [
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Reference",
|
||||
"name": "Reference",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Qty",
|
||||
"name": "${QUANTITY}",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Value",
|
||||
"name": "Value",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "DNP",
|
||||
"name": "${DNP}",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Exclude from BOM",
|
||||
"name": "${EXCLUDE_FROM_BOM}",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Exclude from Board",
|
||||
"name": "${EXCLUDE_FROM_BOARD}",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Footprint",
|
||||
"name": "Footprint",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Datasheet",
|
||||
"name": "Datasheet",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Description",
|
||||
"name": "Description",
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "#",
|
||||
"name": "${ITEM_NUMBER}",
|
||||
"show": false
|
||||
}
|
||||
],
|
||||
"filter_string": "",
|
||||
"group_symbols": true,
|
||||
"include_excluded_from_bom": true,
|
||||
"name": "",
|
||||
"sort_asc": true,
|
||||
"sort_field": "Reference"
|
||||
},
|
||||
"bus_aliases": {},
|
||||
"connection_grid_size": 50.0,
|
||||
"drawing": {
|
||||
"dashed_lines_dash_length_ratio": 12.0,
|
||||
"dashed_lines_gap_length_ratio": 3.0,
|
||||
"default_line_thickness": 6.0,
|
||||
"default_text_size": 50.0,
|
||||
"field_names": [],
|
||||
"hop_over_size_choice": 0,
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
"label_size_ratio": 0.375,
|
||||
"operating_point_overlay_i_precision": 3,
|
||||
"operating_point_overlay_i_range": "~A",
|
||||
"operating_point_overlay_v_precision": 3,
|
||||
"operating_point_overlay_v_range": "~V",
|
||||
"overbar_offset_ratio": 1.23,
|
||||
"pin_symbol_size": 25.0,
|
||||
"text_offset_ratio": 0.15
|
||||
},
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"page_layout_descr_file": "",
|
||||
"plot_directory": "",
|
||||
"reuse_designators": true,
|
||||
"subpart_first_id": 65,
|
||||
"subpart_id_separator": 0,
|
||||
"top_level_sheets": [
|
||||
{
|
||||
"filename": "c_its-companion.kicad_sch",
|
||||
"name": "Root",
|
||||
"uuid": "9ad468b0-d7e4-4d4a-b652-c4a81a952e30"
|
||||
}
|
||||
],
|
||||
"used_designators": "H1-4,C1,#PWR1-11,J1-2,SW1,TP1-5,U1-2,#FLG1-3",
|
||||
"variants": []
|
||||
},
|
||||
"sheets": [
|
||||
[
|
||||
"9ad468b0-d7e4-4d4a-b652-c4a81a952e30",
|
||||
"Root"
|
||||
]
|
||||
],
|
||||
"text_variables": {},
|
||||
"tuning_profiles": {
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"tuning_profiles_impedance_geometric": []
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
{"ARCHIVE_NAME": "", "EXTRA_LAYERS": "", "ALL_ACTIVE_LAYERS": false, "EXTEND_EDGE_CUT": false, "ALTERNATIVE_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": false, "OPEN BROWSER": true, "BACKUP_OPT": true}
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
(fp_lib_table
|
||||
(version 7)
|
||||
(lib (name "library") (type "KiCad") (uri "${KIPRJMOD}/library") (options "") (descr ""))
|
||||
)
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -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
File diff suppressed because it is too large
Load diff
|
|
@ -1,542 +0,0 @@
|
|||
(footprint "XIAO-ESP32-C5-DIP"
|
||||
(version 20241229)
|
||||
(generator "pcbnew")
|
||||
(generator_version "9.0")
|
||||
(layer "F.Cu")
|
||||
(property "Reference" "REF**"
|
||||
(at -0.275 -10.275 0)
|
||||
(unlocked yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "7bab359d-5e5b-4dff-9db4-e7c8562ce635")
|
||||
(effects
|
||||
(font
|
||||
(size 0.635 0.635)
|
||||
(thickness 0.1016)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Value" "XIAO-ESP32-C5-DIP"
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(uuid "79cabf23-4ebc-4d37-9172-bb2cf4ea975f")
|
||||
(effects
|
||||
(font
|
||||
(size 0.635 0.635)
|
||||
(thickness 0.1016)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Datasheet" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "663dc686-104e-47e1-9669-e1228477fa6f")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Description" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "a25b2a4a-94ce-41bd-8341-b98204aa9142")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(attr smd)
|
||||
(fp_line
|
||||
(start -10.414 -6.985)
|
||||
(end -10.414 6.985)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e213e2f5-659f-4cdb-b390-b284746621aa")
|
||||
)
|
||||
(fp_line
|
||||
(start -8.509 -8.89)
|
||||
(end 8.636 -8.89)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "f58afa0e-63f9-4096-9d17-7cf8e5de7759")
|
||||
)
|
||||
(fp_line
|
||||
(start -8.509 8.89)
|
||||
(end 8.636 8.89)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "9c6409b2-5f1b-4299-85bf-d07c96f13a2a")
|
||||
)
|
||||
(fp_line
|
||||
(start 10.541 -4.495)
|
||||
(end 11.551272 -4.491272)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "4c45fdff-98df-401f-bf6d-768af24b67a9")
|
||||
)
|
||||
(fp_line
|
||||
(start 10.541 6.985)
|
||||
(end 10.541 -6.985)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "eb7ba2c6-3729-4940-9c6b-4ac369cf3075")
|
||||
)
|
||||
(fp_line
|
||||
(start 10.541 6.985)
|
||||
(end 10.541 -6.985)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "6f680559-bbef-46de-9ef5-efda7c2411e9")
|
||||
)
|
||||
(fp_line
|
||||
(start 11.551 4.504)
|
||||
(end 10.541 4.504)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "eddbec16-11c2-42ad-90d6-191cfc991c10")
|
||||
)
|
||||
(fp_line
|
||||
(start 12.051 -3.991272)
|
||||
(end 12.051 4.004)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e973f8d1-81df-437d-bffe-4f734e1ac18e")
|
||||
)
|
||||
(fp_arc
|
||||
(start -10.414 -6.985)
|
||||
(mid -9.856038 -8.332038)
|
||||
(end -8.509 -8.89)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "88e5d6ea-6b70-4830-9817-980fd2b32f79")
|
||||
)
|
||||
(fp_arc
|
||||
(start -8.509 8.89)
|
||||
(mid -9.856038 8.332038)
|
||||
(end -10.414 6.985)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "f108f05c-d5f6-4de1-bc6f-4c31ef53e967")
|
||||
)
|
||||
(fp_arc
|
||||
(start 8.636 -8.89)
|
||||
(mid 9.983038 -8.332038)
|
||||
(end 10.541 -6.985)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "c6870bc4-897a-485a-b951-3feda1bdd32e")
|
||||
)
|
||||
(fp_arc
|
||||
(start 10.541 6.985)
|
||||
(mid 9.983038 8.332038)
|
||||
(end 8.636 8.89)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e1d8f660-1495-43db-8a6b-7fdc7dc42e35")
|
||||
)
|
||||
(fp_arc
|
||||
(start 11.551272 -4.491272)
|
||||
(mid 11.904644 -4.344724)
|
||||
(end 12.051 -3.991272)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "a9b2ba2a-ad25-4191-9070-ebc0333a9101")
|
||||
)
|
||||
(fp_arc
|
||||
(start 12.051 4.004)
|
||||
(mid 11.904553 4.357553)
|
||||
(end 11.551 4.504)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "45e349ac-e285-4bed-a05b-ae5a80336af0")
|
||||
)
|
||||
(fp_circle
|
||||
(center 9.37 -7.857)
|
||||
(end 9.624 -7.857)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "6839324b-c75a-49ba-8c0c-16e2191166eb")
|
||||
)
|
||||
(fp_circle
|
||||
(center 10.25 -9)
|
||||
(end 10.504 -9)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "6e5f4857-2ad9-4493-8234-6091a6821232")
|
||||
)
|
||||
(fp_rect
|
||||
(start -10.425 -8.9)
|
||||
(end 10.55 8.9)
|
||||
(stroke
|
||||
(width 0.05)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.CrtYd")
|
||||
(uuid "b53697bc-d105-40e2-af66-708b16a7f26c")
|
||||
)
|
||||
(fp_rect
|
||||
(start -10.425 -8.9)
|
||||
(end 10.55 8.9)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.Fab")
|
||||
(uuid "a45a327e-f036-4877-8d89-39f4f4b0c715")
|
||||
)
|
||||
(fp_circle
|
||||
(center 9.376 -7.854)
|
||||
(end 9.63 -7.854)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.Fab")
|
||||
(uuid "12a1812e-f866-498e-9d6e-50e427087f34")
|
||||
)
|
||||
(pad "1" smd roundrect
|
||||
(at 7.62 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "82bbfb55-8baa-4218-ac89-ab07d82ef7f8")
|
||||
)
|
||||
(pad "1" thru_hole circle
|
||||
(at 7.62 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "f2fffd4f-460c-4b4d-b954-811e935ed1d6")
|
||||
)
|
||||
(pad "2" smd roundrect
|
||||
(at 5.08 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "18ef9914-2d15-494c-9020-2334abcc1460")
|
||||
)
|
||||
(pad "2" thru_hole circle
|
||||
(at 5.08 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "4732cc3f-e641-4870-a9b3-ae13729c7bba")
|
||||
)
|
||||
(pad "3" smd roundrect
|
||||
(at 2.54 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "15338a55-8514-4218-a2c1-2cae003104c3")
|
||||
)
|
||||
(pad "3" thru_hole circle
|
||||
(at 2.54 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "0cef5e55-d8ff-4394-9cc1-cc318608b0d9")
|
||||
)
|
||||
(pad "4" smd roundrect
|
||||
(at 0 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "191a259d-5773-4a80-91de-baa69611fab8")
|
||||
)
|
||||
(pad "4" thru_hole circle
|
||||
(at 0 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "200b8da4-9395-48a5-b7ac-92a6a147c215")
|
||||
)
|
||||
(pad "5" smd roundrect
|
||||
(at -2.54 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "52012467-1c46-4a8e-aa82-6f6ce69bd2ca")
|
||||
)
|
||||
(pad "5" thru_hole circle
|
||||
(at -2.54 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "2b50ccce-3634-47d1-bf7d-a3db4f3f9a9f")
|
||||
)
|
||||
(pad "6" smd roundrect
|
||||
(at -5.08 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "04aeaf95-142a-40f6-97a3-04453fc50824")
|
||||
)
|
||||
(pad "6" thru_hole circle
|
||||
(at -5.08 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "7636de9d-d8e5-49c9-9fff-0cd76515690d")
|
||||
)
|
||||
(pad "7" smd roundrect
|
||||
(at -7.62 -8.455 90)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "e997fd0b-233a-4656-afad-cb2f8b9d87c9")
|
||||
)
|
||||
(pad "7" thru_hole circle
|
||||
(at -7.62 -7.62 90)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "9d2c0d0c-05dd-477e-8384-b14eec83fc2e")
|
||||
)
|
||||
(pad "8" thru_hole circle
|
||||
(at -7.62 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "1e50c66f-49b8-4b03-9889-8cc6ca45ad8e")
|
||||
)
|
||||
(pad "8" smd roundrect
|
||||
(at -7.62 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "e7b72803-b5f0-433c-8313-83247355fb43")
|
||||
)
|
||||
(pad "9" thru_hole circle
|
||||
(at -5.08 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "808bf9dc-1c26-4a77-93c9-e4c6d5eccbb2")
|
||||
)
|
||||
(pad "9" smd roundrect
|
||||
(at -5.08 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "532de3b6-bd30-47c5-b70e-0bca6abbd997")
|
||||
)
|
||||
(pad "10" thru_hole circle
|
||||
(at -2.54 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "a792a2ac-537b-4136-8f92-b81f7ce8f753")
|
||||
)
|
||||
(pad "10" smd roundrect
|
||||
(at -2.54 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "6e3f5c75-6143-468e-bb07-d89020c03f59")
|
||||
)
|
||||
(pad "11" thru_hole circle
|
||||
(at 0 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "fb78046a-9b91-4893-b010-827957cc07be")
|
||||
)
|
||||
(pad "11" smd roundrect
|
||||
(at 0 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "5249f425-bece-432d-8076-28e1b8b386e3")
|
||||
)
|
||||
(pad "12" thru_hole circle
|
||||
(at 2.54 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "0b8ccc97-5100-4dcf-8500-e99789ee0b4c")
|
||||
)
|
||||
(pad "12" smd roundrect
|
||||
(at 2.54 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "82f1bbd1-708b-4d2d-9113-7ba3c2313670")
|
||||
)
|
||||
(pad "13" thru_hole circle
|
||||
(at 5.08 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "03882061-01af-484b-b620-9e92a3daaf68")
|
||||
)
|
||||
(pad "13" smd roundrect
|
||||
(at 5.08 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "954f51d1-3d75-42fb-a02a-7389b30718d9")
|
||||
)
|
||||
(pad "14" thru_hole circle
|
||||
(at 7.62 7.62 270)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "c6d1af47-da13-4409-9ab1-55d358cc57eb")
|
||||
)
|
||||
(pad "14" smd roundrect
|
||||
(at 7.62 8.455 270)
|
||||
(size 2.432 1.524)
|
||||
(layers "F.Cu" "F.Mask")
|
||||
(roundrect_rratio 0.1)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "6b725fd4-d6f0-46bf-b3e0-7ec07cc05622")
|
||||
)
|
||||
(embedded_fonts no)
|
||||
(model "${AMZPATH}/3dmodels/AMz3D.3dshapes/XIAO-nRF52840 v15.step"
|
||||
(hide yes)
|
||||
(offset
|
||||
(xyz -1.778 -6.096 0.381)
|
||||
)
|
||||
(scale
|
||||
(xyz 1 1 1)
|
||||
)
|
||||
(rotate
|
||||
(xyz -90 0 0)
|
||||
)
|
||||
)
|
||||
(model "${AMZPATH}/3dmodels/AMz3D.3dshapes/Seeeduino XIAO SAMD21 v4.step"
|
||||
(offset
|
||||
(xyz 0 0 0)
|
||||
)
|
||||
(scale
|
||||
(xyz 1 1 1)
|
||||
)
|
||||
(rotate
|
||||
(xyz 0 0 0)
|
||||
)
|
||||
)
|
||||
(model "${AMZPATH}/3dmodels/AMz3D.3dshapes/Seeed Studio XIAO RP2040 v26.step"
|
||||
(hide yes)
|
||||
(offset
|
||||
(xyz 0 0 0)
|
||||
)
|
||||
(scale
|
||||
(xyz 1 1 1)
|
||||
)
|
||||
(rotate
|
||||
(xyz 0 0 90)
|
||||
)
|
||||
)
|
||||
(model "${AMZPATH}/3dmodels/AMz3D.3dshapes/Seeed Studio XIAO-ESP32-C3.step"
|
||||
(hide yes)
|
||||
(offset
|
||||
(xyz -1.7018 -6.096 0)
|
||||
)
|
||||
(scale
|
||||
(xyz 1 1 1)
|
||||
)
|
||||
(rotate
|
||||
(xyz -90 0 0)
|
||||
)
|
||||
)
|
||||
(model "${AMZPATH}/3dmodels/AMz3D.3dshapes/XIAO-ESP32S3 v2.step"
|
||||
(hide yes)
|
||||
(offset
|
||||
(xyz -1.778 -6.1722 0)
|
||||
)
|
||||
(scale
|
||||
(xyz 1 1 1)
|
||||
)
|
||||
(rotate
|
||||
(xyz -90 0 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -1,569 +0,0 @@
|
|||
(footprint "XIAO-ESP32-C5-SMD-DIP"
|
||||
(version 20260206)
|
||||
(generator "pcbnew")
|
||||
(generator_version "10.0")
|
||||
(layer "F.Cu")
|
||||
(property "Reference" "REF**"
|
||||
(at 7.312 -21.336 0)
|
||||
(layer "F.SilkS")
|
||||
(uuid "7289cb19-d22c-4d43-99dc-a37a7af09173")
|
||||
(effects
|
||||
(font
|
||||
(size 0.78232 0.78232)
|
||||
(thickness 0.10668)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
)
|
||||
(property "Value" "Val**"
|
||||
(at 8.89 -10.795 0)
|
||||
(layer "F.Fab")
|
||||
(uuid "bdcd11a5-c8fd-480a-82a6-c8e8bcd29311")
|
||||
(effects
|
||||
(font
|
||||
(size 0.536448 0.536448)
|
||||
(thickness 0.073152)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Datasheet" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "11c7907a-4c88-4cd1-aade-56cc3ffbce3d")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Description" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "d2820fe3-6b02-4bb3-95b7-3d3fff9c7376")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(duplicate_pad_numbers_are_jumpers no)
|
||||
(fp_line
|
||||
(start 0 -1.987)
|
||||
(end 0 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "2c59f052-4924-49c7-bf3a-da8f762581f4")
|
||||
)
|
||||
(fp_line
|
||||
(start 1.905 -0.082)
|
||||
(end 15.875 -0.082)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "2ed15d83-c91c-402e-985a-9eaa24c859ff")
|
||||
)
|
||||
(fp_line
|
||||
(start 4.595 -21.037)
|
||||
(end 4.598728 -22.047272)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "287916b7-11ac-4b79-9dc6-349e8ddc4746")
|
||||
)
|
||||
(fp_line
|
||||
(start 5.098728 -22.547)
|
||||
(end 13.094 -22.547)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e3413d28-3aa9-4963-adb2-639c03a3bf14")
|
||||
)
|
||||
(fp_line
|
||||
(start 13.594 -22.047)
|
||||
(end 13.594 -21.037)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "433ee433-18b6-4bfa-bf63-4ea6c8cd91d7")
|
||||
)
|
||||
(fp_line
|
||||
(start 15.875 -21.037)
|
||||
(end 1.905 -21.037)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "d5635a5e-089c-498e-8414-4a3027ae8397")
|
||||
)
|
||||
(fp_line
|
||||
(start 17.78 -1.987)
|
||||
(end 17.78 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "c3641fdd-4cec-4126-bba9-5e292cf8bf86")
|
||||
)
|
||||
(fp_arc
|
||||
(start 0 -19.136)
|
||||
(mid 0.557962 -20.483038)
|
||||
(end 1.905 -21.041)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "ebbdac55-718e-4672-9d5f-44b0d386cc11")
|
||||
)
|
||||
(fp_arc
|
||||
(start 1.905 -0.082)
|
||||
(mid 0.557962 -0.639962)
|
||||
(end 0 -1.987)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "09e142d3-8be9-454d-a6e8-68cd0807b882")
|
||||
)
|
||||
(fp_arc
|
||||
(start 4.598728 -22.047272)
|
||||
(mid 4.745276 -22.400644)
|
||||
(end 5.098728 -22.547)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "6f1ff639-b216-41c7-b291-8df9f6813689")
|
||||
)
|
||||
(fp_arc
|
||||
(start 13.094 -22.547)
|
||||
(mid 13.447553 -22.400553)
|
||||
(end 13.594 -22.047)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "33b95cff-53a4-40de-b83a-b01ff651b641")
|
||||
)
|
||||
(fp_arc
|
||||
(start 15.875 -21.037)
|
||||
(mid 17.222038 -20.479038)
|
||||
(end 17.78 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "f5c73dca-587b-474c-9506-85b6a5dbb2a1")
|
||||
)
|
||||
(fp_arc
|
||||
(start 17.78 -1.987)
|
||||
(mid 17.222038 -0.639962)
|
||||
(end 15.875 -0.082)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "b2590c3b-521c-4794-96f4-54b9c7f512c3")
|
||||
)
|
||||
(fp_circle
|
||||
(center -0.21 -20.621)
|
||||
(end -0.21 -20.875)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "031cf5be-dbf5-48e7-b55c-e80db6fba62a")
|
||||
)
|
||||
(fp_circle
|
||||
(center 1.064 -19.904)
|
||||
(end 1.064 -20.158)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "a2bb00f9-1e52-4961-9e01-c6a3620a78a9")
|
||||
)
|
||||
(fp_rect
|
||||
(start 17.8 0)
|
||||
(end 0 -21)
|
||||
(stroke
|
||||
(width 0.05)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.CrtYd")
|
||||
(uuid "17d61597-c12f-438e-86cd-26bf95579021")
|
||||
)
|
||||
(fp_rect
|
||||
(start 0 -21)
|
||||
(end 17.8 0)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.Fab")
|
||||
(uuid "8fe10542-c51f-49ff-8670-cd7b22b70693")
|
||||
)
|
||||
(fp_circle
|
||||
(center 1.084 -19.9)
|
||||
(end 1.084 -20.154)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.Fab")
|
||||
(uuid "63683cfd-14cc-476e-b4f9-7a4daaf029fc")
|
||||
)
|
||||
(pad "1" smd roundrect
|
||||
(at 0.835 -18.12)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "2a534393-88c2-4d7e-9b25-ae881057dc57")
|
||||
)
|
||||
(pad "1" thru_hole circle
|
||||
(at 1.26 -18.14 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "39971d4a-ede8-4d86-8c78-fed36f7ff078")
|
||||
)
|
||||
(pad "2" smd roundrect
|
||||
(at 0.835 -15.58)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "778730c0-f8ef-4bc5-a2d2-49cef3e1a5c8")
|
||||
)
|
||||
(pad "2" thru_hole circle
|
||||
(at 1.26 -15.6 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "60d6e6cf-8424-49f9-b534-0d917feddde6")
|
||||
)
|
||||
(pad "3" smd roundrect
|
||||
(at 0.835 -13.04)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "a37ac89a-0dbc-4480-bd79-40a4874856e2")
|
||||
)
|
||||
(pad "3" thru_hole circle
|
||||
(at 1.26 -13.06 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "c3cef52b-cf4a-4b20-94d4-9920f06a32c2")
|
||||
)
|
||||
(pad "4" smd roundrect
|
||||
(at 0.835 -10.5)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "9dd4400a-d763-40d5-8df2-4f74596ce0f0")
|
||||
)
|
||||
(pad "4" thru_hole circle
|
||||
(at 1.26 -10.52 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "1cd9d96b-d96c-4261-9b60-abca04794862")
|
||||
)
|
||||
(pad "5" smd roundrect
|
||||
(at 0.835 -7.96)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "2cf548cf-85f3-43d9-8a36-e08c8bec33e8")
|
||||
)
|
||||
(pad "5" thru_hole circle
|
||||
(at 1.26 -7.98 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "72d2d8d9-81dd-49eb-8a57-71820c388d53")
|
||||
)
|
||||
(pad "6" smd roundrect
|
||||
(at 0.835 -5.42)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "ae17a813-7e06-4aa6-a595-bad75efec978")
|
||||
)
|
||||
(pad "6" thru_hole circle
|
||||
(at 1.26 -5.44 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "f55385dd-12a0-4f5b-8870-e62c32af2fc8")
|
||||
)
|
||||
(pad "7" smd roundrect
|
||||
(at 0.835 -2.88)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "f0c853cd-127b-497c-92f2-2d32416b2f9f")
|
||||
)
|
||||
(pad "7" thru_hole circle
|
||||
(at 1.26 -2.9 180)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "528c9bdf-00d3-41c7-8813-c9575c699c56")
|
||||
)
|
||||
(pad "8" thru_hole circle
|
||||
(at 16.5 -2.9)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "60c9ec27-aec8-4d4f-9230-0276f8ddf68b")
|
||||
)
|
||||
(pad "8" smd roundrect
|
||||
(at 17 -2.88)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "d00455ea-b0c0-4d93-bbdc-81c12f7ba57b")
|
||||
)
|
||||
(pad "9" thru_hole circle
|
||||
(at 16.5 -5.44)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "5a2b71de-2780-4ac3-bcea-746f0a78c774")
|
||||
)
|
||||
(pad "9" smd roundrect
|
||||
(at 17 -5.42)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "478f6a86-44ce-4970-ad0e-8db6ddbb0561")
|
||||
)
|
||||
(pad "10" thru_hole circle
|
||||
(at 16.5 -7.98)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "e35916bc-b96f-4e05-8b66-54d3f88ff104")
|
||||
)
|
||||
(pad "10" smd roundrect
|
||||
(at 17 -7.96)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "26063f43-e37a-465a-a2f8-883028ddec3c")
|
||||
)
|
||||
(pad "11" thru_hole circle
|
||||
(at 16.5 -10.52)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "8d60d831-b564-4516-acd6-2bde994c6c2e")
|
||||
)
|
||||
(pad "11" smd roundrect
|
||||
(at 17 -10.5)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "4e0c2682-5a5c-4228-8522-a5078d124180")
|
||||
)
|
||||
(pad "12" thru_hole circle
|
||||
(at 16.5 -13.06)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "e907dfc0-cb14-4296-ab05-c29bb1d0d646")
|
||||
)
|
||||
(pad "12" smd roundrect
|
||||
(at 17 -13.04)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "9ef1ce16-09d6-4ebb-aa7a-02e3ee0930aa")
|
||||
)
|
||||
(pad "13" thru_hole circle
|
||||
(at 16.5 -15.6)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "3761df0d-b80c-4c38-a1b7-dc0fa8ecaa2f")
|
||||
)
|
||||
(pad "13" smd roundrect
|
||||
(at 17 -15.58)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "94236148-baa2-42ed-bc8a-71357064d136")
|
||||
)
|
||||
(pad "14" thru_hole circle
|
||||
(at 16.5 -18.14)
|
||||
(size 1.524 1.524)
|
||||
(drill 0.889)
|
||||
(layers "*.Cu" "*.Mask")
|
||||
(remove_unused_layers no)
|
||||
(uuid "b7d37dfd-d04e-4a01-9dc0-7db8666cc822")
|
||||
)
|
||||
(pad "14" smd roundrect
|
||||
(at 17 -18.12)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "a995d04e-b409-4d6d-9828-c5a7c885040e")
|
||||
)
|
||||
(pad "15" smd circle
|
||||
(at 7.6166 -19.1415)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "dd0f7577-6290-4e73-96f2-b8d5a22bfae2")
|
||||
)
|
||||
(pad "16" smd circle
|
||||
(at 10.1566 -19.1415)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "bc571b1a-844b-4ede-be8b-eb8d95595714")
|
||||
)
|
||||
(pad "17" smd circle
|
||||
(at 7.6166 -16.6015)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "62293386-e611-4db9-9b83-9e6397ee899d")
|
||||
)
|
||||
(pad "18" smd circle
|
||||
(at 10.1566 -16.6015)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "9296da6b-fa4e-41fb-800c-4e427d70791f")
|
||||
)
|
||||
(pad "19" smd circle
|
||||
(at 7.6166 -14.0615)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "7b2d4612-967f-421e-80a9-9f8cb0e56a4b")
|
||||
)
|
||||
(pad "20" smd circle
|
||||
(at 10.1566 -14.0615)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "e9502519-37f6-427d-8ac1-c91a57e60e31")
|
||||
)
|
||||
(pad "21" smd circle
|
||||
(at 7.6166 -11.5215)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "9cc565e8-a330-4288-8a84-30034925498b")
|
||||
)
|
||||
(pad "22" smd circle
|
||||
(at 10.064 -11.5783)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "0ce47caa-4877-4cc0-806c-5f61820a68bf")
|
||||
)
|
||||
(pad "23" smd roundrect
|
||||
(at 7.3086 -4.9683 270)
|
||||
(size 2.5 1.1)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "05334df1-39c8-400d-b0bb-a6659401fe77")
|
||||
)
|
||||
(pad "24" smd roundrect
|
||||
(at 9.8486 -4.9683 270)
|
||||
(size 2.5 1.1)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "c828c680-7be4-4eb8-8aaa-0abb935706db")
|
||||
)
|
||||
(pad "25" smd roundrect
|
||||
(at 9.949 -8.412 270)
|
||||
(size 3.1 1.9)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "1545b883-dc4a-4fcb-99e4-3b7b29ed142b")
|
||||
)
|
||||
(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)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -1,457 +0,0 @@
|
|||
(footprint "XIAO-ESP32-C5-SMD"
|
||||
(version 20260206)
|
||||
(generator "pcbnew")
|
||||
(generator_version "10.0")
|
||||
(layer "F.Cu")
|
||||
(property "Reference" "REF**"
|
||||
(at 7.312 -21.336 0)
|
||||
(layer "F.SilkS")
|
||||
(uuid "557c8d74-068c-42d8-b6ab-85ab4ee867fc")
|
||||
(effects
|
||||
(font
|
||||
(size 0.78232 0.78232)
|
||||
(thickness 0.10668)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
)
|
||||
(property "Value" "Val**"
|
||||
(at 8.89 -10.795 0)
|
||||
(layer "F.Fab")
|
||||
(uuid "705e36ff-9a63-4475-ae0c-c8cfa97917f5")
|
||||
(effects
|
||||
(font
|
||||
(size 0.536448 0.536448)
|
||||
(thickness 0.073152)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Datasheet" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "229b4243-ef3c-470f-a5d9-97b6a42f008c")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(property "Description" ""
|
||||
(at 0 0 0)
|
||||
(unlocked yes)
|
||||
(layer "F.Fab")
|
||||
(hide yes)
|
||||
(uuid "7a7b1278-d112-4040-a8cd-6d0400594348")
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.15)
|
||||
)
|
||||
)
|
||||
)
|
||||
(duplicate_pad_numbers_are_jumpers no)
|
||||
(fp_line
|
||||
(start 0 -1.987)
|
||||
(end 0 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "a66c2840-6ec7-48db-8e31-5d72c9c553bf")
|
||||
)
|
||||
(fp_line
|
||||
(start 1.905 -0.082)
|
||||
(end 15.875 -0.082)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "d257aabf-9b3d-4476-84c1-ba31617c7235")
|
||||
)
|
||||
(fp_line
|
||||
(start 4.595 -21.037)
|
||||
(end 4.598728 -22.047272)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "a992b9a7-8dbf-4641-afc9-0ec10e2d7b01")
|
||||
)
|
||||
(fp_line
|
||||
(start 5.098728 -22.547)
|
||||
(end 13.094 -22.547)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "b0d13c73-b834-468a-ab90-f79b89266984")
|
||||
)
|
||||
(fp_line
|
||||
(start 13.594 -22.047)
|
||||
(end 13.594 -21.037)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "555b99e7-1219-4a0c-ac7e-db119bda8034")
|
||||
)
|
||||
(fp_line
|
||||
(start 15.875 -21.037)
|
||||
(end 1.905 -21.037)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "a8617b36-ce2c-4e94-9b21-49cec1b78e78")
|
||||
)
|
||||
(fp_line
|
||||
(start 17.78 -1.987)
|
||||
(end 17.78 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "7b2fa456-4c5d-47eb-83a9-9899ae4199ed")
|
||||
)
|
||||
(fp_arc
|
||||
(start 0 -19.136)
|
||||
(mid 0.557962 -20.483038)
|
||||
(end 1.905 -21.041)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e78b67dd-552c-4fc5-ad57-73bbafc2d044")
|
||||
)
|
||||
(fp_arc
|
||||
(start 1.905 -0.082)
|
||||
(mid 0.557962 -0.639962)
|
||||
(end 0 -1.987)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "88429fe1-7b04-471a-9890-a0b8200a074b")
|
||||
)
|
||||
(fp_arc
|
||||
(start 4.598728 -22.047272)
|
||||
(mid 4.745276 -22.400644)
|
||||
(end 5.098728 -22.547)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "c1959345-d081-4a6d-ad04-f511b2bcd3b3")
|
||||
)
|
||||
(fp_arc
|
||||
(start 13.094 -22.547)
|
||||
(mid 13.447553 -22.400553)
|
||||
(end 13.594 -22.047)
|
||||
(stroke
|
||||
(width 0.127)
|
||||
(type default)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "3834fecb-644d-483f-af5e-b4ec4ba35133")
|
||||
)
|
||||
(fp_arc
|
||||
(start 15.875 -21.037)
|
||||
(mid 17.222038 -20.479038)
|
||||
(end 17.78 -19.132)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "5e69b2f4-3544-474a-ae1a-7f149ae7eb69")
|
||||
)
|
||||
(fp_arc
|
||||
(start 17.78 -1.987)
|
||||
(mid 17.222038 -0.639962)
|
||||
(end 15.875 -0.082)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type solid)
|
||||
)
|
||||
(layer "F.SilkS")
|
||||
(uuid "1191396d-a9ec-434e-886a-91600b65a1f3")
|
||||
)
|
||||
(fp_circle
|
||||
(center -0.21 -20.621)
|
||||
(end -0.21 -20.875)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "78de167e-67f4-421d-a3d7-f90b03c3b76a")
|
||||
)
|
||||
(fp_circle
|
||||
(center 1.064 -19.904)
|
||||
(end 1.064 -20.158)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.SilkS")
|
||||
(uuid "e0ab7501-2085-405d-8904-360e96286f3d")
|
||||
)
|
||||
(fp_rect
|
||||
(start 17.8 0)
|
||||
(end 0 -21)
|
||||
(stroke
|
||||
(width 0.05)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.CrtYd")
|
||||
(uuid "68fac093-a80b-43bd-acdd-9174c2b68a7b")
|
||||
)
|
||||
(fp_rect
|
||||
(start 0 -21)
|
||||
(end 17.8 0)
|
||||
(stroke
|
||||
(width 0.1)
|
||||
(type default)
|
||||
)
|
||||
(fill no)
|
||||
(layer "F.Fab")
|
||||
(uuid "75e1e4bf-5495-4543-8162-6f2146eb31a7")
|
||||
)
|
||||
(fp_circle
|
||||
(center 1.084 -19.9)
|
||||
(end 1.084 -20.154)
|
||||
(stroke
|
||||
(width 0.5)
|
||||
(type solid)
|
||||
)
|
||||
(fill yes)
|
||||
(layer "F.Fab")
|
||||
(uuid "3f79778e-efc6-4d8a-90fc-9b0956d1e6c8")
|
||||
)
|
||||
(pad "1" smd roundrect
|
||||
(at 0.835 -18.12)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "a66a81ba-530e-4ed7-85fc-abb706366301")
|
||||
)
|
||||
(pad "2" smd roundrect
|
||||
(at 0.835 -15.58)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "2e8e6c17-1c83-40e5-886b-8ac9e111d834")
|
||||
)
|
||||
(pad "3" smd roundrect
|
||||
(at 0.835 -13.04)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "4c19fb00-2466-4963-9035-7df313ebbd03")
|
||||
)
|
||||
(pad "4" smd roundrect
|
||||
(at 0.835 -10.5)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "020dc3ce-b079-4716-befc-21c4a0b166e5")
|
||||
)
|
||||
(pad "5" smd roundrect
|
||||
(at 0.835 -7.96)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "94f0b26d-d04c-43cf-8320-ed3ef2490ead")
|
||||
)
|
||||
(pad "6" smd roundrect
|
||||
(at 0.835 -5.42)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "e24700dc-8a05-4c4d-a5b3-15a1c457d46d")
|
||||
)
|
||||
(pad "7" smd roundrect
|
||||
(at 0.835 -2.88)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "62fff5d6-54d1-422b-ad81-95284edc437b")
|
||||
)
|
||||
(pad "8" smd roundrect
|
||||
(at 17 -2.88)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "9e877d45-e3c0-44e0-9458-4922630c6a1a")
|
||||
)
|
||||
(pad "9" smd roundrect
|
||||
(at 17 -5.42)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "1d9612e2-d4b8-4c42-b755-355323253c76")
|
||||
)
|
||||
(pad "10" smd roundrect
|
||||
(at 17 -7.96)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "5b31b5e5-b0e6-4ab0-8375-70a97ef6477f")
|
||||
)
|
||||
(pad "11" smd roundrect
|
||||
(at 17 -10.5)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "a7eb43c8-fdae-4b4e-8911-e5139f09839b")
|
||||
)
|
||||
(pad "12" smd roundrect
|
||||
(at 17 -13.04)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "46ec70bc-5b25-41d9-8f94-d64bca50566e")
|
||||
)
|
||||
(pad "13" smd roundrect
|
||||
(at 17 -15.58)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "0b2adafc-0e12-42c8-82d3-09e4eaec6f34")
|
||||
)
|
||||
(pad "14" smd roundrect
|
||||
(at 17 -18.12)
|
||||
(size 2.75 2)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(solder_mask_margin 0.0508)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "b80dbfd3-3660-497c-91ee-d31b38368e21")
|
||||
)
|
||||
(pad "15" smd circle
|
||||
(at 7.6166 -19.1415)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "1e713eb0-e2b6-45a1-abce-43bbf4392316")
|
||||
)
|
||||
(pad "16" smd circle
|
||||
(at 10.1566 -19.1415)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "0b9de9dc-04ec-439c-b85b-ce655f2f5cd6")
|
||||
)
|
||||
(pad "17" smd circle
|
||||
(at 7.6166 -16.6015)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "c845e0bb-80f7-42f3-a5db-d540a8c28762")
|
||||
)
|
||||
(pad "18" smd circle
|
||||
(at 10.1566 -16.6015)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "ac3ee324-2971-4b32-a471-bcb7de28c772")
|
||||
)
|
||||
(pad "19" smd circle
|
||||
(at 7.6166 -14.0615)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "ed4179a5-d6cb-4841-818a-3e2c9a5fa81d")
|
||||
)
|
||||
(pad "20" smd circle
|
||||
(at 10.1566 -14.0615)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "032beec7-6d1b-472e-a4a2-afbf49f975b3")
|
||||
)
|
||||
(pad "21" smd circle
|
||||
(at 7.6166 -11.5215)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "25568581-39b7-4dd1-b81f-5b4a630b9650")
|
||||
)
|
||||
(pad "22" smd circle
|
||||
(at 10.064 -11.5783)
|
||||
(size 1.7 1.7)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(uuid "23bde525-d47d-40b7-84ea-dcf8234b1a5c")
|
||||
)
|
||||
(pad "23" smd roundrect
|
||||
(at 7.3086 -4.9683 270)
|
||||
(size 2.5 1.1)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "f3d763d5-6561-4c0f-9670-bb6789ac4352")
|
||||
)
|
||||
(pad "24" smd roundrect
|
||||
(at 9.8486 -4.9683 270)
|
||||
(size 2.5 1.1)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "de0f17f7-8fc6-479b-9cb3-df664992a6e4")
|
||||
)
|
||||
(pad "25" smd roundrect
|
||||
(at 9.949 -8.412 270)
|
||||
(size 3.1 1.9)
|
||||
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||
(roundrect_rratio 0.25)
|
||||
(thermal_bridge_angle 45)
|
||||
(uuid "fcf89ab9-e2b7-4fff-9ab3-5d659c4716b9")
|
||||
)
|
||||
(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)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
@ -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)
|
||||
)
|
||||
|
|
@ -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)
|
||||
)
|
||||
|
|
@ -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)
|
||||
)
|
||||
|
|
@ -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)
|
||||
)
|
||||
|
|
@ -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)
|
||||
)
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +0,0 @@
|
|||
(sym_lib_table
|
||||
(version 7)
|
||||
(lib (name "Seeed_Studio_XIAO_Series") (type "KiCad") (uri "${KIPRJMOD}/library/Seeed_Studio_XIAO_Series.kicad_sym") (options "") (descr ""))
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
## Builds common config for smartphone connected device
|
||||
## -> only receive CAM and DENMs via UART
|
||||
|
||||
cargo run --release --no-default-features -F esp,cam,denm,uart
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
## Builds common config for standalone device with automatic CAM transmission
|
||||
## -> enable SPAT/ GLOSA with GNSS and a screen + CAM transmission
|
||||
|
||||
cargo run --release -F cam_tx
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
## Builds common config for standalone device
|
||||
## -> enable SPAT/ GLOSA with GNSS and a screen
|
||||
|
||||
cargo run --release
|
||||
|
|
@ -7,32 +7,23 @@ pub fn handle_cam(etsi: &cam_pdu_descriptions::CAM) {
|
|||
// only POC output
|
||||
match &etsi.cam.cam_parameters.high_frequency_container {
|
||||
HighFrequencyContainer::basicVehicleContainerHighFrequency(obu) => {
|
||||
let station_id = etsi.header.station_id.0;
|
||||
let lat_deg = etsi
|
||||
.cam
|
||||
.cam_parameters
|
||||
.basic_container
|
||||
.reference_position
|
||||
.latitude
|
||||
.as_deg();
|
||||
let lon_deg = etsi
|
||||
.cam
|
||||
.cam_parameters
|
||||
.basic_container
|
||||
.reference_position
|
||||
.longitude
|
||||
.as_deg();
|
||||
|
||||
if obu.speed.speed_value.is_unavailable() {
|
||||
info!(
|
||||
"Got CAM from {station_id} at {lat_deg:.3}°N, {lon_deg:.3}°E, speed unavailable",
|
||||
);
|
||||
} else {
|
||||
info!(
|
||||
"Got CAM from {station_id} at {lat_deg:.3}°N, {lon_deg:.3}°E, speed {:.2} km/h",
|
||||
obu.speed.speed_value.as_kmh()
|
||||
);
|
||||
}
|
||||
info!(
|
||||
"Got CAM from {} at {:.3}°N, {:.3}°E, speed {:.2} km/h",
|
||||
etsi.header.station_id.0,
|
||||
etsi.cam
|
||||
.cam_parameters
|
||||
.basic_container
|
||||
.reference_position
|
||||
.latitude
|
||||
.as_deg(),
|
||||
etsi.cam
|
||||
.cam_parameters
|
||||
.basic_container
|
||||
.reference_position
|
||||
.longitude
|
||||
.as_deg(),
|
||||
obu.speed.speed_value.as_kmh()
|
||||
);
|
||||
}
|
||||
HighFrequencyContainer::rsuContainerHighFrequency(rsu) => {
|
||||
info!(
|
||||
|
|
|
|||
|
|
@ -1,465 +0,0 @@
|
|||
//! C-ITS CAM Transmission
|
||||
|
||||
use alloc::vec::Vec;
|
||||
|
||||
use c_its_parser::gn as geonetworking;
|
||||
use c_its_parser::standards::cam_1_4_1::cam_pdu_descriptions;
|
||||
use c_its_parser::standards::cdd_1_3_1_1::its_container;
|
||||
use c_its_parser::standards::extensions;
|
||||
|
||||
const PH_MAX_LENGHT_M: f32 = 500.;
|
||||
const PH_MAX_ITEMS: usize = 23;
|
||||
const PH_MIN_DIST_M: f32 = 20.;
|
||||
|
||||
/// Stand-alone CAM generator
|
||||
///
|
||||
/// Generates CAM messages from time and [`PosVel`] updates
|
||||
///
|
||||
/// # Send a message
|
||||
/// ```
|
||||
/// use esp32_cits_core::tx::GnItsPayload as _;
|
||||
///
|
||||
/// let (mut seq_no, mac_bytes) = {
|
||||
/// // unwrap is fine since [`esp_hal::efuse::MacAddress`] is just an `[u8; 6]`
|
||||
/// let mac_bytes = mac.as_bytes().try_into().unwrap();
|
||||
///
|
||||
/// (0, mac_bytes)
|
||||
/// };
|
||||
///
|
||||
/// let mut cam = {
|
||||
/// let station_id = make_station_id(mac);
|
||||
/// info!("V2X Station ID: {station_id}");
|
||||
///
|
||||
/// applogic::cam_tx::CamState::new(
|
||||
/// station_id,
|
||||
/// OWN_STATION_TYPE,
|
||||
/// OWN_VEHICLE_LENGTH,
|
||||
/// OWN_VEHICLE_WIDTH,
|
||||
/// )
|
||||
/// };
|
||||
///
|
||||
/// cam.update(time, fix.clone().into());
|
||||
/// match cam.encode_packet(mac_bytes, pos_vel, time, GN_IS_MOBILE, &mut seq_no) {
|
||||
/// Ok(data) => {
|
||||
/// if let Err(err) =
|
||||
/// radio::send_80211_bcast_frame(&mut wlan_iface, &mac_bytes.clone(), &data)
|
||||
/// {
|
||||
/// warn!("Failed to send 802.11 frame: {err}");
|
||||
/// }
|
||||
/// }
|
||||
/// Err(err) => warn!("Failed to create CAM: {err}"),
|
||||
/// }
|
||||
/// ```
|
||||
#[derive(Debug)]
|
||||
pub struct CamState {
|
||||
station_id: u32,
|
||||
station_type: its_container::StationType,
|
||||
|
||||
vehicle_length_dm: u16, // vehicle length is in 10cm steps
|
||||
vehicle_width_dm: u8, // vehicle width is in 10cm steps
|
||||
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
pos_state: esp32_cits_core::PosVel,
|
||||
|
||||
/// database for path history, oldest item at the back of the vector
|
||||
path_history: Vec<PathPoint>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
struct PathPoint {
|
||||
pos: geo_types::Point,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
/// distance to previous point. Ignore on last point!
|
||||
dist_m: f32,
|
||||
}
|
||||
|
||||
impl PathPoint {
|
||||
fn new_from_pos(pos: &esp32_cits_core::PosVel, time: chrono::DateTime<chrono::Utc>) -> Self {
|
||||
Self {
|
||||
pos: pos.position,
|
||||
time,
|
||||
dist_m: 0.,
|
||||
}
|
||||
}
|
||||
|
||||
fn new_from_pos_with_dist(
|
||||
pos: &esp32_cits_core::PosVel,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
dist_m: f32,
|
||||
) -> Self {
|
||||
Self {
|
||||
pos: pos.position,
|
||||
time,
|
||||
dist_m,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl CamState {
|
||||
pub fn new(
|
||||
station_id: u32,
|
||||
station_type: c_its_parser::standards::extensions::ItsStationType,
|
||||
vehicle_length_dm: u16,
|
||||
vehicle_width_dm: u8,
|
||||
) -> Self {
|
||||
Self {
|
||||
station_id,
|
||||
station_type: station_type.into(),
|
||||
vehicle_length_dm,
|
||||
vehicle_width_dm,
|
||||
time: chrono::DateTime::<chrono::Utc>::default(),
|
||||
pos_state: esp32_cits_core::PosVel::default(),
|
||||
path_history: Vec::with_capacity(PH_MAX_ITEMS + 1),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn update(&mut self, time: chrono::DateTime<chrono::Utc>, pos: esp32_cits_core::PosVel) {
|
||||
self.time = time;
|
||||
self.pos_state = pos;
|
||||
|
||||
// Update path history
|
||||
Self::update_ph(&mut self.path_history, time, &self.pos_state);
|
||||
}
|
||||
|
||||
// this is a function, not a method for easier testing
|
||||
fn update_ph(
|
||||
path_history: &mut Vec<PathPoint>,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
pos: &esp32_cits_core::PosVel,
|
||||
) {
|
||||
// Update path history
|
||||
if path_history.is_empty() {
|
||||
// prime with current position if empty
|
||||
path_history.push(PathPoint::new_from_pos(pos, time));
|
||||
} else {
|
||||
// unwrap is fine since we checked for non-empty before
|
||||
let prev = path_history.first().unwrap();
|
||||
|
||||
// only add a point, if we moved more than PH_MIN_DIST_M
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let dist = crate::geo_alg::haversine_dist(&prev.pos, &pos.position) as f32;
|
||||
if dist > PH_MIN_DIST_M {
|
||||
// new items shall be at the front of the vector
|
||||
path_history.insert(0, PathPoint::new_from_pos_with_dist(pos, time, dist));
|
||||
}
|
||||
}
|
||||
|
||||
// check length (PH_MAX_LENGHT_M and PH_MAX_ITEMS points max)
|
||||
if path_history.len() > PH_MAX_ITEMS {
|
||||
let _ = path_history.pop();
|
||||
}
|
||||
|
||||
let (_, cutoff_idx) =
|
||||
path_history
|
||||
.iter()
|
||||
.enumerate()
|
||||
.fold((0., None), |(len, cutoff_idx), (idx, item)| {
|
||||
if cutoff_idx.is_none() {
|
||||
let new_len = len + item.dist_m;
|
||||
let new_cutoff_idx = if len > PH_MAX_LENGHT_M {
|
||||
Some(idx)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
(new_len, new_cutoff_idx)
|
||||
} else {
|
||||
(len, cutoff_idx)
|
||||
}
|
||||
});
|
||||
if let Some(idx) = cutoff_idx {
|
||||
path_history.drain(idx..);
|
||||
}
|
||||
}
|
||||
|
||||
fn make_ph(&self) -> Vec<its_container::PathPoint> {
|
||||
let mut ph = alloc::vec![];
|
||||
|
||||
self.path_history.iter().fold(
|
||||
PathPoint::new_from_pos(&self.pos_state, self.time),
|
||||
|prev_point, pt| {
|
||||
// calculate delta position and append to `ph`
|
||||
|
||||
let delta_time = pt.time - prev_point.time;
|
||||
let delta_lat = pt.pos.y() - prev_point.pos.y();
|
||||
let delta_lon = pt.pos.x() - prev_point.pos.x();
|
||||
|
||||
// delta time is in 1/100 second / 10 ms steps
|
||||
let path_delta_time = its_container::PathDeltaTime(
|
||||
(delta_time.num_milliseconds().abs() / 10)
|
||||
.min(65_535) // clamp to max value
|
||||
.into(),
|
||||
);
|
||||
let delta_latitude = its_container::DeltaLatitude::from_deg(delta_lat);
|
||||
let delta_longitude = its_container::DeltaLongitude::from_deg(delta_lon);
|
||||
let delta_altitude = its_container::DeltaAltitude::unavailable();
|
||||
|
||||
let ppoint = its_container::PathPoint::new(
|
||||
its_container::DeltaReferencePosition::new(
|
||||
delta_latitude,
|
||||
delta_longitude,
|
||||
delta_altitude,
|
||||
),
|
||||
Some(path_delta_time),
|
||||
);
|
||||
|
||||
ph.push(ppoint);
|
||||
|
||||
*pt
|
||||
},
|
||||
);
|
||||
|
||||
ph
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_lines)]
|
||||
fn make_cam(&self) -> Result<cam_pdu_descriptions::CAM, alloc::string::String> {
|
||||
let header = its_container::ItsPduHeader::new(
|
||||
2,
|
||||
extensions::ItsMessageId::Cam.as_u8(),
|
||||
its_container::StationID(self.station_id),
|
||||
);
|
||||
|
||||
let generation_delta_time = {
|
||||
let its_timestamp = c_its_parser::time_utils::TimestampIts::from(self.time);
|
||||
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let ts_mod = (its_timestamp.0 % 65_536) as u16;
|
||||
|
||||
cam_pdu_descriptions::GenerationDeltaTime(ts_mod)
|
||||
};
|
||||
|
||||
let heading = match self.pos_state.heading_deg {
|
||||
Some(value) => its_container::Heading {
|
||||
heading_value: its_container::HeadingValue::from_deg(value)
|
||||
.map_err(|err| alloc::format!("Failed to make HeadingValue: {err}"))?,
|
||||
heading_confidence: its_container::HeadingConfidence(127), // unavailable for now
|
||||
},
|
||||
None => its_container::Heading {
|
||||
heading_value: its_container::HeadingValue(0),
|
||||
heading_confidence: its_container::HeadingConfidence(127), // unavailable for now
|
||||
},
|
||||
};
|
||||
let speed = match self.pos_state.speed_mps {
|
||||
Some(value) => its_container::Speed {
|
||||
speed_value: its_container::SpeedValue::from_mps(value)
|
||||
.map_err(|err| alloc::format!("Failed to make SpeedValue: {err}"))?,
|
||||
speed_confidence: its_container::SpeedConfidence(127), // unavailable for now
|
||||
},
|
||||
None => its_container::Speed {
|
||||
speed_value: its_container::SpeedValue(0),
|
||||
speed_confidence: its_container::SpeedConfidence(127), // unavailable for now
|
||||
},
|
||||
};
|
||||
let reference_position = its_container::ReferencePosition {
|
||||
latitude: its_container::Latitude::from_deg(self.pos_state.position.y()),
|
||||
longitude: its_container::Longitude::from_deg(self.pos_state.position.x()),
|
||||
position_confidence_ellipse: its_container::PosConfidenceEllipse {
|
||||
semi_major_confidence: its_container::SemiAxisLength(4095), // unavailable for now
|
||||
semi_minor_confidence: its_container::SemiAxisLength(4095), // unavailable for now
|
||||
semi_major_orientation: its_container::HeadingValue::unavailable(),
|
||||
},
|
||||
altitude: its_container::Altitude {
|
||||
altitude_value: its_container::AltitudeValue(800_001), // unavailable for now
|
||||
altitude_confidence: its_container::AltitudeConfidence::unavailable,
|
||||
},
|
||||
};
|
||||
|
||||
let basic_container = cam_pdu_descriptions::BasicContainer::new(
|
||||
self.station_type.clone(),
|
||||
reference_position,
|
||||
);
|
||||
let high_frequency_container =
|
||||
cam_pdu_descriptions::HighFrequencyContainer::basicVehicleContainerHighFrequency(
|
||||
cam_pdu_descriptions::BasicVehicleContainerHighFrequency {
|
||||
heading,
|
||||
speed,
|
||||
drive_direction: its_container::DriveDirection::unavailable,
|
||||
vehicle_length: its_container::VehicleLength {
|
||||
vehicle_length_value: its_container::VehicleLengthValue(
|
||||
self.vehicle_length_dm,
|
||||
),
|
||||
vehicle_length_confidence_indication:
|
||||
its_container::VehicleLengthConfidenceIndication::unavailable,
|
||||
},
|
||||
vehicle_width: its_container::VehicleWidth(self.vehicle_width_dm),
|
||||
longitudinal_acceleration: its_container::LongitudinalAcceleration {
|
||||
longitudinal_acceleration_value:
|
||||
its_container::LongitudinalAccelerationValue::unavailable(),
|
||||
longitudinal_acceleration_confidence: its_container::AccelerationConfidence(
|
||||
102, // unavailable
|
||||
),
|
||||
},
|
||||
curvature: its_container::Curvature {
|
||||
curvature_value: its_container::CurvatureValue::unavailable(),
|
||||
curvature_confidence: its_container::CurvatureConfidence::unavailable,
|
||||
},
|
||||
curvature_calculation_mode:
|
||||
its_container::CurvatureCalculationMode::unavailable,
|
||||
yaw_rate: its_container::YawRate {
|
||||
yaw_rate_value: its_container::YawRateValue::unavailable(),
|
||||
yaw_rate_confidence: its_container::YawRateConfidence::unavailable,
|
||||
},
|
||||
acceleration_control: None,
|
||||
lane_position: None,
|
||||
steering_wheel_angle: None,
|
||||
lateral_acceleration: None,
|
||||
vertical_acceleration: None,
|
||||
performance_class: None,
|
||||
cen_dsrc_tolling_zone: None,
|
||||
},
|
||||
);
|
||||
let low_frequency_container =
|
||||
cam_pdu_descriptions::LowFrequencyContainer::basicVehicleContainerLowFrequency(
|
||||
cam_pdu_descriptions::BasicVehicleContainerLowFrequency {
|
||||
vehicle_role: its_container::VehicleRole::default,
|
||||
exterior_lights: its_container::ExteriorLights::default(),
|
||||
path_history: its_container::PathHistory(self.make_ph()),
|
||||
},
|
||||
);
|
||||
|
||||
let cam_parameters = cam_pdu_descriptions::CamParameters::new(
|
||||
basic_container,
|
||||
high_frequency_container,
|
||||
Some(low_frequency_container),
|
||||
None,
|
||||
);
|
||||
|
||||
Ok(cam_pdu_descriptions::CAM::new(
|
||||
header,
|
||||
cam_pdu_descriptions::CoopAwareness::new(generation_delta_time, cam_parameters),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
impl esp32_cits_core::tx::GnItsPayload for CamState {
|
||||
fn make_eh(
|
||||
&self,
|
||||
address: [u8; 6],
|
||||
own_position: &esp32_cits_core::PosVel,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
_seq_no: &mut u16,
|
||||
) -> Result<
|
||||
(
|
||||
geonetworking::en302636_4_1::ExtendedHeader,
|
||||
Option<geonetworking::en302636_4_1::AreaType>,
|
||||
u8,
|
||||
),
|
||||
alloc::string::String,
|
||||
> {
|
||||
let station_type = geonetworking::en302636_4_1::StationType::try_from(self.station_type.0)
|
||||
.unwrap_or_default();
|
||||
|
||||
// CAM always uses SHB, hop-limit 1
|
||||
Ok((
|
||||
esp32_cits_core::tx::gn::make_shb_eh(address, station_type, own_position, time)?,
|
||||
None,
|
||||
1,
|
||||
))
|
||||
}
|
||||
|
||||
fn make_payload(
|
||||
&self,
|
||||
) -> Result<(Vec<u8>, c_its_parser::standards::extensions::ItsMessageId), alloc::string::String>
|
||||
{
|
||||
let msg = self.make_cam()?;
|
||||
let uper = msg.encode_to_uper()?;
|
||||
Ok((uper, c_its_parser::standards::extensions::ItsMessageId::Cam))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use alloc::vec;
|
||||
|
||||
use super::*;
|
||||
use crate::init_test_env_logger;
|
||||
|
||||
fn posstate_from_pos(position: geo_types::Point) -> esp32_cits_core::PosVel {
|
||||
esp32_cits_core::PosVel {
|
||||
position,
|
||||
heading_deg: None,
|
||||
speed_mps: None,
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cam_path_history_update() {
|
||||
init_test_env_logger();
|
||||
|
||||
let time = chrono::DateTime::from_timestamp(0, 0).unwrap();
|
||||
let p1 = geo_types::Point::new(10., 53.5);
|
||||
let p2 = geo_types::Point::new(10., 53.5 + 0.000045); // ~5m further (< PH_MIN_DIST_M)
|
||||
let p3 = geo_types::Point::new(10., 53.5 + 0.00027); // ~30m further (> PH_MIN_DIST_M)
|
||||
|
||||
let ps1 = posstate_from_pos(p1);
|
||||
let pp1 = PathPoint::new_from_pos(&ps1, time);
|
||||
let ps2 = posstate_from_pos(p2);
|
||||
let pp2 = PathPoint::new_from_pos(&ps2, time);
|
||||
let ps3 = posstate_from_pos(p3);
|
||||
let pp3 = PathPoint::new_from_pos_with_dist(&ps3, time, 30.02267);
|
||||
|
||||
let mut path_history: Vec<PathPoint> = vec![];
|
||||
|
||||
// add first point, expect one point in PH
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p1));
|
||||
assert_eq!(1, path_history.len());
|
||||
assert_eq!(&pp1, path_history.first().unwrap());
|
||||
|
||||
// add insignificant point, expect still one point in PH
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p2));
|
||||
assert_eq!(1, path_history.len());
|
||||
assert_eq!(&pp1, path_history.first().unwrap());
|
||||
|
||||
// add significantly moved point, expect [pp3, pp1] vector
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p3));
|
||||
assert_eq!(2, path_history.len());
|
||||
assert_eq!(&pp3, path_history.first().unwrap());
|
||||
assert_eq!(&pp1, path_history.last().unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cam_path_history_max_len() {
|
||||
init_test_env_logger();
|
||||
|
||||
let time = chrono::DateTime::from_timestamp(0, 0).unwrap();
|
||||
let p1 = geo_types::Point::new(10., 53.5);
|
||||
let p2 = geo_types::Point::new(10., 53.5 + 0.00023); // at ~25m from p1 (> PH_MIN_DIST_M)
|
||||
let p3 = geo_types::Point::new(10., 53.5 + 0.00445); // at ~495m from p1 (slightly less than PH_MAX_LENGHT_M)
|
||||
let p4 = geo_types::Point::new(10., 53.5 + 0.00477); // at ~530m from p1 (slightly more than PH_MAX_LENGHT_M)
|
||||
|
||||
let ps1 = posstate_from_pos(p1);
|
||||
let pp1 = PathPoint::new_from_pos(&ps1, time);
|
||||
let ps2 = posstate_from_pos(p2);
|
||||
let pp2 = PathPoint::new_from_pos(&ps2, time);
|
||||
let ps3 = posstate_from_pos(p3);
|
||||
let pp3 = PathPoint::new_from_pos(&ps3, time);
|
||||
let ps4 = posstate_from_pos(p4);
|
||||
let pp4 = PathPoint::new_from_pos(&ps4, time);
|
||||
|
||||
let mut path_history: Vec<PathPoint> = vec![];
|
||||
|
||||
// prime with p3, p4 (should give a length of ~470m)
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p4));
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p3));
|
||||
assert_eq!(2, path_history.len());
|
||||
|
||||
// Add p2, should drop p4 from vector because of > PH_MAX_LENGHT_M
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p2));
|
||||
assert_eq!(2, path_history.len());
|
||||
assert_eq!(p2, path_history.get(0).unwrap().pos);
|
||||
assert_eq!(469.24323, path_history.get(0).unwrap().dist_m);
|
||||
assert_eq!(p3, path_history.get(1).unwrap().pos);
|
||||
assert_eq!(35.582424, path_history.get(1).unwrap().dist_m);
|
||||
|
||||
// Add p1, should not drop anything from vector because still < PH_MAX_LENGHT_M
|
||||
CamState::update_ph(&mut path_history, time, &posstate_from_pos(p1));
|
||||
assert_eq!(3, path_history.len());
|
||||
assert_eq!(p1, path_history.get(0).unwrap().pos);
|
||||
assert_eq!(25.57487, path_history.get(0).unwrap().dist_m);
|
||||
assert_eq!(p2, path_history.get(1).unwrap().pos);
|
||||
assert_eq!(469.24323, path_history.get(1).unwrap().dist_m);
|
||||
assert_eq!(p3, path_history.get(2).unwrap().pos);
|
||||
assert_eq!(35.582424, path_history.get(2).unwrap().dist_m);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
//! C-ITS DENM Evaluation
|
||||
|
||||
use c_its_parser::standards::denm_2_2_1::denm_pdu_description;
|
||||
use log::info;
|
||||
|
||||
pub fn handle_denm(etsi: &denm_pdu_description::DENM) {
|
||||
let mgmt = &etsi.denm.management;
|
||||
|
||||
if mgmt.termination.is_some() {
|
||||
return;
|
||||
}
|
||||
|
||||
if let (Some(sit), Some(loc)) = (&etsi.denm.situation, &etsi.denm.location) {
|
||||
// let timestamp: chrono::DateTime<chrono::Utc> = mgmt.reference_time.clone().into();
|
||||
let end_time = chrono::DateTime::<chrono::Utc>::from(mgmt.reference_time.clone())
|
||||
+ chrono::Duration::seconds(mgmt.validity_duration.0.into());
|
||||
let station_id = &mgmt.action_id.originating_station_id.0;
|
||||
let seq_num = mgmt.action_id.sequence_number.0;
|
||||
|
||||
let lat_deg = mgmt.event_position.latitude.as_deg();
|
||||
let lon_deg = mgmt.event_position.longitude.as_deg();
|
||||
|
||||
let heading = loc
|
||||
.event_position_heading
|
||||
.as_ref()
|
||||
.map(|v| v.value.as_deg());
|
||||
|
||||
// let direction = mgmt.traffic_direction;
|
||||
|
||||
let (cc, scc) = sit.event_type.cc_and_scc.to_u8_tuple();
|
||||
|
||||
if let Some(hdg) = heading {
|
||||
info!(
|
||||
"DENN: {station_id}/{seq_num} CC {cc}/{scc} at {lat_deg:.3}°N, {lon_deg:.3}°E, hdg {hdg:.1}° until {end_time:?}"
|
||||
);
|
||||
} else {
|
||||
info!(
|
||||
"DENN: {station_id}/{seq_num} CC {cc}/{scc} at {lat_deg:.3}°N, {lon_deg:.3}°E until {end_time:?}"
|
||||
);
|
||||
}
|
||||
} else {
|
||||
info!("DENM: One of situation or location container not available");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,769 +1,4 @@
|
|||
//! Application Logic
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
use alloc::rc::Rc;
|
||||
#[cfg(feature = "spat")]
|
||||
use alloc::vec::Vec;
|
||||
|
||||
use log::info;
|
||||
#[cfg(feature = "spat")]
|
||||
use log::warn;
|
||||
#[cfg(feature = "spat")]
|
||||
use log::{debug, error};
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
use crate::{applogic::v2x::map, geo_alg};
|
||||
|
||||
pub mod v2x;
|
||||
|
||||
#[cfg(feature = "cam")]
|
||||
pub mod cam;
|
||||
#[cfg(any(feature = "cam_tx", test))]
|
||||
pub mod cam_tx;
|
||||
#[cfg(feature = "denm")]
|
||||
pub mod denm;
|
||||
#[cfg(feature = "spat")]
|
||||
pub mod tlc;
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
const TLC_CACHE_LIFETIME: chrono::Duration = chrono::Duration::minutes(1);
|
||||
#[cfg(feature = "spat")]
|
||||
const PRUNE_INTERVAL: chrono::Duration = chrono::Duration::seconds(5);
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_SEARCH_DIST_M: f32 = 400.;
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_SEARCH_ANGLE_PARAMS: [(f32, f32); 2] = [(400., 45.), (50., 180.)]; // far and near (distance, angle) tuple
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_LANE_HEADING_DIFF_DEG: f32 = 35.;
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_AT_LANE_OFFSET_M: f64 = 10.;
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_LANE_LEFT_OFFSET_M: f64 = 20.;
|
||||
#[cfg(feature = "spat")]
|
||||
const GLOSA_STOP_LINE_PASSED_M: f64 = 5.;
|
||||
|
||||
#[allow(unused)]
|
||||
pub struct State {
|
||||
initialized: bool,
|
||||
time: chrono::NaiveDateTime,
|
||||
|
||||
#[allow(unused)]
|
||||
pos: esp32_cits_core::PosVel,
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
last_prune: chrono::NaiveDateTime,
|
||||
#[cfg(feature = "spat")]
|
||||
tlc_cache: tlc::Data,
|
||||
|
||||
// GLOSA
|
||||
#[cfg(feature = "spat")]
|
||||
#[allow(clippy::struct_field_names)]
|
||||
glosa_state: GlosaState,
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug)]
|
||||
pub enum GlosaOutput {
|
||||
Error(alloc::string::String),
|
||||
Searching(GlosaSearching),
|
||||
Found(GlosaFound),
|
||||
Locked(GlosaSignalInfo),
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct GlosaSearching {
|
||||
pub known_intersection_ids: Vec<u16>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct GlosaFound {
|
||||
pub intersection_id: u16,
|
||||
pub approach_id: Option<u8>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
impl From<&TlData> for GlosaFound {
|
||||
fn from(value: &TlData) -> Self {
|
||||
Self {
|
||||
intersection_id: value.intersection_id,
|
||||
approach_id: value.approach_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct GlosaSignalInfo {
|
||||
pub intersection_id: u16,
|
||||
pub signal_groups: Vec<SignalGroupData>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
||||
pub struct SignalGroupData {
|
||||
pub phase: SignalPhase,
|
||||
pub maneuver: map::Maneuvers,
|
||||
pub usages: Vec<map::UsageType>,
|
||||
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")]
|
||||
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
||||
pub enum SignalPhase {
|
||||
#[default]
|
||||
Unknown,
|
||||
Red,
|
||||
RedYellow,
|
||||
Green,
|
||||
Yellow,
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
#[derive(Debug, Default, Clone, PartialEq)]
|
||||
pub struct GnssFix {
|
||||
pub time: Option<chrono::NaiveDateTime>,
|
||||
pub latitude_deg: f64,
|
||||
pub longitude_deg: f64,
|
||||
pub heading_deg: Option<f32>,
|
||||
pub speed_mps: Option<f32>,
|
||||
}
|
||||
|
||||
impl From<&GnssFix> for esp32_cits_core::PosVel {
|
||||
fn from(value: &GnssFix) -> Self {
|
||||
let position = geo_types::Point::new(value.longitude_deg, value.latitude_deg);
|
||||
|
||||
Self {
|
||||
position,
|
||||
heading_deg: value.heading_deg,
|
||||
speed_mps: value.speed_mps,
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<GnssFix> for esp32_cits_core::PosVel {
|
||||
fn from(value: GnssFix) -> Self {
|
||||
(&value).into()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
impl core::fmt::Display for SignalPhase {
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
match self {
|
||||
SignalPhase::Unknown => write!(f, "__"),
|
||||
SignalPhase::Red => write!(f, "RE"),
|
||||
SignalPhase::RedYellow => write!(f, "RY"),
|
||||
SignalPhase::Green => write!(f, "GN"),
|
||||
SignalPhase::Yellow => write!(f, "YE"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
impl From<c_its_parser::standards::dsrc_2_2_1::etsi_its_dsrc::MovementPhaseState> for SignalPhase {
|
||||
fn from(value: c_its_parser::standards::dsrc_2_2_1::etsi_its_dsrc::MovementPhaseState) -> Self {
|
||||
use c_its_parser::standards::dsrc_2_2_1::etsi_its_dsrc::MovementPhaseState;
|
||||
|
||||
match value {
|
||||
MovementPhaseState::stop_And_Remain => SignalPhase::Red,
|
||||
MovementPhaseState::pre_Movement => SignalPhase::RedYellow,
|
||||
MovementPhaseState::permissive_Movement_Allowed
|
||||
| MovementPhaseState::protected_Movement_Allowed => SignalPhase::Green,
|
||||
MovementPhaseState::permissive_clearance | MovementPhaseState::protected_clearance => {
|
||||
SignalPhase::Yellow
|
||||
}
|
||||
_ => SignalPhase::Unknown,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug, Default)]
|
||||
enum GlosaState {
|
||||
#[default]
|
||||
Idle,
|
||||
Locked(TlData),
|
||||
}
|
||||
|
||||
/// Where we are and pre-processed information about the current intersection
|
||||
#[cfg(feature = "spat")]
|
||||
#[derive(Debug)]
|
||||
struct TlData {
|
||||
intersection_id: u16, // mostly for debug printing
|
||||
intersection: Rc<core::cell::RefCell<v2x::map::Intersection>>,
|
||||
|
||||
lane_id: u8,
|
||||
approach_id: Option<u8>,
|
||||
|
||||
signal_groups: Vec<u8>,
|
||||
}
|
||||
|
||||
impl State {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
initialized: false,
|
||||
time: chrono::NaiveDateTime::default(),
|
||||
pos: esp32_cits_core::PosVel::default(),
|
||||
#[cfg(feature = "spat")]
|
||||
last_prune: chrono::NaiveDateTime::default(),
|
||||
#[cfg(feature = "spat")]
|
||||
tlc_cache: tlc::Data::new(TLC_CACHE_LIFETIME),
|
||||
#[cfg(feature = "spat")]
|
||||
glosa_state: GlosaState::default(),
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
#[cfg(feature = "esp")]
|
||||
pub fn update_with_gpsfix(&mut self, fix: &GnssFix) {
|
||||
self.pos = fix.into();
|
||||
if let Some(time) = fix.time {
|
||||
self.time = time;
|
||||
|
||||
if !self.initialized {
|
||||
info!("GNSS fix: {}", self.print_fix());
|
||||
}
|
||||
self.initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn print_fix(&self) -> alloc::string::String {
|
||||
alloc::format!(
|
||||
"{:?}, {:.4} N, {:.4} E, {:.0}°, {:.2} m/s",
|
||||
self.time,
|
||||
self.pos.position.y(),
|
||||
self.pos.position.x(),
|
||||
self.pos.heading_deg.unwrap_or_default(),
|
||||
self.pos.speed_mps.unwrap_or_default(),
|
||||
)
|
||||
}
|
||||
|
||||
#[allow(clippy::unused_self)]
|
||||
pub fn prune(&mut self) {
|
||||
#[cfg(feature = "spat")]
|
||||
if self.last_prune + PRUNE_INTERVAL < self.time {
|
||||
self.tlc_cache.prune(self.time);
|
||||
|
||||
info!("Known int.: {:?}", self.tlc_cache.known_intersections());
|
||||
|
||||
self.last_prune = self.time;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
pub fn handle_mapem(&mut self, etsi: &tlc::MAPEM) {
|
||||
self.tlc_cache.handle_mapem(self.time, etsi);
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
pub fn handle_spatem(&mut self, etsi: &tlc::SPATEM) {
|
||||
self.tlc_cache.handle_spatem(self.time, etsi);
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[allow(clippy::too_many_lines)]
|
||||
pub fn run_glosa(&mut self) -> GlosaOutput {
|
||||
let Some(own_heading) = self.pos.heading_deg else {
|
||||
use alloc::string::ToString;
|
||||
|
||||
return GlosaOutput::Error("Heading unknown".to_string());
|
||||
};
|
||||
|
||||
let known_intersection_ids = self.tlc_cache.known_intersections();
|
||||
let (state_update, output_data) = match &self.glosa_state {
|
||||
// search for upcoming intersection
|
||||
GlosaState::Idle => {
|
||||
debug!(
|
||||
"GLOSA: Searching with {} known intersections",
|
||||
known_intersection_ids.len()
|
||||
);
|
||||
|
||||
if let Some(search_result) =
|
||||
Self::find_intersection(&self.pos.position, own_heading, &self.tlc_cache)
|
||||
{
|
||||
info!(
|
||||
"GLOSA: Approach has signal groups: {:?}",
|
||||
search_result.signal_groups
|
||||
);
|
||||
|
||||
let glosa_found_data = (&search_result).into();
|
||||
(
|
||||
Some(GlosaState::Locked(search_result)),
|
||||
GlosaOutput::Found(glosa_found_data),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
None,
|
||||
GlosaOutput::Searching(GlosaSearching {
|
||||
known_intersection_ids,
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
GlosaState::Locked(info) => {
|
||||
debug!(
|
||||
"GLOSA: Re-evaluating intersection {:4} (at lane {:3})",
|
||||
info.intersection_id, info.lane_id
|
||||
);
|
||||
|
||||
// ensure that "our" intersection is kept in TLC cache
|
||||
if self
|
||||
.tlc_cache
|
||||
.keep_intersection(info.intersection_id, self.time)
|
||||
.is_err()
|
||||
{
|
||||
info!("GLOSA: Intersection not known any more");
|
||||
(
|
||||
Some(GlosaState::Idle),
|
||||
GlosaOutput::Searching(GlosaSearching {
|
||||
known_intersection_ids,
|
||||
}),
|
||||
)
|
||||
} else {
|
||||
// determine if intersection is left
|
||||
let intersection = info.intersection.borrow();
|
||||
if Self::is_intersection_left(
|
||||
&intersection,
|
||||
info.lane_id,
|
||||
info.approach_id,
|
||||
&self.pos.position,
|
||||
) {
|
||||
info!("GLOSA: Intersection was left -> back to idle");
|
||||
(
|
||||
Some(GlosaState::Idle),
|
||||
GlosaOutput::Searching(GlosaSearching {
|
||||
known_intersection_ids,
|
||||
}),
|
||||
)
|
||||
} else {
|
||||
// get signal groups which are in our approach and have a maneuver
|
||||
let mut approach_sig_grps = intersection
|
||||
.signal_groups()
|
||||
.iter()
|
||||
.filter_map(|i| {
|
||||
if let Some(maneuver) = i.maneuvers()
|
||||
&& info
|
||||
.signal_groups
|
||||
.iter()
|
||||
.find(|sg_id| **sg_id == i.id())
|
||||
.is_some()
|
||||
{
|
||||
let phase = i
|
||||
.phase()
|
||||
.map(core::convert::Into::into)
|
||||
.unwrap_or_default();
|
||||
let timing = TimingData::new(i, self.time.and_utc());
|
||||
let usages = i.source_lane_usages().to_vec();
|
||||
|
||||
Some(SignalGroupData {
|
||||
phase,
|
||||
maneuver,
|
||||
usages,
|
||||
timing,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.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,
|
||||
GlosaOutput::Locked(GlosaSignalInfo {
|
||||
intersection_id: intersection.id(),
|
||||
signal_groups: approach_sig_grps,
|
||||
}),
|
||||
) // keep state, return signal groups
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// can't update the state from within the match statement, so do it here
|
||||
if let Some(new) = state_update {
|
||||
self.glosa_state = new;
|
||||
}
|
||||
|
||||
output_data
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[allow(clippy::too_many_lines)]
|
||||
fn find_intersection(
|
||||
own_pos: &geo_types::Point,
|
||||
own_heading: f32,
|
||||
tlc_cache: &tlc::Data,
|
||||
) -> Option<TlData> {
|
||||
// filter known intersections by distance (and bearing)
|
||||
let upcoming_intersections = tlc_cache.intersections_matching(|i| {
|
||||
let int_pos = i.center();
|
||||
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let distance = geo_alg::haversine_dist(own_pos, &int_pos) as f32;
|
||||
let bearing = geo_alg::haversine_bearing(own_pos, &int_pos);
|
||||
let bearing_diff = geo_alg::deg_180(own_heading - bearing);
|
||||
|
||||
distance < GLOSA_SEARCH_DIST_M && bearing_diff.abs() < Self::get_search_angle(distance)
|
||||
});
|
||||
|
||||
info!(
|
||||
"GLOSA: upcoming int. count: {}",
|
||||
upcoming_intersections.len()
|
||||
);
|
||||
|
||||
// determine relevant approach
|
||||
for int in upcoming_intersections {
|
||||
let intersection = int.borrow();
|
||||
let lanes = intersection.ingress_lanes();
|
||||
|
||||
let own_pos_cart = geo_alg::lonlat_to_dcart(&intersection.ref_point(), own_pos);
|
||||
|
||||
// find lanes with matching heading
|
||||
let relevant_lanes = lanes
|
||||
.iter()
|
||||
.filter(|i| {
|
||||
let lane_heading = i.get_heading();
|
||||
let heading_diff = geo_alg::deg_180(own_heading - lane_heading);
|
||||
|
||||
debug!(
|
||||
" - Lane {:4}/{:03} has heading {lane_heading:4.0} -> diff {heading_diff:4.0}°",
|
||||
intersection.id(),
|
||||
i.id()
|
||||
);
|
||||
|
||||
heading_diff.abs() < GLOSA_LANE_HEADING_DIFF_DEG
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
info!(
|
||||
"GLOSA: Int {:4} has {} relevant lanes",
|
||||
intersection.id(),
|
||||
relevant_lanes.len()
|
||||
);
|
||||
for lane in &relevant_lanes {
|
||||
info!(
|
||||
" - lane {:03} from appr. {:?}, usages {:?}",
|
||||
lane.id(),
|
||||
lane.approach_id(),
|
||||
lane.usages()
|
||||
);
|
||||
}
|
||||
|
||||
// determine in which lane/ approach we are
|
||||
let current_lane = relevant_lanes.iter().find(|lane| {
|
||||
#[cfg(feature = "spat_debug")]
|
||||
info!("GLOSA: Searching for current lane");
|
||||
match geo_alg::LinePosition::for_ingress_lane(own_pos_cart, lane.nodes()) {
|
||||
Ok(pos) => {
|
||||
#[cfg(feature = "spat_debug")]
|
||||
info!(
|
||||
" - Lane {:4}/{:03} {:?} with {:.0} m offset",
|
||||
intersection.id(),
|
||||
lane.id(),
|
||||
pos.semantic,
|
||||
pos.perpendicular_dist,
|
||||
);
|
||||
|
||||
if pos.perpendicular_dist < GLOSA_AT_LANE_OFFSET_M
|
||||
&& pos.semantic == geo_alg::LinePositionType::InBetween
|
||||
{
|
||||
info!(
|
||||
"GLOSA: At lane {:4}/{:03} -> locking intersection",
|
||||
intersection.id(),
|
||||
lane.id()
|
||||
);
|
||||
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("Lane {:04}: Failed to determine position: {err}", lane.id());
|
||||
false
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if let Some(lane) = current_lane {
|
||||
// we found some lane which we are "inside" -> lane search can be aborted here
|
||||
// but we should extract some information which is needed for future processing first
|
||||
|
||||
// collect all signal groups from the current approach
|
||||
let mut signal_groups = if let Some(own_approach) = lane.approach_id() {
|
||||
let approach_lanes = relevant_lanes.iter().filter(|lane| {
|
||||
if let Some(approach) = lane.approach_id() {
|
||||
approach == own_approach
|
||||
} else {
|
||||
false
|
||||
}
|
||||
});
|
||||
|
||||
approach_lanes
|
||||
.flat_map(|lane| {
|
||||
lane.connections()
|
||||
.iter()
|
||||
.filter_map(v2x::map::Connection::signal_group)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
} else {
|
||||
error!(
|
||||
"GLOSA: Lane has no approach ID, can't determine all possibly relevant signal groups"
|
||||
);
|
||||
// just fall back to only the current lane's signal groups
|
||||
lane.connections()
|
||||
.iter()
|
||||
.filter_map(v2x::map::Connection::signal_group)
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
|
||||
signal_groups.sort_unstable();
|
||||
signal_groups.dedup();
|
||||
|
||||
return Some(TlData {
|
||||
intersection_id: intersection.id(),
|
||||
intersection: int.clone(),
|
||||
lane_id: lane.id(),
|
||||
approach_id: lane.approach_id(),
|
||||
signal_groups,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
fn get_search_angle(distance: f32) -> f32 {
|
||||
let (dist_far, angle_far) = GLOSA_SEARCH_ANGLE_PARAMS[0];
|
||||
let (dist_near, angle_near) = GLOSA_SEARCH_ANGLE_PARAMS[1];
|
||||
|
||||
if distance > dist_far {
|
||||
angle_far
|
||||
} else if distance < dist_near {
|
||||
angle_near
|
||||
} else {
|
||||
// interpolate angle from near to far
|
||||
let diff_dist = dist_far - dist_near;
|
||||
let diff_angle = angle_far - angle_near;
|
||||
|
||||
angle_near + (diff_angle / diff_dist) * (distance - dist_near)
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines if intersection was left
|
||||
///
|
||||
/// TODO: return if left via stop line or otherwise
|
||||
#[cfg(feature = "spat")]
|
||||
fn is_intersection_left(
|
||||
intersection: &v2x::map::Intersection,
|
||||
lane_id: u8,
|
||||
approach_id: Option<u8>,
|
||||
own_pos: &geo_types::Point,
|
||||
) -> bool {
|
||||
// get all lanes from the current approach
|
||||
let lanes = if let Some(approach) = approach_id {
|
||||
intersection.approach_lanes(approach)
|
||||
} else if let Some(lane) = intersection.lane(lane_id) {
|
||||
alloc::vec![lane]
|
||||
} else {
|
||||
alloc::vec![]
|
||||
};
|
||||
|
||||
// find minimal distance to any lane where we are "inside"
|
||||
let own_pos_cart = geo_alg::lonlat_to_dcart(&intersection.ref_point(), own_pos);
|
||||
let min_perp_dist = lanes.iter().fold(f64::MAX, |min_dist, i| {
|
||||
match geo_alg::LinePosition::for_ingress_lane(own_pos_cart, i.nodes()) {
|
||||
Ok(pos) => {
|
||||
// check if we left the lane via the stop line, but only count stop line as passed after X meters
|
||||
if pos.semantic == geo_alg::LinePositionType::InBetween
|
||||
|| (pos.semantic == geo_alg::LinePositionType::BeforeStart
|
||||
&& pos.parallel_dist.abs() < GLOSA_STOP_LINE_PASSED_M)
|
||||
{
|
||||
// still at the lane -> update min_dist
|
||||
pos.perpendicular_dist
|
||||
} else {
|
||||
// not at the lane -> take old min_dist
|
||||
min_dist
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("Lane {:04}: Failed to determine position: {err}", i.id());
|
||||
min_dist
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
min_perp_dist > GLOSA_LANE_LEFT_OFFSET_M
|
||||
}
|
||||
|
||||
// -- getters --
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn initialized(&self) -> bool {
|
||||
self.initialized
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn time(&self) -> chrono::prelude::NaiveDateTime {
|
||||
self.time
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn pos(&self) -> &esp32_cits_core::PosVel {
|
||||
&self.pos
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
use super::*;
|
||||
use crate::init_test_env_logger;
|
||||
#[cfg(feature = "spat")]
|
||||
use crate::testdata::{MAPEM_HH_560, MAPEM_HH_1328};
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
#[test]
|
||||
fn glosa() {
|
||||
init_test_env_logger();
|
||||
|
||||
// prime TLC cache
|
||||
let mut state = State::new();
|
||||
let time_now = chrono::NaiveDateTime::default();
|
||||
|
||||
let etsi = if let c_its_parser::ItsMessage::Mapem {
|
||||
geonetworking: _,
|
||||
transport: _,
|
||||
etsi,
|
||||
} =
|
||||
c_its_parser::de::decode(MAPEM_HH_1328, c_its_parser::Headers::None).unwrap()
|
||||
{
|
||||
etsi
|
||||
} else {
|
||||
panic!("Unexpected C-ITS message")
|
||||
};
|
||||
state.tlc_cache.handle_mapem(time_now, &etsi);
|
||||
|
||||
let etsi = if let c_its_parser::ItsMessage::Mapem {
|
||||
geonetworking: _,
|
||||
transport: _,
|
||||
etsi,
|
||||
} =
|
||||
c_its_parser::de::decode(MAPEM_HH_560, c_its_parser::Headers::None).unwrap()
|
||||
{
|
||||
etsi
|
||||
} else {
|
||||
panic!("Unexpected C-ITS message")
|
||||
};
|
||||
state.tlc_cache.handle_mapem(time_now, &etsi);
|
||||
|
||||
// test GLOSA
|
||||
let own_pos_infront = geo_types::Point::new(9.9752864, 53.5564028);
|
||||
let own_pos_inside = geo_types::Point::new(9.9760764, 53.5563621);
|
||||
let own_pos_passed = geo_types::Point::new(9.977217, 53.5560602);
|
||||
let own_heading = 90.;
|
||||
|
||||
state.pos.heading_deg = Some(own_heading);
|
||||
|
||||
state.pos.position = own_pos_infront;
|
||||
state.run_glosa();
|
||||
assert!(matches!(state.glosa_state, GlosaState::Idle));
|
||||
|
||||
state.pos.position = own_pos_inside;
|
||||
state.run_glosa();
|
||||
assert!(matches!(state.glosa_state, GlosaState::Locked(_)));
|
||||
if let GlosaState::Locked(info) = &state.glosa_state {
|
||||
assert_eq!(1328, info.intersection_id);
|
||||
assert!(info.lane_id == 1 || info.lane_id == 2);
|
||||
}
|
||||
|
||||
state.pos.position = own_pos_inside;
|
||||
state.run_glosa();
|
||||
assert!(matches!(state.glosa_state, GlosaState::Locked(_)));
|
||||
if let GlosaState::Locked(info) = &state.glosa_state {
|
||||
assert_eq!(1328, info.intersection_id);
|
||||
assert!(info.lane_id == 1 || info.lane_id == 2);
|
||||
}
|
||||
|
||||
state.pos.position = own_pos_passed;
|
||||
state.run_glosa();
|
||||
assert!(matches!(state.glosa_state, GlosaState::Idle));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,117 +1,22 @@
|
|||
//! C-ITS Traffic Light Data (MAPEM/ SPATEM) Evaluation/ Cache
|
||||
//! C-ITS Traffic Light Data (MAPEM/ SPATEM) Evaluation
|
||||
|
||||
use alloc::rc::Rc;
|
||||
use alloc::vec::Vec;
|
||||
|
||||
pub use c_its_parser::standards::mapem_2_2_1::mapem_pdu_descriptions::MAPEM;
|
||||
pub use c_its_parser::standards::spatem_2_2_1::spatem_pdu_descriptions::SPATEM;
|
||||
use chrono::Datelike;
|
||||
#[cfg(all(target_arch = "riscv32", feature = "spat_debug"))]
|
||||
use c_its_parser::standards::{
|
||||
mapem_2_2_1::mapem_pdu_descriptions, spatem_2_2_1::spatem_pdu_descriptions,
|
||||
};
|
||||
use esp_println::println;
|
||||
|
||||
use super::v2x::map;
|
||||
use crate::cache::{Cache, CacheError};
|
||||
|
||||
pub struct Data {
|
||||
intersections: Cache<u16, map::Intersection>,
|
||||
}
|
||||
|
||||
impl Data {
|
||||
pub fn new(cache_lifetime: chrono::Duration) -> Self {
|
||||
Self {
|
||||
intersections: Cache::<u16, map::Intersection>::new(cache_lifetime),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn known_intersections(&self) -> Vec<u16> {
|
||||
self.intersections.keys()
|
||||
}
|
||||
|
||||
pub fn intersections_matching<P>(
|
||||
&self,
|
||||
predicate: P,
|
||||
) -> Vec<Rc<core::cell::RefCell<map::Intersection>>>
|
||||
where
|
||||
P: Fn(&map::Intersection) -> bool,
|
||||
{
|
||||
self.intersections.get_filtered(predicate)
|
||||
}
|
||||
|
||||
pub fn handle_mapem(&mut self, time_now: chrono::NaiveDateTime, etsi: &MAPEM) {
|
||||
let layer_id = etsi.map.layer_id.as_ref().map(|v| v.0);
|
||||
if let Some(map) = &etsi.map.intersections {
|
||||
for geom in &map.0 {
|
||||
let int_id = geom.id.id.0;
|
||||
|
||||
if self.intersections.contains(&int_id) {
|
||||
// update with new map layers
|
||||
|
||||
// we can ignore the result, since we're sure the item exists
|
||||
let _ = self.intersections.update(time_now, int_id, |i| {
|
||||
if !i.is_complete() {
|
||||
i.add_layer(layer_id, geom);
|
||||
|
||||
#[cfg(feature = "spat_debug")]
|
||||
if i.is_complete() {
|
||||
Self::pretty_print_intersection(&i);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// create new intersection
|
||||
let intersection = map::Intersection::new(layer_id, geom);
|
||||
|
||||
#[cfg(feature = "spat_debug")]
|
||||
if intersection.is_complete() {
|
||||
Self::pretty_print_intersection(&intersection);
|
||||
}
|
||||
|
||||
// we can ignore the result, since we're sure the item does not exist
|
||||
let _ = self.intersections.insert(time_now, intersection);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat_debug")]
|
||||
fn pretty_print_intersection(intersection: &map::Intersection) {
|
||||
println!("TLC: {intersection}");
|
||||
println!("TLC: Signal Groups");
|
||||
for grp in intersection.signal_groups() {
|
||||
println!(" {grp}");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn prune(&mut self, time_now: chrono::NaiveDateTime) {
|
||||
self.intersections.prune(time_now);
|
||||
}
|
||||
|
||||
/// Bumps the timestamp of a certain intersection to keep it cached
|
||||
pub fn keep_intersection(
|
||||
&mut self,
|
||||
intersection_id: u16,
|
||||
time_now: chrono::NaiveDateTime,
|
||||
) -> Result<(), CacheError<u16>> {
|
||||
self.intersections.update(time_now, intersection_id, |_| {})
|
||||
}
|
||||
|
||||
pub fn handle_spatem(&mut self, time_now: chrono::NaiveDateTime, etsi: &SPATEM) {
|
||||
for int in &etsi.spat.intersections.0 {
|
||||
let int_id = int.id.id.0;
|
||||
|
||||
if self.intersections.contains(&int_id) {
|
||||
// update with SPAT data
|
||||
|
||||
// we can ignore the result, since we're sure the item exists
|
||||
let _ = self.intersections.update(time_now, int_id, |i| {
|
||||
if i.is_complete() {
|
||||
// add SPAT information to intersection
|
||||
i.add_spat(int, time_now.year());
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// drop message since we don't have (full) MAP yet
|
||||
}
|
||||
pub fn handle_mapem(etsi: &mapem_pdu_descriptions::MAPEM) {
|
||||
// TODO: proof of concept only -- replace with actual evaluation
|
||||
if let Some(map) = &etsi.map.intersections {
|
||||
for int in &map.0 {
|
||||
println!("got MAPEM for intersection {}", int.id.id.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn handle_spatem(etsi: &spatem_pdu_descriptions::SPATEM) {
|
||||
// TODO: proof of concept only -- replace with actual evaluation
|
||||
for int in &etsi.spat.intersections.0 {
|
||||
println!("got SPATEM for intersection {}", int.id.id.0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +0,0 @@
|
|||
//! Types for V2X data handling
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
pub mod map;
|
||||
416
src/ble.rs
416
src/ble.rs
|
|
@ -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, ¬ify_buf)
|
||||
.await
|
||||
.map_err(|err| alloc::format!("failed notifying connection of new raw {msg_id:?}: {err:?}"))
|
||||
}
|
||||
258
src/cache.rs
258
src/cache.rs
|
|
@ -1,258 +0,0 @@
|
|||
//! Data Cache
|
||||
//!
|
||||
//! Store items for some time
|
||||
|
||||
use alloc::rc::Rc;
|
||||
use alloc::vec::Vec;
|
||||
use core::ops::Sub;
|
||||
|
||||
pub trait Cachable<K>
|
||||
where
|
||||
K: core::cmp::PartialEq,
|
||||
{
|
||||
fn key(&self) -> K;
|
||||
}
|
||||
|
||||
pub trait Initable<T, K>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq,
|
||||
{
|
||||
fn init(key: K) -> T;
|
||||
}
|
||||
|
||||
struct CacheItem<K, T>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq,
|
||||
{
|
||||
timestamp: chrono::NaiveDateTime,
|
||||
data: Rc<core::cell::RefCell<T>>,
|
||||
phantom: core::marker::PhantomData<K>, // rust wants this
|
||||
}
|
||||
|
||||
impl<K, T> core::fmt::Display for CacheItem<K, T>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq + core::fmt::Display,
|
||||
{
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"CacheItem({}, {:?})",
|
||||
self.data.borrow().key(),
|
||||
self.timestamp
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl<K, T> CacheItem<K, T>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq,
|
||||
{
|
||||
fn new(time_now: chrono::NaiveDateTime, data: T) -> Self {
|
||||
Self {
|
||||
timestamp: time_now,
|
||||
data: Rc::new(core::cell::RefCell::new(data)),
|
||||
phantom: core::marker::PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum CacheError<K>
|
||||
where
|
||||
K: core::fmt::Display,
|
||||
{
|
||||
KeyNotFound(K),
|
||||
InsertKeyAlreadyPresent(K),
|
||||
}
|
||||
|
||||
impl<K> core::fmt::Display for CacheError<K>
|
||||
where
|
||||
K: core::fmt::Display,
|
||||
{
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
match self {
|
||||
CacheError::KeyNotFound(key) => write!(f, "Key '{key}' doesn't exist in cache"),
|
||||
CacheError::InsertKeyAlreadyPresent(key) => {
|
||||
write!(f, "Insert failed b/c key '{key}' already exists in cache")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Item cache
|
||||
///
|
||||
/// Stores items for a certain time.
|
||||
/// Items need to implement `Cachable` so that an itentifier (key) can be retreived from them.
|
||||
pub struct Cache<K, T>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq,
|
||||
{
|
||||
lifetime: chrono::Duration,
|
||||
items: Vec<CacheItem<K, T>>,
|
||||
}
|
||||
|
||||
impl<K, T> core::fmt::Display for Cache<K, T>
|
||||
where
|
||||
T: Cachable<K>,
|
||||
K: core::cmp::PartialEq + core::fmt::Display,
|
||||
{
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
write!(f, "Cache({}, {} items)", self.lifetime, self.items.len())
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
impl<K, T> Cache<K, T>
|
||||
where
|
||||
T: Cachable<K> + Clone,
|
||||
K: core::cmp::PartialEq + core::fmt::Display,
|
||||
{
|
||||
/// Creates a new cache with a certain item lifetime
|
||||
pub const fn new(lifetime: chrono::Duration) -> Self {
|
||||
Self {
|
||||
lifetime,
|
||||
items: alloc::vec![],
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines if a key is in the cache
|
||||
pub fn contains(&mut self, key: &K) -> bool {
|
||||
self.items
|
||||
.iter()
|
||||
.find(|i| i.data.borrow().key() == *key)
|
||||
.is_some()
|
||||
}
|
||||
|
||||
/// Determines the index of a certain key
|
||||
fn find(&mut self, key: &K) -> Option<usize> {
|
||||
self.items
|
||||
.iter()
|
||||
.position(|i| i.data.borrow().key() == *key)
|
||||
}
|
||||
|
||||
/// Retrieves all known keys
|
||||
pub fn keys(&self) -> Vec<K> {
|
||||
self.items.iter().map(|i| i.data.borrow().key()).collect()
|
||||
}
|
||||
|
||||
/// Adds a new item to the cache
|
||||
///
|
||||
/// Call [`Self::update`] to update the contents of the cached item
|
||||
/// or just to bump the timestamp.
|
||||
///
|
||||
/// # Errors
|
||||
/// Fails if the specified key already exist
|
||||
pub fn insert(
|
||||
&mut self,
|
||||
time_now: chrono::NaiveDateTime,
|
||||
data: T,
|
||||
) -> Result<(), CacheError<K>> {
|
||||
let key = data.key();
|
||||
if self.contains(&key) {
|
||||
Err(CacheError::InsertKeyAlreadyPresent(key))
|
||||
} else {
|
||||
self.items.push(CacheItem::new(time_now, data));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Retrieves an item from the cache
|
||||
///
|
||||
/// Returns `None` if no item exists for this key
|
||||
pub fn get(&mut self, key: &K) -> Option<Rc<core::cell::RefCell<T>>> {
|
||||
self.items.iter().find_map(|i| {
|
||||
if i.data.borrow().key() == *key {
|
||||
Some(i.data.clone())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Retrieves items from the cache which match the predicate
|
||||
pub fn get_filtered<P>(&self, predicate: P) -> Vec<Rc<core::cell::RefCell<T>>>
|
||||
where
|
||||
P: Fn(&T) -> bool,
|
||||
{
|
||||
self.items
|
||||
.iter()
|
||||
.filter_map(|i| {
|
||||
let data = i.data.borrow();
|
||||
if predicate(&data) {
|
||||
Some(i.data.clone())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Updates an item in the cache using the provided function
|
||||
///
|
||||
/// This can also be used to just bump the timestamp of the cached item by providing an empty closure.
|
||||
///
|
||||
/// # Errors
|
||||
/// Fails if the specified key does not exist in the cache
|
||||
pub fn update<F>(
|
||||
&mut self,
|
||||
time_now: chrono::NaiveDateTime,
|
||||
key: K,
|
||||
func: F,
|
||||
) -> Result<(), CacheError<K>>
|
||||
where
|
||||
F: Fn(&mut T),
|
||||
K: core::fmt::Display,
|
||||
{
|
||||
// find item
|
||||
let Some(pos) = self.find(&key) else {
|
||||
return Err(CacheError::KeyNotFound(key));
|
||||
};
|
||||
|
||||
// unwrap is fine since we fetched the position before
|
||||
let item = self.items.get_mut(pos).unwrap();
|
||||
|
||||
let mut data = item.data.borrow_mut();
|
||||
func(&mut data);
|
||||
|
||||
item.timestamp = time_now;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Updates an item in the cache using the provided function or create a new item with default values
|
||||
pub fn update_or_init<F>(&mut self, time_now: chrono::NaiveDateTime, key: K, mut func: F)
|
||||
where
|
||||
F: FnMut(&mut T),
|
||||
K: core::fmt::Display,
|
||||
T: Initable<T, K>,
|
||||
{
|
||||
if let Some(pos) = self.find(&key) {
|
||||
// update existsting item
|
||||
// unwrap is fine since we fetched the position before
|
||||
let item = self.items.get_mut(pos).unwrap();
|
||||
|
||||
let mut data = item.data.borrow_mut();
|
||||
func(&mut data);
|
||||
|
||||
item.timestamp = time_now;
|
||||
} else {
|
||||
// insert new item
|
||||
self.items.push(CacheItem::new(time_now, T::init(key)));
|
||||
}
|
||||
}
|
||||
|
||||
/// Cleans items which timed out from the cache
|
||||
///
|
||||
/// Call this regularly to prune old items.
|
||||
pub fn prune(&mut self, time_now: chrono::NaiveDateTime) {
|
||||
self.items.retain(|i| {
|
||||
let age = time_now.sub(i.timestamp);
|
||||
age < self.lifetime
|
||||
});
|
||||
}
|
||||
}
|
||||
446
src/geo_alg.rs
446
src/geo_alg.rs
|
|
@ -1,446 +0,0 @@
|
|||
//! Geo Algorithms
|
||||
//!
|
||||
//! Since the `geo` crate is not `no_std`, we need to implement the most important algorithms on our own
|
||||
|
||||
use alloc::string::{String, ToString};
|
||||
use core::ops::{Mul, Sub};
|
||||
|
||||
use log::warn;
|
||||
#[cfg(not(feature = "std"))]
|
||||
use num_traits::float::Float;
|
||||
|
||||
const EARTH_RADIUS: f64 = 6_371_008.8; // mean radius of GRS80 ellipsoid
|
||||
const EARTH_CIRCUMFERENCE: f64 = 40_030_228.884; // calculated from `EARTH_RADIUS * 2 * PI`
|
||||
|
||||
/// Haversine distance between two geo coordinates (in meters)
|
||||
#[allow(unused)]
|
||||
pub fn haversine_dist(a: &geo_types::Point, b: &geo_types::Point) -> f64 {
|
||||
let theta1 = a.y().to_radians();
|
||||
let theta2 = b.y().to_radians();
|
||||
let delta_theta = (b.y() - a.y()).to_radians();
|
||||
let delta_lambda = (b.x() - a.x()).to_radians();
|
||||
let a = (delta_theta / 2.).sin().powi(2)
|
||||
+ theta1.cos() * theta2.cos() * (delta_lambda / 2.).sin().powi(2);
|
||||
let c = 2. * a.sqrt().asin();
|
||||
EARTH_RADIUS * c
|
||||
}
|
||||
|
||||
/// Haversine bearing from point `a` to point `b`
|
||||
#[allow(unused)]
|
||||
pub fn haversine_bearing(a: &geo_types::Point, b: &geo_types::Point) -> f32 {
|
||||
let (lng_a, lat_a) = (a.x().to_radians(), a.y().to_radians());
|
||||
let (lng_b, lat_b) = (b.x().to_radians(), b.y().to_radians());
|
||||
let delta_lng = lng_b - lng_a;
|
||||
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let s = (lat_b.cos() * delta_lng.sin()) as f32;
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let c = (lat_a.cos() * lat_b.sin() - lat_a.sin() * lat_b.cos() * delta_lng.cos()) as f32;
|
||||
|
||||
let degrees = f32::atan2(s, c).to_degrees();
|
||||
(degrees + 360.0) % 360.0
|
||||
}
|
||||
|
||||
/// Cartesian distance between to X/Y coordinates (in unit of the coordinates)
|
||||
#[allow(unused)]
|
||||
pub fn cartesian_dist(a: geo_types::Point, b: geo_types::Point) -> f64 {
|
||||
let vector = b.sub(a);
|
||||
cartesian_norm(vector)
|
||||
}
|
||||
|
||||
/// Cartesian bearing from X/Y point `a` to X/Y point `b`
|
||||
#[allow(unused)]
|
||||
pub fn cartesian_bearing(a: geo_types::Point, b: geo_types::Point) -> f64 {
|
||||
let vector = b.sub(a);
|
||||
cartesian_theta(vector)
|
||||
}
|
||||
|
||||
/// Cartesian vector norm (length)
|
||||
#[allow(unused)]
|
||||
pub fn cartesian_norm(vec: geo_types::Point) -> f64 {
|
||||
f64::sqrt(vec.x() * vec.x() + vec.y() * vec.y())
|
||||
}
|
||||
|
||||
/// Cartesian vector direction (polar coordinate angle)
|
||||
#[allow(unused)]
|
||||
pub fn cartesian_theta(vec: geo_types::Point) -> f64 {
|
||||
let theta_rad = f64::atan2(vec.y(), vec.x());
|
||||
theta_rad * 180. / core::f64::consts::PI
|
||||
}
|
||||
|
||||
/// Normalizes an angle (in degrees) to (-180, 180] interval
|
||||
#[allow(unused)]
|
||||
pub fn deg_180(angle_deg: f32) -> f32 {
|
||||
let full_circle_deg = 360.0;
|
||||
|
||||
let angle = angle_deg % full_circle_deg;
|
||||
if angle > full_circle_deg / 2. {
|
||||
return angle - full_circle_deg;
|
||||
}
|
||||
if angle <= -full_circle_deg / 2. {
|
||||
return angle + full_circle_deg;
|
||||
}
|
||||
angle
|
||||
}
|
||||
|
||||
/// Normalizes an angle (in degrees) to [0, 360) interval
|
||||
#[allow(unused)]
|
||||
pub fn deg_360(angle_deg: f32) -> f32 {
|
||||
let full_circle_deg = 360.0;
|
||||
|
||||
let angle = angle_deg % full_circle_deg;
|
||||
if (angle < 0.) {
|
||||
return angle + full_circle_deg;
|
||||
}
|
||||
angle
|
||||
}
|
||||
|
||||
/// Converts a geo-position (lon/lat) to cartesian coordinates relative to a reference positions
|
||||
///
|
||||
/// Both `ref_pos` and `position` are expected to be lon/lat in degrees.
|
||||
/// The output will be in a local X/Y coordinate system with X pointing north and Y pointing east.
|
||||
#[allow(unused)]
|
||||
pub fn lonlat_to_dcart(
|
||||
ref_pos: &geo_types::Point,
|
||||
position: &geo_types::Point,
|
||||
) -> geo_types::Point {
|
||||
let pos_diff = position.sub(*ref_pos);
|
||||
let dlat_deg = pos_diff.y();
|
||||
let dlon_deg = pos_diff.x();
|
||||
|
||||
// latitude (north/south) degree per meter is independent from longitude
|
||||
let dx = dlat_deg / 360. * EARTH_CIRCUMFERENCE;
|
||||
|
||||
// longitude (east/west) degree per meter has a different value depending on the latitude
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let ref_lat_rad = ref_pos.to_radians().y();
|
||||
let dy = dlon_deg / 360. * (EARTH_CIRCUMFERENCE * ref_lat_rad.cos());
|
||||
|
||||
geo_types::Point::new(dx, dy)
|
||||
}
|
||||
|
||||
/// Converts a X/Y coordinate (NED relative to a reference position) to a geo-position
|
||||
///
|
||||
/// The `ref_pos` is expected to be lon/lat in degrees and the output will be the same.
|
||||
/// The `position` is expected to be in a local X/Y coordinate system with X pointing north and Y pointing east.
|
||||
#[allow(unused)]
|
||||
pub fn dcart_to_lonlat(
|
||||
ref_pos: &geo_types::Point,
|
||||
position: &geo_types::Point,
|
||||
) -> geo_types::Point {
|
||||
// note that we're using NED while c-its-parser uses ITS-G5 style ENU X/Y coordinates
|
||||
// so we need to swap X and Y coordinates
|
||||
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let dx = position.y() as f32;
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let dy = position.x() as f32;
|
||||
|
||||
c_its_parser::geo_utils::point_from_dxy(dx, dy, ref_pos)
|
||||
}
|
||||
|
||||
/// Describes how a position is related to a line segment
|
||||
#[derive(Debug, Default)]
|
||||
#[allow(unused)]
|
||||
pub struct LinePosition {
|
||||
/// Own position relative to the line segment
|
||||
pub semantic: LinePositionType,
|
||||
/// Distance to center line (always positive)
|
||||
pub parallel_dist: f64,
|
||||
/// Distance to first node (negative if `BeforeStart`)
|
||||
pub perpendicular_dist: f64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
|
||||
#[allow(unused)]
|
||||
pub enum LinePositionType {
|
||||
#[default]
|
||||
Undefined,
|
||||
BeforeStart,
|
||||
InBetween,
|
||||
AfterEnd,
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
impl LinePosition {
|
||||
pub fn new(parallel_dist: f64, perpendicular_dist: f64, after_end: bool) -> Self {
|
||||
let semantic = if after_end {
|
||||
LinePositionType::AfterEnd
|
||||
} else if parallel_dist < 0. {
|
||||
LinePositionType::BeforeStart
|
||||
} else {
|
||||
LinePositionType::InBetween
|
||||
};
|
||||
Self {
|
||||
semantic,
|
||||
parallel_dist,
|
||||
perpendicular_dist,
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines `point` position relative to a line segment (in X/Y coordinates)
|
||||
///
|
||||
/// The `ls` shall consist of 2 points!
|
||||
///
|
||||
/// # Algorithm
|
||||
/// The line segment can be converted to a vector which describes an infinite line.
|
||||
/// So we can calculate the (perpendicular) projection of the point on that line:
|
||||
/// ```text
|
||||
/// [Case A] (point) | [Case B] (point)
|
||||
/// | | |
|
||||
/// | | |
|
||||
/// (node1)---(node2)-----(q) | (node1)------(q)------(node2)
|
||||
/// ```
|
||||
///
|
||||
/// This will already give us the perpendicular and parallel distance.
|
||||
/// Since we came from a finite line segment and want to know if the point is bejond the segment,
|
||||
/// we also need to compare the parallel distance with the length of the vector.
|
||||
/// So both case are the same mathematically.
|
||||
///
|
||||
/// # Errors
|
||||
/// Fails if points are the same
|
||||
pub fn for_ls(point: geo_types::Point, line: &geo_types::Line) -> Result<Self, String> {
|
||||
let node1 = line.start_point();
|
||||
let node2 = line.end_point();
|
||||
|
||||
let line_vec = node2.sub(node1);
|
||||
let line_vec_length = cartesian_norm(line_vec);
|
||||
|
||||
// input validation
|
||||
if line_vec_length < f64::EPSILON {
|
||||
return Err("Points are the same".to_string());
|
||||
}
|
||||
|
||||
// calculate projection of `p` onto the line
|
||||
// ```math
|
||||
// # n needs to be a unit vector
|
||||
// n = (node2 - node1) / |node2 - node1|
|
||||
// # vector from node1 to the point
|
||||
// p = point - node1
|
||||
// # projection is the unit-vector multipled by the dot-product of p and n
|
||||
// q = (p {dot} n) * n
|
||||
// # perpendicular length is calculated from the vector q->p
|
||||
// QP = q - p
|
||||
// ```
|
||||
let p = point.sub(node1);
|
||||
let n = line_vec.mul(1. / line_vec_length);
|
||||
let q = n.mul(p.dot(n));
|
||||
let qp_length = cartesian_norm(q.sub(p));
|
||||
|
||||
// calculate parallel distance of `q` to `node1`.
|
||||
// This can be achieved by the dot-product since `n` is a unit vector and
|
||||
// the dot-product of two paralle vectors is the same as the multiplication of the vector norms.
|
||||
let q_dist = n.dot(q);
|
||||
|
||||
// generate output
|
||||
let after_end = q_dist > line_vec_length;
|
||||
let line_pos = Self::new(q_dist, qp_length, after_end);
|
||||
|
||||
Ok(line_pos)
|
||||
}
|
||||
|
||||
/// Determines `point` position relative to nodes of an ingress `Lane`
|
||||
///
|
||||
/// Keep in mind, that the lane's node list starts at the stop line and is extending away from the intersection.
|
||||
/// But we are driving the other way around!
|
||||
///
|
||||
/// # Errors
|
||||
/// Returns a human-readable string if position can't be determined
|
||||
pub fn for_ingress_lane(
|
||||
point: geo_types::Point,
|
||||
nodes: &geo_types::LineString,
|
||||
) -> Result<Self, String> {
|
||||
let mut result = Self::default();
|
||||
|
||||
let mut lines = nodes.lines();
|
||||
|
||||
// check, that the stop line is not behind us
|
||||
let line = lines
|
||||
.next()
|
||||
.ok_or("Lane has less than two nodes".to_string())?;
|
||||
|
||||
let pos = Self::for_ls(point, &line)?;
|
||||
if pos.semantic == LinePositionType::BeforeStart {
|
||||
// we have crossed the stop line -> abort search for position inside the lane
|
||||
return Ok(pos);
|
||||
}
|
||||
if pos.semantic == LinePositionType::InBetween {
|
||||
// we're at this segment -> search finished
|
||||
return Ok(pos);
|
||||
}
|
||||
// otherwise: continue with next segment (and store this segment's length)
|
||||
let mut lane_length = cartesian_norm(line.delta().into());
|
||||
let mut last_pos = LinePosition::default();
|
||||
|
||||
// continue with remaining lines
|
||||
for line in lines {
|
||||
let line_len = cartesian_norm(line.delta().into());
|
||||
|
||||
// ignored line, if points are too close <10cm
|
||||
if line_len < 0.1 {
|
||||
warn!("Lane nodes are just {line_len:.1} m apart -> ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
let pos = Self::for_ls(point, &line)?;
|
||||
match pos.semantic {
|
||||
LinePositionType::BeforeStart => {
|
||||
// we're at the outer arc of the lane right at the border between line segments
|
||||
// -> set parallel distance to zero and finish search
|
||||
return Ok(LinePosition::new(
|
||||
lane_length,
|
||||
pos.perpendicular_dist,
|
||||
false,
|
||||
));
|
||||
}
|
||||
LinePositionType::InBetween => {
|
||||
// we're at this segment
|
||||
// -> add segment's distance to accumulated lane length and finish search
|
||||
return Ok(LinePosition::new(
|
||||
lane_length + pos.parallel_dist,
|
||||
pos.perpendicular_dist,
|
||||
false,
|
||||
));
|
||||
}
|
||||
_ => {
|
||||
// continue searching, add segment's distance to lane length accumulator
|
||||
lane_length += line_len;
|
||||
last_pos = pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if we came this far, we're after the lane's end (actually the start in driving direction)
|
||||
// -> add parallel distance to accumulated lane length
|
||||
Ok(LinePosition::new(
|
||||
lane_length + last_pos.parallel_dist,
|
||||
last_pos.perpendicular_dist,
|
||||
true,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::geo_alg::{LinePosition, cartesian_bearing};
|
||||
|
||||
#[test]
|
||||
fn test_cart_bearing() {
|
||||
let start = geo_types::Point::new(0., 0.);
|
||||
|
||||
assert_float_eq::assert_float_absolute_eq!(
|
||||
0.,
|
||||
cartesian_bearing(start, geo_types::Point::new(10., 0.))
|
||||
);
|
||||
|
||||
assert_float_eq::assert_float_absolute_eq!(
|
||||
90.,
|
||||
cartesian_bearing(start, geo_types::Point::new(0., 10.))
|
||||
);
|
||||
|
||||
assert_float_eq::assert_float_absolute_eq!(
|
||||
45.,
|
||||
cartesian_bearing(start, geo_types::Point::new(10., 10.))
|
||||
);
|
||||
|
||||
assert_float_eq::assert_float_absolute_eq!(
|
||||
135.,
|
||||
cartesian_bearing(start, geo_types::Point::new(-10., 10.))
|
||||
);
|
||||
|
||||
assert_float_eq::assert_float_absolute_eq!(
|
||||
-135.,
|
||||
cartesian_bearing(start, geo_types::Point::new(-10., -10.))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn linepos_for_ls_validation() {
|
||||
// identical nodes shall result in an error
|
||||
|
||||
let point = geo_types::Point::new(0., 0.);
|
||||
let node1 = geo_types::Point::new(0., 0.);
|
||||
let node2 = geo_types::Point::new(10., -5.);
|
||||
|
||||
let ls = geo_types::Line::new(node1, node1);
|
||||
assert!(LinePosition::for_ls(point, &ls).is_err());
|
||||
|
||||
let ls = geo_types::Line::new(node2, node2);
|
||||
assert!(LinePosition::for_ls(point, &ls).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn linepos_for_ls_test() {
|
||||
use crate::geo_alg::LinePositionType;
|
||||
|
||||
// test on X axis
|
||||
{
|
||||
let node1 = geo_types::Point::new(0., 0.);
|
||||
let node2 = geo_types::Point::new(5., 0.);
|
||||
|
||||
let ls = geo_types::Line::new(node1, node2);
|
||||
|
||||
// test some positions
|
||||
let test_tuples = vec![
|
||||
(node1.x() - 1000., LinePositionType::BeforeStart),
|
||||
(node1.x() - 1., LinePositionType::BeforeStart),
|
||||
(node1.x(), LinePositionType::InBetween),
|
||||
(node1.x() + 1., LinePositionType::InBetween),
|
||||
(node2.x() - 1., LinePositionType::InBetween),
|
||||
(node2.x(), LinePositionType::InBetween),
|
||||
(node2.x() + 1., LinePositionType::AfterEnd),
|
||||
(node2.x() + 1000., LinePositionType::AfterEnd),
|
||||
];
|
||||
let y_values = vec![(node1.y() - 1.), (node1.y()), (node1.y() + 1.)];
|
||||
|
||||
// y position should only affect the perpendicular distance
|
||||
for y in &y_values {
|
||||
// x position affects the position type and parallel distance
|
||||
for (x, semantic) in &test_tuples {
|
||||
let point = geo_types::Point::new(*x, *y);
|
||||
|
||||
let result = LinePosition::for_ls(point, &ls).unwrap();
|
||||
|
||||
assert_eq!(semantic, &result.semantic);
|
||||
assert_eq!((y - node1.y()).abs(), result.perpendicular_dist);
|
||||
assert_eq!(x - node1.x(), result.parallel_dist);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// test on Y axis
|
||||
{
|
||||
let node1 = geo_types::Point::new(3., 5.);
|
||||
let node2 = geo_types::Point::new(3., 100.);
|
||||
|
||||
let ls = geo_types::Line::new(node1, node2);
|
||||
|
||||
// test some positions
|
||||
let test_tuples = vec![
|
||||
(node1.y() - 1000., LinePositionType::BeforeStart),
|
||||
(node1.y() - 1., LinePositionType::BeforeStart),
|
||||
(node1.y(), LinePositionType::InBetween),
|
||||
(node1.y() + 1., LinePositionType::InBetween),
|
||||
(node2.y() - 1., LinePositionType::InBetween),
|
||||
(node2.y(), LinePositionType::InBetween),
|
||||
(node2.y() + 1., LinePositionType::AfterEnd),
|
||||
(node2.y() + 1000., LinePositionType::AfterEnd),
|
||||
];
|
||||
let x_values = vec![(node1.x() - 1.), (node1.x()), (node1.x() + 1.)];
|
||||
|
||||
// x position should only affect the perpendicular distance
|
||||
for x in &x_values {
|
||||
// y position affects the position type and parallel distance
|
||||
for (y, semantic) in &test_tuples {
|
||||
let point = geo_types::Point::new(*x, *y);
|
||||
|
||||
let result = LinePosition::for_ls(point, &ls).unwrap();
|
||||
|
||||
assert_eq!(semantic, &result.semantic);
|
||||
assert_eq!((x - node1.x()).abs(), result.perpendicular_dist);
|
||||
assert_eq!(y - node1.y(), result.parallel_dist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
849
src/io.rs
849
src/io.rs
|
|
@ -1,849 +0,0 @@
|
|||
//! UART and BLE I/O Protocol
|
||||
|
||||
pub mod msg {
|
||||
#![allow(clippy::all, clippy::pedantic, clippy::nursery, dead_code)]
|
||||
include!(concat!(env!("OUT_DIR"), "/c_its_io.rs"));
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
use c_its_parser::gn as geonetworking;
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::RawMsgRx> for msg::SerialOutputMsg {
|
||||
fn from(value: msg::RawMsgRx) -> Self {
|
||||
use msg::serial_output_msg::Payload;
|
||||
|
||||
Self {
|
||||
payload: Some(Payload::RxMsg(value)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::DenmEvent> for msg::SerialOutputMsg {
|
||||
fn from(value: msg::DenmEvent) -> Self {
|
||||
use msg::serial_output_msg::Payload;
|
||||
|
||||
Self {
|
||||
payload: Some(Payload::Denm(value)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl msg::RawMsgRx {
|
||||
#[cfg(feature = "uart")]
|
||||
pub fn serialize_uart_proto(&self) -> alloc::vec::Vec<u8> {
|
||||
serialize_serial_msg(&Into::<msg::SerialOutputMsg>::into(self.clone()))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "denm")]
|
||||
impl msg::DenmEvent {
|
||||
#[cfg(feature = "ble")]
|
||||
pub const PROTO_SIZE: usize = 51;
|
||||
|
||||
#[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)]
|
||||
pub struct Parser {
|
||||
buffer: alloc::vec::Vec<u8>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl Parser {
|
||||
const SOF_LEN: u16 = 4;
|
||||
const SOF1: u8 = 0x56;
|
||||
const SOF2: u8 = 0x32;
|
||||
const SOF3: u8 = 0x58;
|
||||
const SOF4: u8 = 0x2B;
|
||||
const EOF_LEN: u16 = 2;
|
||||
#[allow(unused)]
|
||||
const EOF1: u8 = 0x0d;
|
||||
#[allow(unused)]
|
||||
const EOF2: u8 = 0x0a;
|
||||
const LENGTH_LEN: u16 = 2;
|
||||
|
||||
/// Parses incoming data and return list of messages
|
||||
pub fn parse(&mut self, input: &[u8]) -> alloc::vec::Vec<msg::SerialInputMsg> {
|
||||
use prost::Message as _;
|
||||
|
||||
// combine with existing data
|
||||
self.buffer.append(&mut input.to_vec());
|
||||
|
||||
// find start of frame and parse
|
||||
let mut output = alloc::vec![];
|
||||
while let Some(pos) = Self::find_sof(&self.buffer) {
|
||||
// drop everything before the SOF
|
||||
self.buffer.drain(..pos);
|
||||
|
||||
// get length field and check buffer size
|
||||
if let Some(len_bytes) = self
|
||||
.buffer
|
||||
.get(usize::from(Self::SOF_LEN)..usize::from(Self::SOF_LEN + Self::LENGTH_LEN))
|
||||
{
|
||||
// unwrap is fine since we queried 2 bytes before, so we can also convert to 2-byte slice
|
||||
let msg_size = u16::from_be_bytes(len_bytes.try_into().unwrap());
|
||||
|
||||
let required_buf_size = Self::SOF_LEN + Self::LENGTH_LEN + msg_size + Self::EOF_LEN;
|
||||
if let Some(payload) = self.buffer.get(
|
||||
usize::from(Self::SOF_LEN + Self::LENGTH_LEN)
|
||||
..usize::from(required_buf_size - 2),
|
||||
) {
|
||||
match msg::SerialInputMsg::decode(payload) {
|
||||
Ok(data) => {
|
||||
output.push(data);
|
||||
}
|
||||
Err(err) => log::error!("Failed to parse input: {err:?}"),
|
||||
}
|
||||
|
||||
// consume buffer
|
||||
self.buffer.drain(..usize::from(required_buf_size));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
/// Returns the start index of the SOF sequence, if present
|
||||
fn find_sof(input: &[u8]) -> Option<usize> {
|
||||
// search for SOF
|
||||
if let Some(sof1_pos) = input.iter().position(|i| *i == Self::SOF1) {
|
||||
// drop everything before sof1_pos and check if remainder continues with SOF sequence
|
||||
let (_, msg) = input.split_at(sof1_pos);
|
||||
if msg.starts_with(&[Self::SOF1, Self::SOF2, Self::SOF3, Self::SOF4]) {
|
||||
// found the SOF sequence
|
||||
return Some(sof1_pos);
|
||||
}
|
||||
}
|
||||
|
||||
// if we reach this position, SOF sequence wasn't found
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
fn serialize_serial_msg<T>(msg: &T) -> alloc::vec::Vec<u8>
|
||||
where
|
||||
T: prost::Message,
|
||||
{
|
||||
let mut msg_buf = msg.encode_to_vec();
|
||||
|
||||
let sof = [0x56u8, 0x32, 0x58, 0x2B];
|
||||
let eof = [0x0du8, 0x0a];
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
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);
|
||||
|
||||
out
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "uart", feature = "ble"))]
|
||||
impl From<msg::PositionState> for crate::applogic::GnssFix {
|
||||
fn from(value: msg::PositionState) -> Self {
|
||||
let time =
|
||||
chrono::DateTime::from_timestamp_millis(value.timestamp_ms).map(|v| v.naive_utc());
|
||||
|
||||
let latitude_deg = value.position.latitude_deg.into();
|
||||
let longitude_deg = value.position.longitude_deg.into();
|
||||
let heading_deg = value.heading.map(|v| {
|
||||
#[allow(clippy::cast_precision_loss)]
|
||||
let val = (v as f32) / 10.;
|
||||
val
|
||||
});
|
||||
let speed_mps = value.speed.map(|v| {
|
||||
#[allow(clippy::cast_precision_loss)]
|
||||
let val = (v as f32) / 100.;
|
||||
val
|
||||
});
|
||||
|
||||
Self {
|
||||
time,
|
||||
latitude_deg,
|
||||
longitude_deg,
|
||||
heading_deg,
|
||||
speed_mps,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::PositionState> for esp32_cits_core::PosVel {
|
||||
fn from(value: msg::PositionState) -> Self {
|
||||
let position = geo_types::Point::new(
|
||||
value.position.longitude_deg.into(),
|
||||
value.position.latitude_deg.into(),
|
||||
);
|
||||
let heading_deg = value.heading.map(|v| {
|
||||
#[allow(clippy::cast_precision_loss)]
|
||||
let val = (v as f32) / 10.;
|
||||
val
|
||||
});
|
||||
let speed_mps = value.speed.map(|v| {
|
||||
#[allow(clippy::cast_precision_loss)]
|
||||
let val = (v as f32) / 100.;
|
||||
val
|
||||
});
|
||||
|
||||
Self {
|
||||
position,
|
||||
heading_deg,
|
||||
speed_mps,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::ItsPosition> for esp32_cits_core::PosVel {
|
||||
fn from(value: msg::ItsPosition) -> Self {
|
||||
let latitude_deg = f64::from(value.latitude) / 10_000_000.;
|
||||
let longitude_deg = f64::from(value.longitude) / 10_000_000.;
|
||||
let position = geo_types::Point::new(longitude_deg, latitude_deg);
|
||||
|
||||
Self {
|
||||
position,
|
||||
heading_deg: None,
|
||||
speed_mps: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl esp32_cits_core::tx::GnItsPayload for msg::RawMsgTx {
|
||||
fn make_eh(
|
||||
&self,
|
||||
address: [u8; 6],
|
||||
own_position: &esp32_cits_core::PosVel,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
seq_no: &mut u16,
|
||||
) -> Result<
|
||||
(
|
||||
c_its_parser::gn::en302636_4_1::ExtendedHeader,
|
||||
Option<c_its_parser::gn::en302636_4_1::AreaType>,
|
||||
u8,
|
||||
),
|
||||
alloc::string::String,
|
||||
> {
|
||||
use alloc::string::ToString as _;
|
||||
|
||||
let station_type = self
|
||||
.station_type
|
||||
.and_then(|v| {
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let raw_val = v as u8;
|
||||
geonetworking::en302636_4_1::StationType::try_from(raw_val).ok()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let hop_limit = self.hop_limit as u8;
|
||||
|
||||
Ok(match self.gn_transport() {
|
||||
msg::GnTransport::Gac => {
|
||||
if self.gn_area.position.is_none() {
|
||||
return Err("Failed to create GAC: gnArea.position missing".to_string());
|
||||
}
|
||||
|
||||
*seq_no += 1;
|
||||
|
||||
let (atype, geoanycast) = Self::make_geobcast(
|
||||
address,
|
||||
station_type,
|
||||
own_position,
|
||||
time,
|
||||
self.gn_area,
|
||||
*seq_no,
|
||||
)?;
|
||||
let eh = geonetworking::en302636_4_1::ExtendedHeader::GAC(geoanycast);
|
||||
(eh, Some(atype), hop_limit)
|
||||
}
|
||||
msg::GnTransport::Gbc => {
|
||||
if self.gn_area.position.is_none() {
|
||||
return Err("Failed to create GAC: gnArea.position missing".to_string());
|
||||
}
|
||||
|
||||
*seq_no += 1;
|
||||
|
||||
let (atype, geoanycast) = Self::make_geobcast(
|
||||
address,
|
||||
station_type,
|
||||
own_position,
|
||||
time,
|
||||
self.gn_area,
|
||||
*seq_no,
|
||||
)?;
|
||||
let eh = geonetworking::en302636_4_1::ExtendedHeader::GBC(geoanycast);
|
||||
(eh, Some(atype), hop_limit)
|
||||
}
|
||||
msg::GnTransport::Tsb => {
|
||||
*seq_no += 1;
|
||||
|
||||
(
|
||||
esp32_cits_core::tx::gn::make_tsb_eh(
|
||||
address,
|
||||
station_type,
|
||||
own_position,
|
||||
time,
|
||||
*seq_no,
|
||||
)?,
|
||||
None,
|
||||
hop_limit,
|
||||
)
|
||||
}
|
||||
msg::GnTransport::Shb => (
|
||||
esp32_cits_core::tx::gn::make_shb_eh(address, station_type, own_position, time)?,
|
||||
None,
|
||||
1,
|
||||
),
|
||||
})
|
||||
}
|
||||
|
||||
fn make_payload(
|
||||
&self,
|
||||
) -> Result<
|
||||
(
|
||||
alloc::vec::Vec<u8>,
|
||||
c_its_parser::standards::extensions::ItsMessageId,
|
||||
),
|
||||
alloc::string::String,
|
||||
> {
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let message_id = (self.message_type as u8).try_into()?;
|
||||
Ok((self.payload.clone(), message_id))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl msg::RawMsgTx {
|
||||
fn make_geobcast(
|
||||
address: [u8; 6],
|
||||
station_type: geonetworking::en302636_4_1::StationType,
|
||||
own_position: &esp32_cits_core::PosVel,
|
||||
time: chrono::DateTime<chrono::Utc>,
|
||||
gn_area: msg::GnArea,
|
||||
sequence_number: u16,
|
||||
) -> Result<
|
||||
(
|
||||
c_its_parser::gn::en302636_4_1::AreaType,
|
||||
geonetworking::en302636_4_1::GeoBroadcast,
|
||||
),
|
||||
alloc::string::String,
|
||||
> {
|
||||
let source_position_vector =
|
||||
esp32_cits_core::tx::gn::make_lpv(address, station_type, own_position, time)?;
|
||||
|
||||
let (atype, dist_a, dist_b, angle) = match gn_area.area() {
|
||||
msg::GnAreaShape::EtsiAreashapeCircle => (
|
||||
c_its_parser::gn::en302636_4_1::AreaType::Circular,
|
||||
gn_area.dist_a,
|
||||
None,
|
||||
None,
|
||||
),
|
||||
msg::GnAreaShape::EtsiAreashapeRectangle => (
|
||||
c_its_parser::gn::en302636_4_1::AreaType::Rectangular,
|
||||
gn_area.dist_a,
|
||||
gn_area.dist_b,
|
||||
gn_area.angle,
|
||||
),
|
||||
msg::GnAreaShape::EtsiAreashapeEllipsis => (
|
||||
c_its_parser::gn::en302636_4_1::AreaType::Ellipsoidal,
|
||||
gn_area.dist_a,
|
||||
gn_area.dist_b,
|
||||
gn_area.angle,
|
||||
),
|
||||
};
|
||||
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let latitude_deg = own_position.position.y() as f32;
|
||||
#[allow(clippy::cast_possible_truncation)]
|
||||
let longitude_deg = own_position.position.x() as f32;
|
||||
let distance_a = dist_a
|
||||
.map(|v| {
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
|
||||
let val = v as u16;
|
||||
val
|
||||
})
|
||||
.unwrap_or_default();
|
||||
let distance_b = dist_b
|
||||
.map(|v| {
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
|
||||
let val = v as u16;
|
||||
val
|
||||
})
|
||||
.unwrap_or_default();
|
||||
let angle = angle
|
||||
.map(|v| {
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
|
||||
let val = v as u16;
|
||||
val
|
||||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
let gac = geonetworking::en302636_4_1::GeoAnycast::try_from_values(
|
||||
sequence_number,
|
||||
source_position_vector,
|
||||
latitude_deg,
|
||||
longitude_deg,
|
||||
distance_a,
|
||||
distance_b,
|
||||
angle,
|
||||
)
|
||||
.map_err(|err| alloc::format!("{err}"))?;
|
||||
|
||||
Ok((atype, gac))
|
||||
}
|
||||
}
|
||||
|
||||
#[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)]
|
||||
mod tests {
|
||||
|
||||
use super::*;
|
||||
use crate::init_test_env_logger;
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::RawMsgTx> for msg::SerialInputMsg {
|
||||
fn from(value: msg::RawMsgTx) -> Self {
|
||||
use msg::serial_input_msg::Payload;
|
||||
|
||||
Self {
|
||||
payload: Some(Payload::TxMsg(value)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
impl From<msg::PositionState> for msg::SerialInputMsg {
|
||||
fn from(value: msg::PositionState) -> Self {
|
||||
use msg::serial_input_msg::Payload;
|
||||
|
||||
Self {
|
||||
payload: Some(Payload::Position(value)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// manual example data:
|
||||
// SerialInputMsg(RawMsgTx): 5632582b0040123e0a340202c173256817284029d5b3400f1feaf01ffffffc23b7743e00000fc0007e8138250737feebfff600000dffff7ffff1ce40400010011807220028020d0a
|
||||
// SerialInputMsg(PositionState): 5632582b00170a1509a0bbe2a29f010000120a0d00002842150000b8410d0a
|
||||
// PositionState: 09a0bbe2a29f010000120a0d00002842150000b841
|
||||
|
||||
#[cfg(feature = "uart")]
|
||||
#[test]
|
||||
fn uart_parser() {
|
||||
// generate some test UART input messages
|
||||
let raw_tx = msg::RawMsgTx {
|
||||
payload: crate::testdata::CAM_SMALL.to_vec(),
|
||||
message_type: 1,
|
||||
gn_transport: msg::GnTransport::Shb.into(),
|
||||
gn_area: msg::GnArea {
|
||||
area: None,
|
||||
position: None,
|
||||
dist_a: None,
|
||||
dist_b: None,
|
||||
angle: None,
|
||||
},
|
||||
hop_limit: 2,
|
||||
station_type: None,
|
||||
};
|
||||
let raw_tx_buf = serialize_serial_msg::<msg::SerialInputMsg>(&raw_tx.clone().into());
|
||||
|
||||
let pos_state = msg::PositionState {
|
||||
timestamp_ms: 1785144196000,
|
||||
position: msg::Position {
|
||||
latitude_deg: 42.,
|
||||
longitude_deg: 23.,
|
||||
},
|
||||
heading: None,
|
||||
speed: None,
|
||||
};
|
||||
let pos_state_buf = serialize_serial_msg::<msg::SerialInputMsg>(&pos_state.clone().into());
|
||||
|
||||
let mut parser = Parser::default();
|
||||
|
||||
// feed individual complete messages to parser
|
||||
let output = parser.parse(&raw_tx_buf);
|
||||
assert_eq!(1, output.len());
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(raw_tx.clone()),
|
||||
output.get(0).unwrap()
|
||||
);
|
||||
|
||||
let output = parser.parse(&pos_state_buf);
|
||||
assert_eq!(1, output.len());
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(pos_state.clone()),
|
||||
output.get(0).unwrap()
|
||||
);
|
||||
|
||||
// feed multiple complete messages to parser
|
||||
let mut combined_buf = pos_state_buf.clone();
|
||||
combined_buf.extend_from_slice(&raw_tx_buf);
|
||||
|
||||
let output = parser.parse(&combined_buf);
|
||||
assert_eq!(2, output.len());
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(pos_state.clone()),
|
||||
output.get(0).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(raw_tx.clone()),
|
||||
output.get(1).unwrap()
|
||||
);
|
||||
|
||||
// feed partial messages to parser
|
||||
let buf1 = &raw_tx_buf[0..3];
|
||||
let buf2 = &raw_tx_buf[3..];
|
||||
|
||||
let output = parser.parse(buf1);
|
||||
assert_eq!(0, output.len());
|
||||
|
||||
let output = parser.parse(buf2);
|
||||
assert_eq!(1, output.len());
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(raw_tx.clone()),
|
||||
output.get(0).unwrap()
|
||||
);
|
||||
|
||||
// feed messages with garbage in between
|
||||
let mut buf1 = vec![0xabu8, 0xcd]; // prepend some garbage
|
||||
buf1.extend_from_slice(&raw_tx_buf[0..3]);
|
||||
let mut buf2 = (&raw_tx_buf[3..]).to_vec();
|
||||
buf2.extend_from_slice(&[0xfeu8, 0x42]); // append some garbage
|
||||
buf2.extend_from_slice(&pos_state_buf); // append second message
|
||||
buf2.extend_from_slice(&[0x11u8, 0x22]); // append some more garbage
|
||||
|
||||
let output = parser.parse(&buf1);
|
||||
assert_eq!(0, output.len());
|
||||
|
||||
let output = parser.parse(&buf2);
|
||||
assert_eq!(2, output.len());
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(raw_tx.clone()),
|
||||
output.get(0).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
&msg::SerialInputMsg::from(pos_state.clone()),
|
||||
output.get(1).unwrap()
|
||||
);
|
||||
}
|
||||
}
|
||||
984
src/main.rs
984
src/main.rs
File diff suppressed because it is too large
Load diff
98
src/radio.rs
Normal file
98
src/radio.rs
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
//! IEEE 802.11p C-ITS Capture with ESP32-C5
|
||||
|
||||
// -----------------------------
|
||||
// missing interface definitions
|
||||
// -----------------------------
|
||||
|
||||
use alloc::format;
|
||||
use alloc::string::String;
|
||||
|
||||
use esp_radio::wifi::sniffer;
|
||||
|
||||
pub type Channel = core::ffi::c_int;
|
||||
|
||||
unsafe extern "C" {
|
||||
/// Changes the 802.11 PHY channel
|
||||
///
|
||||
/// C function signature: `void phy_change_channel(int,int,int,int)`
|
||||
///
|
||||
/// Options:
|
||||
/// - `primary`: Channel frequency in MHz
|
||||
/// - `ignored1`: Ignored (set to 1)
|
||||
/// - `ignored2`: Ignored (set to 0)
|
||||
/// - `ht_mode`: Probably HT mode
|
||||
unsafe fn phy_change_channel(
|
||||
primary: Channel,
|
||||
ignored1: core::ffi::c_int,
|
||||
ignored2: core::ffi::c_int,
|
||||
ht_mode: core::ffi::c_int,
|
||||
) -> core::ffi::c_int;
|
||||
|
||||
/// Enables 802.11p mode on the ESP32-C5
|
||||
///
|
||||
/// C function signature: `void phy_11p_set(int,int)`
|
||||
///
|
||||
/// Options:
|
||||
/// - `enable`: Boolean option to enable 802.11p mode
|
||||
/// - `zero`: Unknown, but need to be zero
|
||||
unsafe fn phy_11p_set(enable: u8, zero: u8);
|
||||
}
|
||||
|
||||
/// Enum values for `wifi_promiscuous_pkt_type_t` used in `esp_radio::wifi::sniffer::PromiscuousPkt::frame_type`
|
||||
///
|
||||
/// Original value is actually `core::ffi::c_uint`, but that can't be used in `#[repr()]` attributes,
|
||||
/// so we're using `u8` as the smallest suitable type here that can be casted to a bigger type.
|
||||
#[repr(u8)]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[allow(dead_code)]
|
||||
pub(crate) enum PromiscuousPktType {
|
||||
/// Management frame, indicates 'buf' argument is `wifi_promiscuous_pkt_t`
|
||||
Mgmt = 0,
|
||||
/// Control frame, indicates 'buf' argument is `wifi_promiscuous_pkt_t`
|
||||
Ctrl = 1,
|
||||
/// Data frame, indicates 'buf' argument is `wifi_promiscuous_pkt_t`
|
||||
Data = 2,
|
||||
/// Other type, such as MIMO etc. 'buf' argument is `wifi_promiscuous_pkt_t` but the payload is zero length.
|
||||
Misc = 3,
|
||||
}
|
||||
|
||||
impl PromiscuousPktType {
|
||||
#[allow(dead_code)]
|
||||
pub fn as_repr(self) -> u8 {
|
||||
self as u8
|
||||
}
|
||||
|
||||
/// Converts to underlying type of `wifi_promiscuous_pkt_type_t` (used by `esp_radio::wifi::sniffer::PromiscuousPkt::frame_type`)
|
||||
pub fn as_frame_type(self) -> core::ffi::c_uint {
|
||||
core::ffi::c_uint::from(self.as_repr())
|
||||
}
|
||||
|
||||
/// Determines if
|
||||
pub fn matches(self, frame_type: core::ffi::c_uint) -> bool {
|
||||
self.as_frame_type() == frame_type
|
||||
}
|
||||
}
|
||||
|
||||
/// Configure WiFi Sniffer to a certain 802.11p channel
|
||||
pub fn setup_wifi_sniffer(
|
||||
channel: Channel,
|
||||
sniffer: &mut sniffer::Sniffer,
|
||||
callback: fn(sniffer::PromiscuousPkt<'_>),
|
||||
) -> Result<(), String> {
|
||||
sniffer
|
||||
.set_promiscuous_mode(true)
|
||||
.map_err(|err| format!("Failed to enable promiscuous mode: {err:?}"))?;
|
||||
|
||||
sniffer.set_receive_cb(callback);
|
||||
|
||||
// convert channel number to frequency in MHz
|
||||
let primary = 5000 + (channel * 5);
|
||||
|
||||
unsafe {
|
||||
phy_11p_set(1, 0);
|
||||
match phy_change_channel(primary, 1, 0, 0) {
|
||||
0 => Ok(()),
|
||||
ret => Err(format!("Failed to change channel: {ret}")),
|
||||
}
|
||||
}
|
||||
}
|
||||
734
src/screen.rs
734
src/screen.rs
|
|
@ -1,734 +0,0 @@
|
|||
//! Screen Output
|
||||
|
||||
use embedded_graphics::prelude::*;
|
||||
use embedded_graphics::{geometry, mono_font, pixelcolor, primitives, text};
|
||||
|
||||
use crate::applogic;
|
||||
|
||||
pub struct DisplaySize {
|
||||
width: u16,
|
||||
height: u16,
|
||||
offset_top: i32,
|
||||
corner_radius: i32,
|
||||
}
|
||||
|
||||
pub struct Handler<D>
|
||||
where
|
||||
D: DrawTarget<Color = pixelcolor::Rgb565>,
|
||||
{
|
||||
target: D,
|
||||
size: DisplaySize,
|
||||
|
||||
// internal state
|
||||
prev_state: ScreenState,
|
||||
hb_state: bool,
|
||||
gnss_hb_state: bool,
|
||||
|
||||
// assets
|
||||
#[cfg(feature = "spat")]
|
||||
bike_image: tinytga::Tga<'static, pixelcolor::Rgb565>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, PartialEq, Eq)]
|
||||
pub enum ScreenState {
|
||||
#[default]
|
||||
Uninitialized,
|
||||
/// aka. "no GNSS fix" or "splash screen"
|
||||
Initial,
|
||||
Error(alloc::string::String),
|
||||
#[cfg(feature = "spat")]
|
||||
GlosaSearching(applogic::GlosaSearching),
|
||||
#[cfg(feature = "spat")]
|
||||
GlosaFound(applogic::GlosaFound),
|
||||
#[cfg(feature = "spat")]
|
||||
GlosaLocked(applogic::GlosaSignalInfo),
|
||||
}
|
||||
|
||||
#[cfg(feature = "spat")]
|
||||
impl From<applogic::GlosaOutput> for ScreenState {
|
||||
fn from(value: applogic::GlosaOutput) -> Self {
|
||||
match value {
|
||||
applogic::GlosaOutput::Searching(glosa_searching) => {
|
||||
Self::GlosaSearching(glosa_searching)
|
||||
}
|
||||
applogic::GlosaOutput::Found(glosa_found) => Self::GlosaFound(glosa_found),
|
||||
applogic::GlosaOutput::Locked(glosa_signal_info) => {
|
||||
Self::GlosaLocked(glosa_signal_info)
|
||||
}
|
||||
applogic::GlosaOutput::Error(err_str) => Self::Error(err_str),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<D> Handler<D>
|
||||
where
|
||||
D: DrawTarget<Color = pixelcolor::Rgb565>,
|
||||
{
|
||||
const COLOR_BG: pixelcolor::Rgb565 = pixelcolor::Rgb565::BLACK;
|
||||
const COLOR_FG: pixelcolor::Rgb565 = pixelcolor::Rgb565::WHITE;
|
||||
|
||||
const BK_STYLE: primitives::PrimitiveStyle<pixelcolor::Rgb565> =
|
||||
primitives::PrimitiveStyleBuilder::new()
|
||||
.fill_color(Self::COLOR_BG)
|
||||
.build();
|
||||
const RD_STYLE: primitives::PrimitiveStyle<pixelcolor::Rgb565> =
|
||||
primitives::PrimitiveStyleBuilder::new()
|
||||
.fill_color(pixelcolor::Rgb565::CSS_RED)
|
||||
.build();
|
||||
const YE_STYLE: primitives::PrimitiveStyle<pixelcolor::Rgb565> =
|
||||
primitives::PrimitiveStyleBuilder::new()
|
||||
.fill_color(pixelcolor::Rgb565::new(31, 55, 0))
|
||||
.build();
|
||||
const GN_STYLE: primitives::PrimitiveStyle<pixelcolor::Rgb565> =
|
||||
primitives::PrimitiveStyleBuilder::new()
|
||||
.fill_color(pixelcolor::Rgb565::new(10, 50, 0))
|
||||
.build();
|
||||
const BLANK_SIGNAL_STYLE: primitives::PrimitiveStyle<pixelcolor::Rgb565> =
|
||||
primitives::PrimitiveStyleBuilder::new()
|
||||
.fill_color(pixelcolor::Rgb565::CSS_GRAY)
|
||||
.build();
|
||||
|
||||
const DEFAULT_TEXT_STYLE: mono_font::MonoTextStyle<'static, pixelcolor::Rgb565> =
|
||||
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> =
|
||||
mono_font::MonoTextStyle::new(&profont::PROFONT_14_POINT, Self::COLOR_FG);
|
||||
|
||||
const BIG_HEIGHT_THLD: u16 = 172;
|
||||
|
||||
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 {
|
||||
target,
|
||||
size: display_size,
|
||||
prev_state: ScreenState::Uninitialized,
|
||||
hb_state: false,
|
||||
gnss_hb_state: false,
|
||||
#[cfg(feature = "spat")]
|
||||
bike_image,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn update(&mut self, state: ScreenState) -> Result<(), D::Error> {
|
||||
if self.prev_state != state {
|
||||
match &state {
|
||||
ScreenState::Uninitialized | ScreenState::Initial => self.draw_slash_screen()?,
|
||||
ScreenState::GlosaSearching(_glosa_searching) => self.draw_glosa_searching()?,
|
||||
ScreenState::GlosaFound(glosa_found) => self.draw_glosa_found(glosa_found)?,
|
||||
ScreenState::GlosaLocked(glosa_data) => {
|
||||
let prev_glosa_data =
|
||||
if let ScreenState::GlosaLocked(prev_glosa_data) = &self.prev_state {
|
||||
Some(prev_glosa_data.clone())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
self.draw_glosa(glosa_data, prev_glosa_data)?;
|
||||
}
|
||||
ScreenState::Error(msg) => self.draw_message(msg)?,
|
||||
}
|
||||
}
|
||||
|
||||
// Update indicator/ heartbeat
|
||||
{
|
||||
let update_ind_dia = 10;
|
||||
let circle_x_pos =
|
||||
i32::from(self.size.width) - update_ind_dia - self.size.corner_radius;
|
||||
|
||||
text::Text::with_alignment(
|
||||
"HB",
|
||||
geometry::Point::new(circle_x_pos - 5, 10 + self.size.offset_top),
|
||||
Self::SMALL_TEXT_STYLE,
|
||||
text::Alignment::Right,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
primitives::Circle::new(
|
||||
geometry::Point::new(circle_x_pos, 2 + self.size.offset_top),
|
||||
update_ind_dia.cast_unsigned(),
|
||||
)
|
||||
.into_styled(if self.hb_state {
|
||||
Self::GN_STYLE
|
||||
} else {
|
||||
Self::BK_STYLE
|
||||
})
|
||||
.draw(&mut self.target)?;
|
||||
}
|
||||
|
||||
self.prev_state = state;
|
||||
self.hb_state = !self.hb_state;
|
||||
|
||||
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>
|
||||
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
|
||||
D: DrawTarget<Color = pixelcolor::Rgb565>,
|
||||
{
|
||||
primitives::Rectangle::new(
|
||||
geometry::Point::new(0, 0),
|
||||
geometry::Size::new(self.size.width.into(), self.size.height.into()),
|
||||
)
|
||||
.into_styled(Self::BK_STYLE)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn is_big_height(&self) -> bool {
|
||||
self.size.height > Self::BIG_HEIGHT_THLD
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn test_img(&mut self) -> Result<(), D::Error> {
|
||||
mipidsi::TestImage::new().draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn draw_message(&mut self, msg: &str) -> Result<(), D::Error> {
|
||||
// clear whole display and draw text
|
||||
self.clear()?;
|
||||
|
||||
text::Text::with_alignment(
|
||||
msg,
|
||||
geometry::Point::new(i32::from(self.size.width) / 2, 40 + self.size.offset_top),
|
||||
Self::DEFAULT_TEXT_STYLE,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
fn draw_glosa_searching(&mut self) -> Result<(), D::Error> {
|
||||
// clear whole display and draw text
|
||||
self.clear()?;
|
||||
|
||||
text::Text::with_alignment(
|
||||
"Searching...",
|
||||
geometry::Point::new(i32::from(self.size.width) / 2, 130 + self.size.offset_top),
|
||||
Self::DEFAULT_TEXT_STYLE,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
fn draw_glosa_found(&mut self, data: &applogic::GlosaFound) -> Result<(), D::Error> {
|
||||
// clear whole display and draw text
|
||||
self.clear()?;
|
||||
|
||||
let text = if let Some(appr) = data.approach_id {
|
||||
alloc::format!("Int. {}\nApproach {appr}", data.intersection_id)
|
||||
} else {
|
||||
alloc::format!("Int. {}\nno approach ID available", data.intersection_id)
|
||||
};
|
||||
|
||||
text::Text::with_alignment(
|
||||
&text,
|
||||
geometry::Point::new(i32::from(self.size.width) / 2, 130 + self.size.offset_top),
|
||||
Self::DEFAULT_TEXT_STYLE,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// uses full screen width and height
|
||||
// - 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(
|
||||
&mut self,
|
||||
data: &applogic::GlosaSignalInfo,
|
||||
prev_data: Option<applogic::GlosaSignalInfo>,
|
||||
) -> Result<(), D::Error> {
|
||||
let num_signals = data.signal_groups.len();
|
||||
|
||||
let is_big_height = self.is_big_height();
|
||||
|
||||
if let Some(prev) = prev_data
|
||||
&& prev.signal_groups.len() != num_signals
|
||||
{
|
||||
// clear everything if number of signals has changed
|
||||
self.clear();
|
||||
} else {
|
||||
// only clear maneuver and timing area otherwise (lane type will clear itself)
|
||||
let sig_total_height = 67 + if is_big_height { 20 } else { 0 };
|
||||
primitives::Rectangle::new(
|
||||
geometry::Point::new(0, 105 + self.size.offset_top),
|
||||
geometry::Size::new(self.size.width.into(), sig_total_height),
|
||||
)
|
||||
.into_styled(Self::BK_STYLE)
|
||||
.draw(&mut self.target)?;
|
||||
}
|
||||
|
||||
// do nothing more when no signals
|
||||
if num_signals == 0 {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// draw intersection ID
|
||||
text::Text::new(
|
||||
&alloc::format!("#{}", data.intersection_id),
|
||||
geometry::Point::new(self.size.corner_radius + 5, 10 + self.size.offset_top),
|
||||
Self::SMALL_TEXT_STYLE,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
|
||||
let sig_width = i32::from(self.size.width) / (num_signals as i32);
|
||||
|
||||
for (idx, sig) in data.signal_groups.iter().enumerate() {
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
|
||||
let offset = (idx as i32) * sig_width;
|
||||
|
||||
let circle_dia = 50;
|
||||
let circle_margin = (sig_width - circle_dia) / 2;
|
||||
let centerline = offset + (sig_width / 2);
|
||||
|
||||
// draw phase color
|
||||
let style = match sig.phase {
|
||||
applogic::SignalPhase::Unknown => Self::BLANK_SIGNAL_STYLE,
|
||||
applogic::SignalPhase::Red => Self::RD_STYLE,
|
||||
applogic::SignalPhase::Green => Self::GN_STYLE,
|
||||
applogic::SignalPhase::RedYellow | applogic::SignalPhase::Yellow => Self::YE_STYLE,
|
||||
};
|
||||
primitives::Circle::new(
|
||||
geometry::Point::new(offset + circle_margin, 15 + self.size.offset_top),
|
||||
circle_dia.cast_unsigned(),
|
||||
)
|
||||
.into_styled(style)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
// mark bike lanes which are not a vehicle lane, too
|
||||
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
|
||||
text::Text::with_alignment(
|
||||
&maneuver_to_str(sig.maneuver),
|
||||
geometry::Point::new(centerline, 130 + self.size.offset_top),
|
||||
Self::DEFAULT_TEXT_STYLE,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
// draw timing indicator(s)
|
||||
if let Some(timing) = &sig.timing {
|
||||
if let (Some(likely), Some(max)) = (timing.likely_end_sec, timing.max_end_sec) {
|
||||
text::Text::with_alignment(
|
||||
&alloc::format!("{likely}s"),
|
||||
geometry::Point::new(centerline, 160 + self.size.offset_top),
|
||||
Self::DEFAULT_TEXT_STYLE,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.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(())
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
fn draw_slash_screen(&mut self) -> Result<(), D::Error> {
|
||||
let text_style = mono_font::MonoTextStyle::new(&profont::PROFONT_18_POINT, Self::COLOR_FG);
|
||||
|
||||
self.clear_all()?;
|
||||
|
||||
let sig_width = i32::from(self.size.width) / 3;
|
||||
let circle_dia = 50;
|
||||
let circle_margin = (sig_width - circle_dia) / 2;
|
||||
|
||||
for (idx, style) in [Self::RD_STYLE, Self::YE_STYLE, Self::GN_STYLE]
|
||||
.iter()
|
||||
.enumerate()
|
||||
{
|
||||
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
|
||||
let offset = (idx as i32) * sig_width;
|
||||
|
||||
primitives::Circle::new(
|
||||
geometry::Point::new(offset + circle_margin, 15 + self.size.offset_top),
|
||||
circle_dia.cast_unsigned(),
|
||||
)
|
||||
.into_styled(*style)
|
||||
.draw(&mut self.target)?;
|
||||
}
|
||||
|
||||
// draw welcome text
|
||||
let centerline = i32::from(self.size.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(
|
||||
"C-ITS Signal Phase\nWaiting for GNSS...",
|
||||
geometry::Point::new(centerline, 130 + self.size.offset_top),
|
||||
text_style,
|
||||
text::Alignment::Center,
|
||||
)
|
||||
.draw(&mut self.target)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn maneuver_to_str(value: applogic::v2x::map::Maneuvers) -> alloc::string::String {
|
||||
alloc::format!(
|
||||
"{}{}{}",
|
||||
if value.left_allowed { "<" } else { " " },
|
||||
if value.staight_allowed { "^" } else { " " },
|
||||
if value.right_allowed { ">" } else { " " },
|
||||
)
|
||||
}
|
||||
|
||||
/// Creates an [`mipidsi::Display`], width, height tuple for an ST7789 172*320px screen in landscape orientation
|
||||
///
|
||||
/// # Errors
|
||||
/// Human-readable fatal errors
|
||||
#[allow(unused, clippy::too_many_arguments, clippy::type_complexity)]
|
||||
pub fn make_small_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_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)
|
||||
.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}"))?;
|
||||
|
||||
// Note: height and width are swapped b/c of 90° display rotation
|
||||
let display = mipidsi::Builder::new(
|
||||
mipidsi::models::ST7789,
|
||||
mipidsi::interface::SpiInterface::new(spi_device, dc_output, spi_buffer),
|
||||
)
|
||||
.display_size(size.height + DISPLAY_HIDDEN_X, size.width)
|
||||
.reset_pin(rst_output)
|
||||
.invert_colors(mipidsi::options::ColorInversion::Inverted)
|
||||
.orientation(mipidsi::options::Orientation::new().rotate(mipidsi::options::Rotation::Deg90))
|
||||
.init(&mut display_delay)
|
||||
.map_err(|err| alloc::format!("Failed to initialize display: {err:?}"))?;
|
||||
|
||||
Ok((display, size))
|
||||
}
|
||||
|
||||
/// 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
|
||||
///
|
||||
/// Returns (spi master, chip-select) tuple
|
||||
///
|
||||
/// # Errors
|
||||
/// Returns SPI config error when SPI setup failed
|
||||
fn setup_st7789_spi<IoScl, IoSda, IoCs, Spi>(
|
||||
scl: IoScl,
|
||||
sda: IoSda,
|
||||
cs: IoCs,
|
||||
spi: Spi,
|
||||
) -> Result<
|
||||
(
|
||||
esp_hal::spi::master::Spi<'static, esp_hal::Blocking>,
|
||||
esp_hal::gpio::Output<'static>,
|
||||
),
|
||||
esp_hal::spi::master::ConfigError,
|
||||
>
|
||||
where
|
||||
IoScl: esp_hal::gpio::interconnect::PeripheralOutput<'static>,
|
||||
IoSda: esp_hal::gpio::interconnect::PeripheralOutput<'static>,
|
||||
IoCs:
|
||||
esp_hal::gpio::interconnect::PeripheralOutput<'static> + esp_hal::gpio::OutputPin + 'static,
|
||||
Spi: esp_hal::spi::master::Instance + 'static,
|
||||
{
|
||||
let spi_config = esp_hal::spi::master::Config::default()
|
||||
.with_frequency(esp_hal::time::Rate::from_mhz(40))
|
||||
.with_mode(esp_hal::spi::Mode::_0);
|
||||
let spi: esp_hal::spi::master::Spi<'_, esp_hal::Blocking> =
|
||||
esp_hal::spi::master::Spi::new(spi, spi_config)?
|
||||
.with_sck(scl)
|
||||
.with_mosi(sda);
|
||||
|
||||
let cs_output = esp_hal::gpio::Output::new(
|
||||
cs,
|
||||
esp_hal::gpio::Level::High,
|
||||
esp_hal::gpio::OutputConfig::default(),
|
||||
);
|
||||
|
||||
Ok((spi, cs_output))
|
||||
}
|
||||
24
src/test.rs
24
src/test.rs
|
|
@ -1,24 +0,0 @@
|
|||
#![cfg(not(target_arch = "riscv32"))]
|
||||
#![allow(unused)]
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
mod applogic;
|
||||
mod cache;
|
||||
mod geo_alg;
|
||||
mod io;
|
||||
mod testdata;
|
||||
|
||||
fn main() {
|
||||
// env_logger::init();
|
||||
// dummy only
|
||||
}
|
||||
|
||||
/// 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();
|
||||
}
|
||||
465
src/testdata.rs
465
src/testdata.rs
|
|
@ -1,465 +0,0 @@
|
|||
//! Central provider for V2X test messages
|
||||
//!
|
||||
//! All messages are without any headers (so they start with the ItsPduHeader)
|
||||
|
||||
#![cfg(all(not(target_arch = "riscv32"), any(feature = "spat", feature = "cam")))]
|
||||
#![allow(unused)]
|
||||
|
||||
/// Intersection "Sievekingplatz-Südfahrbahn/Ziviljustizgebäude"
|
||||
///
|
||||
/// Pedestrian crossing over a one-way street (going from west to east)
|
||||
///
|
||||
/// Possible start point (heading 90° to 135°):
|
||||
/// - in front: `geo_types::Point::new(9.9752864, 53.5564028)`
|
||||
/// - at lane: `geo_types::Point::new(9.9760764, 53.5563621)`
|
||||
/// - passed: `geo_types::Point::new(9.977217, 53.5560602)`
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_1328: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x12, 0x19, 0x8c, 0x8, 0x0, 0x3, 0x9, 0xcd, 0x83, 0x42, 0xfc, 0x9a, 0x94, 0xef,
|
||||
0xb1, 0x67, 0x71, 0x8b, 0x36, 0x4e, 0x2e, 0x31, 0x60, 0xb9, 0xa4, 0x0, 0xc, 0x14, 0xc0, 0x20,
|
||||
0xab, 0x21, 0xda, 0x5c, 0xe2, 0x78, 0x72, 0x74, 0x5, 0x14, 0x18, 0x90, 0x4, 0x50, 0x80, 0x0,
|
||||
0x0, 0x85, 0xc, 0x5c, 0xa8, 0xa0, 0x0, 0x80, 0x23, 0xc1, 0x42, 0x7e, 0xa8, 0x58, 0x46, 0x1d,
|
||||
0xa0, 0x11, 0xef, 0x4d, 0xf0, 0x45, 0xa5, 0x56, 0x8, 0x2d, 0xa6, 0x2, 0x30, 0xc9, 0x26, 0x11,
|
||||
0xb7, 0xc5, 0x90, 0x84, 0xca, 0x16, 0xc1, 0x60, 0x70, 0x0, 0x2, 0x2, 0x20, 0x6, 0x44, 0x40,
|
||||
0x0, 0x0, 0x0, 0x8f, 0x5, 0xf8, 0x83, 0xed, 0x8c, 0x19, 0x20, 0x10, 0xa1, 0x0, 0x0, 0x1, 0xa,
|
||||
0x23, 0x2a, 0x63, 0x40, 0x1, 0x9, 0xb9, 0xa7, 0x40, 0x25, 0xec, 0x21, 0x17, 0xad, 0x3c, 0x8,
|
||||
0xef, 0x66, 0xfc, 0x47, 0xa1, 0x2e, 0x82, 0x39, 0x99, 0x2b, 0x11, 0xd2, 0xc7, 0x8, 0x8f, 0x32,
|
||||
0x18, 0x4, 0x70, 0x50, 0x8c, 0x2b, 0x5, 0x80, 0x0, 0x10, 0x25, 0x82, 0x40, 0x0, 0x8, 0x18,
|
||||
0x80, 0x29, 0x11, 0x0, 0x0, 0x0, 0x1, 0x17, 0x14, 0x80, 0x3f, 0x70, 0xf8, 0x88, 0x2, 0x11,
|
||||
0x10, 0x0, 0x0, 0x0, 0x11, 0x23, 0x38, 0x83, 0xe5, 0x8c, 0x90, 0x20, 0x33, 0x2, 0x4, 0x0, 0x0,
|
||||
0x1, 0x43, 0xd6, 0xe2, 0x8, 0x0, 0x20, 0x72, 0x5a, 0xd0, 0x50, 0x38, 0x10, 0x20, 0x20, 0x3b,
|
||||
0x2, 0x4, 0x0, 0x0, 0x1, 0x20, 0x23, 0x20, 0xa0, 0x0, 0x82, 0x37, 0x94, 0xc1, 0x40, 0xc0, 0x40,
|
||||
0xa0,
|
||||
];
|
||||
|
||||
/// Intersection "Johannisbollwerk/Ditmar-Koel-Straße"
|
||||
///
|
||||
/// Has a very complex geometry with multiple stop lines after each other.
|
||||
/// Main traffic direction is east-west, has separate bike lanes.
|
||||
///
|
||||
/// Possible start point (heading 90°): TODO
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_2053: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x12, 0x43, 0x84, 0x8, 0x0, 0x3, 0x9, 0xcd, 0x83, 0x42, 0xfc, 0x9a, 0x94, 0xef,
|
||||
0xb2, 0x61, 0x71, 0x93, 0x6, 0xac, 0xee, 0x31, 0x66, 0xb9, 0x94, 0x0, 0xc, 0x20, 0x14, 0x10,
|
||||
0xab, 0x1e, 0x9c, 0x96, 0xe2, 0x77, 0x51, 0x1e, 0x5, 0x14, 0xc8, 0x90, 0x1c, 0xd0, 0x88, 0x0,
|
||||
0x0, 0x15, 0x8f, 0x5d, 0xb6, 0x88, 0x0, 0x20, 0xc, 0x8e, 0xb0, 0x1a, 0x4a, 0xb8, 0x2c, 0xa,
|
||||
0x0, 0x0, 0x40, 0x44, 0x0, 0x84, 0x88, 0x80, 0x0, 0x1, 0x9, 0xdd, 0xc0, 0x41, 0xdd, 0x54, 0xb0,
|
||||
0x59, 0xe9, 0x39, 0x4, 0x80, 0x64, 0x84, 0x0, 0x0, 0x0, 0xaa, 0x39, 0xc9, 0x5d, 0x0, 0x4, 0x5c,
|
||||
0x8c, 0x91, 0x84, 0xd8, 0x75, 0x3d, 0x21, 0x58, 0x34, 0x0, 0x3, 0x1, 0x2c, 0x8, 0x80, 0x0,
|
||||
0x81, 0x4, 0x1, 0x90, 0x88, 0x0, 0x0, 0x1, 0x18, 0xe6, 0x61, 0xa8, 0x13, 0xaf, 0x1d, 0xc0,
|
||||
0x98, 0xc4, 0x44, 0x80, 0x84, 0x84, 0x0, 0x0, 0x0, 0xaa, 0x11, 0x44, 0xe9, 0x0, 0x4, 0x5c,
|
||||
0x8c, 0x91, 0x84, 0xd8, 0xdd, 0x3c, 0x50, 0x58, 0x2c, 0x0, 0x3, 0x1, 0x88, 0x2, 0xa1, 0x10,
|
||||
0x0, 0x0, 0x2, 0x31, 0xa3, 0x3e, 0x34, 0x27, 0x7a, 0x38, 0x81, 0x38, 0x8a, 0xc9, 0x0, 0x45,
|
||||
0x8, 0x0, 0x0, 0x1, 0x48, 0x1a, 0xd6, 0x68, 0x0, 0x22, 0xcf, 0xe9, 0xc7, 0x1e, 0x92, 0xe7,
|
||||
0x46, 0x2b, 0x6, 0x80, 0x0, 0x30, 0x55, 0x82, 0xc0, 0x0, 0x18, 0x31, 0x21, 0x34, 0x21, 0x0,
|
||||
0x0, 0x0, 0x2b, 0x4c, 0x89, 0xc, 0x90, 0x0, 0x44, 0x3d, 0xb5, 0x5a, 0x12, 0x39, 0x48, 0xc1,
|
||||
0x65, 0x10, 0x0, 0x26, 0xe, 0x20, 0x50, 0xe4, 0x40, 0x0, 0x0, 0x8, 0xda, 0x2, 0x25, 0x30, 0xe3,
|
||||
0x85, 0x9c, 0x1e, 0x1e, 0x92, 0x89, 0x9, 0x61, 0x8, 0x0, 0x0, 0x1, 0x5a, 0x3e, 0x86, 0x18,
|
||||
0x80, 0x2, 0x21, 0xcb, 0xaa, 0x80, 0x94, 0x8a, 0x1c, 0xb, 0x29, 0x80, 0x1, 0x30, 0x81, 0x2,
|
||||
0x97, 0x22, 0x0, 0x0, 0x0, 0x46, 0xc5, 0xb0, 0x9a, 0x7, 0xc, 0x2d, 0xe0, 0xf3, 0x54, 0x88,
|
||||
0x48, 0x4f, 0x8, 0x4, 0x20, 0x0, 0x0, 0x15, 0xa2, 0x28, 0x44, 0x88, 0x80, 0x2b, 0x50, 0x87,
|
||||
0x5e, 0xa8, 0xc2, 0x1f, 0xaa, 0x0, 0x2c, 0xaa, 0x0, 0x4, 0xc2, 0x44, 0xa, 0x9c, 0x80, 0x84,
|
||||
0x0, 0x0, 0x2, 0xb5, 0xec, 0x1, 0x40, 0x11, 0x6a, 0xe, 0x75, 0x55, 0xc1, 0xdb, 0x69, 0xc4,
|
||||
0x90, 0x7d, 0x90, 0x8, 0x40, 0x0, 0x0, 0x6d, 0x5e, 0x40, 0x79, 0xb, 0x44, 0x1, 0x54, 0x46,
|
||||
0x7e, 0x8, 0x37, 0x88, 0x6f, 0x23, 0xd0, 0x44, 0x91, 0x34, 0x45, 0x5f, 0x6f, 0x8e, 0x65, 0x5,
|
||||
0x90, 0x40, 0x0, 0x48, 0x50, 0x81, 0x2, 0x90, 0x10, 0x80, 0x0, 0x0, 0x58, 0x59, 0x12, 0xe1,
|
||||
0x80, 0x8a, 0x88, 0x37, 0x26, 0x78, 0x1c, 0xf3, 0x20, 0x48, 0x2c, 0xc8, 0x40, 0x0, 0x0, 0x1b,
|
||||
0x57, 0x80, 0x1e, 0x86, 0x10, 0x0, 0x46, 0x70, 0x58, 0x42, 0x88, 0xa4, 0x23, 0xcc, 0x44, 0x4f,
|
||||
0x38, 0x44, 0x0, 0xae, 0xe2, 0x21, 0x58, 0xa4, 0x0, 0x4, 0x85, 0xac, 0x90, 0x80, 0x4, 0x83,
|
||||
0x84, 0x5, 0x14, 0x88, 0x0, 0x0, 0x1, 0x21, 0x96, 0x6b, 0xd8, 0x3, 0x6f, 0x67, 0xc1, 0xaa,
|
||||
0x35, 0x24, 0x82, 0xec, 0x84, 0x0, 0x0, 0x1, 0xb5, 0x77, 0xb1, 0xed, 0xd9, 0x0, 0x4, 0x67,
|
||||
0x6c, 0x83, 0xd0, 0x8b, 0x2a, 0x32, 0x44, 0x1c, 0x54, 0x6a, 0x40, 0x5c, 0xad, 0xb3, 0x15, 0x8a,
|
||||
0xc0, 0x0, 0x48, 0x62, 0xcb, 0xd0, 0x0, 0x44, 0x34, 0x40, 0x55, 0x48, 0x80, 0x0, 0x0, 0x12,
|
||||
0x1b, 0xf0, 0xc6, 0x68, 0x2d, 0xd7, 0x8, 0x19, 0xe3, 0x4c, 0x20, 0x5f, 0x44, 0x44, 0x0, 0x0,
|
||||
0x9, 0xf, 0x23, 0x6c, 0x98, 0x15, 0xac, 0xb6, 0xa, 0x62, 0x52, 0x10, 0x24, 0x92, 0x20, 0x0,
|
||||
0x0, 0x4, 0x84, 0x6b, 0x2a, 0xd6, 0x1c, 0x8a, 0xcf, 0x3, 0x90, 0xdc, 0xc9, 0x21, 0x1c, 0xa0,
|
||||
0x10, 0x80, 0x0, 0x0, 0x58, 0x4a, 0x82, 0xe0, 0xc8, 0x80, 0x2b, 0x50, 0x19, 0x7, 0x6c, 0x8,
|
||||
0x4, 0x82, 0xb, 0x2f, 0x20, 0x1, 0x60, 0xf2, 0x41, 0x25, 0x42, 0x0, 0x0, 0x1, 0x98, 0x22, 0xb3,
|
||||
0x96, 0xe8, 0x0, 0x20, 0x80, 0xac, 0x80, 0x73, 0x37, 0x90, 0x75, 0x54, 0xbe, 0xf, 0xdd, 0x81,
|
||||
0x60, 0xb2, 0xe0, 0x20, 0x6c, 0x59, 0x42, 0x2c, 0xb7, 0xd5, 0x0, 0x10, 0x96, 0x28, 0x20, 0x1,
|
||||
0x42, 0xb, 0x2f, 0x20, 0x0, 0xb1, 0x15, 0x8a, 0x88, 0x0, 0x50, 0xa9, 0x20, 0x9a, 0xa0, 0x10,
|
||||
0x80, 0x0, 0x0, 0xd8, 0x5, 0xcc, 0x2e, 0xe8, 0x80, 0x2a, 0x88, 0x75, 0xc4, 0x84, 0xf, 0x81,
|
||||
0x92, 0xc1, 0xf5, 0x11, 0x1c, 0x59, 0x84, 0xf8, 0x40, 0xb1, 0xa8, 0x0, 0xc, 0x12, 0x10, 0x1a,
|
||||
0x62, 0x2, 0x10, 0x0, 0x0, 0xb, 0x57, 0x61, 0xa0, 0x42, 0x1, 0x15, 0x11, 0x1e, 0x53, 0xdb,
|
||||
0x88, 0xc7, 0x21, 0xa0, 0x90, 0x41, 0x50, 0x80, 0x0, 0x0, 0x36, 0x1, 0xc7, 0x3, 0xea, 0x0, 0x8,
|
||||
0x75, 0x7c, 0x79, 0xf, 0xfb, 0x95, 0xe1, 0xef, 0x70, 0xd0, 0x59, 0xd6, 0xf5, 0xe0, 0xb1, 0x98,
|
||||
0x0, 0xc, 0x13, 0x10, 0x19, 0x62, 0x20, 0x0, 0x0, 0x4, 0xab, 0xb4, 0x4f, 0xff, 0x82, 0x3b,
|
||||
0x97, 0xb6, 0x11, 0x77, 0xc1, 0x99, 0x20, 0x8a, 0xa1, 0x0, 0x0, 0x0, 0x8c, 0x4, 0x11, 0xf4,
|
||||
0xc4, 0x0, 0x10, 0xec, 0x88, 0xfe, 0x2c, 0x2c, 0x89, 0xe0, 0xf0, 0x38, 0x5e, 0xac, 0x74, 0x7c,
|
||||
0x24, 0x0, 0x40, 0x4f, 0x6f, 0xc8, 0x2c, 0x62, 0x0, 0x3, 0x5, 0x4, 0x6, 0x18, 0x88, 0x0, 0x0,
|
||||
0x1, 0x2a, 0xed, 0xc3, 0xf5, 0xc0, 0x8e, 0xa1, 0xed, 0x84, 0x5b, 0xd0, 0x66, 0x8, 0x10, 0xc0,
|
||||
0x81, 0x0, 0x0, 0x0, 0x53, 0x6a, 0x8a, 0x3a, 0x0, 0x8, 0x1d, 0x86, 0x94, 0x14, 0x12, 0xe, 0x2c,
|
||||
0x8, 0x12, 0xc0, 0x81, 0x0, 0x0, 0x0, 0x53, 0xeb, 0x9c, 0x8a, 0x0, 0x8, 0x22, 0x89, 0x6c, 0x14,
|
||||
0x10, 0xe, 0x2e, 0x8, 0x14, 0x80, 0x42, 0x0, 0x0, 0x0, 0x52, 0xdd, 0x8e, 0xf2, 0x0, 0x8, 0x20,
|
||||
0xd6, 0x74, 0x14, 0x16, 0x10, 0x30, 0x0, 0x16, 0x40, 0x42, 0x0, 0x0, 0x0, 0x49, 0x4e, 0x21,
|
||||
0x48, 0x0, 0x20, 0x7c, 0xe6, 0x30, 0x40, 0xc6, 0x4, 0x8, 0x0, 0x0, 0x2, 0x82, 0xce, 0x9a, 0x10,
|
||||
0x0, 0x40, 0xd4, 0x45, 0xe0, 0xa0, 0xd0, 0x41, 0x90, 0x40, 0xd6, 0x4, 0x8, 0x0, 0x0, 0x2, 0x46,
|
||||
0x74, 0x3c, 0x40, 0x1, 0x4, 0xb0, 0xe8, 0x82, 0x83, 0x1, 0x6, 0x81, 0x3, 0x90, 0x8, 0x40, 0x0,
|
||||
0x0, 0x9, 0xc, 0xcb, 0xe9, 0x0, 0x4, 0x12, 0xd3, 0xaa, 0xa, 0xf, 0x5, 0x1b, 0x0, 0xf, 0x20,
|
||||
0x21, 0x0, 0x0, 0x0, 0x2c, 0x7b, 0xf1, 0xcf, 0x40, 0x1, 0x3, 0x3b, 0x7, 0x2, 0xd, 0xa0, 0x20,
|
||||
0x40, 0x0, 0x0, 0x1a, 0xbd, 0xaf, 0x2, 0xfa, 0x80, 0x2, 0x7, 0xca, 0x63, 0x5, 0xe, 0x6, 0x8e,
|
||||
0x0, 0xe, 0x10, 0x20, 0x40, 0x0, 0x0, 0x1a, 0xbe, 0x96, 0xfc, 0xb4, 0x80, 0x2, 0x8, 0x39, 0x9d,
|
||||
0x4, 0x1d, 0x40, 0x40, 0x80, 0x0, 0x0, 0x35, 0x7e, 0x35, 0xf0, 0x9d, 0x0, 0x4, 0xf, 0x8c, 0xc6,
|
||||
0xa, 0x1e, 0xe, 0x1d, 0x0, 0x1e, 0x20, 0x40, 0x80, 0x0, 0x0, 0x30, 0x1, 0x86, 0x20, 0x50, 0x0,
|
||||
0x41, 0x7, 0xb3, 0xa0, 0x84, 0x2c, 0x8, 0x10, 0x0, 0x0, 0x6, 0x9, 0xca, 0xb9, 0xea, 0x0, 0x8,
|
||||
0x19, 0xd8, 0x30, 0x14, 0x44, 0x2e, 0x3c, 0x8, 0x44, 0xc0, 0x81, 0x0, 0x0, 0x0, 0x60, 0xfe,
|
||||
0xcb, 0x6e, 0xa0, 0x0, 0x82, 0x63, 0x7d, 0x1, 0x44, 0x22, 0xe3, 0xe0, 0x85, 0x6c, 0x8, 0x10,
|
||||
0x0, 0x0, 0x5, 0xaf, 0x58, 0x78, 0xc8, 0x0, 0x20, 0x8b, 0x65, 0x90, 0x51, 0x60, 0xa1, 0x0,
|
||||
0x21, 0x63, 0x2, 0x4, 0x0, 0x0, 0x1, 0x6a, 0x5a, 0x6, 0xe2, 0x0, 0x8, 0x1d, 0x36, 0x9c, 0x14,
|
||||
0x56, 0x28, 0x42, 0x8, 0x5a, 0xc0, 0x42, 0x0, 0x0, 0x0, 0x5a, 0x4c, 0xc2, 0xc6, 0x80, 0x2, 0x7,
|
||||
0x45, 0xa8, 0x5, 0x17, 0xa, 0x91, 0x2, 0x17, 0x30, 0x10, 0x80, 0x0, 0x0, 0x16, 0xac, 0x12,
|
||||
0x2b, 0x20, 0x0, 0x82, 0x2f, 0x96, 0x1, 0x45, 0xa2, 0xa4, 0x60, 0x86, 0x8, 0x8, 0x10, 0x0, 0x0,
|
||||
0x6, 0x0, 0x3c, 0xc4, 0x5a, 0x0, 0x8, 0x20, 0xe6, 0x74, 0x14, 0x62, 0x1e, 0x48, 0x0, 0x62,
|
||||
0x40, 0x81, 0x0, 0x0, 0x0, 0x6a, 0xfc, 0xd3, 0xe1, 0x5a, 0x0, 0x8, 0x1f, 0x29, 0x8c, 0x10,
|
||||
0xc9, 0x1, 0x2, 0x0, 0x0, 0x0, 0xd5, 0xf4, 0xa7, 0xe6, 0xa4, 0x0, 0x10, 0x41, 0xac, 0xe8, 0x28,
|
||||
0xcc, 0x40, 0x94, 0x0, 0xcc, 0x81, 0x2, 0x0, 0x0, 0x0, 0xd5, 0xed, 0xe8, 0x18, 0xd4, 0x0, 0x10,
|
||||
0x3e, 0x73, 0x18,
|
||||
];
|
||||
|
||||
/// Intersection "Feldstraße/Glacischaussee"
|
||||
///
|
||||
/// Has a very complex geometry with multiple stop lines after each other.
|
||||
/// Main traffic direction is east-west, has separate bike lanes.
|
||||
///
|
||||
/// Possible start point (heading 90°): TODO
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_560: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x1, 0x61, 0x2b, 0x8, 0x0, 0x3, 0x9, 0x4d, 0x83, 0x42, 0xfc, 0x9a, 0x94, 0xef,
|
||||
0xb0, 0x6b, 0x7d, 0xab, 0x66, 0x17, 0xd8, 0xb3, 0x5c, 0xda, 0x0, 0x6, 0x4, 0x60, 0x18, 0x55,
|
||||
0x91, 0x1, 0x73, 0x71, 0x3b, 0xe2, 0xcb, 0x2, 0x58, 0x56, 0x48, 0x1c, 0x28, 0x44, 0x0, 0x0,
|
||||
0x32, 0xbb, 0xbd, 0x9a, 0x91, 0x0, 0x61, 0x90, 0x6e, 0x15, 0x40, 0x3c, 0x5c, 0xac, 0x39, 0x63,
|
||||
0x28, 0x8e, 0xcc, 0x98, 0x51, 0xe, 0x55, 0xe1, 0x2, 0xd0, 0x3d, 0xd2, 0xe, 0x4, 0xe8, 0x22,
|
||||
0xb0, 0xa2, 0x0, 0x1, 0x7, 0x58, 0x49, 0x0, 0x0, 0x84, 0x8, 0x5, 0x21, 0x11, 0x0, 0x0, 0x2,
|
||||
0x21, 0x1f, 0x51, 0xf0, 0x9e, 0xd9, 0x70, 0x12, 0xab, 0x42, 0xc4, 0x2, 0x50, 0x8c, 0x80, 0x0,
|
||||
0x1, 0x10, 0x5e, 0xa0, 0x20, 0x4f, 0x4c, 0xba, 0x9, 0x52, 0xa2, 0xe4, 0x81, 0x8, 0x84, 0x40,
|
||||
0x0, 0x2, 0xad, 0x36, 0xa3, 0x6c, 0x40, 0x1, 0x2, 0x93, 0x4b, 0x4, 0x38, 0xd7, 0x80, 0x2, 0x16,
|
||||
0x50, 0x1, 0xff, 0x2c, 0x0, 0x2f, 0xd6, 0x13, 0xb, 0x6f, 0x1, 0x60, 0x84, 0x0, 0x82, 0x2, 0x20,
|
||||
0x8, 0x64, 0x44, 0x0, 0x0, 0x9, 0x1b, 0x9, 0x2c, 0xd0, 0x4, 0xf0, 0x82, 0x25, 0x1c, 0x3f, 0xd2,
|
||||
0x40, 0xd1, 0x42, 0x20, 0x0, 0x1, 0xd7, 0xa0, 0xe6, 0xac, 0xa2, 0x0, 0xc3, 0x21, 0xc1, 0xfa,
|
||||
0xd8, 0x58, 0xf5, 0xb9, 0x2, 0xc1, 0x7d, 0x4e, 0xe, 0x68, 0xf1, 0x3, 0xa9, 0x26, 0x13, 0x81,
|
||||
0x8c, 0xef, 0x60, 0xdb, 0x75, 0xa0, 0xea, 0xdd, 0xa4, 0xb, 0x4, 0x80, 0x0, 0x20, 0x22, 0x40,
|
||||
0xb1, 0x42, 0x20, 0x0, 0x1, 0x97, 0xce, 0x86, 0x7c, 0x22, 0x0, 0xc3, 0x20, 0xcd, 0x78, 0x81,
|
||||
0x63, 0xde, 0xe5, 0xb, 0x8, 0xf5, 0x74, 0x39, 0xef, 0xd1, 0x8b, 0x2f, 0x7e, 0x90, 0x55, 0x57,
|
||||
0x82, 0x41, 0xca, 0x7d, 0xdc, 0x16, 0x22, 0x80, 0x0, 0x61, 0xc2, 0x2, 0x24, 0x44, 0x40, 0x0,
|
||||
0x0, 0xb3, 0x4b, 0x65, 0x8e, 0x81, 0x21, 0x90, 0xe0, 0x57, 0xc6, 0xb, 0xe9, 0xef, 0x24, 0xc,
|
||||
0x14, 0x22, 0x0, 0x0, 0x19, 0x7b, 0x78, 0x69, 0x4a, 0x20, 0xc, 0x32, 0x1b, 0x4b, 0x87, 0x85,
|
||||
0x8f, 0x7b, 0x92, 0x2c, 0x1d, 0xd5, 0x50, 0xe7, 0x2f, 0x2a, 0x2c, 0xbb, 0xfa, 0x11, 0x64, 0x6f,
|
||||
0x83, 0x2, 0x81, 0xb1, 0xc1, 0x62, 0x48, 0x0, 0x6, 0x1e, 0x20, 0x24, 0x44, 0x44, 0x0, 0x0, 0xb,
|
||||
0x34, 0xa5, 0x54, 0x3c, 0x12, 0x19, 0x7, 0xee, 0xf2, 0x2, 0x99, 0x7b, 0xc9, 0x1, 0x51, 0x8,
|
||||
0x80, 0x0, 0x7, 0x51, 0x5d, 0x86, 0x5a, 0x20, 0xc, 0x32, 0x0, 0x62, 0x8c, 0x11, 0xe2, 0x4c,
|
||||
0xd0, 0x42, 0x65, 0xb3, 0x9, 0x3a, 0xaa, 0xc1, 0xa, 0xb8, 0x18, 0x26, 0x2, 0xb0, 0x88, 0xc6,
|
||||
0x67, 0xb8, 0x23, 0x96, 0x95, 0x82, 0xc3, 0xd0, 0x0, 0x10, 0x24, 0x40, 0x3c, 0x48, 0x88, 0x0,
|
||||
0x0, 0x11, 0xfc, 0x8d, 0xab, 0xa0, 0xcd, 0x78, 0x81, 0x5f, 0x56, 0x9b, 0x12, 0x3, 0x22, 0x11,
|
||||
0x0, 0x0, 0x14, 0xb7, 0x45, 0x19, 0x21, 0x0, 0x4, 0x44, 0x19, 0x3b, 0xa2, 0x3b, 0x49, 0xa0,
|
||||
0x8, 0x40, 0xb7, 0x1, 0x26, 0x15, 0x6c, 0x47, 0x6f, 0x49, 0x42, 0x3d, 0xba, 0x89, 0x11, 0x52,
|
||||
0x56, 0x78, 0xce, 0xf9, 0x3c, 0xc1, 0xb, 0x1d, 0x3a, 0x88, 0x77, 0xa8, 0x3c, 0x44, 0xc5, 0x39,
|
||||
0x80, 0xb1, 0x18, 0x0, 0x5, 0xa, 0x24, 0x7, 0x44, 0x22, 0x0, 0x0, 0x29, 0x6d, 0xa7, 0x28, 0xda,
|
||||
0x0, 0x8, 0x89, 0xf6, 0x6a, 0x44, 0x71, 0x53, 0x50, 0x10, 0xc3, 0x6d, 0x82, 0x46, 0x2c, 0xa8,
|
||||
0x8e, 0xa2, 0x94, 0x84, 0x7a, 0x94, 0xca, 0x22, 0xbf, 0xae, 0x81, 0x9e, 0x3e, 0x78, 0x82, 0x17,
|
||||
0x2a, 0x6f, 0x10, 0xf2, 0xd0, 0x60, 0x89, 0x96, 0x72, 0xc1, 0x62, 0x50, 0x0, 0xa, 0x16, 0x48,
|
||||
0x6, 0x68, 0x44, 0x0, 0x0, 0x33, 0x24, 0x13, 0x3d, 0xf1, 0x10, 0x6, 0x19, 0x1, 0x56, 0x4a, 0x4,
|
||||
0x84, 0xc, 0x80, 0x99, 0x12, 0x30, 0x5, 0x81, 0x2c, 0x9, 0x6, 0x1, 0xc2, 0x15, 0xd0, 0xa5, 0x9,
|
||||
0x18, 0x0, 0x22, 0xb1, 0x22, 0x0, 0x6, 0x3, 0x58, 0x89, 0x0, 0x3, 0x2, 0x12, 0x0, 0x9a, 0x11,
|
||||
0x0, 0x0, 0xe, 0xc8, 0x3b, 0x8f, 0xac, 0x44, 0x1, 0x86, 0x42, 0x88, 0xf, 0xb0, 0x51, 0xa1,
|
||||
0xff, 0x9, 0x20, 0xc, 0x41, 0x26, 0x60, 0xd8, 0x28, 0x4c, 0x97, 0x5, 0x39, 0x1b, 0x91, 0x2d,
|
||||
0xc1, 0x75, 0x5, 0x30, 0x9c, 0x50, 0x58, 0x4a, 0x0, 0x3, 0x82, 0x92, 0x1, 0x1a, 0x11, 0x0, 0x0,
|
||||
0xc, 0xc8, 0x9b, 0x4f, 0x8f, 0x44, 0x1, 0x86, 0x42, 0x5f, 0x8a, 0x48, 0x3, 0xb0, 0x1c, 0x24,
|
||||
0xa8, 0x37, 0x88, 0xd9, 0xc5, 0xe4, 0x69, 0x7b, 0x38, 0x49, 0xf, 0x9b, 0x5, 0xdc, 0xac, 0xcd,
|
||||
0x2a, 0x16, 0x20, 0xb0, 0xf8, 0x0, 0x8, 0x6, 0x24, 0x10, 0x24, 0x12, 0x0, 0x0, 0x15, 0x9a,
|
||||
0x65, 0xaf, 0x56, 0x88, 0x3, 0xc, 0x83, 0xf2, 0x7b, 0x5, 0xb9, 0xe, 0xc6, 0x2e, 0x1, 0x6b,
|
||||
0xe1, 0x6c, 0xf3, 0x28, 0xb, 0x63, 0x56, 0xec, 0x5c, 0x8a, 0x98, 0x20, 0xb0, 0x98, 0x0, 0x9,
|
||||
0xc, 0x24, 0x2d, 0x44, 0x2, 0x10, 0x0, 0x0, 0x3a, 0xd9, 0xca, 0x42, 0xc4, 0x40, 0x16, 0x20,
|
||||
0x0, 0x34, 0xec, 0x3, 0xe, 0x65, 0x1, 0x15, 0x3e, 0x84, 0x3a, 0xd6, 0xe1, 0x3, 0x15, 0xb9,
|
||||
0x8c, 0xa6, 0x16, 0x3d, 0x0, 0xab, 0x7d, 0x80, 0x1, 0xc3, 0x81, 0x65, 0xd0, 0x0, 0xa, 0x1a,
|
||||
0x20, 0x5c, 0x44, 0x4, 0x20, 0x0, 0x0, 0x11, 0xe4, 0x58, 0x4a, 0x20, 0xfc, 0x9e, 0xc0, 0x66,
|
||||
0xaf, 0xa0, 0x20, 0x9b, 0x2, 0x4, 0x0, 0x0, 0x1, 0x7e, 0x98, 0x22, 0x8a, 0x0, 0x8, 0x1d, 0x6,
|
||||
0xa0, 0x4, 0x28, 0x2, 0x8, 0x28, 0xc0, 0x81, 0x0, 0x0, 0x0, 0x66, 0x20, 0x8c, 0x7b, 0x20, 0x0,
|
||||
0x82, 0x26, 0x97, 0x40, 0x42, 0x60, 0x40, 0x82, 0xac, 0x8, 0x10, 0x0, 0x0, 0x5, 0xb9, 0x28,
|
||||
0x6f, 0xe8, 0x0, 0x20, 0x71, 0x1b, 0x0, 0x10, 0xb0, 0x18, 0x20, 0xb3, 0x2, 0x4, 0x0, 0x0, 0x1,
|
||||
0x56, 0xc2, 0x4b, 0x68, 0x0, 0x20, 0x8f, 0x25, 0x0, 0x10, 0xa8, 0x20, 0x20, 0xbb, 0x2, 0x4,
|
||||
0x0, 0x0, 0x1, 0x7e, 0x63, 0x57, 0xea, 0x0, 0x8, 0x26, 0x37, 0xcc, 0x4, 0x30, 0xa, 0x8, 0x30,
|
||||
0xc0, 0x81, 0x0, 0x0, 0x0, 0x5e, 0x5, 0x57, 0xac, 0x80, 0x2, 0x6, 0x76, 0xd, 0x1, 0xb, 0x83,
|
||||
0x2, 0xc, 0xb0, 0x20, 0x40, 0x0, 0x0, 0x13, 0xeb, 0xc2, 0x9a, 0x0, 0x8, 0x22, 0x56, 0x8c, 0x4,
|
||||
0x34, 0xe, 0x8, 0x34, 0xc0, 0x81, 0x0, 0x0, 0x0, 0x4e, 0xf3, 0x45, 0x28, 0x0, 0x20, 0x76, 0xe5,
|
||||
0xd0, 0x10, 0xc8, 0x40, 0x20, 0xdb, 0x2, 0x4, 0x0, 0x0, 0x1, 0x6f, 0xd8, 0xd, 0x32, 0x0, 0x8,
|
||||
0x19, 0xd8, 0x34, 0x4, 0x38, 0x12, 0x8, 0x38, 0xc0, 0x81, 0x0, 0x0, 0x0, 0x5d, 0x90, 0xc1,
|
||||
0x90, 0x80, 0x2, 0x9, 0x8d, 0xf3, 0x1, 0xd, 0x85, 0x2, 0xf, 0xa0, 0x10, 0x80, 0x0, 0x0, 0x15,
|
||||
0xa2, 0x24, 0x2e, 0x80, 0x2, 0x8, 0xee, 0x50, 0x1, 0x10, 0x5, 0x80, 0x10, 0x10, 0x10, 0x80,
|
||||
0x0, 0x0, 0x17, 0x0, 0x81, 0x9d, 0xa0, 0x0, 0x81, 0xc8, 0x6b, 0x41, 0x8, 0x50, 0x8, 0x40, 0x0,
|
||||
0x0, 0xb, 0x8a, 0xd8, 0xd8, 0x50, 0x0, 0x40, 0xcf, 0x42, 0x0, 0x22, 0x20, 0xc0, 0x2, 0x22, 0x2,
|
||||
0x10, 0x0, 0x0, 0x2, 0xef, 0x9c, 0x24, 0xe4, 0x0, 0x10, 0x4c, 0x4f, 0x80, 0x21, 0x1a, 0x1, 0x8,
|
||||
0x0, 0x0, 0x1, 0x5a, 0xd2, 0xde, 0x48, 0x0, 0x20, 0x80, 0x26, 0x40, 0x11, 0x20, 0x68, 0x1,
|
||||
0x21, 0x1, 0x8, 0x0, 0x0, 0x1, 0x5a, 0xce, 0x9a, 0x68, 0x0, 0x20, 0x80, 0x19, 0xc0, 0x42, 0x54,
|
||||
0x2, 0x10, 0x0, 0x0, 0x2, 0xa4, 0x6c, 0xcc, 0x10, 0x0, 0x41, 0x2a, 0x39, 0x40, 0x22, 0x60,
|
||||
0xe0, 0x2, 0x62, 0x2, 0x10, 0x0, 0x0, 0x2, 0x47, 0x69, 0x47, 0x40, 0x1, 0x3, 0x49, 0x13, 0x2,
|
||||
0x13, 0xa0, 0x10, 0x80, 0x0, 0x0, 0x17, 0xe0, 0x4, 0x82, 0x20, 0x0, 0x82, 0x63, 0x7d, 0x0,
|
||||
0x45, 0x1, 0xe0, 0x5, 0x4, 0x4, 0x20, 0x0, 0x0, 0x5, 0x6c, 0xd8, 0xff, 0xa0, 0x0, 0x81, 0x9d,
|
||||
0x83, 0x1, 0xa, 0x58, 0x10, 0x20, 0x0, 0x0, 0xb, 0x60, 0x30, 0x70, 0x10, 0x0, 0x41, 0x31, 0x42,
|
||||
0x0, 0x22, 0xa1, 0x0, 0x42, 0xa6, 0x4, 0x8, 0x0, 0x0, 0x2, 0xd3, 0xa2, 0x16, 0x24, 0x0, 0x10,
|
||||
0x33, 0xcf, 0x80, 0x8, 0xa4, 0x44, 0x10, 0xad, 0x0, 0x84, 0x0, 0x0, 0x0, 0xbd, 0xe7, 0x8f,
|
||||
0xdd, 0x0, 0x4, 0xe, 0x8b, 0x50, 0x2, 0x2c, 0x12, 0x0, 0x2c, 0x20, 0x21, 0x0, 0x0, 0x0, 0x2f,
|
||||
0xe0, 0x89, 0xbb, 0x40, 0x1, 0x4, 0x71, 0x29, 0x80,
|
||||
];
|
||||
|
||||
/// Intersection "TODO"
|
||||
///
|
||||
/// 3 layers
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_2349_L31: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x12, 0x25, 0xf4, 0x18, 0x0, 0x3e, 0x6, 0xd, 0x91, 0x21, 0x93, 0x3b, 0x8c, 0x99,
|
||||
0xb4, 0x73, 0x71, 0x8b, 0x6, 0xe, 0x60, 0x0, 0x61, 0x25, 0xa1, 0x5, 0x58, 0xef, 0x69, 0x97,
|
||||
0x13, 0xed, 0x54, 0x20, 0x28, 0xa3, 0x68, 0x4, 0x49, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba,
|
||||
0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x99, 0x2, 0x4, 0x8, 0x0, 0x0, 0xab,
|
||||
0x72, 0xf, 0xe5, 0xc0, 0x7d, 0xa6, 0x34, 0x41, 0xf4, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd,
|
||||
0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xcd, 0x1, 0x2, 0x4, 0x0, 0x0,
|
||||
0x55, 0xb8, 0x57, 0xf1, 0x50, 0x3e, 0x73, 0x18, 0x28, 0x80, 0x3c, 0x51, 0x10, 0x6d, 0x38, 0xdd,
|
||||
0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32,
|
||||
0x40, 0x40, 0x81, 0x0, 0x0, 0x10, 0x8c, 0x36, 0xc6, 0x1, 0x31, 0xc1, 0xc0, 0xa1, 0xc0, 0x91,
|
||||
0x24, 0x1, 0xe4, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4,
|
||||
0x10, 0x79, 0x6d, 0x40, 0xcc, 0x81, 0x2, 0x4, 0x0, 0x0, 0x55, 0xaf, 0x28, 0x32, 0xd0, 0x3e,
|
||||
0x73, 0x1a, 0x0, 0xd2, 0x71, 0xba, 0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7,
|
||||
0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x64, 0x40, 0x81, 0x2, 0x0, 0x0, 0x20, 0x21, 0xcd, 0x23, 0x81,
|
||||
0x9c, 0x7e, 0x51, 0x7, 0x53, 0x8d, 0xd7, 0x97, 0x44, 0x9, 0xe3, 0x75, 0xe5, 0xd1, 0x3a, 0xd,
|
||||
0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3, 0x34, 0x4, 0x8, 0x10, 0x0, 0x1, 0x56, 0xd5, 0x20, 0xe, 0xc1,
|
||||
0x6, 0xb3, 0xa0, 0xa1, 0xe0, 0xe1, 0x34, 0x41, 0x94, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd,
|
||||
0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xc9, 0x1, 0x2, 0x4, 0x0, 0x0,
|
||||
0x40, 0xe9, 0x9a, 0x78, 0x4, 0xc9, 0x3, 0x82, 0x86, 0x83, 0x4, 0x50, 0x6, 0x13, 0x8d, 0xd7,
|
||||
0x97, 0x44, 0x9, 0xe3, 0x75, 0xe5, 0xd1, 0x3a, 0xd, 0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3, 0x22,
|
||||
0x2, 0x8, 0x10, 0x0, 0x1, 0x8, 0xf2, 0x70, 0xe4, 0x13, 0x1c, 0x22, 0x88, 0x2e, 0x9c, 0x6e,
|
||||
0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda, 0x82, 0xf, 0x2d, 0xa8, 0x19,
|
||||
0x20, 0x10, 0x40, 0x80, 0x0, 0x8, 0x2f, 0xb3, 0x77, 0x0, 0x67, 0x5e, 0xf0, 0x50, 0xc0, 0x58,
|
||||
0x82, 0x0, 0xb2, 0x71, 0xba, 0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7, 0x6a,
|
||||
0x8, 0x3c, 0xb6, 0xa0, 0x64, 0x40, 0x41, 0x2, 0x0, 0x0, 0x20, 0x73, 0x2d, 0xbe, 0x82, 0x64,
|
||||
0x81, 0x51, 0x5, 0x53, 0x8d, 0xd7, 0x97, 0x44, 0x9, 0xe3, 0x75, 0xe5, 0xd1, 0x3a, 0xd, 0x3b,
|
||||
0x50, 0x41, 0xe5, 0xb5, 0x3, 0x24, 0x2, 0x8, 0x10, 0x0, 0x1, 0x0, 0x69, 0x6d, 0x60, 0xc, 0xe3,
|
||||
0xf6, 0xa, 0x16, 0xa, 0xf, 0x40, 0x14, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97,
|
||||
0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0x88, 0x10, 0x20, 0x40, 0x0, 0x4, 0xe,
|
||||
0xb5, 0xa7, 0x50, 0x4c, 0x90, 0x2b, 0x20, 0xa, 0xd1, 0xb0, 0xe8, 0xe5, 0xcf, 0xa7, 0x2c, 0xba,
|
||||
0x73, 0x65, 0xdc, 0x81, 0x8a, 0xd, 0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3, 0x11, 0x40, 0x20, 0x0,
|
||||
0x2, 0x88, 0x69, 0x7c, 0x9a, 0x43, 0xec, 0xa4, 0x90, 0x1, 0x0, 0xc0, 0x0, 0xd1, 0xe3, 0x90,
|
||||
0x68, 0xf2, 0x0, 0x34, 0x59, 0x18, 0x1a, 0x1c, 0x98, 0x8, 0x2, 0x0, 0x16, 0x86, 0xc9, 0xe0,
|
||||
0x31, 0x99, 0x20, 0x18, 0xbc, 0x9e, 0x9c, 0x5b, 0x29, 0x10, 0x1, 0x41, 0x61, 0x90, 0x0, 0x2,
|
||||
0x2, 0x80, 0x20, 0x9c, 0x6e, 0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda,
|
||||
0x82, 0xf, 0x2d, 0xa8, 0x19, 0x90, 0x20, 0x40, 0x80, 0x0, 0xa, 0xb6, 0xbd, 0x0, 0x6c, 0x8,
|
||||
0x35, 0x9d, 0x50, 0xc, 0x5a, 0x36, 0x1d, 0x1c, 0xb9, 0xf4, 0xe5, 0x97, 0x4e, 0x6c, 0xbb, 0x90,
|
||||
0x34, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x66, 0x64, 0x4, 0x0, 0x0, 0x9, 0x55, 0x73,
|
||||
0x60, 0x6b, 0xc2, 0x13, 0x5c, 0x90, 0x86, 0xc9, 0xce, 0x59, 0x0, 0x96, 0x8d, 0x87, 0x47, 0x2e,
|
||||
0x7d, 0x39, 0x65, 0xd3, 0x9b, 0x2e, 0xe4, 0xc, 0x90, 0x69, 0xda, 0x82, 0xf, 0x2d, 0xa8, 0x18,
|
||||
0x8a, 0x10, 0x0, 0x0, 0xe, 0x43, 0x56, 0xe3, 0x87, 0x1f, 0xbb, 0xe5, 0x46, 0x1c, 0x3, 0x18,
|
||||
0x41, 0xff, 0x4d, 0xe0, 0x80, 0x20, 0x0, 0xff, 0xa9, 0xd8, 0xd, 0x6e, 0x53, 0x6, 0xb3, 0x2d,
|
||||
0xa7, 0x58, 0xcb, 0xa4, 0x0, 0x50, 0x58, 0x5c, 0x0, 0x0, 0x81, 0x20, 0x9, 0x27, 0x1b, 0xaf,
|
||||
0x2e, 0x88, 0x13, 0xc6, 0xeb, 0xcb, 0xa2, 0x74, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a, 0x6, 0x44,
|
||||
0x8, 0x10, 0x20, 0x0, 0x2, 0x11, 0x7e, 0xd9, 0x90, 0x26, 0x38, 0x31, 0x0, 0x81, 0x38, 0xdd,
|
||||
0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x33,
|
||||
0x20, 0x40, 0x81, 0x0, 0x0, 0x15, 0x6f, 0x79, 0xf1, 0x88, 0x10, 0x6b, 0x3a, 0x80, 0x38, 0x9c,
|
||||
0x6e, 0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda, 0x82, 0xf, 0x2d, 0xa8,
|
||||
0x19, 0x10, 0x20, 0x40, 0x80, 0x0, 0x8, 0x31, 0x1b, 0x57, 0x40, 0x67, 0x5f, 0x25, 0x0, 0xb5,
|
||||
0xa3, 0x61, 0xd1, 0xcb, 0x9f, 0x4e, 0x59, 0x74, 0xe6, 0xcb, 0xb9, 0x3, 0x34, 0x1a, 0x76, 0xa0,
|
||||
0x83, 0xcb, 0x6a, 0x6, 0x66, 0x44, 0x0, 0x0, 0x0, 0x95, 0x57, 0xe2, 0x0, 0xfc, 0x46, 0x24,
|
||||
0xec, 0x62, 0x2e, 0xc7, 0x57, 0x44, 0x21, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97,
|
||||
0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0xd0, 0x10, 0x20, 0x40, 0x0, 0x5, 0x5b,
|
||||
0xd9, 0x7c, 0x72, 0x4, 0x14, 0xce, 0x82, 0x88, 0x83, 0x45, 0x54, 0x2, 0x16, 0x8d, 0x87, 0x47,
|
||||
0x2e, 0x7d, 0x39, 0x65, 0xd3, 0x9b, 0x2e, 0xe4, 0xc, 0xd0, 0x69, 0xda, 0x82, 0xf, 0x2d, 0xa8,
|
||||
0x19, 0x11, 0x10, 0x0, 0x0, 0x2, 0x40, 0xab, 0x99, 0x11, 0xc, 0x3d, 0x3b, 0x22, 0x87, 0x13,
|
||||
0xc5, 0x44, 0xd, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed,
|
||||
0x41, 0x7, 0x96, 0xd4, 0xc, 0x58, 0x10, 0x20, 0x40, 0x0, 0x4, 0x2e, 0x8a, 0x53, 0x20, 0x3e,
|
||||
0xb3, 0x18, 0x28, 0x38, 0x14, 0x29, 0x10, 0x39, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e,
|
||||
0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x31, 0x60, 0x40, 0x81, 0x0, 0x0, 0x10,
|
||||
0xc6, 0x17, 0xad, 0x41, 0x5, 0xb3, 0xa0, 0xa0, 0xd0, 0x50, 0xb4, 0x40, 0xf4, 0xe3, 0x75, 0xe5,
|
||||
0xd1, 0x2, 0x78, 0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xcd, 0x1,
|
||||
0x2, 0x4, 0x0, 0x0, 0x55, 0xaf, 0xc8, 0x33, 0x20, 0x3e, 0x73, 0x18, 0x28, 0x40, 0x34, 0x31,
|
||||
0x90, 0xd, 0x68, 0xd8, 0x74, 0x72, 0xe7, 0xd3, 0x96, 0x5d, 0x39, 0xb2, 0xee, 0x40, 0xcd, 0x6,
|
||||
0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x88, 0xa1, 0x0, 0x0, 0x2, 0x44, 0x36, 0x2e, 0x23, 0x61,
|
||||
0x79, 0xf4, 0x9a, 0x83, 0xcf, 0x94, 0x1, 0xe7, 0x4a, 0xc0, 0xf3, 0x65, 0xc0, 0x79, 0x73, 0x10,
|
||||
0xf5, 0xf5, 0x26, 0x64, 0x46, 0x30, 0x58, 0x23, 0x6, 0x9, 0x32, 0x18, 0x4, 0x8b, 0x13, 0x82,
|
||||
0x3b, 0x8d, 0x1, 0x18, 0x48, 0x0, 0x96, 0x69, 0x30, 0x40, 0x10, 0x0, 0x23, 0x9, 0x0, 0x11,
|
||||
0xdc, 0x6a, 0x9, 0x12, 0x2a, 0x4, 0x97, 0xe, 0x2, 0x0, 0x80, 0x51, 0x18, 0x41, 0xa8, 0x0, 0xa0,
|
||||
0xb0, 0x84, 0x0, 0x2, 0x3, 0x44, 0x11, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97,
|
||||
0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0x90, 0x10, 0x20, 0x40, 0x0, 0x4, 0x18,
|
||||
0x69, 0xad, 0xe0, 0x33, 0xaf, 0xa0, 0x28, 0x48, 0x20, 0x35, 0x10, 0x4d, 0x38, 0xdd, 0x79, 0x74,
|
||||
0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32, 0x40, 0x40,
|
||||
0x81, 0x0, 0x0, 0x10, 0x10, 0xa6, 0x95, 0x80, 0xce, 0x3f, 0x60, 0xa1, 0x40, 0x90, 0xe0,
|
||||
];
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_2349_L32: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x12, 0x25, 0xf4, 0x18, 0x0, 0x40, 0x6, 0xd, 0x91, 0x21, 0x93, 0x3b, 0x8c, 0x99,
|
||||
0xb4, 0x73, 0x71, 0x8b, 0x6, 0xe, 0x60, 0x0, 0x61, 0x25, 0xa1, 0x5, 0x58, 0xef, 0x69, 0x97,
|
||||
0x13, 0xed, 0x54, 0x20, 0x28, 0xa3, 0x48, 0x84, 0x29, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba,
|
||||
0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x9a, 0x2, 0x4, 0x8, 0x0, 0x0, 0xab,
|
||||
0x7b, 0x2f, 0x8e, 0x40, 0x82, 0x99, 0xd0, 0x51, 0x10, 0x68, 0xaa, 0x0, 0xf2, 0x71, 0xba, 0xf2,
|
||||
0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x66, 0x40,
|
||||
0x81, 0x2, 0x0, 0x0, 0x2a, 0xd7, 0x94, 0x19, 0x68, 0x1f, 0x39, 0x8d, 0x0, 0x71, 0x38, 0xdd,
|
||||
0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32,
|
||||
0x20, 0x40, 0x81, 0x0, 0x0, 0x10, 0x62, 0x36, 0xae, 0x80, 0xce, 0xbe, 0x48, 0x3, 0x49, 0xc6,
|
||||
0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81,
|
||||
0x91, 0x2, 0x4, 0x8, 0x0, 0x0, 0x80, 0x87, 0x34, 0x8e, 0x6, 0x71, 0xf9, 0x44, 0x19, 0x4e, 0x37,
|
||||
0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4, 0xc,
|
||||
0x90, 0x10, 0x20, 0x40, 0x0, 0x4, 0xe, 0x99, 0xa7, 0x80, 0x4c, 0x90, 0x38, 0x28, 0x68, 0x30,
|
||||
0x45, 0x0, 0x61, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5,
|
||||
0x4, 0x1e, 0x5b, 0x50, 0x32, 0x20, 0x20, 0x81, 0x0, 0x0, 0x10, 0x8f, 0x27, 0xe, 0x41, 0x31,
|
||||
0xc2, 0x28, 0x82, 0xe9, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d,
|
||||
0xa8, 0x20, 0xf2, 0xda, 0x81, 0x92, 0x1, 0x4, 0x8, 0x0, 0x0, 0x82, 0xfb, 0x37, 0x70, 0x6, 0x75,
|
||||
0xef, 0x5, 0xc, 0x5, 0x88, 0x20, 0xb, 0x27, 0x1b, 0xaf, 0x2e, 0x88, 0x13, 0xc6, 0xeb, 0xcb,
|
||||
0xa2, 0x74, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a, 0x6, 0x44, 0x4, 0x10, 0x20, 0x0, 0x2, 0x7,
|
||||
0x32, 0xdb, 0xe8, 0x26, 0x48, 0x15, 0x10, 0x55, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e,
|
||||
0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32, 0x40, 0x20, 0x81, 0x0, 0x0, 0x10,
|
||||
0x6, 0x96, 0xd6, 0x0, 0xce, 0x3f, 0x60, 0xa1, 0x60, 0xa0, 0xf5, 0x0, 0xb5, 0xa3, 0x61, 0xd1,
|
||||
0xcb, 0x9f, 0x4e, 0x59, 0x74, 0xe6, 0xcb, 0xb9, 0x3, 0x34, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a,
|
||||
0x6, 0x66, 0x44, 0x0, 0x0, 0x0, 0x95, 0x57, 0xe2, 0x0, 0xfc, 0x46, 0x24, 0xec, 0x62, 0x2e,
|
||||
0xc7, 0x57, 0x40, 0x12, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34,
|
||||
0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0x88, 0x10, 0x20, 0x40, 0x0, 0x4, 0x22, 0xfd, 0xb3, 0x20,
|
||||
0x4c, 0x70, 0x62, 0x20, 0xea, 0x71, 0xba, 0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41,
|
||||
0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x66, 0x80, 0x81, 0x2, 0x0, 0x0, 0x2a, 0xda, 0xa4, 0x1,
|
||||
0xd8, 0x20, 0xd6, 0x74, 0x14, 0x3c, 0x1c, 0x26, 0xa0, 0xa, 0xb4, 0x6c, 0x3a, 0x39, 0x73, 0xe9,
|
||||
0xcb, 0x2e, 0x9c, 0xd9, 0x77, 0x20, 0x6a, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xc4, 0x48,
|
||||
0x80, 0x0, 0x0, 0x11, 0x81, 0x6e, 0x2, 0x81, 0xcc, 0x71, 0x88, 0x5c, 0x25, 0x20, 0x4c, 0x80,
|
||||
0xeb, 0x46, 0xc3, 0xa3, 0x97, 0x3e, 0x9c, 0xb2, 0xe9, 0xcd, 0x97, 0x72, 0x6, 0x28, 0x34, 0xed,
|
||||
0x41, 0x7, 0x96, 0xd4, 0xc, 0x89, 0x8, 0x0, 0x0, 0xf, 0x21, 0x6, 0xc, 0xfb, 0xa, 0x3e, 0x44,
|
||||
0xf0, 0x10, 0xc, 0x0, 0x18, 0xb2, 0x5d, 0x83, 0x13, 0xcb, 0xa8, 0xa2, 0x58, 0xba, 0x11, 0x16,
|
||||
0x8e, 0xa0, 0x8c, 0x18, 0x20, 0x7, 0xfc, 0x10, 0x5a, 0x76, 0x7, 0xd1, 0x3b, 0xb, 0xa1, 0x1b,
|
||||
0x40, 0x80, 0x20, 0x0, 0x3f, 0xc, 0xe8, 0x1f, 0xe6, 0x78, 0x10, 0x23, 0x3a, 0x8, 0x25, 0x9e,
|
||||
0x44, 0x6a, 0x3b, 0x20, 0x2, 0x8a, 0xc1, 0x48, 0x0, 0x10, 0x1d, 0x60, 0x84, 0x0, 0x8, 0x10,
|
||||
0x80, 0x44, 0x9c, 0x6e, 0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda, 0x82,
|
||||
0xf, 0x2d, 0xa8, 0x19, 0x90, 0x20, 0x40, 0x80, 0x0, 0xa, 0xb7, 0x20, 0xfe, 0x5c, 0x7, 0xda,
|
||||
0x63, 0x44, 0x11, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed,
|
||||
0x41, 0x7, 0x96, 0xd4, 0xc, 0x90, 0x10, 0x20, 0x40, 0x0, 0x4, 0x18, 0x69, 0xad, 0xe0, 0x33,
|
||||
0xaf, 0xa0, 0x28, 0x48, 0x20, 0x35, 0x10, 0x6d, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e,
|
||||
0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32, 0x40, 0x40, 0x81, 0x0, 0x0, 0x10,
|
||||
0x8c, 0x36, 0xc6, 0x1, 0x31, 0xc1, 0xc0, 0xa1, 0xc0, 0x91, 0x25, 0x0, 0x45, 0xa3, 0x61, 0xd1,
|
||||
0xcb, 0x9f, 0x4e, 0x59, 0x74, 0xe6, 0xcb, 0xb9, 0x3, 0x44, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a,
|
||||
0x6, 0x22, 0x44, 0x0, 0x0, 0x0, 0x8c, 0x3, 0xf1, 0x64, 0xf, 0xed, 0x92, 0xe2, 0xc5, 0xf8, 0xba,
|
||||
0x64, 0x6, 0x5a, 0x36, 0x1d, 0x1c, 0xb9, 0xf4, 0xe5, 0x97, 0x4e, 0x6c, 0xbb, 0x90, 0x32, 0x41,
|
||||
0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x64, 0x48, 0x40, 0x0, 0x0, 0x29, 0x6, 0xee, 0x66, 0xf4,
|
||||
0x91, 0x7b, 0x93, 0xc8, 0x8, 0x6, 0x0, 0x4c, 0x7f, 0x2, 0x68, 0x0, 0xa1, 0x8e, 0x0, 0x44, 0x51,
|
||||
0xa4, 0x3, 0xe5, 0x88, 0x34, 0x38, 0x3, 0x5, 0x85, 0xa0, 0x0, 0x38, 0x4a, 0x20, 0x6a, 0x71,
|
||||
0xba, 0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0,
|
||||
0x62, 0xc0, 0x81, 0x2, 0x0, 0x0, 0x21, 0x74, 0x52, 0x99, 0x1, 0xf5, 0x98, 0xc1, 0x41, 0xc0,
|
||||
0xa1, 0x48, 0x2, 0x89, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d,
|
||||
0xa8, 0x20, 0xf2, 0xda, 0x81, 0x91, 0x2, 0x4, 0x8, 0x0, 0x0, 0x81, 0xd6, 0xb4, 0xea, 0x9, 0x92,
|
||||
0x5, 0x44, 0x1f, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed,
|
||||
0x41, 0x7, 0x96, 0xd4, 0xc, 0xd0, 0x10, 0x20, 0x40, 0x0, 0x5, 0x5b, 0x85, 0x7f, 0x15, 0x3,
|
||||
0xe7, 0x31, 0x82, 0x88, 0x3, 0xc5, 0x11, 0x3, 0x93, 0x8d, 0xd7, 0x97, 0x44, 0x9, 0xe3, 0x75,
|
||||
0xe5, 0xd1, 0x3a, 0xd, 0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3, 0x16, 0x4, 0x8, 0x10, 0x0, 0x1, 0xc,
|
||||
0x61, 0x7a, 0xd4, 0x10, 0x5b, 0x3a, 0xa, 0xd, 0x5, 0xb, 0x40, 0x20, 0x4e, 0x37, 0x5e, 0x5d,
|
||||
0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0xc8, 0x10,
|
||||
0x20, 0x40, 0x0, 0x5, 0x5b, 0xde, 0x7c, 0x62, 0x4, 0x1a, 0xce, 0xa2, 0x7, 0xa7, 0x1b, 0xaf,
|
||||
0x2e, 0x88, 0x13, 0xc6, 0xeb, 0xcb, 0xa2, 0x74, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a, 0x6, 0x68,
|
||||
0x8, 0x10, 0x20, 0x0, 0x2, 0xad, 0x7e, 0x41, 0x99, 0x1, 0xf3, 0x98, 0xc1, 0x42, 0x1, 0xa1,
|
||||
0x88, 0x2, 0x9, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8,
|
||||
0x20, 0xf2, 0xda, 0x81, 0x99, 0x2, 0x4, 0x8, 0x0, 0x0, 0xab, 0x6b, 0xd0, 0x6, 0xc0, 0x83, 0x59,
|
||||
0xd4, 0x41, 0x34, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4,
|
||||
0x10, 0x79, 0x6d, 0x40, 0xc9, 0x1, 0x2, 0x4, 0x0, 0x0, 0x40, 0x42, 0x9a, 0x56, 0x3, 0x38, 0xfd,
|
||||
0x82, 0x85, 0x2, 0x43, 0x80,
|
||||
];
|
||||
#[cfg(feature = "spat")]
|
||||
pub const MAPEM_HH_2349_L33: &[u8] = &[
|
||||
0x2, 0x5, 0x0, 0x12, 0x25, 0xf4, 0x18, 0x0, 0x42, 0x6, 0xd, 0x91, 0x21, 0x93, 0x3b, 0x8c, 0x99,
|
||||
0xb4, 0x73, 0x71, 0x8b, 0x6, 0xe, 0x60, 0x0, 0x61, 0x25, 0xa1, 0x5, 0x58, 0xef, 0x69, 0x97,
|
||||
0x13, 0xed, 0x54, 0x20, 0x28, 0xa3, 0x48, 0x84, 0x29, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba,
|
||||
0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x9a, 0x2, 0x4, 0x8, 0x0, 0x0, 0xab,
|
||||
0x7b, 0x2f, 0x8e, 0x40, 0x82, 0x99, 0xd0, 0x51, 0x10, 0x68, 0xaa, 0x0, 0xf2, 0x71, 0xba, 0xf2,
|
||||
0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x66, 0x40,
|
||||
0x81, 0x2, 0x0, 0x0, 0x2a, 0xd7, 0x94, 0x19, 0x68, 0x1f, 0x39, 0x8d, 0x10, 0x75, 0x38, 0xdd,
|
||||
0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x33,
|
||||
0x40, 0x40, 0x81, 0x0, 0x0, 0x15, 0x6d, 0x52, 0x0, 0xec, 0x10, 0x6b, 0x3a, 0xa, 0x1e, 0xe,
|
||||
0x13, 0x44, 0x1b, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed,
|
||||
0x41, 0x7, 0x96, 0xd4, 0xc, 0x90, 0x10, 0x20, 0x40, 0x0, 0x4, 0x23, 0xd, 0xb1, 0x80, 0x4c,
|
||||
0x70, 0x70, 0x28, 0x70, 0x24, 0x49, 0x0, 0x69, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37, 0x5e,
|
||||
0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32, 0x20, 0x40, 0x81, 0x0, 0x0, 0x10,
|
||||
0x10, 0xe6, 0x91, 0xc0, 0xce, 0x3f, 0x28, 0x83, 0x29, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba,
|
||||
0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x92, 0x2, 0x4, 0x8, 0x0, 0x0, 0x81,
|
||||
0xd3, 0x34, 0xf0, 0x9, 0x92, 0x7, 0x5, 0xd, 0x6, 0x8, 0xa2, 0xb, 0xa7, 0x1b, 0xaf, 0x2e, 0x88,
|
||||
0x13, 0xc6, 0xeb, 0xcb, 0xa2, 0x74, 0x1a, 0x76, 0xa0, 0x83, 0xcb, 0x6a, 0x6, 0x48, 0x4, 0x10,
|
||||
0x20, 0x0, 0x2, 0xb, 0xec, 0xdd, 0xc0, 0x19, 0xd7, 0xbc, 0x14, 0x30, 0x16, 0x20, 0x80, 0x2c,
|
||||
0x9c, 0x6e, 0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda, 0x82, 0xf, 0x2d,
|
||||
0xa8, 0x19, 0x10, 0x10, 0x40, 0x80, 0x0, 0x8, 0x1c, 0xcb, 0x6f, 0xa0, 0x99, 0x20, 0x54, 0x41,
|
||||
0x54, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4, 0x10, 0x79,
|
||||
0x6d, 0x40, 0xc9, 0x0, 0x82, 0x4, 0x0, 0x0, 0x40, 0x1a, 0x5b, 0x58, 0x3, 0x38, 0xfd, 0x82,
|
||||
0x85, 0x82, 0x83, 0xd0, 0x7, 0x13, 0x8d, 0xd7, 0x97, 0x44, 0x9, 0xe3, 0x75, 0xe5, 0xd1, 0x3a,
|
||||
0xd, 0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3, 0x22, 0x4, 0x8, 0x10, 0x0, 0x1, 0x6, 0x23, 0x6a, 0xe8,
|
||||
0xc, 0xeb, 0xe4, 0xc8, 0x12, 0xb4, 0x6c, 0x3a, 0x39, 0x73, 0xe9, 0xcb, 0x2e, 0x9c, 0xd9, 0x77,
|
||||
0x20, 0x64, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xcc, 0xd0, 0x80, 0x0, 0x0, 0x12, 0xad,
|
||||
0x1e, 0x3f, 0x1c, 0x4, 0xed, 0x3b, 0xc2, 0xa7, 0xc3, 0x3c, 0xe1, 0x82, 0xc1, 0x20, 0x0, 0xc,
|
||||
0x11, 0x40, 0x21, 0x68, 0xd8, 0x74, 0x72, 0xe7, 0xd3, 0x96, 0x5d, 0x39, 0xb2, 0xee, 0x40, 0xcd,
|
||||
0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x91, 0x11, 0x0, 0x0, 0x0, 0x24, 0xa, 0xb9, 0x91,
|
||||
0x10, 0xc3, 0xd3, 0xb2, 0x28, 0x71, 0x3c, 0x54, 0x41, 0x34, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78,
|
||||
0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e, 0xd4, 0x10, 0x79, 0x6d, 0x40, 0xc9, 0x1, 0x2, 0x4, 0x0,
|
||||
0x0, 0x40, 0x42, 0x9a, 0x56, 0x3, 0x38, 0xfd, 0x82, 0x85, 0x2, 0x43, 0x90, 0x6, 0x13, 0x8d,
|
||||
0xd7, 0x97, 0x44, 0x9, 0xe3, 0x75, 0xe5, 0xd1, 0x3a, 0xd, 0x3b, 0x50, 0x41, 0xe5, 0xb5, 0x3,
|
||||
0x22, 0x2, 0x8, 0x10, 0x0, 0x1, 0x8, 0xf2, 0x70, 0xe4, 0x13, 0x1c, 0x22, 0xa0, 0x8, 0xb4, 0x6c,
|
||||
0x3a, 0x39, 0x73, 0xe9, 0xcb, 0x2e, 0x9c, 0xd9, 0x77, 0x20, 0x68, 0x83, 0x4e, 0xd4, 0x10, 0x79,
|
||||
0x6d, 0x40, 0xc4, 0x48, 0x80, 0x0, 0x0, 0x11, 0x80, 0x7e, 0x2c, 0x81, 0xfd, 0xb2, 0x5c, 0x58,
|
||||
0xbf, 0x17, 0x48, 0x2, 0x49, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6,
|
||||
0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x91, 0x2, 0x4, 0x8, 0x0, 0x0, 0x84, 0x5f, 0xb6, 0x64, 0x9,
|
||||
0x8e, 0xc, 0x44, 0xd, 0x4e, 0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34,
|
||||
0xed, 0x41, 0x7, 0x96, 0xd4, 0xc, 0x58, 0x10, 0x20, 0x40, 0x0, 0x4, 0x2e, 0x8a, 0x53, 0x20,
|
||||
0x3e, 0xb3, 0x18, 0x28, 0x38, 0x14, 0x29, 0x0, 0x51, 0x38, 0xdd, 0x79, 0x74, 0x40, 0x9e, 0x37,
|
||||
0x5e, 0x5d, 0x13, 0xa0, 0xd3, 0xb5, 0x4, 0x1e, 0x5b, 0x50, 0x32, 0x20, 0x40, 0x81, 0x0, 0x0,
|
||||
0x10, 0x3a, 0xd6, 0x9d, 0x41, 0x32, 0x40, 0xa8, 0x83, 0xe9, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1,
|
||||
0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x9a, 0x2, 0x4, 0x8, 0x0, 0x0,
|
||||
0xab, 0x70, 0xaf, 0xe2, 0xa0, 0x7c, 0xe6, 0x30, 0x51, 0x0, 0x78, 0xa2, 0x20, 0x72, 0x71, 0xba,
|
||||
0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba, 0x27, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x62,
|
||||
0xc0, 0x81, 0x2, 0x0, 0x0, 0x21, 0x8c, 0x2f, 0x5a, 0x82, 0xb, 0x67, 0x41, 0x41, 0xa0, 0xa1,
|
||||
0x68, 0x4, 0x9, 0xc6, 0xeb, 0xcb, 0xa2, 0x4, 0xf1, 0xba, 0xf2, 0xe8, 0x9d, 0x6, 0x9d, 0xa8,
|
||||
0x20, 0xf2, 0xda, 0x81, 0x99, 0x2, 0x4, 0x8, 0x0, 0x0, 0xab, 0x7b, 0xcf, 0x8c, 0x40, 0x83,
|
||||
0x59, 0xd4, 0x40, 0xf4, 0xe3, 0x75, 0xe5, 0xd1, 0x2, 0x78, 0xdd, 0x79, 0x74, 0x4e, 0x83, 0x4e,
|
||||
0xd4, 0x10, 0x79, 0x6d, 0x40, 0xcd, 0x1, 0x2, 0x4, 0x0, 0x0, 0x55, 0xaf, 0xc8, 0x33, 0x20,
|
||||
0x3e, 0x73, 0x18, 0x28, 0x40, 0x34, 0x31, 0x90, 0x29, 0x68, 0xd8, 0x74, 0x72, 0xe7, 0xd3, 0x96,
|
||||
0x5d, 0x39, 0xb2, 0xee, 0x40, 0xc5, 0x6, 0x9d, 0xa8, 0x20, 0xf2, 0xda, 0x81, 0x99, 0xa1, 0x0,
|
||||
0x0, 0x0, 0x45, 0x5a, 0x6e, 0x7c, 0xf8, 0x9, 0xda, 0x77, 0x80, 0x80, 0x60, 0x2, 0xa7, 0xbf,
|
||||
0xbc, 0xf1, 0xa, 0xc1, 0x60, 0x0, 0xc, 0x15, 0x61, 0x4, 0x0, 0xc, 0xc, 0x80, 0x20, 0x9c, 0x6e,
|
||||
0xbc, 0xba, 0x20, 0x4f, 0x1b, 0xaf, 0x2e, 0x89, 0xd0, 0x69, 0xda, 0x82, 0xf, 0x2d, 0xa8, 0x19,
|
||||
0x90, 0x20, 0x40, 0x80, 0x0, 0xa, 0xb6, 0xbd, 0x0, 0x6c, 0x8, 0x35, 0x9d, 0x40, 0x22, 0x4e,
|
||||
0x37, 0x5e, 0x5d, 0x10, 0x27, 0x8d, 0xd7, 0x97, 0x44, 0xe8, 0x34, 0xed, 0x41, 0x7, 0x96, 0xd4,
|
||||
0xc, 0xc8, 0x10, 0x20, 0x40, 0x0, 0x5, 0x5b, 0x90, 0x7f, 0x2e, 0x3, 0xed, 0x31, 0xa8, 0x2,
|
||||
0xad, 0x1b, 0xe, 0x8e, 0x5c, 0xfa, 0x72, 0xcb, 0xa7, 0x36, 0x5d, 0xc8, 0x1a, 0xa0, 0xd3, 0xb5,
|
||||
0x4, 0x1e, 0x5b, 0x50, 0x31, 0x12, 0x20, 0x0, 0x0, 0x4, 0x60, 0x5b, 0x80, 0xa0, 0x73, 0x1c,
|
||||
0x62, 0x17, 0x9, 0x48, 0x12, 0x20, 0x8a, 0x71, 0xba, 0xf2, 0xe8, 0x81, 0x3c, 0x6e, 0xbc, 0xba,
|
||||
0x27, 0x41, 0xa7, 0x6a, 0x8, 0x3c, 0xb6, 0xa0, 0x64, 0x80, 0x81, 0x2, 0x0, 0x0, 0x20, 0xc3,
|
||||
0x4d, 0x6f, 0x1, 0x9d, 0x7d, 0x1, 0x42, 0x41, 0x1, 0xa0,
|
||||
];
|
||||
|
||||
// More data:
|
||||
// - 34 (Neuer Pferdemarkt/Neuer Kamp): 2 layers, quite complex bike crossings
|
||||
|
||||
/// Just some random SPATEM
|
||||
#[cfg(feature = "spat")]
|
||||
pub const SPATEM: &[u8] = &[
|
||||
0x02, 0x04, 0x00, 0x00, 0x30, 0x16, 0x00, 0x38, 0x4a, 0x6c, 0x1a, 0x17, 0xe4, 0xd4, 0xa7, 0x7d,
|
||||
0x93, 0x5b, 0x8c, 0x9a, 0xb0, 0x63, 0x71, 0x92, 0xe6, 0x50, 0x00, 0x30, 0x9c, 0x50, 0x40, 0x00,
|
||||
0x0e, 0xa7, 0x1d, 0x4f, 0xf0, 0x10, 0x00, 0x22, 0x8c, 0xe2, 0xf9, 0x44, 0xff, 0x63, 0x5b, 0x63,
|
||||
0x48, 0x71, 0xad, 0xb1, 0xae, 0xa1, 0xae, 0xa7, 0x80, 0x10, 0xa1, 0xb8, 0xbe, 0x29, 0x40, 0xa0,
|
||||
0xd6, 0xd8, 0xd1, 0x5c, 0x6b, 0x6c, 0x6c, 0x0c, 0x6c, 0x0d, 0xe0, 0x06, 0x28, 0x0e, 0x2d, 0xfa,
|
||||
0x68, 0xf6, 0x35, 0xb6, 0x34, 0x57, 0x1a, 0xdb, 0x1b, 0x03, 0x1b, 0x03, 0x78, 0x02, 0x0a, 0x1b,
|
||||
0x8d, 0x8b, 0x8d, 0xc0, 0x0d, 0xa7, 0x0d, 0x11, 0xc6, 0xd3, 0x86, 0xd4, 0xc6, 0xd4, 0xde, 0x00,
|
||||
0xa2, 0x8a, 0xe3, 0x5f, 0x23, 0x6c, 0x43, 0x66, 0x03, 0x43, 0x71, 0xb3, 0x01, 0xbb, 0x71, 0xba,
|
||||
0xd1, 0x80, 0x30, 0xa0, 0x38, 0xaf, 0x79, 0x86, 0x50, 0xd6, 0xd8, 0xd1, 0x5c, 0x6b, 0x6c, 0x6c,
|
||||
0x0c, 0x6c, 0x0c, 0x60, 0x0e, 0x28, 0xce, 0x35, 0xfc, 0x36, 0xce, 0x36, 0x6a, 0x34, 0x87, 0x1b,
|
||||
0x35, 0x1b, 0x44, 0x1b, 0x44, 0x78, 0x04, 0x0a, 0x1b, 0x8d, 0x8b, 0x8d, 0xc0, 0x0d, 0xa7, 0x0d,
|
||||
0x15, 0xc6, 0xd3, 0x86, 0xe3, 0xc6, 0xe1, 0x46, 0x01, 0x22, 0x80, 0xe2, 0xdf, 0xa5, 0xcd, 0x03,
|
||||
0x5b, 0x63, 0x45, 0x71, 0xad, 0xb1, 0xb1, 0xc1, 0xb0, 0xd1, 0x80,
|
||||
];
|
||||
|
||||
/// Some random CAM
|
||||
#[cfg(feature = "cam")]
|
||||
pub const CAM: &[u8] = &[
|
||||
0x02, 0x02, 0xde, 0x14, 0x0c, 0xe5, 0xc7, 0xc0, 0x40, 0x5a, 0xb2, 0x3d, 0x82, 0xce, 0x27, 0x81,
|
||||
0xe9, 0xa2, 0x78, 0x27, 0x4b, 0xc6, 0x33, 0xfa, 0x54, 0x58, 0x7c, 0xa0, 0xa2, 0x7e, 0x83, 0x02,
|
||||
0x96, 0x8a, 0x97, 0x33, 0xff, 0x82, 0x00, 0x1a, 0x10, 0x3f, 0xe0, 0x14, 0x39, 0x80, 0x10, 0x6e,
|
||||
0x00, 0x75, 0x80, 0x11, 0x58, 0xce, 0x00, 0x02, 0xf0, 0x3a, 0xdc, 0x08, 0xc4, 0xc8, 0x00, 0x01,
|
||||
0x57, 0x81, 0xd6, 0x20, 0x46, 0x96, 0x33, 0x80, 0x0a, 0xbc, 0x0e, 0xdb, 0x02, 0x39, 0x31, 0x9c,
|
||||
0x00, 0x55, 0xe0, 0x75, 0x08, 0x11, 0x85, 0x90, 0x00, 0x02, 0xaf, 0x03, 0xa0, 0xc0, 0x91, 0x2c,
|
||||
0x80, 0x00, 0x16, 0x78, 0x1c, 0x9e, 0x05, 0x65, 0x64, 0x00, 0x00, 0xc3, 0xc0, 0xe0, 0x90, 0x2d,
|
||||
0xbb, 0x19, 0xc0, 0x06, 0xde, 0x05, 0x8d, 0x81, 0x02, 0x18, 0xce, 0x00, 0x35, 0xf0, 0x15, 0x5c,
|
||||
0x00, 0x06, 0xc6, 0x70, 0x00, 0xdf, 0x80, 0x8d, 0x5f, 0xde, 0x66, 0x27, 0x00, 0x07, 0x3c, 0x04,
|
||||
0x76, 0xfd, 0x67, 0x31, 0x9c, 0x00, 0x58, 0x60, 0x41, 0x37, 0xd3, 0x15, 0x89, 0xc0, 0x06, 0xdc,
|
||||
];
|
||||
|
||||
#[cfg(any(feature = "cam_tx", feature = "uart"))]
|
||||
pub const CAM_SMALL: &[u8] = &[
|
||||
0x2, 0x2, 0xc1, 0x73, 0x25, 0x68, 0x17, 0x28, 0x40, 0x29, 0xd5, 0xb3, 0x40, 0xf, 0x1f, 0xea,
|
||||
0xf0, 0x1f, 0xff, 0xff, 0xfc, 0x23, 0xb7, 0x74, 0x3e, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x7e, 0x81,
|
||||
0x38, 0x25, 0x7, 0x37, 0xfe, 0xeb, 0xff, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xff, 0x7f, 0xff, 0xf1,
|
||||
0xce, 0x40, 0x40, 0x0,
|
||||
];
|
||||
106
src/ubx.rs
106
src/ubx.rs
|
|
@ -1,106 +0,0 @@
|
|||
//! u-blox helpers
|
||||
#![allow(unused)]
|
||||
|
||||
use alloc::vec::Vec;
|
||||
|
||||
pub fn pretty_print_mon_ver(packet: &ublox::mon_ver::MonVerRef) -> alloc::string::String {
|
||||
alloc::format!(
|
||||
"UBX-MON-VER: SW version: {} HW version: {}; Extensions: {:?}",
|
||||
packet.software_version(),
|
||||
packet.hardware_version(),
|
||||
packet.extension().collect::<Vec<&str>>()
|
||||
)
|
||||
}
|
||||
|
||||
pub fn pretty_print_mon_comms(packet: &ublox::mon_comms::MonCommsRef) -> alloc::string::String {
|
||||
alloc::format!(
|
||||
"UBX-MON-COMMS: {} ports ({:?}), {} tx err, info {:?}",
|
||||
packet.n_ports(),
|
||||
packet.prot_ids(),
|
||||
packet.tx_errors(),
|
||||
packet
|
||||
.ports()
|
||||
.map(|v| alloc::format!("{v:?}"))
|
||||
.collect::<Vec<_>>()
|
||||
)
|
||||
}
|
||||
|
||||
pub fn pretty_print_mon_rf(packet: &ublox::mon_rf::MonRfRef) -> alloc::string::String {
|
||||
alloc::format!(
|
||||
"UBX-MON-RF: {:?}",
|
||||
packet
|
||||
.blocks()
|
||||
.map(|v| alloc::format!("{v:?}"))
|
||||
.collect::<Vec<_>>()
|
||||
)
|
||||
}
|
||||
|
||||
pub fn pretty_print_nav_sat(packet: &ublox::nav_sat::NavSatRef) -> alloc::string::String {
|
||||
// sort by quality flags
|
||||
let mut sat_infos = packet.svs().collect::<Vec<_>>();
|
||||
sat_infos.sort_unstable_by_key(|v| v.flags_raw() & 0x7);
|
||||
sat_infos.reverse();
|
||||
|
||||
let sat_info_strings = sat_infos
|
||||
.iter()
|
||||
.map(|v| {
|
||||
alloc::format!(
|
||||
"- {}/{:3}: E {:3.0}, A {:3.0}, CNO {:2.1} dBHz, {:?}, {:?}",
|
||||
v.gnss_id(),
|
||||
v.sv_id(),
|
||||
v.elev(),
|
||||
v.azim(),
|
||||
v.cno(),
|
||||
v.flags().quality_ind(),
|
||||
v.flags().health(),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
alloc::format!(
|
||||
"UBX-NAV-SAT: num {:?}\n{}",
|
||||
packet.num_svs(),
|
||||
sat_info_strings.join("\n")
|
||||
)
|
||||
}
|
||||
|
||||
impl<'a> TryFrom<&ublox::nav_pvt::proto27::NavPvtRef<'a>> for crate::applogic::GnssFix {
|
||||
type Error = alloc::string::String;
|
||||
|
||||
fn try_from(value: &ublox::nav_pvt::proto27::NavPvtRef<'a>) -> Result<Self, Self::Error> {
|
||||
let has_time = value.fix_type() == ublox::GnssFixType::Fix3D
|
||||
|| value.fix_type() == ublox::GnssFixType::GPSPlusDeadReckoning
|
||||
|| value.fix_type() == ublox::GnssFixType::TimeOnlyFix;
|
||||
let has_posvel = value.fix_type() == ublox::GnssFixType::Fix3D
|
||||
|| value.fix_type() == ublox::GnssFixType::GPSPlusDeadReckoning;
|
||||
|
||||
if !has_posvel || !has_time {
|
||||
return Err(alloc::format!(
|
||||
"NAV-PVT without valid fix: {:?}",
|
||||
value.fix_type()
|
||||
));
|
||||
}
|
||||
|
||||
let pos: ublox::PositionLLA = value.into();
|
||||
let vel: ublox::Velocity = value.into();
|
||||
|
||||
let time: chrono::DateTime<chrono::Utc> = value
|
||||
.try_into()
|
||||
.map_err(|err| alloc::format!("Failed to convert time: {err}"))?;
|
||||
|
||||
let latitude_deg = pos.lat;
|
||||
let longitude_deg = pos.lon;
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let heading_deg = vel.heading as f32;
|
||||
#[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
|
||||
let speed_mps = vel.speed as f32;
|
||||
|
||||
Ok(Self {
|
||||
time: Some(time.naive_utc()),
|
||||
latitude_deg,
|
||||
longitude_deg,
|
||||
heading_deg: Some(heading_deg),
|
||||
speed_mps: Some(speed_mps),
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue