#include <userint.h>
 
#include "mpod_uir.h"
 
 
 
/** WIENER SNMP basic SNMP library to Demonstrate C-Access to WIENER-Crates via SNMP
 
// modified for LabView imprt 04/23/06, Andreas Ruben
 
//
 
// The path to the Net-SNMP include files (default /usr/include) must be added to the 
 
// include file search path!
 
// The following libraries must be included:
 
// netsnmp.lib ws2_32.lib
 
// The path to the Net-SNMP library must be added to the linker files.
 
// /usr/lib
 
// path for the WIENER MIB file (mibdirs) c:/usr/share/snmp/mibs
 
*/
 
 
 
 
 
#include <windows.h>
 
 
 
#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers   
 
 
 
 
 
#include <winsock2.h>
 
#include <ws2tcpip.h>    
 
 
 
#include "netsnmplib.h"  
 
 
 
#include "WIENER_SNMP.h"
 
 
 
  
 
#include "toolbox.h" 
 
#define _strdup StrDup
 
 
 
 
 
 
 
#define WIN32_LEAN_AND_MEAN
 
 
 
 
 
 
 
#include <stdio.h>
 
 
 
 
 
const char* readCommunity = "public";       ///< community name for read operations
 
const char* writeCommunity = "guru";        ///< community name for write operation
 
 
 
 
 
 
 
// System Information OIDS
 
char *S_sysMainSwitch = "sysMainSwitch.0";
 
oid oidSysMainSwitch [MAX_OID_LEN];
 
size_t lengthSysMainSwitch;
 
 
 
char *S_sysStatus = "sysStatus.0";
 
oid oidSysStatus [MAX_OID_LEN];
 
size_t lengthSysStatus;
 
 
 
char *S_sysVmeSysReset = "sysVmeSysReset.0";
 
oid oidSysVmeSysReset [MAX_OID_LEN];
 
size_t lengthSysVmeSysReset;
 
 
 
 
 
//Output Count Information
 
char *S_outputNumber = "outputNumber.0";
 
oid oidOutputNumber [MAX_OID_LEN];
 
size_t lengthOutputNumber;
 
 
 
char *S_groupsNumber = "groupsNumber.0";
 
oid oidGroupsNumber [MAX_OID_LEN];
 
size_t lengthGroupsNumber;
 
 
 
 
 
//Ouput Channel information
 
char *S_outputNameBase = "outputName.";
 
char *S_outputName[1100];
 
oid oidOutputName[1100] [MAX_OID_LEN];
 
size_t lengthOutputName[1100];
 
 
 
char *S_outputGroupBase = "outputGroup.";
 
char *S_outputGroup[1100];
 
oid oidOutputGroup[1100] [MAX_OID_LEN];
 
size_t lengthOutputGroup[1100];
 
 
 
char *S_outputStatusBase = "outputStatus.";
 
char *S_outputStatus[1100];
 
oid oidOutputStatus[1100] [MAX_OID_LEN];
 
size_t lengthOutputStatus[1100];
 
 
 
char *S_outputMeasurementSenseVoltageBase = "outputMeasurementSenseVoltage.";
 
char *S_outputMeasurementSenseVoltage[1100];
 
oid oidOutputMeasurementSenseVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputMeasurementSenseVoltage[1100];
 
 
 
char *S_outputMeasurementTerminalVoltageBase = "outputMeasurementTerminalVoltage.";
 
char *S_outputMeasurementTerminalVoltage[1100];
 
oid oidOutputMeasurementTerminalVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputMeasurementTerminalVoltage[1100];
 
 
 
char *S_outputMeasurementCurrentBase ="outputMeasurementCurrent.";
 
char *S_outputMeasurementCurrent[1100];
 
oid oidOutputMeasurementCurrent[1100] [MAX_OID_LEN];
 
size_t lengthOutputMeasurementCurrent[1100];
 
 
 
char *S_outputMeasurementTemperatureBase ="outputMeasurementTemperature.";
 
char *S_outputMeasurementTemperature[1100];
 
oid oidOutputMeasurementTemperature[1100] [MAX_OID_LEN];
 
size_t lengthOutputMeasurementTemperature[1100];
 
 
 
char *S_outputSwitchBase = "outputSwitch.";
 
char *S_outputSwitch[1100];
 
oid oidChannelSwitch[1100] [MAX_OID_LEN];
 
size_t lengthChannelSwitch[1100];
 
 
 
char *S_groupSwitchBase = "GroupSwitch.";
 
char *S_groupSwitch[1100];
 
oid oidGroupSwitch[1100] [MAX_OID_LEN];
 
size_t lengthGroupSwitch[1100];
 
 
 
char *S_outputVoltageBase ="outputVoltage.";
 
char *S_outputVoltage[1100];
 
oid oidOutputVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputVoltage[1100];
 
 
 
char *S_outputCurrentBase = "outputCurrent.";
 
char *S_outputCurrent[1100];
 
oid oidOutputCurrent[1100] [MAX_OID_LEN];
 
size_t lengthOutputCurrent[1100];
 
 
 
char *S_outputRiseRateBase ="outputVoltageRiseRate.";
 
char *S_outputRiseRate[1100];
 
oid oidOutputRiseRate[1100] [MAX_OID_LEN];
 
size_t lengthOutputRiseRate[1100];
 
 
 
char *S_outputFallRateBase ="outputVoltageFallRate.";
 
char *S_outputFallRate[1100];
 
oid oidOutputFallRate[1100] [MAX_OID_LEN];
 
size_t lengthOutputFallRate[1100];
 
 
 
char *S_outputSupervisionBehaviorBase ="outputSupervisionBehavior.";
 
char *S_outputSupervisionBehavior[1100];
 
oid oidOutputSupervisionBehavior[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionBehavior[1100];
 
 
 
char *S_outputSupervisionMinSenseVoltageBase ="outputSupervisionMinSenseVoltage.";
 
char *S_outputSupervisionMinSenseVoltage[1100];
 
oid oidOutputSupervisionMinSenseVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionMinSenseVoltage[1100];
 
 
 
char *S_outputSupervisionMaxSenseVoltageBase ="outputSupervisionMaxSenseVoltage.";
 
char *S_outputSupervisionMaxSenseVoltage[1100];
 
oid oidOutputSupervisionMaxSenseVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionMaxSenseVoltage[1100];
 
 
 
char *S_outputSupervisionMaxTerminalVoltageBase ="outputSupervisionMaxTerminalVoltage.";
 
char *S_outputSupervisionMaxTerminalVoltage[1100];
 
oid oidOutputSupervisionMaxTerminalVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionMaxTerminalVoltage[1100];
 
 
 
char *S_outputSupervisionMaxCurrentBase ="outputSupervisionMaxCurrent.";
 
char *S_outputSupervisionMaxCurrent[1100];
 
oid oidOutputSupervisionMaxCurrent[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionMaxCurrent[1100];
 
 
 
char *S_outputSupervisionMaxTemperatureBase ="outputSupervisionMaxTemperature.";
 
char *S_outputSupervisionMaxTemperature[1100];
 
oid oidOutputSupervisionMaxTemperature[1100] [MAX_OID_LEN];
 
size_t lengthOutputSupervisionMaxTemperature[1100];
 
 
 
char *S_outputConfigMaxSenseVoltageBase ="outputConfigMaxSenseVoltage.";
 
char *S_outputConfigMaxSenseVoltage[1100];
 
oid oidOutputConfigMaxSenseVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputConfigMaxSenseVoltage[1100];
 
 
 
char *S_outputConfigMaxTerminalVoltageBase ="outputConfigMaxTerminalVoltage.";
 
char *S_outputConfigMaxTerminalVoltage[1100];
 
oid oidOutputConfigMaxTerminalVoltage[1100] [MAX_OID_LEN];
 
size_t lengthOutputConfigMaxTerminalVoltage[1100];
 
 
 
char *S_outputConfigMaxCurrentBase ="outputConfigMaxCurrent.";
 
char *S_outputConfigMaxCurrent[1100];
 
oid oidOutputConfigMaxCurrent[1100] [MAX_OID_LEN];
 
size_t lengthOutputConfigMaxCurrent[1100];
 
 
 
char *S_outputConfigMaxPowerBase ="outputSupervisionMaxPower.";
 
char *S_outputConfigMaxPower[1100];
 
oid oidOutputConfigMaxPower[1100] [MAX_OID_LEN];
 
size_t lengthOutputConfigMaxPower[1100];
 
 
 
 
 
 
 
//Sensor Information
 
char *S_sensorNumber ="sensorNumber.0";
 
oid oidSensorNumber [MAX_OID_LEN];
 
size_t lengthSensorNumber;
 
 
 
char *S_sensorTemperatureBase ="sensorTemperature.";
 
char *S_sensorTemperature[12];
 
oid oidSensorTemperature[12] [MAX_OID_LEN];
 
size_t lengthSensorTemperature[12];
 
 
 
char *S_sensorWarningThresholdBase ="sensorWarningThreshold.";
 
char *S_sensorWarningThreshold[12];
 
oid oidSensorWarningThreshold[12] [MAX_OID_LEN];
 
size_t lengthSensorWarningThreshold[12];
 
 
 
char *S_sensorFailureThresholdBase ="sensorFailureThreshold.";
 
char *S_sensorFailureThreshold[12];
 
oid oidSensorFailureThreshold[12] [MAX_OID_LEN];
 
size_t lengthSensorFailureThreshold[12];
 
 
 
 
 
 
 
//SNMP Community Information
 
char *S_snmpCommunityNameBase ="snmpCommunityName.";
 
char *S_snmpCommunityName[4];
 
oid oidSnmpCommunityName[4] [MAX_OID_LEN];
 
size_t lengthSnmpCommunityName[4];
 
 
 
 
 
 
 
// Power Supply Details
 
char *S_psFirmwareVersion ="psFirmwareVersion.0";
 
oid oidPsFirmwareVersion[MAX_OID_LEN];
 
size_t lengthPsFirmwareVersion;
 
 
 
char *S_psSerialNumber ="psSerialNumber.0";
 
oid oidPsSerialNumber[MAX_OID_LEN];
 
size_t lengthPsSerialNumber;
 
 
 
char *S_psOperatingTime ="psOperatingTime.0";
 
oid oidPsOperatingTime[MAX_OID_LEN];
 
size_t lengthPsOperatingTime;
 
 
 
char *S_psDirectAccess ="psDirectAccess.0";
 
oid oidPsDirectAccess[MAX_OID_LEN];
 
size_t lengthPsDirectAccess;
 
 
 
 
 
//Fan Tray Specific OIDs
 
char *S_fanFirmwareVersion ="fanFirmwareVersion.0";
 
oid oidFanFirmwareVersion[MAX_OID_LEN];
 
size_t lengthFanFirmwareVersion;
 
 
 
char *S_fanSerialNumber ="fanSerialNumber.0";
 
oid oidFanSerialNumber[MAX_OID_LEN];
 
size_t lengthFanSerialNumber;
 
 
 
char *S_fanOperatingTime ="fanOperatingTime.0";
 
oid oidFanOperatingTime[MAX_OID_LEN];
 
size_t lengthFanOperatingTime;
 
 
 
char *S_fanAirTemperature ="fanAirTemperature.0";
 
oid oidFanAirTemperature[MAX_OID_LEN];
 
size_t lengthFanAirTemperature;
 
 
 
char *S_fanSwitchOffDelay ="fanSwitchOffDelay.0";
 
oid oidFanSwitchOffDelay[MAX_OID_LEN];
 
size_t lengthFanSwitchOffDelay;
 
 
 
char *S_fanNominalSpeed ="fanNominalSpeed.0";
 
oid oidFanNominalSpeed[MAX_OID_LEN];
 
size_t lengthFanNominalSpeed;
 
 
 
char *S_fanNumberOfFans ="fanNumberOfFans.0";
 
oid oidFanNumberOfFans[MAX_OID_LEN];
 
size_t lengthFanNumberOfFans;
 
 
 
char *S_fanSpeedBase ="fanSpeed.";
 
char *S_fanSpeed[6];
 
oid oidFanSpeed[6] [MAX_OID_LEN];
 
size_t lengthFanSpeed[6];
 
 
 
 
 
 
 
char *winsock_startup(void)
 
{
 
 
 
    WORD wVersionRequested;
 
    WSADATA wsaData;
 
    int err;
 
 
 
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
 
    wVersionRequested = MAKEWORD(2, 2);
 
 
 
    err = WSAStartup(wVersionRequested, &wsaData);
 
    if (err != 0) {
 
        /* Tell the user that we could not find a usable */
 
        /* Winsock DLL.                                  */
 
        printf("WSAStartup failed with error: %d\n", err
);  
        return NULL;
 
    }
 
 
 
/* Confirm that the WinSock DLL supports 2.2.*/
 
/* Note that if the DLL supports versions greater    */
 
/* than 2.2 in addition to 2.2, it will still return */
 
/* 2.2 in wVersion since that is the version we      */
 
/* requested.                                        */
 
 
 
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
 
        /* Tell the user that we could not find a usable */
 
        /* WinSock DLL.                                  */
 
        printf("Could not find a usable version of Winsock.dll\n");  
        WSACleanup();
 
        return NULL;
 
    }
 
    else
 
        printf("The Winsock 2.2 dll was found okay\n");  
        
 
 
 
/* The Winsock DLL is acceptable. Proceed to use it. */
 
 
 
/* Add network programming using Winsock here */
 
 
 
/* then call WSACleanup when done using the Winsock dll */
 
    
 
   return NULL;
 
 
 
};
 
 
 
 
 
void            winsock_cleanup(void){
 
 WSACleanup();
 
};
 
 
 
#define SOCK_STARTUP winsock_startup()
 
#define SOCK_CLEANUP winsock_cleanup()
 
 
 
 
 
 
 
 
 
 
 
BOOL APIENTRY DllMain( HANDLE hModule, 
 
                       DWORD  ul_reason_for_call, 
 
                       LPVOID lpReserved)
 
{
 
    return TRUE;
 
}
 
 
 
/******************************************************************************/
 
/** simple syslog replacement for this example.
 
*/
 
/*
 
 * priorities/facilities are encoded into a single 32-bit quantity, where the
 
 * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
 
 * (0-big number).  Both the priorities and the facilities map roughly
 
 * one-to-one to strings in the syslogd(8) source code.  This mapping is
 
 * included in this file.
 
 *
 
 * priorities (these are ordered)
 
 */
 
#define LOG_EMERG       0       /* system is unusable */
 
#define LOG_ALERT       1       /* action must be taken immediately */
 
#define LOG_CRIT        2       /* critical conditions */
 
#define LOG_ERR         3       /* error conditions */
 
#define LOG_WARNING     4       /* warning conditions */
 
#define LOG_NOTICE      5       /* normal but significant condition */
 
#define LOG_INFO        6       /* informational */
 
#define LOG_DEBUG       7       /* debug-level messages */
 
 
 
size_t lengthSysStatus;  
 
 
 
void syslog(int priority,const char* format,...) {
 
  va_list vaPrintf; 
 
}
 
 
 
 
 
/******************************************************************************/
 
/** SNMP Initialization.
 
*/
 
 
 
 
 
int __stdcall SnmpInit(void) {
 
        syslog(LOG_DEBUG,"*** Initialise SNMP ***");
 
 
 
  init_snmp("CrateTest");                                                                         // I never saw this name used !?!
 
        init_mib();                                                                                                                             // init MIB processing
 
  if(!read_module("WIENER-CRATE-MIB")) {                // read specific mibs
 
    syslog(LOG_ERR,"Unable to load SNMP MIB file \"%s\"","WIENER-CRATE-MIB");
 
    return 0;
 
  }
 
  syslog(LOG_DEBUG,"*** Translate OIDs ***");
 
 
 
//Translate System OIDS
 
  lengthSysMainSwitch = MAX_OID_LEN;
 
  if(!get_node(S_sysMainSwitch,oidSysMainSwitch,&lengthSysMainSwitch)) {
 
                syslog(LOG_ERR,"OID \"sysMainSwitch.0\"not found"); return false; } 
 
 
 
  lengthSysStatus = MAX_OID_LEN;
 
  if(!get_node(S_sysStatus,oidSysStatus,&lengthSysStatus)) {
 
                syslog(LOG_ERR,"OID \"sysStatus.0\"not found"); return false;} 
 
 
 
  lengthSysVmeSysReset = MAX_OID_LEN;
 
  if(!get_node(S_sysVmeSysReset,oidSysVmeSysReset,&lengthSysVmeSysReset)) {
 
                syslog(LOG_ERR,"OID \"SysVmeSysReset.0\"not found"); return false;} 
 
 
 
 
 
 
 
//Translate System Channel Count Information OIDS
 
  lengthOutputNumber = MAX_OID_LEN;
 
  if(!get_node(S_outputNumber,oidOutputNumber,&lengthOutputNumber)) {
 
                syslog(LOG_ERR,"OID \"OutputNumber.0\"not found"); return false; } 
 
 
 
  lengthGroupsNumber = MAX_OID_LEN;
 
  if(!get_node(S_groupsNumber,oidGroupsNumber,&lengthGroupsNumber)) {
 
                syslog(LOG_ERR,"OID \"groupsNumber.0\"not found"); return false;} 
 
 
 
 
 
//Translate Channel Information OIDS
 
 
 
 
 
  char s[10000];
 
  char index[4];
 
  int base =0;
 
  int indexBase=0;
 
  int j=0, idx;
 
// 2014/01/21:  i was set to run to 1 only and base was 32 resulting in module offset of 32
 
// corrected go to 100 and also field size for all OID's increased to 1000
 
//  for( int i = 0; i < 2; i++) {
 
  for( int i = 0; i < 10; i++) {
 
        base = 100*i;
 
        indexBase = 100*i+1;
 
    for( j = 0; j < 100; j++)
 
    {
 
          idx = indexBase+j;
 
          if (idx>=999) idx=999; 
 
//        printf("%s\n", s);
 
          lengthOutputName[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputName[base+j],&lengthOutputName[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputName\"not found"); return false;}
 
// groups not implemented
 
/*        strcpy(s, S_outputGroupBase);
 
          sprintf(index, "%i", indexBase+j);
 
          strcat(s, index);
 
          lengthOutputGroup[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputGroup[base+j],&lengthOutputGroup[base+j])) {
 
                syslog(LOG_ERR,"OID \"OutputGroup\"not found"); return false;}
 
*/
 
      strcpy(s
, S_outputStatusBase
);  
//        sprintf(index, "%i",indexBase+j);
 
          lengthOutputStatus[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputStatus[base+j],&lengthOutputStatus[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputStatus.1\"not found"); return false; } 
 
 
 
          strcpy(s
, S_outputMeasurementSenseVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputMeasurementSenseVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputMeasurementSenseVoltage[base+j],&lengthOutputMeasurementSenseVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputMeasurementSenseVoltage.1\"not found"); return false;}
 
 
 
          strcpy(s
, S_outputMeasurementTerminalVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputMeasurementTerminalVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputMeasurementTerminalVoltage[base+j],&lengthOutputMeasurementTerminalVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputMeasurementTerminalVoltage.1\"not found"); return false;}
 
 
 
          strcpy(s
, S_outputMeasurementCurrentBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputMeasurementCurrent[base+j] = MAX_OID_LEN;
 
                if(!get_node(s,oidOutputMeasurementCurrent[base+j],&lengthOutputMeasurementCurrent[base+j])) {
 
                        syslog(LOG_ERR,"OID \"outputMeasurementCurrent.1\"not found"); return false; }
 
 
 
          strcpy(s
, S_outputMeasurementTemperatureBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputMeasurementTemperature[base+j] = MAX_OID_LEN;
 
                if(!get_node(s,oidOutputMeasurementTemperature[base+j],&lengthOutputMeasurementTemperature[base+j])) {
 
                        syslog(LOG_ERR,"OID \"outputMeasurementTemperature\"not found"); return false; }
 
    
 
          strcpy(s
, S_outputSwitchBase
);  
//        sprintf(index, "%i",indexBase+j);
 
          lengthChannelSwitch[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidChannelSwitch[base+j],&lengthChannelSwitch[base+j])) {
 
                syslog(LOG_ERR,"OID \"channelSwitch.1\"not found"); return false;  } 
 
/*
 
          // groupSwitch added 05/16/2013___AR but not working!!!
 
          strcpy(s, S_groupSwitchBase);
 
          sprintf(index, "%i",indexBase+j);
 
          strcat(s, index);
 
          lengthGroupSwitch[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidGroupSwitch[base+j],&lengthGroupSwitch[base+j])) {
 
                syslog(LOG_ERR,"OID \"GroupSwitch.1\"not found"); return false;  } 
 
*/        //----------------------------------- 
 
          strcpy(s
, S_outputVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputVoltage[base+j],&lengthOutputVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputVoltage.1\"not found"); return false; }
 
 
 
          strcpy(s
, S_outputCurrentBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputCurrent[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputCurrent[base+j],&lengthOutputCurrent[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputCurrent\"not found"); return false; }
 
 
 
          strcpy(s
, S_outputRiseRateBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputRiseRate[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputRiseRate[base+j],&lengthOutputRiseRate[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputRiseRate.1\"not found"); return false;} 
 
        
 
          strcpy(s
, S_outputFallRateBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputFallRate[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputFallRate[base+j],&lengthOutputFallRate[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputRiseRate.1\"not found"); return false; } 
 
        
 
          strcpy(s
, S_outputSupervisionBehaviorBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputSupervisionBehavior[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionBehavior[base+j],&lengthOutputSupervisionBehavior[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionBehavior\"not found"); return false; } 
 
        
 
          strcpy(s
, S_outputSupervisionMinSenseVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputSupervisionMinSenseVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionMinSenseVoltage[base+j],&lengthOutputSupervisionMinSenseVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionMinSenseVoltage\"not found"); return false; } 
 
 
 
          strcpy(s
, S_outputSupervisionMaxSenseVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputSupervisionMaxSenseVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionMaxSenseVoltage[base+j],&lengthOutputSupervisionMaxSenseVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionMaxSenseVoltage\"not found"); return false; } 
 
 
 
          strcpy(s
, S_outputSupervisionMaxTerminalVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputSupervisionMaxTerminalVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionMaxTerminalVoltage[base+j],&lengthOutputSupervisionMaxTerminalVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionMaxTerminalVoltage\"not found"); return false; } 
 
 
 
          strcpy(s
, S_outputSupervisionMaxCurrentBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputSupervisionMaxCurrent[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionMaxCurrent[base+j],&lengthOutputSupervisionMaxCurrent[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionMaxCurrent\"not found"); return false; } 
 
/*
 
          strcpy(s, S_outputSupervisionMaxTemperatureBase);
 
          sprintf(index, "%i", indexBase+j);
 
          strcat(s, index);
 
          lengthOutputSupervisionMaxTemperature[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputSupervisionMaxTemperature[base+j],&lengthOutputSupervisionMaxTemperature[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputSupervisionMaxTemperature\"not found"); return false; } 
 
*/
 
          strcpy(s
, S_outputConfigMaxSenseVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputConfigMaxSenseVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputConfigMaxSenseVoltage[base+j],&lengthOutputConfigMaxSenseVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputConfigMaxSenseVoltage\"not found"); return false; } 
 
 
 
          strcpy(s
, S_outputConfigMaxTerminalVoltageBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputConfigMaxTerminalVoltage[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputConfigMaxTerminalVoltage[base+j],&lengthOutputConfigMaxTerminalVoltage[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputConfigMaxTerminalVoltage\"not found"); return false; }
 
          
 
          strcpy(s
, S_outputConfigMaxCurrentBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputConfigMaxCurrent[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputConfigMaxCurrent[base+j],&lengthOutputConfigMaxCurrent[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputConfigMaxCurrent\"not found"); return false; }
 
 
 
          strcpy(s
, S_outputConfigMaxPowerBase
);  
//        sprintf(index, "%i", indexBase+j);
 
          lengthOutputConfigMaxPower[base+j] = MAX_OID_LEN;
 
          if(!get_node(s,oidOutputConfigMaxPower[base+j],&lengthOutputConfigMaxPower[base+j])) {
 
                syslog(LOG_ERR,"OID \"outputConfigMaxPower\"not found"); return false; }
 
        }  
 
  } 
 
 
 
 
 
//Sensor Information
 
  lengthSensorNumber = MAX_OID_LEN;
 
  if(!get_node(S_sensorNumber,oidSensorNumber,&lengthSensorNumber)) {
 
                syslog(LOG_ERR,"OID \"SensorNumber.0\"not found"); return false;} 
 
 
 
  for(j = 0; j < 8; j++)
 
  {
 
        strcpy(s
, S_sensorTemperatureBase
);  
        lengthSensorTemperature[j] = MAX_OID_LEN;
 
        if(!get_node(s,oidSensorTemperature[j],&lengthSensorTemperature[j])) {
 
                syslog(LOG_ERR,"OID \"sensorTemperature.0\"not found"); return false; } 
 
 
 
        strcpy(s
, S_sensorWarningThresholdBase
);  
        lengthSensorWarningThreshold[j] = MAX_OID_LEN;
 
        if(!get_node(s,oidSensorWarningThreshold[j],&lengthSensorWarningThreshold[j])) {
 
                syslog(LOG_ERR,"OID \"WarningThreshold\"not found"); return false; } 
 
 
 
        strcpy(s
, S_sensorFailureThresholdBase
);  
        lengthSensorFailureThreshold[j] = MAX_OID_LEN;
 
        if(!get_node(s,oidSensorFailureThreshold[j],&lengthSensorFailureThreshold[j])) {
 
                syslog(LOG_ERR,"OID \"FailureThreshold\"not found"); return false; } 
 
  }
 
 
 
 
 
//Translate SNMP community Name OIDs
 
  for(j = 0; j < 4; j++)
 
  {
 
        strcpy(s
, S_snmpCommunityNameBase
);  
        lengthSnmpCommunityName[j] = MAX_OID_LEN;
 
        if(!get_node(s,oidSnmpCommunityName[j],&lengthSnmpCommunityName[j])) {
 
                syslog(LOG_ERR,"OID \"smpCommunityNameBase\"not found"); return false; } 
 
  }
 
 
 
 
 
//Translate PS Specific OIDs
 
/*
 
  lengthPsFirmwareVersion = MAX_OID_LEN;
 
  if(!get_node(S_psFirmwareVersion,oidPsFirmwareVersion,&lengthPsFirmwareVersion)) {
 
                syslog(LOG_ERR,"OID \"psFirmwareRevision\"not found"); return false; } 
 
*/
 
  lengthPsSerialNumber = MAX_OID_LEN;
 
  printf("\nPs Serial Number: %s\n", S_psSerialNumber
);  
  if(!get_node(S_psSerialNumber,oidPsSerialNumber,&lengthPsSerialNumber)) {
 
                syslog(LOG_ERR,"OID \"psSerialNumber\"not found"); return false; } 
 
 
 
  lengthPsOperatingTime = MAX_OID_LEN;
 
  if(!get_node(S_psOperatingTime,oidPsOperatingTime,&lengthPsOperatingTime)) {
 
                syslog(LOG_ERR,"OID \"PsOperatingTime\"not found"); return false; } 
 
 
 
  lengthPsDirectAccess = MAX_OID_LEN;
 
  if(!get_node(S_psDirectAccess,oidPsDirectAccess,&lengthPsDirectAccess)) {
 
                syslog(LOG_ERR,"OID \"PsDirectAccess\"not found"); return false; } 
 
 
 
/*
 
//Translate Fan Tray OIDs
 
  lengthFanFirmwareVersion = MAX_OID_LEN;
 
  if(!get_node(S_fanFirmwareVersion,oidFanFirmwareVersion,&lengthFanFirmwareVersion)) {
 
                syslog(LOG_ERR,"OID \"FanFirmwareVersion\"not found"); return false; } 
 
*/
 
  lengthFanSerialNumber = MAX_OID_LEN;
 
  if(!get_node(S_fanSerialNumber,oidFanSerialNumber,&lengthFanSerialNumber)) {
 
                syslog(LOG_ERR,"OID \"FanSerialNumber\"not found"); return false; } 
 
 
 
  lengthFanOperatingTime = MAX_OID_LEN;
 
  if(!get_node(S_fanOperatingTime,oidFanOperatingTime,&lengthFanOperatingTime)) {
 
                syslog(LOG_ERR,"OID \"FanOperatingTime\"not found"); return false; } 
 
 
 
  lengthFanAirTemperature = MAX_OID_LEN;
 
  if(!get_node(S_fanAirTemperature,oidFanAirTemperature,&lengthFanAirTemperature)) {
 
                syslog(LOG_ERR,"OID \"fanAirTemperature.0\"not found"); return false; } 
 
 
 
  lengthFanSwitchOffDelay = MAX_OID_LEN;
 
  if(!get_node(S_fanSwitchOffDelay,oidFanSwitchOffDelay,&lengthFanSwitchOffDelay)) {
 
                syslog(LOG_ERR,"OID \"FanSwitchOffDelay\"not found"); return false; } 
 
 
 
  lengthFanNominalSpeed = MAX_OID_LEN;
 
  if(!get_node(S_fanNominalSpeed,oidFanNominalSpeed,&lengthFanNominalSpeed)) {
 
                syslog(LOG_ERR,"OID \"FanNominalSpeed\"not found"); return false; } 
 
 
 
  lengthFanNumberOfFans = MAX_OID_LEN;
 
  if(!get_node(S_fanNumberOfFans,oidFanNumberOfFans,&lengthFanNumberOfFans)) {
 
                syslog(LOG_ERR,"OID \"NumberOfFans\"not found"); return false; } 
 
 
 
  for(j = 0; j < 6; j++)
 
  {
 
        lengthFanSpeed[j] = MAX_OID_LEN;
 
        if(!get_node(s,oidFanSpeed[j],&lengthFanSpeed[j])) {
 
                syslog(LOG_ERR,"OID \"FanSpeed\"not found"); return false; } 
 
  }
 
 
 
  syslog(LOG_DEBUG,"*** Initialise SNMP done ***");
 
  SOCK_STARTUP;                                                                                                                 // only in main thread
 
  return 1;
 
}
 
 
 
/******************************************************************************/
 
/** SNMP Cleanup.
 
*/
 
void __stdcall SnmpCleanup(void) {
 
        SOCK_CLEANUP;
 
}
 
 
 
 
 
/******************************************************************************/
 
/** SNMP Open Session.
 
*/
 
//typedef void* HSNMP;                              // SNMP handle (like FILE)
 
 
 
HSNMP __stdcall SnmpOpen(const char* ipAddress) {
 
        HSNMP m_sessp;
 
  struct snmp_session session;
 
  snmp_sess_init(&session);                                       // structure defaults
 
  session.version = SNMP_VERSION_2c;
 
  session.peername = _strdup(ipAddress);
 
  session.community = (u_char*)_strdup(readCommunity);
 
  session.
community_len = strlen((char*)session.
community); 
 
 
  session.timeout = 100000;   // timeout (us)
 
  session.retries = 3;        // retries
 
 
 
  if(!(m_sessp = snmp_sess_open(&session))) {
 
    int liberr, syserr;
 
    char *errstr;
 
    snmp_error(&session, &liberr, &syserr, &errstr);
 
    syslog(LOG_ERR,"Open SNMP session for host \"%s\": %s",ipAddress,errstr);
 
    //free(errstr);
 
    return 0;
 
  }
 
 
 
//  m_session = snmp_sess_session(m_sessp);     // get the session pointer 
 
 
 
  syslog(LOG_INFO,"SNMP session for host \"%s\" opened",ipAddress);
 
  return m_sessp;
 
}
 
 
 
/******************************************************************************/
 
/** SNMP Close Session.
 
*/
 
void __stdcall SnmpClose(HSNMP m_sessp) {
 
  if(!m_sessp) return;
 
  if(!snmp_sess_close(m_sessp)) {
 
    syslog(LOG_ERR,"Close SNMP session: ERROR");
 
  }
 
  else syslog(LOG_INFO,"SNMP session closed");
 
}
 
 
 
 
 
 
 
//System Information Functions
 
 
 
 
 
/******************************************************************************/
 
/** Get on/off status of crate
 
*/
 
int __stdcall getMainSwitch(HSNMP m_sessp) {
 
        int value = snmpGetInt(m_sessp, oidSysMainSwitch, lengthSysMainSwitch);
 
        return value;
 
}
 
 
 
/******************************************************************************/
 
/** Write on/off status
 
*/
 
int  __stdcall setMainSwitch(HSNMP m_sessp,int value) {
 
        value = snmpSetInt(m_sessp, oidSysMainSwitch, lengthSysMainSwitch, value);
 
        return value;
 
}
 
 
 
/******************************************************************************/
 
/** Get Main Status
 
*/
 
int __stdcall getMainStatus(HSNMP m_sessp){
 
        int value = snmpGetInt(m_sessp, oidSysStatus, lengthSysStatus);
 
        return value;
 
}
 
 
 
/******************************************************************************/
 
/** Get VmeReset Status
 
*/
 
int __stdcall getVmeReset(HSNMP m_sessp){
 
        int value = snmpGetInt(m_sessp, oidSysVmeSysReset, lengthSysVmeSysReset);
 
        return value;
 
}
 
 
 
/******************************************************************************/
 
/** Initiate VME SysReset
 
*/
 
int __stdcall setVmeReset(HSNMP m_sessp){
 
        int value = snmpSetInt(m_sessp, oidSysVmeSysReset, lengthSysVmeSysReset, 1);
 
        return value;
 
}
 
 
 
 
 
 
 
//System Count Functions
 
 
 
/******************************************************************************/
 
/** Get the number of channels from power supply
 
*/
 
int __stdcall getOutputNumber(HSNMP m_sessp){
 
        int value = snmpGetInt(m_sessp, oidOutputNumber, lengthOutputNumber);
 
        return value;
 
}
 
 
 
/******************************************************************************/
 
/** Get the number of channels from power supply
 
*/
 
int __stdcall getOutputGroups(HSNMP m_sessp){
 
        int value = snmpGetInt(m_sessp, oidGroupsNumber, lengthGroupsNumber);
 
        return value;
 
}
 
 
 
 
 
 
 
 
 
//Output Channel Information
 
 
 
/******************************************************************************/
 
/** I Don't know yet how to set this up
 
*/
 
// std::string __stdcall getOutputName(HSNMP m_sessp,int channel);
 
 
 
int __stdcall getOutputGroup(HSNMP m_sessp,int channel){
 
        int value = snmpGetInt(m_sessp, oidOutputGroup[channel], lengthOutputGroup[channel]);
 
        return value; }
 
 
 
int __stdcall getChannelStatus(HSNMP m_sessp, int channel){
 
        int value = snmpGetInt(m_sessp, oidOutputStatus[channel], lengthOutputStatus[channel]);
 
        return value; 
 
}
 
 
 
double __stdcall getOutputSenseMeasurement(HSNMP m_sessp, int channel){
 
        double value = snmpGetDouble(m_sessp, oidOutputMeasurementSenseVoltage[channel], 
 
                                   lengthOutputMeasurementSenseVoltage[channel]);
 
        return value; }
 
 
 
double __stdcall getOutputTerminalMeasurement(HSNMP m_sessp, int channel){
 
        double value = snmpGetDouble(m_sessp, oidOutputMeasurementTerminalVoltage[channel], 
 
                                   lengthOutputMeasurementTerminalVoltage[channel]);
 
        return value; }
 
 
 
double __stdcall getCurrentMeasurement(HSNMP m_sessp, int channel){
 
        double value = snmpGetDouble(m_sessp, oidOutputMeasurementCurrent[channel], 
 
                                   lengthOutputMeasurementCurrent[channel]);
 
        return value; }
 
 
 
int __stdcall getTemperatureMeasurement(HSNMP m_sessp, int channel){
 
        int value = snmpGetInt(m_sessp, oidOutputMeasurementTemperature[channel], 
 
                                   lengthOutputMeasurementTemperature[channel]);
 
        return value; }
 
 
 
int __stdcall setChannelSwitch(HSNMP m_sessp, int channel,int value) {
 
        value = snmpSetInt(m_sessp, oidChannelSwitch[channel], 
 
                                                   lengthChannelSwitch[channel], value);
 
        return value; }
 
 
 
int __stdcall getChannelSwitch(HSNMP m_sessmp, int channel){
 
        int value = snmpGetInt(m_sessmp, oidChannelSwitch[channel], 
 
                                                   lengthChannelSwitch[channel]);
 
        return value; }
 
 
 
// groupSwitch added 05/16/2013___AR
 
int __stdcall setGroupSwitch(HSNMP m_sessp, int group,int value) {
 
        value = snmpSetInt(m_sessp, oidGroupSwitch[group], 
 
                                                   lengthGroupSwitch[group], value);
 
        return value; }
 
 
 
int __stdcall getGroupSwitch(HSNMP m_sessmp, int group){
 
        int value = snmpGetInt(m_sessmp, oidGroupSwitch[group], 
 
                                                   lengthGroupSwitch[group]);
 
        return value; }
 
//_______________________________________
 
double __stdcall getOutputVoltage(HSNMP m_sessp, int channel) {
 
    double value = snmpGetDouble(m_sessp, oidOutputVoltage[channel],
 
                                   lengthOutputVoltage[channel] );
 
  return value; }
 
 
 
double __stdcall setOutputVoltage(HSNMP m_sessp, int channel, double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputVoltage[channel],
 
                              lengthOutputVoltage[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputCurrent(HSNMP m_sessp,int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputCurrent[channel],
 
                              lengthOutputCurrent[channel]);
 
        return value; }
 
 
 
double __stdcall setOutputCurrent(HSNMP m_sessp,int channel,double value){
 
        value = snmpSetDouble(m_sessp, oidOutputCurrent[channel],
 
                              lengthOutputCurrent[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputRiseRate(HSNMP m_sessp, int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputRiseRate[channel],
 
                                   lengthOutputRiseRate[channel] );
 
        return value; }
 
 
 
double  __stdcall setOutputRiseRate(HSNMP m_sessp,int channel,double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputRiseRate[channel],
 
                              lengthOutputRiseRate[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputFallRate(HSNMP m_sessp, int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputFallRate[channel],
 
                                   lengthOutputFallRate[channel] );
 
        return value; }
 
 
 
double  __stdcall setOutputFallRate(HSNMP m_sessp,int channel,double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputFallRate[channel],
 
                                   lengthOutputFallRate[channel], value );
 
        return value; }
 
 
 
int __stdcall getOutputSupervisionBehavior(HSNMP m_sessp,int channel) {
 
        int value = snmpGetInt(m_sessp, oidOutputSupervisionBehavior[channel],
 
                                   lengthOutputSupervisionBehavior[channel] );
 
        return value; }
 
 
 
int __stdcall setOutputSupervisionBehavior(HSNMP m_sessp,int channel,int value) {
 
        value = snmpSetInt(m_sessp, oidOutputSupervisionBehavior[channel],
 
                                   lengthOutputSupervisionBehavior[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputSupervisionMinSenseVoltage(HSNMP m_sessp,int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputSupervisionMinSenseVoltage[channel],
 
                                   lengthOutputSupervisionMinSenseVoltage[channel] );
 
        return value; }
 
 
 
double __stdcall setOutputSupervisionMinSenseVoltage(HSNMP m_sessp,int channel,double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputSupervisionMinSenseVoltage[channel],
 
                                   lengthOutputSupervisionMinSenseVoltage[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputSupervisionMaxSenseVoltage(HSNMP m_sessp,int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputSupervisionMaxSenseVoltage[channel],
 
                                   lengthOutputSupervisionMaxSenseVoltage[channel] );
 
        return value; }
 
 
 
double __stdcall setOutputSupervisionMaxSenseVoltage(HSNMP m_sessp,int channel,double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputSupervisionMaxSenseVoltage[channel],
 
                                   lengthOutputSupervisionMaxSenseVoltage[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputSupervisionMaxTerminalVoltage(HSNMP m_sessp,int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputSupervisionMaxTerminalVoltage[channel],
 
                                   lengthOutputSupervisionMaxTerminalVoltage[channel] );
 
        return value; }
 
 
 
double __stdcall setOutputSupervisionMaxTerminalVoltage(HSNMP m_sessp,int channel,double value) {
 
        value = snmpSetDouble(m_sessp, oidOutputSupervisionMaxTerminalVoltage[channel],
 
                                   lengthOutputSupervisionMaxTerminalVoltage[channel], value );
 
        return value; }
 
 
 
double __stdcall getOutputSupervisionMaxCurrent(HSNMP m_sessp,int channel) {
 
        double value = snmpGetDouble(m_sessp, oidOutputSupervisionMaxCurrent[channel],
 
                                   lengthOutputSupervisionMaxCurrent[channel] );
 
        return value; }
 
 
 
double __stdcall setOutputSupervisionMaxCurrent(HSNMP m_sessp,int channel,double value){
 
        value = snmpSetDouble(m_sessp, oidOutputSupervisionMaxCurrent[channel],
 
                                   lengthOutputSupervisionMaxCurrent[channel], value );
 
        return value; }
 
 
 
int __stdcall getOutputSupervisionMaxTemperature(HSNMP m_sessp,int channel) {
 
        int value = snmpGetInt(m_sessp, oidOutputSupervisionMaxTemperature[channel],
 
                                   lengthOutputSupervisionMaxTemperature[channel] );
 
        return value; }
 
 
 
 
 
double __stdcall getOutputConfigMaxSenseVoltage(HSNMP m_sessp,int channel)  {
 
        double value = snmpGetDouble(m_sessp, oidOutputConfigMaxSenseVoltage[channel],
 
                                   lengthOutputConfigMaxSenseVoltage[channel] );
 
        return value; }
 
 
 
double __stdcall getOutputConfigMaxTerminalVoltage(HSNMP m_sessp,int channel) {
 
        double value = snmpGetInt(m_sessp, oidOutputConfigMaxTerminalVoltage[channel],
 
                                   lengthOutputConfigMaxTerminalVoltage[channel] );
 
        return value; }
 
 
 
double __stdcall getOutputConfigMaxCurrent(HSNMP m_sessp,int channel) {
 
        double value = snmpGetInt(m_sessp, oidOutputConfigMaxCurrent[channel],
 
                                   lengthOutputConfigMaxCurrent[channel] );
 
        return value; }
 
 
 
double __stdcall getOutputConfigMaxPower(HSNMP m_sessp,int channel){
 
        double value = snmpGetInt(m_sessp, oidOutputConfigMaxPower[channel],
 
                                   lengthOutputConfigMaxPower[channel] );
 
        return value; }
 
 
 
 
 
 
 
 
 
//Sensor Information functions
 
int __stdcall getSensorNumber(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidSensorNumber,
 
                                   lengthSensorNumber);
 
        return (int)value; }
 
 
 
int __stdcall getSensorTemp(HSNMP m_sessp, int sensor) {
 
        double value = snmpGetInt(m_sessp, oidSensorTemperature[sensor],
 
                                   lengthSensorTemperature[sensor]);
 
        return (int)value; }
 
 
 
int __stdcall getSensorWarningTemperature(HSNMP m_sessp,int sensor) {
 
        double value = snmpGetInt(m_sessp, oidSensorWarningThreshold[sensor],
 
                                   lengthSensorWarningThreshold[sensor]);
 
        return (int)value; }
 
 
 
int __stdcall setSensorWarningTemperature(HSNMP m_sessp,int sensor,int value){
 
         value = snmpSetInt(m_sessp, oidSensorWarningThreshold[sensor],
 
                                   lengthSensorWarningThreshold[sensor], value);
 
        return (int)value; }
 
 
 
int __stdcall getSensorFailureTemperature(HSNMP m_sessp,int sensor) {
 
        double value = snmpGetInt(m_sessp, oidSensorFailureThreshold[sensor],
 
                                   lengthSensorFailureThreshold[sensor]);
 
        return (int)value; }
 
 
 
int __stdcall setSensorFailureTemperature(HSNMP m_sessp,int sensor,int value){
 
        value = snmpSetInt(m_sessp, oidSensorFailureThreshold[sensor],
 
                                   lengthSensorFailureThreshold[sensor], value);
 
        return (int)value; }
 
 
 
 
 
 
 
//Power Supply specific Functions.  
 
int __stdcall getPsOperatingTime(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidPsOperatingTime,
 
                                   lengthPsOperatingTime);
 
        return (int)value; }
 
 
 
 
 
//Fan Tray Functions
 
//std::string __stdcall getFanFirmwareVersion(HSNMP m_sessp);
 
//std::string __stdcall getFanSerialNumber(HSNMP m_sessp);
 
int __stdcall getFanOperatingTime(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidFanOperatingTime,
 
                                   lengthFanOperatingTime );
 
        return (int)value; } 
 
 
 
int __stdcall getFanAirTemperature(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidFanAirTemperature,
 
                                   lengthFanAirTemperature );
 
        return (int)value; } 
 
 
 
int __stdcall getFanSwitchOffDelay(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidFanSwitchOffDelay,
 
                                   lengthFanSwitchOffDelay );
 
        return (int)value; } 
 
 
 
int __stdcall setFanSwitchOffDelay(HSNMP m_sessp, int value) {
 
        value = snmpSetInt(m_sessp, oidFanSwitchOffDelay,
 
                                   lengthFanSwitchOffDelay, value );
 
        return (int)value; } 
 
 
 
int __stdcall getFanNominalSpeed(HSNMP m_sessp) {
 
        double value = snmpGetInt(m_sessp, oidFanNominalSpeed,
 
                                   lengthFanNominalSpeed );
 
        return (int)value; } 
 
 
 
int __stdcall setFanNominalSpeed(HSNMP m_sessp, int value){
 
        value = snmpSetInt(m_sessp, oidFanNominalSpeed,
 
                                   lengthFanNominalSpeed, value );
 
        return (int)value; } 
 
 
 
int __stdcall getFanNumberOfFans(HSNMP m_sessp){
 
        double value = snmpGetInt(m_sessp, oidFanNumberOfFans,
 
                                   lengthFanNumberOfFans );
 
        return (int)value; } 
 
 
 
int __stdcall getFanSpeed(HSNMP m_sessp, int fan) {
 
        double value = snmpGetInt(m_sessp, oidFanSpeed[fan],
 
                                   lengthFanSpeed[fan]);
 
        return (int)value; } 
 
 
 
 
 
char * __stdcall getOutputName(HSNMP m_sessp, int channel) {
 
        return  snmpGetString(m_sessp, oidOutputName[channel],
 
                                   lengthOutputName[channel]);
 
} 
 
 
 
 
 
 
 
//The rest of the functions are utility functions that actually do the SNMP calls
 
 
 
int __stdcall snmpGetInt(HSNMP m_sessp, const oid* parameter, size_t length) {
 
  int value=0;
 
 
 
  struct snmp_pdu* pdu = snmp_pdu_create(SNMP_MSG_GET);    // prepare get-request pdu
 
 
 
  // for(each GET request to one crate) {
 
    snmp_add_null_var(pdu,parameter,length);   // generate request data
 
  // } // endfor
 
 
 
  struct snmp_pdu* response;
 
        int status = snmp_sess_synch_response(m_sessp,pdu,&response);
 
 
 
  /*
 
  * Process the response.
 
  */
 
  if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
 
    /*
 
    * SUCCESS: Print the result variables
 
    */
 
    struct variable_list *vars;
 
 
 
    /* manipuate the information ourselves */
 
    for(vars = response->variables; vars; vars = vars->next_variable) {
 
                        if (vars->type == ASN_OPAQUE_FLOAT) {                               // 0x78
 
        value = *vars->val.floatVal;
 
      }
 
                        else if (vars->type == ASN_OPAQUE_DOUBLE) {                     // 0x79
 
        value = (int) *vars->val.doubleVal;
 
      }
 
                        else if(vars->type == ASN_INTEGER) {                                  // 0x02
 
                                value = *vars->val.integer;
 
      } 
 
       /*
 
        else if(vars->type==ASN_OCTET_STR) { 
 
        value=(char *)malloc(1+vars->val_len); 
 
        memcpy(value,vars->val.string,vars->val_len); 
 
        value[vars->val_len]='\0';
 
      }
 
       */
 
       
 
      else {
 
        value = *vars->val.integer;
 
        // fprintf(stderr, "Wrong type 0x%x len=%d value=0x%x\n", vars->type, vars->val_len, *vars->val.integer);
 
      }
 
    }
 
  } else {
 
    /*
 
    * FAILURE: print what went wrong!
 
    */
 
 
 
    if (status == STAT_SUCCESS)
 
      fprintf(stderr
, "Error in packet\nReason: %s\n",  
      snmp_errstring(response->errstat));
 
    else
 
      snmp_sess_perror("snmpget",snmp_sess_session(m_sessp));
 
    return 0;
 
  }
 
  snmp_free_pdu(response);
 
  return (int) value;
 
}
 
 
 
 
 
 
 
int __stdcall snmpSetInt(HSNMP m_sessp, const oid* parameter, size_t length, int value) {
 
  struct snmp_pdu* pdu = snmp_pdu_create(SNMP_MSG_SET);    // prepare set-request pdu
 
  pdu->community = (u_char*)_strdup(writeCommunity);
 
  pdu
->community_len 
= strlen(writeCommunity
); 
 
 
  // for(each SET request to one crate) {
 
  int v = (int) value;
 
  snmp_pdu_add_variable(pdu,parameter,length,ASN_INTEGER,(u_char*)&v,sizeof(v));
 
  // } // endfor
 
  value=v;
 
  struct snmp_pdu* response;
 
        int status = snmp_sess_synch_response(m_sessp,pdu,&response);
 
 
 
  /*
 
  * Process the response.
 
  */
 
  if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
 
    /*
 
    * SUCCESS: Print the result variables
 
    */
 
    struct variable_list *vars;
 
    
 
    // debug print
 
    //for(vars = response->variables; vars; vars = vars->next_variable)
 
    //  print_variable(vars->name, vars->name_length, vars);
 
 
 
    /* manipuate the information ourselves */
 
    for(vars = response->variables; vars; vars = vars->next_variable) {
 
                        if (vars->type == ASN_OPAQUE_FLOAT) {                               // 0x78
 
        value = (int)*vars->val.floatVal;
 
      }
 
                        else if (vars->type == ASN_OPAQUE_DOUBLE) {                     // 0x79
 
        value = (int)*vars->val.doubleVal;
 
      }
 
                        else if(vars->type == ASN_INTEGER) {                                  // 0x02
 
                                value = *vars->val.integer;
 
      } 
 
    }
 
  } else {
 
    /*
 
    * FAILURE: print what went wrong!
 
    */
 
 
 
    if (status == STAT_SUCCESS)
 
      fprintf(stderr
, "Error in packet\nReason: %s\n",  
      snmp_errstring(response->errstat));
 
    else
 
      snmp_sess_perror("snmpget",snmp_sess_session(m_sessp));
 
    return 0;
 
  }
 
  snmp_free_pdu(response);
 
  return (int) value;
 
}
 
 
 
 
 
 
 
double __stdcall snmpGetDouble(HSNMP m_sessp, const oid* parameter, size_t length) {
 
  double value=0;
 
 
 
  struct snmp_pdu* pdu = snmp_pdu_create(SNMP_MSG_GET);    // prepare get-request pdu
 
 
 
  // for(each GET request to one crate) {
 
    snmp_add_null_var(pdu,parameter,length);   // generate request data
 
  // } // endfor
 
 
 
  struct snmp_pdu* response;
 
        int status = snmp_sess_synch_response(m_sessp,pdu,&response);
 
 
 
  /*
 
  * Process the response.
 
  */
 
  if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
 
    /*
 
    * SUCCESS: Print the result variables
 
    */
 
    struct variable_list *vars;
 
 
 
    /* manipuate the information ourselves */
 
    for(vars = response->variables; vars; vars = vars->next_variable) {
 
                        if (vars->type == ASN_OPAQUE_FLOAT) {                               // 0x78
 
        value = *vars->val.floatVal;
 
      }
 
                        else if (vars->type == ASN_OPAQUE_DOUBLE) {                     // 0x79
 
        value = *vars->val.doubleVal;
 
      }
 
                        else if(vars->type == ASN_INTEGER) {                                  // 0x02
 
                                value = (double)*vars->val.integer;
 
      }
 
    }
 
  } else {
 
    /*
 
    * FAILURE: print what went wrong!
 
    */
 
 
 
    if (status == STAT_SUCCESS)
 
      fprintf(stderr
, "Error in packet\nReason: %s\n",  
      snmp_errstring(response->errstat));
 
    else
 
      snmp_sess_perror("snmpget",snmp_sess_session(m_sessp));
 
    return 0;
 
  }
 
  snmp_free_pdu(response);
 
  return  value;
 
}
 
 
 
 
 
 
 
 
 
double __stdcall snmpSetDouble(HSNMP m_sessp, const oid* parameter, size_t length, double value) {
 
  struct snmp_pdu* pdu = snmp_pdu_create(SNMP_MSG_SET);    // prepare set-request pdu
 
  pdu->community = (u_char*)_strdup(writeCommunity);
 
  pdu
->community_len 
= strlen(writeCommunity
); 
 
 
  // for(each SET request to one crate) {
 
  float v = (float) value;
 
  snmp_pdu_add_variable(pdu,parameter,length,ASN_OPAQUE_FLOAT,(u_char*)&v,sizeof(v));
 
  // } // endfor
 
  
 
  value =v;
 
  struct snmp_pdu* response;
 
        int status = snmp_sess_synch_response(m_sessp,pdu,&response);
 
 
 
  /*
 
  * Process the response.
 
  */
 
  if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
 
    /*
 
    * SUCCESS: Print the result variables
 
    */
 
    struct variable_list *vars;
 
    
 
    // debug print
 
    //for(vars = response->variables; vars; vars = vars->next_variable)
 
    //  print_variable(vars->name, vars->name_length, vars);
 
 
 
    /* manipuate the information ourselves */
 
    for(vars = response->variables; vars; vars = vars->next_variable) {
 
                        if (vars->type == ASN_OPAQUE_FLOAT) {                               // 0x78
 
        value = *vars->val.floatVal;
 
      }
 
                        else if (vars->type == ASN_OPAQUE_DOUBLE) {                     // 0x79
 
        value = *vars->val.doubleVal;
 
      }
 
                        else if(vars->type == ASN_INTEGER) {                                  // 0x02
 
                                value = (double)*vars->val.integer;
 
      }
 
      
 
        }
 
  } else {
 
    /*
 
    * FAILURE: print what went wrong!
 
    */
 
 
 
    if (status == STAT_SUCCESS)
 
      fprintf(stderr
, "Error in packet\nReason: %s\n",  
      snmp_errstring(response->errstat));
 
    else
 
      snmp_sess_perror("snmpget",snmp_sess_session(m_sessp));
 
    return 0;
 
  }
 
  snmp_free_pdu(response);
 
  return value;
 
}
 
 
 
 
 
char * __stdcall snmpGetString(HSNMP m_sessp, const oid* parameter, size_t length) {
 
  char *value=NULL;
 
 
 
 
 
 
 
  struct snmp_pdu* pdu = snmp_pdu_create(SNMP_MSG_GET);    // prepare get-request pdu
 
 
 
  // for(each GET request to one crate) {
 
    snmp_add_null_var(pdu,parameter,length);   // generate request data
 
  // } // endfor
 
 
 
  struct snmp_pdu* response;
 
        int status = snmp_sess_synch_response(m_sessp,pdu,&response);
 
 
 
  /*
 
  * Process the response.
 
  */
 
  if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
 
    /*
 
    * SUCCESS: Print the result variables
 
    */
 
    struct variable_list *vars;
 
 
 
    /* manipuate the information ourselves */
 
    for(vars = response->variables; vars; vars = vars->next_variable) {
 
      //printf("type 0x%x l=%d\n", vars->type, vars->val_len );
 
      if(vars->type==ASN_OCTET_STR) { 
 
        value
=(char *)malloc(1+vars
->val_len
);  
        memcpy(value
,vars
->val.
string,vars
->val_len
);   
        value[vars->val_len]='\0';
 
      } 
 
      else if (vars->type == ASN_OPAQUE_FLOAT) {                                    // 0x78
 
        sprintf(value
,"%9f",vars
->val.
floatVal);  
      }
 
                        else if (vars->type == ASN_OPAQUE_DOUBLE) {                     // 0x79
 
        sprintf(value
,"%9f",vars
->val.
doubleVal);  
      }
 
                        else if(vars->type == ASN_INTEGER) {                                  // 0x02
 
        sprintf(value
,"%9d",vars
->val.
integer);  
      }
 
      
 
    }
 
  } else {
 
    /*
 
    * FAILURE: print what went wrong!
 
    */
 
 
 
    if (status == STAT_SUCCESS)
 
      fprintf(stderr
, "Error in packet\nReason: %s\n",  
      snmp_errstring(response->errstat));
 
    else
 
      snmp_sess_perror("snmpget",snmp_sess_session(m_sessp));
 
    return 0;
 
  }
 
  snmp_free_pdu(response);
 
  return  value;
 
}