From 3443d8b909ac1284008b9237ea23178022a45ceb Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Fri, 11 Mar 2016 17:22:25 -0330 Subject: [PATCH 1/2] Add CpuValue class --- .../easternedgerobotics/rov/value/Cpu.java | 23 ++++++++ .../rov/value/CpuValue.java | 59 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/main/java/com/easternedgerobotics/rov/value/Cpu.java create mode 100644 src/main/java/com/easternedgerobotics/rov/value/CpuValue.java diff --git a/src/main/java/com/easternedgerobotics/rov/value/Cpu.java b/src/main/java/com/easternedgerobotics/rov/value/Cpu.java new file mode 100644 index 0000000..c378033 --- /dev/null +++ b/src/main/java/com/easternedgerobotics/rov/value/Cpu.java @@ -0,0 +1,23 @@ +package com.easternedgerobotics.rov.value; + +class Cpu implements ImmutableValueCompanion { + /** + * The ARM clock frequency. + */ + public long frequency; + + /** + * The core temperature of the main SoC in celsius. + */ + public float temperature; + + /** + * The core voltage. + */ + public float voltage; + + @Override + public CpuValue asImmutable() { + return new CpuValue(this); + } +} diff --git a/src/main/java/com/easternedgerobotics/rov/value/CpuValue.java b/src/main/java/com/easternedgerobotics/rov/value/CpuValue.java new file mode 100644 index 0000000..efbd0bc --- /dev/null +++ b/src/main/java/com/easternedgerobotics/rov/value/CpuValue.java @@ -0,0 +1,59 @@ +package com.easternedgerobotics.rov.value; + +import java.util.Objects; + +public class CpuValue implements MutableValueCompanion { + /** + * Constructs a CPU value with the given frequency, temperature, and voltage. + * + * @param frequency the ARM clock frequency. + * @param temperature The core temperature of the main SoC in celsius. + * @param voltage the core voltage. + * @return a CPU value with the given frequency, temperature, and voltage. + */ + public static CpuValue create(final long frequency, final float temperature, final float voltage) { + final Cpu cpu = new Cpu(); + cpu.frequency = frequency; + cpu.temperature = temperature; + cpu.voltage = voltage; + return new CpuValue(cpu); + } + + private final Cpu cpu; + + CpuValue(final Cpu cpu) { + this.cpu = cpu; + } + + @Override + public final Cpu asMutable() { + return cpu; + } + + @Override + public final boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final CpuValue cpuValue = (CpuValue) o; + return Objects.equals(cpu, cpuValue.cpu); + } + + @Override + public final int hashCode() { + return Objects.hash(cpu); + } + + @Override + public final String toString() { + return String.format( + "CpuValue{frequency=%d, temperature=%f, voltage=%f}", + cpu.frequency, + cpu.temperature, + cpu.voltage + ); + } +} From 08abd7de6788955866966597b1b1471c47ce189e Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Fri, 11 Mar 2016 17:22:57 -0330 Subject: [PATCH 2/2] Add CPU observable for voltage, freq, temperature --- .../rov/io/CpuInformation.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/com/easternedgerobotics/rov/io/CpuInformation.java diff --git a/src/main/java/com/easternedgerobotics/rov/io/CpuInformation.java b/src/main/java/com/easternedgerobotics/rov/io/CpuInformation.java new file mode 100644 index 0000000..9f17595 --- /dev/null +++ b/src/main/java/com/easternedgerobotics/rov/io/CpuInformation.java @@ -0,0 +1,45 @@ +package com.easternedgerobotics.rov.io; + +import com.easternedgerobotics.rov.value.CpuValue; + +import com.pi4j.system.SystemInfo; +import rx.Observable; +import rx.exceptions.Exceptions; +import rx.schedulers.Schedulers; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +public final class CpuInformation { + private final Observable interval; + + /** + * Constructs a CpuInformation instance that polls CPU properties at the specified interval. + * + * @param interval the interval at which to poll the CPU properties. + * @param timeUnit the {@code TimeUnit} the interval is specified in. + */ + public CpuInformation(final int interval, final TimeUnit timeUnit) { + this.interval = Observable.interval(interval, timeUnit); + } + + /** + * Returns an observable stream of CPU values. + * + * @return a stream of CPU values. + */ + public final Observable observe() { + return interval.observeOn(Schedulers.io()) + .map(this::pollCpu) + .observeOn(Schedulers.immediate()); + } + + private CpuValue pollCpu(final long tick) { + try { + return CpuValue.create( + SystemInfo.getClockFrequencyArm(), SystemInfo.getCpuTemperature(), SystemInfo.getCpuVoltage()); + } catch (final InterruptedException | IOException e) { + throw Exceptions.propagate(e); + } + } +}