/*
 * Author: Marc Graham <marc@m2ag.net>
 * Copyright (c) 2015 Intel Corporation.
 *
 * 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.
 */

#pragma once

#include <iostream>
#include <string>

#include <interfaces/iGas.hpp>

namespace mraa { class I2c;}

namespace upm {
  /**
   * @brief MICS-VZ89 Environmental Sensor
   * @defgroup micsv89 libupm-micsv89
   * @ingroup generic i2c gaseous
   */
  /**
   * @library micsv89
   * @sensor micsv89
   * @comname Low-power Air Quality Sensor
   * @type gaseous
   * @man generic
   * @con i2c
   * @web http://sgx.cdistore.com/datasheets/e2v/MiCS-VZ-86%20and%20VZ-89%20rev%204.pdf
   * @web http://www.sgxsensortech.com/content/uploads/2015/01/MICS-VZ-89-I2C-specs-rev-A.pdf
   *
   * @brief API for the MICS-VZ89 Gas Sensor
   *
   * The MiCS-VZ-86/89 combines state-of-the-art MOS sensor technology with
   * intelligent detection algorithms to monitor VOCs and CO2 equivalent
   * variations in confined spaces.
   *
   * The MICSV89 comes in 4 variants, PWM and I2C in 3.3 volts and 5 volts.
   * This library only implements the I2c version of the device.
   *
   * Device output is not valid until a warm up of 15 minutes of operation.
   *
   * @image html micsv89.jpg
   * @snippet micsv89.cxx Interesting
   */
    class MICSV89: virtual public iGas {
        public:
            /**
             * MICSV89 constructor
             *
             * @param bus i2c bus the sensor is attached to.
             * @param address Device address. Default is 0x70.
             */
            MICSV89 (int bus, uint8_t address = 0x70);

            /**
             * MICSV89 destructor
             */
            ~MICSV89 ();

            /**
             * Returns the name of the sensor
             */
            std::string name()
            {
                return m_name;
            }

            /**
             * Returns the  CO2 equivalent value.
             */
            float co2equ();

            /**
             * Returns the  CO2 equivalent value.
             */
            float getConcentration();

            /**
             * Returns VOC Short value.
             */
            int vocshort();

            /**
             * Returns Total VOC.
             */
            float tvoc();

            /**
             * Returns resistor value.
             */
            float resistor();

            /**
             * Performs a write/read cycle.
             */
            void update();

            /**
             * Returns true if a valid write/read cycle has been completed.
             * At startup and during write/read cycle will be false.
             */
            bool valid()
            {
                return m_valid;
            }

        private:
            /* Disable implicit copy and assignment operators */
            MICSV89(const MICSV89&) = delete;
            MICSV89 &operator=(const MICSV89&) = delete;

            std::string m_name;
            bool m_valid;
            uint8_t m_address;
            uint8_t rx_buf[6];
            uint8_t tx_buf[3];
            mraa::I2c* i2c;
    };
}
