/*
* 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.service;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import com.squareup.okhttp.Credentials;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.StringReader;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import info.curtbinder.reefangel.controller.Controller;
import info.curtbinder.reefangel.controller.Relay;
import info.curtbinder.reefangel.db.StatusProvider;
import info.curtbinder.reefangel.db.StatusTable;
import info.curtbinder.reefangel.phone.Globals;
import info.curtbinder.reefangel.phone.Permissions;
import info.curtbinder.reefangel.phone.R;
import info.curtbinder.reefangel.phone.RAApplication;
import info.curtbinder.reefangel.phone.RAPreferences;
public class ControllerTask implements Runnable {
private static final String TAG = ControllerTask.class.getSimpleName();
private final Host host;
private final RAApplication rapp;
private final RAPreferences raprefs;
ControllerTask(RAApplication rapp, Host host) {
this.rapp = rapp;
this.host = host;
this.raprefs = rapp.raprefs;
}
public void run() {
// Communicate with controller
// clear out the error code on run
rapp.clearErrorCode();
Response response = null;
boolean fInterrupted = false;
broadcastUpdateStatus(R.string.statusStart);
try {
URL url = new URL(host.toString());
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(host.getConnectTimeout(), TimeUnit.MILLISECONDS);
client.setReadTimeout(host.getReadTimeout(), TimeUnit.MILLISECONDS);
Request.Builder builder = new Request.Builder();
builder.url(url);
// set authentication if enabled AND ONLY if this not a request for labels.
// the labels are obtained from the Portal using a special query string that
// does not use the authentication string.
if (host.isDeviceAuthenticationEnabled() && !host.isRequestForLabels()) {
String creds = Credentials.basic(host.getWifiUsername(), host.getWifiPassword());
builder.header("Authorization", creds);
}
Request req = builder.build();
broadcastUpdateStatus(R.string.statusConnect);
response = client.newCall(req).execute();
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);
if (Thread.interrupted())
throw new InterruptedException();
} catch (MalformedURLException e) {
rapp.error(1, e, "MalformedURLException");
} catch (SocketTimeoutException e) {
rapp.error(5, e, "SocketTimeoutException");
} catch (ConnectException e) {
rapp.error(3, e, "ConnectException");
} catch (UnknownHostException e) {
String msg = "Unknown Host: " + host.toString();
UnknownHostException ue = new UnknownHostException(msg);
rapp.error(4, ue, "UnknownHostException");
} catch (EOFException e) {
EOFException eof = new EOFException(rapp.getString(R.string.errorAuthentication));
rapp.error(3, eof, "EOFException");
} catch (IOException e) {
rapp.error(3, e, "IOException");
} catch (InterruptedException e) {
fInterrupted = true;
}
processResponse(response, fInterrupted);
}
private void processResponse(Response response, boolean fInterrupted) {
// check if there was an error
if (rapp.errorCode > 0) {
// encountered an error, display an error on screen
if ((host.getCommand().equals(RequestCommands.Reboot))
&& (rapp.errorCode == 15)) {
// if we get a timeout after sending this command, the
// controller does not support the command
broadcastUpdateStatus(R.string.messageUnsupported);
} else {
broadcastErrorMessage();
}
} else if (fInterrupted) {
// Interrupted
broadcastUpdateStatus(R.string.messageCancelled);
} else {
try {
XMLHandler xml = new XMLHandler();
if (raprefs.useOld085xExpansionRelays()) {
xml.setOld085xExpansion(true);
}
if (!parseXML(xml, response)) {
// error parsing
broadcastErrorMessage();
throw new Exception();
}
broadcastUpdateStatus(R.string.statusUpdatingDisplay);
broadcastResponses(xml);
} catch (Exception e) {
// ignore the exception, just needed a way to break out
// of the sequence of events to close the response
}
}
if (response != null) {
try {
response.body().close();
} catch (IOException e) {
}
}
}
private boolean parseXML(XMLHandler xml, Response response) {
SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader xr = null;
boolean result = false;
try {
// Check for an interruption
if (Thread.interrupted())
throw new InterruptedException();
broadcastUpdateStatus(R.string.statusInitParser);
xr = spf.newSAXParser().getXMLReader();
xr.setContentHandler(xml);
xr.setErrorHandler(xml);
// Check for an interruption
if (Thread.interrupted())
throw new InterruptedException();
broadcastUpdateStatus(R.string.statusParsing);
// OkHttp Calls
// printHeaders(response);
String s = "";
try {
s = response.body().string();
} catch (IOException e) {
// Error reading from the connection
XMLReadException x = new XMLReadException("XMLReadException");
x.addXmlData(s);
throw x;
}
// Log.d(TAG, "XML: " + s );
xr.parse(new InputSource(new StringReader(s)));
broadcastUpdateStatus(R.string.statusFinished);
result = true;
} catch (ParserConfigurationException e) {
rapp.error(7, e, "ParserConfigurationException");
} catch (IOException e) {
rapp.error(8, e, "IOException");
} catch (SAXException e) {
rapp.error(9, e, "SAXException");
} catch (XMLReadException e) {
rapp.error(10, e, "XMLReadException");
} catch (InterruptedException e) {
// Not a true error, so only for debugging
Log.d(TAG, "parseXML: InterruptedException", e);
}
return result;
}
// private void printHeaders(Response r) {
// Headers h = r.headers();
// for ( int i = 0; i < h.size(); i++ ) {
// Log.d(TAG, "Header: " + h.name( i ) + ": " + h.value( i ) );
// }
// }
// Broadcast Stuff
private void broadcastResponses(XMLHandler xml) {
if (host.isRequestForLabels()) {
broadcastLabelsResponse(xml.getRa());
} else if (host.getCommand().startsWith(RequestCommands.Relay)
|| host.getCommand().equals(RequestCommands.ReefAngel)) {
broadcastUpdateDisplayData(xml.getRa());
} else if (host.getCommand().equals(RequestCommands.MemoryByte)
|| host.getCommand().equals(RequestCommands.MemoryInt)) {
broadcastMemoryResponse(xml.getMemoryResponse(), host.isWrite());
} else if (host.getCommand().equals(RequestCommands.FeedingMode)) {
broadcastCommandResponse(R.string.labelFeedingMode, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.WaterMode)) {
broadcastCommandResponse(R.string.labelWaterMode, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.ExitMode)) {
broadcastCommandResponse(R.string.labelExitMode, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.AtoClear)) {
broadcastCommandResponse(R.string.labelAtoClear, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.OverheatClear)) {
broadcastCommandResponse(R.string.labelOverheatClear, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.LightsOn)) {
broadcastCommandResponse(R.string.labelLightsOn, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.LightsOff)) {
broadcastCommandResponse(R.string.labelLightsOff, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.Reboot)) {
broadcastCommandResponse(R.string.labelReboot, xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.Calibrate)) {
broadcastCalibrateResponse(getCalibrateResponseMessage(host.getCalibrateType()),
xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.PwmOverride)) {
broadcastOverrideResponse(host.getOverrideChannel(), xml.getModeResponse());
} else if (host.getCommand().equals(RequestCommands.CustomVar)) {
// The response from the controller is M#, which matches a memory response
// So we need to read the MemoryResponse string and display it
broadcastCustomVarResponse(host.getCustomVarChannel(), xml.getMemoryResponse());
} else if (host.getCommand().equals(RequestCommands.Version)) {
Intent i = new Intent(MessageCommands.VERSION_RESPONSE_INTENT);
i.putExtra(MessageCommands.VERSION_RESPONSE_STRING, xml.getVersion());
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
} else if (host.getCommand().equals(RequestCommands.DateTime)) {
Intent i = new Intent(MessageCommands.DATE_QUERY_RESPONSE_INTENT);
i.putExtra(MessageCommands.DATE_QUERY_RESPONSE_STRING, xml.getDateTime());
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
} else if (host.getCommand().startsWith(RequestCommands.DateTime)) {
Intent i = new Intent(MessageCommands.DATE_SEND_RESPONSE_INTENT);
i.putExtra(MessageCommands.DATE_SEND_RESPONSE_STRING, xml.getDateTimeUpdateStatus());
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
}
private String getCalibrateResponseMessage(int location) {
int id;
switch (location) {
default:
case Globals.CALIBRATE_PH:
id = R.string.labelCalibratePH;
break;
case Globals.CALIBRATE_PHE:
id = R.string.labelCalibratePHExp;
break;
case Globals.CALIBRATE_ORP:
id = R.string.labelCalibrateORP;
break;
case Globals.CALIBRATE_SALINITY:
id = R.string.labelCalibrateSalinity;
break;
case Globals.CALIBRATE_WATERLEVEL:
id = R.string.labelCalibrateWaterLevel;
break;
}
return rapp.getString(id);
}
private void broadcastCalibrateResponse(String msg, String response) {
msg += rapp.getString(R.string.labelSeparator);
Log.d(TAG, msg + " " + response);
Intent i = new Intent(MessageCommands.CALIBRATE_RESPONSE_INTENT);
i.putExtra(MessageCommands.CALIBRATE_RESPONSE_STRING, msg + " " + response);
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
private void broadcastCustomVarResponse(int channel, String response) {
// Get the variable name
// Create the response - variable name: MESSAGE
String msg = rapp.raprefs.getCustomModuleChannelLabel(channel) +
rapp.getString(R.string.labelSeparator);
Log.d(TAG, msg + " " + response);
Intent i = new Intent(MessageCommands.CUSTOMVAR_RESPONSE_INTENT);
i.putExtra(MessageCommands.CUSTOMVAR_RESPONSE_STRING, msg + " " + response);
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
private void broadcastOverrideResponse(int channel, String response) {
// get channel name
// create response - channel: MESSAGE
String msg = rapp.getPWMOverrideChannelName(channel) + rapp.getString(R.string.labelSeparator);
Log.d(TAG, msg + " " + response);
Intent i = new Intent(MessageCommands.OVERRIDE_RESPONSE_INTENT);
i.putExtra(MessageCommands.OVERRIDE_RESPONSE_STRING, msg + " " + response);
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
private void broadcastCommandResponse(int id, String response) {
String msg = rapp.getString(id) + rapp.getString(R.string.labelSeparator);
Log.d(TAG, msg + " " + response);
Intent i = new Intent(MessageCommands.COMMAND_RESPONSE_INTENT);
i.putExtra(MessageCommands.COMMAND_RESPONSE_STRING, msg + " " + response);
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
// FIXME improve preference saving
private void broadcastLabelsResponse(Controller ra) {
// Save the preferences to memory
raprefs.set(R.string.prefT1LabelKey, ra.getTempLabel(1));
raprefs.set(R.string.prefT2LabelKey, ra.getTempLabel(2));
raprefs.set(R.string.prefT3LabelKey, ra.getTempLabel(3));
int i, j;
Log.d(TAG, "saving main labels");
for (i = 0; i < Controller.MAX_RELAY_PORTS; i++) {
raprefs.setRelayLabel(0, i, ra.getMainRelay().getPortLabel(i + 1));
}
Relay r;
for (i = 0; i < Controller.MAX_EXPANSION_RELAYS; i++) {
// use i+1 because it uses 1 based referencing
r = ra.getExpRelay(i + 1);
for (j = 0; j < Controller.MAX_RELAY_PORTS; j++) {
// use i+1 because the expansion relays start at 1
raprefs.setRelayLabel(i + 1, j, r.getPortLabel(j + 1));
}
}
if (!ra.getPHLabel().equals("")) {
raprefs.set(R.string.prefPHLabelKey, ra.getPHLabel());
}
// FIXME add getting ato low and high labels from portal
// FIXME labels require updating Controller class to store them
if (!ra.getSalinityLabel().equals("")) {
raprefs.set(R.string.prefSalinityLabelKey, ra.getSalinityLabel());
}
if (!ra.getORPLabel().equals("")) {
raprefs.set(R.string.prefORPLabelKey, ra.getORPLabel());
}
if (!ra.getPHExpLabel().equals("")) {
raprefs.set(R.string.prefPHExpLabelKey, ra.getPHExpLabel());
}
if (!ra.getPwmALabel().equals("")) {
raprefs.set(R.string.prefAPLabelKey, ra.getPwmALabel());
}
if (!ra.getPwmDLabel().equals("")) {
raprefs.set(R.string.prefDPLabelKey, ra.getPwmDLabel());
}
for (i = 0; i < Controller.MAX_WATERLEVEL_PORTS; i++) {
if (!ra.getWaterLevelLabel((short) i).equals("")) {
raprefs.set(raprefs.getWaterLevelLabelKey(i),
ra.getWaterLevelLabel((short) i));
}
}
for (i = 0; i < Controller.MAX_PWM_EXPANSION_PORTS; i++) {
if (!ra.getPwmExpansionLabel((short) i).equals(""))
raprefs.setDimmingModuleChannelLabel(i, ra
.getPwmExpansionLabel((short) i));
}
for (i = 0; i < Controller.MAX_SCPWM_EXPANSION_PORTS; i++) {
if (!ra.getSCPwmExpansionLabel((short) i).equals(""))
raprefs.setSCDimmingModuleChannelLabel(i, ra
.getSCPwmExpansionLabel((short) i));
}
for (i = 0; i < Controller.MAX_CUSTOM_VARIABLES; i++) {
if (!ra.getCustomVariableLabel((short) i).equals(""))
raprefs.setCustomModuleChannelLabel(i, ra
.getCustomVariableLabel((short) i));
}
for (i = 0; i < Controller.MAX_IO_CHANNELS; i++) {
if (!ra.getIOChannelLabel((short) i).equals(""))
raprefs.setIOModuleChannelLabel(i, ra
.getIOChannelLabel((short) i));
}
if (!ra.getHumidityLabel().equals("")) {
raprefs.set(R.string.prefHumidityLabelKey, ra.getHumidityLabel());
}
// Tell the activity we updated the labels
Intent intent = new Intent(MessageCommands.LABEL_RESPONSE_INTENT);
rapp.sendBroadcast(intent, Permissions.SEND_COMMAND);
}
private void broadcastMemoryResponse(String response, boolean wasWrite) {
// Log.d(TAG, "broadcastMemoryResponse");
Intent i = new Intent(MessageCommands.MEMORY_RESPONSE_INTENT);
i.putExtra(MessageCommands.MEMORY_RESPONSE_STRING, response);
i.putExtra(MessageCommands.MEMORY_RESPONSE_WRITE_BOOLEAN, wasWrite);
rapp.sendBroadcast(i, Permissions.SEND_COMMAND);
}
private void broadcastUpdateDisplayData(Controller ra) {
ContentValues v = new ContentValues();
v.put(StatusTable.COL_T1, ra.getTemp1());
v.put(StatusTable.COL_T2, ra.getTemp2());
v.put(StatusTable.COL_T3, ra.getTemp3());
v.put(StatusTable.COL_PH, ra.getPH());
v.put(StatusTable.COL_DP, ra.getPwmD());
v.put(StatusTable.COL_AP, ra.getPwmA());
v.put(StatusTable.COL_SAL, ra.getSalinity());
v.put(StatusTable.COL_ORP, ra.getORP());
v.put(StatusTable.COL_ATOHI, ra.getAtoHigh());
v.put(StatusTable.COL_ATOLO, ra.getAtoLow());
v.put(StatusTable.COL_LOGDATE, ra.getLogDate());
v.put(StatusTable.COL_RDATA, ra.getMainRelay().getRelayData());
v.put(StatusTable.COL_RONMASK, ra.getMainRelay().getRelayOnMask());
v.put(StatusTable.COL_ROFFMASK, ra.getMainRelay().getRelayOffMask());
v.put(StatusTable.COL_R1DATA, ra.getExpRelay(1).getRelayData());
v.put(StatusTable.COL_R1ONMASK, ra.getExpRelay(1).getRelayOnMask());
v.put(StatusTable.COL_R1OFFMASK, ra.getExpRelay(1).getRelayOffMask());
v.put(StatusTable.COL_R2DATA, ra.getExpRelay(2).getRelayData());
v.put(StatusTable.COL_R2ONMASK, ra.getExpRelay(2).getRelayOnMask());
v.put(StatusTable.COL_R2OFFMASK, ra.getExpRelay(2).getRelayOffMask());
v.put(StatusTable.COL_R3DATA, ra.getExpRelay(3).getRelayData());
v.put(StatusTable.COL_R3ONMASK, ra.getExpRelay(3).getRelayOnMask());
v.put(StatusTable.COL_R3OFFMASK, ra.getExpRelay(3).getRelayOffMask());
v.put(StatusTable.COL_R4DATA, ra.getExpRelay(4).getRelayData());
v.put(StatusTable.COL_R4ONMASK, ra.getExpRelay(4).getRelayOnMask());
v.put(StatusTable.COL_R4OFFMASK, ra.getExpRelay(4).getRelayOffMask());
v.put(StatusTable.COL_R5DATA, ra.getExpRelay(5).getRelayData());
v.put(StatusTable.COL_R5ONMASK, ra.getExpRelay(5).getRelayOnMask());
v.put(StatusTable.COL_R5OFFMASK, ra.getExpRelay(5).getRelayOffMask());
v.put(StatusTable.COL_R6DATA, ra.getExpRelay(6).getRelayData());
v.put(StatusTable.COL_R6ONMASK, ra.getExpRelay(6).getRelayOnMask());
v.put(StatusTable.COL_R6OFFMASK, ra.getExpRelay(6).getRelayOffMask());
v.put(StatusTable.COL_R7DATA, ra.getExpRelay(7).getRelayData());
v.put(StatusTable.COL_R7ONMASK, ra.getExpRelay(7).getRelayOnMask());
v.put(StatusTable.COL_R7OFFMASK, ra.getExpRelay(7).getRelayOffMask());
v.put(StatusTable.COL_R8DATA, ra.getExpRelay(8).getRelayData());
v.put(StatusTable.COL_R8ONMASK, ra.getExpRelay(8).getRelayOnMask());
v.put(StatusTable.COL_R8OFFMASK, ra.getExpRelay(8).getRelayOffMask());
v.put(StatusTable.COL_PWME0, ra.getPwmExpansion((short) 0));
v.put(StatusTable.COL_PWME1, ra.getPwmExpansion((short) 1));
v.put(StatusTable.COL_PWME2, ra.getPwmExpansion((short) 2));
v.put(StatusTable.COL_PWME3, ra.getPwmExpansion((short) 3));
v.put(StatusTable.COL_PWME4, ra.getPwmExpansion((short) 4));
v.put(StatusTable.COL_PWME5, ra.getPwmExpansion((short) 5));
v.put(StatusTable.COL_AIW, ra.getAIChannel(Controller.AI_WHITE));
v.put(StatusTable.COL_AIB, ra.getAIChannel(Controller.AI_BLUE));
v.put(StatusTable.COL_AIRB, ra.getAIChannel(Controller.AI_ROYALBLUE));
v.put(StatusTable.COL_RFM, ra.getVortechValue(Controller.VORTECH_MODE));
v.put(StatusTable.COL_RFS, ra.getVortechValue(Controller.VORTECH_SPEED));
v.put(StatusTable.COL_RFD, ra.getVortechValue(Controller.VORTECH_DURATION));
v.put(StatusTable.COL_RFW, ra.getRadionChannel(Controller.RADION_WHITE));
v.put(StatusTable.COL_RFRB, ra.getRadionChannel(Controller.RADION_ROYALBLUE));
v.put(StatusTable.COL_RFR, ra.getRadionChannel(Controller.RADION_RED));
v.put(StatusTable.COL_RFG, ra.getRadionChannel(Controller.RADION_GREEN));
v.put(StatusTable.COL_RFB, ra.getRadionChannel(Controller.RADION_BLUE));
v.put(StatusTable.COL_RFI, ra.getRadionChannel(Controller.RADION_INTENSITY));
v.put(StatusTable.COL_IO, ra.getIOChannels());
v.put(StatusTable.COL_C0, ra.getCustomVariable((byte) 0));
v.put(StatusTable.COL_C1, ra.getCustomVariable((byte) 1));
v.put(StatusTable.COL_C2, ra.getCustomVariable((byte) 2));
v.put(StatusTable.COL_C3, ra.getCustomVariable((byte) 3));
v.put(StatusTable.COL_C4, ra.getCustomVariable((byte) 4));
v.put(StatusTable.COL_C5, ra.getCustomVariable((byte) 5));
v.put(StatusTable.COL_C6, ra.getCustomVariable((byte) 6));
v.put(StatusTable.COL_C7, ra.getCustomVariable((byte) 7));
v.put(StatusTable.COL_EM, ra.getExpansionModules());
v.put(StatusTable.COL_EM1, ra.getExpansionModules1());
v.put(StatusTable.COL_REM, ra.getRelayExpansionModules());
v.put(StatusTable.COL_PHE, ra.getPHExp());
v.put(StatusTable.COL_WL, ra.getWaterLevel((short) 0));
v.put(StatusTable.COL_WL1, ra.getWaterLevel((short) 1));
v.put(StatusTable.COL_WL2, ra.getWaterLevel((short) 2));
v.put(StatusTable.COL_WL3, ra.getWaterLevel((short) 3));
v.put(StatusTable.COL_WL4, ra.getWaterLevel((short) 4));
v.put(StatusTable.COL_HUM, ra.getHumidity());
v.put(StatusTable.COL_PWMAO, ra.getPwmAOverride());
v.put(StatusTable.COL_PWMDO, ra.getPwmDOverride());
v.put(StatusTable.COL_PWME0O, ra.getPwmExpansionOverride((short) 0));
v.put(StatusTable.COL_PWME1O, ra.getPwmExpansionOverride((short) 1));
v.put(StatusTable.COL_PWME2O, ra.getPwmExpansionOverride((short) 2));
v.put(StatusTable.COL_PWME3O, ra.getPwmExpansionOverride((short) 3));
v.put(StatusTable.COL_PWME4O, ra.getPwmExpansionOverride((short) 4));
v.put(StatusTable.COL_PWME5O, ra.getPwmExpansionOverride((short) 5));
v.put(StatusTable.COL_AIWO, ra.getAIChannelOverride(Controller.AI_WHITE));
v.put(StatusTable.COL_AIBO, ra.getAIChannelOverride(Controller.AI_BLUE));
v.put(StatusTable.COL_AIRBO, ra.getAIChannelOverride(Controller.AI_ROYALBLUE));
v.put(StatusTable.COL_RFWO, ra.getRadionChannelOverride(Controller.RADION_WHITE));
v.put(StatusTable.COL_RFRBO, ra.getRadionChannelOverride(Controller.RADION_ROYALBLUE));
v.put(StatusTable.COL_RFRO, ra.getRadionChannelOverride(Controller.RADION_RED));
v.put(StatusTable.COL_RFGO, ra.getRadionChannelOverride(Controller.RADION_GREEN));
v.put(StatusTable.COL_RFBO, ra.getRadionChannelOverride(Controller.RADION_BLUE));
v.put(StatusTable.COL_RFIO, ra.getRadionChannelOverride(Controller.RADION_INTENSITY));
v.put(StatusTable.COL_SF, ra.getStatusFlags());
v.put(StatusTable.COL_AF, ra.getAlertFlags());
v.put(StatusTable.COL_SCPWME0, ra.getSCPwmExpansion((short) 0));
v.put(StatusTable.COL_SCPWME0O, ra.getSCPwmExpansionOverride((short) 0));
v.put(StatusTable.COL_SCPWME1, ra.getSCPwmExpansion((short) 1));
v.put(StatusTable.COL_SCPWME1O, ra.getSCPwmExpansionOverride((short) 1));
v.put(StatusTable.COL_SCPWME2, ra.getSCPwmExpansion((short) 2));
v.put(StatusTable.COL_SCPWME2O, ra.getSCPwmExpansionOverride((short) 2));
v.put(StatusTable.COL_SCPWME3, ra.getSCPwmExpansion((short) 3));
v.put(StatusTable.COL_SCPWME3O, ra.getSCPwmExpansionOverride((short) 3));
v.put(StatusTable.COL_SCPWME4, ra.getSCPwmExpansion((short) 4));
v.put(StatusTable.COL_SCPWME4O, ra.getSCPwmExpansionOverride((short) 4));
v.put(StatusTable.COL_SCPWME5, ra.getSCPwmExpansion((short) 5));
v.put(StatusTable.COL_SCPWME5O, ra.getSCPwmExpansionOverride((short) 5));
v.put(StatusTable.COL_SCPWME6, ra.getSCPwmExpansion((short) 6));
v.put(StatusTable.COL_SCPWME6O, ra.getSCPwmExpansionOverride((short) 6));
v.put(StatusTable.COL_SCPWME7, ra.getSCPwmExpansion((short) 7));
v.put(StatusTable.COL_SCPWME7O, ra.getSCPwmExpansionOverride((short) 7));
v.put(StatusTable.COL_SCPWME8, ra.getSCPwmExpansion((short) 8));
v.put(StatusTable.COL_SCPWME8O, ra.getSCPwmExpansionOverride((short) 8));
v.put(StatusTable.COL_SCPWME9, ra.getSCPwmExpansion((short) 9));
v.put(StatusTable.COL_SCPWME9O, ra.getSCPwmExpansionOverride((short) 9));
v.put(StatusTable.COL_SCPWME10, ra.getSCPwmExpansion((short) 10));
v.put(StatusTable.COL_SCPWME10O, ra.getSCPwmExpansionOverride((short) 10));
v.put(StatusTable.COL_SCPWME11, ra.getSCPwmExpansion((short) 11));
v.put(StatusTable.COL_SCPWME11O, ra.getSCPwmExpansionOverride((short) 11));
v.put(StatusTable.COL_SCPWME12, ra.getSCPwmExpansion((short) 12));
v.put(StatusTable.COL_SCPWME12O, ra.getSCPwmExpansionOverride((short) 12));
v.put(StatusTable.COL_SCPWME13, ra.getSCPwmExpansion((short) 13));
v.put(StatusTable.COL_SCPWME13O, ra.getSCPwmExpansionOverride((short) 13));
v.put(StatusTable.COL_SCPWME14, ra.getSCPwmExpansion((short) 14));
v.put(StatusTable.COL_SCPWME14O, ra.getSCPwmExpansionOverride((short) 14));
v.put(StatusTable.COL_SCPWME15, ra.getSCPwmExpansion((short) 15));
v.put(StatusTable.COL_SCPWME15O, ra.getSCPwmExpansionOverride((short) 15));
v.put(StatusTable.COL_DCM, ra.getDCPumpValue(Controller.DCPUMP_MODE));
v.put(StatusTable.COL_DCS, ra.getDCPumpValue(Controller.DCPUMP_SPEED));
v.put(StatusTable.COL_DCD, ra.getDCPumpValue(Controller.DCPUMP_DURATION));
v.put(StatusTable.COL_DCT, ra.getDCPumpValue(Controller.DCPUMP_THRESHOLD));
rapp.getContentResolver().insert(Uri.parse(StatusProvider.CONTENT_URI + "/"
+ StatusProvider.PATH_STATUS), v);
// Clear the error retry count on successful insertion of data
rapp.clearErrorRetryCount();
if (raprefs.isNotificationEnabled()) {
// launch the notification check service
Intent n = new Intent(rapp, NotificationService.class);
n.setAction(MessageCommands.NOTIFICATION_INTENT);
rapp.startService(n);
}
Intent u = new Intent(MessageCommands.UPDATE_DISPLAY_DATA_INTENT);
rapp.sendBroadcast(u, Permissions.QUERY_STATUS);
}
private void broadcastUpdateStatus(int msgid) {
Intent i = new Intent(MessageCommands.UPDATE_STATUS_INTENT);
i.putExtra(MessageCommands.UPDATE_STATUS_ID, msgid);
rapp.sendBroadcast(i, Permissions.QUERY_STATUS);
}
private void broadcastErrorMessage() {
Intent i = new Intent(rapp, NotificationService.class);
i.setAction(MessageCommands.NOTIFICATION_ERROR_INTENT);
rapp.startService(i);
}
}