Bonjour,

je suis en train de modifier le firmware de mon imprimante 3D Prusa I3 Original MK2s

il a été compilé avec l'IDE Arduino 1.6

Je suis arrivé à trouver et à désactiver deux fonctions, dans le but de pouvoir installer une sonde SUPERPINDA à la place de la PINDA V1

Je souhaite en profiter pour améliorer un point que je trouve très agaçant de l'interface : le réglage des températures

Qu'il s'agisse de la température du lit ou de la buse, il faut régler une valeur élevée (100°C pour le bed et 200°C à 260°C pour la buse) à partir de zéro, en tournant un bouton cranté dont chaque cran augmente la température de 1°C

Le code concerné utilise des macros que je ne comprends pas bien.

Voici les lignes de codes qui sont appelées pour régler la température avec le fameux bouton :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
  MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3 
  MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 10);//4
Voici les macros que l'on trouve plus haut :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* Helper macros for menus */
#define START_MENU() do { \
    if (encoderPosition > 0x8000) encoderPosition = 0; \
    if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM < currentMenuViewOffset) currentMenuViewOffset = encoderPosition / ENCODER_STEPS_PER_MENU_ITEM;\
    uint8_t _lineNr = currentMenuViewOffset, _menuItemNr; \
    bool wasClicked = LCD_CLICKED;\
    for(uint8_t _drawLineNr = 0; _drawLineNr < LCD_HEIGHT; _drawLineNr++, _lineNr++) { \
      _menuItemNr = 0;
 
#define MENU_ITEM(type, label, args...) do { \
    if (_menuItemNr == _lineNr) { \
      if (lcdDrawUpdate) { \
        const char* _label_pstr = (label); \
        if ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) { \
          lcd_implementation_drawmenu_ ## type ## _selected (_drawLineNr, _label_pstr , ## args ); \
        }else{\
          lcd_implementation_drawmenu_ ## type (_drawLineNr, _label_pstr , ## args ); \
        }\
      }\
      if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) {\
        lcd_quick_feedback(); \
        menu_action_ ## type ( args ); \
        return;\
      }\
    }\
    _menuItemNr++;\
  } while(0)
 
#define MENU_ITEM_DUMMY() do { _menuItemNr++; } while(0)
#define MENU_ITEM_EDIT(type, label, args...) MENU_ITEM(setting_edit_ ## type, label, (label) , ## args )
#define MENU_ITEM_EDIT_CALLBACK(type, label, args...) MENU_ITEM(setting_edit_callback_ ## type, label, (label) , ## args )
#define END_MENU() \
  if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM >= _menuItemNr) encoderPosition = _menuItemNr * ENCODER_STEPS_PER_MENU_ITEM - 1; \
  if ((uint8_t)(encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) >= currentMenuViewOffset + LCD_HEIGHT) { currentMenuViewOffset = (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) - LCD_HEIGHT + 1; lcdDrawUpdate = 1; _lineNr = currentMenuViewOffset - 1; _drawLineNr = -1; } \
  } } while(0)
Ce que je comprends, c'est que MENU_ITEM_EDIT est une macro qui permet de régler une valeur avec le bouton, avec une valeur maxi et une valeur mini.

Pour moi ce n'est pas très clair, je ne maitrise pas bien les macros en C++
Si j'avais écris ce code, j'aurais utilisé des fonctions à la place de ces macros.

Je voudrais changer le comportement pour le réglage de la température du lit (bed) et de la buze (nozzle) pour avoir des fonctions séparées, mais je ne sais pas comment réécrire ces fonctions séparément (donc sans macro) pour ensuite les modifier

Une fois ce travail de réécriture faite, ce sera facile de faire ce que je veux, à savoir :

Pour la température de la buse : quand elle est à zéro (démarrage de l'imprimante ou arrêt de l'impression), que dès le premier clic de rotation du bouton dans le sens des aguilles d'une montre je passe directement à 180°C - et inversement, si je tourne le bouton dans le sens anti-horaire, que ça passe à zéro juste après 180°

Pour la température du lit : avoir des pas de 5°C jusque 95°C et ensuite avoir des pas de 1°C

Je pense également changer l'agencement des menus et sous-menus, les fonctions que j'utilise souvent sont dans des menus différents c'est casse-pied.
Il s'agit aussi de préserver la durée de vie du fameux bouton rotatif.

Merci - à bientôt