Compare commits

..

No commits in common. "ceb4dc035f0e6dc22654ce45be249b791c71fcd4" and "cfd7b79eac6e775dafd84698ea5ab6816647964d" have entirely different histories.

11 changed files with 605 additions and 509 deletions

1005
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -5,23 +5,22 @@ edition = "2021"
[dependencies] [dependencies]
anyhow = "1.0.83" anyhow = "1.0.83"
axum = { version = "0.8.8", features = ["macros"] } axum = { version = "0.7.5", features = ["macros"] }
fern = { version = "0.7.1", features = ["colored"] } fern = { version = "0.6.2", features = ["colored"] }
humantime = "2.1.0" humantime = "2.1.0"
log = "0.4.21" log = "0.4.21"
nom = "8.0.0" nom = "7.1.3"
serde_json = "1.0.118" serde_json = "1.0.118"
serialport = "4.5.1" serialport = "4.5.1"
tokio = {version = "1.37.0", features = ["full"]} tokio = {version = "1.37.0", features = ["full"]}
tower-http = { version = "0.6.8", features = ["fs", "trace"] } tower-http = { version = "0.5.2", features = ["fs", "trace"] }
radomctl-protocol = { path = "../protocol" } radomctl-protocol = { path = "../protocol" }
postcard = {version = "1.0.10", features = ["use-std"]} postcard = {version = "1.0.10", features = ["use-std"]}
dfu-libusb = "0.5.5" dfu-libusb = "0.3.0"
rusb = "0.9" rusb = "0.9"
clap = { version = "4.5.19", features = ["derive"] } clap = { version = "4.5.19", features = ["derive"] }
indicatif = "0.18.3" indicatif = "0.17.8"
tokio-serial = {version = "5.4.4", features = ["codec", "rt"] } tokio-serial = {version = "5.4.4", features = ["codec", "rt"] }
tokio-util = { version = "0.7.13", features = ["codec", "rt"] } tokio-util = { version = "0.7.13", features = ["codec", "rt"] }
bytes = "1.9.0" bytes = "1.9.0"
futures = "0.3.31" futures = "0.3.31"
nom-language = "0.1.0"

View file

@ -7,8 +7,9 @@ use std::{
use anyhow::{anyhow, Context}; use anyhow::{anyhow, Context};
use clap::Parser; use clap::Parser;
use dfu_libusb::{Dfu, DfuLibusb}; use dfu_libusb::{Dfu, DfuLibusb};
use postcard::to_stdvec_cobs; use postcard::{from_bytes_cobs, to_stdvec_cobs};
use radomctl_protocol::*; use radomctl_protocol::*;
use radomctld::logger::setup_logger;
#[derive(Parser)] #[derive(Parser)]
struct Cli { struct Cli {

View file

@ -1,5 +1,7 @@
use anyhow::Result; use anyhow::Result;
use fern::colors::{Color, ColoredLevelConfig}; use fern::colors::{Color, ColoredLevelConfig};
use log::{debug, error, info, warn};
use std::io;
pub fn setup_logger() -> Result<()> { pub fn setup_logger() -> Result<()> {
let colors = ColoredLevelConfig::new() let colors = ColoredLevelConfig::new()

View file

@ -1,9 +1,17 @@
use anyhow::anyhow;
use anyhow::Result; use anyhow::Result;
use axum::{extract::State, routing::get, Json, Router}; use anyhow::{anyhow, Context};
use axum::{
extract::State,
http::StatusCode,
routing::{get, post},
Json, Router,
};
use clap::Parser; use clap::Parser;
use log::{debug, error, info}; use fern::colors::{Color, ColoredLevelConfig};
use log::{debug, error, info, warn, Level};
use serde_json::{json, Value}; use serde_json::{json, Value};
use std::time::Duration;
use std::{borrow::Borrow, io};
use tokio::{ use tokio::{
self, self,
io::{AsyncBufReadExt, AsyncWriteExt, BufStream}, io::{AsyncBufReadExt, AsyncWriteExt, BufStream},
@ -12,7 +20,10 @@ use tokio::{
task::JoinSet, task::JoinSet,
}; };
use tokio_serial; use tokio_serial;
use tower_http::{services::ServeFile, trace::TraceLayer}; use tower_http::{
services::{ServeDir, ServeFile},
trace::TraceLayer,
};
use radomctld::{ use radomctld::{
logger::setup_logger, logger::setup_logger,
@ -23,7 +34,7 @@ use radomctld::{
async fn process_socket( async fn process_socket(
socket: TcpStream, socket: TcpStream,
cmd_tx: mpsc::Sender<Command>, cmd_tx: mpsc::Sender<Command>,
pos_rx: watch::Receiver<(f32, f32)>, mut pos_rx: watch::Receiver<(f32, f32)>,
) { ) {
let mut stream = BufStream::new(socket); let mut stream = BufStream::new(socket);

View file

@ -4,14 +4,13 @@ use nom::{
character::complete::{ character::complete::{
alphanumeric1, i8, multispace0, multispace1, newline, none_of, not_line_ending, space1, alphanumeric1, i8, multispace0, multispace1, newline, none_of, not_line_ending, space1,
}, },
combinator::{all_consuming, map, opt, recognize}, combinator::{all_consuming, map, opt, recognize, rest},
error::context, error::{context, convert_error, VerboseError},
multi::many1, multi::{many0, many1},
number::complete::float, number::complete::float,
sequence::{preceded, separated_pair, terminated}, sequence::{preceded, separated_pair, terminated},
Err as NomErr, IResult, Parser, Err as NomErr, IResult, Parser,
}; };
use nom_language::error::{convert_error, VerboseError};
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub enum Command { pub enum Command {

View file

@ -1,19 +1,22 @@
use anyhow::Result; use anyhow::Result;
use bytes::{BufMut, BytesMut}; use bytes::{BufMut, BytesMut};
use futures::{stream::StreamExt, SinkExt}; use futures::{stream::StreamExt, SinkExt};
use log::{debug, error, info, warn};
use postcard::{from_bytes_cobs, to_stdvec_cobs}; use postcard::{from_bytes_cobs, to_stdvec_cobs};
use radomctl_protocol::{HostMessage, PositionTarget, RadomMessage}; use radomctl_protocol::{HostMessage, PositionTarget, RadomMessage};
use std::{io, time::Duration}; use std::{env, io, str, time::Duration};
use tokio::time::sleep;
use tokio::{ use tokio::{
self, self,
io::AsyncBufReadExt, io::{AsyncBufReadExt, AsyncWriteExt, BufStream},
sync::{mpsc, watch}, net::{TcpListener, TcpStream},
sync::{self, mpsc, watch},
time, time,
}; };
use tokio_serial::SerialPortBuilderExt; use tokio_serial::SerialPortBuilderExt;
use tokio_util::codec::{Decoder, Encoder}; use tokio_util::codec::{Decoder, Encoder};
use crate::rotctlprotocol::Command; use crate::rotctlprotocol::{parse_command, Command};
struct ProtocolCodec; struct ProtocolCodec;

View file

@ -5,25 +5,25 @@ version = "0.1.0"
[dependencies] [dependencies]
cortex-m = { version = "0.7", features = ["critical-section-single-core"] } cortex-m = { version = "0.7", features = ["critical-section-single-core"] }
defmt = { version = "1.0", features = ["encoding-rzcobs"] } defmt = { version = "0.3", features = ["encoding-rzcobs"] }
defmt-brtt = { version = "0.1", default-features = false, features = ["rtt"] } defmt-brtt = { version = "0.1", default-features = false, features = ["rtt"] }
panic-probe = { version = "1.0", features = ["print-defmt"] } panic-probe = { version = "0.3", features = ["print-defmt"] }
rtic = { version = "2.0.1", features = [ "thumbv7-backend" ] } rtic = { version = "2.0.1", features = [ "thumbv7-backend" ] }
defmt-rtt = "1.1" defmt-rtt = "0.4"
stm32f4xx-hal = { version = "0.23.0", features = ["stm32f401", "usb_fs"] } stm32f4xx-hal = { version = "0.21.0", features = ["stm32f401", "usb_fs"] }
embedded-hal = {version = "1.0.0"} embedded-hal = {version = "1.0.0"}
nb = "1.0.0" nb = "1.0.0"
num-traits = { version = "0.2", default-features = false, features = ["libm"] } num-traits = { version = "0.2", default-features = false, features = ["libm"] }
num = {version = "0.4", default-features = false} num = {version = "0.4", default-features = false}
ufmt = "0.2.0" ufmt = "0.2.0"
qmc5883l = {version = "0.0.1", git="https://github.com/patrickelectric/qmc5883l", rev="62b8a64b54e0f843ddf0c5942f8ed218b5f3e492"} qmc5883l = "0.0.1"
rtic-monotonics = {version = "2.0.2", features = ["cortex-m-systick"]} rtic-monotonics = {version = "2.0.2", features = ["cortex-m-systick"]}
xca9548a = "1.0.0" xca9548a = "0.2.1"
as5048a = { git = "https://github.com/LongHairedHacker/as5048a", rev="b15d716bf47ce4975a6cefebf82006c9b09e8fea"} as5048a = { git = "https://github.com/LongHairedHacker/as5048a", rev="b15d716bf47ce4975a6cefebf82006c9b09e8fea"}
usb-device = "0.3.2" usb-device = "0.3.2"
usbd-serial = "0.2.2" usbd-serial = "0.2.2"
postcard = {version = "1.0.10", features = ["use-defmt"]} postcard = {version = "1.0.10", features = ["use-defmt"]}
heapless = {version = "0.9.2", features = ["defmt"]} heapless = {version = "0.8.0", features = ["defmt-03"]}
radomctl-protocol = { path = "../protocol" } radomctl-protocol = { path = "../protocol" }

View file

@ -1,4 +1,4 @@
use core::mem::MaybeUninit; use core::{mem::MaybeUninit, ptr::addr_of_mut};
use stm32f4xx_hal::pac; use stm32f4xx_hal::pac;
@ -9,7 +9,7 @@ fn jump_to_bootloader() {
let address: u32 = 0x1FFF0000; let address: u32 = 0x1FFF0000;
let device = pac::Peripherals::steal(); let device = pac::Peripherals::steal();
device.SYSCFG.memrmp().modify(|_, w| w.bits(0x01)); device.SYSCFG.memrm.modify(|_, w| w.bits(0x01));
let mut p = cortex_m::Peripherals::steal(); let mut p = cortex_m::Peripherals::steal();
p.SCB.invalidate_icache(); p.SCB.invalidate_icache();

View file

@ -33,7 +33,6 @@ mod app {
otg_fs::{UsbBus, UsbBusType, USB}, otg_fs::{UsbBus, UsbBusType, USB},
pac::{I2C1, SPI1}, pac::{I2C1, SPI1},
prelude::*, prelude::*,
rcc::Config,
signature, spi, signature, spi,
}; };
use usb_device::prelude::*; use usb_device::prelude::*;
@ -94,19 +93,26 @@ mod app {
bootloader::init(); bootloader::init();
defmt::info!("init"); defmt::info!("init");
let mut rcc = cx
.device
.RCC
.freeze(Config::hse(25.MHz()).sysclk(84.MHz()).require_pll48clk());
Mono::start(cx.core.SYST, rcc.clocks.sysclk().to_Hz()); let rcc = cx.device.RCC.constrain();
// Freeze the configuration of all the clocks in the system and store the frozen frequencies in
// `clocks`
let clocks = rcc
.cfgr
.use_hse(25.MHz())
.sysclk(84.MHz())
.require_pll48clk()
.freeze();
Mono::start(cx.core.SYST, clocks.sysclk().to_Hz());
defmt::info!("Clock Setup done"); defmt::info!("Clock Setup done");
// Acquire the GPIO peripherials // Acquire the GPIO peripherials
let gpioa = cx.device.GPIOA.split(&mut rcc); let gpioa = cx.device.GPIOA.split();
let gpiob = cx.device.GPIOB.split(&mut rcc); let gpiob = cx.device.GPIOB.split();
let gpioc = cx.device.GPIOC.split(&mut rcc); let gpioc = cx.device.GPIOC.split();
let board_led = gpioc.pc13.into_push_pull_output(); let board_led = gpioc.pc13.into_push_pull_output();
@ -122,7 +128,7 @@ mod app {
cx.device.OTG_FS_PWRCLK, cx.device.OTG_FS_PWRCLK,
), ),
(gpioa.pa11, gpioa.pa12), (gpioa.pa11, gpioa.pa12),
&rcc.clocks, &clocks,
); );
unsafe { unsafe {
@ -171,7 +177,7 @@ mod app {
i2c::Mode::Standard { i2c::Mode::Standard {
frequency: 400.kHz(), frequency: 400.kHz(),
}, },
&mut rcc, &clocks,
); );
defmt::info!("I2C Setup done"); defmt::info!("I2C Setup done");
@ -195,13 +201,13 @@ mod app {
let pico = gpioa.pa7.into_push_pull_output(); let pico = gpioa.pa7.into_push_pull_output();
let spi1 = spi::Spi::new( let spi1 = spi::Spi::new(
cx.device.SPI1, cx.device.SPI1,
(Some(sck), Some(poci), Some(pico)), (sck, poci, pico),
spi::Mode { spi::Mode {
polarity: spi::Polarity::IdleLow, polarity: spi::Polarity::IdleLow,
phase: spi::Phase::CaptureOnSecondTransition, phase: spi::Phase::CaptureOnSecondTransition,
}, },
8.MHz(), 8.MHz(),
&mut rcc, &clocks,
); );
defmt::info!("SPI Setup done"); defmt::info!("SPI Setup done");

View file

@ -7,4 +7,4 @@ edition = "2021"
[dependencies] [dependencies]
serde = {version = "1.0.193", default-features = false, features = ["derive"]} serde = {version = "1.0.193", default-features = false, features = ["derive"]}
heapless = {version = "0.9.2", features = ["serde"]} heapless = {version = "0.8.0", features = ["serde"]}