Created
February 21, 2024 02:56
-
-
Save mamemomonga/533402e00dc2cffcd49f79727e718827 to your computer and use it in GitHub Desktop.
Raspberry Pi5のいくつかの情報をvcgencmdから取得して見やすく表示するツール
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# Raspberry Pi5のいくつかの情報をvcgencmdから取得して見やすく表示するツール | |
# -------------------- | |
# 主な使い方 | |
# $ watch ./pi5-status.pl | |
# -------------------- | |
use strict; | |
use warnings; | |
use feature 'say'; | |
# https://elinux.org/RPI_vcgencmd_usage | |
# man vcgencmd | |
sub get_soc_temp { | |
my $buf=`vcgencmd measure_temp`; | |
my $temp=0; | |
if($buf=~/^temp=([0-9.]+)\'C/) { $temp=$1 } | |
return $temp; | |
} | |
sub get_throttled { | |
my $buf=`vcgencmd get_throttled`; | |
my $state=''; | |
if($buf=~/^throttled=0x(.+)/) { $state=$1 } | |
$state=unpack('N',pack('H*',sprintf("%08s",$state))); | |
my @res; | |
foreach my $bit(0..20) { | |
$res[$bit]=($state >> $bit) & 1; | |
} | |
return \@res; | |
} | |
sub get_arm_clock { | |
my $buf=`vcgencmd measure_clock arm`; | |
my $freq=0; | |
if($buf=~/^frequency\(0\)=(\d+)/) { $freq=$1 } | |
my $mhz=$freq/1000/1000; | |
return $mhz; | |
} | |
sub show_throttled { | |
my $throttled=shift; | |
my @mean=(); | |
$mean[0] ='Under-voltage detected'; | |
$mean[1] ='Arm frequency capped'; | |
$mean[2] ='Currently throttled'; | |
$mean[3] ='Soft temperature limit active'; | |
$mean[16]='Under-voltage has occurred'; | |
$mean[17]='Arm frequency capping has occurred'; | |
$mean[18]='Throttling has occurred'; | |
$mean[19]='Soft temperature limit has occurred'; | |
for(my $i=0;$i<20;$i++) { | |
my $bit=$throttled->[$i]; | |
if($bit) { | |
printf("[%02d] %s\n",$i,$mean[$i]); | |
} | |
} | |
} | |
sub get_pmic { | |
my %pmic; | |
my $pmic=`vcgencmd pmic_read_adc`; | |
foreach my $line(split(/\n/,$pmic)) { | |
if($line=~/^\s*(.+)_(A|V)\s(.+)=(.+)(A|V)$/) { | |
my ($name,$type,$val)=($1,$2,$4); | |
$pmic{$name}||={}; | |
$pmic{$name}->{$type}=$val; | |
} | |
} | |
return \%pmic; | |
} | |
sub show_pmic { | |
my $pmic=shift; | |
my $lf=1; | |
foreach my $key(sort keys %{$pmic}) { | |
my $av=$pmic->{$key}; | |
if(exists($av->{A})) { | |
printf("%10s %4.3fV %4.3fA",$key, $av->{V}, $av->{A}); | |
} else { | |
printf("%10s %4.3fV ",$key, $av->{V}); | |
} | |
if($lf==3) { | |
printf("\n"); | |
$lf=0; | |
} | |
$lf++; | |
} | |
printf("\n"); | |
} | |
{ | |
my $pmic=get_pmic(); | |
my $throtted=get_throttled(); | |
my $temp_soc=get_soc_temp(); | |
my $clock_arm=get_arm_clock(); | |
printf("SoC Temp: %4.2f 'C ARM Clock: %6.4f MHz\n",$temp_soc, $clock_arm); | |
say ''; | |
show_pmic($pmic); | |
say ''; | |
show_throttled($throtted); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment