diff options
Diffstat (limited to 'src/fan/cmpiLinux_FanSensor.c')
-rw-r--r-- | src/fan/cmpiLinux_FanSensor.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/src/fan/cmpiLinux_FanSensor.c b/src/fan/cmpiLinux_FanSensor.c new file mode 100644 index 0000000..bbe8b22 --- /dev/null +++ b/src/fan/cmpiLinux_FanSensor.c @@ -0,0 +1,141 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * <http://www.gnu.org/licenses/>. + */ +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <stdint.h> +#include <cmpi/cmpimacs.h> +#include <sblim/OSBase_Common.h> +#include <sblim/cmpiOSBase_Common.h> + +#include "cmpiLinux_FanSensor.h" + +static CMPIArray * _get_PossibleStates( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + int index = 0; + + CMPIArray *res = CMNewArray(_broker, 5, CMPI_string, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 5, CMPI_string, rc)"); + _OSBASE_TRACE(2, ("--- _get_AccessibleFeatures failed: %s", + CMGetCharPtr(rc->msg))); + }else { + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + CMSetArrayElementAt(res, index++, "Below Minimum", CMPI_chars); + CMSetArrayElementAt(res, index++, "At Minumum", CMPI_chars); + } + CMSetArrayElementAt(res, index++, "Normal", CMPI_chars); + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + CMSetArrayElementAt(res, index++, "At Maximum", CMPI_chars); + CMSetArrayElementAt(res, index++, "Above Maximum", CMPI_chars); + } + } + return res; +} + +static char const * _get_CurrentState( + struct cim_fan const *sptr) +{ + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + if (sptr->speed < sptr->min_speed) return "Below Minimum"; + if (sptr->speed == sptr->min_speed) return "At Minimum"; + } + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + if (sptr->speed > sptr->max_speed) return "Above Maximum"; + if (sptr->speed == sptr->max_speed) return "At Maximum"; + } + return "Normal"; +} + + +CMPIObjectPath * _makePath_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + return _makePath_FanCommon(_ClassName, _broker, ctx, cop, sptr, rc); +} + +CMPIInstance * _makeInst_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + CMPIObjectPath *op; + CMPIInstance *ci; + CMPIValue val; + + char buf[200]; + + _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() called")); + if (!(ci = _makeInst_FanCommon(_ClassName, _broker, ctx, cop, properties, + sptr, rc, &op))) { + return NULL; + } + + // ManagedElement + CMSetProperty(ci, "Caption", "Fan's tachometer", CMPI_chars); + CMSetProperty(ci, "Description", "Associated sensor of fan." + " Giving information about its speed.", CMPI_chars); + snprintf(buf, 200, "Tachometer of fan \"%s\" on chip \"%s\"", sptr->name, + sptr->chip_name); + CMSetProperty(ci, "ElementName", buf, CMPI_chars); + + // Sensor + val.uint16 = 5; // Tachometer + CMSetProperty(ci, "SensorType", &val, CMPI_uint16); + val.array = _get_PossibleStates(_broker, rc, sptr); + CMSetProperty(ci, "PossibleStates", &val, CMPI_stringA); + CMSetProperty(ci, "CurrentState", _get_CurrentState(sptr), CMPI_chars); + + // NumericSensor + val.uint16 = 38; // Revolutions + CMSetProperty(ci, "BaseUnits", &val, CMPI_uint16); + val.sint32 = 0; + CMSetProperty(ci, "UnitModifier", &val, CMPI_sint32); + val.uint16 = 4; // Per Minute + CMSetProperty(ci, "RateUnits", &val, CMPI_uint16); + val.sint32 = (int32_t) sptr->speed; + CMSetProperty(ci, "CurrentReading", &val, CMPI_sint32); + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + val.sint32 = (int32_t) sptr->min_speed; + CMSetProperty(ci, "NormalMax", &val, CMPI_sint32); + } + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + val.sint32 = (int32_t) sptr->min_speed; + CMSetProperty(ci, "NormalMin", &val, CMPI_sint32); + } + val.sint32 = 0; + CMSetProperty(ci, "MinReadable", &val, CMPI_sint32); + val.boolean = true; + CMSetProperty(ci, "IsLinear", &val, CMPI_boolean); + + // Linux_FanSensor + + _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() exited")); + return ci; +} + |