Integrate the rotary encoder/button encoder into the project.

Work with exported Pico projects

  1. In the AppScreen__Generated.c file, add a function called checkHardwareUpdate():

enum KnobRotaryStatus
{
   KnobRotaryLeft = -1,
   KnobRotaryNoAction = 0,
   KnobRotaryRight = 1
};

enum KnobButtonStatus
{
   KnobButtonNotSuccess = -1,
   KnonButtonNoAction = 0,
   KnobButtonPressed = 1,
   KnobButtonReleased = 2
};

void checkHardwareUpdate()
{
   int dataRotary = KnobRotaryNoAction;
   encoder_read(&dataRotary);
   if (dataRotary == KnobRotaryRight)
   {
      //Implement code to handle right rotation here
   }
   else if (dataRotary == KnobRotaryLeft)
   {
      //Implement code to handle left rotation here
   }

   int dataButton = KnonButtonNoAction;
   button_read(&dataButton);
   if (dataButton == KnobButtonReleased)
   {
      //Implement code to handle button released here
   }
}
  1. In the AppScreen__Generated.c file, call checkHardwareUpdate() in AppScreen_Update(AppScreen *context) mothod:

void AppScreen_Update(AppScreen *context)
{
   void *owner = context->Owner;
   checkHardwareUpdate();
   if (context->Main_Page && !context->Main_Page->Widget.Active)
   {
      AppScreen__Main_Page__Destroy(context);
   }
   Ft_Esd_Widget_Update((Ft_Esd_Widget *)context);
}

Explain about this code:

  1. Enum KnobRotaryStatus: This enumeration represents the possible states for the rotary encoder:

  • KnobRotaryLeft = -1: The knob has been rotated to the left.

  • KnobRotaryNoAction = 0: No rotation or neutral state.

  • KnobRotaryRight = 1: The knob has been rotated to the right.

  1. Enum KnobButtonStatus: This enumeration represents the possible states for the button:

  • KnobButtonNotSuccess = -1: The button press was unsuccessful (could represent an error).

  • KnonButtonNoAction = 0: No button action.

  • KnobButtonPressed = 1: The button has been pressed.

  • KnobButtonReleased = 2: The button has been released.

  1. checkHardwareUpdate() Function: This function checks the status of the rotary encoder and the button and handles the events based on their statuses.

Rotary Encoder:

  • dataRotary is initialized to KnobRotaryNoAction.

  • encoder_read(&dataRotary) updates dataRotary with the current state of the rotary encoder.

  • If dataRotary equals KnobRotaryRight, it indicates a right rotation, and custom code should be added to handle it.

  • If dataRotary equals KnobRotaryLeft, it indicates a left rotation, and custom code should handle that event as well.

Button:

  • dataButton is initialized to KnonButtonNoAction (neutral state).

  • button_read(&dataButton) updates dataButton with the current button status.

  • If dataButton equals KnobButtonReleased, custom code can be implemented to handle the button release event.

  1. AppScreen_Update() is a loop function. In AppScreen_Update(), we call checkHardwareUpdate() to check the rotary encoder and button encoder states .

Summary:

  • The checkHardwareUpdate() function monitors the state of the rotary encoder and button, handling actions based on rotation and button release events.

  • The AppScreen_Update() function is called regularly to update the user interface and process hardware events.

Work with ESD projects

  1. In the ESD project browser, create a file titled AppScreen.c.

  2. Add the following source code to AppScreen.c:

#include "Ft_Esd.h"
#include "AppScreen.h"
enum KnobRotaryStatus
{
   KnobRotaryLeft = -1,
   KnobRotaryNoAction = 0,
   KnobRotaryRight = 1
};

enum KnobButtonStatus
{
   KnobButtonNotSuccess = -1,
   KnonButtonNoAction = 0,
   KnobButtonPressed = 1,
   KnobButtonReleased = 2
};

ESD_METHOD(AppScreen_Update_Signal, Context = AppScreen)
void AppScreen_Update_Signal(AppScreen *context)
{
   checkHardwareUpdate();
}

void checkHardwareUpdate()
{
#if !ESD_SIMULATION
   int dataRotary = KnobRotaryNoAction;
   encoder_read(&dataRotary);
   if (dataRotary == KnobRotaryRight)
   {
      //Implement code to handle right rotation here
   }
   else if (dataRotary == KnobRotaryLeft)
   {
      //Implement code to handle left rotation here
   }

   int dataButton = KnonButtonNoAction;
   button_read(&dataButton);
   if (dataButton == KnobButtonReleased)
   {
      //Implement code to handle button released here
   }
#endif
}
  1. In ESD project browser, click AppScreen.page.

  2. In ESD Screen Editor of AppScreen.page, add a Update slot.

  3. Connect the Update slot to AppScreen_Update_Signal mothod.

_images/connect_update_slot.png

Note

Since the emulator cannot simulate the rotary encoder and button encoder, we need to wrap content of the function checkHardwareUpdate() fu with a !ESD_SIMULATION macros to prevent compilation errors.