diff -up ./drivers/liebert-esp2.c.esp2 ./drivers/liebert-esp2.c --- ./drivers/liebert-esp2.c.esp2 2010-12-24 14:24:29.000000000 +0100 +++ ./drivers/liebert-esp2.c 2011-02-28 15:27:01.000000000 +0100 @@ -23,8 +23,58 @@ #include "timehead.h" #include "nut_stdint.h" +#define sivann +#define IsBitSet(val, bit) ((val) & (1 << (bit))) + #define DRIVER_NAME "Liebert ESP-II serial UPS driver" -#define DRIVER_VERSION "0.02" +#define DRIVER_VERSION "0.03" +#define UPS_SHUTDOWN_DELAY 12 //it means UPS will be shutdown 120 sec +#define SHUTDOWN_CMD_LEN 8 + +/* values for sending to UPS */ +enum mult_enum { + M_10, + M_0_1, + M_VOLTAGE_I, + M_VOLTAGE_O, + M_VOLTAGE_B, + M_CURRENT_I, + M_CURRENT_O, + M_CURRENT_B, + M_LOAD_VA, + M_LOAD_WATT, + M_FREQUENCY, + M_VOLT_DC, + M_TEMPERATURE, + M_CURRENT_DC , + M_BAT_RUNTIME, + M_NOMPOWER, + M_POWER, + M_REALPOWER, + M_LOADPERC +}; + +static float multi[19]={ + 10.0, + 0.1, + 0.1, /* volt */ + 0.1, + 0.1, + 0.1, /* curr */ + 0.1, + 0.1, + 100.0, /* va */ + 100.0, /* W */ + 0.01, /* FREQ */ + 0.1, /* V DC*/ + 0.1, /* TEMP*/ + 0.01, /* CUR DC*/ + 60.0, /* BAT RUNTIME*/ + 100.0, /* NOMPOWER*/ + 100.0, /* POWER*/ + 100.0, /* REAL POWER*/ + 1.0 /* LOADPERC*/ +}; static int instcmd(const char *cmdname, const char *extra); static int setvar(const char *varname, const char *val); @@ -33,7 +83,8 @@ static int setvar(const char *varname, c upsdrv_info_t upsdrv_info = { DRIVER_NAME, DRIVER_VERSION, - "Richard Gregory ", + "Richard Gregory \n" \ + "Robert Jobbagy 1){ + cmdin_p=vartab3i; + } + else { + cmdin_p=vartab1i; + } + + if (num_outphases>1){ + cmdout_p=vartab3o; + } + else { + cmdout_p=vartab1o; + } + + for (i = 0; cmdin_p[i].var; i++) { + int16_t val; + ret = do_command(cmdin_p[i].cmd, reply, 6); + if (ret < 8) { + continue; + } val = (unsigned char)reply[5]; val <<= 8; val += (unsigned char)reply[6]; + dstate_setinfo(cmdin_p[i].var, cmdin_p[i].fmt, val * multi[cmdin_p[i].multindex]); + } - dstate_setinfo(vartab[i].var, vartab[i].fmt, val * vartab[i].mult); + for (i = 0; cmdout_p[i].var; i++) { + int16_t val; + ret = do_command(cmdout_p[i].cmd, reply, 6); + if (ret < 8) { + continue; + } + val = (unsigned char)reply[5]; + val <<= 8; + val += (unsigned char)reply[6]; + dstate_setinfo(cmdout_p[i].var, cmdout_p[i].fmt, val * multi[cmdout_p[i].multindex]); } status_init(); - ret = do_command(cmd_bitfield1, reply); + ret = do_command(cmd_bitfield1, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #1"); dstate_datastale(); @@ -217,7 +430,7 @@ void upsdrv_updateinfo(void) } } - ret = do_command(cmd_bitfield2, reply); + ret = do_command(cmd_bitfield2, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #2"); dstate_datastale(); @@ -240,7 +453,7 @@ void upsdrv_updateinfo(void) status_set("TRIM"); } - ret = do_command(cmd_bitfield3, reply); + ret = do_command(cmd_bitfield3, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #3"); dstate_datastale(); @@ -262,8 +475,13 @@ void upsdrv_updateinfo(void) void upsdrv_shutdown(void) { - /* replace with a proper shutdown function */ - fatalx(EXIT_FAILURE, "shutdown not supported"); + char reply[8]; + + if(!(do_command(cmd_setOutOffMode, reply, 8) != -1) && + (do_command(cmd_setOutOffDelay, reply, 8) != -1) && + (do_command(cmd_sysLoadKey, reply, 6) != -1) && + (do_command(cmd_shutdown, reply, 8) != -1)) + upslogx(LOG_ERR, "Failed to shutdown UPS"); } static int instcmd(const char *cmdname, const char *extra)