/*
* The MIT License (MIT)
*
* Copyright (c) 2012 Curt Binder
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package info.curtbinder.reefangel.controller;
import java.util.Locale;
import info.curtbinder.reefangel.phone.Globals;
public class Controller {
public static final byte MAX_CONTROLLER_VALUES = 17;
public static final byte MAX_EXPANSION_RELAYS = 8;
public static final byte MAX_RELAY_PORTS = 8;
public static final byte MAX_TEMP_SENSORS = 3;
public static final byte MAX_PWM_EXPANSION_PORTS = 6;
public static final byte MAX_AI_CHANNELS = 3;
public static final byte MAX_CUSTOM_VARIABLES = 8;
public static final byte MAX_IO_CHANNELS = 6;
public static final byte MAX_RADION_LIGHT_CHANNELS = 6;
public static final byte MAX_VORTECH_VALUES = 3;
public static final byte MAX_WATERLEVEL_PORTS = 5;
public static final byte MAX_STATUS_FLAGS = 3;
public static final byte MAX_ALERT_FLAGS = 4;
public static final byte MAX_SCPWM_EXPANSION_PORTS = 16;
public static final byte MAX_DCPUMP_VALUES = 4;
// First set of expansion modules - EM
public static final short MODULE_DIMMING = 1 << 0;
public static final short MODULE_RF = 1 << 1;
public static final short MODULE_AI = 1 << 2;
public static final short MODULE_SALINITY = 1 << 3;
public static final short MODULE_ORP = 1 << 4;
public static final short MODULE_IO = 1 << 5;
public static final short MODULE_PHEXPANSION = 1 << 6;
public static final short MODULE_WATERLEVEL = 1 << 7;
// Second set of expansion modules - EM1
public static final short MODULE_HUMIDITY = 1 << 0;
public static final short MODULE_DCPUMP = 1 << 1;
public static final short MODULE_LEAKDETECTOR = 1 << 2;
// Status flags - SF
public static final short SF_LIGHTSON = 1 << 0;
public static final short SF_FEEDING = 1 << 1;
public static final short SF_WATERCHANGE = 1 << 2;
// Alert flags - AF
public static final short AF_ATOTIMEOUT = 1 << 0;
public static final short AF_OVERHEAT = 1 << 1;
public static final short AF_BUSLOCK = 1 << 2;
public static final short AF_LEAK = 1 << 3;
// AI channels
public static final byte AI_WHITE = 0;
public static final byte AI_BLUE = 1;
public static final byte AI_ROYALBLUE = 2;
// Radion channels
public static final byte RADION_WHITE = 0;
public static final byte RADION_ROYALBLUE = 1;
public static final byte RADION_RED = 2;
public static final byte RADION_GREEN = 3;
public static final byte RADION_BLUE = 4;
public static final byte RADION_INTENSITY = 5;
// Vortech modes
public static final byte VORTECH_MODE = 0;
public static final byte VORTECH_SPEED = 1;
public static final byte VORTECH_DURATION = 2;
// DCPump modes
public static final byte DCPUMP_MODE = 0;
public static final byte DCPUMP_SPEED = 1;
public static final byte DCPUMP_DURATION = 2;
public static final byte DCPUMP_THRESHOLD = 3;
private String updateLogDate;
private NumberWithLabel[] tempSensors;
private NumberWithLabel pH;
private NumberWithLabel pHExp;
private boolean atoLow;
private boolean atoHigh;
private ShortWithLabelOverride pwmA;
private ShortWithLabelOverride pwmD;
private ShortWithLabel[] waterlevel;
private ShortWithLabel humidity;
private NumberWithLabel salinity;
private NumberWithLabel orp;
private Relay main;
private byte qtyExpansionRelays;
private Relay[] expansionRelays;
private short expansionModules;
private short expansionModules1;
private short relayExpansionModules;
private short flagsAlert;
private short flagsStatus;
private short ioChannels;
private String[] ioChannelsLabels;
private ShortWithLabelOverride[] pwmExpansion;
private ShortWithLabelOverride[] aiChannels;
private ShortWithLabelOverride[] radionChannels;
private ShortWithLabel[] customVariables;
private short[] vortechValues;
private ShortWithLabelOverride[] pwmSCExpansion;
private short[] dcPumpValues;
public Controller () {
init();
}
public Controller ( byte numExpRelays ) {
init();
this.qtyExpansionRelays = numExpRelays;
}
private void init ( ) {
updateLogDate = "";
tempSensors = new NumberWithLabel[MAX_TEMP_SENSORS];
int i;
for ( i = 0; i < MAX_TEMP_SENSORS; i++ ) {
tempSensors[i] = new NumberWithLabel( (byte) 1 );
}
pH = new NumberWithLabel( (byte) 2 );
pHExp = new NumberWithLabel( (byte) 2 );
atoLow = false;
atoHigh = false;
pwmA = new ShortWithLabelOverride();
pwmD = new ShortWithLabelOverride();
pwmExpansion = new ShortWithLabelOverride[MAX_PWM_EXPANSION_PORTS];
for ( i = 0; i < MAX_PWM_EXPANSION_PORTS; i++ ) {
pwmExpansion[i] = new ShortWithLabelOverride();
}
waterlevel = new ShortWithLabel[MAX_WATERLEVEL_PORTS];
for ( i = 0; i < MAX_WATERLEVEL_PORTS; i++ ) {
waterlevel[i] = new ShortWithLabel();
}
humidity = new ShortWithLabel();
salinity = new NumberWithLabel( (byte) 1 );
orp = new NumberWithLabel();
main = new Relay();
expansionRelays = new Relay[MAX_EXPANSION_RELAYS];
for ( i = 0; i < MAX_EXPANSION_RELAYS; i++ ) {
expansionRelays[i] = new Relay();
}
qtyExpansionRelays = 0;
expansionModules = 0;
expansionModules1 = 0;
relayExpansionModules = 0;
flagsStatus = 0;
flagsAlert = 0;
ioChannels = 0;
ioChannelsLabels = new String[MAX_IO_CHANNELS];
for ( i = 0; i < MAX_IO_CHANNELS; i++ ) {
ioChannelsLabels[i] = "";
}
aiChannels = new ShortWithLabelOverride[MAX_AI_CHANNELS];
for ( i = 0; i < MAX_AI_CHANNELS; i++ ) {
aiChannels[i] = new ShortWithLabelOverride();
}
radionChannels = new ShortWithLabelOverride[MAX_RADION_LIGHT_CHANNELS];
for ( i = 0; i < MAX_RADION_LIGHT_CHANNELS; i++ ) {
radionChannels[i] = new ShortWithLabelOverride();
}
customVariables = new ShortWithLabel[MAX_CUSTOM_VARIABLES];
for ( i = 0; i < MAX_CUSTOM_VARIABLES; i++ ) {
customVariables[i] = new ShortWithLabel();
}
vortechValues = new short[MAX_VORTECH_VALUES];
for ( i = 0; i < MAX_VORTECH_VALUES; i++ ) {
vortechValues[i] = 0;
}
pwmSCExpansion = new ShortWithLabelOverride[MAX_SCPWM_EXPANSION_PORTS];
for ( i = 0; i < MAX_SCPWM_EXPANSION_PORTS; i++ ) {
pwmSCExpansion[i] = new ShortWithLabelOverride();
}
dcPumpValues = new short[MAX_DCPUMP_VALUES];
for ( i = 0; i < MAX_DCPUMP_VALUES; i++ ) {
dcPumpValues[i] = 0;
}
}
public void setNumExpansionRelays ( byte relays ) {
qtyExpansionRelays = relays;
}
public byte getNumExpansionRelays ( ) {
return qtyExpansionRelays;
}
public void setLogDate ( String date ) {
updateLogDate = date;
}
public String getLogDate ( ) {
return updateLogDate;
}
public void setTempLabel ( int sensor, String label ) {
tempSensors[sensor - 1].setLabel( label );
}
public String getTempLabel ( int sensor ) {
return tempSensors[sensor - 1].getLabel();
}
public void setTemp1 ( int value ) {
tempSensors[0].setData( value );
}
public String getTemp1 ( ) {
return tempSensors[0].getData();
}
public void setTemp2 ( int value ) {
tempSensors[1].setData( value );
}
public String getTemp2 ( ) {
return tempSensors[1].getData();
}
public void setTemp3 ( int value ) {
tempSensors[2].setData( value );
}
public String getTemp3 ( ) {
return tempSensors[2].getData();
}
public void setPH ( int value ) {
pH.setData( value );
}
public String getPH ( ) {
return pH.getData();
}
public void setPHLabel ( String label ) {
pH.setLabel( label );
}
public String getPHLabel ( ) {
return pH.getLabel();
}
public void setPHExp ( int value ) {
pHExp.setData( value );
}
public String getPHExp ( ) {
return pHExp.getData();
}
public void setPHExpLabel ( String label ) {
pHExp.setLabel( label );
}
public String getPHExpLabel ( ) {
return pHExp.getLabel();
}
public void setAtoLow ( boolean v ) {
atoLow = v;
}
public boolean getAtoLow ( ) {
return atoLow;
}
public String getAtoLowText ( ) {
return getAtoText( atoLow );
}
private String getAtoText ( boolean active ) {
// TODO use strings.xml instead of hard code
if ( active )
return "ON";
else
return "OFF";
}
public void setAtoHigh ( boolean v ) {
atoHigh = v;
}
public boolean getAtoHigh ( ) {
return atoHigh;
}
public String getAtoHighText ( ) {
return getAtoText( atoHigh );
}
public void setPwmA ( short v ) {
pwmA.setData( v );
}
public short getPwmA ( ) {
return pwmA.getData();
}
public short getPwmAOverride ( ) {
return pwmA.getOverrideValue();
}
public void setPwmAOverride ( short v ) {
pwmA.setOverride( v );
}
public void setPwmALabel ( String label ) {
pwmA.setLabel( label );
}
public String getPwmALabel ( ) {
return pwmA.getLabel();
}
public void setPwmD ( short v ) {
pwmD.setData( v );
}
public short getPwmD ( ) {
return pwmD.getData();
}
public short getPwmDOverride ( ) {
return pwmD.getOverrideValue();
}
public void setPwmDOverride ( short v ) {
pwmD.setOverride( v );
}
public void setPwmDLabel ( String label ) {
pwmD.setLabel( label );
}
public String getPwmDLabel ( ) {
return pwmD.getLabel();
}
public void setPwmExpansion ( short channel, short v ) {
pwmExpansion[channel].setData( v );
}
public short getPwmExpansion ( short channel ) {
return pwmExpansion[channel].getData();
}
public short getPwmExpansionOverride ( short channel ) {
return pwmExpansion[channel].getOverrideValue();
}
public void setPwmExpansionOverride ( short channel, short v ) {
pwmExpansion[channel].setOverride( v );
}
public void setPwmExpansionLabel ( short channel, String label ) {
pwmExpansion[channel].setLabel( label );
}
public String getPwmExpansionLabel ( short channel ) {
return pwmExpansion[channel].getLabel();
}
public void setSCPwmExpansion ( short channel, short v ) {
pwmSCExpansion[channel].setData(v);
}
public short getSCPwmExpansion ( short channel ) {
return pwmSCExpansion[channel].getData();
}
public short getSCPwmExpansionOverride ( short channel ) {
return pwmSCExpansion[channel].getOverrideValue();
}
public void setSCPwmExpansionOverride ( short channel, short v ) {
pwmSCExpansion[channel].setOverride(v);
}
public void setSCPwmExpansionLabel ( short channel, String label ) {
pwmSCExpansion[channel].setLabel(label);
}
public String getSCPwmExpansionLabel ( short channel ) {
return pwmSCExpansion[channel].getLabel();
}
public void setWaterLevel ( short port, short value ) {
waterlevel[port].setData( value );
}
public short getWaterLevel ( short port ) {
return waterlevel[port].getData();
}
public void setWaterLevelLabel ( short port, String label ) {
waterlevel[port].setLabel( label );
}
public String getWaterLevelLabel ( short port ) {
return waterlevel[port].getLabel();
}
public void setHumidity ( short value ) {
humidity.setData( value );
}
public short getHumidity ( ) {
return humidity.getData();
}
public void setHumidityLabel ( String label ) {
humidity.setLabel( label );
}
public String getHumidityLabel ( ) {
return humidity.getLabel();
}
public void setSalinity ( int value ) {
salinity.setData( value );
}
public String getSalinity ( ) {
return salinity.getData();
}
public void setSalinityLabel ( String label ) {
salinity.setLabel( label );
}
public String getSalinityLabel ( ) {
return salinity.getLabel();
}
public void setORP ( int value ) {
orp.setData( value );
}
public String getORP ( ) {
return orp.getData();
}
public void setORPLabel ( String label ) {
orp.setLabel( label );
}
public String getORPLabel ( ) {
return orp.getLabel();
}
public void setMainRelayData ( short data, short maskOn, short maskOff ) {
main.setRelayData( data, maskOn, maskOff );
}
public void setMainRelayData ( short data ) {
main.setRelayData( data );
}
public void setMainRelayOnMask ( short maskOn ) {
main.setRelayOnMask( maskOn );
}
public void setMainRelayOffMask ( short maskOff ) {
main.setRelayOffMask( maskOff );
}
public Relay getMainRelay ( ) {
return main;
}
public void setExpRelayData ( int relay, short data ) {
// Pass in the 1 based index for relay
expansionRelays[relay - 1].setRelayData( data );
}
public void setExpRelayOnMask ( int relay, short maskOn ) {
// Pass in the 1 based index for relay
expansionRelays[relay - 1].setRelayOnMask( maskOn );
}
public void setExpRelayOffMask ( int relay, short maskOff ) {
// Pass in the 1 based index for relay
expansionRelays[relay - 1].setRelayOffMask( maskOff );
}
public Relay getExpRelay ( int relay ) {
return expansionRelays[relay - 1];
}
public short getCustomVariable ( short var ) {
return customVariables[var].getData();
}
public void setCustomVariable ( short var, short value ) {
customVariables[var].setData( value );
}
public String getCustomVariableLabel ( short var ) {
return customVariables[var].getLabel();
}
public void setCustomVariableLabel ( short var, String label ) {
customVariables[var].setLabel( label );
}
public short getAIChannel ( byte channel ) {
return aiChannels[channel].getData();
}
public void setAIChannel ( byte channel, short value ) {
aiChannels[channel].setData( value );
}
public short getAIChannelOverride ( byte channel ) {
return aiChannels[channel].getOverrideValue();
}
public void setAIChannelOverride ( byte channel, short value ) {
aiChannels[channel].setOverride( value );
}
public short getRadionChannel ( byte channel ) {
return radionChannels[channel].getData();
}
public void setRadionChannel ( byte channel, short value ) {
radionChannels[channel].setData( value );
}
public short getRadionChannelOverride ( byte channel ) {
return radionChannels[channel].getOverrideValue();
}
public void setRadionChannelOverride ( byte channel, short value ) {
radionChannels[channel].setOverride( value );
}
public short getVortechValue ( byte type ) {
return vortechValues[type];
}
public void setVortechValue ( byte type, short value ) {
vortechValues[type] = value;
}
public short getDCPumpValue ( byte type ) {
return dcPumpValues[type];
}
public void setDCPumpValue ( byte type, short value ) {
dcPumpValues[type] = value;
}
public short getExpansionModules ( ) {
return expansionModules;
}
public void setExpansionModules ( short em ) {
expansionModules = em;
}
public short getExpansionModules1 ( ) {
return expansionModules1;
}
public void setExpansionModules1 ( short em1 ) {
expansionModules1 = em1;
}
public static boolean isDimmingModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_DIMMING) == MODULE_DIMMING;
}
public static boolean isRFModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_RF) == MODULE_RF;
}
public static boolean isAIModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_AI) == MODULE_AI;
}
public static boolean isSalinityModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_SALINITY) == MODULE_SALINITY;
}
public static boolean isORPModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_ORP) == MODULE_ORP;
}
public static boolean isIOModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_IO) == MODULE_IO;
}
public static boolean isPHExpansionModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_PHEXPANSION) == MODULE_PHEXPANSION;
}
public static boolean isWaterLevelModuleInstalled ( short expansionModules ) {
return (expansionModules & MODULE_WATERLEVEL) == MODULE_WATERLEVEL;
}
public static boolean isHumidityModuleInstalled ( short expansionModules1 ) {
return (expansionModules1 & MODULE_HUMIDITY) == MODULE_HUMIDITY;
}
public static boolean isDCPumpControlModuleInstalled ( short expansionModules1 ) {
return (expansionModules1 & MODULE_DCPUMP) == MODULE_DCPUMP;
}
public static boolean isLeakDetectorModuleInstalled ( short expansionModules1 ) {
return (expansionModules1 & MODULE_LEAKDETECTOR) == MODULE_LEAKDETECTOR;
}
public short getRelayExpansionModules ( ) {
return relayExpansionModules;
}
public void setRelayExpansionModules ( short rem ) {
relayExpansionModules = rem;
}
public static int getRelayExpansionModulesInstalled ( short rem ) {
int qty = 0;
for ( int i = 7; i >= 0; i-- ) {
if ( (rem & (1 << i)) == (1 << i) ) {
qty = i + 1;
break;
}
}
return qty;
}
public void setStatusFlags ( short flags ) {
flagsStatus = flags;
}
public short getStatusFlags ( ) {
return flagsStatus;
}
public static boolean isLightsOnFlagSet ( short flags ) {
return (flags & SF_LIGHTSON) == SF_LIGHTSON;
}
public static boolean isFeedingFlagSet ( short flags ) {
return (flags & SF_FEEDING) == SF_FEEDING;
}
public static boolean isWaterChangeFlagSet ( short flags ) {
return (flags & SF_WATERCHANGE) == SF_WATERCHANGE;
}
public void setAlertFlags ( short flags ) {
flagsAlert = flags;
}
public short getAlertFlags ( ) {
return flagsAlert;
}
public static boolean isATOTimeoutFlagSet ( short flags ) {
return (flags & AF_ATOTIMEOUT) == AF_ATOTIMEOUT;
}
public static boolean isOverheatFlagSet ( short flags ) {
return (flags & AF_OVERHEAT) == AF_OVERHEAT;
}
public static boolean isBusLockFlagSet ( short flags ) {
return (flags & AF_BUSLOCK) == AF_BUSLOCK;
}
public static boolean isLeakFlagSet ( short flags ) {
return (flags & AF_LEAK) == AF_LEAK;
}
public short getIOChannels ( ) {
return ioChannels;
}
public void setIOChannels ( short ioChannels ) {
this.ioChannels = ioChannels;
}
public String getIOChannelLabel ( short channel ) {
return ioChannelsLabels[channel];
}
public void setIOChannelLabel ( short channel, String label ) {
ioChannelsLabels[channel] = label;
}
public static boolean getIOChannel ( short ioChannels, byte channel ) {
// channel is 0 based
int v = (1 << channel);
int w = (ioChannels & v);
boolean f = w == v;
return f;
}
public static boolean isPWMOverrideEnabled( short value, short override ) {
// above 100% (max value), so the override is disabled
if ( override > Globals.OVERRIDE_MAX_VALUE ) {
return false;
}
return true;
}
public static short getPWMValueFromOverride ( short data, short override ) {
short v;
if ( isPWMOverrideEnabled(data, override) ) {
v = override;
} else {
v = data;
}
//Log.d("getPWMValueFromOverride", "data: " + data + " override: " + override + " return: " + v);
return v;
}
public static String getPWMDisplayValue( short data, short override ) {
String s = String.format(Locale.getDefault(), "%d%%", getPWMValueFromOverride(data, override));
if ( isPWMOverrideEnabled(data, override) ) {
s = "**" + s;
}
return s;
}
}