#!/usr/bin/python
#
# Copyright (C) 2008 Angus Ainslie.
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.


import sys
import pygtk
pygtk.require('2.0')
import gtk
import os
import gobject

class Main:   
    def delete_event(self, widget, event, data=None):
        print "delete event occurred"
        return False

    def destroy(self, widget, data=None):
        os.close( self.apmFd )
        os.close( self.forceFd )
        gobject.source_remove(self.timer)
        self.timer = 0

        gtk.main_quit()


    def ApmTimeout( self, obj ):
        chg = self.GetCharger()
        self.chgLabel.set_text( chg )

        apm = self.GetApm()

        self.apmStrings = self.ParseApm( apm )
        batPercent = int( self.apmStrings[6].split( "%" )[0] )
        self.powerBar.set_fraction( batPercent/100.0 )
        self.powerBar.set_text( self.apmStrings[6] )
        self.powerTime.set_text( self.apmStrings[7] + " " + self.apmStrings[8] )
        return True

    def ParseApm( self, apm ) :
        strings = apm.split( " " )

        return strings

    def GetCharger( self ) :
        self.chgFd = os.open( "/sys/devices/platform/s3c2440-i2c/i2c-adapter/i2c-0/0-0073/charger_type", os.O_RDONLY )
        os.lseek( self.chgFd, 0, 0 )

        chg = os.read( self.chgFd, 512 )
        
#        print "Charger :", chg
        os.close( self.chgFd )
        return chg

    def GetApm( self ) :
        os.lseek( self.apmFd, 0, 0 )

        apm = os.read( self.apmFd, 512 )
        
        return apm 

    def SetSlowCharge( self, btn ) :
        os.write( self.forceFd, "100" )

    def SetMedCharge( self, btn ) :
        os.write( self.forceFd, "500" )

    def SetFastCharge( self, btn ) :
        os.write( self.forceFd, "1000" )

    def __init__(self):
        self.apmFd = os.open( "/proc/apm", os.O_RDONLY )
        self.forceFd = os.open( "/sys/devices/platform/s3c2440-i2c/i2c-adapter/i2c-0/0-0073/force_usb_limit_dangerous", os.O_RDWR )

        apm = self.GetApm()
        chg = self.GetCharger()
        
        # Add a timer callback to update the value of the progress bar
        self.timer = gobject.timeout_add( 5000, self.ApmTimeout, self )

#        print "apm : " , apm 
        self.apmStrings = self.ParseApm( apm )

        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(10)
        self.window.set_size_request(400, 300)
        self.window.set_title( "Power Center" )
        self.scrolled_window = gtk.ScrolledWindow()
        self.scrolled_window.set_policy(  gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC )

        hbox = gtk.HBox( False, 1 )

        batPercent = int( self.apmStrings[6].split( "%" )[0] )
        
        self.powerBar = gtk.ProgressBar()
        self.powerBar.set_fraction( batPercent/100.0 )
        self.powerBar.set_text( self.apmStrings[6] )
        self.powerBar.set_orientation( gtk.PROGRESS_BOTTOM_TO_TOP )

        vbox = gtk.VBox( False, 1 )
        self.powerTime = gtk.Label( self.apmStrings[7] + " " + self.apmStrings[8] )

        vbox.pack_start( self.powerBar, True, True, 5 )
        vbox.pack_start( self.powerTime, False, False, 0 )
        hbox.pack_start( vbox, True, False, 0 )

        vbox.show()
        self.powerBar.show()
        self.powerTime.show()

        vbox = gtk.VBox( False, 1 )
        hbox.pack_start( vbox, True, False, 0 )
        
        self.chgLabel = gtk.Label( chg )
        vbox.pack_start( self.chgLabel, True, False, 0 )

        button = gtk.Button("Slow 100mA")
        button.connect("clicked", self.SetSlowCharge )
        button.show()
        vbox.pack_start(button, True, False, 0)

        button = gtk.Button("Medium 500mA")
        button.connect("clicked", self.SetMedCharge )
        button.show()
        if not os.path.exists( "/home/root/allow_force_500" ) :
            button.set_sensitive( False )
        vbox.pack_start(button, True, False, 0)

        button = gtk.Button("Fast 1000mA")
        button.connect("clicked", self.SetFastCharge )
        button.show()
        if not os.path.exists( "/home/root/allow_force_1000" ) :
            button.set_sensitive( False )
        vbox.pack_start(button, True, False, 0)

        vbox.show()
        hbox.show()

        self.window.add( self.scrolled_window )
        self.scrolled_window.add_with_viewport( hbox )

        self.chgLabel.show()
        self.scrolled_window.show()
        self.window.show()

    def main(self):
        gtk.main()

run = Main()
run.main()
