Class to interface with Sparkfun's Blackberry Trackball Breakout Board.
Dependents: BBTrackball_Sample
BBTrackball.cpp@2:7715a78a7175, 2011-12-09 (annotated)
- Committer:
- AdamGreen
- Date:
- Fri Dec 09 19:25:47 2011 +0000
- Revision:
- 2:7715a78a7175
- Parent:
- 1:94c8e1e74dc1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AdamGreen | 0:ad0f8a08c470 | 1 | /* Copyright 2011 Adam Green (http://mbed.org/users/AdamGreen/) |
AdamGreen | 0:ad0f8a08c470 | 2 | |
AdamGreen | 0:ad0f8a08c470 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); |
AdamGreen | 0:ad0f8a08c470 | 4 | you may not use this file except in compliance with the License. |
AdamGreen | 0:ad0f8a08c470 | 5 | You may obtain a copy of the License at |
AdamGreen | 0:ad0f8a08c470 | 6 | |
AdamGreen | 0:ad0f8a08c470 | 7 | http://www.apache.org/licenses/LICENSE-2.0 |
AdamGreen | 0:ad0f8a08c470 | 8 | |
AdamGreen | 0:ad0f8a08c470 | 9 | Unless required by applicable law or agreed to in writing, software |
AdamGreen | 0:ad0f8a08c470 | 10 | distributed under the License is distributed on an "AS IS" BASIS, |
AdamGreen | 0:ad0f8a08c470 | 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AdamGreen | 0:ad0f8a08c470 | 12 | See the License for the specific language governing permissions and |
AdamGreen | 0:ad0f8a08c470 | 13 | limitations under the License. |
AdamGreen | 0:ad0f8a08c470 | 14 | */ |
AdamGreen | 0:ad0f8a08c470 | 15 | /* Implementation of class to control Sparkfun's Blackberry Trackball: |
AdamGreen | 0:ad0f8a08c470 | 16 | http://www.sparkfun.com/products/9320 |
AdamGreen | 0:ad0f8a08c470 | 17 | */ |
AdamGreen | 1:94c8e1e74dc1 | 18 | #include <limits.h> |
AdamGreen | 0:ad0f8a08c470 | 19 | #include "BBTrackball.h" |
AdamGreen | 0:ad0f8a08c470 | 20 | |
AdamGreen | 0:ad0f8a08c470 | 21 | |
AdamGreen | 0:ad0f8a08c470 | 22 | |
AdamGreen | 1:94c8e1e74dc1 | 23 | // Public methods. |
AdamGreen | 1:94c8e1e74dc1 | 24 | void CBBTrackball::GetState(SState* pState) |
AdamGreen | 1:94c8e1e74dc1 | 25 | { |
AdamGreen | 1:94c8e1e74dc1 | 26 | pState->ButtonPressed = !m_ButtonState; |
AdamGreen | 1:94c8e1e74dc1 | 27 | pState->Up = UpCount(); |
AdamGreen | 1:94c8e1e74dc1 | 28 | pState->Down = DownCount(); |
AdamGreen | 1:94c8e1e74dc1 | 29 | pState->Left = LeftCount(); |
AdamGreen | 1:94c8e1e74dc1 | 30 | pState->Right = RightCount(); |
AdamGreen | 1:94c8e1e74dc1 | 31 | } |
AdamGreen | 1:94c8e1e74dc1 | 32 | |
AdamGreen | 1:94c8e1e74dc1 | 33 | |
AdamGreen | 1:94c8e1e74dc1 | 34 | void CBBTrackball::SetColour(const SColour* pColour) |
AdamGreen | 1:94c8e1e74dc1 | 35 | { |
AdamGreen | 1:94c8e1e74dc1 | 36 | m_BluePWM.write((float)pColour->Blue / 255.0f); |
AdamGreen | 1:94c8e1e74dc1 | 37 | m_RedPWM.write((float)pColour->Red / 255.0f); |
AdamGreen | 1:94c8e1e74dc1 | 38 | m_GreenPWM.write((float)pColour->Green / 255.0f); |
AdamGreen | 1:94c8e1e74dc1 | 39 | m_WhitePWM.write((float)pColour->White / 255.0f); |
AdamGreen | 1:94c8e1e74dc1 | 40 | } |
AdamGreen | 1:94c8e1e74dc1 | 41 | |
AdamGreen | 1:94c8e1e74dc1 | 42 | |
AdamGreen | 1:94c8e1e74dc1 | 43 | |
AdamGreen | 1:94c8e1e74dc1 | 44 | // Protected methods. |
AdamGreen | 0:ad0f8a08c470 | 45 | void CBBTrackball::UpISR(void) |
AdamGreen | 0:ad0f8a08c470 | 46 | { |
AdamGreen | 0:ad0f8a08c470 | 47 | m_UpCount++; |
AdamGreen | 0:ad0f8a08c470 | 48 | } |
AdamGreen | 0:ad0f8a08c470 | 49 | |
AdamGreen | 0:ad0f8a08c470 | 50 | void CBBTrackball::DownISR(void) |
AdamGreen | 0:ad0f8a08c470 | 51 | { |
AdamGreen | 0:ad0f8a08c470 | 52 | m_DownCount++; |
AdamGreen | 0:ad0f8a08c470 | 53 | } |
AdamGreen | 0:ad0f8a08c470 | 54 | |
AdamGreen | 0:ad0f8a08c470 | 55 | void CBBTrackball::LeftISR(void) |
AdamGreen | 0:ad0f8a08c470 | 56 | { |
AdamGreen | 0:ad0f8a08c470 | 57 | m_LeftCount++; |
AdamGreen | 0:ad0f8a08c470 | 58 | } |
AdamGreen | 0:ad0f8a08c470 | 59 | |
AdamGreen | 0:ad0f8a08c470 | 60 | void CBBTrackball::RightISR(void) |
AdamGreen | 0:ad0f8a08c470 | 61 | { |
AdamGreen | 0:ad0f8a08c470 | 62 | m_RightCount++; |
AdamGreen | 0:ad0f8a08c470 | 63 | } |
AdamGreen | 1:94c8e1e74dc1 | 64 | |
AdamGreen | 1:94c8e1e74dc1 | 65 | void CBBTrackball::ButtonSampleISR(void) |
AdamGreen | 1:94c8e1e74dc1 | 66 | { |
AdamGreen | 1:94c8e1e74dc1 | 67 | int ButtonSample = m_Button.read(); |
AdamGreen | 1:94c8e1e74dc1 | 68 | |
AdamGreen | 1:94c8e1e74dc1 | 69 | if (ButtonSample != m_ButtonState) |
AdamGreen | 1:94c8e1e74dc1 | 70 | { |
AdamGreen | 1:94c8e1e74dc1 | 71 | // The button appears to be transition to a new state. Don't actually |
AdamGreen | 1:94c8e1e74dc1 | 72 | // switch to the new state until enough samples have been seen to |
AdamGreen | 1:94c8e1e74dc1 | 73 | // reduce button bounce. |
AdamGreen | 1:94c8e1e74dc1 | 74 | if (m_ButtonNewStateCount++ > 5) |
AdamGreen | 1:94c8e1e74dc1 | 75 | { |
AdamGreen | 1:94c8e1e74dc1 | 76 | m_ButtonState = ButtonSample; |
AdamGreen | 1:94c8e1e74dc1 | 77 | m_ButtonNewStateCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 78 | } |
AdamGreen | 1:94c8e1e74dc1 | 79 | } |
AdamGreen | 1:94c8e1e74dc1 | 80 | else |
AdamGreen | 1:94c8e1e74dc1 | 81 | { |
AdamGreen | 1:94c8e1e74dc1 | 82 | m_ButtonNewStateCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 83 | } |
AdamGreen | 1:94c8e1e74dc1 | 84 | } |
AdamGreen | 1:94c8e1e74dc1 | 85 | |
AdamGreen | 1:94c8e1e74dc1 | 86 | short CBBTrackball::ThresholdToShort(unsigned int Value) |
AdamGreen | 1:94c8e1e74dc1 | 87 | { |
AdamGreen | 1:94c8e1e74dc1 | 88 | if (Value > SHRT_MAX) |
AdamGreen | 1:94c8e1e74dc1 | 89 | { |
AdamGreen | 1:94c8e1e74dc1 | 90 | Value = SHRT_MAX; |
AdamGreen | 1:94c8e1e74dc1 | 91 | } |
AdamGreen | 1:94c8e1e74dc1 | 92 | |
AdamGreen | 1:94c8e1e74dc1 | 93 | return (short)Value; |
AdamGreen | 1:94c8e1e74dc1 | 94 | } |
AdamGreen | 1:94c8e1e74dc1 | 95 | |
AdamGreen | 1:94c8e1e74dc1 | 96 | short CBBTrackball::UpCount(void) |
AdamGreen | 1:94c8e1e74dc1 | 97 | { |
AdamGreen | 1:94c8e1e74dc1 | 98 | unsigned int Count; |
AdamGreen | 1:94c8e1e74dc1 | 99 | |
AdamGreen | 1:94c8e1e74dc1 | 100 | Count = m_UpCount; |
AdamGreen | 1:94c8e1e74dc1 | 101 | m_UpCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 102 | |
AdamGreen | 1:94c8e1e74dc1 | 103 | return ThresholdToShort(Count); |
AdamGreen | 1:94c8e1e74dc1 | 104 | } |
AdamGreen | 1:94c8e1e74dc1 | 105 | |
AdamGreen | 1:94c8e1e74dc1 | 106 | short CBBTrackball::DownCount(void) |
AdamGreen | 1:94c8e1e74dc1 | 107 | { |
AdamGreen | 1:94c8e1e74dc1 | 108 | unsigned int Count; |
AdamGreen | 1:94c8e1e74dc1 | 109 | |
AdamGreen | 1:94c8e1e74dc1 | 110 | Count = m_DownCount; |
AdamGreen | 1:94c8e1e74dc1 | 111 | m_DownCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 112 | |
AdamGreen | 1:94c8e1e74dc1 | 113 | return ThresholdToShort(Count); |
AdamGreen | 1:94c8e1e74dc1 | 114 | } |
AdamGreen | 1:94c8e1e74dc1 | 115 | |
AdamGreen | 1:94c8e1e74dc1 | 116 | short CBBTrackball::LeftCount(void) |
AdamGreen | 1:94c8e1e74dc1 | 117 | { |
AdamGreen | 1:94c8e1e74dc1 | 118 | unsigned int Count; |
AdamGreen | 1:94c8e1e74dc1 | 119 | |
AdamGreen | 1:94c8e1e74dc1 | 120 | Count = m_LeftCount; |
AdamGreen | 1:94c8e1e74dc1 | 121 | m_LeftCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 122 | |
AdamGreen | 1:94c8e1e74dc1 | 123 | return ThresholdToShort(Count); |
AdamGreen | 1:94c8e1e74dc1 | 124 | } |
AdamGreen | 1:94c8e1e74dc1 | 125 | |
AdamGreen | 1:94c8e1e74dc1 | 126 | short CBBTrackball::RightCount(void) |
AdamGreen | 1:94c8e1e74dc1 | 127 | { |
AdamGreen | 1:94c8e1e74dc1 | 128 | unsigned int Count; |
AdamGreen | 1:94c8e1e74dc1 | 129 | |
AdamGreen | 1:94c8e1e74dc1 | 130 | Count = m_RightCount; |
AdamGreen | 1:94c8e1e74dc1 | 131 | m_RightCount = 0; |
AdamGreen | 1:94c8e1e74dc1 | 132 | |
AdamGreen | 1:94c8e1e74dc1 | 133 | return ThresholdToShort(Count); |
AdamGreen | 1:94c8e1e74dc1 | 134 | } |