@@ -0,0 +1,1413 @@
+package com.easternedgerobotics.rov.io;%0A%0Aimport com.easternedgerobotics.rov.value.CpuValue;%0A%0Aimport com.pi4j.system.SystemInfo;%0Aimport rx.Observable;%0Aimport rx.exceptions.Exceptions;%0Aimport rx.schedulers.Schedulers;%0A%0Aimport java.io.IOException;%0Aimport java.util.concurrent.TimeUnit;%0A%0Apublic final class CpuInformation %7B%0A    private final Observable%3CLong%3E interval;%0A%0A    /**%0A     * Constructs a CpuInformation instance that polls CPU properties at the specified interval.%0A     *%0A     * @param interval the interval at which to poll the CPU properties.%0A     * @param timeUnit the %7B@code TimeUnit%7D the interval is specified in.%0A     */%0A    public CpuInformation(final int interval, final TimeUnit timeUnit) %7B%0A        this.interval = Observable.interval(interval, timeUnit);%0A    %7D%0A%0A    /**%0A     * Returns an observable stream of CPU values.%0A     *%0A     * @return a stream of CPU values.%0A     */%0A    public final Observable%3CCpuValue%3E observe() %7B%0A        return interval.observeOn(Schedulers.io())%0A            .map(this::pollCpu)%0A            .observeOn(Schedulers.immediate());%0A    %7D%0A%0A    private CpuValue pollCpu(final long tick) %7B%0A        try %7B%0A            return CpuValue.create(%0A                SystemInfo.getClockFrequencyArm(), SystemInfo.getCpuTemperature(), SystemInfo.getCpuVoltage());%0A        %7D catch (final InterruptedException %7C IOException e) %7B%0A            throw Exceptions.propagate(e);%0A        %7D%0A    %7D%0A%7D%0A

Add CPU observable for voltage, freq, temperature