RSS Git Download  Clone
Raw Blame History
# on Windows: perl .\geo_stream.pl -f <log_file_name> [-i <seconds>]

=begin
monitor memory useage in powershell:
# Get the Perl process ID
$proc = Get-Process perl

# Monitor it
while ($true) {
    $proc.Refresh()
    "{0:HH:mm:ss} | {1} MB" -f (Get-Date), ([math]::Round($proc.WorkingSet64 / 1MB, 2))
    Start-Sleep 2
}
=cut

use 5.34.0;
use lib '.';
use GeoStream;
use Pod::Usage;
use Getopt::Long;
use Data::Printer;
use Time::HiRes qw(sleep);
use autodie qw(open close seek);

use utf8;
use open ':std', ':utf8';
binmode STDOUT, ':encoding(UTF-8)';
binmode STDERR, ':encoding(UTF-8)';
STDOUT->autoflush(1);
STDERR->autoflush(1);

# Handle interrupt gracefully
$SIG{INT} = sub { 
    say STDERR "\nShutting down...";
    exit 0;
};

# Command line options
my %opts;
GetOptions(
    'file|f=s'     => \$opts{file},
	'test|t'       => \$opts{test},
    'interval|i=f' => \$opts{interval} // 0.5,
); # p %opts;
pod2usage("Error: Log file required\n") unless $opts{file};

my $geo = GeoStream->new( test_output => $opts{test} );

monitor_log($opts{file}, $opts{interval});

sub monitor_log {
    my ($log_file, $interval) = @_;
    my $last_size = -s $log_file // die "Cannot access $log_file: $!\n";

    while (1) {
        eval {
            my $size = -s $log_file;
            if ($size > $last_size) {
                open my $fh, '<', $log_file;
                seek($fh, $last_size, 0);
                while (<$fh>) { # say $_;
                    $geo->decode_line($_);
                }
                close $fh;
                $last_size = $size;
            }
        };
        warn "Error reading $log_file: $@" if $@;
        sleep $interval;
    }
}

__END__

=head1 NAME

geo_stream_live.pl - Monitor X-Plane log file for geographic data

=head1 SYNOPSIS

    geo_stream_live.pl -f <logfile> [-i <interval>]

    Options:
        -f, --file      Log file to monitor (required)
        -i, --interval  Check interval in seconds (default: 0.5)
        -h, --help      Show this help

=head1 DESCRIPTION

Monitors an X-Plane log file in real-time and processes geographic data.
Handles Windows file streaming limitations.

=cut