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:
Mon Sep 18 12:34:05 2017 +0000
Revision:
1:4b1511a0a2c2
Parent:
0:e8b8f36b4505
Child:
2:968589ca3484
Changes done to make compile;

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 0:e8b8f36b4505 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 0:e8b8f36b4505 531 uint16_t counter=0, 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 0:e8b8f36b4505 589 titleScreen(F(""), logo);
Pokitto 0:e8b8f36b4505 590 }
Pokitto 0:e8b8f36b4505 591
Pokitto 0:e8b8f36b4505 592 void Core::titleScreen(){
Pokitto 0:e8b8f36b4505 593 titleScreen(F(""));
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 0:e8b8f36b4505 623 display.println(F("\25 \20"));
Pokitto 0:e8b8f36b4505 624 else
Pokitto 0:e8b8f36b4505 625 display.println(F("\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 0:e8b8f36b4505 630 display.println(F("\26\23\24"));
Pokitto 0:e8b8f36b4505 631 else
Pokitto 0:e8b8f36b4505 632 display.println(F("\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 0:e8b8f36b4505 709 display.print(F("LOW BATTERY\n"));
Pokitto 0:e8b8f36b4505 710 display.print(battery.voltage);
Pokitto 0:e8b8f36b4505 711 display.print(F("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 uint16_t fc,bc;
Pokitto 0:e8b8f36b4505 805 fc = display.color;
Pokitto 0:e8b8f36b4505 806 bc = display.bgcolor;
Pokitto 0:e8b8f36b4505 807 //getFirstFile(ext);
Pokitto 0:e8b8f36b4505 808 for (int i = 0; i<20; i++) {
Pokitto 0:e8b8f36b4505 809 display.invisiblecolor=255;
Pokitto 0:e8b8f36b4505 810 display.cursorY = currentY + rowh * i;
Pokitto 0:e8b8f36b4505 811 if (i==3) display.color=1;
Pokitto 0:e8b8f36b4505 812 if (i == activeItem){
Pokitto 0:e8b8f36b4505 813 display.cursorX = 3;
Pokitto 0:e8b8f36b4505 814
Pokitto 0:e8b8f36b4505 815 //display.fillRoundRect(0, currentY + display.fontHeight * activeItem - 2, LCDWIDTH, (display.fontHeight+3), 3);
Pokitto 0:e8b8f36b4505 816 display.color=2;
Pokitto 0:e8b8f36b4505 817 display.fillRect(0, currentY + rowh * activeItem - 2, LCDWIDTH, (rowh));
Pokitto 0:e8b8f36b4505 818 display.setColor(0,2);
Pokitto 0:e8b8f36b4505 819 } else display.setColor(1,0);
Pokitto 0:e8b8f36b4505 820 //display.println((char*)*(const unsigned int*)(items+i));
Pokitto 0:e8b8f36b4505 821 //display.println((int)i);
Pokitto 0:e8b8f36b4505 822 txt = getNextFile(ext);
Pokitto 0:e8b8f36b4505 823 if (txt) {
Pokitto 0:e8b8f36b4505 824 display.println(txt);
Pokitto 0:e8b8f36b4505 825 if (i == activeItem) {
Pokitto 0:e8b8f36b4505 826 strcpy(selectedfile,txt);
Pokitto 0:e8b8f36b4505 827 }
Pokitto 0:e8b8f36b4505 828 } else i--;
Pokitto 0:e8b8f36b4505 829 display.setColor(1,0);
Pokitto 0:e8b8f36b4505 830 } // draw menu loop
Pokitto 0:e8b8f36b4505 831 } // update
Pokitto 0:e8b8f36b4505 832 }
Pokitto 0:e8b8f36b4505 833 }
Pokitto 0:e8b8f36b4505 834
Pokitto 0:e8b8f36b4505 835 char* Core::filemenu() {
Pokitto 0:e8b8f36b4505 836 return filemenu("");
Pokitto 0:e8b8f36b4505 837 }
Pokitto 0:e8b8f36b4505 838
Pokitto 0:e8b8f36b4505 839 int8_t Core::menu(const char* const* items, uint8_t length) {
Pokitto 0:e8b8f36b4505 840 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 841 display.persistence = false;
Pokitto 0:e8b8f36b4505 842 int8_t activeItem = 0;
Pokitto 0:e8b8f36b4505 843 int16_t currentY = display.height;
Pokitto 0:e8b8f36b4505 844 int16_t targetY = 0, rowh = display.fontHeight + 2;
Pokitto 0:e8b8f36b4505 845 boolean exit = false;
Pokitto 0:e8b8f36b4505 846 int8_t answer = -1;
Pokitto 0:e8b8f36b4505 847 while (isRunning()) {
Pokitto 0:e8b8f36b4505 848 if (update()) {
Pokitto 0:e8b8f36b4505 849 if (buttons.pressed(BTN_A) || buttons.pressed(BTN_B) || buttons.pressed(BTN_C)) {
Pokitto 0:e8b8f36b4505 850 exit = true; //time to exit menu !
Pokitto 0:e8b8f36b4505 851 targetY = - display.fontHeight * length - 2; //send the menu out of the screen
Pokitto 0:e8b8f36b4505 852 if (buttons.pressed(BTN_A)) {
Pokitto 0:e8b8f36b4505 853 answer = activeItem;
Pokitto 0:e8b8f36b4505 854 sound.playOK();
Pokitto 0:e8b8f36b4505 855 } else {
Pokitto 0:e8b8f36b4505 856 sound.playCancel();
Pokitto 0:e8b8f36b4505 857 }
Pokitto 0:e8b8f36b4505 858 }
Pokitto 0:e8b8f36b4505 859 if (exit == false) {
Pokitto 0:e8b8f36b4505 860 if (buttons.repeat(BTN_DOWN,4)) {
Pokitto 0:e8b8f36b4505 861 activeItem++;
Pokitto 0:e8b8f36b4505 862 sound.playTick();
Pokitto 0:e8b8f36b4505 863 }
Pokitto 0:e8b8f36b4505 864 if (buttons.repeat(BTN_UP,4)) {
Pokitto 0:e8b8f36b4505 865 activeItem--;
Pokitto 0:e8b8f36b4505 866 sound.playTick();
Pokitto 0:e8b8f36b4505 867 }
Pokitto 0:e8b8f36b4505 868 //don't go out of the menu
Pokitto 0:e8b8f36b4505 869 if (activeItem == length) activeItem = 0;
Pokitto 0:e8b8f36b4505 870 if (activeItem < 0) activeItem = length - 1;
Pokitto 0:e8b8f36b4505 871
Pokitto 0:e8b8f36b4505 872 targetY = -rowh * activeItem + (rowh+4); //center the menu on the active item
Pokitto 0:e8b8f36b4505 873 } else { //exit :
Pokitto 0:e8b8f36b4505 874 if ((currentY - targetY) <= 1)
Pokitto 0:e8b8f36b4505 875 return (answer);
Pokitto 0:e8b8f36b4505 876 }
Pokitto 0:e8b8f36b4505 877 //draw a fancy menu
Pokitto 0:e8b8f36b4505 878 currentY = (currentY + targetY) / 2;
Pokitto 0:e8b8f36b4505 879 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 880 display.cursorY = currentY;
Pokitto 0:e8b8f36b4505 881 display.textWrap = false;
Pokitto 0:e8b8f36b4505 882 uint16_t fc,bc;
Pokitto 0:e8b8f36b4505 883 fc = display.color;
Pokitto 0:e8b8f36b4505 884 bc = display.bgcolor;
Pokitto 0:e8b8f36b4505 885 for (byte i = 0; i < length; i++) {
Pokitto 0:e8b8f36b4505 886 display.cursorY = currentY + rowh * i;
Pokitto 0:e8b8f36b4505 887 if (i == activeItem){
Pokitto 0:e8b8f36b4505 888 display.cursorX = 3;
Pokitto 0:e8b8f36b4505 889
Pokitto 0:e8b8f36b4505 890 //display.fillRoundRect(0, currentY + display.fontHeight * activeItem - 2, LCDWIDTH, (display.fontHeight+3), 3);
Pokitto 0:e8b8f36b4505 891 display.fillRect(0, currentY + rowh * activeItem - 2, LCDWIDTH, (rowh));
Pokitto 0:e8b8f36b4505 892 display.setColor(bc,fc);
Pokitto 0:e8b8f36b4505 893 } else display.setColor(fc,bc);
Pokitto 0:e8b8f36b4505 894
Pokitto 0:e8b8f36b4505 895 display.println((char*)*(const unsigned int*)(items+i));
Pokitto 0:e8b8f36b4505 896 display.setColor(fc,bc);
Pokitto 0:e8b8f36b4505 897 }
Pokitto 0:e8b8f36b4505 898
Pokitto 0:e8b8f36b4505 899 }
Pokitto 0:e8b8f36b4505 900 }
Pokitto 0:e8b8f36b4505 901 #else
Pokitto 0:e8b8f36b4505 902 return 0;
Pokitto 0:e8b8f36b4505 903 #endif
Pokitto 0:e8b8f36b4505 904 }
Pokitto 0:e8b8f36b4505 905
Pokitto 0:e8b8f36b4505 906 void Core::keyboard(char* text, uint8_t length) {
Pokitto 0:e8b8f36b4505 907 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 908 display.persistence = false;
Pokitto 0:e8b8f36b4505 909 //memset(text, 0, length); //clear the text
Pokitto 0:e8b8f36b4505 910 text[length-1] = '\0';
Pokitto 0:e8b8f36b4505 911 //active character in the typing area
Pokitto 0:e8b8f36b4505 912 int8_t activeChar = 0;
Pokitto 0:e8b8f36b4505 913 //selected char on the keyboard
Pokitto 0:e8b8f36b4505 914 int8_t activeX = 0;
Pokitto 0:e8b8f36b4505 915 int8_t activeY = 2;
Pokitto 0:e8b8f36b4505 916 //position of the keyboard on the screen
Pokitto 0:e8b8f36b4505 917 int8_t currentX = LCDWIDTH;
Pokitto 0:e8b8f36b4505 918 int8_t currentY = LCDHEIGHT;
Pokitto 0:e8b8f36b4505 919 int8_t targetX = 0;
Pokitto 0:e8b8f36b4505 920 int8_t targetY = 0;
Pokitto 0:e8b8f36b4505 921
Pokitto 0:e8b8f36b4505 922 while (1) {
Pokitto 0:e8b8f36b4505 923 if (update()) {
Pokitto 0:e8b8f36b4505 924 //move the character selector
Pokitto 0:e8b8f36b4505 925 if (buttons.repeat(BTN_DOWN, 4)) {
Pokitto 0:e8b8f36b4505 926 activeY++;
Pokitto 0:e8b8f36b4505 927 sound.playTick();
Pokitto 0:e8b8f36b4505 928 }
Pokitto 0:e8b8f36b4505 929 if (buttons.repeat(BTN_UP, 4)) {
Pokitto 0:e8b8f36b4505 930 activeY--;
Pokitto 0:e8b8f36b4505 931 sound.playTick();
Pokitto 0:e8b8f36b4505 932 }
Pokitto 0:e8b8f36b4505 933 if (buttons.repeat(BTN_RIGHT, 4)) {
Pokitto 0:e8b8f36b4505 934 activeX++;
Pokitto 0:e8b8f36b4505 935 sound.playTick();
Pokitto 0:e8b8f36b4505 936 }
Pokitto 0:e8b8f36b4505 937 if (buttons.repeat(BTN_LEFT, 4)) {
Pokitto 0:e8b8f36b4505 938 activeX--;
Pokitto 0:e8b8f36b4505 939 sound.playTick();
Pokitto 0:e8b8f36b4505 940 }
Pokitto 0:e8b8f36b4505 941 //don't go out of the keyboard
Pokitto 0:e8b8f36b4505 942 if (activeX == KEYBOARD_W) activeX = 0;
Pokitto 0:e8b8f36b4505 943 if (activeX < 0) activeX = KEYBOARD_W - 1;
Pokitto 0:e8b8f36b4505 944 if (activeY == KEYBOARD_H) activeY = 0;
Pokitto 0:e8b8f36b4505 945 if (activeY < 0) activeY = KEYBOARD_H - 1;
Pokitto 0:e8b8f36b4505 946 //set the keyboard position on screen
Pokitto 0:e8b8f36b4505 947 targetX = -(display.fontWidth+1) * activeX + LCDWIDTH / 2 - 3;
Pokitto 0:e8b8f36b4505 948 targetY = -(display.fontHeight+1) * activeY + LCDHEIGHT / 2 - 4 - display.fontHeight;
Pokitto 0:e8b8f36b4505 949 //smooth the keyboard displacement
Pokitto 0:e8b8f36b4505 950 currentX = (targetX + currentX) / 2;
Pokitto 0:e8b8f36b4505 951 currentY = (targetY + currentY) / 2;
Pokitto 0:e8b8f36b4505 952 //type character
Pokitto 0:e8b8f36b4505 953 if (buttons.pressed(BTN_A)) {
Pokitto 0:e8b8f36b4505 954 if (activeChar < (length-1)) {
Pokitto 0:e8b8f36b4505 955 byte thisChar = activeX + KEYBOARD_W * activeY;
Pokitto 0:e8b8f36b4505 956 if((thisChar == 0)||(thisChar == 10)||(thisChar == 13)) //avoid line feed and carriage return
Pokitto 0:e8b8f36b4505 957 continue;
Pokitto 0:e8b8f36b4505 958 text[activeChar] = thisChar;
Pokitto 0:e8b8f36b4505 959 text[activeChar+1] = '\0';
Pokitto 0:e8b8f36b4505 960 }
Pokitto 0:e8b8f36b4505 961 activeChar++;
Pokitto 0:e8b8f36b4505 962 sound.playOK();
Pokitto 0:e8b8f36b4505 963 if (activeChar > length)
Pokitto 0:e8b8f36b4505 964 activeChar = length;
Pokitto 0:e8b8f36b4505 965 }
Pokitto 0:e8b8f36b4505 966 //erase character
Pokitto 0:e8b8f36b4505 967 if (buttons.pressed(BTN_B)) {
Pokitto 0:e8b8f36b4505 968 activeChar--;
Pokitto 0:e8b8f36b4505 969 sound.playCancel();
Pokitto 0:e8b8f36b4505 970 if (activeChar >= 0)
Pokitto 0:e8b8f36b4505 971 text[activeChar] = 0;
Pokitto 0:e8b8f36b4505 972 else
Pokitto 0:e8b8f36b4505 973 activeChar = 0;
Pokitto 0:e8b8f36b4505 974 }
Pokitto 0:e8b8f36b4505 975 //leave menu
Pokitto 0:e8b8f36b4505 976 if (buttons.pressed(BTN_C)) {
Pokitto 0:e8b8f36b4505 977 sound.playOK();
Pokitto 0:e8b8f36b4505 978 while (1) {
Pokitto 0:e8b8f36b4505 979 if (update()) {
Pokitto 0:e8b8f36b4505 980 //display.setCursor(0,0);
Pokitto 0:e8b8f36b4505 981 display.println(F("You entered\n"));
Pokitto 0:e8b8f36b4505 982 display.print(text);
Pokitto 0:e8b8f36b4505 983 display.println(F("\n\n\n\x15:okay \x16:edit"));
Pokitto 0:e8b8f36b4505 984 if(buttons.pressed(BTN_A)){
Pokitto 0:e8b8f36b4505 985 sound.playOK();
Pokitto 0:e8b8f36b4505 986 return;
Pokitto 0:e8b8f36b4505 987 }
Pokitto 0:e8b8f36b4505 988 if(buttons.pressed(BTN_B)){
Pokitto 0:e8b8f36b4505 989 sound.playCancel();
Pokitto 0:e8b8f36b4505 990 break;
Pokitto 0:e8b8f36b4505 991 }
Pokitto 0:e8b8f36b4505 992 }
Pokitto 0:e8b8f36b4505 993 }
Pokitto 0:e8b8f36b4505 994 }
Pokitto 0:e8b8f36b4505 995 //draw the keyboard
Pokitto 0:e8b8f36b4505 996 for (int8_t y = 0; y < KEYBOARD_H; y++) {
Pokitto 0:e8b8f36b4505 997 for (int8_t x = 0; x < KEYBOARD_W; x++) {
Pokitto 0:e8b8f36b4505 998 display.drawChar(currentX + x * (display.fontWidth+1), currentY + y * (display.fontHeight+1), x + y * KEYBOARD_W, 1);
Pokitto 0:e8b8f36b4505 999 }
Pokitto 0:e8b8f36b4505 1000 }
Pokitto 0:e8b8f36b4505 1001 //draw instruction
Pokitto 0:e8b8f36b4505 1002 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1003 display.cursorY = currentY+1*(display.fontHeight+1);
Pokitto 0:e8b8f36b4505 1004 display.print(F("\25type"));
Pokitto 0:e8b8f36b4505 1005
Pokitto 0:e8b8f36b4505 1006 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1007 display.cursorY = currentY+2*(display.fontHeight+1);
Pokitto 0:e8b8f36b4505 1008 display.print(F("\26back"));
Pokitto 0:e8b8f36b4505 1009
Pokitto 0:e8b8f36b4505 1010 display.cursorX = currentX-display.fontWidth*6-2;
Pokitto 0:e8b8f36b4505 1011 display.cursorY = currentY+3*(display.fontHeight+1);
Pokitto 0:e8b8f36b4505 1012 display.print(F("\27save"));
Pokitto 0:e8b8f36b4505 1013
Pokitto 0:e8b8f36b4505 1014 //erase some pixels around the selected character
Pokitto 0:e8b8f36b4505 1015 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1016 display.drawFastHLine(currentX + activeX * (display.fontWidth+1) - 1, currentY + activeY * (display.fontHeight+1) - 2, 7);
Pokitto 0:e8b8f36b4505 1017 //draw the selection rectangle
Pokitto 0:e8b8f36b4505 1018 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1019 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 1020 //draw keyboard outline
Pokitto 0:e8b8f36b4505 1021 //display.drawRoundRect(currentX - 6, currentY - 6, KEYBOARD_W * (display.fontWidth+1) + 12, KEYBOARD_H * (display.fontHeight+1) + 12, 8, BLACK);
Pokitto 0:e8b8f36b4505 1022 //text field
Pokitto 0:e8b8f36b4505 1023 display.drawFastHLine(0, LCDHEIGHT-display.fontHeight-2, LCDWIDTH);
Pokitto 0:e8b8f36b4505 1024 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1025 display.fillRect(0, LCDHEIGHT-display.fontHeight-1, LCDWIDTH, display.fontHeight+1);
Pokitto 0:e8b8f36b4505 1026 //typed text
Pokitto 0:e8b8f36b4505 1027 display.cursorX = 0;
Pokitto 0:e8b8f36b4505 1028 display.cursorY = LCDHEIGHT-display.fontHeight;
Pokitto 0:e8b8f36b4505 1029 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1030 display.print(text);
Pokitto 0:e8b8f36b4505 1031 //blinking cursor
Pokitto 0:e8b8f36b4505 1032 if (((frameCount % 8) < 4) && (activeChar < (length-1)))
Pokitto 0:e8b8f36b4505 1033 display.drawChar(display.fontWidth * activeChar, LCDHEIGHT-display.fontHeight, '_',1);
Pokitto 0:e8b8f36b4505 1034 }
Pokitto 0:e8b8f36b4505 1035 }
Pokitto 0:e8b8f36b4505 1036 #endif
Pokitto 0:e8b8f36b4505 1037 }
Pokitto 0:e8b8f36b4505 1038
Pokitto 0:e8b8f36b4505 1039 void Core::popup(const char* text, uint8_t duration){
Pokitto 0:e8b8f36b4505 1040 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 1041 popupText = text;
Pokitto 0:e8b8f36b4505 1042 popupTimeLeft = duration+12;
Pokitto 0:e8b8f36b4505 1043 #endif
Pokitto 0:e8b8f36b4505 1044 }
Pokitto 0:e8b8f36b4505 1045
Pokitto 0:e8b8f36b4505 1046 void Core::updatePopup(){
Pokitto 0:e8b8f36b4505 1047 #if (ENABLE_GUI > 0)
Pokitto 0:e8b8f36b4505 1048 if (popupTimeLeft){
Pokitto 0:e8b8f36b4505 1049 uint8_t yOffset = 0;
Pokitto 0:e8b8f36b4505 1050 if(popupTimeLeft<12){
Pokitto 0:e8b8f36b4505 1051 yOffset = 12-popupTimeLeft;
Pokitto 0:e8b8f36b4505 1052 }
Pokitto 0:e8b8f36b4505 1053 display.fontSize = 1;
Pokitto 0:e8b8f36b4505 1054 display.setColor(WHITE);
Pokitto 0:e8b8f36b4505 1055 display.fillRoundRect(0,LCDHEIGHT-display.fontHeight+yOffset-3,84,display.fontHeight+3,3);
Pokitto 0:e8b8f36b4505 1056 display.setColor(BLACK);
Pokitto 0:e8b8f36b4505 1057 display.drawRoundRect(0,LCDHEIGHT-display.fontHeight+yOffset-3,84,display.fontHeight+3,3);
Pokitto 0:e8b8f36b4505 1058 display.cursorX = 4;
Pokitto 0:e8b8f36b4505 1059 display.cursorY = LCDHEIGHT-display.fontHeight+yOffset-1;
Pokitto 0:e8b8f36b4505 1060 display.print(popupText);
Pokitto 0:e8b8f36b4505 1061 popupTimeLeft--;
Pokitto 0:e8b8f36b4505 1062 }
Pokitto 0:e8b8f36b4505 1063 #endif
Pokitto 0:e8b8f36b4505 1064 }
Pokitto 0:e8b8f36b4505 1065
Pokitto 0:e8b8f36b4505 1066 void Core::setFrameRate(uint8_t fps) {
Pokitto 0:e8b8f36b4505 1067 timePerFrame = 1000 / fps;
Pokitto 0:e8b8f36b4505 1068 sound.prescaler = fps / 20;
Pokitto 0:e8b8f36b4505 1069 sound.prescaler = __avrmax(1, sound.prescaler);
Pokitto 0:e8b8f36b4505 1070 }
Pokitto 0:e8b8f36b4505 1071
Pokitto 0:e8b8f36b4505 1072 void Core::pickRandomSeed(){
Pokitto 0:e8b8f36b4505 1073 initRandom();
Pokitto 0:e8b8f36b4505 1074 }
Pokitto 0:e8b8f36b4505 1075
Pokitto 0:e8b8f36b4505 1076 bool Core::collidePointRect(int16_t x1, int16_t y1 ,int16_t x2 ,int16_t y2, int16_t w, int16_t h){
Pokitto 0:e8b8f36b4505 1077 if((x1>=x2)&&(x1<x2+w))
Pokitto 0:e8b8f36b4505 1078 if((y1>=y2)&&(y1<y2+h))
Pokitto 0:e8b8f36b4505 1079 return true;
Pokitto 0:e8b8f36b4505 1080 return false;
Pokitto 0:e8b8f36b4505 1081 }
Pokitto 0:e8b8f36b4505 1082
Pokitto 0:e8b8f36b4505 1083 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 1084 return !( x2 >= x1+w1 ||
Pokitto 0:e8b8f36b4505 1085 x2+w2 <= x1 ||
Pokitto 0:e8b8f36b4505 1086 y2 >= y1+h1 ||
Pokitto 0:e8b8f36b4505 1087 y2+h2 <= y1 );
Pokitto 0:e8b8f36b4505 1088 }
Pokitto 0:e8b8f36b4505 1089
Pokitto 0:e8b8f36b4505 1090 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 1091 int16_t w1 = pgm_read_byte(b1);
Pokitto 0:e8b8f36b4505 1092 int16_t h1 = pgm_read_byte(b1 + 1);
Pokitto 0:e8b8f36b4505 1093 int16_t w2 = pgm_read_byte(b2);
Pokitto 0:e8b8f36b4505 1094 int16_t h2 = pgm_read_byte(b2 + 1);
Pokitto 0:e8b8f36b4505 1095
Pokitto 0:e8b8f36b4505 1096 if(collideRectRect(x1, y1, w1, h1, x2, y2, w2, h2) == false){
Pokitto 0:e8b8f36b4505 1097 return false;
Pokitto 0:e8b8f36b4505 1098 }
Pokitto 0:e8b8f36b4505 1099
Pokitto 0:e8b8f36b4505 1100 int16_t xmin = (x1>=x2)? 0 : x2-x1;
Pokitto 0:e8b8f36b4505 1101 int16_t ymin = (y1>=y2)? 0 : y2-y1;
Pokitto 0:e8b8f36b4505 1102 int16_t xmax = (x1+w1>=x2+w2)? x2+w2-x1 : w1;
Pokitto 0:e8b8f36b4505 1103 int16_t ymax = (y1+h1>=y2+h2)? y2+h2-y1 : h1;
Pokitto 0:e8b8f36b4505 1104 for(uint8_t y = ymin; y < ymax; y++){
Pokitto 0:e8b8f36b4505 1105 for(uint8_t x = xmin; x < xmax; x++){
Pokitto 0:e8b8f36b4505 1106 if(display.getBitmapPixel(b1, x, y) && display.getBitmapPixel(b2, x1+x-x2, y1+y-y2)){
Pokitto 0:e8b8f36b4505 1107 return true;
Pokitto 0:e8b8f36b4505 1108 }
Pokitto 0:e8b8f36b4505 1109 }
Pokitto 0:e8b8f36b4505 1110 }
Pokitto 0:e8b8f36b4505 1111 return false;
Pokitto 0:e8b8f36b4505 1112 }
Pokitto 0:e8b8f36b4505 1113
Pokitto 0:e8b8f36b4505 1114
Pokitto 0:e8b8f36b4505 1115 //** EOF **//
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
Pokitto 0:e8b8f36b4505 1123