From d7a96dc87039802b562190356ed1e4bbcd22cf8e Mon Sep 17 00:00:00 2001 From: Fuji Pebri Date: Mon, 2 Dec 2019 13:12:05 +0700 Subject: [PATCH] small update charge management and audio player --- assets/gfxTile.xcf | Bin 91722 -> 96658 bytes esplay-launcher/main/audio_player.c | 14 ++++-- esplay-launcher/main/gfxTile.png | Bin 699829 -> 699828 bytes esplay-launcher/main/graphics.c | 35 +++++++++++++++ esplay-launcher/main/include/graphics.h | 5 ++- esplay-launcher/main/main.c | 56 ++++++++++++++++++++++++ 6 files changed, 106 insertions(+), 4 deletions(-) diff --git a/assets/gfxTile.xcf b/assets/gfxTile.xcf index 3b3f7e28c72c8fd07d3f227bdf5aad228a366465..2120fc3bcdf321bb5ab66f383fee046dfed6659e 100644 GIT binary patch delta 6876 zcmeHMdu)_N5a0Q}yFRWDxND&=AB7-3q7<>pBR&c(SYHv8)c7i(ps2xsoap(;*F-Qe z(S&&Di6R&U^$!uvk<=%&SfkOFK!OtZLxV9k{$XOU(iFUJo!Oba-qljEH8n9@`t5Ib zc6VlWW_EVJuU~ZrpZ_hmeh$odzdj0HqcXpFpEG)^7&mWYY=4)r^AO|FZy1lg$9TMn z(ZARrz+T4iB*rP%GuD5>c+COE1)Yqc)t{IO7V-8yCGpob2jh)SH#Bl2U z1wX{D@ey|uH_!f(@$yu1t$S_*bj07ex@z{XO!RIQT*hchnlOXgjn#|`-e$a~kMW6E zGOuy|3|N)cqUBZY+5DW~Mx#ZGnC;mZlQ-2Qx3_$M7HpG=dEx!s(f*>~>t@~-5wruC zyt^cMWJ_`)Y)=c^bBKF7+XcJK#Lr~H7gL%1by4!?JqJT@DBj*x8QvRY>d{XH<857~ z&+iR{FXHxh7YKcOa@^hz&VireH=d|;dYt%`dc4z9nRI&IaAB7r_8vCG-lNIGy-^qL zMPd~^WoRc}Nj`OAvkSA#K;4AIGI%iAr0;d%+r%yhDrdQl5d`5v!EzRCN-{+m(_K~w z@;bOZW>0Ix1-}^1PlO{-RdFYir<^BPD_BR}CFdvwkr$X0*~VDuGhT3+3@vYcG6El; z0Sgi{YmnnQCfC0qxI^&c#EKdyo4|&HX>T%ldJf~PI>x%r)@?N~uC(HOY+r~Exg#=v z$?E8`rPbFji7k65-gfK-*q2z<09Sd_%p_YtgT#U%SOx*pf`(u0Fhtvj?B|L{l?tdT zU8uCKz^738TDiJZIXXmDN0%WrtNMplp4R1tjCEU0VU;+96xGTM1Iv^6XUZTt3DCOA z%=mk><5@?qO6Ly2Fh_v~VIEXLBg8=*NVDUznGdb3nd6O!dA7ZWV+)Us$Ho|_FM6#^ zljn@r%CuuljMQ>t07D(TnlaXL==Wfz!95cuIXY~m@be6@v^3m?>FY0=i_7NJ9BmF=SJM!ezB3X0^29v>p-c#V}Q(M#QM%t9~s83<#U0 zWU&Y%w=9c$xUP|VF^eT~JoO#o4YqX#MscRY*j_ANglpx1 zGz6P5C7WLRyB&sT`!JhcS7hk{btdmTM~^e9&}_J&QYv~gBafQucoT1&NU01NrZ(mW z?)c%Pkc{B-(3jc40vI4=NF&C_Q9SM*S8^&v8Q?=3nxZE&uex+%SaP1p@j|LFmT*-c zvBKv}!z0K+8aiHaKy*5*t z>acRHXIYSfEG63=)#wUj&q=l*+apLX(3s9b8GfNHLuXwcKIvo|G9(vC z%^a17OYI*MM0V*h`RS=SL-|p(M~(hjMn?N%)Qm7C{{w#ybT`VkA@X$Q$I!MpOw#DpzJ8v@fGat)0fGKfo>*8zRVfdd*tiA!(6}y2t zm8iZQ)}nu=E4NSL_GSpVf#s*Q!4q>Z+l0_IUg%}?*qe#ji(rxmkE6GyD?i#5)R!sk z=jvK)r1JD73jBO5btQGykkhAM_oMc+^5>q}8!o-AQHb_DfIEOpAkwYHsJ>nQtm`RMpn zU6N>C2<2n)>-B{yl7135-U1W70Nxbv-q;n*#RQ`d=HM09?~VpA{rkPmE?#DJw~Lo! z-A!+XsgLjlQ2WhPbYa4xxYNxpV!lr8@O`9Uc=a7b0{&sG+tgA;2t}IW(DCthh#SPr z>~{1*Q#oh^?Jy+@)!nGX48{;J$CB>Np%wT?a#5pH z%Ku?zV*etTfFGCt)3r5;c}}nG)ctnFVyHSJhHo;(^w~kF<@oT2Vx{QYa#dpGV(^`4 zTVmxBsPv+L&>#h|y96H;d`$3ZgWRZ7%9+5`HT*vdShH5z8wBOrwPvTZI|L61{wUaE z(1S+;On9VJaFSrHV1wX7!KH#x!L@=L1h)$A6zmW@Ao!zT4BI*DhN GLHnP|_xK6` delta 2411 zcmeIz|7(*+7y$5l-b>b)Rc+pCQ`0(Iu@R(L?dGVZ%xY`bVig68qD33hWvhniXx;Wh z<&BI9vI^om_m0t~!hRUTFQ~7Qs!`j3ZY{B>$b=zt>=!q21FN%WYj5}7^Q1b*{sRN= zeeRz7n!DuQgAd(9Y4?E@P1&oYRL^ z{b_&6=hwn%Gx=`8@?SA%G>}cGN`I6oebxFLjIa9|jr@Ujw%PghYbzi$xr*3+tcmX? z_o-FHXs^23Fx)-Iz7V_f1{|V}9^U{~4D2Njs(!sR(eVcuzQpYZz4lz_nVc{+h&Abx zHCf*N-OY6XMlGF{YN6sX=fd{2cqGu$jOCUOl$d1N z%6V3<#QOR>=$g;a_0Q1FMQC$Bx^)G4gJr24V~LAR@FpZKH9@&bSApSXQ$>(*@tRT- zSxOKd>0;&R`lw8_LnJ)4iIYj;F$DQP&tfV0 diff --git a/esplay-launcher/main/audio_player.c b/esplay-launcher/main/audio_player.c index 1e3c67a..bd98325 100644 --- a/esplay-launcher/main/audio_player.c +++ b/esplay-launcher/main/audio_player.c @@ -101,6 +101,7 @@ static PlayerState player_state = { }; static bool keys_locked = false; static bool backlight_on = true; +static bool speaker_on = false; // These need to be implemented for SDL/FreeRTOS seperately static PlayerCmd player_poll_cmd(void); @@ -202,7 +203,7 @@ static PlayerResult handle_cmd(PlayerState *const state, const AudioInfo info, c if (state->playing) { audio_init((int)info.sample_rate); - audio_amp_disable(); + speaker_on ? audio_amp_enable() : audio_amp_disable(); } else { @@ -214,7 +215,7 @@ static PlayerResult handle_cmd(PlayerState *const state, const AudioInfo info, c if (state->playing) audio_terminate(); audio_init((int)info.sample_rate); - audio_amp_disable(); + speaker_on ? audio_amp_enable() : audio_amp_disable(); push_audio_event(AudioPlayerEventStateChanged); break; case PlayerCmdToggleLoopMode: @@ -272,7 +273,7 @@ static PlayerResult play_song(const Song *const song) } audio_init((int)info.sample_rate); - audio_amp_disable(); + speaker_on ? audio_amp_enable() : audio_amp_disable(); int n_frames = 0; state->playing = true; @@ -434,6 +435,7 @@ static void draw_player(const PlayerState *const state) // Show Playing or paused/DAC on image UG_PutString(222, y + 11, state->playing ? "Pause" : "Continue"); UG_PutString(222, y + 50, "Go Back"); + UG_PutString(222, y + 89, speaker_on ? "Speaker off" : "Speaker on"); y += 115; // Explain start and stop button behaviour @@ -634,6 +636,12 @@ static void handle_keypress(event_keypad_t keys, bool *quit) set_display_brightness(backlight_on ? 0 : 50); backlight_on = !backlight_on; } + if (!lastJoystickState.values[GAMEPAD_INPUT_L] && joystick.values[GAMEPAD_INPUT_L]) + { + speaker_on = !speaker_on; + speaker_on ? audio_amp_enable() : audio_amp_disable(); + draw_player(&player_state); + } lastJoystickState = joystick; } diff --git a/esplay-launcher/main/gfxTile.png b/esplay-launcher/main/gfxTile.png index 6ae7032f9c073c8747f894456b91b1ae6b78dce9..06b0df670df18a09fb6040a3ba3318176884f4c6 100644 GIT binary patch delta 3598 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 QIu-C26BQSEWM*o?Kj?`VWdHyG diff --git a/esplay-launcher/main/graphics.c b/esplay-launcher/main/graphics.c index 108cbd4..e871116 100644 --- a/esplay-launcher/main/graphics.c +++ b/esplay-launcher/main/graphics.c @@ -7,6 +7,13 @@ static const char gfxTile[]={ #include "gfxTile.inc" }; +#define GFX_O_EMPTY 0 +#define GFX_O_FULL 1 +#define GFX_O_CHG 2 +#define GFX_O_CHGNEARFULL 3 + +const char * chargeinfo = "Press A to Play"; + void renderGraphics(int dx, int dy, int sx, int sy, int sw, int sh) { uint16_t *fb = ui_get_fb(); @@ -42,6 +49,34 @@ void renderGraphics(int dx, int dy, int sx, int sy, int sw, int sh) } } +void guiCharging(int almostFull) { + ui_clear_screen(); + UG_FontSelect(&FONT_6X8); + UG_PutString((320 - strlen(chargeinfo) * 7)/2, ((240 - 11)/2)+15, chargeinfo); + if (!almostFull) { + renderGraphics((320-41)/2, (240 - 11)/2, 208, 439 + (11*GFX_O_CHG), 41, 11); + } else { + renderGraphics((320-41)/2, (240 - 11)/2, 208, 439 + (11*GFX_O_CHGNEARFULL), 41, 11); + } + ui_flush(); +} + +void guiFull() { + ui_clear_screen(); + UG_FontSelect(&FONT_6X8); + UG_PutString((320 - strlen(chargeinfo) * 7)/2, ((240 - 11)/2)+15, chargeinfo); + renderGraphics((320-41)/2, (240 - 11)/2, 208, 439 + (11*GFX_O_FULL), 41, 11); + ui_flush(); +} + +void guiBatEmpty() { + ui_clear_screen(); + UG_FontSelect(&FONT_6X8); + UG_PutString((320 - strlen(chargeinfo) * 7)/2, ((240 - 11)/2)+15, chargeinfo); + renderGraphics((320-41)/2, (240 - 11)/2, 208, 439 + (11*GFX_O_EMPTY), 41, 11); + ui_flush(); +} + void drawBattery(int batPercent) { charging_state st = getChargeStatus(); diff --git a/esplay-launcher/main/include/graphics.h b/esplay-launcher/main/include/graphics.h index 36aedd3..cb6c13c 100644 --- a/esplay-launcher/main/include/graphics.h +++ b/esplay-launcher/main/include/graphics.h @@ -2,4 +2,7 @@ void renderGraphics(int dx, int dy, int sx, int sy, int sw, int sh); void drawBattery(int batPercent); -void drawVolume(int volume); \ No newline at end of file +void drawVolume(int volume); +void guiCharging(int almostFull); +void guiFull(); +void guiBatEmpty(); \ No newline at end of file diff --git a/esplay-launcher/main/main.c b/esplay-launcher/main/main.c index 01e7ff1..97fa60f 100755 --- a/esplay-launcher/main/main.c +++ b/esplay-launcher/main/main.c @@ -10,6 +10,12 @@ #include "esp_ota_ops.h" #include "esp_heap_caps.h" #include "esp_http_server.h" +#include "soc/dport_reg.h" + +#include "rom/rtc.h" +#include "soc/soc.h" +#include "soc/rtc.h" +#include "soc/rtc_cntl_reg.h" #include "settings.h" #include "gamepad.h" @@ -49,6 +55,52 @@ esp_err_t event_handler(void *ctx, system_event_t *event) return ESP_OK; } +static void handleCharging() { + int r; + int fullCtr=0; + //The LiIon charger sometimes goes back from 'full' to 'charging', which is + //confusing to the end user. This variable becomes true if the LiIon has indicated 'full' + //for a while, and it being true causes the 'full' icon to always show. + int fixFull=0; + + //Force brightness low to decrease chance of burn-in + set_display_brightness(30); + printf("Detected charger.\n"); + guiCharging(0); + + //Speed down + rtc_clk_cpu_freq_set(RTC_CPU_FREQ_80M); + input_gamepad_state prevKey; + gamepad_read(&prevKey); + do { + input_gamepad_state key; + gamepad_read(&key); + r=getChargeStatus(); + if (r==FULL_CHARGED || fixFull) { + guiFull(); + printf("Full!\n"); + fullCtr++; + } else if (r==CHARGING) { + battery_level_read(&bat_state); + guiCharging(bat_state.millivolts > 4100); + printf("Charging...\n"); + fullCtr=0; + } + + if (!prevKey.values[GAMEPAD_INPUT_A] && key.values[GAMEPAD_INPUT_A]) { + printf("Power btn A; go to launcher menu\n"); + break; + } + if (fullCtr==32) { + fixFull=1; + } + vTaskDelay(1); + prevKey = key; + } while (r!=NO_CHRG); + + rtc_clk_cpu_freq_set(RTC_CPU_FREQ_240M); +} + static void drawHomeScreen() { ui_clear_screen(); @@ -379,7 +431,11 @@ void app_main(void) sdcard_open("/sd"); // map SD card. ui_init(); + charging_state st = getChargeStatus(); + if (st == CHARGING) + handleCharging(); + UG_FontSelect(&FONT_8X12); if(settings_load(SettingWifi, &wifi_en) != 0) settings_save(SettingWifi, (int32_t)wifi_en); if(settings_load(SettingAudioVolume, &volume) != 0)