package org.geogebra.common.kernel.scripting;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.commands.CmdScripting;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoFunction;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.MyError;
import org.geogebra.common.plugin.SensorLogger;
/**
* Command for logging
*/
public class CmdStartLogging extends CmdScripting {
/**
* @param kernel
* kernel
*/
public CmdStartLogging(Kernel kernel) {
super(kernel);
}
@Override
protected GeoElement[] perform(Command c) {
int n = c.getArgumentNumber();
// ignore last parameter if odd
// n = (n / 2) * 2;
GeoElement[] arg = resArgs(c);
boolean success = false;
SensorLogger logger = app.getSensorLogger();
if (logger != null) {
logger.stopLogging();
GeoElement argument = null;
GeoElement limit = null;
int offset = 0;
if (arg[0] instanceof GeoNumberValue) {
logger.setLimit(((GeoNumberValue) arg[1]).getDouble());
offset++;
} else {
logger.setLimit(SensorLogger.DEFAULT_LIMIT);
}
for (int i = offset; i <= n - 2; i += 2) {
argument = arg[i + 1];
if (!(arg[i] instanceof GeoText)) {
throw argErr(app, c, arg[i]);
}
String varName = ((GeoText) arg[i]).getTextString();
if (argument instanceof GeoNumeric
|| argument instanceof GeoText) {
logger.registerGeo(varName, argument);
} else if (argument instanceof GeoList) {
// it should be possible to add an optional third parameter
// to lists - size limit of logging
if ((i < n - 2)
&& (limit = arg[i + 2]) instanceof GeoNumeric) {
logger.registerGeoList(varName, (GeoList) argument,
((GeoNumeric) limit).getValue());
i++;
} else {
logger.registerGeoList(varName, (GeoList) argument);
}
} else if (argument instanceof GeoFunction) {
// it should be possible to add an optional third parameter
// to lists - size limit of logging
if ((i < n - 2)
&& (limit = arg[i + 2]) instanceof GeoNumeric) {
logger.registerGeoFunction(varName,
(GeoFunction) argument,
((GeoNumeric) limit).getValue());
i++;
} else {
logger.registerGeoFunction(varName,
(GeoFunction) argument);
}
} else {
throw argErr(app, c, argument);
}
if (!argument.isLabelSet()) {
argument.setLabel(varName);
}
}
success = logger.startLogging();
}
if (!success) {
throw new MyError(loc, loc.getError("NoLogging"));
}
return arg;
}
}