spell check
This commit is contained in:
@@ -60,7 +60,7 @@ pub struct Leds<'a,
|
||||
pub orange: &'a mut OT,
|
||||
pub blue: &'a mut BT,
|
||||
|
||||
// phantom data to convince rustc the generics RP, GP and BP are used.
|
||||
// phantom data to convince rustc the generics RP, GP, OP and BP are used.
|
||||
_r: PhantomData<RP>,
|
||||
_g: PhantomData<GP>,
|
||||
_o: PhantomData<OP>,
|
||||
|
||||
@@ -16,17 +16,16 @@ auther:
|
||||
> het boek. Er zijn drie toestanden: rood, groen en oranje. Tussen de toestanden
|
||||
> wordt geschakeld op basis van tijd: respectievelijk $4s$, $3s$ en $1s$.
|
||||
|
||||
De State Pattern methode in rust maakt gebruik van structs en traits. Om dit
|
||||
De State Pattern-methode in Rust maakt gebruik van structs en traits. Om dit
|
||||
mogelijk te maken moet er een struct zijn die de leds kan aansturen. Hiervoor
|
||||
is het de Pin struct van de stm32f4xx-hal nodig in in struct. Om mijn
|
||||
implementatie makkelijker onderhoudbaar te maken worden de Pin structs
|
||||
doorgegeven aan de state machine struct. Hiervoor is een triad nodig die
|
||||
functions voor het aanpassen van de led status beschrijft. De `toggle` functie
|
||||
is het de `struct Pin` van de stm32f4xx-hal nodig in de struct. Om mijn
|
||||
implementatie makkelijker onderhoudbaar te maken, worden de `struct Pin`'s
|
||||
doorgegeven aan de `struct StateMachine`. Hiervoor is een trait nodig die
|
||||
functies voor het aanpassen van de led-status beschrijft. De `toggle`-functie
|
||||
die gebruikt wordt in het voorbeeld is niet geïmplementeerd via een trait.
|
||||
Deze kan dus niet gebruikt worden zonder de hal aan te passen. In de
|
||||
documentatie van de pin struct implementeert die de OutputPin trait van de
|
||||
embedded_hal crate^[https://docs.rs/stm32f4xx-hal/0.22.0/stm32f4xx_hal/gpio/struct.Pin.html#impl-OutputPin-for-Pin%3CP,+N,+Output%3CMODE%3E%3E-1]. Dus deze crate is toegevoegd aan het project zodat hier
|
||||
gebruik van gemaakt kan worden.
|
||||
documentatie van de `struct Pin` implementeert die de `trait OutputPin` van de
|
||||
embedded_hal crate^[https://docs.rs/stm32f4xx-hal/0.22.0/stm32f4xx_hal/gpio/struct.Pin.html#impl-OutputPin-for-Pin%3CP,+N,+Output%3CMODE%3E%3E-1]. Dus deze crate is toegevoegd aan het project, zodat hier gebruik van gemaakt kan worden.
|
||||
|
||||
Om te testen of dit werkt is er een struct aangemaakt met een simple toggle
|
||||
functie en de embeded_hal geïmporteerd. Dit is gedaan met de volgende code:
|
||||
@@ -68,7 +67,7 @@ impl<'a, Red: OutputPin, Green: OutputPin, Orange: OutputPin> Leds<'a, Red, Gree
|
||||
}
|
||||
```
|
||||
|
||||
Daarnaast is ook de main functie aangepast naar het volgende:
|
||||
Daarnaast is ook de `fn main()` aangepast naar het volgende:
|
||||
|
||||
```rust
|
||||
#[entry]
|
||||
@@ -108,12 +107,12 @@ fn main() -> ! {
|
||||
}
|
||||
```
|
||||
|
||||
### state machine
|
||||
### Statemachine
|
||||
|
||||
De state machine is geïmplementeerd in zijn eigen struct. In the rust boek wordt
|
||||
er gebruikt gemaakt van `Box` van de std library, maar deze zit niet in de core
|
||||
library. Ik heb dit vervangen met een enum. Het nadeel is dat functies niet meer
|
||||
dynamisch aangeroepen kunnen worden. Om hier toch makkelijk mee om te gaan is de volgende functie aangemaakt die het juiste object van de enum pakt en diens functie aanroept.
|
||||
De statemachine is geïmplementeerd in zijn eigen struct. In het Rust boek wordt
|
||||
er is gebruikgemaakt van `Box` van de std library, maar deze zit niet in de core
|
||||
library. Ik heb dit vervangen door een enum. Het nadeel is dat functies niet meer
|
||||
dynamisch aangeroepen kunnen worden. Om hier toch makkelijk mee om te gaan, is de volgende functie aangemaakt die het juiste object van de enum pakt en diens functie aanroept.
|
||||
|
||||
De statemachine struct is als volgt geïmplementeerd in het bestand `state_machine.rs`.
|
||||
|
||||
@@ -171,9 +170,9 @@ impl<'a,
|
||||
|
||||
### Leds en Toggle
|
||||
|
||||
Als te zien is in de state machine code is er gebruikgemaakt van een struct `Leds` die andere generics gebruikt als eerder. Dit is een geupdaten variant hiervan. De vorige versie had 1 trait met herhalende function voor elke led. Deze functies zijn nu elke gedefinieerd in de `trait Toggle`. De toggle functie waar het concept is getest is eigenlijk niet nodig voor deze opdracht, maar ik vond het een leuke uitdaging om dit er in te houden, gezien Rust beveiligingen heeft die ervoor zorgt dat een pin niet gebruikt kan worden zonder toegang tot een specifiek object. Dit zorgt er voor dat dat object kan bijhouden wat de laatste status van de pin is en dus de toggle altijd werkt zonder de status van de pin uit te lezen.
|
||||
Als te zien is in de statemachine code is er gebruikgemaakt van een struct `Leds` die andere generics gebruikt als eerder. Dit is een geüpdatete variant hiervan. De vorige versie had 1 trait met herhalende functie voor elke led. Deze functies zijn nu gedefinieerd in de `trait Toggle`. De toggle functie waar het concept is getest, is eigenlijk niet nodig voor deze opdracht, maar ik vond het een leuke uitdaging om dit erin te houden, aangezien Rust beveiligingen heeft die ervoor zorgen dat een pin niet gebruikt kan worden zonder toegang tot een specifiek object. Dit zorgt ervoor dat het object kan bijhouden wat de laatste status van de pin is en dus de toggle altijd werkt zonder de status van de pin uit te lezen.
|
||||
|
||||
De toggle functie is implemented in `leds.rs`
|
||||
De toggle functie is geïmplementeerd in `leds.rs`
|
||||
|
||||
```rust
|
||||
use embedded_hal::digital::{OutputPin, PinState};
|
||||
@@ -228,9 +227,9 @@ impl<'a, T: OutputPin> Toggle<T> for ToggleLed<'a, T> {
|
||||
// ...
|
||||
```
|
||||
|
||||
De `struct Leds` was wat lastiger wegens een bug in Rust^[[github.com/rust-lang/rust/issues/60214](https://github.com/rust-lang/rust/issues/60214)]. De Leds struct gebruikt een generic voor de `trait Toggl<T>`. Maar deze trait heeft ook een generic. Deze kan alleen ingevuld worden door met een struct, dus `T: Toggle<DigitalPin>` heeft een error. Een oplossing hiervoor is een extra generic (`P: OutputPin, T: Toggle<P>`), echter de generic `P` wordt verder nergens gebruikt. De compiler detecteert het gebruik niet in `Toggle<P>`. en geeft een error hiervoor. Een workaround voor dit is door een extra element toe te voegen aan de struct met met type `PhantomData<P>`.
|
||||
De `struct Leds` was wat lastiger wegens een bug in Rust^[[github.com/rust-lang/rust/issues/60214](https://github.com/rust-lang/rust/issues/60214)]. De `struct Leds` gebruikt een generic voor de `trait Toggl<T>`. Maar deze trait heeft ook een generic. Deze kan alleen ingevuld worden door met een struct, dus `T: Toggle<DigitalPin>` heeft een error. Een oplossing hiervoor is een extra generic (`P: OutputPin, T: Toggle<P>`), echter de generic `P` wordt verder nergens gebruikt. De compiler detecteert het gebruik niet in `Toggle<P>`. En geeft een error hiervoor. Een workaround voor dit is door een extra element toe te voegen aan de struct met type `PhantomData<P>`.
|
||||
|
||||
Met deze workaround toegepast de `struct Leds` is als volgt geïmplementeerd in `leds.rs`
|
||||
Met deze workaround toegepast is de `struct Leds` als volgt geïmplementeerd in `leds.rs`
|
||||
|
||||
```rust
|
||||
// ...
|
||||
@@ -276,7 +275,7 @@ impl<'a,
|
||||
|
||||
### states
|
||||
|
||||
De states zijn geimplementeerd in `state_machine.rs`
|
||||
De states zijn geïmplementeerd in `state_machine.rs`
|
||||
|
||||
```rust
|
||||
// ...
|
||||
@@ -420,21 +419,23 @@ fn main() -> ! {
|
||||
|
||||
> Voeg nu een toestand toe waarbij de blauwe “User” knop aangeeft dat de brug open wilt gaan. Vanuit de rode toestand moet dan naar een andere toestand (brug-open?) worden gesprongen. Wanneer de knop wordt losgelaten springt brug-open naar de rode toestand. In de brug-open-toestand moet de rode led knipperen. Dit knipperen moet elke met een periodetijd van $2s$ ($2s$ aan, $1s$ uit).
|
||||
|
||||
Om deze aanpassing te doen motten de volgende onderdelen aangepast worden:
|
||||
Om deze aanpassing te doen, moeten de volgende onderdelen aangepast worden:
|
||||
|
||||
- blue led initialiseren en toevoegen aan `struct Leds` en alle plekken waar deze gebuikt wordt
|
||||
- blue led initialiseren en toevoegen aan `struct Leds` en alle plekken waar deze gebruikt wordt
|
||||
- knop initialiseren
|
||||
- functies toevoegen voor de knop `trait State` en alle implementaties ervan
|
||||
- de state `BridgeOpen` toevoegen aan:
|
||||
- `enum States`
|
||||
- de tussenfuncties in `struct StateMachine`
|
||||
- nieuwe `struct StateBridgeOpen`
|
||||
- uitlezen van de knop een aanroepen van de nieuwe functies in `trait State`
|
||||
- uitlezen van de knop en aanroepen van de nieuwe functies in `trait State`
|
||||
- de `struct StateRed` aanpassen voor de nieuwe logica
|
||||
- logica toevoegen aan `struct StateBridgeOpen`
|
||||
|
||||
### resultaat
|
||||
|
||||
Ook beschikbaar op [git.gay/LailaTheElf/rts10_reports/src/branch/main/report-3/rts10_rust](https://git.gay/LailaTheElf/RTS10_reports/src/branch/main/report-3/rts10_rust).
|
||||
|
||||
#### leds.rs
|
||||
|
||||
```rust
|
||||
@@ -500,7 +501,7 @@ pub struct Leds<'a,
|
||||
pub orange: &'a mut OT,
|
||||
pub blue: &'a mut BT,
|
||||
|
||||
// phantom data to convince rustc the generics RP, GP and BP are used.
|
||||
// phantom data to convince rustc the generics RP, GP, OP and BP are used.
|
||||
_r: PhantomData<RP>,
|
||||
_g: PhantomData<GP>,
|
||||
_o: PhantomData<OP>,
|
||||
|
||||
Reference in New Issue
Block a user