rotaryencoder: Initial implementation

This module implements supoort for the Grove Rotary Encoder, though it
should function with any Rotary Encoder utilizing two GPIOs.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Zion Orent <zorent@ics.com>
Signed-off-by: John Van Drasek <john.r.van.drasek@intel.com>
This commit is contained in:
Jon Trulson
2015-01-15 15:13:45 -07:00
committed by John Van Drasek
parent 6135e932e4
commit d307376abc
8 changed files with 311 additions and 0 deletions

View File

@ -0,0 +1,5 @@
set (libname "rotaryencoder")
set (libdescription "upm grove rotary encoder module")
set (module_src ${libname}.cxx)
set (module_h ${libname}.h)
upm_module_init()

View File

@ -0,0 +1,8 @@
%module jsupm_rotaryencoder
%include "../upm.i"
%{
#include "rotaryencoder.h"
%}
%include "rotaryencoder.h"

View File

@ -0,0 +1,9 @@
%module pyupm_rotaryencoder
%include "../upm.i"
%feature("autodoc", "3");
%include "rotaryencoder.h"
%{
#include "rotaryencoder.h"
%}

View File

@ -0,0 +1,91 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2015 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <iostream>
#include "rotaryencoder.h"
using namespace upm;
using namespace std;
RotaryEncoder::RotaryEncoder(int pinA, int pinB)
{
if ( !(m_gpioA = mraa_gpio_init(pinA)) )
{
cerr << __FUNCTION__ << ": mraa_gpio_init() failed" << endl;
return;
}
mraa_gpio_dir(m_gpioA, MRAA_GPIO_IN);
if ( !(m_gpioB = mraa_gpio_init(pinB)) )
{
cerr << __FUNCTION__ << ": mraa_gpio_init() failed" << endl;
return;
}
mraa_gpio_dir(m_gpioB, MRAA_GPIO_IN);
m_position = 0;
// setup the ISR
// We would prefer to use MRAA_GPIO_EDGE_BOTH for better resolution,
// but that does not appear to be supported
mraa_gpio_isr(m_gpioA, MRAA_GPIO_EDGE_RISING,
&signalAISR, this);
}
RotaryEncoder::~RotaryEncoder()
{
mraa_gpio_isr_exit(m_gpioA);
mraa_gpio_close(m_gpioA);
mraa_gpio_close(m_gpioB);
}
void RotaryEncoder::initPosition(int count)
{
m_position = count;
}
int RotaryEncoder::position()
{
return m_position;
}
void RotaryEncoder::signalAISR(void *ctx)
{
upm::RotaryEncoder *This = (upm::RotaryEncoder *)ctx;
if (mraa_gpio_read(This->m_gpioA))
{
if (mraa_gpio_read(This->m_gpioB))
This->m_position++; // CW
else
This->m_position--; // CCW
}
}

View File

@ -0,0 +1,91 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2015 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include <stdint.h>
#include <sys/time.h>
#include <mraa/gpio.h>
namespace upm {
/**
* @brief C++ API for the Grove Rotary Encoder
*
* UPM module for the Grove Rotary Encoder. A Rotary Encoder
* encodes a rotation signal into electronic pulses that can be used
* to measure rotation and direction. It is useful in cases where a
* rotary knob is required, but using a potentiometer is not
* desireable. A rotary encoder can turn a full 360 degrees+
* without a stop and does not place a resistive load on the
* circuit, as is the case with a potentiometer.
*
* This module maintains a position that is incremented or
* decremented according to the rotation on the encoder.
*
* @ingroup gpio
* @snippet rotaryencoder.cxx Interesting
*/
class RotaryEncoder {
public:
/**
* RotaryEncoder constructor
*
* @param pinA digital pin to use for signal A
* @param pinB digital pin to use for signal B
*/
RotaryEncoder(int pinA, int pinB);
/**
* RotaryEncoder Destructor
*/
~RotaryEncoder();
/**
* Reset the position to a given number, default is 0.
*
* @param count integer to initialize the position to
*/
void initPosition(int count=0);
/**
* Get the position value
*
*/
int position();
/**
* ISR for signal A
*
* @param ctx user context for the ISR (*this pointer)
*/
static void signalAISR(void *ctx);
private:
volatile int m_position;
mraa_gpio_context m_gpioA;
mraa_gpio_context m_gpioB;
};
}