text: /**
   ******************************************************************************
   * @file    application.cpp
   * @authors Satish Nair, Zachary Crockett, Mohit Bhoite and Brett Walach
   * @version V1.0.1
   * @date    27-February-2015
   * @brief   Tinker application
   ******************************************************************************
    Copyright (c) 2013-2015 Particle Industries, Inc.  All rights reserved.
  
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser 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
    Lesser General Public License for more details.
  
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, see <http://www.gnu.org/licenses/>.
   ******************************************************************************
   */
  
  /* Includes ------------------------------------------------------------------*/
  #include "application.h"
  
  // ALL_LEVEL, TRACE_LEVEL, DEBUG_LEVEL, WARN_LEVEL, ERROR_LEVEL, PANIC_LEVEL, NO_LOG_LEVEL
  SerialDebugOutput debugOutput(115200, ALL_LEVEL);
  
  /* Function prototypes -------------------------------------------------------*/
  int tinkerDigitalRead(String pin);
  int tinkerDigitalWrite(String command);
  int tinkerAnalogRead(String pin);
  int tinkerAnalogWrite(String command);
  
  SYSTEM_MODE(SEMI_AUTOMATIC);
  
  /* This function is called once at start up ----------------------------------*/
  void setup()
  {
  	delay(3000);
  	DEBUG_D("Hello from the Electron! Boot time is: %d\r\n",millis());
  
  	Particle.connect(); // blocking call to connect
  
  	//Register all the Tinker functions
  	Particle.function("digitalread", tinkerDigitalRead);
  	Particle.function("digitalwrite", tinkerDigitalWrite);
  
  	Particle.function("analogread", tinkerAnalogRead);
  	Particle.function("analogwrite", tinkerAnalogWrite);
  }
  
  /* This function loops forever --------------------------------------------*/
  void loop()
  {
  	//This will run in a loop
  }
  
  /*******************************************************************************
   * Function Name  : tinkerDigitalRead
   * Description    : Reads the digital value of a given pin
   * Input          : Pin
   * Output         : None.
   * Return         : Value of the pin (0 or 1) in INT type
                      Returns a negative number on failure
   *******************************************************************************/
  int tinkerDigitalRead(String pin)
  {
  	//convert ascii to integer
  	int pinNumber = pin.charAt(1) - '0';
  	//Sanity check to see if the pin numbers are within limits
  	if (pinNumber< 0 || pinNumber >7) return -1;
  
  	if(pin.startsWith("D"))
  	{
  		pinMode(pinNumber, INPUT_PULLDOWN);
  		return digitalRead(pinNumber);
  	}
  	else if (pin.startsWith("A"))
  	{
  		pinMode(pinNumber+10, INPUT_PULLDOWN);
  		return digitalRead(pinNumber+10);
  	}
  	return -2;
  }
  
  /*******************************************************************************
   * Function Name  : tinkerDigitalWrite
   * Description    : Sets the specified pin HIGH or LOW
   * Input          : Pin and value
   * Output         : None.
   * Return         : 1 on success and a negative number on failure
   *******************************************************************************/
  int tinkerDigitalWrite(String command)
  {
  	bool value = 0;
  	//convert ascii to integer
  	int pinNumber = command.charAt(1) - '0';
  	//Sanity check to see if the pin numbers are within limits
  	if (pinNumber< 0 || pinNumber >7) return -1;
  
  	if(command.substring(3,7) == "HIGH") value = 1;
  	else if(command.substring(3,6) == "LOW") value = 0;
  	else return -2;
  
  	if(command.startsWith("D"))
  	{
  		pinMode(pinNumber, OUTPUT);
  		digitalWrite(pinNumber, value);
  		return 1;
  	}
  	else if(command.startsWith("A"))
  	{
  		pinMode(pinNumber+10, OUTPUT);
  		digitalWrite(pinNumber+10, value);
  		return 1;
  	}
  	else return -3;
  }
  
  /*******************************************************************************
   * Function Name  : tinkerAnalogRead
   * Description    : Reads the analog value of a pin
   * Input          : Pin
   * Output         : None.
   * Return         : Returns the analog value in INT type (0 to 4095)
                      Returns a negative number on failure
   *******************************************************************************/
  int tinkerAnalogRead(String pin)
  {
  	//convert ascii to integer
  	int pinNumber = pin.charAt(1) - '0';
  	//Sanity check to see if the pin numbers are within limits
  	if (pinNumber< 0 || pinNumber >7) return -1;
  
  	if(pin.startsWith("D"))
  	{
  		return -3;
  	}
  	else if (pin.startsWith("A"))
  	{
  		return analogRead(pinNumber+10);
  	}
  	return -2;
  }
  
  /*******************************************************************************
   * Function Name  : tinkerAnalogWrite
   * Description    : Writes an analog value (PWM) to the specified pin
   * Input          : Pin and Value (0 to 255)
   * Output         : None.
   * Return         : 1 on success and a negative number on failure
   *******************************************************************************/
  int tinkerAnalogWrite(String command)
  {
  	//convert ascii to integer
  	int pinNumber = command.charAt(1) - '0';
  	//Sanity check to see if the pin numbers are within limits
  	if (pinNumber< 0 || pinNumber >7) return -1;
  
  	String value = command.substring(3);
  
  	if(command.startsWith("D"))
  	{
  		pinMode(pinNumber, OUTPUT);
  		analogWrite(pinNumber, value.toInt());
  		return 1;
  	}
  	else if(command.startsWith("A"))
  	{
  		pinMode(pinNumber+10, OUTPUT);
  		analogWrite(pinNumber+10, value.toInt());
  		return 1;
  	}
  	else return -2;
  }
  