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

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Tue 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