#!/usr/bin/python

# (C) ag2 2007

import dbus, dbus.service, dbus.glib
import gobject
import getopt, sys, time

USAGE = '''
%s [-h] [-d N]

Without arguments, this program prints the current battery charge
of a Nokia Internet Tablet.

-d causes the program to run in a loop, printing battery status
every N minutes

-h prints this help screen
''' % sys.argv[0]

percent_left = -1
charging = False

loop = gobject.MainLoop()

def timeleft_handler(idle_time, active_time):
  global percent_left
  percent_left = min(100, 100.0 * idle_time / 15000)
  loop.quit()

def charging_on_handler():
  global charging
  charging = True
  loop.quit()

def charging_off_handler():
  global charging
  charging = False
  loop.quit()

class Request(dbus.service.Object): 
  def __init__(self, bus_name): 
    dbus.service.Object.__init__(self, bus_name, '/com/nokia/bme/request')
  
  @dbus.service.signal('com.nokia.bme.request') 
  def timeleft_info_req(self): 
     pass

  @dbus.service.signal('com.nokia.bme.request') 
  def status_info_req(self):
     pass
  
def GetBatteryState(request):
  global percent_left
  global charging

  request.status_info_req()
  loop.run()

  if charging:
    return -1
  request.timeleft_info_req()
  loop.run()
  return percent_left

def main(argv):
  delay = 0
  try:
    opts, args = getopt.getopt(argv, 'hd:', [])
    for (opt, arg) in opts:
      if opt == '-h':
        print USAGE
        return
      elif opt == '-d':
        delay = int(arg) * 60
  except:
    print USAGE
    return

  if delay:
    print '----------------------'

  bus = dbus.SystemBus(private = True)
  bus.add_signal_receiver(timeleft_handler, 'battery_timeleft')
  bus.add_signal_receiver(charging_on_handler, 'charger_charging_on')
  bus.add_signal_receiver(charging_on_handler, 'battery_full')
  bus.add_signal_receiver(charging_off_handler, 'charger_charging_off')
  bus_name = dbus.service.BusName('com.nokia.bme.request', bus) 
  request = Request(bus_name)

  start_time = time.time()
  try:
    while 1:
      elapsed_time = time.time() - start_time
      percent = GetBatteryState(request)
      ts = time.asctime()[4:16] 
      if percent < 0:
        print '[%s] Charging' % ts
      elif not delay:
        print '[%s] %.1f%%' % (ts, percent)
      else:
        elapsed_hours = elapsed_time / 3600 
        elapsed_minutes = (elapsed_time % 3600) / 60
        print '[%s][%02d:%02d] %.1f%%' %\
              (ts, elapsed_hours, elapsed_minutes, percent)
      if delay:
        sys.stdout.flush()
        time.sleep(delay)
      else:
        break
  except:
    return

main(sys.argv[1:])
