// HomeAutomation software to accompany the book // 'Practical Arduino + Android Projects for the Evil Genius' // Copyright (C) 2011. Simon Monk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. package com.simonmonk.home; import java.util.HashMap; import android.content.SharedPreferences; public class ResponseHelper { HomeActivity mActivity; public ResponseHelper(HomeActivity activity) { mActivity = activity; } public String generateResponse(String page, String server, HashMap<String, String> params) { String response = ""; Template t; Template head = new Template("head", mActivity); response = response + head.toString(); if (page.startsWith("heating")) { // redirect for deg C or F page += getSetting("UNITS", "F"); } t = new Template(page, mActivity); handleActions(page, params, t); response = response + t.toString(); Template foot = new Template("foot", mActivity); response = response + foot.toString(); return response; } private void handleActions(String page, HashMap<String, String> params, Template t) { if ("power".equalsIgnoreCase(page)) { handlePower(params, t); } else if ("timers".equalsIgnoreCase(page)) { handleTimers(params, t); } else if ("door".equalsIgnoreCase(page)) { handleDoor(params, t); } else if ("bedtime".equalsIgnoreCase(page)) { handleBedtime(params, t); } else if (page.startsWith("heating")) // two templates (C and F) one handler { handleHeating(params, t); } } private void handlePower(HashMap<String, String> params, Template t) { // power sockets are outputs 10-13 t.set("POWERNAME1", getSetting("POWERNAME1", "Outlet 1")); t.set("POWERNAME2", getSetting("POWERNAME2", "Outlet 2")); t.set("POWERNAME3", getSetting("POWERNAME3", "Lights 1")); t.set("POWERNAME4", getSetting("POWERNAME4", "Lights 2")); String light = params.get("l"); String state = params.get("s"); DigitalOutputs outputs = mActivity.outputs; if (light != null && state != null) { int stateInt = Integer.parseInt(state); if (light.equalsIgnoreCase("A")) { outputs.setOutput(0x01, stateInt); outputs.setOutput(0x02, stateInt); outputs.setOutput(0x03, stateInt); outputs.setOutput(0x04, stateInt); } else { outputs.setOutput(Integer.parseInt(light), stateInt); } } } private void handleTimers(HashMap<String, String> params, Template t) { t.set("POWERNAME1", getSetting("POWERNAME1", "Socket 1")); t.set("POWERNAME2", getSetting("POWERNAME2", "Socket 2")); t.set("POWERNAME3", getSetting("POWERNAME3", "Socket 3")); t.set("POWERNAME4", getSetting("POWERNAME4", "Socket 4")); for (int i = 1; i <= 5; i++) { t.set("TIMER_ITEM"+i, getParameterOrStored("item"+i, "TIMER_OP"+i, "null", params)); t.set("TIMER_ON"+i, getParameterOrStored("on"+i, "TIMER_ON"+i, "null", params)); t.set("TIMER_OFF"+i, getParameterOrStored("off"+i, "TIMER_OFF"+i, "null", params)); } } private void handleHeating(HashMap<String, String> params, Template t) { String[] keys = {"0004", "0406", "0607", "0708", "0809", "0912", "1215", "1516", "1617", "1722", "2223", "2324" }; for (int i = 0; i < 12; i++) { t.set("TEMP_d" + keys[i], getParameterOrStored("d"+ keys[i], "TEMP_d" + keys[i], "0", params)); t.set("TEMP_w" + keys[i], getParameterOrStored("w"+ keys[i], "TEMP_w" + keys[i], "0", params)); } } private void handleDoor(HashMap<String, String> params, Template t) { String storedPassword = getSetting("PASSWORD", ""); String doorKeyS = getSetting("DOORKEY", ""); int doorKey = Integer.parseInt(doorKeyS, 16); String enteredPassword = params.get("password"); String action = params.get("action"); if ("1".equals(action) || "0".equals(action)) { if (storedPassword.equals(enteredPassword)) { t.set("STATUS", "<p>DOOR UNLOCKED</p>"); t.set("PASSWORD_WRONG", ""); new Beeper().beep(doorKey); // do it 3 times, EF link unreliable new Beeper().beep(doorKey); new Beeper().beep(doorKey); } else { t.set("PASSWORD_WRONG", "<p>Incorrect Password</p>"); t.set("STATUS", ""); } } else { t.set("PASSWORD_WRONG", ""); t.set("STATUS", ""); } } private void handleBedtime(HashMap<String, String> params, Template t) { String action = params.get("action"); if ("off".equals(action) ) { DigitalOutputs outputs = mActivity.outputs; // turn off the power outputs.setOutput(0x01, 0); outputs.setOutput(0x02, 0); outputs.setOutput(0x03, 0); outputs.setOutput(0x03, 0); t.set("CLOCK_MESSAGE", "GOODNIGHT!"); t.set("FIRST_TIME", "false"); } else { t.set("CLOCK_MESSAGE", "READY!"); t.set("FIRST_TIME", "true"); } } private String getParameterOrStored(String paramName, String storedName, String initial, HashMap<String, String> params) { // Parameter takes precidence over stored, and finally initial value // if you get the value as a papam also store it String value = params.get(paramName); if (value == null || "".equals(value)) { value = getSetting(storedName, initial); } else { setSetting(storedName, value); } return value; } String getSetting(String name, String initial) { SharedPreferences settings = mActivity.getSharedPreferences(PrefsActivity.PREFS_NAME, 0); return settings.getString(name, initial); } void setSetting(String name, String value) { SharedPreferences settings = mActivity.getSharedPreferences(PrefsActivity.PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putString(name, value); editor.commit(); } }