[Nut-upsdev] bcmxcp: Patch for using command map if present to control commands added by dstate_addcmd

Alf Høgemark alf at i100.no
Wed Jul 3 19:06:30 UTC 2013


Hi

Inspired by the changes by Prachi Gandhi to use the command map from the 
UPS in the bcmxcp driver, I think the map should be used, if available, 
to control
all commands the driver adds using "dstate_addcmd".
The following patch is an attempt at doing so. The patch is against the 
bcmxcp branch.

Since my UPS also supports :
#define PW_UPS_ON        (unsigned char)0x89 /* UPS on command. length 
1-2 */
#define PW_UPS_ON_TIME        (unsigned char)0x91 /* Scheduled UPS on in 
n minutes. length 3-4 */
#define PW_UPS_OFF_TIME        (unsigned char)0x93 /* Scheduled UPS off 
in n minutes. length 3-4 */
it is tempting to add support for these as well. But I do not think I 
have time for that now in the summer.




 From 0b01612658c1265cb6df8563e0ab7f4d720e8b0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alf=20H=C3=B8gemark?= <alf at i100.no>
Date: Wed, 3 Jul 2013 20:57:58 +0200
Subject: [PATCH] bcmxcp: If UPS supplies command map, use it to control what
  commands we register with dstate_addcmd. If UPS does not supply 
command map,
  we register default commands with dstate_addcmd

---
  drivers/bcmxcp.c | 39 ++++++++++++++++++++++++++++-----------
  drivers/bcmxcp.h | 11 +++++++++--
  2 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/drivers/bcmxcp.c b/drivers/bcmxcp.c
index 5c61bd4..e92ebcd 100644
--- a/drivers/bcmxcp.c
+++ b/drivers/bcmxcp.c
@@ -150,7 +150,7 @@ static long int get_long(const unsigned char*);
  static float get_float(const unsigned char *data);
  static void init_meter_map(void);
  static void init_alarm_map(void);
-static void init_command_map(int size);
+static bool_t init_command_map(int size);
  static void init_config(void);
  static void init_limit(void);
  static void init_ups_meter_map(const unsigned char *map, unsigned char 
len);
@@ -625,7 +625,7 @@ void init_alarm_map()
  }

  /* Get information on UPS commands */
-void init_command_map(int size)
+bool_t init_command_map(int size)
  {
      unsigned char answer[PW_ANSWER_MAX_SIZE];
      int res, iIndex = 0, ncounter, NumComms = 0;
@@ -634,7 +634,10 @@ void init_command_map(int size)

      res = command_read_sequence(PW_COMMAND_LIST_REQ, answer);
      if (res <= 0)
+    {
          upsdebugx(2, "No command list block.");
+        return FALSE;
+    }
      else
      {
          upsdebugx(2, "Command list block supported.");
@@ -656,17 +659,28 @@ void init_command_map(int size)

                  if (answer[iIndex] == PW_INIT_BAT_TEST)
                  {
-                    dstate_addcmd("test.battery.start");
+                    dstate_addcmd("test.battery.start");
                  }
                  else if (answer[iIndex] == PW_INIT_SYS_TEST)
                  {
-                    dstate_addcmd("test.system.start");
-                }
+                    dstate_addcmd("test.system.start");
+                }
+                else if (answer[iIndex] == PW_LOAD_OFF_RESTART)
+                {
+                    dstate_addcmd("shutdown.return");
+                }
+                else if (answer[iIndex] == PW_UPS_OFF)
+                {
+                    dstate_addcmd("shutdown.stayoff");
+                }
                  iIndex++;
              }
+            return TRUE;
          }
-        else
+        else {
              upsdebugx(1, "Invalid response received from Command List 
block");
+            return FALSE;
+        }
      }
  }

@@ -1141,6 +1155,7 @@ void upsdrv_initinfo(void)
      int iRating = 0, iIndex = 0, res, len;
      int ncpu = 0, buf;
      int conf_block_len = 0, alarm_block_len = 0, cmd_list_len = 0;
+    bool_t got_cmd_list = FALSE;

      /* Init BCM/XCP alarm descriptions */
      init_alarm_map();
@@ -1299,11 +1314,13 @@ void upsdrv_initinfo(void)

      /* Get information on UPS commands */
      if (cmd_list_len)
-        init_command_map(cmd_list_len);
-
-    dstate_addcmd("shutdown.return");
-    dstate_addcmd("shutdown.stayoff");
-    dstate_addcmd("test.battery.start");
+        got_cmd_list = init_command_map(cmd_list_len);
+    /* Add default commands if we were not able to query UPS for support */
+    if(got_cmd_list == FALSE) {
+        dstate_addcmd("shutdown.return");
+        dstate_addcmd("shutdown.stayoff");
+        dstate_addcmd("test.battery.start");
+    }

      upsh.instcmd = instcmd;
      upsh.setvar = setvar;
diff --git a/drivers/bcmxcp.h b/drivers/bcmxcp.h
index 803f7e6..b741494 100644
--- a/drivers/bcmxcp.h
+++ b/drivers/bcmxcp.h
@@ -32,9 +32,9 @@
  #define PW_COMMAND_LIST_REQ    (unsigned char)0x40 /* Available 
commands. length 1 */
  #define PW_OUT_MON_BLOCK_REQ    (unsigned char)0x41 /* Outlet monitor 
request length 1 */
  #define PW_COM_CAP_REQ        (unsigned char)0x42 /* Request 
communication capabilities. length 2    */
-#define PW_UPS_TOP_DATA_REQ    (unsigned char)0x43 /* Requsest ups 
topology data requset. length 1    */
+#define PW_UPS_TOP_DATA_REQ    (unsigned char)0x43 /* Request ups 
topology data requset. length 1    */

-/* Need autorisation before this commands */
+/* Need autorisation before these commands */
  #define PW_UPS_ON        (unsigned char)0x89 /* UPS on command. length 
1-2 */
  #define PW_LOAD_OFF_RESTART    (unsigned char)0x8A /* Delayed 
LoadPowerOff & Restart command. length 2-4 */
  #define PW_UPS_OFF        (unsigned char)0x8B /* UPS off command. 
length 1-2 */
@@ -417,5 +417,12 @@ typedef struct {
      double    (*nuf)(const char *nut_value);        /* optional NUT to 
HID mapping */
  } info_lkp_t;

+/* use explicit booleans */
+#ifndef FALSE
+typedef enum ebool { FALSE, TRUE } bool_t;
+#else
+typedef int bool_t;
+#endif
+
  #endif /*_POWERWARE_H */

-- 
1.8.1.2




More information about the Nut-upsdev mailing list