luni, 6 iulie 2015

Lazarus / FPC - run a command and read it's output, working with system tray; laptop's battery on OpenSuSE 12.x - 13.1

     For unknown reasons, KDE on OpenSuSE 12.x and 13.1 (so far) does not recognize correctly the battery of my Acer laptop. It says “Battery not present”, wich is not true. After some unsuccessful attempts to fix this, I gave up and decided to write my own program. 

     In order for my program to work, it must:
1) Run a LINUX command line to obtain the battery statistics and load the output
2) Analyse the output an identify the values that are needed
3) Create a simple interface to display the results
4) Minimise the main form to system tray (and then maximise if needed)
5) Change the system tray icon to display the level of the battery for quick view and artistic impression :-)

You need:
- a form
- a memo
- 2 buttons
- a ImageList from Common Controls
- a timer
- a TrayIcon from Additional

Doubleclick on ImageList to load the images you like for different battery states (I created my own, size 16x32)

The full program can be downloaded from here

If you are not interested in the source code, you need only the file BatteryF

Here is the full code

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Buttons, Process, strutils;

type

  { TForm1 }

  TForm1 = class(TForm)
    ImageList1: TImageList;
    Memo1: TMemo;
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    Timer1: TTimer;
    TrayIcon1: TTrayIcon;
    procedure FormShow(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrayIcon1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Bmp: tbitmap;
  Bat: integer;

function get1:tstringlist;

implementation

{$R *.lfm}

{ TForm1 }

function get1:tstringlist;
var l:tstringlist; Proc1: tprocess; t1,t2:string; i,j,k:integer;
begin
   bmp :=tbitmap.Create;
   form1.Memo1.Lines.Clear;

   /// run a command line and read the output
   /// first we must determine if a battery is present or detected

   l:=tstringlist.Create;
   proc1:=tprocess.Create(form1);

   proc1.Executable:='upower';
   proc1.Parameters.Add('-e');

   proc1.Options := proc1.Options + [poWaitOnExit, poUsePipes];
   proc1.Execute;
   l.LoadFromStream(proc1.Output);    /// load the output to stringlist
   t1:='';
   for i:=0 to l.Count-1 do
   begin
     t2:=l[i];
     if AnsiContainsText(t2,'BAT') then t1:=t2;  /// BAT is for battery
   end;

/// if a battery is detected
  if t1<>'' then
   begin
     form1.trayicon1.Hint:='';
     proc1.Parameters.Clear;
     proc1.Parameters.Add('-i');  /// for more details see upower documentation
     proc1.Parameters.Add(t1);
     proc1.Execute;
     l.LoadFromStream(proc1.Output);

     for i:=0 to l.Count-1 do
     begin
       t2:=l[i];
       if AnsiContainsText(t2,'percentage') then      /// find the battery level
        begin
          j:=length(t2);
          bat:=strtoint(midstr(t2,j-3,3));
          form1.Caption:='Battery level: '+inttostr(bat)+'%';
          form1.trayicon1.Hint:=form1.trayicon1.Hint+t2+chr(13);
        end;
       if AnsiContainsText(t2,'time to empty') then
            form1.trayicon1.Hint:=form1.trayicon1.Hint+t2+chr(13);
     end;
/// "form caption" and "trayicon hint" are for artistic impression :-)
/// if upower displays the results in a different language (I don't know if it can),
    // the program will find nothing when searching for "percentage" and "time to empty"
    // so you must modify the keyword acording to your language
   k:=0;
   if bat>20 then k:=1; /// select the image number from timagelist for system tray
   if bat>35 then k:=2;
   if bat>50 then k:=3;
   if bat>70 then k:=4;
   if bat>90 then k:=5;
   if bat=100 then k:=7;

   form1.imagelist1.GetBitmap(k,bmp);   /// get the image from timagelist
   form1.trayicon1.Icon.assign(bmp);    /// assign the image to system tray

   end

  else
      begin
        l.Add('Battery not detected or not present');
        form1.imagelist1.GetBitmap(6,bmp);
        form1.trayicon1.Icon.assign(bmp);
      end;

   proc1.Free;
   bmp.Free;
   result:=l;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
    memo1.Text:=get1.Text;   /// display the full statistics
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  form1.close;    /// terminate the program
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  form1.Hide;     /// minimise to system tray
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   memo1.Text:=get1.Text;   /// refresh the status every 60 seconds
end;

procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
  form1.Show;      /// show the main form when click on tray icon
end;

end.
 
 

vineri, 17 aprilie 2015

Raspberry Pi - A (very) simple GUI for OMXPlayer

I have created a simple GUI for OMXPlayer on Raspberry Pi

It can be downloaded from here:

https://www.dropbox.com/sh/d5bw7h3j33vmu5t/AAARZeUlm4pvHHJwnqUEn4Jqa?dl=0

The only needed file is omxGUI, but I also uploaded the sources (written, of course, in Pascal)

vineri, 3 aprilie 2015

Indy 10.6 / Lazarus 1.2 / OpenSuSE 13.1

Here are the steps that I followed in order to install Indy 10.6 package on Lazarus. I don't know if all of those steps are required, but it just worked that way.


1) Download the Indy package from here:
        http://indy.fulgan.com/ZIP/
Unzip it somewhere where you can use it.

2) In order for the new Indy not to interfere with the old one, completly remove Lazarus (uninstall, delete the old directory - c:\lazarus on Windows or .lazarus on Linux home)

3) Install Lazarus

4) On Linux the package has a bug (I think): it can't correctly locate the subfolders so it will say that some files are missing. To prevent that just go to the \Lib directory and copy here the content of the following subdirectories: Lib\Core, Lib\Systems, Lib\Protocols

5) Compile the package Lib\indylaz.lpk TWICE (don't ask me why)

6) Install the package

7) Add to your projects the path to \Lib directory (Project >Project Options > Paths > Other unit files

8) Enjoy!

duminică, 16 noiembrie 2014

Lazarus / FPC - some of my work

Here are some programs that I am working with. I hope someone will find some of them useful

https://www.dropbox.com/sh/d5bw7h3j33vmu5t/AAARZeUlm4pvHHJwnqUEn4Jqa?dl=0

Raspberry Pi - Fixing some USB issues

    The USB ports appear to be somehow unstable on Raspberry Pi. A complete explanation and a solution that worked for me can be found here:

   http://ludovicrousseau.blogspot.ro/2014/04/usb-issues-with-raspberry-pi.html

In short, this is what I did:

1. Start a file manager with root privileges
        sudo thunar        (thunar is my file manager)

2. Edit the file /boot/cmdline.txt and add dwg_otg.speed=1  Your file should look like this:
   dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
   dwc_otg.speed=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4
   elevator=deadline rootwait

3. Save and reboot

PS: I have a ASIC USB Miner for bitcoins that I'm running on Raspberry Pi just for fun (it didn't produced anything so far and I'm not expecting it to do so). The solution above appears to fix the stability of the system (it was freezing every 5-10 hours, now it's working non-stop for about 2 days)


vineri, 7 noiembrie 2014

OpenSuSE 13.1 / VLC error: No suitable decoder module

I've just switched from OpenSuSE 12.3 to 13.1 and I got this problem. VLC won't play a video file and returned the following error:

"No suitable decoder module: VLC does not support the audio or video format "mp4v". Unfortunately there is no way for you to fix this."

Fortunately, there is a way to fix this, and here is how:

1) Completely remove all VLC files with the following command (open a terminal and type):
sudo zypper rm libavc1394-0 libavutil52 libcaca0 libcddb2 libdirac_encoder0 libdvbpsi7 libdvdnav4 libebml4 libgme0 libmatroska6 libmodplug1 libshout3 libslang2 libswscale2 libupnp6 libvlc5 libvlccore7 libxcb-xv0 libzvbi0 vlc-noX vlc-noX-lang vlc-qt

2) Install VLC with OneClick Install from VLC's home page

That's all!



sâmbătă, 1 noiembrie 2014

OpenSUSE 13.1 / older nVIDIA cards / nVIDIA GeForce G105M

    I have a laptop ACER with nVIDIA GeForce G105M videocard. Yes, it is about 5 years old and I have a lot of problems with OpenSuSE (12.x, 13.1) and nVIDIA drivers.
     I have covered some issues in a previous post when I posted a config file example.
     My videocard requires the nVIDIA G02 package. However, some programs insist to install the nVIDIA G03 package (I don't know why), so I have to be very careful. If the 03 package is installed it will mess up the entire system (OpenGL not working anymore, multiple images of the desktop on the laptop's display). I tried to ban the installation of the 03 package but it didn't seem to work, so the only option is to check very carefully every installation (why is Mozilla Thunderbird trying to install video drivers I can't imagine).

    So far, OpenSuSE 13.1 is working (almost) properly: KDE desktop is not working with OpenGL when I attach a monitor to the laptop (yet other programs that requires OpenGL are working; I can live with that)