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:
Thu Oct 19 09:54:48 2017 +0000
Revision:
13:680e1a8cdd8b
Parent:
6:72f87b7c7400
Child:
17:10609a82d462
Key search now from both 0x3FE04 and 0x3F004

Who changed what in which revision?

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