package com.firstbuild.androidapp.productmanager;
import android.util.Log;
import android.view.View;
import com.firstbuild.androidapp.OpalValues;
import com.firstbuild.androidapp.ParagonValues;
import com.firstbuild.androidapp.R;
import com.firstbuild.androidapp.dashboard.DashboardActivity;
import com.firstbuild.androidapp.paragon.datamodel.RecipeInfo;
import com.firstbuild.androidapp.paragon.datamodel.StageInfo;
import com.firstbuild.commonframework.blemanager.BleManager;
import org.json.JSONObject;
import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
* Created by hans on 16. 6. 13..
*/
public class ParagonInfo extends ProductInfo{
private static final String TAG = ParagonInfo.class.getSimpleName();
public static final int NO_BATTERY_INFO = -1;
protected int NUM_MUST_INIT_DATA = 7;
// Initial data must get from dashboard.
private int erdBatteryLevel = NO_BATTERY_INFO;
private byte erdBurnerStatus = INITIAL_VALUE;
private byte erdProbeConnectionStatue = INITIAL_VALUE;
private byte erdCurrentCookMode = INITIAL_VALUE;
private RecipeInfo erdRecipeConfig = null;
private byte erdCookState = INITIAL_VALUE;
private int erdElapsedTime = INITIAL_ELAPSED_TIME;
private float erdCurrentTemp;
private byte erdCookStage;
private byte erdPowerLevel = 0;
private byte versionMajor = 0;
private byte versionMinor = 0;
private short versionBuild = 0;
public ParagonInfo(int type, String address, String nickname) {
super(type, address, nickname);
}
public ParagonInfo(ProductInfo product) {
super(product);
}
public ParagonInfo(JSONObject jsonObject) {
super(jsonObject);
}
public void initMustData(){
erdBatteryLevel = NO_BATTERY_INFO;
erdBurnerStatus = INITIAL_VALUE;
erdProbeConnectionStatue = INITIAL_VALUE;
erdCurrentCookMode = INITIAL_VALUE;
erdRecipeConfig = null;
erdCookState = INITIAL_VALUE;
isAllMustDataReceived = false;
}
@Override
public ArrayList<String> getMustHaveNotificationUUIDList() {
if(mustHaveNotificationUUIDList.size() == 0) {
// initialize must-have-notification uuid list
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_COOK_CONFIGURATION);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_BURNER_STATUS);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_BATTERY_LEVEL);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_PROBE_CONNECTION_STATE);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_COOK_MODE);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_CURRENT_COOK_STATE);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_CURRENT_TEMPERATURE);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_ELAPSED_TIME);
mustHaveNotificationUUIDList.add(ParagonValues.CHARACTERISTIC_CURRENT_POWER_LEVEL);
}
return mustHaveNotificationUUIDList;
}
@Override
public ArrayList<String> getMustHaveUUIDList() {
if(mustHaveUUIDList.size() == 0) {
// initialize must-have uuid list
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_PROBE_CONNECTION_STATE);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_BATTERY_LEVEL);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_BURNER_STATUS);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_COOK_MODE);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_COOK_CONFIGURATION);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_CURRENT_COOK_STATE);
mustHaveUUIDList.add(ParagonValues.CHARACTERISTIC_ELAPSED_TIME);
}
return mustHaveUUIDList;
}
public int getMustDataStatus(){
int numGetData = 0;
if(erdBatteryLevel != NO_BATTERY_INFO){
numGetData++;
}
if(erdBurnerStatus != INITIAL_VALUE){
numGetData++;
}
if(erdProbeConnectionStatue != INITIAL_VALUE){
numGetData++;
}
if(erdCurrentCookMode != INITIAL_VALUE){
numGetData++;
}
if(erdRecipeConfig != null ){
numGetData++;
}
if(erdCookState != INITIAL_VALUE){
numGetData++;
}
if(erdElapsedTime != INITIAL_ELAPSED_TIME){
numGetData++;
}
if(numGetData == NUM_MUST_INIT_DATA){
isAllMustDataReceived = true;
}
else{
isAllMustDataReceived = false;
}
return numGetData;
}
@Override
public int getNumMustInitData() {
return NUM_MUST_INIT_DATA;
}
@Override
public void updateErd(String uuid, byte[] value) {
ByteBuffer byteBuffer = ByteBuffer.wrap(value);
switch (uuid.toUpperCase()) {
case ParagonValues.CHARACTERISTIC_BATTERY_LEVEL:
setErdBatteryLevel(byteBuffer.get());
Log.d(TAG, "CHARACTERISTIC_BATTERY_LEVEL :" + String.format("%02x", value[0]));
break;
case ParagonValues.CHARACTERISTIC_ELAPSED_TIME:
Log.d(TAG, "CHARACTERISTIC_ELAPSED_TIME :" + String.format("%02x%02x", value[0], value[1]));
setErdElapsedTime(byteBuffer.getShort());
break;
case ParagonValues.CHARACTERISTIC_BURNER_STATUS:
Log.d(TAG, "CHARACTERISTIC_BURNER_STATUS :" + String.format("%02x", value[0]));
setErdBurnerStatus(byteBuffer.get());
break;
case ParagonValues.CHARACTERISTIC_PROBE_CONNECTION_STATE:
Log.d(TAG, "CHARACTERISTIC_PROBE_CONNECTION_STATE :" + String.format("%02x", value[0]));
setErdProbeConnectionStatue(byteBuffer.get());
break;
case ParagonValues.CHARACTERISTIC_COOK_MODE:
Log.d(TAG, "CHARACTERISTIC_COOK_MODE :" + String.format("%02x", value[0]));
setErdCurrentCookMode(byteBuffer.get());
break;
case ParagonValues.CHARACTERISTIC_COOK_CONFIGURATION:
Log.d(TAG, "CHARACTERISTIC_COOK_CONFIGURATION :");
String data = "";
for (int i = 0; i < value.length; i++) {
data += String.format("%02x", value[i]);
}
Log.d(TAG, "CONFIGURATION Data :" + data);
RecipeInfo newRecipe = new RecipeInfo(value);
setErdRecipeConfig(newRecipe);
break;
case ParagonValues.CHARACTERISTIC_CURRENT_COOK_STATE:
Log.d(TAG, "CHARACTERISTIC_CURRENT_COOK_STATE :" + String.format("%02x", value[0]));
setErdCookState(byteBuffer.get());
break;
case ParagonValues.CHARACTERISTIC_CURRENT_TEMPERATURE:
Log.d(TAG, "CHARACTERISTIC_CURRENT_TEMPERATURE :" + String.format("%02x%02x", value[0], value[1]));
setErdCurrentTemp(byteBuffer.getShort());
break;
case ParagonValues.CHARACTERISTIC_CURRENT_COOK_STAGE:
Log.d(TAG, "CHARACTERISTIC_CURRENT_COOK_STAGE :" + String.format("%02x", value[0]));
setErdCookStage(byteBuffer.get());
break;
case ParagonValues.CHARACTERISTIC_OTA_VERSION:
Log.d(TAG, "CHARACTERISTIC_OTA_VERSION :" + String.format("%02x%02x%02x%02x%02x%02x", value[0], value[1], value[2], value[3], value[4], value[5]));
setErdVersion(value[2], value[3], (short) value[4]);
break;
case ParagonValues.CHARACTERISTIC_CURRENT_POWER_LEVEL:
Log.d(TAG, "CHARACTERISTIC_CURRENT_POWER_LEVEL :" + String.format("%02x", value[0]));
setErdPowerLevel(byteBuffer.get());
break;
}
}
@Override
public void updateDashboardItemUI(DashboardActivity.ProductListAdapter.ViewHolder holderDashboard) {
holderDashboard.imageLogo.setImageResource(R.drawable.ic_paragon_logo);
holderDashboard.imageMark.setImageResource(R.drawable.ic_paragon_mark);
if (isProbeConnected()) {
holderDashboard.imageBattery.setVisibility(View.VISIBLE);
int level = getErdBatteryLevel();
if (level > 75) {
holderDashboard.imageBattery.setImageResource(R.drawable.ic_battery_100);
}
else if (level > 25) {
holderDashboard.imageBattery.setImageResource(R.drawable.ic_battery_50);
}
else if (level > 15) {
holderDashboard.imageBattery.setImageResource(R.drawable.ic_battery_25);
}
else {
holderDashboard.imageBattery.setImageResource(R.drawable.ic_battery_15);
}
String batteryLevel = level + "%";
holderDashboard.textBattery.setText(batteryLevel);
}
else {
holderDashboard.textBattery.setText("probe\noffline");
holderDashboard.imageBattery.setVisibility(View.GONE);
}
if (getErdBurnerStatus() == ParagonValues.BURNER_STATE_START) {
holderDashboard.textCooking.setText(R.string.product_state_cooking);
}
else {
holderDashboard.textCooking.setText("");
}
}
public void disconnected() {
super.disconnected();
this.erdProbeConnectionStatue = ParagonValues.PROBE_NOT_CONNECT;
this.erdBatteryLevel = NO_BATTERY_INFO;
this.erdCurrentTemp = 0.0f;
this.erdElapsedTime = 0;
this.erdRecipeConfig = null;
this.erdBurnerStatus = INITIAL_VALUE;
this.erdCookState = INITIAL_VALUE;
this.erdCookStage = INITIAL_VALUE;
this.erdCurrentCookMode = INITIAL_VALUE;
this.erdElapsedTime = INITIAL_ELAPSED_TIME;
}
public float getErdCurrentTemp() {
return erdCurrentTemp;
}
public void setErdCurrentTemp(short erdCurrentTemp) {
this.erdCurrentTemp = (erdCurrentTemp / 100.0f);
}
public int getErdElapsedTime() {
return erdElapsedTime;
}
public void setErdElapsedTime(int erdRemainingTime) {
this.erdElapsedTime = erdRemainingTime;
}
public RecipeInfo getErdRecipeConfig() {
return erdRecipeConfig;
}
public void setErdRecipeConfig(RecipeInfo erdRecipeConfig) {
this.erdRecipeConfig = erdRecipeConfig;
}
public byte getErdBurnerStatus() {
return erdBurnerStatus;
}
public void setErdBurnerStatus(byte erdBurnerStatus) {
this.erdBurnerStatus = erdBurnerStatus;
}
public byte getErdCookState() {
return erdCookState;
}
public void setErdCookState(byte erdCookState) {
this.erdCookState = erdCookState;
}
public byte getErdCookStage() {
return erdCookStage;
}
public void setErdCookStage(byte erdCookStage) {
this.erdCookStage = erdCookStage;
}
public byte getErdCurrentCookMode() {
return erdCurrentCookMode;
}
public void setErdCurrentCookMode(byte erdCurrentCookMode) {
this.erdCurrentCookMode = erdCurrentCookMode;
}
public int getErdBatteryLevel() {
return erdBatteryLevel;
}
public void setErdBatteryLevel(int erdBatteryLevel) {
this.erdBatteryLevel = erdBatteryLevel;
}
public byte getErdProbeConnectionStatue() {
return erdProbeConnectionStatue;
}
public void setErdProbeConnectionStatue(byte erdProbeConnectionStatue) {
this.erdProbeConnectionStatue = erdProbeConnectionStatue;
}
public boolean isProbeConnected() {
return (this.erdProbeConnectionStatue == ParagonValues.PROBE_CONNECT);
}
public void setErdPowerLevel(byte erdPowerLevel) {
this.erdPowerLevel = erdPowerLevel;
}
public byte getErdPowerLevel() {
return erdPowerLevel;
}
public void setErdVersion(byte major, byte minor, short build) {
this.versionMajor = major;
this.versionMinor = minor;
this.versionBuild = build;
}
public byte getVersionMajor() {
return versionMajor;
}
public byte getVersionMinor() {
return versionMinor;
}
public short getVersionBuild() {
return versionBuild;
}
public boolean isReceivedVersion() {
if(versionMajor == 0 && versionMinor == 0 && versionBuild == 0){
return false;
}
else{
return true;
}
}
public void createRecipeConfigForSousVide() {
this.erdRecipeConfig = new RecipeInfo("", "", "", "");
this.erdRecipeConfig.setType(RecipeInfo.TYPE_SOUSVIDE);
this.erdRecipeConfig.addStage(new StageInfo());
}
public void sendRecipeConfig() {
ByteBuffer valueBuffer = ByteBuffer.allocate(40);
int numStage = this.erdRecipeConfig.numStage();
for (int i = 0; i < numStage; i++) {
StageInfo stage = this.erdRecipeConfig.getStage(i);
valueBuffer.put(8 * i, (byte) stage.getSpeed());
valueBuffer.putShort(1 + 8 * i, (short) (stage.getTime()));
valueBuffer.putShort(3 + 8 * i, (short) (stage.getMaxTime()));
valueBuffer.putShort(5 + 8 * i, (short) (stage.getTemp() * 100));
valueBuffer.put(7 + 8 * i, (byte) (stage.isAutoTransition() ? 0x01 : 0x02));
}
// for (int i = 0; i < 40; i++) {
// Log.d(TAG, "RecipeManager.sendCurrentStages:" + String.format("0x%02x", valueBuffer.array()[i]));
// }
BleManager.getInstance().writeCharacteristics(bluetoothDevice, ParagonValues.CHARACTERISTIC_COOK_CONFIGURATION, valueBuffer.array());
}
}