/* SpheroDriveControllerProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.sphero.profile; import android.content.Intent; import android.util.Log; import org.deviceconnect.android.deviceplugin.sphero.BuildConfig; import org.deviceconnect.android.deviceplugin.sphero.SpheroManager; import org.deviceconnect.android.deviceplugin.sphero.data.DeviceInfo; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.DConnectProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.PostApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; /** * Controller Profile. * @author NTT DOCOMO, INC. */ public class SpheroDriveControllerProfile extends DConnectProfile { /** * プロファイル名. */ public static final String PROFILE_NAME = "driveController"; /** * アトリビュート : {@value} . */ public static final String ATTRIBUTE_MOVE = "move"; /** * アトリビュート : {@value} . */ public static final String ATTRIBUTE_STOP = "stop"; /** * アトリビュート : {@value} . */ public static final String ATTRIBUTE_ROTATE = "rotate"; /** * パラメータ: {@value} . */ public static final String PARAM_ANGLE = "angle"; /** * パラメータ: {@value} . */ public static final String PARAM_SPEED = "speed"; public SpheroDriveControllerProfile() { addApi(mPutRotateApi); addApi(mDeleteStopApi); addApi(mPostMoveApi); } @Override public String getProfileName() { return PROFILE_NAME; } private final DConnectApi mPutRotateApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ROTATE; } @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); DeviceInfo info = SpheroManager.INSTANCE.getDevice(serviceId); if (info != null) { Integer angle = parseInteger(request, PARAM_ANGLE); if (angle == null || angle < 0 || angle > 360) { MessageUtils.setInvalidRequestParameterError(response); } else { synchronized (info) { info.getDevice().rotate(angle.floatValue()); } setResult(response, DConnectMessage.RESULT_OK); } } else { MessageUtils.setNotFoundServiceError(response); } return true; } }; private final DConnectApi mDeleteStopApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_STOP; } @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); DeviceInfo info = SpheroManager.INSTANCE.getDevice(serviceId); if (info != null) { synchronized (info) { info.getDevice().stop(); } setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setNotFoundServiceError(response); } return true; } }; private final DConnectApi mPostMoveApi = new PostApi() { @Override public String getAttribute() { return ATTRIBUTE_MOVE; } @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); DeviceInfo info = SpheroManager.INSTANCE.getDevice(serviceId); if (info != null) { final Integer angle = parseInteger(request, PARAM_ANGLE); final Double speed = parseDouble(request, PARAM_SPEED); if (angle == null || speed == null || angle < 0 || angle > 360 || speed < 0 || speed > 1.0) { MessageUtils.setInvalidRequestParameterError(response); } else { synchronized (info) { info.getDevice().drive(angle.floatValue(), speed.floatValue()); } if (BuildConfig.DEBUG) { Log.d("", "angle : " + angle.floatValue()); Log.d("", "speed : " + speed.floatValue()); } setResult(response, DConnectMessage.RESULT_OK); } } else { MessageUtils.setNotFoundServiceError(response); } return true; } }; }