Page 1 sur 1

[FVWM - Scripts] : Etat de la batterie

Publié : mar. 18 nov. 2008, 17:07
par Mysth-R
Bonjour,
voila un script qui permet d'afficher l'état de la batterie de votre portable dont voici les caractéristiques :
- En cliquant on peut afficher soit le pourcentage soit le nombre de minutes restantes.
- Une petite icone indique les différents états.
- Un son est joué lorsque la batterie est presque vide.

Bon ce script n'est loin d'etre parfait, on peut dire que ça "marchouille"... mais au moins cémoikiléfé !! :D
Donc soyez indulgent, et surtout aidez moi à l'améliorer si vous voyez des choses qui ne vont pas.

Voici le script :

Code : Tout sélectionner

WindowTitle {FvwmScript-AcpiBatt}
WindowSize 76 24
Font "xft:Tahoma:pixelsize=12:Bold"
Colorset 1


########## BEGINING THE INITIALISATION ################
Init
Begin
	Set $battPresent = (GetOutput {cat /proc/acpi/battery/BAT?/info} 1 2)
	Set $display = hour
	
	
########## IF BATTERY IS PRESENT ############
	If $battPresent==yes Then
		Begin
			Set $last_prev = (GetOutput {cat /proc/acpi/battery/BAT?/info} 3 4)
			Set $last = $last_prev
			Set $remaining = (GetOutput {cat /proc/acpi/battery/BAT?/state} 5 3)
			Set $acstate = (GetOutput {cat /proc/acpi/ac_adapter/AC*/state} 1 2)
			Set $batt = (Mult 100 $remaining)
			Set $batt = (Div $batt $last)
			Set $batt = $batt %
			Set $temps = 0 h 55
			Set $alert = 0
			Set $batt_prev = -1
			Set $counthour = 0
			Set $IconBatt = {22x22/status/battery-100.png}
			Set $IconBatt2 = {22x22/status/battery-charging.png}
			
			####### IF THE LAPTOP USE THE BATTERY ########
			If $acstate==off-line Then
				Begin
					Set $alert = 0
					#Do {Exec echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor}
					
					####### SWITCH THE DISPLAY BETWEEN PERCENT OR TIME #############
					If $display=={percent} Then
					Begin
						Set $batt = * $batt 
						ChangeTitle 1 $batt
						ChangeIcon 2 $IconBatt
					End
					Else
					Begin
						Set $temps = * $temps
						ChangeTitle 1 $temps
						ChangeIcon 2 $IconBatt
					End
				End
				
			######## IF THE LAPTOP USE THE AC POWER #########
			Else
				Begin
					Set $alert = 0
					#Do {Exec echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor}
					
					######### SWITCH THE DISPLAY BETWEEN PERCENT OR TIME ##########
					If $display=={percent} Then
					Begin
						ChangeTitle 1 $batt
						ChangeIcon 2 $IconBatt
					End
					Else
					Begin
						ChangeTitle 1 $temps
						ChangeIcon 2 $IconBatt2
					End
				End
		End
######### IF BATTERY IS NOT PRESENT #############
	Else
		Begin
			
			Set $IconBatt = {22x22/status/battery-missing.png}
			Set $temps = NoTime
			Set $batt = NoBatt
			
			############## SWITCH THE DISPLAY BETWEEN PERCENT OR TIME ###############
			If $display=={percent} Then
				Begin
					ChangeTitle 1 $batt
					ChangeIcon 2 $IconBatt
				End
			Else
				Begin
					ChangeTitle 1 $temps
					ChangeIcon 2 $IconBatt
				End
		End
End
##### END OF INITIALISATION ################
####################################




######################################
########## IF BATTERY IS PRESENT ############
PeriodicTasks
Begin
	If (RemainderOfDiv (GetTime) 60)==0 Then
	Begin
	
		Set $battPresent = (GetOutput {cat /proc/acpi/battery/BAT?/info} 1 2)
		Set $display = hour
		
		
		
		#If $batt==$batt_prev Then
		#	Begin
		#		# do nothing
		#	End
		If $battPresent==no Then
			Begin
				Set $IconBatt = {22x22/status/battery-missing.png}
				Set $batt = NoBatt 
				Set $temps = NoTime
				############## SWITCH THE DISPLAY BETWEEN PERCENT OR TIME ###############
				If $display=={percent} Then
					Begin
						ChangeTitle 1 $batt
						ChangeIcon 2 $IconBatt
					End
				Else
					Begin
						ChangeTitle 1 $temps
						ChangeIcon 2 $IconBatt
					End
			End
		Else
			Begin
				
						Set $last_prev = (GetOutput {cat /proc/acpi/battery/BAT?/info} 3 4)
						Set $remaining_batt = (GetOutput {cat /proc/acpi/battery/BAT?/state} 5 3)
						Set $batt = (Mult 100 $remaining_batt)
						Set $batt = (Div $batt $last_prev)
						Set $batt_prev = $batt
						Set $acstate = (GetOutput {cat /proc/acpi/ac_adapter/AC*/state} 1 2)
						Set $IconBatt = {22x22/status/battery-100.png}
						Set $IconBatt2 = {22x22/status/battery-charging.png}

						If $batt>99 Then
							Begin
								Set $IconBatt = {22x22/status/battery-100.png}
								Set $IconBatt2 = {22x22/status/battery-charging.png}
								ChangeColorset 1 1
							End
						Else
						Begin
							If $batt>74 Then
								Begin
									Set $IconBatt = {22x22/status/battery-080.png}
									Set $IconBatt2 = {22x22/status/battery-charging-080.png}
								End
							Else
							Begin
								If $batt>49 Then
									Begin
										Set $IconBatt = {22x22/status/battery-060.png}
										Set $IconBatt2 = {22x22/status/battery-charging-060.png}
									End
								Else
								Begin
									If $batt>24 Then
										Begin
											Set $IconBatt = {22x22/status/battery-040.png}
											Set $IconBatt2 = {22x22/status/battery-charging-040.png}
										End
									Else
									Begin
										If $batt>12 Then
											Begin
												Set $IconBatt = {22x22/status/battery-caution.png}
												Set $IconBatt2 = {22x22/status/battery-charging-caution.png}
											End
										Else
											Begin
												Set $alert = (Add $alert 1)
												If $alert==1 Then
													Begin
														Do{ Exec aplay $[SOUNDS_PATH]/AlertBatt.wav}	
														Set $IconBatt = {22x22/status/battery-low.png}
														Set $IconBatt2 = {22x22/status/battery-charging-low.png}
														ChangeForeColor 1 {#FF0000}
														ChangeForeColor 2 {#FF0000}
													End
												Else
													Begin
														Set $IconBatt = {22x22/status/battery-low.png}
														Set $IconBatt2 = {22x22/status/battery-charging-low.png}
														ChangeForeColor 1 {#FF0000}
														ChangeForeColor 2 {#FF0000}
													End
												
												If $batt<5 Then
													Do{ Exec aplay $[SOUNDS_PATH]/AlertLowBatt.wav }
												
											End
									End
								End
							End
						End
				    
						Set $batt = $batt %
						
						
			############################ BATT DISCHARGING ###############
					
							If $acstate==off-line Then
							Begin
								
								Set $remaining_prev = $remaining
								Set $remaining = (GetOutput {cat /proc/acpi/battery/BAT?/state} 5 3)			
								Set $koko = (Mult $remaining -1)
								Set $ecart = (Add $remaining_prev $koko)
								If $ecart==0 Then 
									Begin
										Set $ecart = 9
									End
								Else
									Begin
										#Do nothing
									End
									
									
									Set $temps = (Mult 60 $remaining)
									Set $temps = (Div $temps $ecart)
									Set $tempshour = (Div $temps 60)
									Set $tempsminute = (RemainderOfDiv $tempshour 60)
									Set $tempshour = (Div $tempshour 60)
									
									If $tempsminute<10 Then
										Begin
											Set $tempsminute = 0 $tempsminute
										End
									
									Set $temps = $tempshour h $tempsminute
								
								If $display=={percent} Then
									Begin
										Set $batt = * $batt 
										ChangeTitle 1 $batt
										ChangeIcon 2 $IconBatt
									End
								Else
									Begin
										Set $temps = * $temps
										ChangeTitle 1 $temps
										ChangeIcon 2 $IconBatt
									End
							End
							
				###################### AC ON - Charging ##################
							Else
							Begin
								
								Set $remaining_prev = $remaining
								Set $remaining = (GetOutput {cat /proc/acpi/battery/BAT?/state} 5 3)			
								Set $koko = (Mult $remaining_prev -1)
								Set $ecart = (Add $remaining $koko)
								If $ecart==0 Then
									Set $temps = {OK}
								Else
									Begin
										Set $temps = (Mult 60 $remaining)
										Set $temps = (Div $temps $ecart)
										Set $tempshour = (Div $temps 60)
										Set $tempsminute = (RemainderOfDiv $tempshour 60)
										Set $tempshour = (Div $tempshour 60)
										
										If $tempsminute<10 Then
											Begin
												Set $tempsminute = 0 $tempsminute
											End
										
										Set $temps = $tempshour h $tempsminute
									End
								
								If $display=={percent} Then
								Begin
									ChangeTitle 1 $batt
									ChangeIcon 2 $IconBatt2
								End
								Else
								Begin
									ChangeTitle 1 $temps
									ChangeIcon 2 $IconBatt2
								End
							End
								
			End
	End
	
End

	
	
	
#widget to display the text
Widget 1
	Property
		Position 22 0
		Size 55 24
		Type ItemDraw
		Flags NoReliefString
		Title {}
		Colorset 1
	Main
		Case message of
		SingleClic :
			Begin
			# switch between percent and time view
			If $display=={percent} Then
			Begin
			      Set $display= hour
			      ChangeTitle  1 $batt
			End
			Else
			Begin
			      Set $display= percent
			      ChangeTitle  1 $temps
			End
			    
			
			End
End

# widget to display the battery icons
Widget 2
	Property
		Position 2 0
		Size 18 22
		Type ItemDraw
		Icon {}
		Flags NoReliefString
	Main
		Case message of
		 SingleClic :
		 Begin
		 End
End
Et voici comment je l'utilise :

Code : Tout sélectionner

# AcpiBatt {{{1
All (FvwmButtons-AcpiBatt) Close
DestroyModuleConfig FvwmButtons-AcpiBatt: *
*FvwmButtons-AcpiBatt: Geometry 76x24-56+1
*FvwmButtons-AcpiBatt: BoxSize smart
*FvwmButtons-AcpiBatt: ActiveColorset $[cs_panel_active]
*FvwmButtons-AcpiBatt: Colorset $[cs_panel_inactive]
*FvwmButtons-AcpiBatt: Columns 2
*FvwmButtons-AcpiBatt: Padding 2 2
*FvwmButtons-AcpiBatt: Frame 0

*FvwmButtons-AcpiBatt: (2x1, Size 76 25, Swallow (Close, Respawn) "FvwmScript-AcpiBatt2")

Module FvwmButtons FvwmButtons-AcpiBatt
Script components/scripts/FvwmScript-AcpiBatt2
Et enfin voici les icones :
http://mysthr.free.fr/Documents/icon-batt.tar
Que je met dans le dossier $[Ou sont vos icone]/22x22/status/

Et pour les sons :
http://mysthr.free.fr/Documents/sons-batt.tar

Sinon j'ai un fichier de config avec mes variables d'environnement pour les sons et les icones :
SetEnv ICON_PATH $[FVWM_USERDIR]/icons
SetEnv SOUNDS_PATH $[FVWM_USERDIR]/sounds

Voila j'espère que quelqu'un pourra m'aider a améliorer ce script qui par moment se grise lorsque l'on clique trop dessus ... :p

Edit : Ha oui j'avais oublié de précisé, par rapport à l'exemple d'utilisation de ce script, que sur ma config, mon script s'appel FvwmScript-AcpiBatt2 ... donc à adapter au votre.

Publié : mar. 23 déc. 2008, 19:20
par guerrier-cachalot
Mon Dieu.
C'est si compliqué que ça fvwm ?!?!?!
Ps :tu as mis longtemps avant de savoir faire ça ? 2 ans ?!

Publié : mer. 24 déc. 2008, 08:40
par chipster
guerrier-cachalot a écrit :Mon Dieu.
C'est si compliqué que ça fvwm ?!?!?!
Ps :tu as mis longtemps avant de savoir faire ça ? 2 ans ?!
Faut lire la doc. Ce qui est long c'est le script. L'intégration d'un icône dans fvwm n'est pas d'une complexité énorme

L'avantage de ce genre de chose c'est que c'est ultra rapide ;)

Sinon, merci pour le code source et les icônes ;)

Publié : mer. 24 déc. 2008, 10:35
par Mysth-R
effectivement ce n'est pas tres complique. la doc officielle est tres bien faite. et puis ce programme n'est ni plus ni moins qu'une imbrication de if et de else... c'est un peu ce qu'il y a de plus basique en programmation...

ce code "fonctionne" en tout cas il previent quand la batterie est presque vide et qu'il est temps de rebrancher le secteur. C'est surtout pour cca que je l'ai ecrit. Mais il y a pas mal de petits bug a mon avis notament sur l'affichage exact du temps lors de la charge.
Le temps de decharge en revanche dois etre assez exact.
La seule chose qu'il faut savoir c'est que le programme est base sur une boucle de 1minute. Donc a chaque minute il recalcule le temps. Donc au debut si la premiere boucle ne fait pas 1 minute le temps affiche sera errone. il faut attendre la minute suivante.
Voila si quelqu'un veut y apporter des ameliorations n'hesitez pas a poster le resultat ici.

bonne fetes a tous !

Publié : mer. 24 déc. 2008, 13:26
par chipster
Mysth-R a écrit :effectivement ce n'est pas tres complique. la doc officielle est tres bien faite. et puis ce programme n'est ni plus ni moins qu'une imbrication de if et de else... c'est un peu ce qu'il y a de plus basique en programmation...

ce code "fonctionne" en tout cas il previent quand la batterie est presque vide et qu'il est temps de rebrancher le secteur. C'est surtout pour cca que je l'ai ecrit. Mais il y a pas mal de petits bug a mon avis notament sur l'affichage exact du temps lors de la charge.
Le temps de decharge en revanche dois etre assez exact.
La seule chose qu'il faut savoir c'est que le programme est base sur une boucle de 1minute. Donc a chaque minute il recalcule le temps. Donc au debut si la premiere boucle ne fait pas 1 minute le temps affiche sera errone. il faut attendre la minute suivante.
Voila si quelqu'un veut y apporter des ameliorations n'hesitez pas a poster le resultat ici.

bonne fetes a tous !
beau boulot en tous cas ;)

Publié : mer. 24 déc. 2008, 13:55
par guerrier-cachalot
Mais, l'état de la batterie n'est-il calculé par l'ordinateur lui-même, le chipset de la batterie ou un truc du genre ? Es-tu obligé de le "deviner" ?
Ca m'étonne ...
Sinon, c'est sûr que c'est la quantité de code qui fait peur ...
Sinon, peux-t-on écrire la même fonction en C++/C ? Pour plus de rapidité ...

Publié : mer. 24 déc. 2008, 17:32
par chipster
guerrier-cachalot a écrit :Mais, l'état de la batterie n'est-il calculé par l'ordinateur lui-même, le chipset de la batterie ou un truc du genre ? Es-tu obligé de le "deviner" ?
Ca m'étonne ...
Sinon, c'est sûr que c'est la quantité de code qui fait peur ...
Sinon, peux-t-on écrire la même fonction en C++/C ? Pour plus de rapidité ...
Bah si tu te sens d'attaque pour faire un code portable rapide et qui ne consomme pas, oui ;)
Quand je dis portable je pense à i686 et x64_86 hein ;)

Publié : mer. 24 déc. 2008, 17:42
par Mysth-R
En fait je peux connaître le dernier état de charge maximum en mA ou un truc du genre. et je peux aussi connaître combien il reste de charge.

Je ne me souviens plus exactement. J'avais récupéré un bout de code quelque part que j'ai repris et mis à ma sauce. Le truc c'est que ta batterie plus elle vieillie et moins elle a de capacité. Donc pour un pourcentage de charge restant c'est possible de le récupérer directement. Mais pour le temps, il faut obligatoirement le calculer. Ou alors il y a un autre moyen que je ne connais pas.

Il y a plein d'autres programmes qui le font. Conky en fait parti, gkrelmm aussi. Donc tu peux très bien le faire en C / C++

L'intérêt ici c'était d'avoir un script intégré à l'environnement FVWM

En tout cas si il y a un meilleur moyen de calculer le temps restant je suis preneur. J'avoue ne pas avoir trop pousser...

Publié : mer. 24 déc. 2008, 17:56
par guerrier-cachalot
Je suis pas con, je sais qu'une batterie ça s'use ...
Fvwm ne peut-il appeler ce programme et l'incorporer dans l'Icon ?
Un programme aurait sa propre allocation mémoire alors qu'un script fvwm non ... Mais non. On peut subbordonner l'un à l'autre dans la gestion de la mémoire, non ?
Je cherche à comprendre, car cette façon de faire(incorporer des programmes compilés, quitte à ce que ce soit compliqué) me parait la façon la plus logique pour rendre un WM plus léger et rapide.
Et puis je n'aime pas l'idée des languages interprétés comme python, java et co ... Tout ce qu'ils font, du compilé peut le faire non ? A fortiori le C++ puisqu'il est Turing complet.

Publié : jeu. 25 déc. 2008, 18:04
par Mysth-R
rien ne t'empeche de developper ton truc en c++ ...

Publié : jeu. 25 déc. 2008, 18:34
par guerrier-cachalot
Ce que j'aimerais savoir, c'est est-ce que cela pose des problêmes d'integration dans fvwm ?

Publié : jeu. 25 déc. 2008, 20:07
par chipster
guerrier-cachalot a écrit :Ce que j'aimerais savoir, c'est est-ce que cela pose des problêmes d'integration dans fvwm ?
Bah pour une modification tu es obligé de recompiler l'affaire ce qui n'est pas super pratique pour une installation sur un autre pc. Bon après il suffit de faire un petit script d'install et c'est fini ;)

Publié : jeu. 25 déc. 2008, 20:13
par guerrier-cachalot
Ah . Ah oui. Recompiler :? Pas pratique :shock:
A part pour un gros gros truc, y a aucuns interets.
D'où l'avantage du scriptage.
Bon j'arrête mes interruptions intempestives :lol:

Publié : sam. 17 janv. 2009, 18:39
par chipster
Tu pourras mettre en ligne ta config de fvwm stp ? :P

Publié : sam. 17 janv. 2009, 22:44
par Mysth-R
chipster a écrit :Tu pourras mettre en ligne ta config de fvwm stp ? :P
Je peux toujours faire un .tar
Mais c'est un peu le bordel...
En fait j'ai débuté avec fvwm-crystal.
Maintenant j'ai refait un peu un truc à ma sauce, tout en gardant des scripts de fvwm-crystal. Donc j'ai des dossiers, et des fichiers un peu dans tous les sens, meme si à mes yeux tout est très logique. :)
Par contre j'ai essayé de transféré ma config de mon pc portable vers mon pc fixe, et j'ai eu de gros soucis. Notament à cause de la différence de résolution d'écran et de nom d'utilisateur.
Mais si ça t'intéresse je peux le poster quelque part sur le forum. Je mettrais un petit README pour donner quelques indications sur l'installation.

Publié : dim. 18 janv. 2009, 10:26
par chipster
Mysth-R a écrit :
chipster a écrit :Tu pourras mettre en ligne ta config de fvwm stp ? :P
Je peux toujours faire un .tar
Mais c'est un peu le bordel...
En fait j'ai débuté avec fvwm-crystal.
Maintenant j'ai refait un peu un truc à ma sauce, tout en gardant des scripts de fvwm-crystal. Donc j'ai des dossiers, et des fichiers un peu dans tous les sens, meme si à mes yeux tout est très logique. :)
Par contre j'ai essayé de transféré ma config de mon pc portable vers mon pc fixe, et j'ai eu de gros soucis. Notament à cause de la différence de résolution d'écran et de nom d'utilisateur.
Mais si ça t'intéresse je peux le poster quelque part sur le forum. Je mettrais un petit README pour donner quelques indications sur l'installation.
Oui, je veux bien le récup, ça me donnera des idées et ça me permettra de faire des modifications. Si tu veux voir ce que je suis en train de faire, je peux te filer mon .fvwm
Bon pour le moment j'ai récup une config et je suis en train de faire des mises à jour pour corriger des problèmes. Je l'ai adapté quand même à ma sauce
Pour les répertoires, moi aussi j'en ai un peu partout ;)
Je préfère dispatcher et avoir quelque chose de clair plutôt que d'avoir 1 fichier et 1 répertoire et de tout mettre dedans :P