/* SPDX-License-Identifier: BSD-3-Clause */
/*
 * Copyright 2009 Raritan Inc. All rights reserved.
 */

#ifndef __TFW_SENSOR_IDL__
#define __TFW_SENSOR_IDL__

#include <Event.idl>

/** Sensors Model */
module sensors {

    /** %Sensor interface */
    interface Sensor_4_0_7 {

        constant int ERR_NOT_SUPPORTED = 1; ///< The operation is not supported

        /** %Sensor reading type */
        constant int NUMERIC = 0;                       //< %Sensor has numeric readings
        constant int DISCRETE_ON_OFF = 1;               //< %Sensor has two discrete readings: 0 (off) and 1 (on), see OnOffState
        constant int DISCRETE_MULTI = 2;                //< %Sensor has multiple discrete readings

        /** Sensor states for DISCRETE_ON_OFF sensors */
        enumeration OnOffState {
            OFF,                        ///< off
            ON                          ///< on
        };

        enumeration OpenClosedState {
            OPEN,                       ///< open
            CLOSED                      ///< closed
        };

        enumeration NormalAlarmedState {
            NORMAL,                     ///< normal (not alarmed)
            ALARMED                     ///< alarmed
        };

        enumeration OkFaultState {
            OK,                         ///< OK
            FAULT                       ///< fault
        };

        /** %Sensor type */
        constant int UNSPECIFIED = 0;                   //< Unspecified

        constant int VOLTAGE = 1;                       //< Voltage
        constant int CURRENT = 2;                       //< Current
        constant int UNBALANCE_CURRENT = 3;             //< Current unbalance
        constant int POWER = 4;                         //< Power
        constant int POWER_FACTOR = 5;                  //< Power factor
        constant int ENERGY = 6;                        //< Energy
        constant int FREQUENCY = 7;                     //< Frequency
        constant int TEMPERATURE = 8;                   //< Temperature
        constant int HUMIDITY = 9;                      //< Relative humidity
        constant int AIR_FLOW = 10;                     //< Air flow
        constant int AIR_PRESSURE = 11;                 //< Air pressure
        constant int CONTACT_CLOSURE = 12;              //< Contact Closure [uses %NormalAlarmedState mapping]
        constant int ON_OFF_SENSOR = 13;                //< Switch state [uses %OnOffState mapping]
        constant int TRIP_SENSOR = 14;                  //< Circuit breaker tripped [uses %OpenClosedState mapping]
        constant int VIBRATION = 15;                    //< Vibration [uses %NormalAlarmedState mapping]
        constant int WATER_LEAK = 16;                   //< Water leak [uses %NormalAlarmedState mapping]
        constant int SMOKE_DETECTOR = 17;               //< Smoke detector [uses %NormalAlarmedState mapping]

        constant int TOTAL_HARMONIC_DISTORTION = 18;    //< Total harmonic distortion

        constant int MASS = 19;                         //< Mass
        constant int ELECTRICAL_RESISTANCE = 20;        //< Electrical resistance
        constant int FLUX = 21;                         //< Flux (mass per time, e.g. water flow)

        constant int LUMINOUS_INTENSITY = 22;           //< Luminous intensity
        constant int ACCELERATION = 23;                 //< Acceleration
        constant int MAGNETIC_FLUX_DENSITY = 24;        //< Magnetic flux density
        constant int ELECTRIC_FIELD_STRENGTH = 25;      //< Electric field strength
        constant int MAGNETIC_FIELD_STRENGTH = 26;      //< Magnetic field strength [uses %NormelAlarmedState mapping if of %DISCRETE_ON_OFF type]
        constant int ANGLE = 27;                        //< Angle (e.g. phase angle)

        constant int SELECTION = 28;                    //< Selected index (one of n)
        constant int FAULT_STATE = 29;                  //< Fault state [uses %NormalAlarmedState mapping if of %DISCRETE_ON_OFF type]
        constant int POWER_QUALITY = 30;                //< Power quality
        constant int ROTATIONAL_SPEED = 31;             //< Rotational speed (e.g. fan speed)

        constant int LUMINOUS_ENERGY = 32;              //< Luminous energy
        constant int LUMINOUS_FLUX = 33;                //< Luminous flux
        constant int ILLUMINANCE = 34;                  //< Illuminance used for light incident on a surface
        constant int LUMINOUS_EMITTANCE = 35;           //< Luminous emittance used for light emitted from a surface

        constant int MOTION = 36;                       //< Motion detection
        constant int OCCUPANCY = 37;                    //< Occupancy detection [uses %NormalAlarmedState mapping]
        constant int TAMPER = 38;                       //< Tamper detection [uses %NormalAlarmedState mapping]
        constant int DRY_CONTACT = 39;                  //< Dry contact (actuator) [uses %OnOffState mapping]
        constant int POWERED_DRY_CONTACT = 40;          //< Powered dry contact (actuator) [uses %OnOffState mapping]

        constant int ABSOLUTE_HUMIDITY = 41;            //< Absolute humidity
        constant int DOOR_STATE = 42;                   //< Door state [uses %OpenClosedState mapping]
        constant int DOOR_LOCK_STATE = 43;              //< Door lock state [uses %OpenClosedState mapping]
        constant int DOOR_HANDLE_LOCK = 44;             //< Door handle switch [uses %OpenClosedState mapping]

        constant int CREST_FACTOR = 45;                 //< Crest factor

        constant int DISTANCE = 46;                     //< Distance
        constant int LENGTH = 47;                       //< Length

        constant int UNBALANCE_VOLTAGE = 48;            //< Voltage unbalance

        constant int PARTICLE_DENSITY = 49;             //< Particle Density

        constant int DEW_POINT = 50;                    //< Dew Point

        constant int ELECTRICAL_IMPEDANCE = 51;         //< Electrical impedance

        constant int TS_BYPASS_STATE = 52;              //< Transfer switch bypass state

        constant int BATTERY_LEVEL = 53;                //< Battery level

        /** %Sensor unit */
        constant int NONE = 0;                          //< No unit
        constant int VOLT = 1;                          //< Electric Potential, Volts (V)
        constant int AMPERE = 2;                        //< Electric Current, Amperes (A)
        constant int WATT = 3;                          //< Electric Power, Watts (W)
        constant int VOLT_AMP = 4;                      //< Electric Capacity, Volt Amperes (VA)
        constant int WATT_HOUR = 5;                     //< Active Energy, Watt hours (Wh)
        constant int VOLT_AMP_HOUR = 6;                 //< Apparent Energy, Volt-Ampere hours (VAh)
        constant int DEGREE_CELSIUS = 7;                //< Temperature, Celsius (deg C)
        constant int HZ = 8;                            //< Frequency, Hertz (Hz)
        constant int PERCENT = 9;                       //< Ratio, Percent (%)
        constant int METER_PER_SEC = 10;                //< Speed, Meters per second (m/s)
        constant int PASCAL = 11;                       //< Pressure, Pascal (Pa)
        constant int G = 12;                            //< Acceleration, G-force (g)
        constant int RPM = 13;                          //< Rotation, Revolutions per minute (rpm)
        constant int METER = 14;                        //< Distance, Meters (m)
        constant int HOUR = 15;                         //< Time, Hours (h)
        constant int MINUTE = 16;                       //< Time, Minutes (min)
        constant int SECOND = 17;                       //< Time, Seconds (s)

        constant int VOLT_AMP_REACTIVE = 18;            //< Reactive Power, Volt Amperes reactive (var)
        constant int VOLT_AMP_REACTIVE_HOUR = 19;       //< Reactive Energy, Volt Ampere reactive hours (varh)

        constant int GRAM = 20;                         //< Mass, Gram (g)
        constant int OHM = 21;                          //< Resistance, Ohm (omega, R)
        constant int LITERS_PER_HOUR = 22;              //< Flow, Liters per hour (l/h)

        constant int CANDELA = 23;                      //< Luminous Intensity, Candela (cd)
        constant int METER_PER_SQUARE_SEC = 24;         //< Acceleration, Meter per square second (m/s^2)
        constant int METER_PER_SQARE_SEC = 24;          //< Typo, preserved for backward compatibility
        constant int TESLA = 25;                        //< Magnetic Flux Density, Tesla (T)
        constant int VOLT_PER_METER = 26;               //< Electric Field, Volt per meter (V/m)
        constant int VOLT_PER_AMPERE = 27;              //< Resistance, Volt per ampere (V/A)
        constant int DEGREE = 28;                       //< Angle, Degrees (deg)

        constant int DEGREE_FAHRENHEIT = 29;            //< Temperature, Fahrenheit (deg F)
        constant int KELVIN = 30;                       //< Temperature, Kelvin (K)
        constant int JOULE = 31;                        //< Energy, Joules (J)
        constant int COULOMB = 32;                      //< Electric Charge, Coulombs (C)
        constant int NIT = 33;                          //< Luminance, Nits (cd/m^2)
        constant int LUMEN = 34;                        //< Luminous Flux, Lumen (lm)
        constant int LUMEN_SECOND = 35;                 //< Luminous Energy, Lumen second (lm s)
        constant int LUX = 36;                          //< Luminous Flux, Lux (lx)
        constant int PSI = 37;                          //< Pressure, Pounds per square inch (psi)
        constant int NEWTON = 38;                       //< Force, Newtons (N, J/m)
        constant int FOOT = 39;                         //< Distance, Feet (ft)
        constant int FOOT_PER_SEC = 40;                 //< Speed, Feet per second (ft/s)
        constant int CUBIC_METER = 41;                  //< Volume, Cubic meters (m^3)
        constant int RADIANT = 42;                      //< Angle, Radians (rad)
        constant int STERADIANT = 43;                   //< Solid Angle, Steradians (sr)
        constant int HENRY = 44;                        //< Inductance, Henries (H, Vs/A, Ohm s)
        constant int FARAD = 45;                        //< Capacitance, Farads (F)
        constant int MOL = 46;                          //< Substance Quantity, Moles (mol)
        constant int BECQUEREL = 47;                    //< Radiation, Becquerels (Bq)
        constant int GRAY = 48;                         //< Radiation, Grays (Gy, J/kg)
        constant int SIEVERT = 49;                      //< Radiation, Sieverts (Sv = J/kg)
        constant int G_PER_CUBIC_METER = 50;            //< Density, Grams per cubic meter (g/m^3)
        constant int UG_PER_CUBIC_METER = 51;           //< Density, Micrograms per cubic meter (µg/m^3)

        /** Complete sensor type specification */
        structure TypeSpec {
            int readingtype;            ///< %Sensor reading type
            int type;                   ///< %Sensor type
            int unit;                   ///< %Sensor unit
        };

        /** Event: The type specification of the sensor changed */
        valueobject TypeSpecChangedEvent extends idl.Event {
            TypeSpec oldTypeSpec;       ///< Type specification before change
            TypeSpec newTypeSpec;       ///< Type specification after change
        };

        /**
         * Retrieve the sensor type specification.
         *
         * @return Type specification
         */
        TypeSpec getTypeSpec();

        /**
         * Check whether the sensor type can be changed using setType().
         *
         * @return \true if type change is allowed
         */
        boolean isTypeChangeAllowed();

        /**
         * Set sensor type and unit
         *
         * @param type  the sensor type to set
         * @param unit  the sensor unit to set
         *
         * @return ERR_NOT_SUPPORTED or 0
         */
        int setType(in int type, in int unit);

    };

}

#endif
