/*
FPLUGPowerMeterProfile.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.fplug.profile;
import android.content.Intent;
import android.util.Log;
import org.deviceconnect.android.deviceplugin.fplug.BuildConfig;
import org.deviceconnect.android.deviceplugin.fplug.FPLUGApplication;
import org.deviceconnect.android.deviceplugin.fplug.FPLUGDeviceService;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGController;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGRequestCallback;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGResponse;
import org.deviceconnect.android.deviceplugin.fplug.fplug.WattHour;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.PowerMeterProfile;
import org.deviceconnect.android.profile.PowerMeterProfileConstants;
import org.deviceconnect.android.profile.api.DConnectApi;
import org.deviceconnect.android.profile.api.GetApi;
import org.deviceconnect.message.DConnectMessage;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* Power Meter Profile.
*
* @author NTT DOCOMO, INC.
*/
public class FPLUGPowerMeterProfile extends PowerMeterProfile {
private final static String RFC_3339 = "yyyy-MM-dd'T'HH:mm:ssZ";
private final DConnectApi mGetIntegratedPowerValueApi = new GetApi() {
@Override
public String getAttribute() {
return ATTR_INTEGRATEDPOWER;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
final String serviceId = getServiceID(request);
String date = request.getStringExtra(PARAM_DATE);
Calendar calendar;
if (date != null) {
calendar = createCalendar(date);
if (calendar == null) {
MessageUtils.setInvalidRequestParameterError(response, "date parse error");
sendResultError(response);
return true;
}
} else {
calendar = Calendar.getInstance();
}
FPLUGApplication app = ((FPLUGApplication) getContext().getApplicationContext());
FPLUGController controller = app.getConnectedController(serviceId);
if (controller == null) {
MessageUtils.setUnknownError(response, "F-PLUG not connected");
sendResultError(response);
return false;
}
controller.requestPastWattHour(calendar, new FPLUGRequestCallback() {
@Override
public void onSuccess(FPLUGResponse fResponse) {
List<WattHour> wattHourList = fResponse.getWattHourList();
int[] wattList = new int[wattHourList.size()];
for (int i = 0; i < wattHourList.size(); i++) {
wattList[i] = wattHourList.get(i).getWatt();
}
response.putExtra(PowerMeterProfileConstants.PARAM_INTEGRATEDPOWER, wattList);
sendResultOK(response);
}
@Override
public void onError(String message) {
MessageUtils.setUnknownError(response, message);
sendResultError(response);
}
@Override
public void onTimeout() {
sendResultTimeout(response);
}
});
return false;
}
};
private final DConnectApi mGetInstantaneousPowerValueApi = new GetApi() {
@Override
public String getAttribute() {
return ATTR_INSTANTANEOUSPOWER;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
final String serviceId = request.getStringExtra(PARAM_SERVICE_ID);
FPLUGApplication app = ((FPLUGApplication) getContext().getApplicationContext());
FPLUGController controller = app.getConnectedController(serviceId);
if (controller == null) {
MessageUtils.setUnknownError(response, "F-PLUG not connected");
sendResultError(response);
return false;
}
controller.requestRealtimeWatt(new FPLUGRequestCallback() {
@Override
public void onSuccess(FPLUGResponse fResponse) {
response.putExtra(PowerMeterProfileConstants.PARAM_INSTANTANEOUSPOWER, fResponse.getRealtimeWatt());
sendResultOK(response);
}
@Override
public void onError(String message) {
MessageUtils.setUnknownError(response, message);
sendResultError(response);
}
@Override
public void onTimeout() {
sendResultTimeout(response);
}
});
return false;
}
};
public FPLUGPowerMeterProfile() {
addApi(mGetIntegratedPowerValueApi);
addApi(mGetInstantaneousPowerValueApi);
}
private Calendar createCalendar(String date) {
if (BuildConfig.DEBUG) {
Log.d("Settings", "date:" + date);
}
SimpleDateFormat format = new SimpleDateFormat(RFC_3339, Locale.US);
Date converted;
try {
converted = new Date(format.parse(date).getTime());
} catch (java.text.ParseException e) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(converted);
return calendar;
}
private void sendResultOK(Intent response) {
setResult(response, DConnectMessage.RESULT_OK);
((FPLUGDeviceService) getContext()).sendResponse(response);
}
private void sendResultError(Intent response) {
((FPLUGDeviceService) getContext()).sendResponse(response);
}
private void sendResultTimeout(Intent response) {
MessageUtils.setTimeoutError(response);
((FPLUGDeviceService) getContext()).sendResponse(response);
}
}