initial commit

This commit is contained in:
baldeau 2025-01-03 16:15:22 +01:00
commit 611420a4dc
14 changed files with 909 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

8
.cargo/config.toml Normal file
View File

@ -0,0 +1,8 @@
[build]
target = "thumbv7em-none-eabihf"
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = [
"-C", "link-arg=-Tlink.x",
"-C", "link-arg=--nmagic",
]

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

652
Cargo.lock generated Normal file
View File

@ -0,0 +1,652 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "approx"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
dependencies = [
"num-traits",
]
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "az"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
[[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",
]
[[package]]
name = "bitfield"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bytemuck"
version = "1.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "byterepr"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7eb1a05c2ec66850db33d8dd2119626aef815662a074656a74bbe47a562fdf4"
dependencies = [
"bytemuck",
]
[[package]]
name = "cast"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cortex-m"
version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9"
dependencies = [
"bare-metal",
"bitfield",
"critical-section",
"embedded-hal",
"volatile-register",
]
[[package]]
name = "cortex-m-rt"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6"
dependencies = [
"cortex-m-rt-macros",
]
[[package]]
name = "cortex-m-rt-macros"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.94",
]
[[package]]
name = "critical-section"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "crunchy"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "embedded-dma"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "994f7e5b5cb23521c22304927195f236813053eb9c065dd2226a32ba64695446"
dependencies = [
"stable_deref_trait",
]
[[package]]
name = "embedded-hal"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff"
dependencies = [
"nb 0.1.3",
"void",
]
[[package]]
name = "embedded-storage"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032"
[[package]]
name = "fixed"
version = "1.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85c6e0b89bf864acd20590dbdbad56f69aeb898abfc9443008fd7bd48b2cc85a"
dependencies = [
"az",
"bytemuck",
"half",
"typenum",
]
[[package]]
name = "flatbuffers"
version = "23.5.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640"
dependencies = [
"bitflags",
"rustc_version 0.4.1",
]
[[package]]
name = "half"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
dependencies = [
"cfg-if",
"crunchy",
]
[[package]]
name = "hash32"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
dependencies = [
"byteorder",
]
[[package]]
name = "heapless"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
dependencies = [
"hash32",
"stable_deref_trait",
]
[[package]]
name = "libm"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
[[package]]
name = "matrixmultiply"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
dependencies = [
"autocfg",
"rawpointer",
]
[[package]]
name = "microflow"
version = "0.1.3"
dependencies = [
"libm",
"microflow-macros",
"nalgebra 0.33.2",
"simba 0.9.0",
]
[[package]]
name = "microflow-macros"
version = "0.1.1"
dependencies = [
"byterepr",
"flatbuffers",
"nalgebra 0.32.6",
"proc-macro-error",
"proc-macro2",
"quote",
"simba 0.8.1",
"structmeta",
"syn 2.0.94",
]
[[package]]
name = "nalgebra"
version = "0.32.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4"
dependencies = [
"approx",
"matrixmultiply",
"nalgebra-macros",
"num-complex",
"num-rational",
"num-traits",
"simba 0.8.1",
"typenum",
]
[[package]]
name = "nalgebra"
version = "0.33.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b"
dependencies = [
"approx",
"nalgebra-macros",
"num-complex",
"num-rational",
"num-traits",
"simba 0.9.0",
"typenum",
]
[[package]]
name = "nalgebra-macros"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.94",
]
[[package]]
name = "nb"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f"
dependencies = [
"nb 1.1.0",
]
[[package]]
name = "nb"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
[[package]]
name = "nrf-hal-common"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ea48ed7f0843fe6ec5aac0c42701e9194adfa1ee82ce6d028d64e5f68542be4"
dependencies = [
"cast",
"cfg-if",
"cortex-m",
"embedded-dma",
"embedded-hal",
"embedded-storage",
"fixed",
"nb 1.1.0",
"nrf-usbd",
"nrf52840-pac",
"rand_core",
"void",
]
[[package]]
name = "nrf-usbd"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66b2907c0b3ec4d264981c1fc5a2321d51c463d5a63d386e573f00e84d5495e6"
dependencies = [
"cortex-m",
"critical-section",
"usb-device",
"vcell",
]
[[package]]
name = "nrf52840-hal"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "709f85690f7f8d04612a18838785ee9176e1292ce3e53f0c68692b4cf5b4948e"
dependencies = [
"embedded-hal",
"nrf-hal-common",
"nrf52840-pac",
]
[[package]]
name = "nrf52840-pac"
version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30713f36f1be02e5bc9abefa30eae4a1f943d810f199d4923d3ad062d1be1b3d"
dependencies = [
"cortex-m",
"cortex-m-rt",
"vcell",
]
[[package]]
name = "num-complex"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
dependencies = [
"num-traits",
]
[[package]]
name = "num-integer"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
dependencies = [
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn 1.0.109",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro2"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]]
name = "rawpointer"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
[[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",
]
[[package]]
name = "rustc_version"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [
"semver 1.0.24",
]
[[package]]
name = "safe_arch"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323"
dependencies = [
"bytemuck",
]
[[package]]
name = "semver"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
dependencies = [
"semver-parser",
]
[[package]]
name = "semver"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba"
[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "simba"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae"
dependencies = [
"approx",
"num-complex",
"num-traits",
"paste",
"wide",
]
[[package]]
name = "simba"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
dependencies = [
"approx",
"num-complex",
"num-traits",
"paste",
]
[[package]]
name = "stable_deref_trait"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "structmeta"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329"
dependencies = [
"proc-macro2",
"quote",
"structmeta-derive",
"syn 2.0.94",
]
[[package]]
name = "structmeta-derive"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.94",
]
[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"unicode-ident",
]
[[package]]
name = "syn"
version = "2.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tflite_demo"
version = "0.1.0"
dependencies = [
"cortex-m",
"cortex-m-rt",
"heapless",
"libm",
"microflow",
"nalgebra 0.33.2",
"nrf52840-hal",
"usb-device",
"usbd-serial",
]
[[package]]
name = "typenum"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "unicode-ident"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "usb-device"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508"
[[package]]
name = "usbd-serial"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db75519b86287f12dcf0d171c7cf4ecc839149fe9f3b720ac4cfce52959e1dfe"
dependencies = [
"embedded-hal",
"nb 0.1.3",
"usb-device",
]
[[package]]
name = "vcell"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[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.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc"
dependencies = [
"vcell",
]
[[package]]
name = "wide"
version = "0.7.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019"
dependencies = [
"bytemuck",
"safe_arch",
]

17
Cargo.toml Normal file
View File

@ -0,0 +1,17 @@
[workspace]
members = [
"tflite_demo"
]
[workspace.dependencies]
cortex-m = { version = "0.7.7", features = ["critical-section-single-core", "inline-asm"] }
cortex-m-rt = "0.7.2"
nrf52840-hal = "0.16.0"
usb-device = "0.2.7"
usbd-serial = "0.1.0"
microflow = { path = "../microflow-rs" }
# microflow = "0.1.3"
nalgebra = { version = "0.33.2", default-features = false, features = ["macros"] }
libm = "0.2"
panic-halt = "1.0.0"
heapless = "0.8.0"

1
README.md Normal file
View File

@ -0,0 +1 @@
# xiao_pet_tracker_rust

6
build.rs Normal file
View File

@ -0,0 +1,6 @@
fn main() {
// Rebuild if memory.x file was rebuild.
// Linker seems to pick it up automatically.
// (via the include in link.x which is added with a linker argument!)
println!("cargo:rerun-if-changed=memory.x");
}

20
build_and_flash.sh Executable file
View File

@ -0,0 +1,20 @@
#!/bin/bash
set -e
COM_PORT=/dev/cu.usbmodem1101
while getopts 'abc:h' opt; do
case "$opt" in
?|h)
echo "Usage: $(basename $0) crate_name"
exit 1
;;
esac
done
shift "$(($OPTIND -1))"
CRATE=$1
cargo build -p $CRATE --release
arm-none-eabi-objcopy -O ihex target/thumbv7em-none-eabihf/release/$CRATE target/$CRATE.hex
adafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0x0123 --application target/$CRATE.hex target/$CRATE.zip
adafruit-nrfutil --verbose dfu serial -pkg target/$CRATE.zip -p $COM_PORT -b 115200 --singlebank

15
flashing_time.py Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env python
from subprocess import run
# requires pySerial:
# python -m pip install pyserial
import serial
# grab the port for the seeed nrf52 (only connect one at a time)
data = run("ls /dev/ | grep 'cu.usbmodem'", capture_output=True, shell=True, text=True)
ser = serial.Serial("/dev/" + data.stdout.strip(), 1200)
# send 16 null characters as reset signal to enter the bootloader
ser.write(b"\x00" * 16)
ser.close()

18
memory.x Normal file
View File

@ -0,0 +1,18 @@
MEMORY
{
/* Need to leave space for the SoftDevice
These values are confirmed working for S140 7.3.0
They were extracted from the Arduino IDE plugin linked indirectly at https://wiki.seeedstudio.com/XIAO_BLE/
*/
FLASH (rx) : ORIGIN = 0x27000, LENGTH = 0xED000 - 0x27000
/* SRAM required by Softdevice depend on
* - Attribute Table Size (Number of Services and Characteristics)
* - Vendor UUID count
* - Max ATT MTU
* - Concurrent connection peripheral + central + secure links
* - Event Len, HVN queue, Write CMD queue
*/
RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000
}

17
tflite_demo/Cargo.toml Normal file
View File

@ -0,0 +1,17 @@
[package]
name = "tflite_demo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cortex-m.workspace = true
cortex-m-rt.workspace = true
nrf52840-hal.workspace = true
usb-device.workspace = true
usbd-serial.workspace = true
microflow.workspace = true
libm.workspace = true
nalgebra.workspace = true
heapless.workspace = true

Binary file not shown.

View File

@ -0,0 +1,24 @@
use alloc::alloc::*;
/// The global allocator type.
#[derive(Default)]
pub struct Allocator;
unsafe impl GlobalAlloc for Allocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
malloc(layout.size() as u32) as *mut u8
}
unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
free(ptr as *mut c_void);
}
}
/// If there is an out of memory error, just panic.
#[alloc_error_handler]
fn my_allocator_error(_layout: Layout) -> ! {
panic!("out of memory");
}
/// The static global allocator.
#[global_allocator]
static GLOBAL_ALLOCATOR: Allocator = Allocator;

130
tflite_demo/src/main.rs Normal file
View File

@ -0,0 +1,130 @@
#![no_main]
#![no_std]
use hal::prelude::*;
use nrf52840_hal as hal;
use usb_device::class_prelude::UsbBusAllocator;
use core::fmt::Write;
use hal::Rtc;
use libm::sinf;
use microflow::model;
use nalgebra::matrix;
use heapless::String;
#[panic_handler] // panicking behavior
fn panic(_: &core::panic::PanicInfo) -> ! {
reset_into_dfu();
}
#[model("tflite_demo/models/sine.tflite")]
struct Sine;
/// Resets the device into Device Firmware Update mode (DFU).
fn reset_into_dfu() -> ! {
// Via https://devzone.nordicsemi.com/f/nordic-q-a/50839/start-dfu-mode-or-open_bootloader-from-application-by-function-call
unsafe { (*hal::pac::POWER::PTR).gpregret.write(|w| w.bits(0xB1)) };
hal::pac::SCB::sys_reset();
}
#[derive(Clone, Copy)]
enum LightState {
Red = 0,
Green = 1,
Blue = 2,
}
#[cortex_m_rt::entry]
fn main() -> ! {
let peripherals = hal::pac::Peripherals::take().unwrap();
let port0 = hal::gpio::p0::Parts::new(peripherals.P0);
let mut led_red = port0.p0_26.into_push_pull_output(hal::gpio::Level::Low);
let mut led_green = port0.p0_30.into_push_pull_output(hal::gpio::Level::Low);
let mut led_blue = port0.p0_06.into_push_pull_output(hal::gpio::Level::Low);
let clocks = hal::clocks::Clocks::new(peripherals.CLOCK);
let clocks = clocks.enable_ext_hfosc();
let usb_peripheral = hal::usbd::UsbPeripheral::new(peripherals.USBD, &clocks);
let usb_bus = UsbBusAllocator::new(hal::usbd::Usbd::new(usb_peripheral));
let mut serial_port = usbd_serial::SerialPort::new(&usb_bus);
let rtc = Rtc::new(peripherals.RTC0, 0).unwrap();
rtc.enable_counter();
let mut usb_device = usb_device::device::UsbDeviceBuilder::new(
&usb_bus,
usb_device::device::UsbVidPid(0x16c0, 0x27dd),
)
.manufacturer("Wumpftech")
.product("Wumpftech nRF52840")
.serial_number("wumpf1")
.device_class(usbd_serial::USB_CLASS_CDC)
.max_packet_size_0(64) // makes control transfers 8x faster says https://github.com/nrf-rs/nrf-hal/blob/master/examples/usb/src/bin/serial.rs
.build();
let x = 0.5;
let start = rtc.get_counter();
let y_predicted = Sine::predict(matrix![x])[0];
let end = rtc.get_counter();
let y_exact = sinf(x);
// TIMER0 is reserved by Softdevice
// https://devzone.nordicsemi.com/f/nordic-q-a/1160/soft-device-and-timers---how-do-they-work-together
let mut timer = hal::Timer::new(peripherals.TIMER1).into_periodic();
timer.start(hal::Timer::<hal::pac::TIMER0>::TICKS_PER_SECOND);
let mut light = LightState::Red;
loop {
light = match light {
LightState::Red => LightState::Green,
LightState::Green => LightState::Blue,
LightState::Blue => LightState::Red,
};
match light {
LightState::Red => {
led_red.set_state(PinState::Low).unwrap();
led_green.set_state(PinState::High).unwrap();
led_blue.set_state(PinState::High).unwrap();
}
LightState::Green => {
led_red.set_state(PinState::High).unwrap();
led_green.set_state(PinState::Low).unwrap();
led_blue.set_state(PinState::High).unwrap();
}
LightState::Blue => {
// led_red.set_state(PinState::High).unwrap();
// led_green.set_state(PinState::High).unwrap();
// led_blue.set_state(PinState::Low).unwrap();
//reset_into_dfu();
}
}
let text = y_predicted.to_bits();
let mut data = String::<32>::new();
let text2 = y_exact.to_bits();
let mut data2 = String::<32>::new();
let _ = serial_port.write("Hello World\n".as_bytes());
let _ = serial_port.write("Predicted Y: ".as_bytes());
let _ = write!(data, "data:{text}");
let _ = serial_port.write(data.as_bytes());
let _ = serial_port.write("\n".as_bytes());
let _ = serial_port.write("Exact Y: ".as_bytes());
let _ = write!(data2, "data:{text2}");
let _ = serial_port.write(data2.as_bytes());
let _ = serial_port.write("\n".as_bytes());
while timer.wait().is_err() {
// TODO: sleep.
// Spec says poll needs to be called at least every 10ms.
usb_device.poll(&mut [&mut serial_port]);
continue;
}
}
}