Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add serial control #34

Merged
merged 18 commits into from
Jun 11, 2020
Merged

Add serial control #34

merged 18 commits into from
Jun 11, 2020

Conversation

dsferruzza
Copy link
Member

@dsferruzza dsferruzza commented May 31, 2020

  • do actual effects when receiving control message
  • check that nothing breaks too much when storming the serial with correct messages
  • check that nothing breaks too much when storming the serial with random bytes
  • check that messages with incorrect CRC are discarded
  • add ACK telemetry messages
  • handle every setting
  • send ACK messages when updating settings with motherboard buttons

@dsferruzza dsferruzza force-pushed the add-serial-control branch 2 times, most recently from 426c34c to acd951f Compare June 1, 2020 18:37
@dsferruzza dsferruzza force-pushed the add-serial-control branch from acd951f to 8192ea6 Compare June 1, 2020 18:39
@dsferruzza dsferruzza requested a review from Mefl June 1, 2020 18:48
m_cyclesPerMinuteCommand = cpm;
}

#if HARDWARE_VERSION == 2 || HARDWARE_VERSION == 3
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

plutot que d'avoir des combinatoires de flag, il vaudrait surement mieux avoir des flags par features et un include hardwarev2 ou hardwarev3 qui les set pour être sûr que l'on oublie pas un flag par erreur

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ici c'est typiquement un flag has_telemetry by uart qui sera def sur hardwarev2 et v3 et pas sur v1

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas bête ; mais ça appelle des changements sur tout le reste de la base de code pour adopter ce système de manière uniforme. Je serai d'avis de faire ça indépendamment de cette PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Très bonne idée @melf. Par contre comme @dsferruzza le suggère je ferais plutôt ça dans une autre PR.

int time = millis();

// We need to ensure we received the whole message
while (((time + 2) >= millis()) && (Serial6.available() >= 11)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

humm, j'aime pas cette boucle, surtout avec des continue à l'intérieur. comment on peut s'assurer de sortir du while en cas de spam de l'uart ?

Cette boucle peut générer une dérive temporelle non bornée et pourquoi time+2 >millis ? si la boucle est indispensable et que la condition temporelle l'est aussi, peut-on l'écrire de manière à l'invalider à un moment ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai mis une boucle ici pour être capable de gérer le fait qu'il pourrait y avoir autre chose que des messages qui soient reçus, par exemple des octets isolés. Par ailleurs, je voulais pouvoir prendre en compte rapidement plusieurs messages qui seraient envoyés à la suite. L'objectif c'est que ça soit le plus réactif possible (notamment à renvoyer un message ACK à la UI) sans impacter la respiration.

  • on arrête d'essayer de traiter des messages si jamais :
    • on a moins de 11 octets en buffer (= on est sûr qu'on n'a aucune chance d'avoir le message en entier donc on verra plus tard si on a reçu plus d'octets)
    • ou si on a déjà passé plus de 2 ms à essayer (valeur arbitraire, pour éviter de prendre de la dérive temporelle sur les fonctions de respiration)
  • les continue permettent de réessayer de traiter des messages si on a eu une erreur (mauvais CRC, mauvaise structure, pas les bons entêtes) pour être plus réactif que si on attend juste le tick d'après ; ce "retry" est limité dans le temps par les 2 critères évoqués ci-dessus.

Mon objectif ici est de tester ça sur un proto pour s'assurer que la respiration continue à fonctionner même dans le cas d'un RPi malveillant. J'ai déjà écrit du code pour essayer de flooder le MCU : makers-for-life/makair-telemetry#12

Tu penses que cette approche est pétée ?

@@ -615,6 +615,58 @@ void sendAlarmTrap(uint16_t centileValue,
#endif
}

// cppcheck-suppress unusedFunction
void sendControlAck(uint8_t setting, uint16_t valueValue) {
#if HARDWARE_VERSION == 1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

autre exemple de flag par feature : essayons d'éviter au max les #if #elif pour garder un code clair et maintenable

@dsferruzza dsferruzza marked this pull request as ready for review June 10, 2020 21:20
Copy link
Member

@jabby jabby left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM
Comme l'indique @melf, je suggère également de revoir la façon de gérer les flags dans une autre PR.

@dsferruzza dsferruzza merged commit 1e7ab88 into master Jun 11, 2020
@dsferruzza dsferruzza deleted the add-serial-control branch June 11, 2020 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants