spell check

This commit is contained in:
2025-10-30 17:14:47 +01:00
parent 613f7f460f
commit a0547743e7
2 changed files with 28 additions and 27 deletions

View File

@@ -60,7 +60,7 @@ pub struct Leds<'a,
pub orange: &'a mut OT, pub orange: &'a mut OT,
pub blue: &'a mut BT, 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>, _r: PhantomData<RP>,
_g: PhantomData<GP>, _g: PhantomData<GP>,
_o: PhantomData<OP>, _o: PhantomData<OP>,

View File

@@ -16,17 +16,16 @@ auther:
> het boek. Er zijn drie toestanden: rood, groen en oranje. Tussen de toestanden > het boek. Er zijn drie toestanden: rood, groen en oranje. Tussen de toestanden
> wordt geschakeld op basis van tijd: respectievelijk $4s$, $3s$ en $1s$. > 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 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 is het de `struct Pin` van de stm32f4xx-hal nodig in de struct. Om mijn
implementatie makkelijker onderhoudbaar te maken worden de Pin structs implementatie makkelijker onderhoudbaar te maken, worden de `struct Pin`'s
doorgegeven aan de state machine struct. Hiervoor is een triad nodig die doorgegeven aan de `struct StateMachine`. Hiervoor is een trait nodig die
functions voor het aanpassen van de led status beschrijft. De `toggle` functie 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. 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 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 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 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.
gebruik van gemaakt kan worden.
Om te testen of dit werkt is er een struct aangemaakt met een simple toggle 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: 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 ```rust
#[entry] #[entry]
@@ -108,14 +107,14 @@ fn main() -> ! {
} }
``` ```
### state machine ### Statemachine
De state machine is geïmplementeerd in zijn eigen struct. In the rust boek wordt De statemachine is geïmplementeerd in zijn eigen struct. In het Rust boek wordt
er gebruikt gemaakt van `Box` van de std library, maar deze zit niet in de core er is gebruikgemaakt 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 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. 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 state machine struct is als volgt geïmplementeerd in het bestand `state_machine.rs`. De statemachine struct is als volgt geïmplementeerd in het bestand `state_machine.rs`.
```rust ```rust
use embedded_hal::digital::{OutputPin, PinState}; use embedded_hal::digital::{OutputPin, PinState};
@@ -171,9 +170,9 @@ impl<'a,
### Leds en Toggle ### 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 ```rust
use embedded_hal::digital::{OutputPin, PinState}; 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 ```rust
// ... // ...
@@ -276,7 +275,7 @@ impl<'a,
### states ### states
De states zijn geimplementeerd in `state_machine.rs` De states zijn geïmplementeerd in `state_machine.rs`
```rust ```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). > 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 - knop initialiseren
- functies toevoegen voor de knop `trait State` en alle implementaties ervan - functies toevoegen voor de knop `trait State` en alle implementaties ervan
- de state `BridgeOpen` toevoegen aan: - de state `BridgeOpen` toevoegen aan:
- `enum States` - `enum States`
- de tussen functies in `struct StateMachine` - de tussenfuncties in `struct StateMachine`
- nieuwe `struct StateBridgeOpen` - 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 - de `struct StateRed` aanpassen voor de nieuwe logica
- logica toevoegen aan `struct StateBridgeOpen` - logica toevoegen aan `struct StateBridgeOpen`
### resultaat ### 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 #### leds.rs
```rust ```rust
@@ -500,7 +501,7 @@ pub struct Leds<'a,
pub orange: &'a mut OT, pub orange: &'a mut OT,
pub blue: &'a mut BT, 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>, _r: PhantomData<RP>,
_g: PhantomData<GP>, _g: PhantomData<GP>,
_o: PhantomData<OP>, _o: PhantomData<OP>,
@@ -835,4 +836,4 @@ fn main() -> ! {
loop {} loop {}
} }
``` ```