# vex-rt meeting 5/24/21
## Topics
1. Async Conversion
- List of stuff to change
- Examples?
2. Architecture of system
## Units
- Expose public use for crate
## Async
- Break up vex stuff into writable and readable
- Motors break up
- Writable not `Clone`, takes `&mut self`
- No reverse at runtime, only on construction
- Readable `Clone`, takes `&self`
- Sensors don't
- Only spawn tasks through `spawn_blocking`
- Returns Result that shows panic state
## Architecture
- Bypass competition scheduler
- Don't let `initialize` return
- Use race future to go between competition states
- Disabled
- Op control
- Autonomous
- VEXAI is...a future issue
- Make `spawn_blocking` generate a task with `ShouldFinish`
## Math stuff (sin, cos)
- Hard
- Use intrinsics
## Panic-ing
- For worker tasks, mark as panicked and kill self
- For main task, kill program
- Make sure lo log with worst level ever
- Make sure it's painful to panic
## Display
- Use sdk for printing panics (vexDisplayVStringAt - see header for args)
### `embedded-graphics`
- Remove clearing the buffer after draw calls, make it optional using `embedded-graphics` clear
- New task
- In peripherals need display object, `embedded-graphics` needs to `From` that
- Pass buffer as owned to task and return back with future
### Direct SDK Calls
- New task
- Queue of calls
- Queue up a bunch and only await on the commit?
- Take reference from [here](https://github.com/purduesigbots/pros/blob/feature/remove-lvgl/src/display/graphics.c)
```rust=
fn sdk_call<T: Send>(&'a mut self, func: impl FnOnce(&mut Sdk) -> T + Send + 'static) -> impl Future<Output=Result<T, ()>> + Send + 'a{
async{
Err(())
}
}
let f = screen.sdk_call(move |sdk| {
sdk.clear();
sdk.foo();
});
//screen.sdk_call(...);
f.await;
```
### Other
- Low level display wrapper (Directly call SDK functions)
- LLEMU