/*
This file is part of jpcsp.
Jpcsp is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jpcsp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
*/
package jpcsp.HLE.modules;
import jpcsp.HLE.HLEFunction;
import jpcsp.HLE.HLEModule;
import jpcsp.HLE.HLEUnimplemented;
import jpcsp.HLE.TPointer32;
import jpcsp.HLE.Modules;
import jpcsp.HLE.kernel.types.SceKernelErrors;
import jpcsp.hardware.Audio;
import jpcsp.hardware.Battery;
import jpcsp.settings.Settings;
import org.apache.log4j.Logger;
public class sceImpose extends HLEModule {
public static Logger log = Modules.getLogger("sceImpose");
@Override
public void start() {
languageMode_language = Settings.getInstance().readInt("emu.impose.language", PSP_LANGUAGE_ENGLISH);
languageMode_button = Settings.getInstance().readInt("emu.impose.button", PSP_CONFIRM_BUTTON_CROSS);
super.start();
}
public final static int PSP_LANGUAGE_JAPANESE = 0;
public final static int PSP_LANGUAGE_ENGLISH = 1;
public final static int PSP_LANGUAGE_FRENCH = 2;
public final static int PSP_LANGUAGE_SPANISH = 3;
public final static int PSP_LANGUAGE_GERMAN = 4;
public final static int PSP_LANGUAGE_ITALIAN = 5;
public final static int PSP_LANGUAGE_DUTCH = 6;
public final static int PSP_LANGUAGE_PORTUGUESE = 7;
public final static int PSP_LANGUAGE_RUSSIAN = 8;
public final static int PSP_LANGUAGE_KOREAN = 9;
public final static int PSP_LANGUAGE_TRADITIONAL_CHINESE = 10;
public final static int PSP_LANGUAGE_SIMPLIFIED_CHINESE = 11;
private int languageMode_language;
public final static int PSP_CONFIRM_BUTTON_CIRCLE = 0;
public final static int PSP_CONFIRM_BUTTON_CROSS = 1;
private int languageMode_button;
public final static int PSP_UMD_POPUP_DISABLE = 0;
public final static int PSP_UMD_POPUP_ENABLE = 1;
private int umdPopupStatus;
private int backlightOffTime;
public static final int PSP_IMPOSE_MAIN_VOLUME = 0x1;
public static final int PSP_IMPOSE_BACKLIGHT_BRIGHTNESS = 0x2;
public static final int PSP_IMPOSE_EQUALIZER_MODE = 0x4;
public static final int PSP_IMPOSE_MUTE = 0x8;
public static final int PSP_IMPOSE_AVLS = 0x10;
public static final int PSP_IMPOSE_TIME_FORMAT = 0x20;
public static final int PSP_IMPOSE_DATE_FORMAT = 0x40;
public static final int PSP_IMPOSE_LANGUAGE = 0x80;
public static final int PSP_IMPOSE_00000100 = 0x100;
public static final int PSP_IMPOSE_BACKLIGHT_OFF_INTERVAL = 0x200;
public static final int PSP_IMPOSE_SOUND_REDUCTION = 0x400;
public static final int PSP_IMPOSE_UMD_POPUP_ENABLED = 1;
public static final int PSP_IMPOSE_UMD_POPUP_DISABLED = 0;
public static final int PSP_IMPOSE_20000000 = 0x20000000;
public static final int PSP_IMPOSE_80000001 = 0x80000001;
public static final int PSP_IMPOSE_80000002 = 0x80000002;
public static final int PSP_IMPOSE_80000003 = 0x80000003;
public static final int PSP_IMPOSE_80000004 = 0x80000004;
public static final int PSP_IMPOSE_80000005 = 0x80000005;
public static final int PSP_IMPOSE_80000006 = 0x80000006;
public static final int PSP_IMPOSE_80000007 = 0x80000007;
public static final int PSP_IMPOSE_80000008 = 0x80000008;
public static final int PSP_IMPOSE_80000009 = 0x80000009;
public static final int PSP_IMPOSE_8000000A = 0x8000000A;
public static final int PSP_IMPOSE_8000000B = 0x8000000B;
private int imposeChanges = 0;
private int impose80000004 = 0;
private int impose80000007 = 0;
private int imposeAvls = 1;
@HLEUnimplemented
@HLEFunction(nid = 0x381BD9E7, version = 150)
public int sceImposeHomeButton() {
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x5595A71A, version = 150)
public int sceImposeSetHomePopup() {
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x0F341BE4, version = 150)
public int sceImposeGetHomePopup() {
return 0;
}
@HLEFunction(nid = 0x72189C48, version = 150)
public int sceImposeSetUMDPopup(int mode) {
umdPopupStatus = mode;
return 0;
}
@HLEFunction(nid = 0xE0887BC8, version = 150)
public int sceImposeGetUMDPopup() {
return umdPopupStatus;
}
@HLEFunction(nid = 0x36AA6E91, version = 150)
public int sceImposeSetLanguageMode(int lang, int button) {
if (log.isDebugEnabled()) {
String langStr;
switch (lang) {
case PSP_LANGUAGE_JAPANESE: langStr = "JAP"; break;
case PSP_LANGUAGE_ENGLISH: langStr = "ENG"; break;
case PSP_LANGUAGE_FRENCH: langStr = "FR"; break;
case PSP_LANGUAGE_KOREAN: langStr = "KOR"; break;
default: langStr = "PSP_LANGUAGE_UNKNOWN" + lang; break;
}
log.debug(String.format("sceImposeSetLanguageMode lang=%d(%s), button=%d", lang, langStr, button));
}
languageMode_language = lang;
languageMode_button = button;
return 0;
}
@HLEFunction(nid = 0x24FD7BCF, version = 150)
public int sceImposeGetLanguageMode(TPointer32 langPtr, TPointer32 buttonPtr) {
if (log.isDebugEnabled()) {
log.debug(String.format("sceImposeGetLanguageMode langPtr=%s, buttonPtr=%s returning lang=%d, button=%d", langPtr, buttonPtr, languageMode_language, languageMode_button));
}
langPtr.setValue(languageMode_language);
buttonPtr.setValue(languageMode_button);
return 0;
}
@HLEFunction(nid = 0x8C943191, version = 150)
public int sceImposeGetBatteryIconStatus(TPointer32 chargingPtr, TPointer32 iconStatusPtr) {
int batteryPowerPercent = Battery.getCurrentPowerPercent();
// Possible values for iconStatus: 0..3
int iconStatus = Math.min(batteryPowerPercent / 25, 3);
boolean charging = Battery.isCharging();
chargingPtr.setValue(charging ? 1 : 0);
iconStatusPtr.setValue(iconStatus);
return 0;
}
@HLEFunction(nid = 0x8F6E3518, version = 150)
public int sceImposeGetBacklightOffTime() {
return backlightOffTime;
}
@HLEFunction(nid = 0x967F6D4A, version = 150)
public int sceImposeSetBacklightOffTime(int time) {
backlightOffTime = time;
return 0;
}
@HLEFunction(nid = 0x531C9778, version = 352)
public int sceImposeGetParam(int param) {
int value = 0;
switch (param) {
case PSP_IMPOSE_MAIN_VOLUME:
// Return value [0..30]?
if (Audio.isMuted()) {
value = 0;
} else {
value = 30;
}
break;
case PSP_IMPOSE_SOUND_REDUCTION:
value = 0;
break;
case PSP_IMPOSE_MUTE:
value = Audio.isMuted() ? 1 : 0;
break;
case PSP_IMPOSE_AVLS:
value = imposeAvls;
break;
case PSP_IMPOSE_BACKLIGHT_OFF_INTERVAL:
value = 0;
break;
case PSP_IMPOSE_20000000:
value = 0;
break;
case PSP_IMPOSE_80000004:
value = impose80000004;
break;
case PSP_IMPOSE_80000007:
value = impose80000007;
break;
case PSP_IMPOSE_BACKLIGHT_BRIGHTNESS:
case PSP_IMPOSE_EQUALIZER_MODE:
case PSP_IMPOSE_TIME_FORMAT:
case PSP_IMPOSE_DATE_FORMAT:
case PSP_IMPOSE_LANGUAGE:
case PSP_IMPOSE_00000100:
case PSP_IMPOSE_80000001:
case PSP_IMPOSE_80000002:
case PSP_IMPOSE_80000003:
case PSP_IMPOSE_80000005:
case PSP_IMPOSE_80000006:
case PSP_IMPOSE_80000008:
case PSP_IMPOSE_80000009:
case PSP_IMPOSE_8000000A:
case PSP_IMPOSE_8000000B:
log.warn(String.format("sceImposeGetParam param=0x%X not implemented", param));
break;
default:
log.warn(String.format("sceImposeGetParam param=0x%X invalid parameter", param));
return SceKernelErrors.ERROR_INVALID_MODE;
}
return value;
}
@HLEFunction(nid = 0x810FB7FB, version = 352)
public int sceImposeSetParam(int param, int value) {
switch (param) {
case PSP_IMPOSE_MAIN_VOLUME:
if (value < 0 || value >= 31) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
break;
case PSP_IMPOSE_MUTE:
if (value < 0 || value > 1) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
Audio.setMuted(value != 0);
imposeChanges |= PSP_IMPOSE_MUTE | PSP_IMPOSE_MAIN_VOLUME;
break;
case PSP_IMPOSE_AVLS:
if (value < 0 || value > 1) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
imposeAvls = value;
imposeChanges |= PSP_IMPOSE_AVLS | PSP_IMPOSE_MAIN_VOLUME;
break;
case PSP_IMPOSE_TIME_FORMAT:
imposeChanges |= PSP_IMPOSE_TIME_FORMAT;
break;
case PSP_IMPOSE_DATE_FORMAT:
imposeChanges |= PSP_IMPOSE_DATE_FORMAT;
break;
case PSP_IMPOSE_LANGUAGE:
if (value < 0 || value >= 12) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
imposeChanges |= PSP_IMPOSE_LANGUAGE;
break;
case PSP_IMPOSE_00000100:
if (value < 0 || value > 1) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
imposeChanges |= PSP_IMPOSE_00000100;
break;
case PSP_IMPOSE_80000004:
if (value < 0 || value > 1) {
return SceKernelErrors.ERROR_INVALID_VALUE;
}
impose80000004 = value;
break;
case PSP_IMPOSE_80000007:
impose80000007 = value;
break;
case PSP_IMPOSE_BACKLIGHT_BRIGHTNESS:
case PSP_IMPOSE_EQUALIZER_MODE:
case PSP_IMPOSE_BACKLIGHT_OFF_INTERVAL:
case PSP_IMPOSE_SOUND_REDUCTION:
case PSP_IMPOSE_80000001:
case PSP_IMPOSE_80000002:
case PSP_IMPOSE_80000003:
case PSP_IMPOSE_80000005:
case PSP_IMPOSE_80000006:
case PSP_IMPOSE_80000008:
case PSP_IMPOSE_80000009:
case PSP_IMPOSE_8000000A:
case PSP_IMPOSE_8000000B:
log.warn(String.format("sceImposeSetParam param=0x%X, value=0x%X not implemented", param, value));
break;
default:
log.warn(String.format("sceImposeSetParam param=0x%X, value=0x%X invalid parameter", param, value));
return SceKernelErrors.ERROR_INVALID_MODE;
}
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x116DDED6, version = 150)
public int sceImposeSetVideoOutMode(int mode, int width, int height) {
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0xBB12F974, version = 150)
public int sceImposeSetStatus(int status) {
return 0;
}
@HLEFunction(nid = 0xDC3BECFF, version = 660)
public int sceImposeGetParam_660(int param) {
return sceImposeGetParam(param);
}
@HLEFunction(nid = 0x3C318569, version = 660)
public int sceImposeSetParam_660(int param, int value) {
return sceImposeSetParam(param, value);
}
@HLEFunction(nid = 0xB415FC59, version = 150)
public int sceImposeChanges() {
// Has no parameters
int result = imposeChanges;
imposeChanges = 0;
if (log.isDebugEnabled()) {
log.debug(String.format("sceImposeChanges returning 0x%X", result));
}
return result;
}
@HLEFunction(nid = 0x0F067E16, version = 660)
public int sceImposeChanges_660() {
// Has no parameters
return sceImposeChanges();
}
@HLEUnimplemented
@HLEFunction(nid = 0x9BA61B49, version = 150)
public int sceImpose_9BA61B49() {
// Possible return values: 0 or 1
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x9DBCE0C4, version = 150)
public int sceImpose_9DBCE0C4(int unknown) {
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0xBCF1D254, version = 660)
public int sceImpose_BCF1D254_660(int unknown) {
return sceImpose_9DBCE0C4(unknown);
}
@HLEUnimplemented
@HLEFunction(nid = 0xBB3F5DEC, version = 150)
public int sceImpose_BB3F5DEC(int unknown1, int unknown2, int unknown3) {
return 0;
}
}