/*
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.format.rco.vsmx.objects;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import jpcsp.HLE.kernel.types.IAction;
import jpcsp.format.rco.vsmx.VSMX;
import jpcsp.format.rco.vsmx.interpreter.VSMXArray;
import jpcsp.format.rco.vsmx.interpreter.VSMXBaseObject;
import jpcsp.format.rco.vsmx.interpreter.VSMXFunction;
import jpcsp.format.rco.vsmx.interpreter.VSMXInterpreter;
import jpcsp.format.rco.vsmx.interpreter.VSMXNativeObject;
import jpcsp.format.rco.vsmx.interpreter.VSMXNumber;
import jpcsp.scheduler.Scheduler;
public class Timer extends BaseNativeObject {
private static final Logger log = VSMX.log;
private int currentTimerId = 0;
private VSMXInterpreter interpreter;
private Map<Integer, TimerAction> timers;
private class TimerAction implements IAction {
private int id;
private VSMXBaseObject object;
private VSMXBaseObject function;
private VSMXBaseObject[] parameters;
public TimerAction(int id, VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject[] parameters) {
this.id = id;
this.object = object;
this.function = function;
this.parameters = parameters;
}
@Override
public void execute() {
onTimer(id, object, function, parameters);
}
}
public static VSMXNativeObject create(VSMXInterpreter interpreter) {
Timer timer = new Timer(interpreter);
VSMXNativeObject object = new VSMXNativeObject(interpreter, timer);
timer.setObject(object);
return object;
}
private Timer(VSMXInterpreter interpreter) {
this.interpreter = interpreter;
timers = new HashMap<Integer, Timer.TimerAction>();
}
private void onTimer(int id, VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject[] parameters) {
if (log.isDebugEnabled()) {
log.debug(String.format("Timer.onTimer id=%d, object=%s, function=%s, parameters=%s", id, object, function, parameters));
}
if (function instanceof VSMXFunction) {
interpreter.interpretFunction((VSMXFunction) function, object, parameters);
}
}
private VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject... parameters) {
if (log.isDebugEnabled()) {
log.debug(String.format("Timer.setInterval function=%s, interval=%d, numberOfParameters=%d", function, interval.getIntValue(), parameters.length));
for (int i = 0; i < parameters.length; i++) {
log.debug(String.format("Timer.setInterval param%d=%s", i, parameters[i]));
}
}
int id = currentTimerId++;
long schedule = Scheduler.getNow() + interval.getIntValue() * 1000;
TimerAction timerAction = new TimerAction(id, object, function, parameters);
timers.put(id, timerAction);
Scheduler.getInstance().addAction(schedule, timerAction);
// setInterval seems to return an array object. Not sure how to fill it.
VSMXArray result = new VSMXArray(interpreter, 1);
result.setPropertyValue(0, new VSMXNumber(interpreter, id));
return result;
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval) {
return setInterval(object, function, interval, new VSMXBaseObject[0]);
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1 });
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1, VSMXBaseObject param2) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1, param2 });
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1, VSMXBaseObject param2, VSMXBaseObject param3) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1, param2, param3 });
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1, VSMXBaseObject param2, VSMXBaseObject param3, VSMXBaseObject param4) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1, param2, param3, param4 });
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1, VSMXBaseObject param2, VSMXBaseObject param3, VSMXBaseObject param4, VSMXBaseObject param5) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1, param2, param3, param4, param5 });
}
public VSMXBaseObject setInterval(VSMXBaseObject object, VSMXBaseObject function, VSMXBaseObject interval, VSMXBaseObject param1, VSMXBaseObject param2, VSMXBaseObject param3, VSMXBaseObject param4, VSMXBaseObject param5, VSMXBaseObject param6) {
return setInterval(object, function, interval, new VSMXBaseObject[] { param1, param2, param3, param4, param5, param6 });
}
public void clearInterval(VSMXBaseObject object, VSMXBaseObject id) {
if (log.isDebugEnabled()) {
log.debug(String.format("Timer.clearInterval %d", id.getPropertyValue(0).getIntValue()));
}
}
}