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

Committer:
Pokitto
Date:
Tue Jan 30 10:41:47 2018 +0000
Revision:
31:f4b9b85c7b62
Sound output improvements added:  louder, clearer, faster!

Who changed what in which revision?

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