PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Wed Dec 25 23:59:52 2019 +0000
Revision:
71:531419862202
Parent:
68:61a4ccb0a4b6
Changed Mode2 C++ refresh code (graphical errors)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 43:6183b12dd99c 1 /**************************************************************************/
Pokitto 43:6183b12dd99c 2 /*!
Pokitto 43:6183b12dd99c 3 @file PokittoButtons.cpp
Pokitto 43:6183b12dd99c 4 @author Jonne Valola
Pokitto 43:6183b12dd99c 5
Pokitto 43:6183b12dd99c 6 @section LICENSE
Pokitto 43:6183b12dd99c 7
Pokitto 43:6183b12dd99c 8 Software License Agreement (BSD License)
Pokitto 43:6183b12dd99c 9
Pokitto 43:6183b12dd99c 10 Copyright (c) 2016, Jonne Valola
Pokitto 43:6183b12dd99c 11 All rights reserved.
Pokitto 43:6183b12dd99c 12
Pokitto 43:6183b12dd99c 13 Redistribution and use in source and binary forms, with or without
Pokitto 43:6183b12dd99c 14 modification, are permitted provided that the following conditions are met:
Pokitto 43:6183b12dd99c 15 1. Redistributions of source code must retain the above copyright
Pokitto 43:6183b12dd99c 16 notice, this list of conditions and the following disclaimer.
Pokitto 43:6183b12dd99c 17 2. Redistributions in binary form must reproduce the above copyright
Pokitto 43:6183b12dd99c 18 notice, this list of conditions and the following disclaimer in the
Pokitto 43:6183b12dd99c 19 documentation and/or other materials provided with the distribution.
Pokitto 43:6183b12dd99c 20 3. Neither the name of the copyright holders nor the
Pokitto 43:6183b12dd99c 21 names of its contributors may be used to endorse or promote products
Pokitto 43:6183b12dd99c 22 derived from this software without specific prior written permission.
Pokitto 43:6183b12dd99c 23
Pokitto 43:6183b12dd99c 24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
Pokitto 43:6183b12dd99c 25 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Pokitto 43:6183b12dd99c 26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Pokitto 43:6183b12dd99c 27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
Pokitto 43:6183b12dd99c 28 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Pokitto 43:6183b12dd99c 29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Pokitto 43:6183b12dd99c 30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
Pokitto 43:6183b12dd99c 31 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Pokitto 43:6183b12dd99c 32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Pokitto 43:6183b12dd99c 33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Pokitto 43:6183b12dd99c 34 */
Pokitto 43:6183b12dd99c 35 /**************************************************************************/
Pokitto 43:6183b12dd99c 36
Pokitto 43:6183b12dd99c 37 #include "PokittoCore.h"
Pokitto 43:6183b12dd99c 38
Pokitto 43:6183b12dd99c 39 using namespace Pokitto;
Pokitto 43:6183b12dd99c 40
Pokitto 43:6183b12dd99c 41 uint8_t Buttons::pins[NUM_BTN];
Pokitto 43:6183b12dd99c 42 uint8_t Buttons::states[NUM_BTN];
Pokitto 43:6183b12dd99c 43 uint8_t Buttons::buttons_state;
Pokitto 43:6183b12dd99c 44 uint8_t Buttons::buttons_held;
Pokitto 43:6183b12dd99c 45 uint8_t Buttons::buttons_released; // from LSB up,down,left,right,a,b,c
Pokitto 43:6183b12dd99c 46 uint16_t Buttons::cHWLongPress = CHWLONGPRESSTIMEOUT;
Pokitto 43:6183b12dd99c 47
Pokitto 43:6183b12dd99c 48
Pokitto 43:6183b12dd99c 49 void Buttons::begin() {
Pokitto 43:6183b12dd99c 50 #ifndef POK_SIM
Pokitto 43:6183b12dd99c 51 Pokitto::initButtons();
Pokitto 43:6183b12dd99c 52 #endif // POK_SIM
Pokitto 43:6183b12dd99c 53 }
Pokitto 43:6183b12dd99c 54
Pokitto 43:6183b12dd99c 55 void Buttons::update() {
Pokitto 43:6183b12dd99c 56 #if POK_USE_CONSOLE
Pokitto 43:6183b12dd99c 57 if (console.conscounter) return;
Pokitto 43:6183b12dd99c 58 #endif // POK_USE_CONSOLE
Pokitto 68:61a4ccb0a4b6 59 #ifdef PROJ_BUTTONS_POLLING_ONLY
Pokitto 68:61a4ccb0a4b6 60 pollButtons();
Pokitto 68:61a4ccb0a4b6 61 #endif
Pokitto 43:6183b12dd99c 62 #ifndef POK_SIM
Pokitto 43:6183b12dd99c 63 /** HARDWARE CODE **/
Pokitto 43:6183b12dd99c 64 for (uint8_t thisButton = 0; thisButton < NUM_BTN; thisButton++) {
Pokitto 43:6183b12dd99c 65 if (Pokitto::heldStates[thisButton]) { //if button pressed
Pokitto 43:6183b12dd99c 66 states[thisButton]++; //increase button hold time
Pokitto 43:6183b12dd99c 67 if (states[thisButton]==0xFF) states[thisButton]=2; // PREVENT WRAPAROUND!!!!
Pokitto 43:6183b12dd99c 68 } else {
Pokitto 43:6183b12dd99c 69 if (states[thisButton] == 0)//button idle
Pokitto 43:6183b12dd99c 70 continue;
Pokitto 43:6183b12dd99c 71 if (states[thisButton] == 0xFF)//if previously released
Pokitto 43:6183b12dd99c 72 states[thisButton] = 0; //set to idle
Pokitto 43:6183b12dd99c 73 else
Pokitto 43:6183b12dd99c 74 states[thisButton] = 0xFF; //button just released
Pokitto 43:6183b12dd99c 75 }
Pokitto 43:6183b12dd99c 76 }
Pokitto 43:6183b12dd99c 77 #else
Pokitto 43:6183b12dd99c 78 /** POK_SIM code **/
Pokitto 43:6183b12dd99c 79 simulator.pollButtons();
Pokitto 43:6183b12dd99c 80 for (uint8_t thisButton = 0; thisButton < NUM_BTN; thisButton++) {
Pokitto 43:6183b12dd99c 81 uint8_t temp=0;
Pokitto 43:6183b12dd99c 82 switch (thisButton) {
Pokitto 43:6183b12dd99c 83 case 0:
Pokitto 43:6183b12dd99c 84 temp = simulator.leftHeld(); break;
Pokitto 43:6183b12dd99c 85 case 1:
Pokitto 43:6183b12dd99c 86 temp = simulator.upHeld(); break;
Pokitto 43:6183b12dd99c 87 case 2:
Pokitto 43:6183b12dd99c 88 temp = simulator.rightHeld(); break;
Pokitto 43:6183b12dd99c 89 case 3:
Pokitto 43:6183b12dd99c 90 temp = simulator.downHeld(); break;
Pokitto 43:6183b12dd99c 91 case 4:
Pokitto 43:6183b12dd99c 92 temp = simulator.aHeld(); break;
Pokitto 43:6183b12dd99c 93 case 5:
Pokitto 43:6183b12dd99c 94 temp = simulator.bHeld(); break;
Pokitto 43:6183b12dd99c 95 case 6:
Pokitto 43:6183b12dd99c 96 temp = simulator.cHeld(); break;
Pokitto 43:6183b12dd99c 97 default:
Pokitto 43:6183b12dd99c 98 break;
Pokitto 43:6183b12dd99c 99 }
Pokitto 43:6183b12dd99c 100
Pokitto 43:6183b12dd99c 101 if (temp == HIGH) { //if button pressed
Pokitto 43:6183b12dd99c 102 states[thisButton]++; //increase button hold time
Pokitto 43:6183b12dd99c 103 if (states[thisButton]==0xFF) states[thisButton] = 2; //prevent wraparound and retrigger
Pokitto 43:6183b12dd99c 104 } else {
Pokitto 43:6183b12dd99c 105 if (states[thisButton] == 0)//button idle
Pokitto 43:6183b12dd99c 106 continue;
Pokitto 43:6183b12dd99c 107 if (states[thisButton] == 0xFF)//if previously released
Pokitto 43:6183b12dd99c 108 states[thisButton] = 0; //set to idle
Pokitto 43:6183b12dd99c 109 else
Pokitto 43:6183b12dd99c 110 states[thisButton] = 0xFF; //button just released
Pokitto 43:6183b12dd99c 111 }
Pokitto 43:6183b12dd99c 112 }
Pokitto 43:6183b12dd99c 113
Pokitto 43:6183b12dd99c 114 #endif // POK_SIM
Pokitto 43:6183b12dd99c 115 }
Pokitto 43:6183b12dd99c 116
Pokitto 43:6183b12dd99c 117 /*
Pokitto 43:6183b12dd99c 118 * Returns true when 'button' is pressed.
Pokitto 43:6183b12dd99c 119 * The button has to be released for it to be triggered again.
Pokitto 43:6183b12dd99c 120 */
Pokitto 43:6183b12dd99c 121 bool Buttons::pressed(uint8_t button) {
Pokitto 43:6183b12dd99c 122 if (states[button] == 1)
Pokitto 43:6183b12dd99c 123 return true;
Pokitto 43:6183b12dd99c 124 else
Pokitto 43:6183b12dd99c 125 return false;
Pokitto 43:6183b12dd99c 126 }
Pokitto 43:6183b12dd99c 127
Pokitto 43:6183b12dd99c 128 /*
Pokitto 43:6183b12dd99c 129 * return true if 'button' is released
Pokitto 43:6183b12dd99c 130 */
Pokitto 43:6183b12dd99c 131 bool Buttons::released(uint8_t button) {
Pokitto 66:6281a40d73e6 132 if (states[button] == 0xFF) {
Pokitto 66:6281a40d73e6 133 states[button] = 0; // prevent continuous released state!
Pokitto 43:6183b12dd99c 134 return true;
Pokitto 66:6281a40d73e6 135 }
Pokitto 43:6183b12dd99c 136 else
Pokitto 43:6183b12dd99c 137 return false;
Pokitto 43:6183b12dd99c 138 }
Pokitto 43:6183b12dd99c 139
Pokitto 43:6183b12dd99c 140 /**
Pokitto 43:6183b12dd99c 141 * returns true ONCE when 'button' is held for 'time' frames
Pokitto 43:6183b12dd99c 142 * @param button The button's ID
Pokitto 43:6183b12dd99c 143 * @param time How much frames button must be held, between 1 and 254.
Pokitto 43:6183b12dd99c 144 * @return true when 'button' is held for 'time' frames
Pokitto 43:6183b12dd99c 145 */
Pokitto 43:6183b12dd99c 146 bool Buttons::held(uint8_t button, uint8_t time){
Pokitto 43:6183b12dd99c 147 if(states[button] == (time+1))
Pokitto 43:6183b12dd99c 148 return true;
Pokitto 43:6183b12dd99c 149 else
Pokitto 43:6183b12dd99c 150 return false;
Pokitto 43:6183b12dd99c 151 }
Pokitto 43:6183b12dd99c 152
Pokitto 43:6183b12dd99c 153 /**
Pokitto 43:6183b12dd99c 154 * returns true every 'period' frames when 'button' is held
Pokitto 43:6183b12dd99c 155 * @param button The button's ID
Pokitto 43:6183b12dd99c 156 * @param period How much frames button must be held, between 1 and 254.
Pokitto 43:6183b12dd99c 157 * @return true if the button is held for the given time
Pokitto 43:6183b12dd99c 158 */
Pokitto 43:6183b12dd99c 159 bool Buttons::repeat(uint8_t button, uint8_t period) {
Pokitto 43:6183b12dd99c 160 if (period <= 1) {
Pokitto 43:6183b12dd99c 161 if ((states[button] != 0xFF) && (states[button]))
Pokitto 43:6183b12dd99c 162 return true;
Pokitto 43:6183b12dd99c 163 } else {
Pokitto 43:6183b12dd99c 164 if ((states[button] != 0xFF) && ((states[button] % period) == 1))
Pokitto 43:6183b12dd99c 165 return true;
Pokitto 43:6183b12dd99c 166 }
Pokitto 43:6183b12dd99c 167 return false;
Pokitto 43:6183b12dd99c 168 }
Pokitto 43:6183b12dd99c 169
Pokitto 43:6183b12dd99c 170 /**
Pokitto 43:6183b12dd99c 171 *
Pokitto 43:6183b12dd99c 172 * @param button The button's ID
Pokitto 43:6183b12dd99c 173 * @return The number of frames during which the button has been held.
Pokitto 43:6183b12dd99c 174 */
Pokitto 43:6183b12dd99c 175 uint8_t Buttons::timeHeld(uint8_t button){
Pokitto 43:6183b12dd99c 176 if(states[button] != 0xFF)
Pokitto 43:6183b12dd99c 177 return states[button];
Pokitto 43:6183b12dd99c 178 else
Pokitto 43:6183b12dd99c 179 return 0;
Pokitto 43:6183b12dd99c 180
Pokitto 43:6183b12dd99c 181 }
Pokitto 43:6183b12dd99c 182
Pokitto 43:6183b12dd99c 183 void Buttons::pollButtons() {
Pokitto 43:6183b12dd99c 184 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 185 simulator.pollButtons();
Pokitto 43:6183b12dd99c 186 #else
Pokitto 43:6183b12dd99c 187 uint8_t buttons_state_old = buttons_state;
Pokitto 43:6183b12dd99c 188 buttons_state = 0; // clear all
Pokitto 43:6183b12dd99c 189 if (upBtn()) buttons_state |= (1<<UPBIT);
Pokitto 43:6183b12dd99c 190 if (downBtn()) buttons_state |= (1<<DOWNBIT);
Pokitto 43:6183b12dd99c 191 if (leftBtn()) buttons_state |= (1<<LEFTBIT);
Pokitto 43:6183b12dd99c 192 if (rightBtn()) buttons_state |= (1<<RIGHTBIT);
Pokitto 43:6183b12dd99c 193 if (aBtn()) buttons_state |= (1<<ABIT);
Pokitto 43:6183b12dd99c 194 if (bBtn()) buttons_state |= (1<<BBIT);
Pokitto 43:6183b12dd99c 195 if (cBtn()) buttons_state |= (1<<CBIT);
Pokitto 43:6183b12dd99c 196 buttons_held = buttons_state & buttons_state_old; // only if both 1, end result is 1
Pokitto 43:6183b12dd99c 197 buttons_released = ~buttons_state & buttons_state_old; // if now zero, then 1 AND previous 1 = 1
Pokitto 43:6183b12dd99c 198 #endif // POK_SIM
Pokitto 43:6183b12dd99c 199 }
Pokitto 43:6183b12dd99c 200
Pokitto 43:6183b12dd99c 201 uint8_t Buttons::aBtn() {
Pokitto 43:6183b12dd99c 202 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 203 return simulator.aBtn();
Pokitto 43:6183b12dd99c 204 #else
Pokitto 68:61a4ccb0a4b6 205 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 206 return Pokitto::heldStates[BTN_A];
Pokitto 68:61a4ccb0a4b6 207 #else
Pokitto 68:61a4ccb0a4b6 208 return Pokitto::Core::aBtn();
Pokitto 68:61a4ccb0a4b6 209 #endif
Pokitto 43:6183b12dd99c 210 #endif // POK_SIM
Pokitto 43:6183b12dd99c 211 }
Pokitto 43:6183b12dd99c 212
Pokitto 43:6183b12dd99c 213
Pokitto 43:6183b12dd99c 214 uint8_t Buttons::bBtn() {
Pokitto 43:6183b12dd99c 215 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 216 return simulator.bBtn();
Pokitto 43:6183b12dd99c 217 #else
Pokitto 68:61a4ccb0a4b6 218 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 219 return Pokitto::heldStates[BTN_B];
Pokitto 68:61a4ccb0a4b6 220 #else
Pokitto 68:61a4ccb0a4b6 221 return Pokitto::Core::bBtn();
Pokitto 68:61a4ccb0a4b6 222 #endif
Pokitto 43:6183b12dd99c 223 #endif // POK_SIM
Pokitto 43:6183b12dd99c 224 }
Pokitto 43:6183b12dd99c 225
Pokitto 43:6183b12dd99c 226 uint8_t Buttons::cBtn() {
Pokitto 43:6183b12dd99c 227 uint8_t c;
Pokitto 43:6183b12dd99c 228 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 229 c = simulator.cBtn();
Pokitto 43:6183b12dd99c 230 #else
Pokitto 68:61a4ccb0a4b6 231 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 232 c = Pokitto::heldStates[BTN_C];
Pokitto 68:61a4ccb0a4b6 233 #else
Pokitto 68:61a4ccb0a4b6 234 return Pokitto::Core::cBtn();
Pokitto 68:61a4ccb0a4b6 235 #endif
Pokitto 43:6183b12dd99c 236 #endif // POK_SIM
Pokitto 43:6183b12dd99c 237 return c;
Pokitto 43:6183b12dd99c 238 }
Pokitto 43:6183b12dd99c 239
Pokitto 43:6183b12dd99c 240 uint8_t Buttons::leftBtn() {
Pokitto 43:6183b12dd99c 241 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 242 return simulator.leftBtn();
Pokitto 43:6183b12dd99c 243 #else
Pokitto 68:61a4ccb0a4b6 244 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 245 return Pokitto::heldStates[BTN_LEFT];
Pokitto 68:61a4ccb0a4b6 246 #else
Pokitto 68:61a4ccb0a4b6 247 return Pokitto::Core::leftBtn();
Pokitto 68:61a4ccb0a4b6 248 #endif
Pokitto 43:6183b12dd99c 249 #endif // POK_SIM
Pokitto 43:6183b12dd99c 250 }
Pokitto 43:6183b12dd99c 251
Pokitto 43:6183b12dd99c 252 uint8_t Buttons::rightBtn() {
Pokitto 43:6183b12dd99c 253 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 254 return simulator.rightBtn();
Pokitto 43:6183b12dd99c 255 #else
Pokitto 68:61a4ccb0a4b6 256 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 257 return Pokitto::heldStates[BTN_RIGHT];
Pokitto 68:61a4ccb0a4b6 258 #else
Pokitto 68:61a4ccb0a4b6 259 return Pokitto::Core::rightBtn();
Pokitto 68:61a4ccb0a4b6 260 #endif
Pokitto 43:6183b12dd99c 261 #endif // POK_SIM
Pokitto 43:6183b12dd99c 262 }
Pokitto 43:6183b12dd99c 263
Pokitto 43:6183b12dd99c 264 uint8_t Buttons::upBtn() {
Pokitto 43:6183b12dd99c 265 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 266 return simulator.upBtn();
Pokitto 43:6183b12dd99c 267 #else
Pokitto 68:61a4ccb0a4b6 268 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 269 return Pokitto::heldStates[BTN_UP];
Pokitto 68:61a4ccb0a4b6 270 #else
Pokitto 68:61a4ccb0a4b6 271 return Pokitto::Core::upBtn();
Pokitto 68:61a4ccb0a4b6 272 #endif
Pokitto 43:6183b12dd99c 273 #endif // POK_SIM
Pokitto 43:6183b12dd99c 274 }
Pokitto 43:6183b12dd99c 275
Pokitto 43:6183b12dd99c 276 uint8_t Buttons::downBtn() {
Pokitto 43:6183b12dd99c 277 #ifdef POK_SIM
Pokitto 43:6183b12dd99c 278 return simulator.downBtn();
Pokitto 43:6183b12dd99c 279 #else
Pokitto 68:61a4ccb0a4b6 280 #ifndef PROJ_BUTTONS_POLLING_ONLY
Pokitto 43:6183b12dd99c 281 return Pokitto::heldStates[BTN_DOWN];
Pokitto 68:61a4ccb0a4b6 282 #else
Pokitto 68:61a4ccb0a4b6 283 return Pokitto::Core::downBtn();
Pokitto 68:61a4ccb0a4b6 284 #endif
Pokitto 43:6183b12dd99c 285 #endif // POK_SIM
Pokitto 43:6183b12dd99c 286 }
Pokitto 43:6183b12dd99c 287
Pokitto 43:6183b12dd99c 288
Pokitto 43:6183b12dd99c 289
Pokitto 43:6183b12dd99c 290
Pokitto 43:6183b12dd99c 291
Pokitto 43:6183b12dd99c 292
Pokitto 43:6183b12dd99c 293
Pokitto 43:6183b12dd99c 294
Pokitto 43:6183b12dd99c 295 //** EOF **//