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:
Tue Sep 19 08:47:36 2017 +0000
Revision:
2:968589ca3484
Parent:
1:4b1511a0a2c2
Child:
3:689c3cbbef13
Got rid of warnings at compile time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 0:e8b8f36b4505 1 /**************************************************************************/
Pokitto 0:e8b8f36b4505 2 /*!
Pokitto 0:e8b8f36b4505 3 @file PokittoCore.cpp
Pokitto 0:e8b8f36b4505 4 @author Jonne Valola
Pokitto 0:e8b8f36b4505 5
Pokitto 0:e8b8f36b4505 6 @section LICENSE
Pokitto 0:e8b8f36b4505 7
Pokitto 0:e8b8f36b4505 8 Software License Agreement (BSD License)
Pokitto 0:e8b8f36b4505 9
Pokitto 0:e8b8f36b4505 10 Copyright (c) 2016, Jonne Valola
Pokitto 0:e8b8f36b4505 11 All rights reserved.
Pokitto 0:e8b8f36b4505 12
Pokitto 0:e8b8f36b4505 13 Redistribution and use in source and binary forms, with or without
Pokitto 0:e8b8f36b4505 14 modification, are permitted provided that the following conditions are met:
Pokitto 0:e8b8f36b4505 15 1. Redistributions of source code must retain the above copyright
Pokitto 0:e8b8f36b4505 16 notice, this list of conditions and the following disclaimer.
Pokitto 0:e8b8f36b4505 17 2. Redistributions in binary form must reproduce the above copyright
Pokitto 0:e8b8f36b4505 18 notice, this list of conditions and the following disclaimer in the
Pokitto 0:e8b8f36b4505 19 documentation and/or other materials provided with the distribution.
Pokitto 0:e8b8f36b4505 20 3. Neither the name of the copyright holders nor the
Pokitto 0:e8b8f36b4505 21 names of its contributors may be used to endorse or promote products
Pokitto 0:e8b8f36b4505 22 derived from this software without specific prior written permission.
Pokitto 0:e8b8f36b4505 23
Pokitto 0:e8b8f36b4505 24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
Pokitto 0:e8b8f36b4505 25 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Pokitto 0:e8b8f36b4505 26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Pokitto 0:e8b8f36b4505 27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
Pokitto 0:e8b8f36b4505 28 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Pokitto 0:e8b8f36b4505 29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Pokitto 0:e8b8f36b4505 30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
Pokitto 0:e8b8f36b4505 31 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Pokitto 0:e8b8f36b4505 32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Pokitto 0:e8b8f36b4505 33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Pokitto 0:e8b8f36b4505 34 */
Pokitto 0:e8b8f36b4505 35 /**************************************************************************/
Pokitto 0:e8b8f36b4505 36
Pokitto 0:e8b8f36b4505 37 #include "PokittoCore.h"
Pokitto 0:e8b8f36b4505 38 #include "Pokitto_settings.h"
Pokitto 0:e8b8f36b4505 39 #include "PokittoConsole.h"
Pokitto 0:e8b8f36b4505 40 #include "PokittoFonts.h"
Pokitto 0:e8b8f36b4505 41 #include "PokittoTimer.h"
Pokitto 0:e8b8f36b4505 42 #include "PokittoLogos.h"
Pokitto 0:e8b8f36b4505 43 #include <stdlib.h>
Pokitto 0:e8b8f36b4505 44 #ifndef DISABLEAVRMIN
Pokitto 0:e8b8f36b4505 45 #define max(a,b) ((a)>(b)?(a):(b))
Pokitto 0:e8b8f36b4505 46 #endif // DISABLEAVRMIN
Pokitto 0:e8b8f36b4505 47
Pokitto 0:e8b8f36b4505 48 char selectedfile[25];
Pokitto 0:e8b8f36b4505 49
Pokitto 2:968589ca3484 50 //#define F
Pokitto 0:e8b8f36b4505 51
Pokitto 0:e8b8f36b4505 52 #ifndef POK_SIM
Pokitto 0:e8b8f36b4505 53 /** start the user application
Pokitto 0:e8b8f36b4505 54 * https://community.nxp.com/thread/417695
Pokitto 0:e8b8f36b4505 55 *
Pokitto 0:e8b8f36b4505 56 */
Pokitto 0:e8b8f36b4505 57 void start_application(unsigned long app_link_location){
Pokitto 0:e8b8f36b4505 58 //asm(" ldr sp, [r0,#0]");
Pokitto 0:e8b8f36b4505 59 //asm(" ldr pc, [r0,#4]");
Pokitto 0:e8b8f36b4505 60 //This code is not valid for the Cortex-m0+ instruction set.
Pokitto 0:e8b8f36b4505 61 // The equivalent for this (as used by the KL26) is
Pokitto 0:e8b8f36b4505 62 __disable_irq();// Start by disabling interrupts, before changing interrupt vectors
Pokitto 0:e8b8f36b4505 63
Pokitto 0:e8b8f36b4505 64 // delete buttons
Pokitto 0:e8b8f36b4505 65 //pokDeleteButtons();
Pokitto 0:e8b8f36b4505 66
Pokitto 0:e8b8f36b4505 67 // completely kill button interrupts in preparation for reset
Pokitto 0:e8b8f36b4505 68 LPC_PINT->IENR = 0;
Pokitto 0:e8b8f36b4505 69 LPC_PINT->IENF = 0;
Pokitto 0:e8b8f36b4505 70
Pokitto 0:e8b8f36b4505 71 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk & ~(SysTick_CTRL_ENABLE_Msk); //disable systick
Pokitto 0:e8b8f36b4505 72 LPC_SYSCON->PDRUNCFG |= (1 << 10); /* Power-down USB PHY */
Pokitto 0:e8b8f36b4505 73 LPC_SYSCON->PDRUNCFG |= (1 << 8); /* Power-down USB PLL */
Pokitto 0:e8b8f36b4505 74
Pokitto 0:e8b8f36b4505 75 // reset clock source to IRC
Pokitto 0:e8b8f36b4505 76 LPC_SYSCON->MAINCLKUEN = 0x01; /* Update MCLK Clock Source */
Pokitto 0:e8b8f36b4505 77 LPC_SYSCON->MAINCLKUEN = 0x00; /* Toggle Update Register */
Pokitto 0:e8b8f36b4505 78 while (LPC_SYSCON->MAINCLKUEN & 0x01); /* Wait Until Updated */
Pokitto 0:e8b8f36b4505 79 // switch clock selection to IRC
Pokitto 0:e8b8f36b4505 80 LPC_SYSCON->MAINCLKSEL = 0; /* Select Clock Source */
Pokitto 0:e8b8f36b4505 81 LPC_SYSCON->MAINCLKUEN = 0x01; /* Update MCLK Clock Source */
Pokitto 0:e8b8f36b4505 82 LPC_SYSCON->MAINCLKUEN = 0x00; /* Toggle Update Register */
Pokitto 0:e8b8f36b4505 83 while (LPC_SYSCON->MAINCLKUEN & 0x01); /* Wait Until Updated */
Pokitto 0:e8b8f36b4505 84 //disable PLL clock output
Pokitto 0:e8b8f36b4505 85 LPC_SYSCON->SYSPLLCLKUEN = 0;
Pokitto 0:e8b8f36b4505 86 while (LPC_SYSCON->SYSPLLCLKUEN & 0x00);
Pokitto 0:e8b8f36b4505 87 LPC_SYSCON->SYSPLLCTRL = 0;
Pokitto 0:e8b8f36b4505 88
Pokitto 0:e8b8f36b4505 89 //kill peripherals
Pokitto 0:e8b8f36b4505 90 LPC_SYSCON->MAINCLKSEL = 0;
Pokitto 0:e8b8f36b4505 91 LPC_SYSCON->PRESETCTRL = 0; //disable all peripherals
Pokitto 0:e8b8f36b4505 92
Pokitto 0:e8b8f36b4505 93 //power down PLL
Pokitto 0:e8b8f36b4505 94 volatile uint32_t tmp;
Pokitto 0:e8b8f36b4505 95 tmp = (LPC_SYSCON->PDRUNCFG & 0x000025FFL);
Pokitto 0:e8b8f36b4505 96 tmp |= ((1<<7) & 0x000025FFL);
Pokitto 0:e8b8f36b4505 97 LPC_SYSCON->PDRUNCFG = (tmp | 0x0000C800L); /* Power-down SYSPLL */
Pokitto 0:e8b8f36b4505 98
Pokitto 0:e8b8f36b4505 99 //Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_IRC); //switch to IRC
Pokitto 0:e8b8f36b4505 100
Pokitto 0:e8b8f36b4505 101 // clear all gpio states
Pokitto 0:e8b8f36b4505 102 LPC_GPIO_PORT->PIN[0] = 0;
Pokitto 0:e8b8f36b4505 103 LPC_GPIO_PORT->PIN[1] = 0;
Pokitto 0:e8b8f36b4505 104 LPC_GPIO_PORT->PIN[2] = 0;
Pokitto 0:e8b8f36b4505 105
Pokitto 0:e8b8f36b4505 106 SCB->VTOR = app_link_location;//APPL_ADDRESS; /* Change vector table address */
Pokitto 0:e8b8f36b4505 107 /*asm(" mov r0, %[address]"::[address] "r" (app_link_location));
Pokitto 0:e8b8f36b4505 108 asm(" ldr r1, [r0,#0]"); // get the stack pointer value from the program's reset vector
Pokitto 0:e8b8f36b4505 109 asm(" mov sp, r1"); // copy the value to the stack pointer
Pokitto 0:e8b8f36b4505 110 asm(" ldr r0, [r0,#4]"); // get the program counter value from the program's reset vector
Pokitto 0:e8b8f36b4505 111 asm(" blx r0"); // jump to the' start address*/
Pokitto 0:e8b8f36b4505 112 }
Pokitto 0:e8b8f36b4505 113 #endif
Pokitto 0:e8b8f36b4505 114
Pokitto 0:e8b8f36b4505 115 // returns a random integar between 0 and maxVal
Pokitto 0:e8b8f36b4505 116 int random(int maxVal)
Pokitto 0:e8b8f36b4505 117 {
Pokitto 0:e8b8f36b4505 118 return random( 0, maxVal);
Pokitto 0:e8b8f36b4505 119 }
Pokitto 0:e8b8f36b4505 120
Pokitto 0:e8b8f36b4505 121 // returns a random integar between minVal and maxVal
Pokitto 0:e8b8f36b4505 122 int random(int minVal, int maxVal)
Pokitto 0:e8b8f36b4505 123 {
Pokitto 0:e8b8f36b4505 124 // int rand(void); included by default from newlib
Pokitto 0:e8b8f36b4505 125 return rand() % (maxVal-minVal+1) + minVal;
Pokitto 0:e8b8f36b4505 126 }
Pokitto 0:e8b8f36b4505 127
Pokitto 0:e8b8f36b4505 128 using namespace Pokitto;
Pokitto 0:e8b8f36b4505 129
Pokitto 0:e8b8f36b4505 130 bool Core::run_state; // this definition needed
Pokitto 0:e8b8f36b4505 131
Pokitto 0:e8b8f36b4505 132 /** Components */
Pokitto 0:e8b8f36b4505 133 Backlight Core::backlight;
Pokitto 0:e8b8f36b4505 134 Buttons Core::buttons;
Pokitto 0:e8b8f36b4505 135 Battery Core::battery;
Pokitto 0:e8b8f36b4505 136 #if POK_ENABLE_SOUND > 0
Pokitto 0:e8b8f36b4505 137 Sound Core::sound;
Pokitto 0:e8b8f36b4505 138 #endif
Pokitto 0:e8b8f36b4505 139 Display Core::display;
Pokitto 0:e8b8f36b4505 140
Pokitto 0:e8b8f36b4505 141 //GB Related
Pokitto 0:e8b8f36b4505 142 uint8_t Core::startMenuTimer;
Pokitto 0:e8b8f36b4505 143 uint8_t Core::timePerFrame;
Pokitto 0:e8b8f36b4505 144 uint32_t Core::nextFrameMillis;
Pokitto 0:e8b8f36b4505 145 uint32_t Core::frameCount;
Pokitto 0:e8b8f36b4505 146 const char* Core::popupText;
Pokitto 0:e8b8f36b4505 147 uint8_t Core::popupTimeLeft;
Pokitto 0:e8b8f36b4505 148 uint16_t Core::frameDurationMicros;
Pokitto 0:e8b8f36b4505 149 uint32_t Core::frameStartMicros, Core::frameEndMicros;
Pokitto 0:e8b8f36b4505 150 uint8_t Core::volbar_visible=0;
Pokitto 0:e8b8f36b4505 151
Pokitto 0:e8b8f36b4505 152
Pokitto 0:e8b8f36b4505 153 Core::Core() {
Pokitto 0:e8b8f36b4505 154
Pokitto 0:e8b8f36b4505 155 }
Pokitto 0:e8b8f36b4505 156
Pokitto 0:e8b8f36b4505 157 void Core::showWarning() {
Pokitto 0:e8b8f36b4505 158 display.enableDirectPrinting(true);
Pokitto 0:e8b8f36b4505 159 display.directbgcolor = COLOR_BLACK;
Pokitto 0:e8b8f36b4505 160 display.clearLCD();
Pokitto 0:e8b8f36b4505 161 display.directcolor = COLOR_RED;
Pokitto 0:e8b8f36b4505 162 display.setFont(fntC64UIGfx);
Pokitto 0:e8b8f36b4505 163 display.adjustCharStep = 0;
Pokitto 0:e8b8f36b4505 164 display.adjustLineStep = 0;
Pokitto 0:e8b8f36b4505 165 display.setCursor(10*8,9);
Pokitto 0:e8b8f36b4505 166 display.print("WARNING!");
Pokitto 0:e8b8f36b4505 167 display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 168 display.setCursor(5*8,4*9);
Pokitto 0:e8b8f36b4505 169 display.print("LOUD SOUND THROUGH");
Pokitto 0:e8b8f36b4505 170 display.setCursor(2*8,5*9);
Pokitto 0:e8b8f36b4505 171 display.print("HEADPHONES COULD DAMAGE");
Pokitto 0:e8b8f36b4505 172 display.setCursor(7*8,6*9);
Pokitto 0:e8b8f36b4505 173 display.print("YOUR HEARING.");
Pokitto 0:e8b8f36b4505 174 display.setCursor(5*8,8*9);
Pokitto 0:e8b8f36b4505 175 display.print("USE "); display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 176 display.print("0-100% VOLUME");
Pokitto 0:e8b8f36b4505 177 display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 178 display.setCursor(5*8,9*9);
Pokitto 0:e8b8f36b4505 179 display.print("FOR LISTENING WITH");
Pokitto 0:e8b8f36b4505 180 display.setCursor(8*8,10*9);
Pokitto 0:e8b8f36b4505 181 display.print("HEADPHONES");
Pokitto 0:e8b8f36b4505 182 display.setCursor(5*8,12*9);
Pokitto 0:e8b8f36b4505 183 display.print("USE "); display.directcolor = COLOR_RED;
Pokitto 0:e8b8f36b4505 184 display.print("> 100% VOLUME"); display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 185 display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 186 display.setCursor(1*8,13*9);
Pokitto 0:e8b8f36b4505 187 display.print("ONLY FOR LISTENING VIA THE");
Pokitto 0:e8b8f36b4505 188 display.setCursor(5*8,14*9);
Pokitto 0:e8b8f36b4505 189 display.print("BUILT-IN SPEAKER");
Pokitto 0:e8b8f36b4505 190 display.setCursor(5*8,17*9);
Pokitto 0:e8b8f36b4505 191 display.print("PRESS ");display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 192 display.print("C ");display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 193 display.print("TO ACCEPT");
Pokitto 0:e8b8f36b4505 194 while (!buttons.cBtn()) {
Pokitto 0:e8b8f36b4505 195 wait(100);
Pokitto 0:e8b8f36b4505 196 }
Pokitto 0:e8b8f36b4505 197 display.clearLCD();
Pokitto 0:e8b8f36b4505 198 display.enableDirectPrinting(false);
Pokitto 0:e8b8f36b4505 199 }
Pokitto 0:e8b8f36b4505 200
Pokitto 0:e8b8f36b4505 201 void Core::jumpToLoader() {
Pokitto 0:e8b8f36b4505 202 display.fontSize=1;
Pokitto 0:e8b8f36b4505 203 display.directbgcolor=COLOR_BLACK;
Pokitto 0:e8b8f36b4505 204 display.directcolor=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 205 display.setCursor(0,0);
Pokitto 0:e8b8f36b4505 206 display.enableDirectPrinting(true);
Pokitto 1:4b1511a0a2c2 207 display.enableDirectPrinting(true);
Pokitto 1:4b1511a0a2c2 208 display.directbgcolor = COLOR_RED;
Pokitto 1:4b1511a0a2c2 209 display.setCursor(1,1); display.print("GOT TO LOADER");
Pokitto 1:4b1511a0a2c2 210 while(1);
Pokitto 0:e8b8f36b4505 211 #ifdef POK_SIM
Pokitto 0:e8b8f36b4505 212 display.println("LOADER IS NOT AVAILABLE ON THE SIMULATOR. PRESS A TO RETURN.");
Pokitto 0:e8b8f36b4505 213 #else
Pokitto 0:e8b8f36b4505 214 uint32_t* bootinfo;
Pokitto 0:e8b8f36b4505 215 bootinfo = (uint32_t*)0x3FFF4;
Pokitto 0:e8b8f36b4505 216 if (*bootinfo != 0xB007AB1E) display.println("NO LOADER CONNECTED!");
Pokitto 0:e8b8f36b4505 217 else start_application(*(bootinfo+2)); //never returns
Pokitto 0:e8b8f36b4505 218 #endif // POK_SIM
Pokitto 0:e8b8f36b4505 219 while (!buttons.aBtn()) {
Pokitto 0:e8b8f36b4505 220 buttons.pollButtons();
Pokitto 0:e8b8f36b4505 221 if (buttons.aBtn()) {
Pokitto 0:e8b8f36b4505 222 while (buttons.aBtn()) {
Pokitto 0:e8b8f36b4505 223 buttons.pollButtons();
Pokitto 0:e8b8f36b4505 224 }
Pokitto 0:e8b8f36b4505 225 return;
Pokitto 0:e8b8f36b4505 226 }
Pokitto 0:e8b8f36b4505 227 }
Pokitto 0:e8b8f36b4505 228 }
Pokitto 0:e8b8f36b4505 229
Pokitto 0:e8b8f36b4505 230 void Core::askLoader() {
Pokitto 0:e8b8f36b4505 231 display.enableDirectPrinting(true);
Pokitto 0:e8b8f36b4505 232 display.directbgcolor = COLOR_BLACK;
Pokitto 0:e8b8f36b4505 233 display.clearLCD();
Pokitto 0:e8b8f36b4505 234 display.directcolor = COLOR_RED;
Pokitto 0:e8b8f36b4505 235 display.setFont(fntC64UIGfx);
Pokitto 0:e8b8f36b4505 236 display.fontSize=1;
Pokitto 0:e8b8f36b4505 237 display.adjustCharStep = 0;
Pokitto 0:e8b8f36b4505 238 display.adjustLineStep = 0;
Pokitto 0:e8b8f36b4505 239 display.directcolor=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 240 display.set_cursor(12*8,6*8);
Pokitto 0:e8b8f36b4505 241 display.print("ijkl");
Pokitto 0:e8b8f36b4505 242 display.set_cursor(12*8,7*8);
Pokitto 0:e8b8f36b4505 243 display.print("mnop");
Pokitto 0:e8b8f36b4505 244 display.set_cursor(12*8,8*8);
Pokitto 0:e8b8f36b4505 245 display.print("qrst");
Pokitto 0:e8b8f36b4505 246 display.set_cursor(12*8,9*8);
Pokitto 0:e8b8f36b4505 247 display.print("uvwx");
Pokitto 0:e8b8f36b4505 248 display.set_cursor(5*8,12*8);
Pokitto 0:e8b8f36b4505 249 display.print("PRESS");
Pokitto 0:e8b8f36b4505 250 display.directcolor=COLOR_WHITE;
Pokitto 0:e8b8f36b4505 251 display.print(" C ");
Pokitto 0:e8b8f36b4505 252 display.directcolor=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 253 display.print("FOR LOADER");
Pokitto 0:e8b8f36b4505 254 display.directcolor=COLOR_WHITE;
Pokitto 0:e8b8f36b4505 255 display.fontSize=2;
Pokitto 0:e8b8f36b4505 256 int countd=POK_LOADER_COUNTDOWN; uint16_t c2 = getTime();
Pokitto 0:e8b8f36b4505 257 while (countd) {
Pokitto 0:e8b8f36b4505 258 buttons.pollButtons();
Pokitto 0:e8b8f36b4505 259 display.set_cursor(13*8,15*8);
Pokitto 0:e8b8f36b4505 260 display.print(countd);
Pokitto 0:e8b8f36b4505 261 if (getTime()>c2+1000) {
Pokitto 0:e8b8f36b4505 262 c2=getTime();
Pokitto 0:e8b8f36b4505 263 countd--;
Pokitto 0:e8b8f36b4505 264 }
Pokitto 0:e8b8f36b4505 265 if (cBtn()) {while (cBtn()) buttons.pollButtons();jumpToLoader();countd=0;}
Pokitto 0:e8b8f36b4505 266 if (aBtn()) {while (aBtn()) buttons.pollButtons();countd=0;}
Pokitto 0:e8b8f36b4505 267 if (bBtn()) {while (bBtn()) buttons.pollButtons();countd=0;}
Pokitto 0:e8b8f36b4505 268 }
Pokitto 0:e8b8f36b4505 269 display.fontSize=1;
Pokitto 0:e8b8f36b4505 270 display.clearLCD();
Pokitto 0:e8b8f36b4505 271 display.enableDirectPrinting(false);
Pokitto 0:e8b8f36b4505 272 }
Pokitto 0:e8b8f36b4505 273
Pokitto 0:e8b8f36b4505 274
Pokitto 0:e8b8f36b4505 275 void Core::drawvolbar(int x, int y, int level, bool text) {
Pokitto 0:e8b8f36b4505 276 uint16_t oldcol = display.directcolor;
Pokitto 0:e8b8f36b4505 277 if (text) display.directRectangle(0,0,50,50,COLOR_BLACK);
Pokitto 0:e8b8f36b4505 278 display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 279 if (text) {
Pokitto 0:e8b8f36b4505 280 bool temp = display.isDirectPrintingEnabled();
Pokitto 0:e8b8f36b4505 281 display.enableDirectPrinting(true);
Pokitto 0:e8b8f36b4505 282 display.print(x-1,y-20,(int)sound.getVolume());
Pokitto 0:e8b8f36b4505 283 display.print(" ");
Pokitto 0:e8b8f36b4505 284 display.enableDirectPrinting(temp);
Pokitto 0:e8b8f36b4505 285 }
Pokitto 0:e8b8f36b4505 286 if (level<12) display.directcolor = COLOR_GRAY_80;
Pokitto 0:e8b8f36b4505 287 display.directBitmap(x,y,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 288 if (level<24) display.directcolor = COLOR_GRAY_80;
Pokitto 0:e8b8f36b4505 289 display.directBitmap(x+8,y,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 290 display.directBitmap(x+8,y-4,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 291 display.directcolor = COLOR_RED;
Pokitto 0:e8b8f36b4505 292 if (level<48) display.directcolor = COLOR_GRAY_80;
Pokitto 0:e8b8f36b4505 293 display.directBitmap(x+16,y,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 294 display.directBitmap(x+16,y-4,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 295 display.directBitmap(x+16,y-8,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 296
Pokitto 0:e8b8f36b4505 297 if (level<96) {
Pokitto 0:e8b8f36b4505 298 display.directcolor = COLOR_GRAY_80;
Pokitto 0:e8b8f36b4505 299 }
Pokitto 0:e8b8f36b4505 300 display.directBitmap(x+24,y,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 301 display.directBitmap(x+24,y-4,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 302 display.directBitmap(x+24,y-8,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 303 display.directBitmap(x+24,y-12,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 304 if (level<160) {
Pokitto 0:e8b8f36b4505 305 display.directcolor = COLOR_GRAY_80;
Pokitto 0:e8b8f36b4505 306 }
Pokitto 0:e8b8f36b4505 307 display.directBitmap(x+32,y,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 308 display.directBitmap(x+32,y-4,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 309 display.directBitmap(x+32,y-8,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 310 display.directBitmap(x+32,y-12,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 311 display.directBitmap(x+32,y-16,Pokitto_volumebar,1,1);
Pokitto 0:e8b8f36b4505 312 display.directcolor = oldcol;
Pokitto 0:e8b8f36b4505 313 }
Pokitto 0:e8b8f36b4505 314
Pokitto 0:e8b8f36b4505 315
Pokitto 0:e8b8f36b4505 316 #ifdef POK_SIM
Pokitto 0:e8b8f36b4505 317 #define VINCMULT 1
Pokitto 0:e8b8f36b4505 318 #else
Pokitto 0:e8b8f36b4505 319 #define VINCMULT 50
Pokitto 0:e8b8f36b4505 320 #endif //POK_SIM
Pokitto 0:e8b8f36b4505 321 void Core::setVolLimit() {
Pokitto 0:e8b8f36b4505 322 display.enableDirectPrinting(true);
Pokitto 0:e8b8f36b4505 323 display.adjustCharStep = 0;
Pokitto 0:e8b8f36b4505 324 sound.setMaxVol(VOLUME_HEADPHONE_MAX);
Pokitto 0:e8b8f36b4505 325 int dstate=1;
Pokitto 0:e8b8f36b4505 326 bool wipe = true;
Pokitto 0:e8b8f36b4505 327 float vol = sound.getVolume(); float tvol;
Pokitto 0:e8b8f36b4505 328 volbar_visible=0;
Pokitto 0:e8b8f36b4505 329 while (core.isRunning() && dstate){
Pokitto 0:e8b8f36b4505 330 switch (dstate) {
Pokitto 0:e8b8f36b4505 331 case 1:
Pokitto 0:e8b8f36b4505 332 //redraw
Pokitto 0:e8b8f36b4505 333 if (wipe) {
Pokitto 0:e8b8f36b4505 334 display.clearLCD();
Pokitto 0:e8b8f36b4505 335 display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 336 display.setCursor(4*8,2*8);
Pokitto 0:e8b8f36b4505 337 display.print("SELECT VOLUME LIMIT");
Pokitto 0:e8b8f36b4505 338 display.setCursor(5*8,17*9);
Pokitto 0:e8b8f36b4505 339 display.print("PRESS ");
Pokitto 0:e8b8f36b4505 340 display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 341 display.print("A");
Pokitto 0:e8b8f36b4505 342 display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 343 display.print(" TO ACCEPT");
Pokitto 0:e8b8f36b4505 344 display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 345 // draw frame below first
Pokitto 0:e8b8f36b4505 346 display.setCursor(0,11*8);
Pokitto 0:e8b8f36b4505 347 display.println(" abbbbbbbbbbbbbbbbbbbbbbbc");
Pokitto 0:e8b8f36b4505 348 display.println(" | |");
Pokitto 0:e8b8f36b4505 349 display.println(" | |");
Pokitto 0:e8b8f36b4505 350 display.println(" | |");
Pokitto 0:e8b8f36b4505 351 display.println(" | |");
Pokitto 0:e8b8f36b4505 352 display.println(" dbbbbbbbbbbbbbbbbbbbbbbbe");
Pokitto 0:e8b8f36b4505 353 } // wipe = true
Pokitto 0:e8b8f36b4505 354 display.setCursor(6*8,17*9);
Pokitto 0:e8b8f36b4505 355 if (sound.getVolume()-5<=VOLUME_HEADPHONE_MAX) display.directcolor = COLOR_WHITE;
Pokitto 0:e8b8f36b4505 356 else display.directcolor = COLOR_RED;
Pokitto 0:e8b8f36b4505 357 display.directBitmap(21*8-4,6*8,Pokitto_headphones,1,2);
Pokitto 0:e8b8f36b4505 358 display.setCursor(3*8,6*8+6);
Pokitto 0:e8b8f36b4505 359 display.print("HEADPHONES");
Pokitto 0:e8b8f36b4505 360 display.setCursor(3*8,8*8+2);
Pokitto 0:e8b8f36b4505 361 if (sound.getVolume()-8>VOLUME_HEADPHONE_MAX) display.print("TOO LOUD!");
Pokitto 0:e8b8f36b4505 362 else display.print("OK ");
Pokitto 0:e8b8f36b4505 363 display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 364 display.directBitmap(21*8-4,12*8,Pokitto_speaker,1,2);
Pokitto 0:e8b8f36b4505 365 display.setCursor(3*8,12*8+6);
Pokitto 0:e8b8f36b4505 366 display.print("VOLUME MAX");
Pokitto 0:e8b8f36b4505 367 display.setCursor(3*8,14*8+2);
Pokitto 0:e8b8f36b4505 368 tvol = (vol/float(VOLUME_HEADPHONE_MAX))*100;
Pokitto 0:e8b8f36b4505 369 if (tvol > 100 && tvol < 120) tvol=100;
Pokitto 0:e8b8f36b4505 370 if (sound.getVolume()-5>VOLUME_HEADPHONE_MAX) { display.directcolor=COLOR_RED;}
Pokitto 0:e8b8f36b4505 371 else display.directcolor=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 372 display.print(int(sound.getVolume()));
Pokitto 0:e8b8f36b4505 373 //display.print(int(tvol));
Pokitto 0:e8b8f36b4505 374 display.print(" ");
Pokitto 0:e8b8f36b4505 375 display.directcolor=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 376 drawvolbar(14*8,14*8+4+2,sound.getVolume(),false);
Pokitto 0:e8b8f36b4505 377 //display.setCursor(1,10);
Pokitto 0:e8b8f36b4505 378 //display.print(vol);
Pokitto 0:e8b8f36b4505 379 dstate=2; break;
Pokitto 0:e8b8f36b4505 380 case 2:
Pokitto 0:e8b8f36b4505 381 buttons.pollButtons();
Pokitto 0:e8b8f36b4505 382 if (aBtn()) {dstate=0;while(aBtn()){buttons.pollButtons();};break;}
Pokitto 0:e8b8f36b4505 383 if (rightBtn()) {
Pokitto 0:e8b8f36b4505 384 if (vol >= VOLUME_HEADPHONE_MAX && vol < VOLUME_HEADPHONE_MAX+1 ) vol += 0.00025f*VINCMULT;
Pokitto 0:e8b8f36b4505 385 else if (vol >= VOLUME_HEADPHONE_MAX) vol += 0.025f*VINCMULT;
Pokitto 0:e8b8f36b4505 386 else vol += 0.05f*VINCMULT;
Pokitto 0:e8b8f36b4505 387 if (vol > VOLUME_HEADPHONE_MAX + 20) {
Pokitto 0:e8b8f36b4505 388 sound.setMaxVol(VOLUME_SPEAKER_MAX);
Pokitto 0:e8b8f36b4505 389 }
Pokitto 0:e8b8f36b4505 390 if (vol > VOLUME_SPEAKER_MAX) vol=VOLUME_SPEAKER_MAX;
Pokitto 0:e8b8f36b4505 391 sound.setVolume(vol);
Pokitto 0:e8b8f36b4505 392 dstate=1; wipe=false;
Pokitto 0:e8b8f36b4505 393 break;
Pokitto 0:e8b8f36b4505 394 }
Pokitto 0:e8b8f36b4505 395 if (leftBtn()) {
Pokitto 0:e8b8f36b4505 396 vol -= 0.025f*VINCMULT;
Pokitto 0:e8b8f36b4505 397 if (vol <= VOLUME_HEADPHONE_MAX) sound.setMaxVol(VOLUME_HEADPHONE_MAX);
Pokitto 0:e8b8f36b4505 398 if (vol < 0) vol=0;
Pokitto 0:e8b8f36b4505 399 sound.setVolume(vol);
Pokitto 0:e8b8f36b4505 400 dstate=1; wipe=false;
Pokitto 0:e8b8f36b4505 401 break;
Pokitto 0:e8b8f36b4505 402 }
Pokitto 0:e8b8f36b4505 403 break;
Pokitto 0:e8b8f36b4505 404 }
Pokitto 0:e8b8f36b4505 405 }
Pokitto 0:e8b8f36b4505 406 }
Pokitto 0:e8b8f36b4505 407
Pokitto 0:e8b8f36b4505 408 void Core::begin() {
Pokitto 0:e8b8f36b4505 409
Pokitto 0:e8b8f36b4505 410 init(); // original functions
Pokitto 0:e8b8f36b4505 411 timePerFrame = POK_FRAMEDURATION;
Pokitto 0:e8b8f36b4505 412 //nextFrameMillis = 0;
Pokitto 0:e8b8f36b4505 413 //frameCount = 0;
Pokitto 0:e8b8f36b4505 414 frameEndMicros = 1;
Pokitto 0:e8b8f36b4505 415 startMenuTimer = 255;
Pokitto 0:e8b8f36b4505 416 //read default settings from flash memory (set using settings.hex)
Pokitto 0:e8b8f36b4505 417 readSettings();
Pokitto 0:e8b8f36b4505 418 //init everything
Pokitto 0:e8b8f36b4505 419 backlight.begin();
Pokitto 0:e8b8f36b4505 420 backlight.set(BACKLIGHT_MAX);
Pokitto 0:e8b8f36b4505 421 buttons.begin();
Pokitto 0:e8b8f36b4505 422 buttons.update();
Pokitto 0:e8b8f36b4505 423 battery.begin();
Pokitto 0:e8b8f36b4505 424 display.begin();
Pokitto 0:e8b8f36b4505 425 #if POK_DISPLAYLOGO
Pokitto 0:e8b8f36b4505 426 showLogo();
Pokitto 0:e8b8f36b4505 427 #endif // POK_DISPLAYLOGO
Pokitto 0:e8b8f36b4505 428 display.enableDirectPrinting(true);
Pokitto 0:e8b8f36b4505 429 display.directbgcolor = COLOR_BLACK;
Pokitto 0:e8b8f36b4505 430 display.clearLCD();
Pokitto 0:e8b8f36b4505 431 display.setFont(fntC64UIGfx);
Pokitto 0:e8b8f36b4505 432 askLoader();
Pokitto 0:e8b8f36b4505 433 #ifndef DISABLE_SOUND_WARNING
Pokitto 0:e8b8f36b4505 434 //showWarning();
Pokitto 0:e8b8f36b4505 435 setVolLimit();
Pokitto 0:e8b8f36b4505 436 //sound.setVolume(sound.getVolume());//make sure we're at set volume before continue
Pokitto 0:e8b8f36b4505 437 sound.volumeUp();
Pokitto 0:e8b8f36b4505 438 #endif
Pokitto 0:e8b8f36b4505 439 display.enableDirectPrinting(false);
Pokitto 0:e8b8f36b4505 440 display.adjustCharStep=1;
Pokitto 0:e8b8f36b4505 441 display.adjustLineStep=1;
Pokitto 0:e8b8f36b4505 442 display.fontSize=1;
Pokitto 0:e8b8f36b4505 443 display.textWrap=true;
Pokitto 0:e8b8f36b4505 444 #if POK_GAMEBUINO_SUPPORT > 0
Pokitto 0:e8b8f36b4505 445 display.setFont(font5x7);
Pokitto 0:e8b8f36b4505 446 #else
Pokitto 0:e8b8f36b4505 447 display.setFont(fontC64);
Pokitto 0:e8b8f36b4505 448 #endif
Pokitto 1:4b1511a0a2c2 449
Pokitto 0:e8b8f36b4505 450 #if POK_ENABLE_SOUND > 0
Pokitto 0:e8b8f36b4505 451 sound.begin();
Pokitto 1:4b1511a0a2c2 452
Pokitto 0:e8b8f36b4505 453 //mute when B is held during start up or if battery is low
Pokitto 0:e8b8f36b4505 454 battery.update();
Pokitto 1:4b1511a0a2c2 455
Pokitto 0:e8b8f36b4505 456 if(buttons.pressed(BTN_B) || (battery.level == 0)){
Pokitto 0:e8b8f36b4505 457 sound.setVolume(0);
Pokitto 0:e8b8f36b4505 458 }
Pokitto 0:e8b8f36b4505 459 else{ //play the startup sound on each channel for it to be louder
Pokitto 0:e8b8f36b4505 460 #if POK_GBSOUND > 0
Pokitto 0:e8b8f36b4505 461 #if(NUM_CHANNELS > 0)
Pokitto 0:e8b8f36b4505 462 sound.playPattern(startupSound, 0);
Pokitto 0:e8b8f36b4505 463 #endif
Pokitto 0:e8b8f36b4505 464 #if(NUM_CHANNELS > 1)
Pokitto 0:e8b8f36b4505 465 sound.playPattern(startupSound, 1);
Pokitto 0:e8b8f36b4505 466 #endif
Pokitto 0:e8b8f36b4505 467 #if(NUM_CHANNELS > 2)
Pokitto 0:e8b8f36b4505 468 sound.playPattern(startupSound, 2);
Pokitto 0:e8b8f36b4505 469 #endif
Pokitto 0:e8b8f36b4505 470 #if(NUM_CHANNELS > 3)
Pokitto 0:e8b8f36b4505 471 sound.playPattern(startupSound, 3);
Pokitto 0:e8b8f36b4505 472 #endif
Pokitto 0:e8b8f36b4505 473 #endif // POK_GBSOUND
Pokitto 0:e8b8f36b4505 474 }
Pokitto 0:e8b8f36b4505 475 #endif // POK ENABLE_SOUND
Pokitto 1:4b1511a0a2c2 476 display.enableDirectPrinting(true);
Pokitto 1:4b1511a0a2c2 477 display.directbgcolor = COLOR_RED;
Pokitto 1:4b1511a0a2c2 478 display.setCursor(1,1); display.print("GOT HERE");
Pokitto 1:4b1511a0a2c2 479 while(1);
Pokitto 0:e8b8f36b4505 480 }
Pokitto 0:e8b8f36b4505 481
Pokitto 0:e8b8f36b4505 482 void Core::init() {
Pokitto 0:e8b8f36b4505 483 run_state = true;
Pokitto 0:e8b8f36b4505 484 display.enableDirectPrinting(false);
Pokitto 0:e8b8f36b4505 485 display.setFont(DEFAULT_FONT);
Pokitto 0:e8b8f36b4505 486 initClock();
Pokitto 0:e8b8f36b4505 487 initGPIO();
Pokitto 0:e8b8f36b4505 488 initButtons();
Pokitto 0:e8b8f36b4505 489 initRandom();
Pokitto 0:e8b8f36b4505 490 //initAudio();
Pokitto 0:e8b8f36b4505 491 //initDisplay();
Pokitto 0:e8b8f36b4505 492 }
Pokitto 0:e8b8f36b4505 493
Pokitto 0:e8b8f36b4505 494 void Core::init(uint8_t switches) {
Pokitto 0:e8b8f36b4505 495 run_state = true;
Pokitto 0:e8b8f36b4505 496 display.enableDirectPrinting(false);
Pokitto 0:e8b8f36b4505 497 display.setFont(DEFAULT_FONT);
Pokitto 0:e8b8f36b4505 498 initClock();
Pokitto 0:e8b8f36b4505 499 initGPIO();
Pokitto 0:e8b8f36b4505 500 initButtons();
Pokitto 0:e8b8f36b4505 501 initRandom();
Pokitto 0:e8b8f36b4505 502 //initAudio();
Pokitto 0:e8b8f36b4505 503 //initDisplay();
Pokitto 0:e8b8f36b4505 504 }
Pokitto 0:e8b8f36b4505 505
Pokitto 0:e8b8f36b4505 506 void Core::initButtons() {
Pokitto 0:e8b8f36b4505 507 #ifndef POK_SIM
Pokitto 0:e8b8f36b4505 508 Pokitto::initButtons();
Pokitto 0:e8b8f36b4505 509 #endif
Pokitto 0:e8b8f36b4505 510 }
Pokitto 0:e8b8f36b4505 511
Pokitto 0:e8b8f36b4505 512 bool Core::isRunning() {
Pokitto 0:e8b8f36b4505 513 #ifdef POK_SIM
Pokitto 0:e8b8f36b4505 514 run_state = simulator.isRunning();
Pokitto 0:e8b8f36b4505 515 #endif // POK_SIM
Pokitto 0:e8b8f36b4505 516 return run_state;
Pokitto 0:e8b8f36b4505 517 }
Pokitto 0:e8b8f36b4505 518
Pokitto 0:e8b8f36b4505 519 void Core::initDisplay() {
Pokitto 0:e8b8f36b4505 520 #if POK_DISPLAYLOGO > 0
Pokitto 0:e8b8f36b4505 521 showLogo();
Pokitto 0:e8b8f36b4505 522 #endif
Pokitto 0:e8b8f36b4505 523 #if POK_USE_CONSOLE > 0
Pokitto 0:e8b8f36b4505 524 console.AddMessage(MSOURCE_LCD,MSG_INIT_OK);
Pokitto 0:e8b8f36b4505 525 #endif
Pokitto 0:e8b8f36b4505 526 }
Pokitto 0:e8b8f36b4505 527
Pokitto 0:e8b8f36b4505 528 void Core::showLogo() {
Pokitto 0:e8b8f36b4505 529 uint32_t now;
Pokitto 0:e8b8f36b4505 530 uint8_t state=0; //jump directly to logo, bypass teeth
Pokitto 2:968589ca3484 531 uint16_t i=0;
Pokitto 0:e8b8f36b4505 532 uint16_t sc;
Pokitto 0:e8b8f36b4505 533 while (state < 255/6) {
Pokitto 0:e8b8f36b4505 534 now=getTime();
Pokitto 0:e8b8f36b4505 535 if (now>refreshtime) {
Pokitto 0:e8b8f36b4505 536 refreshtime=now+30;
Pokitto 0:e8b8f36b4505 537 switch (state) {
Pokitto 0:e8b8f36b4505 538 case 0:
Pokitto 0:e8b8f36b4505 539 /** POKITTO CLEAN **/
Pokitto 0:e8b8f36b4505 540 display.directbgcolor = COLOR_BLACK;
Pokitto 0:e8b8f36b4505 541 display.fillLCD(display.directbgcolor);
Pokitto 0:e8b8f36b4505 542 sc = COLOR_BLACK;
Pokitto 0:e8b8f36b4505 543 state++;
Pokitto 0:e8b8f36b4505 544 break;
Pokitto 0:e8b8f36b4505 545 case 1:
Pokitto 0:e8b8f36b4505 546 /** POKITTO FADE IN **/
Pokitto 0:e8b8f36b4505 547 display.directcolor = display.interpolateColor(sc, COLOR_GREEN, i);
Pokitto 0:e8b8f36b4505 548 display.directBitmap(POK_LCD_W/2 - (*Pokitto_logo/2),POK_LCD_H/2-(*(Pokitto_logo+1)/2),Pokitto_logo,1,1);
Pokitto 0:e8b8f36b4505 549 i += 28;
Pokitto 0:e8b8f36b4505 550 if (i>=0xFF) { state++; i=0;}
Pokitto 0:e8b8f36b4505 551 break;
Pokitto 0:e8b8f36b4505 552 case 2:
Pokitto 0:e8b8f36b4505 553 /** POKITTO WAIT **/
Pokitto 0:e8b8f36b4505 554 display.directcolor = COLOR_GREEN;
Pokitto 0:e8b8f36b4505 555 display.directBitmap(POK_LCD_W/2 - (*Pokitto_logo/2),POK_LCD_H/2-(*(Pokitto_logo+1)/2),Pokitto_logo,1,1);
Pokitto 0:e8b8f36b4505 556 i+= 0x3F;
Pokitto 0:e8b8f36b4505 557 if (i>0x3FF) state = 255;
Pokitto 0:e8b8f36b4505 558 break;
Pokitto 0:e8b8f36b4505 559 }
Pokitto 0:e8b8f36b4505 560 if(buttons.aBtn()) state=255;
Pokitto 0:e8b8f36b4505 561 }
Pokitto 0:e8b8f36b4505 562 }
Pokitto 0:e8b8f36b4505 563 }
Pokitto 0:e8b8f36b4505 564
Pokitto 0:e8b8f36b4505 565 void Core::readSettings() {
Pokitto 0:e8b8f36b4505 566 // ToDo
Pokitto 0:e8b8f36b4505 567 /*display.contrast = SCR_CONTRAST;
Pokitto 0:e8b8f36b4505 568 backlight.backlightMin = BACKLIGHT_MIN;
Pokitto 0:e8b8f36b4505 569 backlight.backlightMax = BACKLIGHT_MAX;
Pokitto 0:e8b8f36b4505 570 backlight.ambientLightMin = AMBIENTLIGHT_MIN;
Pokitto 0:e8b8f36b4505 571 backlight.ambientLightMax = AMBIENTLIGHT_MAX;
Pokitto 0:e8b8f36b4505 572 */
Pokitto 0:e8b8f36b4505 573 sound.setMaxVol(VOLUME_HEADPHONE_MAX);
Pokitto 0:e8b8f36b4505 574 sound.globalVolume = VOLUME_STARTUP;
Pokitto 0:e8b8f36b4505 575
Pokitto 0:e8b8f36b4505 576 startMenuTimer = START_MENU_TIMER;
Pokitto 0:e8b8f36b4505 577 /*
Pokitto 0:e8b8f36b4505 578 battery.thresolds[0] = BAT_LVL_CRITIC;
Pokitto 0:e8b8f36b4505 579 battery.thresolds[1] = BAT_LVL_LOW;
Pokitto 0:e8b8f36b4505 580 battery.thresolds[2] = BAT_LVL_MED;
Pokitto 0:e8b8f36b4505 581 battery.thresolds[3] = BAT_LVL_FULL;*/
Pokitto 0:e8b8f36b4505 582 }
Pokitto 0:e8b8f36b4505 583
Pokitto 0:e8b8f36b4505 584 void Core::titleScreen(const char* name){
Pokitto 0:e8b8f36b4505 585 titleScreen(name, 0);
Pokitto 0:e8b8f36b4505 586 }
Pokitto 0:e8b8f36b4505 587
Pokitto 0:e8b8f36b4505 588 void Core::titleScreen(const uint8_t* logo){
Pokitto 2:968589ca3484 589 titleScreen((""), logo);
Pokitto 0:e8b8f36b4505 590 }
Pokitto 0:e8b8f36b4505 591
Pokitto 0:e8b8f36b4505 592 void Core::titleScreen(){
Pokitto 2:968589ca3484 593 titleScreen((""));
Pokitto 0:e8b8f36b4505 594 }
Pokitto 0:e8b8f36b4505 595
Pokitto 0:e8b8f36b4505 596 void Core::titleScreen(const char* name, const uint8_t *logo){
Pokitto 0:e8b8f36b4505 597 display.setFont(font5x7);
Pokitto 0:e8b8f36b4505 598 if(startMenuTimer){
Pokitto 0:e8b8f36b4505 599 display.fontSize = 1;
Pokitto 0:e8b8f36b4505 600 display.textWrap = false;
Pokitto 0:e8b8f36b4505 601 display.persistence = false;
Pokitto 0:e8b8f36b4505 602 battery.show = false;
Pokitto 0:e8b8f36b4505 603 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 604 while(isRunning()){
Pokitto 0:e8b8f36b4505 605 if(update()){
Pokitto 0:e8b8f36b4505 606 uint8_t logoOffset = name[0]?display.fontHeight:0; //add an offset the logo when there is a name to display
Pokitto 0:e8b8f36b4505 607 //draw graphics
Pokitto 0:e8b8f36b4505 608 display.setColorDepth(1);
Pokitto 0:e8b8f36b4505 609 display.setColor(3);
Pokitto 0:e8b8f36b4505 610 //display.drawBitmap(0,0, gamebuinoLogo);
Pokitto 0:e8b8f36b4505 611 display.setColor(1);
Pokitto 0:e8b8f36b4505 612 if(logo){
Pokitto 0:e8b8f36b4505 613 display.drawBitmap(0, 12+logoOffset, logo);
Pokitto 0:e8b8f36b4505 614 }
Pokitto 0:e8b8f36b4505 615 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 616 display.cursorY = 12;
Pokitto 0:e8b8f36b4505 617 display.print(name);
Pokitto 0:e8b8f36b4505 618
Pokitto 0:e8b8f36b4505 619 //A button
Pokitto 0:e8b8f36b4505 620 display.cursorX = LCDWIDTH - display.fontWidth*3 -1;
Pokitto 0:e8b8f36b4505 621 display.cursorY = LCDHEIGHT - display.fontHeight*3 - 3;
Pokitto 0:e8b8f36b4505 622 if((frameCount/16)%2)
Pokitto 2:968589ca3484 623 display.println(("\25 \20"));
Pokitto 0:e8b8f36b4505 624 else
Pokitto 2:968589ca3484 625 display.println(("\25\20 "));
Pokitto 0:e8b8f36b4505 626 //B button
Pokitto 0:e8b8f36b4505 627 display.cursorX = LCDWIDTH - display.fontWidth*3 - 1;
Pokitto 0:e8b8f36b4505 628 display.cursorY++;
Pokitto 0:e8b8f36b4505 629 if(sound.globalVolume)
Pokitto 2:968589ca3484 630 display.println(("\26\23\24"));
Pokitto 0:e8b8f36b4505 631 else
Pokitto 2:968589ca3484 632 display.println(("\26\23x"));
Pokitto 0:e8b8f36b4505 633 //C button
Pokitto 0:e8b8f36b4505 634 display.cursorX = LCDWIDTH - display.fontWidth*3 - 1;
Pokitto 0:e8b8f36b4505 635 display.cursorY++;
Pokitto 0:e8b8f36b4505 636 //display.println(F("\27SD"));
Pokitto 0:e8b8f36b4505 637
Pokitto 0:e8b8f36b4505 638 //toggle volume when B is pressed
Pokitto 0:e8b8f36b4505 639 if(buttons.pressed(BTN_B)){
Pokitto 0:e8b8f36b4505 640 sound.setVolume(sound.getVolume() + 1);
Pokitto 0:e8b8f36b4505 641 sound.playTick();
Pokitto 0:e8b8f36b4505 642 }
Pokitto 0:e8b8f36b4505 643 //leave the menu
Pokitto 0:e8b8f36b4505 644 if(buttons.pressed(BTN_A) || ((frameCount>=startMenuTimer)&&(startMenuTimer != 255))){
Pokitto 0:e8b8f36b4505 645 startMenuTimer = 255; //don't automatically skip the title screen next time it's displayed
Pokitto 0:e8b8f36b4505 646 sound.stopPattern(0);
Pokitto 0:e8b8f36b4505 647 sound.playOK();
Pokitto 0:e8b8f36b4505 648 break;
Pokitto 0:e8b8f36b4505 649 }
Pokitto 0:e8b8f36b4505 650 //flash the loader
Pokitto 0:e8b8f36b4505 651 //if(buttons.pressed(BTN_C))
Pokitto 0:e8b8f36b4505 652 // ToDo changeGame();
Pokitto 0:e8b8f36b4505 653 }
Pokitto 0:e8b8f36b4505 654 }
Pokitto 0:e8b8f36b4505 655 battery.show = true;
Pokitto 0:e8b8f36b4505 656 }
Pokitto 0:e8b8f36b4505 657 }
Pokitto 0:e8b8f36b4505 658
Pokitto 0:e8b8f36b4505 659 bool Core::update(bool useDirectMode) {
Pokitto 0:e8b8f36b4505 660 #if POK_STREAMING_MUSIC
Pokitto 0:e8b8f36b4505 661 sound.updateStream();
Pokitto 0:e8b8f36b4505 662 #endif
Pokitto 0:e8b8f36b4505 663
Pokitto 0:e8b8f36b4505 664 if ((((nextFrameMillis - getTime())) > timePerFrame) && frameEndMicros) { //if time to render a new frame is reached and the frame end has ran once
Pokitto 0:e8b8f36b4505 665 nextFrameMillis = getTime() + timePerFrame;
Pokitto 0:e8b8f36b4505 666 frameCount++;
Pokitto 0:e8b8f36b4505 667
Pokitto 0:e8b8f36b4505 668 frameEndMicros = 0;
Pokitto 0:e8b8f36b4505 669 backlight.update();
Pokitto 0:e8b8f36b4505 670 buttons.update();
Pokitto 0:e8b8f36b4505 671 battery.update();
Pokitto 0:e8b8f36b4505 672
Pokitto 0:e8b8f36b4505 673 return true;
Pokitto 0:e8b8f36b4505 674
Pokitto 0:e8b8f36b4505 675 } else {
Pokitto 0:e8b8f36b4505 676 if (!frameEndMicros) { //runs once at the end of the frame
Pokitto 0:e8b8f36b4505 677 #if POK_ENABLE_SOUND > 0
Pokitto 0:e8b8f36b4505 678 sound.updateTrack();
Pokitto 0:e8b8f36b4505 679 sound.updatePattern();
Pokitto 0:e8b8f36b4505 680 sound.updateNote();
Pokitto 0:e8b8f36b4505 681 #endif
Pokitto 0:e8b8f36b4505 682 updatePopup();
Pokitto 0:e8b8f36b4505 683 displayBattery();
Pokitto 0:e8b8f36b4505 684
Pokitto 0:e8b8f36b4505 685 if(!useDirectMode)
Pokitto 0:e8b8f36b4505 686 display.update(); //send the buffer to the screen
Pokitto 0:e8b8f36b4505 687
Pokitto 0:e8b8f36b4505 688 frameEndMicros = 1; //jonne
Pokitto 0:e8b8f36b4505 689
Pokitto 0:e8b8f36b4505 690 }
Pokitto 0:e8b8f36b4505 691 return false;
Pokitto 0:e8b8f36b4505 692 }
Pokitto 0:e8b8f36b4505 693 }
Pokitto 0:e8b8f36b4505 694
Pokitto 0:e8b8f36b4505 695 void Core::displayBattery(){
Pokitto 0:e8b8f36b4505 696 #if (ENABLE_BATTERY > 0)
Pokitto 0:e8b8f36b4505 697 //display.setColor(BLACK, WHITE);
Pokitto 0:e8b8f36b4505 698 uint8_t ox,oy;
Pokitto 0:e8b8f36b4505 699 ox=display.cursorX;
Pokitto 0:e8b8f36b4505 700 oy=display.cursorY;
Pokitto 0:e8b8f36b4505 701 display.cursorX = LCDWIDTH-display.fontWidth+1;
Pokitto 0:e8b8f36b4505 702 display.cursorY = 0;
Pokitto 0:e8b8f36b4505 703 switch(battery.level){
Pokitto 0:e8b8f36b4505 704 case 0://battery critic, power down
Pokitto 0:e8b8f36b4505 705 sound.stopPattern();
Pokitto 0:e8b8f36b4505 706 backlight.set(0);
Pokitto 0:e8b8f36b4505 707 display.clear();
Pokitto 0:e8b8f36b4505 708 display.fontSize = 1;
Pokitto 2:968589ca3484 709 display.print(("LOW BATTERY\n"));
Pokitto 0:e8b8f36b4505 710 display.print(battery.voltage);
Pokitto 2:968589ca3484 711 display.print(("mV\n\nPLEASE\nTURN OFF"));
Pokitto 0:e8b8f36b4505 712 display.update();
Pokitto 0:e8b8f36b4505 713 break;
Pokitto 0:e8b8f36b4505 714 case 1: //empty battery
Pokitto 0:e8b8f36b4505 715 if((frameCount % 16) < 8) display.print('\7'); //blinking battery
Pokitto 0:e8b8f36b4505 716 else display.print('x');
Pokitto 0:e8b8f36b4505 717 break;
Pokitto 0:e8b8f36b4505 718 case 2://low battery
Pokitto 0:e8b8f36b4505 719 case 3://full battery
Pokitto 0:e8b8f36b4505 720 case 4://full battery
Pokitto 0:e8b8f36b4505 721 if(battery.show){
Pokitto 0:e8b8f36b4505 722 display.print(char(5+battery.level));
Pokitto 0:e8b8f36b4505 723 }
Pokitto 0:e8b8f36b4505 724 break;
Pokitto 0:e8b8f36b4505 725 default:
Pokitto 0:e8b8f36b4505 726 if(battery.show){
Pokitto 0:e8b8f36b4505 727 display.print('/');
Pokitto 0:e8b8f36b4505 728 }
Pokitto 0:e8b8f36b4505 729 break;
Pokitto 0:e8b8f36b4505 730 }
Pokitto 0:e8b8f36b4505 731 display.cursorX = ox;
Pokitto 0:e8b8f36b4505 732 display.cursorY = oy;
Pokitto 0:e8b8f36b4505 733 #endif
Pokitto 0:e8b8f36b4505 734 }
Pokitto 0:e8b8f36b4505 735
Pokitto 0:e8b8f36b4505 736 char* Core::filemenu(char *ext) {
Pokitto 0:e8b8f36b4505 737 display.persistence = false;
Pokitto 0:e8b8f36b4505 738 uint16_t oldpal0=display.palette[0];
Pokitto 0:e8b8f36b4505 739 uint16_t oldpal1=display.palette[1];
Pokitto 0:e8b8f36b4505 740 uint16_t oldpal2=display.palette[2];
Pokitto 0:e8b8f36b4505 741 display.palette[2]=COLOR_GREEN;
Pokitto 0:e8b8f36b4505 742 display.palette[1]=COLOR_WHITE;
Pokitto 0:e8b8f36b4505 743 display.palette[0]=COLOR_BLACK;
Pokitto 0:e8b8f36b4505 744 uint8_t oldbg=display.bgcolor;
Pokitto 0:e8b8f36b4505 745 uint8_t oldfg=display.color;
Pokitto 0:e8b8f36b4505 746 display.color=1;
Pokitto 0:e8b8f36b4505 747 display.bgcolor=0;
Pokitto 0:e8b8f36b4505 748
Pokitto 0:e8b8f36b4505 749 int8_t activeItem = 0;
Pokitto 0:e8b8f36b4505 750 int16_t currentY = 100;
Pokitto 0:e8b8f36b4505 751 int16_t targetY = 0, rowh = display.fontHeight + 2;
Pokitto 0:e8b8f36b4505 752 boolean exit = false;
Pokitto 0:e8b8f36b4505 753
Pokitto 0:e8b8f36b4505 754 char* txt;
Pokitto 0:e8b8f36b4505 755
Pokitto 0:e8b8f36b4505 756
Pokitto 0:e8b8f36b4505 757 while (isRunning()) {
Pokitto 0:e8b8f36b4505 758 if (update()) {
Pokitto 0:e8b8f36b4505 759 getFirstFile(ext);
Pokitto 0:e8b8f36b4505 760 if (buttons.pressed(BTN_A) || buttons.pressed(BTN_B) || buttons.pressed(BTN_C)) {
Pokitto 0:e8b8f36b4505 761 exit = true; //time to exit menu !
Pokitto 0:e8b8f36b4505 762 targetY = - display.fontHeight * 10 - 2; //send the menu out of the screen
Pokitto 0:e8b8f36b4505 763 if (buttons.pressed(BTN_A)) {
Pokitto 0:e8b8f36b4505 764 //answer = activeItem;
Pokitto 0:e8b8f36b4505 765 sound.playOK();
Pokitto 0:e8b8f36b4505 766 } else {
Pokitto 0:e8b8f36b4505 767 sound.playCancel();
Pokitto 0:e8b8f36b4505 768 }
Pokitto 0:e8b8f36b4505 769 }
Pokitto 0:e8b8f36b4505 770 if (exit == false) {
Pokitto 0:e8b8f36b4505 771 if (buttons.repeat(BTN_DOWN,4)) {
Pokitto 0:e8b8f36b4505 772 activeItem++;
Pokitto 0:e8b8f36b4505 773 sound.playTick();
Pokitto 0:e8b8f36b4505 774 }
Pokitto 0:e8b8f36b4505 775 if (buttons.repeat(BTN_UP,4)) {
Pokitto 0:e8b8f36b4505 776 activeItem--;
Pokitto 0:e8b8f36b4505 777 sound.playTick();
Pokitto 0:e8b8f36b4505 778 }
Pokitto 0:e8b8f36b4505 779 //don't go out of the menu
Pokitto 0:e8b8f36b4505 780 //if (activeItem == length) activeItem = 0;
Pokitto 0:e8b8f36b4505 781 //if (activeItem < 0) activeItem = length - 1;
Pokitto 0:e8b8f36b4505 782 if (currentY>targetY) currentY-=16;
Pokitto 0:e8b8f36b4505 783 if (currentY<targetY) currentY=targetY;
Pokitto 0:e8b8f36b4505 784 //targetY = -rowh * activeItem + (rowh+4); //center the menu on the active item
Pokitto 0:e8b8f36b4505 785 } else { //exit :
Pokitto 0:e8b8f36b4505 786 if (currentY>targetY) currentY-=16;
Pokitto 0:e8b8f36b4505 787 if (currentY<targetY) currentY=targetY;
Pokitto 0:e8b8f36b4505 788 if ((currentY - targetY) <= 1)
Pokitto 0:e8b8f36b4505 789 {
Pokitto 0:e8b8f36b4505 790 display.bgcolor=oldbg;
Pokitto 0:e8b8f36b4505 791 display.color=oldfg;
Pokitto 0:e8b8f36b4505 792 display.palette[0] = oldpal0;
Pokitto 0:e8b8f36b4505 793 display.palette[1] = oldpal1;
Pokitto 0:e8b8f36b4505 794 display.palette[2] = oldpal2;
Pokitto 0:e8b8f36b4505 795 return selectedfile;
Pokitto 0:e8b8f36b4505 796 }
Pokitto 0:e8b8f36b4505 797
Pokitto 0:e8b8f36b4505 798 }
Pokitto 0:e8b8f36b4505 799 //draw a fancy menu
Pokitto 0:e8b8f36b4505 800 //currentY = 0;//(currentY + targetY) / 2 + 5;
Pokitto 0:e8b8f36b4505 801 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 802 display.cursorY = currentY;
Pokitto 0:e8b8f36b4505 803 display.textWrap = false;
Pokitto 0:e8b8f36b4505 804 //getFirstFile(ext);
Pokitto 0:e8b8f36b4505 805 for (int i = 0; i<20; i++) {
Pokitto 0:e8b8f36b4505 806 display.invisiblecolor=255;
Pokitto 0:e8b8f36b4505 807 display.cursorY = currentY + rowh * i;
Pokitto 0:e8b8f36b4505 808 if (i==3) display.color=1;
Pokitto 0:e8b8f36b4505 809 if (i == activeItem){
Pokitto 0:e8b8f36b4505 810 display.cursorX = 3;
Pokitto 0:e8b8f36b4505 811
Pokitto 0:e8b8f36b4505 812 //display.fillRoundRect(0, currentY + display.fontHeight * activeItem - 2, LCDWIDTH, (display.fontHeight+3), 3);
Pokitto 0:e8b8f36b4505 813 display.color=2;
Pokitto 0:e8b8f36b4505 814 display.fillRect(0, currentY + rowh * activeItem - 2, LCDWIDTH, (rowh));
Pokitto 0:e8b8f36b4505 815 display.setColor(0,2);
Pokitto 0:e8b8f36b4505 816 } else display.setColor(1,0);
Pokitto 0:e8b8f36b4505 817 //display.println((char*)*(const unsigned int*)(items+i));
Pokitto 0:e8b8f36b4505 818 //display.println((int)i);
Pokitto 0:e8b8f36b4505 819 txt = getNextFile(ext);
Pokitto 0:e8b8f36b4505 820 if (txt) {
Pokitto 0:e8b8f36b4505 821 display.println(txt);
Pokitto 0:e8b8f36b4505 822 if (i == activeItem) {
Pokitto 0:e8b8f36b4505 823 strcpy(selectedfile,txt);
Pokitto 0:e8b8f36b4505 824 }
Pokitto 0:e8b8f36b4505 825 } else i--;
Pokitto 0:e8b8f36b4505 826 display.setColor(1,0);
Pokitto 0:e8b8f36b4505 827 } // draw menu loop
Pokitto 0:e8b8f36b4505 828 } // update
Pokitto 0:e8b8f36b4505 829 }
Pokitto 2:968589ca3484 830 return 0;
Pokitto 0:e8b8f36b4505 831 }
Pokitto 0:e8b8f36b4505 832
Pokitto 0:e8b8f36b4505 833 char* Core::filemenu() {
Pokitto 0:e8b8f36b4505 834 return filemenu("");
Pokitto 0:e8b8f36b4505 835 }
Pokitto 0:e8b8f36b4505 836
Pokitto 0:e8b8f36b4505 837 int8_t Core::menu(const char* const* items, uint8_t length) {
Pokitto 0:e8b8f36b4505 838 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 839 display.persistence = false;
Pokitto 0:e8b8f36b4505 840 int8_t activeItem = 0;
Pokitto 0:e8b8f36b4505 841 int16_t currentY = display.height;
Pokitto 0:e8b8f36b4505 842 int16_t targetY = 0, rowh = display.fontHeight + 2;
Pokitto 0:e8b8f36b4505 843 boolean exit = false;
Pokitto 0:e8b8f36b4505 844 int8_t answer = -1;
Pokitto 0:e8b8f36b4505 845 while (isRunning()) {
Pokitto 0:e8b8f36b4505 846 if (update()) {
Pokitto 0:e8b8f36b4505 847 if (buttons.pressed(BTN_A) || buttons.pressed(BTN_B) || buttons.pressed(BTN_C)) {
Pokitto 0:e8b8f36b4505 848 exit = true; //time to exit menu !
Pokitto 0:e8b8f36b4505 849 targetY = - display.fontHeight * length - 2; //send the menu out of the screen
Pokitto 0:e8b8f36b4505 850 if (buttons.pressed(BTN_A)) {
Pokitto 0:e8b8f36b4505 851 answer = activeItem;
Pokitto 0:e8b8f36b4505 852 sound.playOK();
Pokitto 0:e8b8f36b4505 853 } else {
Pokitto 0:e8b8f36b4505 854 sound.playCancel();
Pokitto 0:e8b8f36b4505 855 }
Pokitto 0:e8b8f36b4505 856 }
Pokitto 0:e8b8f36b4505 857 if (exit == false) {
Pokitto 0:e8b8f36b4505 858 if (buttons.repeat(BTN_DOWN,4)) {
Pokitto 0:e8b8f36b4505 859 activeItem++;
Pokitto 0:e8b8f36b4505 860 sound.playTick();
Pokitto 0:e8b8f36b4505 861 }
Pokitto 0:e8b8f36b4505 862 if (buttons.repeat(BTN_UP,4)) {
Pokitto 0:e8b8f36b4505 863 activeItem--;
Pokitto 0:e8b8f36b4505 864 sound.playTick();
Pokitto 0:e8b8f36b4505 865 }
Pokitto 0:e8b8f36b4505 866 //don't go out of the menu
Pokitto 0:e8b8f36b4505 867 if (activeItem == length) activeItem = 0;
Pokitto 0:e8b8f36b4505 868 if (activeItem < 0) activeItem = length - 1;
Pokitto 0:e8b8f36b4505 869
Pokitto 0:e8b8f36b4505 870 targetY = -rowh * activeItem + (rowh+4); //center the menu on the active item
Pokitto 0:e8b8f36b4505 871 } else { //exit :
Pokitto 0:e8b8f36b4505 872 if ((currentY - targetY) <= 1)
Pokitto 0:e8b8f36b4505 873 return (answer);
Pokitto 0:e8b8f36b4505 874 }
Pokitto 0:e8b8f36b4505 875 //draw a fancy menu
Pokitto 0:e8b8f36b4505 876 currentY = (currentY + targetY) / 2;
Pokitto 0:e8b8f36b4505 877 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 878 display.cursorY = currentY;
Pokitto 0:e8b8f36b4505 879 display.textWrap = false;
Pokitto 0:e8b8f36b4505 880 uint16_t fc,bc;
Pokitto 0:e8b8f36b4505 881 fc = display.color;
Pokitto 0:e8b8f36b4505 882 bc = display.bgcolor;
Pokitto 0:e8b8f36b4505 883 for (byte i = 0; i < length; i++) {
Pokitto 0:e8b8f36b4505 884 display.cursorY = currentY + rowh * i;
Pokitto 0:e8b8f36b4505 885 if (i == activeItem){
Pokitto 0:e8b8f36b4505 886 display.cursorX = 3;
Pokitto 0:e8b8f36b4505 887
Pokitto 0:e8b8f36b4505 888 //display.fillRoundRect(0, currentY + display.fontHeight * activeItem - 2, LCDWIDTH, (display.fontHeight+3), 3);
Pokitto 0:e8b8f36b4505 889 display.fillRect(0, currentY + rowh * activeItem - 2, LCDWIDTH, (rowh));
Pokitto 0:e8b8f36b4505 890 display.setColor(bc,fc);
Pokitto 0:e8b8f36b4505 891 } else display.setColor(fc,bc);
Pokitto 0:e8b8f36b4505 892
Pokitto 0:e8b8f36b4505 893 display.println((char*)*(const unsigned int*)(items+i));
Pokitto 0:e8b8f36b4505 894 display.setColor(fc,bc);
Pokitto 0:e8b8f36b4505 895 }
Pokitto 0:e8b8f36b4505 896
Pokitto 0:e8b8f36b4505 897 }
Pokitto 0:e8b8f36b4505 898 }
Pokitto 0:e8b8f36b4505 899 #else
Pokitto 0:e8b8f36b4505 900 return 0;
Pokitto 0:e8b8f36b4505 901 #endif
Pokitto 2:968589ca3484 902 return 0;
Pokitto 0:e8b8f36b4505 903 }
Pokitto 0:e8b8f36b4505 904
Pokitto 0:e8b8f36b4505 905 void Core::keyboard(char* text, uint8_t length) {
Pokitto 0:e8b8f36b4505 906 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 907 display.persistence = false;
Pokitto 0:e8b8f36b4505 908 //memset(text, 0, length); //clear the text
Pokitto 0:e8b8f36b4505 909 text[length-1] = '\0';
Pokitto 0:e8b8f36b4505 910 //active character in the typing area
Pokitto 0:e8b8f36b4505 911 int8_t activeChar = 0;
Pokitto 0:e8b8f36b4505 912 //selected char on the keyboard
Pokitto 0:e8b8f36b4505 913 int8_t activeX = 0;
Pokitto 0:e8b8f36b4505 914 int8_t activeY = 2;
Pokitto 0:e8b8f36b4505 915 //position of the keyboard on the screen
Pokitto 0:e8b8f36b4505 916 int8_t currentX = LCDWIDTH;
Pokitto 0:e8b8f36b4505 917 int8_t currentY = LCDHEIGHT;
Pokitto 0:e8b8f36b4505 918 int8_t targetX = 0;
Pokitto 0:e8b8f36b4505 919 int8_t targetY = 0;
Pokitto 0:e8b8f36b4505 920
Pokitto 0:e8b8f36b4505 921 while (1) {
Pokitto 0:e8b8f36b4505 922 if (update()) {
Pokitto 0:e8b8f36b4505 923 //move the character selector
Pokitto 0:e8b8f36b4505 924 if (buttons.repeat(BTN_DOWN, 4)) {
Pokitto 0:e8b8f36b4505 925 activeY++;
Pokitto 0:e8b8f36b4505 926 sound.playTick();
Pokitto 0:e8b8f36b4505 927 }
Pokitto 0:e8b8f36b4505 928 if (buttons.repeat(BTN_UP, 4)) {
Pokitto 0:e8b8f36b4505 929 activeY--;
Pokitto 0:e8b8f36b4505 930 sound.playTick();
Pokitto 0:e8b8f36b4505 931 }
Pokitto 0:e8b8f36b4505 932 if (buttons.repeat(BTN_RIGHT, 4)) {
Pokitto 0:e8b8f36b4505 933 activeX++;
Pokitto 0:e8b8f36b4505 934 sound.playTick();
Pokitto 0:e8b8f36b4505 935 }
Pokitto 0:e8b8f36b4505 936 if (buttons.repeat(BTN_LEFT, 4)) {
Pokitto 0:e8b8f36b4505 937 activeX--;
Pokitto 0:e8b8f36b4505 938 sound.playTick();
Pokitto 0:e8b8f36b4505 939 }
Pokitto 0:e8b8f36b4505 940 //don't go out of the keyboard
Pokitto 0:e8b8f36b4505 941 if (activeX == KEYBOARD_W) activeX = 0;
Pokitto 0:e8b8f36b4505 942 if (activeX < 0) activeX = KEYBOARD_W - 1;
Pokitto 0:e8b8f36b4505 943 if (activeY == KEYBOARD_H) activeY = 0;
Pokitto 0:e8b8f36b4505 944 if (activeY < 0) activeY = KEYBOARD_H - 1;
Pokitto 0:e8b8f36b4505 945 //set the keyboard position on screen
Pokitto 0:e8b8f36b4505 946 targetX = -(display.fontWidth+1) * activeX + LCDWIDTH / 2 - 3;
Pokitto 0:e8b8f36b4505 947 targetY = -(display.fontHeight+1) * activeY + LCDHEIGHT / 2 - 4 - display.fontHeight;
Pokitto 0:e8b8f36b4505 948 //smooth the keyboard displacement
Pokitto 0:e8b8f36b4505 949 currentX = (targetX + currentX) / 2;
Pokitto 0:e8b8f36b4505 950 currentY = (targetY + currentY) / 2;
Pokitto 0:e8b8f36b4505 951 //type character
Pokitto 0:e8b8f36b4505 952 if (buttons.pressed(BTN_A)) {
Pokitto 0:e8b8f36b4505 953 if (activeChar < (length-1)) {
Pokitto 0:e8b8f36b4505 954 byte thisChar = activeX + KEYBOARD_W * activeY;
Pokitto 0:e8b8f36b4505 955 if((thisChar == 0)||(thisChar == 10)||(thisChar == 13)) //avoid line feed and carriage return
Pokitto 0:e8b8f36b4505 956 continue;
Pokitto 0:e8b8f36b4505 957 text[activeChar] = thisChar;
Pokitto 0:e8b8f36b4505 958 text[activeChar+1] = '\0';
Pokitto 0:e8b8f36b4505 959 }
Pokitto 0:e8b8f36b4505 960 activeChar++;
Pokitto 0:e8b8f36b4505 961 sound.playOK();
Pokitto 0:e8b8f36b4505 962 if (activeChar > length)
Pokitto 0:e8b8f36b4505 963 activeChar = length;
Pokitto 0:e8b8f36b4505 964 }
Pokitto 0:e8b8f36b4505 965 //erase character
Pokitto 0:e8b8f36b4505 966 if (buttons.pressed(BTN_B)) {
Pokitto 0:e8b8f36b4505 967 activeChar--;
Pokitto 0:e8b8f36b4505 968 sound.playCancel();
Pokitto 0:e8b8f36b4505 969 if (activeChar >= 0)
Pokitto 0:e8b8f36b4505 970 text[activeChar] = 0;
Pokitto 0:e8b8f36b4505 971 else
Pokitto 0:e8b8f36b4505 972 activeChar = 0;
Pokitto 0:e8b8f36b4505 973 }
Pokitto 0:e8b8f36b4505 974 //leave menu
Pokitto 0:e8b8f36b4505 975 if (buttons.pressed(BTN_C)) {
Pokitto 0:e8b8f36b4505 976 sound.playOK();
Pokitto 0:e8b8f36b4505 977 while (1) {
Pokitto 0:e8b8f36b4505 978 if (update()) {
Pokitto 0:e8b8f36b4505 979 //display.setCursor(0,0);
Pokitto 2:968589ca3484 980 display.println(("You entered\n"));
Pokitto 0:e8b8f36b4505 981 display.print(text);
Pokitto 2:968589ca3484 982 display.println(("\n\n\n\x15:okay \x16:edit"));
Pokitto 0:e8b8f36b4505 983 if(buttons.pressed(BTN_A)){
Pokitto 0:e8b8f36b4505 984 sound.playOK();
Pokitto 0:e8b8f36b4505 985 return;
Pokitto 0:e8b8f36b4505 986 }
Pokitto 0:e8b8f36b4505 987 if(buttons.pressed(BTN_B)){
Pokitto 0:e8b8f36b4505 988 sound.playCancel();
Pokitto 0:e8b8f36b4505 989 break;
Pokitto 0:e8b8f36b4505 990 }
Pokitto 0:e8b8f36b4505 991 }
Pokitto 0:e8b8f36b4505 992 }
Pokitto 0:e8b8f36b4505 993 }
Pokitto 0:e8b8f36b4505 994 //draw the keyboard
Pokitto 0:e8b8f36b4505 995 for (int8_t y = 0; y < KEYBOARD_H; y++) {
Pokitto 0:e8b8f36b4505 996 for (int8_t x = 0; x < KEYBOARD_W; x++) {
Pokitto 0:e8b8f36b4505 997 display.drawChar(currentX + x * (display.fontWidth+1), currentY + y * (display.fontHeight+1), x + y * KEYBOARD_W, 1);
Pokitto 0:e8b8f36b4505 998 }
Pokitto 0:e8b8f36b4505 999 }
Pokitto 0:e8b8f36b4505 1000 //draw instruction
Pokitto 0:e8b8f36b4505 1001 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1002 display.cursorY = currentY+1*(display.fontHeight+1);
Pokitto 2:968589ca3484 1003 display.print(("\25type"));
Pokitto 0:e8b8f36b4505 1004
Pokitto 0:e8b8f36b4505 1005 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1006 display.cursorY = currentY+2*(display.fontHeight+1);
Pokitto 2:968589ca3484 1007 display.print(("\26back"));
Pokitto 0:e8b8f36b4505 1008
Pokitto 0:e8b8f36b4505 1009 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1010 display.cursorY = currentY+3*(display.fontHeight+1);
Pokitto 2:968589ca3484 1011 display.print(("\27save"));
Pokitto 0:e8b8f36b4505 1012
Pokitto 0:e8b8f36b4505 1013 //erase some pixels around the selected character
Pokitto 0:e8b8f36b4505 1014 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1015 display.drawFastHLine(currentX + activeX * (display.fontWidth+1) - 1, currentY + activeY * (display.fontHeight+1) - 2, 7);
Pokitto 0:e8b8f36b4505 1016 //draw the selection rectangle
Pokitto 0:e8b8f36b4505 1017 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1018 display.drawRoundRect(currentX + activeX * (display.fontWidth+1) - 2, currentY + activeY * (display.fontHeight+1) - 3, (display.fontWidth+2)+(display.fontWidth-1)%2, (display.fontHeight+5), 3);
Pokitto 0:e8b8f36b4505 1019 //draw keyboard outline
Pokitto 0:e8b8f36b4505 1020 //display.drawRoundRect(currentX - 6, currentY - 6, KEYBOARD_W * (display.fontWidth+1) + 12, KEYBOARD_H * (display.fontHeight+1) + 12, 8, BLACK);
Pokitto 0:e8b8f36b4505 1021 //text field
Pokitto 0:e8b8f36b4505 1022 display.drawFastHLine(0, LCDHEIGHT-display.fontHeight-2, LCDWIDTH);
Pokitto 0:e8b8f36b4505 1023 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1024 display.fillRect(0, LCDHEIGHT-display.fontHeight-1, LCDWIDTH, display.fontHeight+1);
Pokitto 0:e8b8f36b4505 1025 //typed text
Pokitto 0:e8b8f36b4505 1026 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 1027 display.cursorY = LCDHEIGHT-display.fontHeight;
Pokitto 0:e8b8f36b4505 1028 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1029 display.print(text);
Pokitto 0:e8b8f36b4505 1030 //blinking cursor
Pokitto 0:e8b8f36b4505 1031 if (((frameCount % 8) < 4) && (activeChar < (length-1)))
Pokitto 0:e8b8f36b4505 1032 display.drawChar(display.fontWidth * activeChar, LCDHEIGHT-display.fontHeight, '_',1);
Pokitto 0:e8b8f36b4505 1033 }
Pokitto 0:e8b8f36b4505 1034 }
Pokitto 0:e8b8f36b4505 1035 #endif
Pokitto 0:e8b8f36b4505 1036 }
Pokitto 0:e8b8f36b4505 1037
Pokitto 0:e8b8f36b4505 1038 void Core::popup(const char* text, uint8_t duration){
Pokitto 0:e8b8f36b4505 1039 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 1040 popupText = text;
Pokitto 0:e8b8f36b4505 1041 popupTimeLeft = duration+12;
Pokitto 0:e8b8f36b4505 1042 #endif
Pokitto 0:e8b8f36b4505 1043 }
Pokitto 0:e8b8f36b4505 1044
Pokitto 0:e8b8f36b4505 1045 void Core::updatePopup(){
Pokitto 0:e8b8f36b4505 1046 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 1047 if (popupTimeLeft){
Pokitto 0:e8b8f36b4505 1048 uint8_t yOffset = 0;
Pokitto 0:e8b8f36b4505 1049 if(popupTimeLeft<12){
Pokitto 0:e8b8f36b4505 1050 yOffset = 12-popupTimeLeft;
Pokitto 0:e8b8f36b4505 1051 }
Pokitto 0:e8b8f36b4505 1052 display.fontSize = 1;
Pokitto 0:e8b8f36b4505 1053 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1054 display.fillRoundRect(0,LCDHEIGHT-display.fontHeight+yOffset-3,84,display.fontHeight+3,3);
Pokitto 0:e8b8f36b4505 1055 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1056 display.drawRoundRect(0,LCDHEIGHT-display.fontHeight+yOffset-3,84,display.fontHeight+3,3);
Pokitto 0:e8b8f36b4505 1057 display.cursorX = 4;
Pokitto 0:e8b8f36b4505 1058 display.cursorY = LCDHEIGHT-display.fontHeight+yOffset-1;
Pokitto 0:e8b8f36b4505 1059 display.print(popupText);
Pokitto 0:e8b8f36b4505 1060 popupTimeLeft--;
Pokitto 0:e8b8f36b4505 1061 }
Pokitto 0:e8b8f36b4505 1062 #endif
Pokitto 0:e8b8f36b4505 1063 }
Pokitto 0:e8b8f36b4505 1064
Pokitto 0:e8b8f36b4505 1065 void Core::setFrameRate(uint8_t fps) {
Pokitto 0:e8b8f36b4505 1066 timePerFrame = 1000 / fps;
Pokitto 0:e8b8f36b4505 1067 sound.prescaler = fps / 20;
Pokitto 0:e8b8f36b4505 1068 sound.prescaler = __avrmax(1, sound.prescaler);
Pokitto 0:e8b8f36b4505 1069 }
Pokitto 0:e8b8f36b4505 1070
Pokitto 0:e8b8f36b4505 1071 void Core::pickRandomSeed(){
Pokitto 0:e8b8f36b4505 1072 initRandom();
Pokitto 0:e8b8f36b4505 1073 }
Pokitto 0:e8b8f36b4505 1074
Pokitto 0:e8b8f36b4505 1075 bool Core::collidePointRect(int16_t x1, int16_t y1 ,int16_t x2 ,int16_t y2, int16_t w, int16_t h){
Pokitto 0:e8b8f36b4505 1076 if((x1>=x2)&&(x1<x2+w))
Pokitto 0:e8b8f36b4505 1077 if((y1>=y2)&&(y1<y2+h))
Pokitto 0:e8b8f36b4505 1078 return true;
Pokitto 0:e8b8f36b4505 1079 return false;
Pokitto 0:e8b8f36b4505 1080 }
Pokitto 0:e8b8f36b4505 1081
Pokitto 0:e8b8f36b4505 1082 bool Core::collideRectRect(int16_t x1, int16_t y1, int16_t w1, int16_t h1 ,int16_t x2 ,int16_t y2, int16_t w2, int16_t h2){
Pokitto 0:e8b8f36b4505 1083 return !( x2 >= x1+w1 ||
Pokitto 0:e8b8f36b4505 1084 x2+w2 <= x1 ||
Pokitto 0:e8b8f36b4505 1085 y2 >= y1+h1 ||
Pokitto 0:e8b8f36b4505 1086 y2+h2 <= y1 );
Pokitto 0:e8b8f36b4505 1087 }
Pokitto 0:e8b8f36b4505 1088
Pokitto 0:e8b8f36b4505 1089 bool Core::collideBitmapBitmap(int16_t x1, int16_t y1, const uint8_t* b1, int16_t x2, int16_t y2, const uint8_t* b2){
Pokitto 0:e8b8f36b4505 1090 int16_t w1 = pgm_read_byte(b1);
Pokitto 0:e8b8f36b4505 1091 int16_t h1 = pgm_read_byte(b1 + 1);
Pokitto 0:e8b8f36b4505 1092 int16_t w2 = pgm_read_byte(b2);
Pokitto 0:e8b8f36b4505 1093 int16_t h2 = pgm_read_byte(b2 + 1);
Pokitto 0:e8b8f36b4505 1094
Pokitto 0:e8b8f36b4505 1095 if(collideRectRect(x1, y1, w1, h1, x2, y2, w2, h2) == false){
Pokitto 0:e8b8f36b4505 1096 return false;
Pokitto 0:e8b8f36b4505 1097 }
Pokitto 0:e8b8f36b4505 1098
Pokitto 0:e8b8f36b4505 1099 int16_t xmin = (x1>=x2)? 0 : x2-x1;
Pokitto 0:e8b8f36b4505 1100 int16_t ymin = (y1>=y2)? 0 : y2-y1;
Pokitto 0:e8b8f36b4505 1101 int16_t xmax = (x1+w1>=x2+w2)? x2+w2-x1 : w1;
Pokitto 0:e8b8f36b4505 1102 int16_t ymax = (y1+h1>=y2+h2)? y2+h2-y1 : h1;
Pokitto 0:e8b8f36b4505 1103 for(uint8_t y = ymin; y < ymax; y++){
Pokitto 0:e8b8f36b4505 1104 for(uint8_t x = xmin; x < xmax; x++){
Pokitto 0:e8b8f36b4505 1105 if(display.getBitmapPixel(b1, x, y) && display.getBitmapPixel(b2, x1+x-x2, y1+y-y2)){
Pokitto 0:e8b8f36b4505 1106 return true;
Pokitto 0:e8b8f36b4505 1107 }
Pokitto 0:e8b8f36b4505 1108 }
Pokitto 0:e8b8f36b4505 1109 }
Pokitto 0:e8b8f36b4505 1110 return false;
Pokitto 0:e8b8f36b4505 1111 }
Pokitto 0:e8b8f36b4505 1112
Pokitto 0:e8b8f36b4505 1113
Pokitto 0:e8b8f36b4505 1114 //** EOF **//
Pokitto 0:e8b8f36b4505 1115
Pokitto 0:e8b8f36b4505 1116
Pokitto 0:e8b8f36b4505 1117
Pokitto 0:e8b8f36b4505 1118
Pokitto 0:e8b8f36b4505 1119
Pokitto 0:e8b8f36b4505 1120
Pokitto 0:e8b8f36b4505 1121
Pokitto 0:e8b8f36b4505 1122