From 7547338422218f5ac0ec9475f5a1e9995e960a8e Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Sun, 3 Nov 2024 23:05:14 +0300 Subject: [PATCH 1/7] Fix SDL2 process --- sources/Adapters/SDL2/Process/SDLProcess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Adapters/SDL2/Process/SDLProcess.cpp b/sources/Adapters/SDL2/Process/SDLProcess.cpp index 90719c30..028855b9 100644 --- a/sources/Adapters/SDL2/Process/SDLProcess.cpp +++ b/sources/Adapters/SDL2/Process/SDLProcess.cpp @@ -9,7 +9,7 @@ int _SDLStartThread(void *argp) { } bool SDLProcessFactory::BeginThread(SysThread& thread) { - SDL_CreateThread(_SDLStartThread,&thread); + SDL_CreateThread(_SDLStartThread,"lgtp",&thread); return true ; } From 5b62587343c26aaacfc99cf2fe7a46fcb887fa17 Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Sun, 3 Nov 2024 23:17:19 +0300 Subject: [PATCH 2/7] Initial PSVITA port --- projects/Makefile | 26 +++ projects/Makefile.VITA | 62 ++++++ projects/resources/VITA/INSTALL_HOW_TO.txt | 5 + projects/resources/VITA/config.xml | 21 ++ projects/resources/VITA/mapping.xml | 32 ++++ projects/resources/VITA/sce_sys/icon0.png | Bin 0 -> 7444 bytes .../VITA/sce_sys/livearea/contents/bg.png | Bin 0 -> 3864 bytes .../sce_sys/livearea/contents/startup.png | Bin 0 -> 4104 bytes .../sce_sys/livearea/contents/template.xml | 11 ++ sources/Adapters/SDL2/GUI/SDLGUIWindowImp.cpp | 9 +- .../VITA/FileSystem/VITAFileSystem.cpp | 179 ++++++++++++++++++ .../Adapters/VITA/FileSystem/VITAFileSystem.h | 46 +++++ sources/Adapters/VITA/Main/VITAmain.cpp | 30 +++ sources/Adapters/VITA/System/VITASystem.cpp | 144 ++++++++++++++ sources/Adapters/VITA/System/VITASystem.h | 30 +++ sources/Application/FX/FxPrinter.cpp | 5 + 16 files changed, 599 insertions(+), 1 deletion(-) create mode 100644 projects/Makefile.VITA create mode 100644 projects/resources/VITA/INSTALL_HOW_TO.txt create mode 100644 projects/resources/VITA/config.xml create mode 100644 projects/resources/VITA/mapping.xml create mode 100644 projects/resources/VITA/sce_sys/icon0.png create mode 100644 projects/resources/VITA/sce_sys/livearea/contents/bg.png create mode 100644 projects/resources/VITA/sce_sys/livearea/contents/startup.png create mode 100644 projects/resources/VITA/sce_sys/livearea/contents/template.xml create mode 100644 sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp create mode 100644 sources/Adapters/VITA/FileSystem/VITAFileSystem.h create mode 100644 sources/Adapters/VITA/Main/VITAmain.cpp create mode 100644 sources/Adapters/VITA/System/VITASystem.cpp create mode 100644 sources/Adapters/VITA/System/VITASystem.h diff --git a/projects/Makefile b/projects/Makefile index 60aa3825..d00cde0c 100644 --- a/projects/Makefile +++ b/projects/Makefile @@ -198,6 +198,18 @@ PSPDIRS := \ ../sources/Adapters/SDL/GUI \ ../sources/Adapters/SDL/Timer +VITADIRS := \ + . \ + ../sources/Adapters/VITA/Main \ + ../sources/Adapters/VITA/FileSystem \ + ../sources/System/Process \ + ../sources/Adapters/VITA/System \ + ../sources/Adapters/Dummy/Midi \ + ../sources/Adapters/SDL2/Process \ + ../sources/Adapters/SDL2/Audio \ + ../sources/Adapters/SDL2/GUI \ + ../sources/Adapters/SDL2/Timer + GP32DIRS := .\ ../sources/Adapters/GP32FileSystem \ ../sources/Adapters/GP32Midi \ @@ -439,6 +451,20 @@ PSPFILES := \ SDLTimer.o \ PSPSystem.o +VITAFILES := \ + VITAmain.o \ + VITAFileSystem.o \ + Process.o \ + DummyMidi.o \ + GUIFactory.o \ + SDLGUIWindowImp.o \ + SDLEventManager.o \ + SDLAudioDriver.o \ + SDLAudio.o \ + SDLProcess.o \ + SDLTimer.o \ + VITASystem.o + #--------------------------------------------------------------------------------- # Windows #--------------------------------------------------------------------------------- diff --git a/projects/Makefile.VITA b/projects/Makefile.VITA new file mode 100644 index 00000000..d4901d57 --- /dev/null +++ b/projects/Makefile.VITA @@ -0,0 +1,62 @@ +-include $(PWD)/rules_base + +DEFINES := \ + -DPLATFORM_$(PLATFORM) \ + -DBUFFERED \ + -DCPP_MEMORY \ + -DHAVE_STDINT_H \ + -DSDL2 \ + -DNDEBUG + + +DEVKIT = /usr/local/vitasdk/ +CROSS_COMPILE=$(DEVKIT)bin/arm-vita-eabi- + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +STRIP = $(CROSS_COMPILE)strip +SYSROOT := $(shell $(CROSS_COMPILE)gcc --print-sysroot) +SDL_CFLAGS := $(shell $(SYSROOT)/bin/sdl2-config --cflags) +SDL_LIBS := $(shell $(SYSROOT)/bin/sdl2-config --libs) + +INCLUDES = -Iinclude $(SDL_CFLAGS) -I$(PWD)/../sources +OPT_FLAGS = -O3 -g -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -ftree-vectorize -ffast-math -fsigned-char -fno-optimize-sibling-calls -fno-rtti + +TOOLPATH=$(DEVKIT)/bin +PREFIX := arm-bita-eabi- + +CFLAGS := $(DEFINES) $(INCLUDES) $(SDL_CFLAGS) $(OPT_FLAGS) +CXXFLAGS:= $(CFLAGS) -std=gnu++03 +LIBS := -lSDL_mixer $(SDL_LIBS) +LDFLAGS := $(LDFLAGS) -Wl,-q -Wl,-z,nocopyreloc +LIBDIRS := $(DEKVIT)/lib +LIBDIRS += $(DEKVIT)/arm-vita-eabi/lib +OUTPUT = ../lgpt-vita +EXTENSION:= vpk + +#--------------------------------------------------------------------------------- +%.vpk: %.bin %.sfo + vita-make-fself $< $@ + vita-pack-vpk -s ../lgpt-vita.sfo -b $< \ + --add ../resources/VITA/sce_sys=sce_sys \ + $@ + @echo built ... $(notdir $@) + +#--------------------------------------------------------------------------------- +%.sfo: + vita-mksfoex -s TITLE_ID="LGPT00001" "Piggy Tracker" $@ + +#--------------------------------------------------------------------------------- +%.bin: %.velf + vita-make-fself $< $@ + @echo built ... $(notdir $@) + +#--------------------------------------------------------------------------------- +%.velf: %.elf + vita-elf-create -s $< $@ + @echo built ... $(notdir $@) + +#--------------------------------------------------------------------------------- + +%.elf: $(OFILES) + $(CXX) $(LDFLAGS) -o $@ $(OFILES) $(LIBS) \ No newline at end of file diff --git a/projects/resources/VITA/INSTALL_HOW_TO.txt b/projects/resources/VITA/INSTALL_HOW_TO.txt new file mode 100644 index 00000000..8f1283bb --- /dev/null +++ b/projects/resources/VITA/INSTALL_HOW_TO.txt @@ -0,0 +1,5 @@ +Install vpk via vitashell + +Data/configs reside in ux0:/data/lgpt/ + +Enjoy! \ No newline at end of file diff --git a/projects/resources/VITA/config.xml b/projects/resources/VITA/config.xml new file mode 100644 index 00000000..35c18569 --- /dev/null +++ b/projects/resources/VITA/config.xml @@ -0,0 +1,21 @@ + + > + + + + + + + + + + + + + + + + + + + diff --git a/projects/resources/VITA/mapping.xml b/projects/resources/VITA/mapping.xml new file mode 100644 index 00000000..c0604f7b --- /dev/null +++ b/projects/resources/VITA/mapping.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + diff --git a/projects/resources/VITA/sce_sys/icon0.png b/projects/resources/VITA/sce_sys/icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..927c4b700756829d67ad46f01f59fe01bfaaeda1 GIT binary patch literal 7444 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 literal 0 HcmV?d00001 diff --git a/projects/resources/VITA/sce_sys/livearea/contents/startup.png b/projects/resources/VITA/sce_sys/livearea/contents/startup.png new file mode 100644 index 0000000000000000000000000000000000000000..67c19e417c97c9bd2d2efb9e0b9d0cc64bfda9c4 GIT binary patch literal 4104 zcmeHKd2AF_7@t}wZJ~mw$SLEtC>gv6(vvQ9>C&#aC=}*+yB)f_v(8Mr+e$z# z2}yxAP{UC~{%AeW0s_%U!XbwwQVjwX5E{`C(m)|#I2tkfX10_zkeDX&Unkj_cl^HJ z`@Y}%-j{u=-7}}9B#%x;5G2J}kXwu(aU)^-qqunZKHawJ0Q?N_XSuQvWcRwk54eG_ zAEy>i%SM`i9NP{%N#TMyDuN7tUjM}*n;W2cN>uWAHLt6X7383q6J;KlqroslBS=PO zG|UO*Ktp-pmqHHH&HV>Ws3bZ}Z>75kS2zchNd?skD5;+55vt1tyJ*UslAIA`Awdvm z92yMR|!eF9D1UK>Zu9?ycno* zg(85wN)Xagds2u(w|%%m2^iss0uBNo2%#!mmF%_TG^fkmZJ|rxmx5u#3X0tesY$*^ zV)gP(pE1Je=?FCM=Iw=k7`p+6D3^=Pm4yo3J!h`Nq_5A4vLK19(c}c)YG*7IX0qxf`!OXmrJWdpe*QhQTO`w_uD_uwr(R1Q-bjiniEAn?)cD zDp6qbWhKbL?UaI?AK>AT-G$Xd< z1(FKauQG;WC#nRz8|%fo0m(Q@C~6!EmJ?zjs9Yrw4L>1QY)UBOLVf_NM_0N&9G9My z3JgWtctONO8}MNaO%j-mpa4cQBEti_h4J~Q-t4OE(;}P#viwj-s1;04Lo0Nmu~CzH zqa$TN-vuZbMv~a$g5g~O<9f|_7;y&vm?jwpphuB`cCj&7ykITFyNh9$W_sCqici;G zJjE3tb^juL(zjo(e!2RjK%c<<+0`#spA_g5xIer8H@T7@U8g_@{tJr0%Mv-i{yMy9 z9jk_SuwpKPh85W-1punS%L59ck`Fd&{!^Rv(6qsFDYw{6_YTCpgc$c&#{zwlbsir`FwTU=Iq zVPD7iCCBdG9r#aO!~R`qy9#b4h+`*61%z#N&8qvOUmoRMnKNW?=hvSkRma=@o>MgA zx4a}6P=dSAlLx<58;-OOvJ8OtP>VA+%i}%L@yqVv%h4f-J0l@~%Hd2hv$bSO%a;f1 zN|ziubvQL|dPmyj=8f0(`M9e1q@|x0`x|cU&r+Ap8L;N+imj{jTQ`=!xX0TzY~J~! z-+hQ@zk1z2c7!?7SW`Rajg!NCu0VDwA7I#DeXYkDUt;2K=MNrf^3QI(SF|tb_}b2+ zZB08wB$K*)W`gUB?ayqZCw)6TVeZnbwle1*ReQE9O3zt~*H$dz&lX0hmJ@T|oRzb) zZpS1#Qd*R-Xr=R>=XhX#8gZ*>>+Sg0Emy{mx&Lg5Qo2PNkmAlN?KpM(K+2@M`^s0G zWM@sUSvb`C=N`+6&80Iok5TTl-x+uBFZa(GuhGLUFJ9Lo5uJrQM{I05bgt!ndDHB( ziP3MI%SW}=lk=voU*ROLEUx|lsqI`>&-fc=SzjI)@0oh$l`~CHOT?KsGq*W=!Lok= DZj7qA literal 0 HcmV?d00001 diff --git a/projects/resources/VITA/sce_sys/livearea/contents/template.xml b/projects/resources/VITA/sce_sys/livearea/contents/template.xml new file mode 100644 index 00000000..a4d43f01 --- /dev/null +++ b/projects/resources/VITA/sce_sys/livearea/contents/template.xml @@ -0,0 +1,11 @@ + + + + + bg.png + + + + startup.png + + diff --git a/sources/Adapters/SDL2/GUI/SDLGUIWindowImp.cpp b/sources/Adapters/SDL2/GUI/SDLGUIWindowImp.cpp index 7f4eb05a..3a41baa0 100644 --- a/sources/Adapters/SDL2/GUI/SDLGUIWindowImp.cpp +++ b/sources/Adapters/SDL2/GUI/SDLGUIWindowImp.cpp @@ -44,6 +44,11 @@ SDLGUIWindowImp::SDLGUIWindowImp(GUICreateWindowParams &p) int screenWidth = 480; int screenHeight = 272; windowed_ = false; + #elif defined(PLATFORM_VITA) + int screenWidth = 960; + int screenHeight = 544; + windowed_ = false; + mult_ = 2; #elif defined(RS97) int screenWidth = 320; int screenHeight = 240; @@ -78,8 +83,10 @@ SDLGUIWindowImp::SDLGUIWindowImp(GUICreateWindowParams &p) windowed_ = false; } - #ifdef PLATFORM_PSP + #if defined(PLATFORM_PSP) mult_ = 1; + #elif defined(PLATFORM_VITA) + mult_ = 2; #else int multFromSize=MIN(screenHeight/appHeight,screenWidth/appWidth); const char *mult=Config::GetInstance()->GetValue("SCREENMULT") ; diff --git a/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp b/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp new file mode 100644 index 00000000..5b12f66e --- /dev/null +++ b/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp @@ -0,0 +1,179 @@ + +#include "VITAFileSystem.h" +#include "System/Console/Trace.h" +#include +#include +#include +#include + +#include +#include + +VITAFile::VITAFile(SceUID file) { + file_=file ; + writeBufferPos_=0 ; +} + +VITAFile::~VITAFile() { +} + +int VITAFile::Read(void *ptr,int size, int nmemb) { + return sceIoRead(file_,ptr,size*nmemb); +} + +void VITAFile::flush() { + if (writeBufferPos_>0) { + sceIoWrite(file_,writeBuffer_,writeBufferPos_); + } + writeBufferPos_=0 ; +} + +int VITAFile::Write(const void *ptr,int size, int nmemb) { + int len=size*nmemb ; + if (writeBufferPos_+len>WRITE_BUFFER_SIZE) { + flush() ; + } + if (len>WRITE_BUFFER_SIZE) { + sceIoWrite(file_,ptr,len); + } else { + memcpy(writeBuffer_+writeBufferPos_,ptr,len) ; + writeBufferPos_+=len ; + } + return len ; +} + +void VITAFile::Printf(const char *fmt, ...) { + char buffer[1024] ; + va_list args; + va_start(args,fmt); + + vsprintf(buffer,fmt,args ); + Write(buffer,strlen(buffer),1) ; + va_end(args); +} + +void VITAFile::Seek(long offset,int whence) { + sceIoLseek(file_,offset,whence); +} + +long VITAFile::Tell() { + return sceIoLseek(file_,0,SEEK_CUR); +} + +void VITAFile::Close() { + flush() ; + sceIoClose(file_) ; +} +// + +VITADir::VITADir(const char *path):I_Dir(path) { +} + +void VITADir::GetContent(char *mask) { + + Empty() ; + + SceIoDirent de; + memset(&de,0,sizeof(SceIoDirent)); + + SceUID fd=sceIoDopen(path_); + if(fd<0) { + Trace::Error("Failed to open %s",path_); + return; + } + + SceUID v=sceIoDread(fd,&de); + char nameBuffer[256] ; + + while(v!=0) { + + // See if matches current mask + int len=strlen(de.d_name) ; + for (int i=0;i0) { + vitaFile=new VITAFile(file) ; + } + return vitaFile ; +} + +FileType VITAFileSystem::GetFileType(const char *path) { + + struct stat attributes ; + if (stat(path,&attributes)==0) + { + if (attributes.st_mode&S_IFDIR) return FT_DIR ; + if (attributes.st_mode&S_IFREG) return FT_FILE ; + } + else + { + if (!strcmp("ux0:", path)) + { + return FT_DIR; + } + + } + + return FT_UNKNOWN ; + +} + +void VITAFileSystem::Delete(const char *path) { + sceIoRemove(path); +} + +Result VITAFileSystem::MakeDir(const char *path) { + int retval = sceIoMkdir(path,0777); + if (retval != 0) + { + std::ostringstream oss ; + oss << "MakeDir failed with code " << retval; + return Result(oss.str()); + } + return Result::NoError; +} \ No newline at end of file diff --git a/sources/Adapters/VITA/FileSystem/VITAFileSystem.h b/sources/Adapters/VITA/FileSystem/VITAFileSystem.h new file mode 100644 index 00000000..f77b4ec0 --- /dev/null +++ b/sources/Adapters/VITA/FileSystem/VITAFileSystem.h @@ -0,0 +1,46 @@ + +#ifndef _VITA_FILESYSTEM_H_ +#define _VITA_FILESYSTEM_H_ + +#include "System/FileSystem/FileSystem.h" +#include +#include +#include + +#define WRITE_BUFFER_SIZE 1024 + +class VITAFile: public I_File { +public: + VITAFile(SceUID) ; + virtual ~VITAFile() ; + virtual int Read(void *ptr, int size, int nmemb) ; + virtual int Write(const void *ptr, int size, int nmemb) ; + virtual void Printf(const char *format,...); + virtual void Seek(long offset,int whence) ; + virtual long Tell() ; + virtual void Close() ; +protected: + void flush() ; +private: + SceUID file_ ; + unsigned char writeBuffer_[WRITE_BUFFER_SIZE] ; + int writeBufferPos_ ; + +} ; + +class VITADir: public I_Dir { +public: + VITADir(const char *path) ; + virtual ~VITADir() {} ; + virtual void GetContent(char *mask) ; +} ; + +class VITAFileSystem: public FileSystem { +public: + virtual I_File *Open(const char *path,char *mode); + virtual I_Dir *Open(const char *path) ; + virtual FileType GetFileType(const char *path) ; + virtual Result MakeDir(const char *path) ; + virtual void Delete(const char *path) ; +} ; +#endif diff --git a/sources/Adapters/VITA/Main/VITAmain.cpp b/sources/Adapters/VITA/Main/VITAmain.cpp new file mode 100644 index 00000000..b3f82169 --- /dev/null +++ b/sources/Adapters/VITA/Main/VITAmain.cpp @@ -0,0 +1,30 @@ +#include "Application/Application.h" +#include "Adapters/VITA/System/VITASystem.h" +#include "Foundation/T_Singleton.h" +#include +#include +#include "Adapters/SDL2/GUI/SDLGUIWindowImp.h" +#include "Application/Persistency/PersistencyService.h" +#include "Adapters/SDL2/GUI/SDLGUIWindowImp.h" + +#include + +/* Define printf, just to make typing easier */ +#define printf sceClibPrintf + +int _newlib_heap_size_user = 100*1024*1024; + +int main(int argc,char *argv[]) +{ + VITASystem::Boot(argc,argv) ; + + SDLCreateWindowParams params ; + params.title="littlegptracker" ; + params.cacheFonts_=false ; + params.framebuffer_=false ; + Application::GetInstance()->Init(params) ; + VITASystem::MainLoop() ; + VITASystem::Shutdown() ; + return 0 ; +} + diff --git a/sources/Adapters/VITA/System/VITASystem.cpp b/sources/Adapters/VITA/System/VITASystem.cpp new file mode 100644 index 00000000..31d49f32 --- /dev/null +++ b/sources/Adapters/VITA/System/VITASystem.cpp @@ -0,0 +1,144 @@ + +#include "VITASystem.h" +#include "Adapters/Dummy/Midi/DummyMidi.h" +#include "Adapters/SDL2/Audio/SDLAudio.h" +#include "Adapters/SDL2/GUI/SDLEventManager.h" +#include "Adapters/SDL2/GUI/GUIFactory.h" +#include "Adapters/SDL2/GUI/SDLGUIWindowImp.h" +#include "Adapters/SDL2/Process/SDLProcess.h" +#include "Adapters/VITA/FileSystem/VITAFileSystem.h" +#include "Adapters/SDL2/Timer/SDLTimer.h" +#include "Application/Model/Config.h" +#include "System/Console/Logger.h" +#include +#include +#include +#include + +#include + +EventManager *VITASystem::eventManager_ = NULL ; + +int VITASystem::MainLoop() +{ + eventManager_->InstallMappings() ; + return eventManager_->MainLoop() ; +} ; + +void VITASystem::Boot(int argc,char **argv) { + // Install System + System::Install(new VITASystem()) ; + + // Install FileSystem + FileSystem::Install(new VITAFileSystem()) ; + FileSystem::GetInstance()->MakeDir("ux0:/data/lgpt/"); + + Path::SetAlias("bin","ux0:/data/lgpt/") ; + Path::SetAlias("root","ux0:/data/lgpt/") ; + + Config::GetInstance()->ProcessArguments(argc,argv) ; + + Path logPath("bin:lgpt.log"); + FileLogger *fileLogger=new FileLogger(logPath); + + if(fileLogger->Init().Succeeded()) + { + Trace::GetInstance()->SetLogger(*fileLogger); + } + + // Install GUI Factory + I_GUIWindowFactory::Install(new GUIFactory()) ; + + // Install Timers + TimerService::GetInstance()->Install(new SDLTimerService()) ; + + // Install Sound + AudioSettings hints ; + hints.bufferSize_ = 1024 ; + hints.preBufferCount_ = 8 ; + Audio::Install(new SDLAudio(hints)) ; + + // Install Midi + MidiService::Install(new DummyMidi()) ; + + // Install Threads + + SysProcessFactory::Install(new SDLProcessFactory()) ; + + if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK|SDL_INIT_TIMER) < 0 ) { + return; + } +#ifndef SDL2 + SDL_EnableUNICODE(1); +#endif + SDL_ShowCursor(SDL_DISABLE); + + atexit(SDL_Quit); + + eventManager_=I_GUIWindowFactory::GetInstance()->GetEventManager() ; + eventManager_->Init() ; + + // VITA SDL Basic config + + bool invert=false ; + Config *config=Config::GetInstance() ; + const char *s=config->GetValue("INVERT") ; + + if ((s)&&(!strcmp(s,"YES"))) { + invert=true ; + } + + if (!invert) { + eventManager_->MapAppButton("but:0:1",APP_BUTTON_B) ; + eventManager_->MapAppButton("but:0:2",APP_BUTTON_A) ; + }else { + eventManager_->MapAppButton("but:0:1",APP_BUTTON_A) ; + eventManager_->MapAppButton("but:0:2",APP_BUTTON_B) ; + } + eventManager_->MapAppButton("but:0:7",APP_BUTTON_LEFT) ; + eventManager_->MapAppButton("but:0:9",APP_BUTTON_RIGHT) ; + eventManager_->MapAppButton("but:0:8",APP_BUTTON_UP) ; + eventManager_->MapAppButton("but:0:6",APP_BUTTON_DOWN) ; + eventManager_->MapAppButton("but:0:4",APP_BUTTON_L) ; + eventManager_->MapAppButton("but:0:5",APP_BUTTON_R) ; + eventManager_->MapAppButton("but:0:11",APP_BUTTON_START) ; +} ; + +void VITASystem::Shutdown() { +} ; + +unsigned long VITASystem::GetClock() { + struct timeval now; + Uint32 ticks; + gettimeofday(&now, NULL); + ticks=(now.tv_sec)*1000+(now.tv_usec)/1000; + return(ticks); +} + +void VITASystem::Sleep(int millisec) { +} + +void *VITASystem::Malloc(unsigned size) { + return malloc(size) ; +} + +void VITASystem::Free(void *ptr) { + free(ptr) ; +} + +void VITASystem::Memset(void *addr,char val,int size) { + memset(addr,val,size) ; +} ; + +void *VITASystem::Memcpy(void *s1, const void *s2, int n) { + return memcpy(s1,s2,n) ; +} ; + +void VITASystem::PostQuitMessage() { + SDLEventManager::GetInstance()->PostQuitMessage() ; +} ; + +unsigned int VITASystem::GetMemoryUsage() { + struct mallinfo m=mallinfo(); + return m.uordblks ; +} \ No newline at end of file diff --git a/sources/Adapters/VITA/System/VITASystem.h b/sources/Adapters/VITA/System/VITASystem.h new file mode 100644 index 00000000..eb50500a --- /dev/null +++ b/sources/Adapters/VITA/System/VITASystem.h @@ -0,0 +1,30 @@ +#ifndef _VITA_SYSTEM_H_ +#define _VITA_SYSTEM_H_ + +#include "System/System/System.h" +#include "UIFramework/SimpleBaseClasses/EventManager.h" + +class VITASystem: public System { +public: + static void Boot(int argc,char **argv) ; + static void Shutdown() ; + static int MainLoop() ; + +public: // System implementation + virtual unsigned long GetClock() ; + virtual void Sleep(int millisec); + virtual void *Malloc(unsigned size) ; + virtual void Free(void *) ; + virtual void Memset(void *addr,char val,int size) ; + virtual void *Memcpy(void *s1, const void *s2, int n) ; + virtual int GetBatteryLevel() { return -1 ; } ; + virtual void PostQuitMessage() ; + virtual unsigned int GetMemoryUsage() ; + + static bool finished_ ; +private: + static std::string eboot_ ; + static EventManager *eventManager_; + +} ; +#endif diff --git a/sources/Application/FX/FxPrinter.cpp b/sources/Application/FX/FxPrinter.cpp index 3c4a442a..1b121df3 100644 --- a/sources/Application/FX/FxPrinter.cpp +++ b/sources/Application/FX/FxPrinter.cpp @@ -67,6 +67,8 @@ bool FxPrinter::Run() { bool imported = SamplePool::GetInstance()->IsImported(foWav_); std::string cmd = parseCommand(); Trace::Log("Processed", cmd.c_str()); + +#if !defined(PLATFORM_VITA) if (system(cmd.c_str()) == 0) { int newIndex = SamplePool::GetInstance()->Reassign(foWav_, imported); instrument_->AssignSample(newIndex); @@ -77,4 +79,7 @@ bool FxPrinter::Run() { notificationResult_ = "Failed, check lgpt.log"; return false; } +#else + return false; +#endif } From 71f492c6a3c4e30b855dfc37e57bea9b18355e18 Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Sun, 3 Nov 2024 23:22:44 +0300 Subject: [PATCH 3/7] Update readme's --- README.md | 1 + projects/README.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index a199ef6e..231f484b 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Recommended reading to get you started: | GARLICPLUS | MAYBE | NO | YES | Port by [Simotek](http://simotek.net)| | RG35XXPLUS | MAYBE | NO | YES | Port by [Simotek](http://simotek.net)| | MACOS | YES | YES | NO | Port by [clsource](https://genserver.social/clsource) | +| VITA | NO | NO | YES | | * **Soundfont library is currently not ported for 64bit OS** diff --git a/projects/README.md b/projects/README.md index 03e885ac..e0ff96c2 100644 --- a/projects/README.md +++ b/projects/README.md @@ -110,3 +110,9 @@ From repo root: cp pre-commit ./git/hooks tar -xf rg35xx-plus-aarch64-SDL2-SDK-0.1.0.tar.xz Build with: make PLATFORM=RG35XXPLUS + +##### VITA: Compile under linux/WSL2 + Install vitasdk: + https://vitasdk.org/ + Build with: + make PLATFORM=VITA From bba58f3d768d4aa49e40c77e25670cd69d9b3b12 Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Mon, 4 Nov 2024 10:57:34 +0300 Subject: [PATCH 4/7] Update readme and workflows --- .github/workflows/build.yml | 37 ++++++++++++++++++++ .github/workflows/check.yml | 31 ++++++++++++++++ projects/resources/VITA/INSTALL_HOW_TO.txt | 4 +-- projects/resources/packaging/lgpt_package.sh | 1 + 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a6b58e1..3d8f0808 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -460,3 +460,40 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} tag_name: ${{ steps.extract_tag.outputs.tag_name }} files: projects/*.zip + + build-vita: + runs-on: ubuntu-latest + container: vitasdk/vitasdk:latest + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Install required libraries + run: | + apk add git zip unzip grep py3-pillow + + - name: Build VITA + working-directory: projects + run: make PLATFORM=VITA + + - name: Package build + working-directory: projects + run: | + curl -L -o lgpt-resources.zip https://github.com/djdiskmachine/lgpt-resources/archive/refs/tags/1.1.zip + unzip lgpt-resources.zip + mv lgpt-resources-1.1/*/ ./resources/packaging + rm -rf lgpt-resources* + ./resources/packaging/lgpt_package.sh + + - name: Extract Git tag name + id: extract_tag + run: echo "::set-output name=tag_name::${GITHUB_REF#refs/tags/}" + env: + GITHUB_REF: ${{ github.ref }} + + - name: Upload build release + uses: softprops/action-gh-release@v2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + tag_name: ${{ steps.extract_tag.outputs.tag_name }} + files: ./projects/*.zip diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 41899ad3..df5b7cb2 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -444,3 +444,34 @@ jobs: name: LGPT-${{ github.job }}-${{ github.sha }}.zip path: projects/*.zip if-no-files-found: error + + vita: + runs-on: ubuntu-latest + container: vitasdk/vitasdk:latest + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Install required libraries + run: | + apk add git zip unzip grep py3-pillow + + - name: Build VITA + working-directory: projects + run: make PLATFORM=VITA + + - name: Package build + working-directory: projects + run: | + curl -L -o lgpt-resources.zip https://github.com/djdiskmachine/lgpt-resources/archive/refs/tags/1.1.zip + unzip lgpt-resources.zip + mv lgpt-resources-1.1/*/ ./resources/packaging + rm -rf lgpt-resources* + ./resources/packaging/lgpt_package.sh + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: LGPT-${{ github.job }}-${{ github.sha }}.zip + path: projects/*.zip + if-no-files-found: error diff --git a/projects/resources/VITA/INSTALL_HOW_TO.txt b/projects/resources/VITA/INSTALL_HOW_TO.txt index 8f1283bb..ebd66248 100644 --- a/projects/resources/VITA/INSTALL_HOW_TO.txt +++ b/projects/resources/VITA/INSTALL_HOW_TO.txt @@ -1,5 +1,5 @@ -Install vpk via vitashell +Install bin/lgpt-vita.vpk via vitashell -Data/configs reside in ux0:/data/lgpt/ +Copy samplelib, and optionally demo track (lgpt_BETA) and bin/*.xml configs to ux0:/data/lgpt/ Enjoy! \ No newline at end of file diff --git a/projects/resources/packaging/lgpt_package.sh b/projects/resources/packaging/lgpt_package.sh index 03f9ea21..0c3d42f0 100755 --- a/projects/resources/packaging/lgpt_package.sh +++ b/projects/resources/packaging/lgpt_package.sh @@ -60,3 +60,4 @@ collect_resources RG35XXPLUS lgpt-rg35xxplus.elf collect_resources MACOS LittleGPTracker.app # collect_resources RS97 lgpt.dge # collect_resources STEAM lgpt.steam-exe +collect_resources VITA lgpt-vita.vpk From e0199a66d8201d9b50c17c0897dd6cdba0b3f78d Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Tue, 5 Nov 2024 10:32:28 +0300 Subject: [PATCH 5/7] VITA: implement battery level --- sources/Adapters/VITA/System/VITASystem.cpp | 12 +++++++++++- sources/Adapters/VITA/System/VITASystem.h | 9 ++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sources/Adapters/VITA/System/VITASystem.cpp b/sources/Adapters/VITA/System/VITASystem.cpp index 31d49f32..2f6c7167 100644 --- a/sources/Adapters/VITA/System/VITASystem.cpp +++ b/sources/Adapters/VITA/System/VITASystem.cpp @@ -16,6 +16,8 @@ #include #include +#include +#include EventManager *VITASystem::eventManager_ = NULL ; @@ -141,4 +143,12 @@ void VITASystem::PostQuitMessage() { unsigned int VITASystem::GetMemoryUsage() { struct mallinfo m=mallinfo(); return m.uordblks ; -} \ No newline at end of file +} + +int VITASystem::GetBatteryLevel() { + if (sceKernelGetModel() == SCE_KERNEL_MODEL_VITA) + { + return scePowerGetBatteryLifePercent() ; + } + return -1 ; +} ; diff --git a/sources/Adapters/VITA/System/VITASystem.h b/sources/Adapters/VITA/System/VITASystem.h index eb50500a..d6371bae 100644 --- a/sources/Adapters/VITA/System/VITASystem.h +++ b/sources/Adapters/VITA/System/VITASystem.h @@ -15,16 +15,15 @@ class VITASystem: public System { virtual void Sleep(int millisec); virtual void *Malloc(unsigned size) ; virtual void Free(void *) ; - virtual void Memset(void *addr,char val,int size) ; - virtual void *Memcpy(void *s1, const void *s2, int n) ; - virtual int GetBatteryLevel() { return -1 ; } ; + virtual void Memset(void *addr,char val,int size) ; + virtual void *Memcpy(void *s1, const void *s2, int n) ; + virtual int GetBatteryLevel() ; virtual void PostQuitMessage() ; virtual unsigned int GetMemoryUsage() ; static bool finished_ ; private: - static std::string eboot_ ; - static EventManager *eventManager_; + static EventManager *eventManager_; } ; #endif From d53ab97e5c0e4e068128966d39f71dd3fed61166 Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Thu, 7 Nov 2024 21:50:05 +0300 Subject: [PATCH 6/7] VITA: fix filesystem --- .../VITA/FileSystem/VITAFileSystem.cpp | 36 +++++++++---------- sources/Adapters/VITA/System/VITASystem.cpp | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp b/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp index 5b12f66e..2b0b1e2e 100644 --- a/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp +++ b/sources/Adapters/VITA/FileSystem/VITAFileSystem.cpp @@ -73,16 +73,27 @@ void VITADir::GetContent(char *mask) { Empty() ; - SceIoDirent de; - memset(&de,0,sizeof(SceIoDirent)); + SceIoDirent de; + memset(&de,0,sizeof(SceIoDirent)); - SceUID fd=sceIoDopen(path_); - if(fd<0) { - Trace::Error("Failed to open %s",path_); + SceUID fd=sceIoDopen(path_); + if(fd<0) { + Trace::Error("Failed to open %s",path_); return; } - - SceUID v=sceIoDread(fd,&de); + + if (!(strcmp(path_, "ux0:/data/lgpt") == 0 || strcmp(path_, "ux0:/data/lgpt/") == 0)) { + std::string fullpath=path_ ; + if (path_[strlen(path_)-1]!='/') { + fullpath+="/" ; + } + fullpath+=".." ; + + Path *path=new Path(fullpath.c_str()) ; + Insert(path) ; + } + + SceUID v=sceIoDread(fd,&de); char nameBuffer[256] ; while(v!=0) { @@ -93,7 +104,6 @@ void VITADir::GetContent(char *mask) { nameBuffer[i]=tolower(de.d_name[i]) ; } nameBuffer[len]=0 ; - if (wildcardfit(mask,nameBuffer)) { std::string fullpath=path_ ; @@ -106,7 +116,6 @@ void VITADir::GetContent(char *mask) { Insert(path) ; } -// sceIoClose(v) ; v=sceIoDread(fd,&de); } @@ -150,15 +159,6 @@ FileType VITAFileSystem::GetFileType(const char *path) { if (attributes.st_mode&S_IFDIR) return FT_DIR ; if (attributes.st_mode&S_IFREG) return FT_FILE ; } - else - { - if (!strcmp("ux0:", path)) - { - return FT_DIR; - } - - } - return FT_UNKNOWN ; } diff --git a/sources/Adapters/VITA/System/VITASystem.cpp b/sources/Adapters/VITA/System/VITASystem.cpp index 2f6c7167..633185ed 100644 --- a/sources/Adapters/VITA/System/VITASystem.cpp +++ b/sources/Adapters/VITA/System/VITASystem.cpp @@ -35,8 +35,8 @@ void VITASystem::Boot(int argc,char **argv) { FileSystem::Install(new VITAFileSystem()) ; FileSystem::GetInstance()->MakeDir("ux0:/data/lgpt/"); - Path::SetAlias("bin","ux0:/data/lgpt/") ; - Path::SetAlias("root","ux0:/data/lgpt/") ; + Path::SetAlias("bin","ux0:/data/lgpt") ; + Path::SetAlias("root","ux0:/data/lgpt") ; Config::GetInstance()->ProcessArguments(argc,argv) ; From 5f70baa28f90f289ab8101047b75456ee3e10601 Mon Sep 17 00:00:00 2001 From: Ivan Epifanov Date: Sun, 10 Nov 2024 23:47:09 +0300 Subject: [PATCH 7/7] VITA: update artwork --- projects/resources/VITA/sce_sys/icon0.png | Bin 7444 -> 5113 bytes .../VITA/sce_sys/livearea/contents/bg.png | Bin 3864 -> 8363 bytes .../sce_sys/livearea/contents/startup.png | Bin 4104 -> 9195 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/projects/resources/VITA/sce_sys/icon0.png b/projects/resources/VITA/sce_sys/icon0.png index 927c4b700756829d67ad46f01f59fe01bfaaeda1..3eae2018ef29b85bb33395b96c3ce966f3d9c809 100644 GIT binary patch literal 5113 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 delta 589 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