From de00c50b9aae871ed2dac168f63efc5f1866692b Mon Sep 17 00:00:00 2001 From: HalloSpaceBoy <111699451+HalloSpaceBoy5@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:44:58 -0400 Subject: [PATCH] Update V3.6 --- Compiled Games/Breakout.pbg | Bin 161227 -> 161227 bytes Compiled Games/Demo Program.pbg | Bin 38753 -> 38753 bytes Compiled Games/Flappy Bird.pbg | Bin 181374 -> 181374 bytes Compiled Games/Game Of Life.pbg | Bin 151358 -> 151358 bytes Compiled Games/Minefield SDK Demo.pbg | Bin 3891 -> 40018 bytes Compiled Games/Pac Man.pbg | Bin 288511 -> 288511 bytes Compiled Games/Paint.pbg | Bin 61173 -> 61162 bytes Compiled Games/Space Invaders.pbg | Bin 6964 -> 164863 bytes Compiled Games/Starship.pbg | Bin 178467 -> 178530 bytes Compiled Games/Tetris.pbg | Bin 173457 -> 173468 bytes PicoBoySDK.py | 96 ++++++++++++++++--- PicoGameBoy.py | 75 +++++++++++++-- VERSION | 2 +- main.py | 127 ++++++++++++++++++++++---- rpmidi.py | 21 +++-- settings.py | 87 +++++++++++++++++- st7789.py | 24 +++-- 17 files changed, 377 insertions(+), 55 deletions(-) diff --git a/Compiled Games/Breakout.pbg b/Compiled Games/Breakout.pbg index 26a8731cf6d8cf055176f39ba860527cb8645df2..2e5ed7c67acb8b4265a95c66974b064023abb28d 100644 GIT binary patch delta 124 zcmX^8n)CE)&JAY^nprk&XW7JPd1&+50&~adrKL=~J-Pb^_lVqVh7Fi~2A zEx?_(lOGg_PFE;pVg;I! VUkVmAE@7G;P{JfXeQPO`7yvJiDqa8p delta 142 zcmX^8n)CE)&JAY^wzC;CnL9QE8D|R^Ee}mEEoBm!9$3O;&&V)+VhNKH^R`BYiP9Qu z0p5&EA`H`vnWQurpkQ0$;Q|H*r=rxv?EKOaeHcTppc0~Z`V*jjmTir{Hcq}@APY5N adVVRB66>}`;}WLn0VPcG)3=r~i2(p&wJoy% diff --git a/Compiled Games/Demo Program.pbg b/Compiled Games/Demo Program.pbg index bef58964114ddb68060da0f3fc45456c72e124e9..72b8f0c871472033e4674bdbf7222145cb5245a0 100644 GIT binary patch delta 41 rcmaF3j_Kh#rVXp7F)~kHGfjzc$>j6X%z^Cl1yY<0P_SgO)^u|KV2=(9 delta 41 rcmaF3j_Kh#rVXp7F)~bEGfjzc+vM}p%z^Cl1yY<0P_S*X)^u|KVigW4 diff --git a/Compiled Games/Flappy Bird.pbg b/Compiled Games/Flappy Bird.pbg index b0009733bf8659b068843d0aa875b92fcafe696c..0ed724e4317d3bcf0eeafd24dffb24cbddc64820 100644 GIT binary patch delta 143 zcmey@!Tqm;yS0yTYaf%xq0N^Ij`mN#c8Do>Bh$$O7Dgr!=IQ4SGbu4IX=IqXl2Ms0 zz#Aks`D}sI^aY2RI9Qi7+8tt?zVzg3``rt1O? f0&0j0VwxzcBNpJz$_7%(0)&o?3=HarnSeY1N(3pj delta 149 zcmey@!Tqm;dwX0E)9Hfk4u=@e_BV2EFfQNI2e~qkM(1cKVV2?5zRL}}2$hxF4^Dg7`L_a125mq(^AYcZ=SdSb#Sx8v_t91K}4S JZQ{oSBmqFIA6WnZ diff --git a/Compiled Games/Minefield SDK Demo.pbg b/Compiled Games/Minefield SDK Demo.pbg index c6f2787ffbe5d01b90be6cfdfd5fffd15e7cf298..7d0d60188226b293cd2caa2b03494374c6d21ddc 100644 GIT binary patch literal 40018 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 W!@qcqHD9C8|9oR(;~)QnvHt^$K2OR3 literal 3891 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 R{L#sBxY7^f1#$e?{S&3T2%P`` diff --git a/Compiled Games/Pac Man.pbg b/Compiled Games/Pac Man.pbg index b8c919b022982c31a0045577a52be70172cb78e6..694c5a98be549c4dcba93acc8d146320569e4ae6 100644 GIT binary patch delta 397 zcmex=R`CB>!3p8hJrh|nH-;Z9*uFH1#f+)lVj9zSi)qYehnm^0Y-hW|Xmn`%?HCqQ zrtNtVEaptxHzl&@F>U9FXK`fOEK&F@iG`6#gn9atWELgnC5;RdrRCWIyum_AX<#AW z>5B0z!qamTSva9G69c8V8K7WE@jHxV2Y)cx~ z76XOforVcdx+0~4(DT@oi6I~{S;03kPro2BIX5vcDP1oqGY{&hD?lSymo$q0V4nUi zh6QHCba#lb*DvPjjS(zTFbmftvPkhF%x?U{JpDo%i!{W`T=6K9+y607cSvJVWMrOR mpTeS~x1{j{0}I?KP$%gXR0epnvVn}`20>;9hI`2@Kpp`9ifHQq delta 360 zcmex=R`CB>!3p6T4;(Dm`itdRQu|X=rtMEnnXL{rZ!g}yy_nJL(DsmD%;rp+8w<^t zw#)xu2Ff4&$852_Ml$K`;@CFG@+$A-=KZS(@ zDC#@$qT2KWDJ-mv4Aa-Au_(!HYve0rU3G&pkQ00-ZUnL=@+6|B%spM{eCe^@gn3?B3P!SvB)zrOs+1Jn*IRj z5Y}ytv!ht1zfED01G-}h&<>!;#Tb_9yHi#%!)*o>GS?DONs?}v$BC4!3~1U3=H>@S%5qM=#OjM diff --git a/Compiled Games/Paint.pbg b/Compiled Games/Paint.pbg index 6c6efc9350b1a5ae5a37a3bc78cb35904de7e543..f9549ec5ca1b266e7c29dc3329a13c9cc8434ab6 100644 GIT binary patch delta 70 zcmex*m-*FQX7K=TW)=|!5Mb|$jVNt)`jJ%2z>u_2T#j+G1EbPgUKHWU`R{xg`zG&w LXT;|H4x|YHE2$Sz delta 97 zcmaELm-*{mX7K=TW)=|!5a0}ojo6*@`E71314HgcaXCiL%-n+fq7sFo)Xm0>DsOpF h6iiNe=gTy+cJiuPMX>;HRyL3cOhDKPq{H5UcmO!F9fAM= diff --git a/Compiled Games/Space Invaders.pbg b/Compiled Games/Space Invaders.pbg index bb998eeed9c5ba5506d990416c4a8982dac691e3..effdf44caacf6bd91b06e5f909a42184ca7bc3d9 100644 GIT binary patch literal 164863 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%0D^xSd;M6YXEG)VNcRPL$oL+ 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 YG@;j4KST1}g7oy`b9$bU$MC)MUkk|EcK`qY diff --git a/Compiled Games/Starship.pbg b/Compiled Games/Starship.pbg index aeb4fe12ea1637ac17f37123f1989a96389495b5..ce7b28a1046cc5eb4b642093099cdb392e83a95c 100644 GIT binary patch delta 314 zcmZ4diR;lPF7W_wW)=|!5O^9}7QuF?bk+P828Q{Q^$RCWj+!gI`C#FHL5Vcmpa9>@ zluV6+^dwDQE(IV+NzGA6+x)OOf{8=H$W#Z23@1CZDQ>oJlNR4xI#-W-^2{4zlh(3K z?pvuex!@7UCx2KjI{E1hNuV&3lG5gjD}ouBO$`htA6P0f+2AYdX2(@?xR`-f zY`(kYm(=80mqePyFKidTzy!$ z9h296mEwU&F#shmwoL!9gGrtRBsKlzb|xj(C5>F}Ow$E+FsU#yPdD8G7KsOn#Oz?w V5MgBlX=MRIEk*_gr5#K_9snMtV}Aeu delta 286 zcmaF#iEHsEuI*gzOj3oC%q$`dAn>QsCgRRLbJc_v1_lroneMxTNqnMF`Nkvv1t%wn zN^mL|nd$(Mq2}h>LJ>@x!$cLuC$5y9ygo{FbB~TB_vHQNYLnlZnQacRP-SE>GBq%m z+}I*Ac|r`!<_VT_xi%ZP{F0i?)5t4Ql$lqeQIwdM0-_Cc3=IqnG@Iq)x68*fzJ1QZ z$Rxrroe$`=>1TH^aj?QLnpu+q!x$k!G3}e u+ZrVbr~B<-k_MWP1vG(WTjQ#)(z6PoF)wLkn3$%*7T^sMnr!e$N}B-+mNf1M+7yynQj}S&UjnA$OEODxQuUHD^C0S{ zrvr^(UDEi)h-rG?5+((IW)ZMv6sH0W5rCNqq?a_>8#BR-g_y2aP#NIO$_7%z0)$eG L3=BC-n1DP0dw@}R delta 248 zcmbPpnrq@|uIXQlm_j#l?JwZ<-(?bUs8vS$O92DJm+fK3OnVrG3(}MHit|hJQZx*7 z40VhQ3=A~4Ynd|rVdOH@GgQ*iHPkUQoNj2rq`y7hoasE{c0)_1w;J0OlbC#+nhzFi zKUlzMdWeOQNrYiK+fpVa=537()A@~=WZ43|!Gc9gz=GZrrBz%YLLv+xfZ`OOa|FPm z5Mo;+S0MvKNNPz@X0bkm(krNh8h8+BAj`H!okx>z7f6Z)c(byBG_e4o6e9ye;u0nx F4*=2oL>K@7 diff --git a/PicoBoySDK.py b/PicoBoySDK.py index 47849ee..beae50c 100644 --- a/PicoBoySDK.py +++ b/PicoBoySDK.py @@ -1,6 +1,6 @@ # Original Software Development Kit by HalloSpaceBoy # Code used from MikeDev and Vincient Mistler -from machine import Pin, PWM, SPI, reset +from machine import Pin, PWM, SPI, reset, ADC import framebuf from framebuf import FrameBuffer, RGB565 from time import sleep @@ -113,14 +113,14 @@ def init_display(self): def decrease_brightness(self): if self.DUTY_CYCLE > self.DUTY_CYCLE_MIN: - self.DUTY_CYCLE -= 5000 + self.DUTY_CYCLE -= 2750 self.bl.duty_u16(self.DUTY_CYCLE) with open("/brghtness.conf", "w") as w: w.write(str(self.DUTY_CYCLE)) def increase_brightness(self): if self.DUTY_CYCLE < self.DUTY_CYCLE_MAX: - self.DUTY_CYCLE += 5000 + self.DUTY_CYCLE += 2750 self.bl.duty_u16(self.DUTY_CYCLE) with open("/brghtness.conf", "w") as w: w.write(str(self.DUTY_CYCLE)) @@ -143,6 +143,7 @@ def rotate(self, rotate): def show_screen(self): self.write_cmd(RAMWR, self.buffer) + def colorc(self,rgb565): lsb = (rgb565 & 0b0000000011111111)<<8 msb = (rgb565 & 0b1111111100000000)>>8 @@ -222,7 +223,17 @@ def __init__(self,namespace=None,tick_time=0.025): self.spk_channel4 = PWM(Pin(15)) super().__init__(width=240, height=240, id_=0, sck=18, mosi=19, dc=20, rst=21, cs=17, bl=22, baudrate=62500000) - self.sprites=[] + self.sprites=[] + self.vpin=ADC(29) + self.audio_pwm_wrap=5000 + self.curve=1.8 + self.vol_max=100000 + self.vol_min=2500 + try: + with open("/volume.conf", "r") as r: + self.vol=int(r.read()) + except: + self.vol=self.vol_max def Load_Sprite(self,filename,width,height): with open(filename,"rb") as read: @@ -246,6 +257,10 @@ def Update(self, savescore=None, noclear=False): self.increase_brightness() if self.Button("Down") and self.Button("Select"): self.decrease_brightness() + if self.Button("Right") and self.Button("Select"): + self.increase_vol() + if self.Button("Left") and self.Button("Select"): + self.decrease_vol() if self.cycle%50==0: self.cycle=0 collect() @@ -253,6 +268,49 @@ def Update(self, savescore=None, noclear=False): sleep(self.tick) if not noclear: self.Fill_Screen((0,0,0)) + adc_reading = self.vpin.read_u16() + adc_voltage = (adc_reading * 3.3) / 65535 + vsys_voltage = adc_voltage * 12 + if vsys_voltage>10: + vsys_voltage = adc_voltage * 3 + if vsys_voltage<1.9: + self.fill(self.color(0,0,0)) + self.Create_Text("BATTERY CRITICALLY LOW!",-1,30,(255,255,255)) + self.Create_Text("Please replace the", -1, 130, (255,255,255)) + self.Create_Text("batteries in your PicoBoy.", -1, 145, (255,255,255)) + self.Create_Text("Please switch your", -1, 200, (255,255,255)) + self.Create_Text("PicoBoy off.", -1, 215, (255,255,255)) + self.rect(75,60,80,40,self.color(255,0,0)) + self.fill_rect(155,70,10,20,self.color(255,0,0)) + self.line(75,60,155,99,self.color(255,0,0)) + self.Play_Sound(0) + self.Play_Sound(0,2) + self.Play_Sound(0,3) + self.Play_Sound(0,4) + self.show_screen() + sys.exit() + + def increase_vol(self): + if self.vol<=self.vol_max-5500: + self.vol+=4875 + else: + self.vol=self.vol_max + try: + with open("volume.conf", "w") as w: + w.write(str(self.vol)) + except: + "" + + def decrease_vol(self): + if self.vol>=self.vol_min+5500: + self.vol-=4875 + else: + self.vol=self.vol_min + try: + with open("volume.conf", "w") as w: + w.write(str(self.vol)) + except: + "" def Button(self, button): if button=="Any": @@ -310,28 +368,31 @@ def Fill_Screen(self,color): self.fill(self.color(*color)) def Play_Sound(self, freq, channel=1, duty_u16 = 2000): + pwm_divider = 133000000 / self.audio_pwm_wrap / (freq+1) + max_count = (freq * self.audio_pwm_wrap) / 10000 + level = (self.vol / 100.0**self.curve) * max_count if channel==1: if freq>0: self.spk_channel1.freq(freq) - self.spk_channel1.duty_u16(duty_u16) + self.spk_channel1.duty_u16(int(level)) else: self.spk_channel1.duty_u16(0) if channel==2: if freq>0: self.spk_channel2.freq(freq) - self.spk_channel2.duty_u16(duty_u16) + self.spk_channel2.duty_u16(int(level)) else: self.spk_channel2.duty_u16(0) if channel==3: if freq>0: self.spk_channel3.freq(freq) - self.spk_channel3.duty_u16(duty_u16) + self.spk_channel3.duty_u16(int(level)) else: self.spk_channel3.duty_u16(0) if channel==4: if freq>0: self.spk_channel4.freq(freq) - self.spk_channel4.duty_u16(duty_u16) + self.spk_channel4.duty_u16(int(level)) else: self.spk_channel4.duty_u16(0) @@ -409,10 +470,10 @@ def Pause_Screen(self): self.fill_rect(10,90,220,80,self.color(50,50,50)) self.Create_Text("Game Paused", -1,-1,(255,255,255)) self.Create_Text("Press start to resume.", -1, 135, (255,255,255)) - self.Update(True) + self.Update(True, True) sleep(0.25) while True: - self.Update(True) + self.Update(True, True) if self.Button("Start"): sleep(0.25) return @@ -519,6 +580,9 @@ def __init__(self,parent,mode): self.isReading=False self.savedsong=[] self.index=0 + self.audio_pwm_wrap=5000 + self.curve=1.8 + self.vol=self.parent.vol/18 self.thread=start_new_thread(self.Play,()) def _pitch(self, freq): @@ -528,18 +592,22 @@ def _duty_cycle(self, percent): return round((percent/100)*65535) def play_note(self, note, channel, duty): + self.vol=self.parent.vol/18 + pwm_divider = 133000000 / self.audio_pwm_wrap / (note+1) + max_count = (note * self.audio_pwm_wrap) / 10000 + level = (self.vol / 100.0**self.curve) * max_count if channel == "a0": self.ch_a_0.freq(round(self._pitch(note))) - self.ch_a_0.duty_u16(self._duty_cycle(duty)) + self.ch_a_0.duty_u16(self._duty_cycle(int(level))) elif channel == "a1": self.ch_a_1.freq(round(self._pitch(note))) - self.ch_a_1.duty_u16(self._duty_cycle(duty)) + self.ch_a_1.duty_u16(self._duty_cycle(int(level))) elif channel == "b0": self.ch_b_0.freq(round(self._pitch(note))) - self.ch_b_0.duty_u16(self._duty_cycle(duty)) + self.ch_b_0.duty_u16(self._duty_cycle(int(level))) elif channel == "b1": self.ch_b_1.freq(round(self._pitch(note))) - self.ch_b_1.duty_u16(self._duty_cycle(duty)) + self.ch_b_1.duty_u16(self._duty_cycle(int(level))) def stop_channel(self, channel): if channel == "a0": diff --git a/PicoGameBoy.py b/PicoGameBoy.py index f925a62..fe0f947 100644 --- a/PicoGameBoy.py +++ b/PicoGameBoy.py @@ -1,6 +1,6 @@ # Original source files for PicoGameBoy.py by Vincent Mistler for YouMakeTech # Modified By HalloSpaceBoy for the PicoBoy -from machine import Pin, PWM +from machine import Pin, PWM, ADC from framebuf import FrameBuffer, RGB565 from st7789 import ST7789 from time import sleep @@ -30,7 +30,16 @@ def __init__(self): self.__fb=[] # Array of FrameBuffer objects for sprites self.__w=[] self.__h=[] - + self.vpin=ADC(29) + self.audio_pwm_wrap=5000 + self.curve=1.8 + self.vol_max=100000#30000 + self.vol_min=2500 + try: + with open("/volume.conf", "r") as r: + self.vol=int(r.read()) + except: + self.vol=self.vol_max # center_text(s,color) displays a text in the middle of # the screen with the specified color def free_mem(self): @@ -45,6 +54,31 @@ def show(self): self.increase_brightness() if self.button_down() and self.button_select(): self.decrease_brightness() + if self.button_right() and self.button_select(): + self.increase_vol() + if self.button_left() and self.button_select(): + self.decrease_vol() + adc_reading = self.vpin.read_u16() + adc_voltage = (adc_reading * 3.3) / 65535 + vsys_voltage = adc_voltage * 12 + if vsys_voltage>10: + vsys_voltage = adc_voltage * 3 + if vsys_voltage<1.9: + self.fill(PicoGameBoy.color(0,0,0)) + self.create_text("BATTERY CRITICALLY LOW!",-1,30,PicoGameBoy.color(255,255,255)) + self.create_text("Please replace the", -1, 130, PicoGameBoy.color(255,255,255)) + self.create_text("batteries in your PicoBoy.", -1, 145, PicoGameBoy.color(255,255,255)) + self.create_text("Please switch your", -1, 200, PicoGameBoy.color(255,255,255)) + self.create_text("PicoBoy off.", -1, 215, PicoGameBoy.color(255,255,255)) + self.rect(75,60,80,40,PicoGameBoy.color(255,0,0)) + self.fill_rect(155,70,10,20,PicoGameBoy.color(255,0,0)) + self.line(75,60,155,99,PicoGameBoy.color(255,0,0)) + self.sound(0) + self.sound(0,2) + self.sound(0,3) + self.sound(0,4) + self.show_screen() + sys.exit() def center_text(self, s, color = 1): x = int(self.width/2)- int(len(s)/2 * 8) @@ -58,6 +92,8 @@ def create_text(self, s,x=-1,y=-1, color = ST7789.color(255,255,255)): y = int(self.height/2) - 8 self.text(s, x, y, color) + + # center_text(s,color) displays a text in the right corner of # the screen with the specified color def top_right_corner_text(self, s, color = 1): @@ -208,29 +244,54 @@ def any_button(self): # sound(freq) makes a sound at the selected frequency in Hz # call sound(0) to stop playing the sound - def sound(self, freq, channel=1, duty_u16 = 2000): + def increase_vol(self): + if self.vol<=self.vol_max-5500: + self.vol+=4875 + else: + self.vol=self.vol_max + try: + with open("volume.conf", "w") as w: + w.write(str(self.vol)) + except: + "" + + def decrease_vol(self): + if self.vol>=self.vol_min+5500: + self.vol-=4875 + else: + self.vol=self.vol_min + try: + with open("volume.conf", "w") as w: + w.write(str(self.vol)) + except: + "" + + def sound(self, freq, channel=1, j=0): + pwm_divider = 133000000 / self.audio_pwm_wrap / (freq+1) + max_count = (freq * self.audio_pwm_wrap) / 10000 + level = (self.vol / 100.0**self.curve) * max_count if channel==1: if freq>0: self.__buzzer.freq(freq) - self.__buzzer.duty_u16(duty_u16) + self.__buzzer.duty_u16(int(level)) else: self.__buzzer.duty_u16(0) if channel==2: if freq>0: self.__buzzer2.freq(freq) - self.__buzzer2.duty_u16(duty_u16) + self.__buzzer2.duty_u16(int(level)) else: self.__buzzer2.duty_u16(0) if channel==3: if freq>0: self.__buzzer3.freq(freq) - self.__buzzer3.duty_u16(duty_u16) + self.__buzzer3.duty_u16(int(level)) else: self.__buzzer3.duty_u16(0) if channel==4: if freq>0: self.__buzzer4.freq(freq) - self.__buzzer4.duty_u16(duty_u16) + self.__buzzer4.duty_u16(int(level)) else: self.__buzzer4.duty_u16(0) diff --git a/VERSION b/VERSION index efa9840..2910d8d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -PBOS V2.4 \ No newline at end of file +PBOS V2.5 \ No newline at end of file diff --git a/main.py b/main.py index 3ac208a..9520a12 100644 --- a/main.py +++ b/main.py @@ -14,11 +14,13 @@ BLACK = PicoGameBoy.color(0,0,0) WHITE = PicoGameBoy.color(255,255,255) pgb = PicoGameBoy() - +vpin = machine.ADC(29) games=os.listdir("/games") loop=0 gamenum=len(games)-1 title=0 +pastpercentage=[] +pastpercent=101 def readchunk(filename, x2, y2, w, h): @@ -112,16 +114,18 @@ def getimagedata(): bootlogo=True if bootlogo: pgb.fill(BLACK) - with open("logo.pbimg","rb") as r: - data=r.read() - tempfb=FrameBuffer(bytearray(data),64,64,RGB565) - pgb.blit(tempfb,88,50) - del tempfb - with open("logo-text.pbimg","rb") as r: - data=r.read() - tempfb=FrameBuffer(bytearray(data),102,15,RGB565) - pgb.blit(tempfb,69,150) - del tempfb + readchunk("logo.pbimg",88,50,64,64) + #with open("logo.pbimg","rb") as r: + # data=r.read() + #tempfb=FrameBuffer(bytearray(data),64,64,RGB565) + #pgb.blit(tempfb,88,50) + #del tempfb + readchunk("logo-text.pbimg",69,150,102,15) + #with open("logo-text.pbimg","rb") as r: + # data=r.read() + #tempfb=FrameBuffer(bytearray(data),102,15,RGB565) + #pgb.blit(tempfb,69,150) + #del tempfb pgb.show_screen() pgb.sound(98) time.sleep(0.2) @@ -195,6 +199,8 @@ def getimagedata(): c4=array.array('h',[0,0,0,-5,-5,0]) if not bgimage: + if bindex>len(bgcolors)-1: + bindex=8 bgcolor=bgcolors[bindex] bgcolor565=PicoGameBoy.color(*bgcolor) pgb.fill(PicoGameBoy.color(*bgcolor)) @@ -294,8 +300,78 @@ def getimagedata(): onsett=True +def draw_battery(): + global pastpercentage + global pastpercent + adc_reading = vpin.read_u16() + adc_voltage = (adc_reading * 3.3) / 65535 + vsys_voltage = adc_voltage * 12 + console=0 + if vsys_voltage>10: + vsys_voltage = adc_voltage * 3 + percentage=int(int(((round(vsys_voltage,3)-1.9)/2.7)*100)) + console=1 + else: + percentage=int(int(((round(vsys_voltage,3)-1.9)/1)*100)) + console=0 + if vsys_voltage<1.9: + pgb.fill(BLACK) + pgb.create_text("BATTERY CRITICALLY LOW!",-1,30,WHITE) + pgb.create_text("Please replace the", -1, 130, WHITE) + pgb.create_text("batteries in your PicoBoy.", -1, 145, WHITE) + pgb.create_text("Please switch your", -1, 200, WHITE) + pgb.create_text("PicoBoy off.", -1, 215, WHITE) + pgb.rect(75,60,80,40,PicoGameBoy.color(255,0,0)) + pgb.fill_rect(155,70,10,20,PicoGameBoy.color(255,0,0)) + pgb.line(75,60,155,99,PicoGameBoy.color(255,0,0)) + pgb.show() + sys.exit() + if console==0: + if percentage>100 and percentage<125: + percentage=100 + if percentage<130: + pastpercentage.append(percentage) + if len(pastpercentage)>200: + pastpercentage.pop(0) + percentage=int(int(sum(pastpercentage)/len(pastpercentage))) + elif console==1: + if percentage>100 and percentage<110: + percentage=100 + if percentage<110: + pastpercentage.append(percentage) + if len(pastpercentage)>200: + pastpercentage.pop(0) + percentage=int(int(sum(pastpercentage)/len(pastpercentage))) + + + battx=9 + batty=183 + pgb.rect(battx,batty,20,40,ttcolor) + pgb.fill_rect(battx+5,batty-4,10,5,ttcolor) + if percentage>100: + pgb.create_text("U",battx+6, batty+7,ttcolor) + pgb.create_text("S",battx+6, batty+17,ttcolor) + pgb.create_text("B",battx+6, batty+27,ttcolor) + pgb.create_text("USB",battx+10-int(len(str(percentage))/2 * 8), batty+44, ttcolor) + else: + h=int(38*(percentage/100)) + pgb.fill_rect(battx+1,batty+1+(38-h),18,h,ttcolor) + pgb.create_text(str(percentage)+"%",battx+10-int(len(str(percentage)+"%")/2 * 8), batty+43, ttcolor) + +def draw_battery_backing(): + battx=9 + batty=183 + pgb.fill_rect(battx-2,batty-4,24,55,bgcolor565) + pgb.fill_rect(battx-5-2,batty-4,5,55,bgcolor565) + pgb.fill_rect(battx+20+2,batty-4,5,55,bgcolor565) + pgb.fill_rect(battx-2,batty-9,24,5,bgcolor565) + pgb.fill_rect(battx-2,batty+51,24,5,bgcolor565) + pgb.poly(battx-5-2,batty-9,array.array('h',[5,5,0,5,5,0]),bgcolor565,True) + pgb.poly(battx+19+2,batty-9,array.array('h',[0,5,5,5,0,0]),bgcolor565,True) + pgb.poly(battx-5-2,batty+55,array.array('h',[0,-5,5,0,5,-5]),bgcolor565,True) + pgb.poly(battx+19+2,batty+55,array.array('h',[0,0,0,-5,5,-5]),bgcolor565,True) -def render(): +def render(f=True): if bgimage: draw_image(7) else: @@ -360,7 +436,8 @@ def render(): pgb.poly(60,200,c2,bgcolor565,True) pgb.poly(180,80,c3,bgcolor565,True) pgb.poly(180,200,c4,bgcolor565,True) - pgb.show() + if f: + pgb.show() try: with open("/animated.conf") as r: @@ -375,6 +452,7 @@ def render(): if pgb.button_left() and title>0 and not onsett: if animated and not bgimage: incr=20 + draw_battery_backing() for i in range(12): #3 is good i+=1 pgb.fill_rect(0,78,240,130,bgcolor565) @@ -405,10 +483,14 @@ def render(): pgb.fill_rect(0,78,240,130,bgcolor565) title-=1 - render() + render(False) + draw_battery_backing() + draw_battery() + pgb.show() if pgb.button_right() and title10: + vsys_voltage = adc_voltage * 3 + percentage=int(int(((round(vsys_voltage,3)-1.9)/2.7)*100)) + console=1 + else: + percentage=int(int(((round(vsys_voltage,3)-1.9)/1)*100)) + console=0 + if console==0: + if percentage>100 and percentage<125: + percentage=100 + if percentage<130: + pastpercentage.append(percentage) + if len(pastpercentage)>200: + pastpercentage.pop(0) + percentage=int(int(sum(pastpercentage)/len(pastpercentage))) + elif console==1: + if percentage>100 and percentage<110: + percentage=100 + if percentage<110: + pastpercentage.append(percentage) + if len(pastpercentage)>200: + pastpercentage.pop(0) + percentage=int(int(sum(pastpercentage)/len(pastpercentage))) pgb.create_text("PicoBoy "+version,10,225,ttcolor) - options=["Change Brightness", "Change Background", "Data Upload Mode", "Toggle Animation: "+str(animated), "Exit"] + if percentage>100: + pgb.create_text("USB",100,225, ttcolor) + else: + pgb.create_text(str(percentage)+"%",100,225,ttcolor) + options=["Change Brightness", "Change Volume", "Change Background", "Data Upload Mode", "Toggle Animation: "+str(animated), "Exit"] if tcolor==0: ottcolor=white else: @@ -296,11 +328,56 @@ def background(): break pgb.show() if opt==1: + time.sleep(0.2) + while True: + pgb.fill(bgcolor565) + pgb.rect(20,110,200,20,ttcolor) + volume=pgb.vol + width=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*198) + percentage=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*100) + pgb.fill_rect(21,111,width,18,ttcolor) + pgb.create_text(str(percentage)+"%",-1,95,ttcolor) + pgb.create_text(str(percentage)+"%",-1,95,ttcolor) + pgb.create_text("Use the left and right",-1,140,ttcolor) + pgb.create_text("buttons to change the",-1,150,ttcolor) + pgb.create_text("volume.",-1,160,ttcolor) + pgb.create_text("Press A to exit.",-1,220,ttcolor) + if pgb.button_left(): + pgb.decrease_vol() + pgb.fill_rect(0,95,240,40,bgcolor565) + pgb.rect(20,110,200,20,ttcolor) + volume=pgb.vol + width=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*198) + percentage=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*100) + pgb.fill_rect(21,111,width,18,ttcolor) + pgb.create_text(str(percentage)+"%",-1,95,ttcolor) + pgb.show() + pgb.sound(200) + time.sleep(0.0825) + pgb.sound(0) + if pgb.button_right(): + pgb.increase_vol() + pgb.fill_rect(0,95,240,40,bgcolor565) + pgb.rect(20,110,200,20,ttcolor) + volume=pgb.vol + width=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*198) + percentage=int(((volume-pgb.vol_min)/(pgb.vol_max-pgb.vol_min))*100) + pgb.fill_rect(21,111,width,18,ttcolor) + pgb.create_text(str(percentage)+"%",-1,95,ttcolor) + pgb.show() + pgb.sound(200) + time.sleep(0.0825) + pgb.sound(0) + if pgb.button_A() or pgb.button_B(): + time.sleep(0.2) + break + pgb.show() + if opt==2: time.sleep(0.2) pgb.show() background() time.sleep(0.2) - if opt==2: + if opt==3: pgb.fill(PicoGameBoy.color(0,0,0)) pgb.create_text("DATA UPLOAD MODE",-1,50,PicoGameBoy.color(255,255,255)) pgb.create_text("Plug your PicoBoy",-1, 100,PicoGameBoy.color(255,255,255)) @@ -312,7 +389,7 @@ def background(): pgb.create_text("your PicoBoy.",-1,204,PicoGameBoy.color(255,255,255)) pgb.show() sys.exit() - if opt==3: + if opt==4: if animated: animated=False else: @@ -320,7 +397,7 @@ def background(): with open("animated.conf", "w") as w: w.write(str(animated)) time.sleep(0.1) - if opt==4: + if opt==5: homebootstop=open("/noboot", "w") homebootstop.close() pgb.fill(PicoGameBoy.color(0,0,0)) diff --git a/st7789.py b/st7789.py index 0d5ea5c..c510072 100644 --- a/st7789.py +++ b/st7789.py @@ -57,7 +57,13 @@ def __init__(self, width=240, height=240, id_=0, sck=18, mosi=19, self.DUTY_CYCLE_MIN = 10000 #Minimum Brightness self.DUTY_CYCLE=45000 #Brightness self.DUTY_CYCLE_MAX = 65000 #Maximum Brightness + + ### Enable for screenshots + #self.sbuffer=bytearray(self.height * self.width * 2) + #self.buffer = memoryview(self.sbuffer) + ##### Otherwise: self.buffer = memoryview(bytearray(self.height * self.width * 2)) + super().__init__(self.buffer, self.width, self.height, framebuf.RGB565) self.init_display() @@ -122,17 +128,23 @@ def init_display(self): def decrease_brightness(self): if self.DUTY_CYCLE > self.DUTY_CYCLE_MIN: - self.DUTY_CYCLE -= 5000 + self.DUTY_CYCLE -= 2750 self.bl.duty_u16(self.DUTY_CYCLE) - with open("/brghtness.conf", "w") as w: - w.write(str(self.DUTY_CYCLE)) + try: + with open("/brghtness.conf", "w") as w: + w.write(str(self.DUTY_CYCLE)) + except: + "" def increase_brightness(self): if self.DUTY_CYCLE < self.DUTY_CYCLE_MAX: - self.DUTY_CYCLE += 5000 + self.DUTY_CYCLE += 2750 self.bl.duty_u16(self.DUTY_CYCLE) - with open("/brghtness.conf", "w") as w: - w.write(str(self.DUTY_CYCLE)) + try: + with open("/brghtness.conf", "w") as w: + w.write(str(self.DUTY_CYCLE)) + except: + "" def power_off(self): pass