Class to interface with Sparkfun's Blackberry Trackball Breakout Board.
Dependents: BBTrackball_Sample
BBTrackball.h
- Committer:
- AdamGreen
- Date:
- 2011-12-09
- Revision:
- 1:94c8e1e74dc1
- Parent:
- 0:ad0f8a08c470
- Child:
- 2:7715a78a7175
File content as of revision 1:94c8e1e74dc1:
/* Copyright 2011 Adam Green (http://mbed.org/users/AdamGreen/) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* Header file for class to control Sparkfun's Blackberry Trackball: http://www.sparkfun.com/products/9320 */ #ifndef _BBTRACKBALL_H_ #define _BBTRACKBALL_H_ #include <mbed.h> namespace AFP { /** A class to interface with the Sparkfun Blackberry Trackball Breakout Board. * http://www.sparkfun.com/products/9320 * * This breakout board uses a hall effect for each direction of motion (up, * down, left, right) and generates pulses as the trackball is rotated in each * of these directions. This class counts both the rising and falling edges * of these pulses in an interrupt handler. The main program can query for * the number of pulses that have been generated since the previous query was * made. * * The breakout board also has a push button placed beneath the trackball so * that user presses can be detected as well. This class will provide the * state of this button as well after filtering it for the purpose of * debouncing. * * The last feature of this breakout board that is supported by the class * includes the 4 LEDs that have been placed beneath the trackball. This * class allows the caller to specify an individual brightness value for each * of the LEDs (red, blue, green, white). * * Example: * @code #include <mbed.h> #include "BBTrackball.h" int main() { // UNDONE: Add something to this section. return 0; } * @endcode */ class CBBTrackball { public: /** A structure in which the current state of the trackball is returned from the GetState() method. @see GetState() */ struct SState { int ButtonPressed; /**< 1 if the button is currently pressed and 0 otherwise. */ short Up; /**< Number of upward pulses since last call. */ short Down; /**< Number of downward pulses since last call. */ short Left; /**< Number of leftward pulses since last call. */ short Right; /**< Number of rightward pulses since last call. */ }; /** A structure used to represent the colour of the illumination for the trackball. @see SetColour() */ struct SColour { unsigned char Red; /**< Red colour component (0 - 255). */ unsigned char Green; /**< Green colour component (0 - 255). */ unsigned char Blue; /**< Blue colour component (0 - 255). */ unsigned char White; /**< Additional white colour component (0 - 255). */ }; /** * Create a CBBTrackball object, binds it to the specified input/output * pins, and initializes the required interrupt handling. * * @param BluePin The mbed pin which is connected to the BLU pin of the breakout board. * @param RedPin The mbed pin which is connected to the RED pin of the breakout board. * @param GreenPin The mbed pin which is connected to the GRN pin of the breakout board. * @param WhitePin The mbed pin which is connected to the WHT pin of the breakout board. * @param UpPin The mbed pin which is connected to the UP pin of the breakout board. * @param DownPin The mbed pin which is connected to the DWN pin of the breakout board. * @param LeftPin The mbed pin which is connected to the LFT pin of the breakout board. * @param RightPin The mbed pin which is connected to the RHT pin of the breakout board. * @param ButtonPin The mbed pin which is connected to the BTN pin of the breakout board. */ CBBTrackball(PinName BluePin, PinName RedPin, PinName GreenPin, PinName WhitePin, PinName UpPin, PinName DownPin, PinName LeftPin, PinName RightPin, PinName ButtonPin) : m_BluePWM(BluePin), m_RedPWM(RedPin), m_GreenPWM(GreenPin), m_WhitePWM(WhitePin), m_UpInterrupt(UpPin), m_DownInterrupt(DownPin), m_LeftInterrupt(LeftPin), m_RightInterrupt(RightPin), m_Button(ButtonPin), m_UpCount(0), m_DownCount(0), m_LeftCount(0), m_RightCount(0), m_ButtonState(1), m_ButtonNewStateCount(0) { static const SColour AllLEDsOff = { 0, 0, 0, 0 }; m_UpInterrupt.rise<CBBTrackball>(this, &CBBTrackball::UpISR); m_DownInterrupt.rise<CBBTrackball>(this, &CBBTrackball::DownISR); m_LeftInterrupt.rise<CBBTrackball>(this, &CBBTrackball::LeftISR); m_RightInterrupt.rise<CBBTrackball>(this, &CBBTrackball::RightISR); m_ButtonSampleTicker.attach_us<CBBTrackball>(this, &CBBTrackball::ButtonSampleISR, 100); SetColour(&AllLEDsOff); } /** Gets current state of the trackball. * * Returns state indicating how much the trackball has moved in each * direction since the last call to GetState() and the current state of the * push button. * * @param pState points to the state structure to be filled in with the * current state. */ void GetState(SState* pState); /** Sets the colour of the trackball illumination. * * @param pColour points to the colour structure used to determine the * illumination contribution from each of the 4 LEDs found beneath * the trackball. */ void SetColour(const SColour* pColour); protected: void UpISR(void); void DownISR(void); void LeftISR(void); void RightISR(void); void ButtonSampleISR(void); short ThresholdToShort(unsigned int Value); short UpCount(void); short DownCount(void); short LeftCount(void); short RightCount(void); PwmOut m_BluePWM; PwmOut m_RedPWM; PwmOut m_GreenPWM; PwmOut m_WhitePWM; InterruptIn m_UpInterrupt; InterruptIn m_DownInterrupt; InterruptIn m_LeftInterrupt; InterruptIn m_RightInterrupt; DigitalIn m_Button; Ticker m_ButtonSampleTicker; unsigned int m_UpCount; unsigned int m_DownCount; unsigned int m_LeftCount; unsigned int m_RightCount; int m_ButtonState; unsigned int m_ButtonNewStateCount; }; } // namespace AFP using namespace AFP; #endif /* _BBTRACKBALL_H__BBTRACKBALL_H_ */