gt:         Command m = new Command();
context: /**
   *
   * Copyright (c) 2009-2014 Freedomotic team
   * http://freedomotic.com
   *
   * This file is part of Freedomotic
   *
   * 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 2, 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 Freedomotic; see the file COPYING.  If not, see
   * <http://www.gnu.org/licenses/>.
   */
  
  package com.freedomotic.things.impl;
  
  import com.freedomotic.model.ds.Config;
  import com.freedomotic.model.object.BooleanBehavior;
  import com.freedomotic.model.object.ListBehavior;
  import com.freedomotic.model.object.RangedIntBehavior;
  import com.freedomotic.behaviors.BooleanBehaviorLogic;
  import com.freedomotic.behaviors.ListBehaviorLogic;
  import com.freedomotic.behaviors.RangedIntBehaviorLogic;
  import com.freedomotic.reactions.Command;
  
  /**
   *
   * @author gpt
   */
  
  public class TV extends ElectricDevice {
  
      public RangedIntBehaviorLogic volume;
      public RangedIntBehaviorLogic channel; //Maybe the channell is not a behavior. Only an action. 
      //(In the Kuro TV can't ask to the current channel
      public ListBehaviorLogic input; // I defined it as a RangedIt because each TV model has its own inputs   
      public BooleanBehaviorLogic muted;
      public ListBehaviorLogic avSelection;
      public ListBehaviorLogic screenMode;
  
      @Override
      public void init() {
  
  
          //linking this property with the behavior defined in the XML
          volume = new RangedIntBehaviorLogic((RangedIntBehavior) getPojo().getBehavior("volume"));
          volume.addListener(new RangedIntBehaviorLogic.Listener() {
              @Override
              public void onLowerBoundValue(Config params, boolean fireCommand) {
                  //turnPowerOff(params);
              }
  
              @Override
              public void onUpperBoundValue(Config params, boolean fireCommand) {
                  //turnPowerOn(params);
              }
  
              @Override
              public void onRangeValue(int rangeValue, Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetVolume(rangeValue, params);
                  } else {
                      setVolume(rangeValue);
                  }
              }
          });
          registerBehavior(volume);
  
          //linking this property with the behavior defined in the XML
          channel = new RangedIntBehaviorLogic((RangedIntBehavior) getPojo().getBehavior("channel"));
  
          channel.addListener(new RangedIntBehaviorLogic.Listener() {
              @Override
              public void onLowerBoundValue(Config params, boolean fireCommand) {
              }
  
              @Override
              public void onUpperBoundValue(Config params, boolean fireCommand) {
              }
  
              @Override
              public void onRangeValue(int rangeValue, Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetChannel(rangeValue, params);
                  } else {
                      setChannel(rangeValue);
                  }
              }
          });
          registerBehavior(channel);
  
  
          //linking this property with the behavior defined in the XML
          input = new ListBehaviorLogic((ListBehavior) getPojo().getBehavior("input"));
          input.addListener(new ListBehaviorLogic.Listener() {
              @Override
              public void selectedChanged(Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetInput(params);
                  } else {
                      setInput(params.getProperty("value"));
                  }
              }
          });
          registerBehavior(input);
  
          //linking this powered property with the muted behavior defined in the XML
          muted = new BooleanBehaviorLogic((BooleanBehavior) getPojo().getBehavior("muted"));
          muted.addListener(new BooleanBehaviorLogic.Listener() {
              @Override
              public void onTrue(Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetMuteOn(params);
                  } else {
                      setMuteOn();
                  }
              }
  
              @Override
              public void onFalse(Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetMuteOff(params);
                  } else {
                      setMuteOff();
                  }
              }
          });
          registerBehavior(muted);
  
          //linking this powered property with the avSelection behavior defined in the XML
          avSelection = new ListBehaviorLogic((ListBehavior) getPojo().getBehavior("avselection"));
          avSelection.addListener(new ListBehaviorLogic.Listener() {
              @Override
              public void selectedChanged(Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetAVSelection(params);
                  } else {
                      setAVSelection(params.getProperty("value"));
                  }
              }
          });
          registerBehavior(avSelection);
  
          //linking this powered property with the screenMode behavior defined in the XML
          screenMode = new ListBehaviorLogic((ListBehavior) getPojo().getBehavior("screenMode"));
          screenMode.addListener(new ListBehaviorLogic.Listener() {
              //TODO: in the kuro the screen modes available depends of the source.
              @Override
              public void selectedChanged(Config params, boolean fireCommand) {
                  if (fireCommand) {
                      executeSetScreenMode(params);
                  } else {
                      setScreenMode(params.getProperty("value"));
                  }
              }
          });
          registerBehavior(screenMode);
          super.init();
      }
  
      public void executeSetVolume(int rangeValue, Config params) {
          boolean executed = executeCommand("set volume", params); //executes the developer level command associated with 'set volume' action
          if (executed) {
              setVolume(rangeValue);
              //TODO: set the light graphical representation
              //setCurrentRepresentation(1); //points to the second element in the XML views array (light on image)
              setChanged(true);
          }
      }
  
      public void setVolume(int rangeValue) {
          if (volume.getValue() != rangeValue) {
              volume.setValue(rangeValue);
              setChanged(true);
          }
      }
  
      public void setVolumeUp(Config params) {
          boolean executed = executeCommand("set volume up", params); //executes the developer level command associated with 'set channel' action
          if (executed) {
              if (volume.getValue() != volume.getMax()) {
                  volume.setValue(volume.getValue() + 1);
                  //TODO: set the TV graphical representation
                  //setView(1); //points to the second element in the XML views array (light on image)
                  setChanged(true);
              }
          }
      }
  
      public void setVolumeDown(Config params) {
          boolean executed = executeCommand("set volume down", params); //executes the developer level command associated with 'set channel' action
          if (executed) {
              if (volume.getValue() != volume.getMin()) {
                  volume.setValue(volume.getValue() - 1);
                  //TODO: set the TV graphical representation
                  //setView(1); //points to the second element in the XML views array (light on image)
                  setChanged(true);
              }
          }
      }
  
      public void executeSetChannel(int rangeValue, Config params) {
          boolean executed = executeCommand("set channel", params); //executes the developer level command associated with 'set volume' action
          if (executed) {
              setChannel(rangeValue);
              setChanged(true);
          }
  
      }
  
      public void setChannel(int rangeValue) {
          if (channel.getValue() != rangeValue) {
              channel.setValue(rangeValue);
              setChanged(true);
          }
      }
  
      public void setChannelUp(Config params) {
          boolean executed = executeCommand("set channel up", params); //executes the developer level command associated with 'set channel' action
          if (executed) {
              if (channel.getValue() != channel.getMax()) {
                  channel.setValue(channel.getValue() + 1);
                  powered.setValue(true); //select a channel turn on the tv automatically. This is for coherence.
                  //TODO: set the TV graphical representation
                  //setView(1); //points to the second element in the XML views array (light on image)
                  setChanged(true);
              }
          }
      }
  
      public void setChannelDown(Config params) {
          boolean executed = executeCommand("set channel down", params); //executes the developer level command associated with 'set channel' action
          if (executed) {
              if (channel.getValue() != channel.getMin()) {
                  channel.setValue(channel.getValue() - 1);
                  powered.setValue(true); //select a channel turn on the tv automatically. This is for coherence.
                  //TODO: set the TV graphical representation
                  //setView(1); //points to the second element in the XML views array (light on image)
                  setChanged(true);
              }
          }
      }
  
      public void executeSetInput(Config params) {
          boolean executed = executeCommand("set input", params);
          if (executed) {
              setInput(params.getProperty("value"));
              setChanged(true);
          }
      }
  
      public void setInput(String value) {
          if (!input.getSelected().equals(value)) {
              input.setSelected(value);
              setChanged(true);
          }
      }
  
      public void executeSetMuteOn(Config params) {
          boolean executed = executeCommand("mute on", params);
          if (executed) {
              setMuteOn();
              setChanged(true);
          }
  
      }
  
      public void setMuteOn() {
          if (muted.getValue() != true) {
              muted.setValue(true);
              setChanged(true);
          }
      }
  
      public void executeSetMuteOff(Config params) {
          boolean executed = executeCommand("mute off", params);
          if (executed) {
              setMuteOff();
              setChanged(true);
          }
  
      }
  
      public void setMuteOff() {
          if (muted.getValue() != false) {
              muted.setValue(false);
              setChanged(true);
          }
      }
  
      public void executeSetAVSelection(Config params) {
          boolean executed = executeCommand("set avselection", params);
          if (executed) {
              setAVSelection(params.getProperty("value"));
              setChanged(true);
          }
      }
  
      public void setAVSelection(String value) {
          if (!avSelection.getSelected().equals(value)) {
              avSelection.setSelected(value);
              setChanged(true);
          }
      }
  
      public void executeSetScreenMode(Config params) {
          boolean executed = executeCommand("set screenmode", params);
          if (executed) {
              setScreenMode(params.getProperty("value"));
              setChanged(true);
          }
      }
  
      public void setScreenMode(String value) {
          if (!screenMode.getSelected().equals(value)) {
              screenMode.setSelected(value);
              setChanged(true);
          }
      }
  
      @Override
      protected void createCommands() {
          super.createCommands();
  
          Command a = new Command();
          a.setName("Set " + getPojo().getName() + " volume to 50%");
          a.setDescription("the TV " + getPojo().getName() + " changes its volume to 50%");
          a.setReceiver("app.events.sensors.behavior.request.objects");
          a.setProperty("object", getPojo().getName());
          a.setProperty("behavior", "volume");
          a.setProperty("value", "50");
  
          Command b = new Command();
          b.setName(getPojo().getName() + " volume up");
          b.setDescription("increases " + getPojo().getName() + " volume of one step");
          b.setReceiver("app.events.sensors.behavior.request.objects");
          b.setProperty("object", getPojo().getName());
          b.setProperty("behavior", "volume");
          b.setProperty("value", "next");
  
          Command c = new Command();
          c.setName(getPojo().getName() + " volume down");
          c.setDescription("decreases " + getPojo().getName() + " volume of one step");
          c.setReceiver("app.events.sensors.behavior.request.objects");
          c.setProperty("object", getPojo().getName());
          c.setProperty("behavior", "volume");
          c.setProperty("value", "previous");
  
          Command d = new Command();
          d.setName("Set its volume to 50%");
          d.setDescription("set its volume to 50%");
          d.setReceiver("app.events.sensors.behavior.request.objects");
          d.setProperty("object", "@event.object.name");
          d.setProperty("behavior", "volume");
          d.setProperty("value", "50");
  
          Command e = new Command();
          e.setName("Increase its volume");
          e.setDescription("increases its volume of one step");
          e.setReceiver("app.events.sensors.behavior.request.objects");
          e.setProperty("object", "@event.object.name");
          e.setProperty("behavior", "volume");
          e.setProperty("value", "next");
  
          Command f = new Command();
          f.setName("Decrease its volume");
          f.setDescription("decreases its volume of one step");
          f.setReceiver("app.events.sensors.behavior.request.objects");
          f.setProperty("object", "@event.object.name");
          f.setProperty("behavior", "volume");
          f.setProperty("value", "previous");
  
  
          Command g = new Command();
          g.setName("Set its volume to the value in the event");
          g.setDescription("set its volume to the value in the event");
          g.setReceiver("app.events.sensors.behavior.request.objects");
          g.setProperty("object", "@event.object.name");
          g.setProperty("behavior", "volume");
          g.setProperty("value", "@event.value");
  
          Command h = new Command();
          h.setName(getPojo().getName() + " channel down");
          h.setDescription("turns " + getPojo().getName() + " to the previous channel in the list");
          h.setReceiver("app.events.sensors.behavior.request.objects");
          h.setProperty("object", getPojo().getName());
          h.setProperty("behavior", "channel");
          h.setProperty("value", "previous");
  
          Command i = new Command();
          i.setName("Mute " + getPojo().getName());
          i.setDescription("mutes the volume of " + getPojo().getName());
          i.setReceiver("app.events.sensors.behavior.request.objects");
          i.setProperty("object", getPojo().getName());
          i.setProperty("behavior", "muted");
          i.setProperty("value", "true");
  
          Command l = new Command();
          l.setName("Unmute " + getPojo().getName());
          l.setDescription("unmutes the volume of " + getPojo().getName());
          l.setReceiver("app.events.sensors.behavior.request.objects");
          l.setProperty("object", getPojo().getName());
          l.setProperty("behavior", "muted");
          l.setProperty("value", "false");
  
  