]> xenbits.xen.org Git - xenclient/xen-pq.git/commitdiff
Subset of battery level notification changes.
authorKamala Narasimhan <kamala.narasimhan@citrix.com>
Tue, 20 Oct 2009 16:25:05 +0000 (12:25 -0400)
committerKamala Narasimhan <kamala.narasimhan@citrix.com>
Tue, 20 Oct 2009 16:25:05 +0000 (12:25 -0400)
master/power-management-enhancement

index 350b7a212d7eb389b1a69348b9861d784a74a68f..f4e85bcb9f2514b069b16ce0b5852753af2a9e33 100644 (file)
@@ -1101,10 +1101,10 @@ index 0000000..c9b80cd
 +}
 +
 diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
-index 28de744..b086092 100644
+index 28de744..58abdfa 100644
 --- a/tools/xenpmd/xenpmd.c
 +++ b/tools/xenpmd/xenpmd.c
-@@ -33,68 +33,10 @@
+@@ -33,68 +33,13 @@
   * passed to the guest when appropriate battery ports are read/written to.
   */
  
@@ -1174,10 +1174,31 @@ index 28de744..b086092 100644
 +
 +struct xs_handle *xs;
 +static pthread_t worker_thread;
++static unsigned long battery_warning_capacity = 0;
++static unsigned long battery_low_capacity = 0;
++static enum BATTERY_LEVEL current_battery_level = NORMAL;
  
  FILE *get_next_battery_file(DIR *battery_dir, 
                              enum BATTERY_INFO_TYPE battery_info_type)
-@@ -218,11 +160,19 @@ void set_attribute_battery_status(char *attrib_name,
+@@ -135,13 +80,15 @@ void set_attribute_battery_info(char *attrib_name,
+     if ( strstr(attrib_name, "design capacity warning") ) 
+     {
+-        info->design_capacity_warning = strtoull(attrib_value, NULL, 10);
++        battery_warning_capacity = info->design_capacity_warning = 
++            strtoull(attrib_value, NULL, 10);
+         return;
+     }
+     if ( strstr(attrib_name, "design capacity low") ) 
+     {
+-        info->design_capacity_low = strtoull(attrib_value, NULL, 10);
++        battery_low_capacity = info->design_capacity_low = 
++            strtoull(attrib_value, NULL, 10);
+         return;
+     }
+@@ -218,11 +165,19 @@ void set_attribute_battery_status(char *attrib_name,
  {
      if ( strstr(attrib_name, "charging state") ) 
      {
@@ -1202,7 +1223,7 @@ index 28de744..b086092 100644
          return;
      }
  
-@@ -292,11 +242,12 @@ int get_next_battery_info_or_status(DIR *battery_dir,
+@@ -292,11 +247,12 @@ int get_next_battery_info_or_status(DIR *battery_dir,
                                      void *info_or_status)
  {
      FILE *file;
@@ -1216,7 +1237,7 @@ index 28de744..b086092 100644
      if (type == BIF) 
          memset(info_or_status, 0, sizeof(struct battery_info));
      else 
-@@ -306,31 +257,34 @@ int get_next_battery_info_or_status(DIR *battery_dir,
+@@ -306,31 +262,34 @@ int get_next_battery_info_or_status(DIR *battery_dir,
      if ( !file )
          return 0;
  
@@ -1267,7 +1288,7 @@ index 28de744..b086092 100644
  
  void write_ulong_lsb_first(char *temp_val, unsigned long val)
  {
-@@ -370,7 +324,7 @@ void write_battery_info_to_xenstore(struct battery_info *info)
+@@ -370,7 +329,7 @@ void write_battery_info_to_xenstore(struct battery_info *info)
               (unsigned int)strlen(info->battery_type), info->battery_type,
               (unsigned int)strlen(info->oem_info), info->oem_info);
      strncat(val+73, string_info, 1024-73-1);
@@ -1276,7 +1297,7 @@ index 28de744..b086092 100644
               val, 73+8+strlen(info->model_number)+strlen(info->serial_number)+
               strlen(info->battery_type)+strlen(info->oem_info)+1);
  }
-@@ -383,16 +337,21 @@ int write_one_time_battery_info(void)
+@@ -383,16 +342,21 @@ int write_one_time_battery_info(void)
      
      dir = opendir(BATTERY_DIR_PATH);
      if ( !dir )
@@ -1299,7 +1320,7 @@ index 28de744..b086092 100644
              ret = 1;
              break; /* rethink this... */
          }
-@@ -402,16 +361,17 @@ int write_one_time_battery_info(void)
+@@ -402,16 +366,35 @@ int write_one_time_battery_info(void)
      return ret;
  }
  
@@ -1318,18 +1339,42 @@ index 28de744..b086092 100644
 +    xenpmd_log(LOG_DEBUG, "Battery remining capacity    %d\n",
 +            (int) status->remaining_capacity);
 +    xenpmd_log(LOG_DEBUG, "Battery present voltage      %d\n", (int) status->present_voltage);
++}
++#endif /*XENPMD_DEBUG*/
++
++void adjust_guest_battery_level(struct battery_status *status)
++{
++    current_battery_level = NORMAL;
++    if ( battery_warning_capacity >= status->remaining_capacity - VIRTUAL_BATTERY_THRESHOLD_DELTA )
++    {
++        status->remaining_capacity-= VIRTUAL_BATTERY_THRESHOLD_DELTA;
++        if ( !(status->state & 0x2) ) /* not charging */
++        {
++            if ( status->remaining_capacity <= VIRTUAL_BATTERY_THRESHOLD_DELTA )
++                current_battery_level = CRITICAL;
++            else if ( status->remaining_capacity <= battery_low_capacity )
++                current_battery_level = LOW;
++            else
++                current_battery_level = WARNING;
++        }
++    }
  }
 -#endif /*RUN_STANDALONE*/
-+#endif /*XENPMD_DEBUG*/
  
  void write_battery_status_to_xenstore(struct battery_status *status)
  {
-@@ -426,56 +386,79 @@ void write_battery_status_to_xenstore(struct battery_status *status)
+@@ -426,56 +409,86 @@ void write_battery_status_to_xenstore(struct battery_status *status)
      write_ulong_lsb_first(val+18, status->remaining_capacity);
      write_ulong_lsb_first(val+26, status->present_voltage);
  
 -    xs_write(xs, XBT_NULL, "/pm/bst", val, 35);
 +    xs_write(xs, XBT_NULL, XS_BST, val, 35);
++    if ( current_battery_level != NORMAL )
++    {
++        sprintf(val, "%d", current_battery_level);
++        xs_write(xs, XBT_NULL, XS_BATTERY_LEVEL_NOTIFICATION, val, strlen(val));
++        xenpmd_log(LOG_ALERT, "Battery level below normal  - %d!\n", current_battery_level);
++    } 
 +#ifdef XENPMD_DEBUG
 +    xenpmd_log(LOG_DEBUG, "Updated battery information in xenstore\n");
 +#endif
@@ -1382,6 +1427,7 @@ index 28de744..b086092 100644
 -            }
 +        if ( status.present == YES )
 +        {
++            adjust_guest_battery_level(&status);
 +            write_battery_status_to_xenstore(&status);
 +            /* rethink this; though I have never seen, there might be
 +             * systems out there with more than one battery device
@@ -1433,7 +1479,7 @@ index 28de744..b086092 100644
  
      if ( pid != 0 )
          exit(0);
-@@ -483,34 +466,75 @@ static void daemonize(void)
+@@ -483,34 +496,75 @@ static void daemonize(void)
      setsid();
  
      if ( (pid = fork()) < 0 )
@@ -1521,10 +1567,10 @@ index 28de744..b086092 100644
 +}
 diff --git a/tools/xenpmd/xenpmd.h b/tools/xenpmd/xenpmd.h
 new file mode 100644
-index 0000000..b3dddac
+index 0000000..3cda66d
 --- /dev/null
 +++ b/tools/xenpmd/xenpmd.h
-@@ -0,0 +1,130 @@
+@@ -0,0 +1,140 @@
 +/*
 + * xenpmd.h
 + *
@@ -1584,6 +1630,13 @@ index 0000000..b3dddac
 +    RECHARGEABLE
 +};
 +
++enum BATTERY_LEVEL {
++    NORMAL,
++    WARNING,
++    LOW,
++    CRITICAL
++};
++
 +struct battery_info {
 +    enum BATTERY_PRESENT    present;
 +    unsigned long           design_capacity;
@@ -1644,11 +1697,14 @@ index 0000000..b3dddac
 +#define XS_AC_ADAPTER_STATE_PATH            "/pm/ac_adapter"
 +#define XS_LID_STATE_PATH                   "/pm/lid_state" 
 + 
++#define XS_BATTERY_LEVEL_NOTIFICATION       "/pm/events/batterylevelnotification"
 +#define XS_AC_ADAPTER_EVENT_PATH            "/pm/events/acadapterstatechanged"
 +#define XS_LID_EVENT_PATH                   "/pm/events/lidstatechanged"
 +#define XS_PBTN_EVENT_PATH                  "/pm/events/powerbuttonpressed"
 +#define XS_SBTN_EVENT_PATH                  "/pm/events/sleepbuttonpressed"
 +
++#define VIRTUAL_BATTERY_THRESHOLD_DELTA     10
++
 +#ifndef RUN_STANDALONE
 +    #define xenpmd_log(priority, format, p...) syslog(priority, format, ##p)
 +#else