#!/usr/bin/env escript

-mode(compile).

%% Assume that Path is something like
%% /sys/devices/pci0000:00/0000:00:01.0/0000:0a:00.0/net/eth0/statistics/tx_bytes
%% and that we're reading bytes.

main([IntervalStr, Path]) ->
    Interval = list_to_integer(IntervalStr),
    timer:send_interval(Interval, tick),
    timer:send_interval(1000, sec),
    {ok, FH} = file:open(Path, [read, raw]),
    loop(FH, read_value(FH), 1000 / Interval).

read_value(FH) ->
    file:position(FH, 0),
    {ok, Bs} = file:read(FH, 1024),
    {Int, _} = string:to_integer(Bs),
    Int.

mbits(Num, Hz) ->
    (Num * 8 * Hz) / (1024*1024).

loop(FH, LastRead, Hz) ->
    loop(FH, LastRead, Hz, 0, 0).

loop(FH, LastRead, Hz, MaxBurst, Sum) ->
    receive
        tick ->
            NewRead = read_value(FH),
            Diff = NewRead - LastRead,
            %io:format("~.1f ", [mbits(Diff, Hz)]),
            loop(FH, NewRead, Hz, if Diff > MaxBurst ->
                                          Diff;
                                     true ->
                                          MaxBurst
                                  end, Sum + Diff);
        sec ->
            Max = mbits(MaxBurst, Hz),
            Avg = mbits(Sum, 1),
            io:format("Max ~.1f Mbit/s Avg ~.1f Mbit/s Ratio ~.1f @ ~p\n",
                      [Max, Avg, Max / Avg, time()]),
            loop(FH, LastRead, Hz)
    end.

