2016年12月13日

Raspberry Pi 3 での簡単なツール作り

Raspberry Pi 3 のユーティリティツールでvcgencmdという便利なものがある。各種センサとか環境設定の状況とかを取得設定するものなのだが、なにせコマンドラインツールなのでいちいち打ち込む必要がある。まぁ一度見れば済むようなデータはいいんだけど特に温度とかは状況変化を見ていく必要があるのにいちいち打ち込んでるのは変なので、折角だしLazarusで簡単なツールを作ってデスクトップのどっかにちょこんと置いて見られるようにしてみようと思った。大して難しいことではない。 LazarusのTProcess使った外部プロセス起動を利用すれば直ぐにできるのだ。
そして、それに関しては公式にソースまでご丁寧に乗っている。

Executing External Programs - TProcess

ここのReading large outputのところのソースをそっくりいただいたwwww
しかしそれだけでは芸がないので、こいつをカプセル化して関数にしてしまえば再利用に非常に便利だ。

unit extprocs;

interface

{$mode objfpc}{$H+}

uses
Classes, SysUtils, Process;

procedure shell(cmd:string; args, dest:TStrings);

const
BUF_SIZE = 2048;

implementation

procedure shell(cmd:string; args, dest:TStrings);
var
AProcess : TProcess;
OutputStream : TStream;
BytesRead : longint;
Buffer : array[1..BUF_SIZE] of byte;
begin
AProcess := TProcess.Create(nil);
AProcess.Executable := cmd;
AProcess.Parameters.Assign(args);
AProcess.Options := [poUsePipes];

AProcess.Execute;

OutputStream := TMemoryStream.Create;

repeat
BytesRead := AProcess.Output.Read(Buffer, BUF_SIZE);
OutputStream.Write(Buffer, BytesRead)
until BytesRead = 0; // Stop if no more data is available
AProcess.Terminate(0); //
AProcess.Free;

with dest do
begin
OutputStream.Position := 0; // Required to make sure all data is copied from the start
LoadFromStream(OutputStream);
end;
// Clean up
OutputStream.Free;
end;

end.



まさに丸写しなのだが(笑)例えば定期的にRPi3でCPU温度の表示を更新したりする場合、Timer使って

procedure TForm1.Timer1Timer(Sender:TObject);
var
args,dest:TStringlist;
cmd:string;
begin
args:=TStringList.Create;
dest:=TStringList.Create;
cmd:='vcgencmd';
args.Add('measure_temp');
shell(cmd,args,dest);
Label1.Caption:=dest.Text;
args.Free;
dest.Free;
end;


とやればサクっと温度をタイマーの間隔で更新できる。CPU負荷を考えればもう少しやりようはあるかも知れんが、お手軽にシェルコマンドを特定の機能に絞って簡略化するには丁度良いのではないかと思う。
まぁ例えばls使ってエクスプローラもどきみたいなものを作って遊ぶとかw

posted by MCI_Error at 23:44| Comment(0) | raspberry pi 3
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: