blob: 5a010a8582e99c374403de2979f2748908553a3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Orange.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*******************************************************************************/
package org.eclipse.om2m.sdt.home.smartercoffee.communication;
import org.eclipse.om2m.sdt.home.smartercoffee.Activator;
import org.eclipse.om2m.sdt.home.types.LiquidLevel;
public class SmarterCoffeeStatus {
public static final SmarterCoffeeStatusDescriptor NO_FAULT = new SmarterCoffeeStatusDescriptor(0, "No fault detected.");
public static final SmarterCoffeeStatusDescriptor UNREACHEABLE = new SmarterCoffeeStatusDescriptor(-1, "The coffee machine is unreachable");
public static final SmarterCoffeeStatusDescriptor CARAFE_ERROR = new SmarterCoffeeStatusDescriptor(-2, "No carafe on the plate");
public static final SmarterCoffeeStatusDescriptor WATER_ERROR = new SmarterCoffeeStatusDescriptor(-3, "No water in tank");
public static final SmarterCoffeeStatusDescriptor COFFEE_READY = new SmarterCoffeeStatusDescriptor(1, "Coffee is ready!");
public static final SmarterCoffeeStatusDescriptor BREWING_IN_PROGRESS = new SmarterCoffeeStatusDescriptor(2, "Brewing in progress");
public static final SmarterCoffeeStatusDescriptor UNKNOW_STATE = new SmarterCoffeeStatusDescriptor(100, "The state is unknow");
private boolean isUnreachable = false;
private boolean isCarafeUndetected = false;
private boolean isWaterError = false;
private int waterLevel = 1;
private int cupsNumber = 0;
private int strength = 0;
private boolean carafeDetected = false;
private boolean useGrinder = false;
private boolean machineReady = false;
private boolean grindInProgress = false;
private boolean waterPumpInProgress = false;
private boolean cycleComplete = false;
private boolean keepWarm = false;
private boolean coffeeReady = false;
private boolean waterPumpWasUse = false;
public boolean getFaultDetection(){
return isCarafeUndetected || isUnreachable || isWaterError;
}
public void parseStatus(byte[] dataToParse){
if (dataToParse !=null) {
//Activator.logger.debug("Data parsing!");
this.waterLevel = dataToParse[2];
this.carafeDetected = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_CARAFE_DETECTED_0);
this.machineReady = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_MACHINE_READY_2);
this.useGrinder = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_USE_GRIDNER_1);
this.grindInProgress = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_GRIND_3);
this.waterPumpInProgress = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_WATER_PUMP_4);
this.cycleComplete = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_CYCLE_COMPLETE_5);
this.keepWarm = getParameter(dataToParse[1], SmarterCoffeeCommands.STATUS_FLAGS_MASK_KEEP_WARM_6);
//Activator.logger.debug("machineReady: " + machineReady + " useGrinder: " + useGrinder + " grindInProgress: " + grindInProgress + " waterPumpInProgress: " + waterPumpInProgress + " cycleComplete: " + cycleComplete + " keepWarm: " + keepWarm);
updateFaultDetectors();
checkCoffeeReady();
}
else Activator.logger.debug("There is no data to parse. Check SmarterCoffeeMachine reachability");
}
public boolean checkCoffeeReady(){
//Activator.logger.debug("Check coffee ready function...");
this.coffeeReady = false;
if(waterPumpInProgress){
this.waterPumpWasUse = true;
}
if(machineReady && carafeDetected && waterPumpWasUse && !waterPumpInProgress){
this.waterPumpWasUse = false;
this.coffeeReady = true;
}
return this.coffeeReady;
}
public int getCoffeePreparationStatus(){
if(checkCoffeeReady()) return COFFEE_READY.code;
if(waterPumpWasUse) return BREWING_IN_PROGRESS.code;
else return UNKNOW_STATE.code;
}
public boolean getParameter(byte dataToParse, byte mask){
int shift = 0;
switch(mask){
case SmarterCoffeeCommands.STATUS_FLAGS_CARAFE_DETECTED_0:
shift = 0;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_USE_GRIDNER_1:
shift = 1;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_MACHINE_READY_2:
shift = 2;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_GRIND_3:
shift = 3;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_WATER_PUMP_4:
shift = 4;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_CYCLE_COMPLETE_5:
shift = 5;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_KEEP_WARM_6:
shift = 6;
break;
case SmarterCoffeeCommands.STATUS_FLAGS_MASK_SCHEDULE_7:
shift = 7;
break;
}
return (((dataToParse & mask) >> shift) == 1)?true:false;
}
public void updateFaultDetectors(){
this.isCarafeUndetected = !carafeDetected;
if(this.waterLevel < 1) isWaterError = true;
else isWaterError = false;
Activator.logger.debug("Is carafe undetected: " + isCarafeUndetected + " isWaterError: " + isWaterError);
}
public int getCode(){
if(isUnreachable){
return UNREACHEABLE.code;
}
else if(isCarafeUndetected){
return CARAFE_ERROR.code;
}
else if(isWaterError){
return WATER_ERROR.code;
}
else
return NO_FAULT.code;
}
public String getDescription(){
if(isUnreachable){
return UNREACHEABLE.description;
}
else if(isCarafeUndetected){
return CARAFE_ERROR.description;
}
else if(isWaterError){
return WATER_ERROR.description;
}
else
return NO_FAULT.description;
}
public boolean isUnreachable() {
return isUnreachable;
}
public void setUnreachable(boolean isReachable) {
this.isUnreachable = isReachable;
}
public boolean isCarafeUndetected() {
return isCarafeUndetected;
}
public void setCarafeUndetected(boolean isCarafeDetected) {
this.isCarafeUndetected = isCarafeDetected;
}
public boolean isWaterError() {
return isWaterError;
}
public void setWaterError(boolean isWaterError) {
this.isWaterError = isWaterError;
}
public boolean isCoffeeReady() {
return coffeeReady;
}
public void setCoffeeReady(boolean coffeeReady) {
this.coffeeReady = coffeeReady;
}
public LiquidLevel.Values getWaterLevel() {
System.out.println("raw water level=" + waterLevel);
if (waterLevel == 0) {
return LiquidLevel.Values.low;
}
if (waterLevel == 17) { //about HALF -> from about level 7 on the right side of the tank
return LiquidLevel.Values.medium;
}
if (waterLevel == 18) { //from about level 7 to 10
return LiquidLevel.Values.high;
}
if (waterLevel == 19) { //almost FULL -> from about level 10
return LiquidLevel.Values.maximum;
}
else {
return LiquidLevel.Values.zero;
}
}
public void setKeepWarm(boolean keepWarm) {
this.keepWarm = keepWarm;
}
public boolean getKeepWarm(){
return keepWarm;
}
}