/* * Copyright (C) 2012 Michal Minar * Copyright (C) 2012 Radek Novacek * * 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 * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include "Cura_FanSensor.h" #include "fan.h" #include static const CMPIBroker* _cb = NULL; static void Cura_FanSensorInitialize() { init_linux_fan_module(); } static CMPIStatus Cura_FanSensorCleanup( CMPIInstanceMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Cura_FanSensorEnumInstanceNames( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { return KDefaultEnumerateInstanceNames( _cb, mi, cc, cr, cop); } static CMPIStatus Cura_FanSensorEnumInstances( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { char buf[200]; struct cim_fan *sptr = NULL; struct fanlist *lptr = NULL, *fans = NULL; if (enum_all_fans(&fans) != 0 ) { KReturn2(_cb, ERR_FAILED, "Could not list get fan list."); } lptr = fans; // iterate fan list while (lptr) { sptr = lptr->f; Cura_FanSensor w; Cura_FanSensor_Init(&w, _cb, KNameSpace(cop)); Cura_FanSensor_Set_CreationClassName(&w, "Cura_FanSensor"); Cura_FanSensor_Set_SystemCreationClassName(&w, get_system_creation_class_name()); Cura_FanSensor_Set_SystemName(&w, get_system_name()); Cura_FanSensor_Set_DeviceID(&w, sptr->device_id); Cura_FanSensor_Set_Caption(&w, "Computer's fan"); Cura_FanSensor_Set_Description(&w,"Computer's fan."); snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name, sptr->chip_name); Cura_FanSensor_Set_ElementName(&w, buf); // ManagedSystemElement Cura_FanSensor_Set_Name(&w, sptr->name); Cura_FanSensor_Init_OperationalStatus(&w, 2); Cura_FanSensor_Set_OperationalStatus(&w, 0, sptr->fault ? Cura_FanSensor_OperationalStatus_Error : Cura_FanSensor_OperationalStatus_OK); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { Cura_FanSensor_Set_OperationalStatus(&w, 1, Cura_FanSensor_OperationalStatus_Stressed); } Cura_FanSensor_Init_StatusDescriptions(&w, 2); Cura_FanSensor_Set_StatusDescriptions(&w, 0, sptr->fault ? "Chip indicates, that fan is in fault state." " Possible causes are open diodes, unconnected fan etc." " Thus the measurement for this channel should not be trusted." : "Fan seems to be functioning correctly."); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { snprintf(buf, 200, "These alarm flags are set by the fan's chip:" " alarm=%s, min_alarm=%s, max_alarm=%s", sptr->alarm ? "1":"0", sptr->alarm_min ? "1":"0", sptr->alarm_max ? "1":"0"); Cura_FanSensor_Set_StatusDescriptions(&w, 1, buf); } Cura_FanSensor_Set_HealthState(&w, sptr->fault ? Cura_FanSensor_HealthState_Major_failure : Cura_FanSensor_HealthState_OK); Cura_FanSensor_Set_OperatingStatus(&w, sptr->fault ? Cura_FanSensor_OperatingStatus_Stopped : Cura_FanSensor_OperatingStatus_In_Service); Cura_FanSensor_Set_PrimaryStatus(&w, sptr->fault ? Cura_FanSensor_PrimaryStatus_Error : Cura_FanSensor_PrimaryStatus_OK); // EnabledLogicalElement Cura_FanSensor_Init_OtherIdentifyingInfo(&w, 2); Cura_FanSensor_Set_OtherIdentifyingInfo(&w, 0, sptr->chip_name); Cura_FanSensor_Set_OtherIdentifyingInfo(&w, 1, sptr->sys_path); Cura_FanSensor_Init_IdentifyingDescriptions(&w, 2); Cura_FanSensor_Set_IdentifyingDescriptions(&w, 0, "ChipName - name of fan's chip."); Cura_FanSensor_Set_IdentifyingDescriptions(&w, 1, "SysPath - system path of fan's chip."); // ManagedElement Cura_FanSensor_Set_Caption(&w, "Fan's tachometer"); Cura_FanSensor_Set_Description(&w,"Associated sensor of fan. Giving information about its speed."); snprintf(buf, 200, "Tachometer of fan \"%s\" on chip \"%s\"", sptr->name, sptr->chip_name); Cura_FanSensor_Set_ElementName(&w, buf); // Sensor Cura_FanSensor_Set_SensorType(&w, Cura_FanSensor_SensorType_Tachometer); Cura_FanSensor_Set_CurrentState(&w, fan_get_current_state(sptr)); Cura_FanSensor_Init_PossibleStates(&w, 5); int index = 0; if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { Cura_FanSensor_Set_PossibleStates(&w, index++, "Below Minimum"); Cura_FanSensor_Set_PossibleStates(&w, index++, "At Minimum"); } Cura_FanSensor_Set_PossibleStates(&w, index++, "Normal"); if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { Cura_FanSensor_Set_PossibleStates(&w, index++, "At Maximum"); Cura_FanSensor_Set_PossibleStates(&w, index++, "Above Maximum"); } // NumericSensor Cura_FanSensor_Set_BaseUnits(&w, Cura_FanSensor_BaseUnits_Revolutions); Cura_FanSensor_Set_UnitModifier(&w, 0); Cura_FanSensor_Set_RateUnits(&w, Cura_FanSensor_RateUnits_Per_Minute); Cura_FanSensor_Set_CurrentReading(&w, sptr->speed); if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { Cura_FanSensor_Set_NormalMax(&w, sptr->max_speed); } if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { Cura_FanSensor_Set_NormalMin(&w, sptr->min_speed); } Cura_FanSensor_Set_MinReadable(&w, 0); Cura_FanSensor_Set_IsLinear(&w, true); KReturnInstance(cr, w); lptr = lptr->next; } CMReturn(CMPI_RC_OK); } static CMPIStatus Cura_FanSensorGetInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { return KDefaultGetInstance( _cb, mi, cc, cr, cop, properties); } static CMPIStatus Cura_FanSensorCreateInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanSensorModifyInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci, const char** properties) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanSensorDeleteInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanSensorExecQuery( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* lang, const char* query) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } CMInstanceMIStub( Cura_FanSensor, Cura_FanSensor, _cb, Cura_FanSensorInitialize()) static CMPIStatus Cura_FanSensorMethodCleanup( CMPIMethodMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Cura_FanSensorInvokeMethod( CMPIMethodMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* meth, const CMPIArgs* in, CMPIArgs* out) { return Cura_FanSensor_DispatchMethod( _cb, mi, cc, cr, cop, meth, in, out); } CMMethodMIStub( Cura_FanSensor, Cura_FanSensor, _cb, Cura_FanSensorInitialize()) KUint32 Cura_FanSensor_RequestStateChange( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KUint16* RequestedState, KRef* Job, const KDateTime* TimeoutPeriod, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_SetPowerState( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KUint16* PowerState, const KDateTime* Time, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_Reset( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_EnableDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KBoolean* Enabled, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_OnlineDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KBoolean* Online, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_QuiesceDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KBoolean* Quiesce, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_SaveProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_RestoreProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_RestoreDefaultThresholds( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_FanSensor_GetNonLinearFactors( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanSensorRef* self, const KSint32* SensorReading, KSint32* Accuracy, KUint32* Resolution, KSint32* Tolerance, KUint32* Hysteresis, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KONKRET_REGISTRATION( "root/cimv2", "Cura_FanSensor", "Cura_FanSensor", "instance method")