Charles Young's development fork. Going forward I only want to push mature code to main repository.

Dependencies:   mbed

Fork of GEO_COUNTER_L432KC by Geo Electronics "Geo Counter"

RotarySwitch.cpp

Committer:
Charles David Young
Date:
2018-09-04
Revision:
19:fd3e33641aa7
Child:
20:fb73eaaf0894

File content as of revision 19:fd3e33641aa7:

/**
 * @author Charles Young
 *
 */

#include "RotatySwitch.hpp"

RotatySwitch::RotatySwitch(PinName channelA,
                           PinName channelB)
   : channelA_(channelA), channelB_(channelB)
{
   Wheel.reset();
   LEDs_write(0x00);
   SecTenth_Beat.attach_us(&UpdateInput,  100000);  
   Sec_Beat.attach_us(&UpdateOutput, 1000000);  
}

void RotatySwitch::GetPosition(void)
{
   return LED_status_index;
}

void RotatySwitch::UpdateOutput()   
{
    // Blink mode LED
    if (WHEEL_MODE_SELECT == currentWheelState)
       LEDs_write(0);

   if (WheelStateTimer)
   {
      WheelStateTimer++;
      if (++WheelStateTimer > WheelStateTimeout)
      {
         WheelStateMachine(WHEEL_Timeout);
         WheelStateTimer = 0;
      }
   }
}

void RotatySwitch::UpdateInput()   
{               
   LEDs_write(LED_statuses[LED_status_index]);
        
   // react to wheel if in proper state
   WheelCurrent = int(Wheel.getPulses());
   if (   (WHEEL_MODE_SELECT    == currentWheelState)
       || (WHEEL_SUBMODE_SELECT == currentWheelState))
   {
     if (WHEEL_MODE_SELECT == currentWheelState)
     {
        if (WheelCurrent > WheelPrevious)
           LED_status_index = ++LED_status_index % sizeof(LED_statuses);
        else
            if (WheelCurrent < WheelPrevious)
               LED_status_index = --LED_status_index % sizeof(LED_statuses);
     }
     // Keep resetting WheelStateTimer as long as wheel is moving
     if (WheelPrevious != WheelCurrent)
        WheelStateTimer = 1;
   }
   WheelPrevious = WheelCurrent;

   // detect when wheel button is pressed but wait until it is released
   // before doing anything
   bool QEPBbutton = QEPB.read();
   if (   (QEPBbutton)
       && (!QEPBpressed))
   {
      QEPBpressed = true;
   }
   else
      if (   (!QEPBbutton)
          && (QEPBpressed))
      {
         QEPBpressed = false;
         WheelStateMachine(WHEEL_Pressed);
      }
    
   return;
}

void RotatySwitch::WheelStateMachine(WheelStateEvent event)
{                       
   switch (currentWheelState) {
      case WHEEL_INACTIVE:
      if (WHEEL_Pressed == event)
      {
         currentWheelState = WHEEL_MODE_SELECT;
         WheelStateTimer = 1;
      }
      break;
      case WHEEL_MODE_SELECT:
      if (WHEEL_Pressed == event)
      {
         currentWheelState = WHEEL_SUBMODE_SELECT;
         WheelStateTimer = 1;
      }
      else
         if (WHEEL_Timeout == event)
            currentWheelState = WHEEL_INACTIVE;
      break;
      case WHEEL_SUBMODE_SELECT:
      if (WHEEL_Pressed == event)
      {
         currentWheelState = WHEEL_MODE_SELECT;
         WheelStateTimer = 1;
      }
      else
         if (WHEEL_Timeout == event)
            currentWheelState = WHEEL_INACTIVE;
      break;
      default:
      break;
   }
}