diff --git a/Cargo.lock b/Cargo.lock index e2b110c..7a40497 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,365 +4,478 @@ name = "aligned" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1ce8b3382016136ab1d31a1b5ce807144f8b7eb2d5f16b2108f0f07edceb94" dependencies = [ - "as-slice 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "as-slice", +] + +[[package]] +name = "apa102-spi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92cd690fd2aae5bc549e2dc392d9082aab3ccf851aa39b0ab84b2934f4c57a3" +dependencies = [ + "embedded-hal", + "smart-leds-trait", ] [[package]] name = "as-slice" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37dfb65bc03b2bc85ee827004f14a6817e04160e3b1a28931986a666a9290e70" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.12.3", + "generic-array 0.13.2", + "stable_deref_trait", ] [[package]] name = "atsamd-hal" -version = "0.8.2" -source = "git+https://github.com/atsamd-rs/atsamd#b7619155806fd853887e07fe271d7c1b0cf424a0" +version = "0.12.0" +source = "git+https://github.com/atsamd-rs/atsamd#8e507a7b76c441d87d302b107c6b06485e9b6478" dependencies = [ - "atsamd21g18a 0.6.0 (git+https://github.com/atsamd-rs/atsamd)", - "bitfield 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "embedded-hal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "nb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "atsamd21g", + "bitfield", + "cortex-m", + "embedded-hal", + "nb", + "paste", + "rand_core", + "usb-device", + "vcell", + "void", ] [[package]] -name = "atsamd21g18a" -version = "0.6.0" -source = "git+https://github.com/atsamd-rs/atsamd#b7619155806fd853887e07fe271d7c1b0cf424a0" +name = "atsamd21g" +version = "0.9.0" +source = "git+https://github.com/atsamd-rs/atsamd#8e507a7b76c441d87d302b107c6b06485e9b6478" dependencies = [ - "bare-metal 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cortex-m-rt 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bare-metal", + "cortex-m", + "cortex-m-rt", + "vcell", ] [[package]] name = "bare-metal" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", +] + +[[package]] +name = "bitbang-hal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "470e1522d257e4c76245980d27d5d279442cb18955cc6341249b904074033f4a" +dependencies = [ + "embedded-hal", + "nb", ] [[package]] name = "bitfield" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bytemuck" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a4bad0c5981acc24bc09e532f35160f952e35422603f0563cd7a73c2c2e65a0" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "cortex-m" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2954942fbbdd49996704e6f048ce57567c3e1a4e2dc59b41ae9fde06a01fc763" dependencies = [ - "aligned 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bare-metal 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "volatile-register 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aligned", + "bare-metal", + "volatile-register", ] [[package]] name = "cortex-m-rt" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d518da72bba39496024b62607c1d8e37bcece44b2536664f1132a73a499a28" dependencies = [ - "cortex-m-rt-macros 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "r0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cortex-m-rt-macros", + "r0", ] [[package]] name = "cortex-m-rt-macros" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4717562afbba06e760d34451919f5c3bf3ac15c7bb897e8b04862a7428378647" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "embedded-graphics" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e7ee289ac88cbeea6f749cd72c6eb4cdeb801f4ea26795aace97b9776a2db2" dependencies = [ - "tinybmp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytga 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tinybmp", + "tinytga", ] [[package]] name = "embedded-hal" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4908a155094da7723c2d60d617b820061e3b4efcc3d9e293d206a5a76c170b" dependencies = [ - "nb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "nb", + "void", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "generic-array" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ - "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", ] [[package]] name = "generic-array" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" dependencies = [ - "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", ] [[package]] name = "itsybitsy_m0" -version = "0.7.0" -source = "git+https://github.com/atsamd-rs/atsamd#b7619155806fd853887e07fe271d7c1b0cf424a0" +version = "0.10.0" +source = "git+https://github.com/atsamd-rs/atsamd#8e507a7b76c441d87d302b107c6b06485e9b6478" dependencies = [ - "atsamd-hal 0.8.2 (git+https://github.com/atsamd-rs/atsamd)", - "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cortex-m-rt 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "embedded-hal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "nb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "apa102-spi", + "atsamd-hal", + "bitbang-hal", + "cortex-m", + "cortex-m-rt", + "embedded-hal", + "nb", + "smart-leds", + "usb-device", + "usbd-hid", + "usbd-serial", ] [[package]] name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" [[package]] name = "nb" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1411551beb3c11dedfb0a90a0fa256b47d28b9ec2cdff34c25a2fa59e45dbdc" [[package]] name = "neowatch" version = "0.1.0" dependencies = [ - "atsamd-hal 0.8.2 (git+https://github.com/atsamd-rs/atsamd)", - "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cortex-m-rt 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "embedded-graphics 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "embedded-hal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itsybitsy_m0 0.7.0 (git+https://github.com/atsamd-rs/atsamd)", - "nb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ssd1351 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "atsamd-hal", + "cortex-m", + "cortex-m-rt", + "embedded-graphics", + "embedded-hal", + "itsybitsy_m0", + "nb", + "ssd1351", + "usb-device", + "usbd-serial", ] [[package]] name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", + "version_check 0.1.5", ] [[package]] name = "nom" version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", + "version_check 0.9.1", ] [[package]] name = "paste" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "paste-impl 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "paste-impl" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.15" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d65c4d95931acda4498f675e332fcbdc9a06705cd07086c510e9b6009cd1c1" [[package]] name = "proc-macro2" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "quote" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "r0" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2a38df5b15c8d5c7e8654189744d8e396bddc18ad48041a500ce52d6948941f" [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rgb" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287f3c3f8236abb92d8b7e36797f19159df4b58f0a658cc3fb6dd3004b1f3bd3" +dependencies = [ + "bytemuck", +] [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "974ef1bd2ad8a507599b336595454081ff68a9599b4890af7643c0c0ed73a62c" + +[[package]] +name = "smart-leds" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38dd45fa275f70b4110eac5f5182611ad384f88bb22b68b9a9c3cafd7015290b" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf6d833fa93f16a1c1874e62c2aebe8567e5bdd436d59bf543ed258b6f7a8e3" +dependencies = [ + "rgb", +] [[package]] name = "ssd1351" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" +version = "0.3.0" dependencies = [ - "embedded-graphics 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "embedded-hal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "embedded-graphics", + "embedded-hal", +] + +[[package]] +name = "ssmarshal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" +dependencies = [ + "encode_unicode", + "serde", ] [[package]] name = "stable_deref_trait" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" [[package]] name = "syn" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "tinybmp" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d12b7f8b271567d6d072c49dee16b22271aabfc473e2066e3353e5af0f5230" dependencies = [ - "nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 5.1.1", ] [[package]] name = "tinytga" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc9485052c1f4b541d888f1d564dd9957671e0c21da9bca0c9824c1123e03f07" dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3", ] [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "usb-device" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "849eed9b4dc61a1f17ba1d7a5078ceb095b9410caa38a506eb281ed5eff12fbd" + +[[package]] +name = "usbd-hid" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3404cbb66a4d6a092d8e88c3e62dcc6f339536e2cf66dfedad342eb0013c7cd" +dependencies = [ + "serde", + "ssmarshal", + "usb-device", + "usbd-hid-macros", +] + +[[package]] +name = "usbd-hid-descriptors" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e00430c0b39caf3957aba6c2b2824f8e70e1ac0278941418bf1fe35f9566d64" +dependencies = [ + "bitfield", +] + +[[package]] +name = "usbd-hid-macros" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a04e28e2949d0b8d3307996a37330a297d863b6ec1e8904552ca2051c1a7e" +dependencies = [ + "byteorder", + "proc-macro2", + "quote", + "serde", + "syn", + "usbd-hid-descriptors", +] + +[[package]] +name = "usbd-serial" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db75519b86287f12dcf0d171c7cf4ecc839149fe9f3b720ac4cfce52959e1dfe" +dependencies = [ + "embedded-hal", + "nb", + "usb-device", +] [[package]] name = "vcell" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876e32dcadfe563a4289e994f7cb391197f362b6315dc45e8ba4aa6f564a4b3c" [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "volatile-register" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d67cb4616d99b940db1d6bd28844ff97108b498a6ca850e5b6191a532063286" dependencies = [ - "vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "vcell", ] - -[metadata] -"checksum aligned 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb1ce8b3382016136ab1d31a1b5ce807144f8b7eb2d5f16b2108f0f07edceb94" -"checksum as-slice 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "37dfb65bc03b2bc85ee827004f14a6817e04160e3b1a28931986a666a9290e70" -"checksum atsamd-hal 0.8.2 (git+https://github.com/atsamd-rs/atsamd)" = "" -"checksum atsamd21g18a 0.6.0 (git+https://github.com/atsamd-rs/atsamd)" = "" -"checksum bare-metal 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" -"checksum bitfield 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" -"checksum cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2954942fbbdd49996704e6f048ce57567c3e1a4e2dc59b41ae9fde06a01fc763" -"checksum cortex-m-rt 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "00d518da72bba39496024b62607c1d8e37bcece44b2536664f1132a73a499a28" -"checksum cortex-m-rt-macros 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4717562afbba06e760d34451919f5c3bf3ac15c7bb897e8b04862a7428378647" -"checksum embedded-graphics 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b2e7ee289ac88cbeea6f749cd72c6eb4cdeb801f4ea26795aace97b9776a2db2" -"checksum embedded-hal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee4908a155094da7723c2d60d617b820061e3b4efcc3d9e293d206a5a76c170b" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" -"checksum itsybitsy_m0 0.7.0 (git+https://github.com/atsamd-rs/atsamd)" = "" -"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" -"checksum nb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b1411551beb3c11dedfb0a90a0fa256b47d28b9ec2cdff34c25a2fa59e45dbdc" -"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" -"checksum paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab4fb1930692d1b6a9cfabdde3d06ea0a7d186518e2f4d67660d8970e2fa647a" -"checksum paste-impl 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "a62486e111e571b1e93b710b61e8f493c0013be39629b714cb166bdb06aa5a8a" -"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" -"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" -"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" -"checksum r0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a38df5b15c8d5c7e8654189744d8e396bddc18ad48041a500ce52d6948941f" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum ssd1351 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c80bbad15958832bc5cbddd1b2b63157165fed1f90f22c1b47e7aebddcadac03" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" -"checksum tinybmp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30d12b7f8b271567d6d072c49dee16b22271aabfc473e2066e3353e5af0f5230" -"checksum tinytga 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc9485052c1f4b541d888f1d564dd9957671e0c21da9bca0c9824c1123e03f07" -"checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "876e32dcadfe563a4289e994f7cb391197f362b6315dc45e8ba4aa6f564a4b3c" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum volatile-register 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d67cb4616d99b940db1d6bd28844ff97108b498a6ca850e5b6191a532063286" diff --git a/Cargo.toml b/Cargo.toml index 12cc260..6b00b22 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,26 +17,33 @@ lto = false cortex-m = "~0.6" cortex-m-rt = "~0.6" nb = "~0.1" -#ssd1306 = "~0.2" -ssd1351 = "~0.2" +#ssd1351 = "~0.2" embedded-graphics = "^0.4.0" embedded-hal = "=0.2.3" +usb-device = "0.2" +usbd-serial = "0.1" + +[dependencies.ssd1351] +version = "0.3" +#git = "https://github.com/MabezDev/ssd1351" +#branch = "crude-ehal-digital-v2-support" +path = "../ssd1351" [dependencies.itsybitsy_m0] -version = "~0.7" +version = "~0.10" git = "https://github.com/atsamd-rs/atsamd" features = [ "rt", "unproven", + "usb", ] [dependencies.atsamd-hal] -version = "~0.8" +version = "~0.12" git = "https://github.com/atsamd-rs/atsamd" features = [ - "atsamd21g18a", - "samd21g18a", - "samd21g18a-rt", + "atsamd21g", + "samd21g", + "samd21g-rt", "unproven", ] - diff --git a/src/bl_demo.rs b/src/bl_demo.rs new file mode 100644 index 0000000..598aa26 --- /dev/null +++ b/src/bl_demo.rs @@ -0,0 +1,64 @@ +use crate::rn4020::{BaudRate, RN4020}; +use hal::{ + clock::GenericClockController, + delay::Delay, + //digital::v1::OutputPin, + gpio::{Pa10, Pa11, PfC}, + pac::{CorePeripherals, Peripherals}, + prelude::*, + sercom::{PadPin, Sercom0Pad2, Sercom0Pad3}, +}; + +#[allow(dead_code)] +fn demo() -> ! { + let mut peripherals = Peripherals::take().unwrap(); + let core = CorePeripherals::take().unwrap(); + let mut clocks = GenericClockController::with_internal_32kosc( + peripherals.GCLK, + &mut peripherals.PM, + &mut peripherals.SYSCTRL, + &mut peripherals.NVMCTRL, + ); + let mut pins = hal::Pins::new(peripherals.PORT); + + let mut delay = Delay::new(core.SYST, &mut clocks); + + let mut red_led = pins.d13.into_open_drain_output(&mut pins.port); + + let button_in = pins.d12.into_pull_up_input(&mut pins.port); + let mut button_last: bool = false; + + let glck0 = clocks.gclk0(); + let bl_baud_rate = BaudRate::BR115200; + let mut bluetooth: RN4020>, Sercom0Pad2>> = RN4020::new( + &clocks.sercom0_core(&glck0).unwrap(), + bl_baud_rate, + peripherals.SERCOM0, + &mut peripherals.PM, + ( + pins.d0.into_pad(&mut pins.port), + pins.d1.into_pad(&mut pins.port), + ), + ); + + loop { + //match uart.read() { + // Ok(word) => uart.write(word).unwrap(), + // Err(nb::Error::WouldBlock) => {} + // Err(_) => panic!("Something went wrong when reading from UART"), + //} + + let button = button_in.is_low().unwrap(); + + if button && !button_last { + red_led.set_high().unwrap(); + + bluetooth.set_serialized_name("MyDude123").unwrap(); + + delay.delay_ms(200u8); + red_led.set_low().unwrap(); + } + + button_last = button; + } +} diff --git a/src/display_demo.rs b/src/display_demo.rs new file mode 100644 index 0000000..3019f61 --- /dev/null +++ b/src/display_demo.rs @@ -0,0 +1,114 @@ +use hal::clock::GenericClockController; +use hal::delay::Delay; +use hal::pac::{CorePeripherals, Peripherals}; +use hal::prelude::*; +use hal::time::MegaHertz; + +//use embedded_graphics::pixelcolor::BinaryColor; +use embedded_graphics::pixelcolor::PixelColorU16; +use embedded_graphics::prelude::*; +use embedded_graphics::primitives::{Circle, Line, Rect}; +use embedded_graphics::style::Style; +use ssd1351::{ + builder::Builder, + //ininterface::spi::SpiInterface, + //display::Display, + mode::GraphicsMode, + properties::{DisplayRotation, DisplaySize}, +}; + +#[allow(dead_code)] +pub fn demo() -> ! { + let mut peripherals = Peripherals::take().unwrap(); + let core = CorePeripherals::take().unwrap(); + let mut clocks = GenericClockController::with_internal_32kosc( + peripherals.GCLK, + &mut peripherals.PM, + &mut peripherals.SYSCTRL, + &mut peripherals.NVMCTRL, + ); + let mut pins = hal::Pins::new(peripherals.PORT); + let mut red_led = pins.d13.into_open_drain_output(&mut pins.port); + let mut delay = Delay::new(core.SYST, &mut clocks); + + let spi = hal::spi_master( + &mut clocks, + MegaHertz(12), + peripherals.SERCOM4, + &mut peripherals.PM, + pins.sck, + pins.mosi, + pins.miso, + &mut pins.port, + ); + + let dc = pins.d9.into_open_drain_output(&mut pins.port); + let mut rst = pins.d7.into_open_drain_output(&mut pins.port); + + //let interface = SpiInterface::new(spi, dc); + //let display = Display::new(interface, DisplaySize::Display128x128, DisplayRotation::Rotate0); + //display.set_draw_area((0, 0), (128, 96)); + + // NOTE the `DisplaySize` enum comes from the ssd1351 package, + // and currently only supports certain display sizes; see + // https://jamwaffles.github.io/ssd1306/master/ssd1306/prelude/enum.DisplaySize.html + let mut disp: GraphicsMode<_> = Builder::new() + .with_size(DisplaySize::Display128x96) + .with_rotation(DisplayRotation::Rotate0) + .connect_spi(spi, dc) + .into(); + + loop { + disp.reset(&mut rst, &mut delay).unwrap(); + disp.init().unwrap(); + //disp.flush().unwrap(); + + let style = Style { + stroke_width: 10, + fill_color: Some(PixelColorU16(100)), + stroke_color: Some(PixelColorU16(50000)), + }; + + disp.draw( + Line::new(Coord::new(8, 16 + 16), Coord::new(8 + 8, 16)) + .with_style(style) + .into_iter(), + ); + + disp.draw( + Line::new(Coord::new(8, 16 + 16), Coord::new(8 + 16, 16 + 16)) + .with_style(style) + .into_iter(), + ); + + disp.draw( + Line::new(Coord::new(8 + 16, 16 + 16), Coord::new(8 + 8, 16)) + .with_style(style) + .into_iter(), + ); + + disp.draw( + Rect::new(Coord::new(48, 16), Coord::new(48 + 16, 16 + 16)) + .with_style(style) + .into_iter(), + ); + + disp.draw( + Circle::new(Coord::new(96, 16 + 8), 8) + .with_style(style) + .into_iter(), + ); + + //disp.flush().unwrap(); + + //loop { + delay.delay_ms(200u8); + red_led.set_high().unwrap(); + delay.delay_ms(50u8); + red_led.set_low().unwrap(); + delay.delay_ms(200u8); + red_led.set_high().unwrap(); + delay.delay_ms(200u8); + red_led.set_low().unwrap(); + } +} diff --git a/src/main.rs b/src/main.rs index 4fab0dc..6e91ed6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,74 +4,71 @@ extern crate itsybitsy_m0 as hal; mod panic; + +#[allow(dead_code)] mod rn4020; -//use core::fmt::Write; -use crate::rn4020::{BaudRate, RN4020}; -use hal::{ - clock::GenericClockController, - delay::Delay, - //digital::v1::OutputPin, - entry, - gpio::{Pa10, Pa11, PfC}, - prelude::*, - sercom::{PadPin, Sercom0Pad2, Sercom0Pad3}, - pac::{ - CorePeripherals, - Peripherals, - }, -}; +mod bl_demo; +mod display_demo; +mod usb_shell; +mod wait_delay; + +use hal::clock::GenericClockController; +use hal::delay::Delay; +use hal::entry; +use hal::pac::{interrupt, CorePeripherals, Peripherals}; +use hal::prelude::*; +use usb_shell::{init, poll_usb}; +use wait_delay::WaitDelay; #[entry] fn main() -> ! { let mut peripherals = Peripherals::take().unwrap(); - let core = CorePeripherals::take().unwrap(); + let mut core = CorePeripherals::take().unwrap(); let mut clocks = GenericClockController::with_internal_32kosc( peripherals.GCLK, &mut peripherals.PM, &mut peripherals.SYSCTRL, &mut peripherals.NVMCTRL, ); - let glck0 = clocks.gclk0(); let mut pins = hal::Pins::new(peripherals.PORT); - - let mut delay = Delay::new(core.SYST, &mut clocks); - let mut red_led = pins.d13.into_open_drain_output(&mut pins.port); + //let mut delay = Delay::new(core.SYST, &mut clocks); + let mut delay = WaitDelay::new(core.SYST, &mut clocks); - let button_in = pins.d12.into_pull_up_input(&mut pins.port); - let mut button_last: bool = false; + let mut blip = || { + red_led.set_low().ok(); + delay.delay_ms(200u8); + red_led.toggle(); + delay.delay_ms(200u8); + }; - let bl_baud_rate = BaudRate::BR115200; - let mut bluetooth: RN4020>, Sercom0Pad2>> = RN4020::new( - &clocks.sercom0_core(&glck0).unwrap(), - bl_baud_rate, - peripherals.SERCOM0, + blip(); + + init( + &mut core.NVIC, + peripherals.USB, + &mut clocks, &mut peripherals.PM, - ( - pins.d0.into_pad(&mut pins.port), - pins.d1.into_pad(&mut pins.port), - ), + pins.usb_dm, + pins.usb_dp, + &mut pins.port, + &mut blip, ); + blip(); + blip(); + blip(); + blip(); + + // Flash the LED in a spin loop to demonstrate that USB is + // entirely interrupt driven. loop { - //match uart.read() { - // Ok(word) => uart.write(word).unwrap(), - // Err(nb::Error::WouldBlock) => {} - // Err(_) => panic!("Something went wrong when reading from UART"), - //} - - let button = button_in.is_low().unwrap(); - - if button && !button_last { - red_led.set_high().unwrap(); - - bluetooth.set_serialized_name("MyDude123").unwrap(); - - delay.delay_ms(200u8); - red_led.set_low().unwrap(); - } - - button_last = button; + blip(); } } + +#[interrupt] +fn USB() { + poll_usb(); +} diff --git a/src/panic.rs b/src/panic.rs index 900efec..9951e0e 100644 --- a/src/panic.rs +++ b/src/panic.rs @@ -3,10 +3,10 @@ use core::panic::PanicInfo; use hal::{ clock::GenericClockController, gpio::{Pa10, Pa11, PfC}, + pac::Peripherals, prelude::*, sercom::{PadPin, Sercom0Pad2, Sercom0Pad3, UART0}, time, - pac::Peripherals, }; #[panic_handler] diff --git a/src/rn4020/mod.rs b/src/rn4020/mod.rs index 921cfb0..7e891b9 100644 --- a/src/rn4020/mod.rs +++ b/src/rn4020/mod.rs @@ -1,9 +1,9 @@ use core::fmt::Write; use hal::{ clock::Sercom0CoreClock, - sercom::{RxpoTxpo, UART0Padout, UART0}, //target_device::{NVIC, PM, SERCOM0}, pac::{PM, SERCOM0}, + sercom::{RxpoTxpo, UART0Padout, UART0}, time::Hertz, //prelude::_embedded_hal_serial_Read as Read, //prelude::_embedded_hal_serial_Write as WriteHal, diff --git a/src/usb_shell.rs b/src/usb_shell.rs new file mode 100644 index 0000000..9d91ba0 --- /dev/null +++ b/src/usb_shell.rs @@ -0,0 +1,147 @@ +mod cmds; + +use core::str::from_utf8; +use core::sync::atomic::AtomicBool; +use core::sync::atomic::Ordering; +use cortex_m::peripheral::NVIC; +use hal::clock::GenericClockController; +use hal::gpio::{ + v2::{PA24, PA25}, + Pin, Port, +}; +use hal::pac::{interrupt, PM, USB}; +use hal::usb::UsbBus; +use usb_device::bus::UsbBusAllocator; +use usb_device::prelude::*; +use usbd_serial::{SerialPort, USB_CLASS_CDC}; + +struct ShellState { + line_buf: [u8; 255], + buf_size: usize, +} + +static USB_READY: AtomicBool = AtomicBool::new(false); +static mut USB_ALLOCATOR: Option> = None; +static mut USB_BUS: Option> = None; +static mut USB_SERIAL: Option> = None; +static mut SHELL_STATE: Option = None; + +const PROMPT: &[u8] = b"[neowatch]# "; + +pub fn init( + nvic: &mut NVIC, + //bus_allocator: UsbBusAllocator, + usb: USB, + clocks: &mut GenericClockController, + pm: &mut PM, + usb_dm: Pin>, + usb_dp: Pin>, + port: &mut Port, + f: &mut F, +) { + let bus_allocator = unsafe { + USB_ALLOCATOR = Some(hal::usb_allocator(usb, clocks, pm, usb_dm, usb_dp, port)); + USB_ALLOCATOR.as_ref().unwrap() + }; + f(); + + unsafe { + USB_SERIAL = Some(SerialPort::new(&bus_allocator)); + USB_BUS = Some( + UsbDeviceBuilder::new(&bus_allocator, UsbVidPid(0x16c0, 0x27dd)) + .manufacturer("Fake company") + .product("Serial port") + .serial_number("TEST") + .device_class(USB_CLASS_CDC) + .build(), + ); + SHELL_STATE = Some(ShellState { + line_buf: [0; 255], + buf_size: 0, + }); + } + + f(); + + USB_READY.store(true, Ordering::SeqCst); + f(); + + unsafe { + nvic.set_priority(interrupt::USB, 1); + f(); + NVIC::unmask(interrupt::USB); + f(); + } +} + +pub fn poll_usb() { + if !USB_READY.load(Ordering::SeqCst) { + return; + } + + unsafe { USB_BUS.as_mut() } + .zip(unsafe { USB_SERIAL.as_mut() }) + .zip(unsafe { SHELL_STATE.as_mut() }) + .map(|((bus, serial), state)| { + bus.poll(&mut [serial]); + let mut buf = [0u8; 64]; + + if let Ok(count) = serial.read(&mut buf) { + for &c in buf.iter().take(count) { + match c { + b'\t' => {} + 127 | 08 /* del or backspace */ => { + if state.buf_size > 0 { + // FIXME: This is not utf-8 compatible. It should decrease + // buf_size by the size of the last unicode scalar. + state.buf_size -= 1; + // erase previous character + serial.write(&[08, b' ', 08]).unwrap(); + } + } + b'\n' | b'\r' => { + if state.buf_size > 0 { + serial.write(b"\r\n").unwrap(); + match from_utf8(&state.line_buf[..state.buf_size]) { + Ok(s) => { + let mut args = s.split(" "); + let arg0 = args.next().unwrap_or(""); + + match arg0 { + "help" => cmds::help::exec(args, serial), + "echo" => cmds::echo::exec(args, serial), + _ => { + serial.write(b"Unknown command: ").unwrap(); + serial.write(arg0.as_bytes()).unwrap(); + } + } + } + Err(_) => { + serial.write(b"ERROR: not valid utf-8").unwrap(); + } + } + } + serial.write(b"\r\n").unwrap(); + serial.write(PROMPT).unwrap(); + state.buf_size = 0; + } + _ => { + if state.buf_size >= state.line_buf.len() { + state.buf_size = 0; + serial + .write(b"\r\nERROR: line buffer size exceeded\r\n") + .unwrap(); + break; + } + + state.line_buf[state.buf_size] = c; + state.buf_size += 1; + serial.write(&[c]).unwrap(); + } + } + } + + crate::wait_delay::wakeup(); + }; + }); +} diff --git a/src/usb_shell/cmds/echo.rs b/src/usb_shell/cmds/echo.rs new file mode 100644 index 0000000..46a46f3 --- /dev/null +++ b/src/usb_shell/cmds/echo.rs @@ -0,0 +1,27 @@ +use hal::usb::UsbBus; +use usbd_serial::SerialPort; + +/// Echo +pub fn exec<'a, I: Iterator>(args: I, serial: &mut SerialPort) { + for arg in args { + // inspect bytes + //for &byte in arg.as_bytes() { + // let mut decimal = [0u8; 3]; + // decimal[2] = byte % 10; + // decimal[1] = byte % 100 / 10; + // decimal[0] = byte / 100; + + // serial.write(&[byte]).unwrap(); + // serial.write(b" has dec code ").unwrap(); + // for &digit in &decimal { + // let c = + // [b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9'][digit as usize]; + // serial.write(&[c]).unwrap(); + // } + // serial.write(b"\r\n").unwrap(); + //} + + serial.write(arg.as_bytes()).unwrap(); + serial.write(b" ").unwrap(); + } +} diff --git a/src/usb_shell/cmds/help.rs b/src/usb_shell/cmds/help.rs new file mode 100644 index 0000000..586ed67 --- /dev/null +++ b/src/usb_shell/cmds/help.rs @@ -0,0 +1,13 @@ +use hal::usb::UsbBus; +use usbd_serial::SerialPort; + +/// Help +pub fn exec<'a, I: Iterator>(_args: I, serial: &mut SerialPort) { + serial + .write( + b"available commands:\r\n\ + - help\r\n\ + - echo", + ) + .unwrap(); +} diff --git a/src/usb_shell/cmds/mod.rs b/src/usb_shell/cmds/mod.rs new file mode 100644 index 0000000..65c444b --- /dev/null +++ b/src/usb_shell/cmds/mod.rs @@ -0,0 +1,2 @@ +pub mod echo; +pub mod help; diff --git a/src/wait_delay.rs b/src/wait_delay.rs new file mode 100644 index 0000000..1b1036e --- /dev/null +++ b/src/wait_delay.rs @@ -0,0 +1,101 @@ +//! Delay module for waking the system up + +use cortex_m::peripheral::syst::SystClkSource; +use cortex_m::peripheral::SYST; + +use embedded_hal::blocking::delay::{DelayMs, DelayUs}; +use itsybitsy_m0::clock::GenericClockController; +use itsybitsy_m0::time::Hertz; + +static mut SLEEPING: bool = false; + +pub fn wakeup() { + unsafe { + SLEEPING = false; + } +} + +/// System timer (SysTick) as a delay provider +pub struct WaitDelay { + sysclock: Hertz, + syst: SYST, +} + +impl WaitDelay { + /// Configures the system timer (SysTick) as a delay provider + pub fn new(mut syst: SYST, clocks: &mut GenericClockController) -> Self { + syst.set_clock_source(SystClkSource::Core); + + WaitDelay { + syst, + sysclock: clocks.gclk0().into(), + } + } + + /// Releases the system timer (SysTick) resource + pub fn free(self) -> SYST { + self.syst + } +} + +impl DelayMs for WaitDelay { + fn delay_ms(&mut self, ms: u32) { + self.delay_us(ms * 1_000); + } +} + +impl DelayMs for WaitDelay { + fn delay_ms(&mut self, ms: u16) { + self.delay_ms(ms as u32); + } +} + +impl DelayMs for WaitDelay { + fn delay_ms(&mut self, ms: u8) { + self.delay_ms(ms as u32); + } +} + +impl DelayUs for WaitDelay { + fn delay_us(&mut self, us: u32) { + // The SysTick Reload Value register supports values between 1 and 0x00FFFFFF. + const MAX_RVR: u32 = 0x00FF_FFFF; + + let mut total_rvr = us * (self.sysclock.0 / 1_000_000); + + //unsafe { + // SLEEPING = true; + //} + + while total_rvr != 0 { + let current_rvr = if total_rvr <= MAX_RVR { + total_rvr + } else { + MAX_RVR + }; + + self.syst.set_reload(current_rvr); + self.syst.clear_current(); + self.syst.enable_counter(); + + // Update the tracking variable while we are waiting... + total_rvr -= current_rvr; + + while !self.syst.has_wrapped() {} + + self.syst.disable_counter(); + } + } +} + +impl DelayUs for WaitDelay { + fn delay_us(&mut self, us: u16) { + self.delay_us(us as u32) + } +} + +impl DelayUs for WaitDelay { + fn delay_us(&mut self, us: u8) { + self.delay_us(us as u32) + } +}