diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/LED_Panel_arduino/LED_Panel_arduino.ino b/LED_Panel_arduino/LED_Panel_arduino.ino new file mode 100644 index 0000000..bd3cb9e --- /dev/null +++ b/LED_Panel_arduino/LED_Panel_arduino.ino @@ -0,0 +1,47 @@ +#include + +#define PIN 3 +PololuLedStrip leds; +#define LED_COUNT 256 +#define BAUD 1000000 +rgb_color colors[LED_COUNT]; + +#define BRIGHTNESS 10 + +void setup() { + PololuLedStripBase::interruptFriendly = true; + Serial.begin(BAUD); + Serial.setTimeout(500); +} + +// main program +void loop() { + + byte buf[1]; + unsigned int c=0; + do{ + c++; + + if(Serial.readBytes(buf, 1) == 0) { + for (uint16_t i = 0; i < LED_COUNT; i++){ + colors[i] = rgb_color(0, 0, 0); + } + leds.write(colors, LED_COUNT); + } + }while(buf[0] != 255); + + if(c>1){ + Serial.print("Invalid Data Bytes: "); + Serial.println(c); + } + + + for (uint16_t i = 0; i < LED_COUNT; i++) + { + char col[3]; + Serial.readBytes(col, 3); + colors[i] = rgb_color(col[0], col[1], col[2]); + } + + leds.write(colors, LED_COUNT); +} diff --git a/pom.xml b/pom.xml index 135b37e..e970956 100644 --- a/pom.xml +++ b/pom.xml @@ -20,9 +20,9 @@ [2.0.0,3.0.0) - com.profesorfalken - jSensors - 2.2.1 + com.github.oshi + oshi-core + 5.5.1 com.tagtraum diff --git a/src/main/java/de/zuim/ledcontrol/EffectManager.java b/src/main/java/de/zuim/ledcontrol/EffectManager.java index 3f007e2..aabe28a 100644 --- a/src/main/java/de/zuim/ledcontrol/EffectManager.java +++ b/src/main/java/de/zuim/ledcontrol/EffectManager.java @@ -9,49 +9,53 @@ import java.awt.event.MouseListener; public class EffectManager { - int activeId=4; - private final LEDEffect[] effects = new LEDEffect[]{new TemperatureEffect(), new ClockEffect(), new SineEffect(), new AudioEffect(), new ColorSweep()}; + int activeId = 4; + private final LEDEffect[] effects = new LEDEffect[]{new ClockEffect(),new AudioVolume(), new TemperatureEffect(), new SineEffect(), new AudioFFT(), new ColorSweep()}; - public EffectManager(){ + public EffectManager() { - final SystemTray tray = SystemTray.getSystemTray(); - final TrayIcon trayIcon = new TrayIcon(new ImageIcon(getClass().getResource("/icon.png")).getImage(),"LEDEffects"); + final SystemTray tray = SystemTray.getSystemTray(); + final TrayIcon trayIcon = new TrayIcon(new ImageIcon(getClass().getResource("/icon.png")).getImage(), "LEDEffects"); - trayIcon.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - if(e.getButton()!=MouseEvent.BUTTON1) - System.exit(0); - getActiveEffect().unload(); - activeId++; - if(activeId==effects.length) - activeId=0; - getActiveEffect().load(); - trayIcon.setToolTip("LEDEffects - " + getActiveEffect().getDescription()); - } + trayIcon.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getButton() != MouseEvent.BUTTON1) + System.exit(0); + getActiveEffect().unload(); + activeId++; + if (activeId == effects.length) + activeId = 0; + getActiveEffect().load(); + trayIcon.setToolTip("LEDEffects - " + getActiveEffect().getDescription()); + } - @Override - public void mousePressed(MouseEvent e) {} + @Override + public void mousePressed(MouseEvent e) { + } - @Override - public void mouseReleased(MouseEvent e) {} + @Override + public void mouseReleased(MouseEvent e) { + } - @Override - public void mouseEntered(MouseEvent e) {} + @Override + public void mouseEntered(MouseEvent e) { + } - @Override - public void mouseExited(MouseEvent e) {} - }); - try { - tray.add(trayIcon); - } catch (AWTException e) { - e.printStackTrace(); - } + @Override + public void mouseExited(MouseEvent e) { + } + }); + try { + tray.add(trayIcon); + } catch (AWTException e) { + e.printStackTrace(); + } - getActiveEffect().load(); - } + getActiveEffect().load(); + } - public LEDEffect getActiveEffect() { - return effects[activeId]; - } + public LEDEffect getActiveEffect() { + return effects[activeId]; + } } diff --git a/src/main/java/de/zuim/ledcontrol/LEDControl.java b/src/main/java/de/zuim/ledcontrol/LEDControl.java index f762618..a7de024 100644 --- a/src/main/java/de/zuim/ledcontrol/LEDControl.java +++ b/src/main/java/de/zuim/ledcontrol/LEDControl.java @@ -1,108 +1,136 @@ package de.zuim.ledcontrol; import com.fazecast.jSerialComm.SerialPort; +import com.fazecast.jSerialComm.SerialPortDataListener; +import com.fazecast.jSerialComm.SerialPortEvent; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; +import java.nio.charset.StandardCharsets; public class LEDControl { - public static final int WIDTH=16; - public static final int HEIGHT=16; - public static final int LED_NUM = WIDTH*HEIGHT; - public static final int BAUD = 1000000; + public static final int WIDTH = 16; + public static final int HEIGHT = 16; + public static final int LED_NUM = WIDTH * HEIGHT; + public static final int BAUD = 1000000; - private SerialPort port; - private byte[][][] leds = new byte[WIDTH][HEIGHT][3]; - private EffectManager eff; - private BufferedImage scaledImage; + private SerialPort port; + private final byte[][][] leds = new byte[WIDTH][HEIGHT][3]; + private final EffectManager eff; + private BufferedImage scaledImage; - public LEDControl(){ - eff = new EffectManager(); + public LEDControl() { + eff = new EffectManager(); - Runtime.getRuntime().addShutdownHook(new Thread(() -> port.closePort())); + Runtime.getRuntime().addShutdownHook(new Thread(() -> port.closePort())); - connect(); + connect(); - sendLoop(); - } + sendLoop(); + } - private void sendLoop(){ - long time = System.nanoTime(); - long iteration = 0; + private void sendLoop() { + long time = System.nanoTime(); + long iteration = 0; - while(true){ - if(port == null || !port.isOpen()){ - sleep(1000); - connect(); - continue; - } + long minTimeDelta = Long.MAX_VALUE, + maxTimeDelta = 0; - long timeDelta = System.nanoTime()-time; - time = System.nanoTime(); + while (true) { + if (port == null || !port.isOpen()) { + if (!connect()) { + sleep(1000); + continue; + } + } - renderFrame(timeDelta); + long timeDelta = System.nanoTime() - time; + if(timeDelta > maxTimeDelta) + maxTimeDelta = timeDelta; + if(timeDelta < minTimeDelta) + minTimeDelta = timeDelta; + time = System.nanoTime(); - port.writeBytes(new byte[]{(byte) 255}, 1); //start of new frame + renderFrame(timeDelta); - for(int x=0;x>16)&0xff),254); - leds[x][y][1] = (byte) Math.min((col>>8)&0xff,254); - leds[x][y][2] = (byte) Math.min(((col)&0xff),254); - port.writeBytes(leds[x][y], 3); - } - } + port.writeBytes(new byte[]{(byte) 255}, 1); //start of new frame - sleep(10); + for (int x = 0; x < WIDTH; x++) { + for (int y = 0; y < HEIGHT; y++) { + int col = scaledImage.getRGB(x, (x % 2 == 1) ? leds[0].length - y - 1 : y); + leds[x][y][0] = (byte) Math.min(((col >> 16) & 0xff), 254); + leds[x][y][1] = (byte) Math.min((col >> 8) & 0xff, 254); + leds[x][y][2] = (byte) Math.min(((col) & 0xff), 254); + port.writeBytes(leds[x][y], 3); + } + } - if(iteration%1000==1){ - System.out.println("Frametime: "+ (Math.round(timeDelta)/100000)/10.0 + "ms ("+iteration+" Frames)"); - } - iteration++; - } - } + sleep(10); - private void connect(){ - SerialPort[] ports = SerialPort.getCommPorts(); - if(ports.length > 0){ - port = SerialPort.getCommPorts()[0]; - System.out.println("Connect to " + port.getDescriptivePortName()+" "+port.getSystemPortName()+" "); - port.setComPortParameters(BAUD,8,1,0); - port.openPort(); - } - } + if (iteration % 1000 == 1) { + System.out.println("Frametime: " + (Math.round(timeDelta) / 100000) / 10.0 + "ms ("+(Math.round(minTimeDelta) / 100000) / 10.0+"ms - "+(Math.round(maxTimeDelta) / 100000) / 10.0+"ms) " + iteration + " Frames"); + minTimeDelta = Long.MAX_VALUE; + maxTimeDelta = 0; + } + iteration++; + } + } - private void sleep(int ms){ - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + private boolean connect() { + SerialPort[] ports = SerialPort.getCommPorts(); + if (ports.length > 0) { + port = SerialPort.getCommPorts()[0]; + System.out.println("Connect to " + port.getDescriptivePortName() + " " + port.getSystemPortName() + " "); + port.setComPortParameters(BAUD, 8, 1, 0); + if (port.openPort()) { + port.addDataListener(new SerialPortDataListener() { + @Override + public int getListeningEvents() { + return SerialPort.LISTENING_EVENT_DATA_RECEIVED; + } - private void renderFrame(long timeDelta) { - BufferedImage image = new BufferedImage(16*eff.getActiveEffect().getScale(),16*eff.getActiveEffect().getScale(),BufferedImage.TYPE_INT_ARGB); - Graphics g = image.getGraphics(); - eff.getActiveEffect().render(timeDelta, g); - g.dispose(); + @Override + public void serialEvent(SerialPortEvent event) { + System.err.println("Received: " + new String(event.getReceivedData(), StandardCharsets.US_ASCII)); + } + }); + return true; + } + } - if(eff.getActiveEffect().getScale()==1){ - scaledImage = image; - }else{ - scaledImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); - AffineTransform at = new AffineTransform(); - at.scale(1.0/eff.getActiveEffect().getScale(), 1.0/eff.getActiveEffect().getScale()); - AffineTransformOp scaleOp = - new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); - scaledImage = scaleOp.filter(image, scaledImage); - } - } + return false; + } - public static void main(String[] args) { - new LEDControl(); - } + private void sleep(int ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void renderFrame(long timeDelta) { + BufferedImage image = new BufferedImage(16 * eff.getActiveEffect().getScale(), 16 * eff.getActiveEffect().getScale(), BufferedImage.TYPE_INT_ARGB); + Graphics g = image.getGraphics(); + eff.getActiveEffect().render(timeDelta, g); + g.dispose(); + + if (eff.getActiveEffect().getScale() == 1) { + scaledImage = image; + } else { + scaledImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + AffineTransform at = new AffineTransform(); + at.scale(1.0 / eff.getActiveEffect().getScale(), 1.0 / eff.getActiveEffect().getScale()); + AffineTransformOp scaleOp = + new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); + scaledImage = scaleOp.filter(image, scaledImage); + } + } + + public static void main(String[] args) { + new LEDControl(); + } } diff --git a/src/main/java/de/zuim/ledcontrol/LEDEffect.java b/src/main/java/de/zuim/ledcontrol/LEDEffect.java index f79f228..2650650 100644 --- a/src/main/java/de/zuim/ledcontrol/LEDEffect.java +++ b/src/main/java/de/zuim/ledcontrol/LEDEffect.java @@ -4,9 +4,17 @@ import java.awt.*; public interface LEDEffect { - String getDescription(); - default int getScale() {return 1; } - default void load() {} - default void unload() {} - void render(long timeDelta, Graphics g); + String getDescription(); + + default int getScale() { + return 1; + } + + default void load() { + } + + default void unload() { + } + + void render(long timeDelta, Graphics g); } diff --git a/src/main/java/de/zuim/ledcontrol/effects/AudioEffect.java b/src/main/java/de/zuim/ledcontrol/effects/AudioEffect.java deleted file mode 100644 index 996b183..0000000 --- a/src/main/java/de/zuim/ledcontrol/effects/AudioEffect.java +++ /dev/null @@ -1,179 +0,0 @@ -package de.zuim.ledcontrol.effects; - -import com.tagtraum.jipes.math.FFTFactory; -import com.tagtraum.jipes.math.Transform; -import de.zuim.ledcontrol.LEDControl; -import de.zuim.ledcontrol.LEDEffect; - -import javax.sound.sampled.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static de.zuim.ledcontrol.LEDControl.HEIGHT; -import static de.zuim.ledcontrol.LEDControl.WIDTH; - -public class AudioEffect implements LEDEffect { - @Override - public String getDescription() { - return "Audio Effect"; - } - - final static int BUFFERSIZE = 2048; - double[] magnitudes = null; - Thread audioThread = null; - - @Override - public void load() { - Runnable audioRunnable = () -> { - - - Mixer.Info[] mixers = AudioSystem.getMixerInfo(); - List availableTargetLines = new ArrayList<>(); - for (Mixer.Info mixerInfo : mixers){ - - Mixer m = AudioSystem.getMixer(mixerInfo); - - Line.Info[] lines = m.getTargetLineInfo(); - - for (Line.Info li : lines) - { - try - { - if(li instanceof DataLine.Info && mixerInfo.toString().contains("mix")) - { - m.open(); - System.out.println("("+availableTargetLines.size()+") Found target line: " + li+" "+mixerInfo + "("+li.getClass()+")"); - availableTargetLines.add(li); - m.close(); - } - } catch (LineUnavailableException e){ - System.out.println("Line unavailable."); - } - } - } - - DataLine.Info targetLineInfo = (DataLine.Info) availableTargetLines.get(0); - - System.out.println("SUPPORTED TARGET FORMATS: "); - AudioFormat[] formats = (targetLineInfo).getFormats(); - for(int i=0; i decode - - float[] fbuf = decode(buf,format); - - final float[][] transformed = fft.transform(fbuf); - final float[] realPart = transformed[0]; - final float[] imaginaryPart = transformed[1]; - magnitudes = toMagnitudes(realPart, imaginaryPart); - - //System.out.println("M"+ Arrays.toString(magnitudes)); - // do something with magnitudes... - int max = 0, avg = 0,min=11111111; - for(double m : magnitudes){ - avg += m; - if(m>max) - max= (int) m; - if(m { + + + Mixer.Info[] mixers = AudioSystem.getMixerInfo(); + List availableTargetLines = new ArrayList<>(); + for (Mixer.Info mixerInfo : mixers) { + + Mixer m = AudioSystem.getMixer(mixerInfo); + + Line.Info[] lines = m.getTargetLineInfo(); + + for (Line.Info li : lines) { + try { + if (li instanceof DataLine.Info && mixerInfo.toString().contains("mix")) { + m.open(); + System.out.println("(" + availableTargetLines.size() + ") Found target line: " + li + " " + mixerInfo + "(" + li.getClass() + ")"); + availableTargetLines.add(li); + m.close(); + } + } catch (LineUnavailableException e) { + System.out.println("Line unavailable."); + } + } + } + + DataLine.Info targetLineInfo = (DataLine.Info) availableTargetLines.get(0); + + System.out.println("SUPPORTED TARGET FORMATS: "); + AudioFormat[] formats = (targetLineInfo).getFormats(); + for (int i = 0; i < formats.length; i++) { + System.out.println("(" + i + ")" + formats[i]); + } + AudioFormat format = formats[2]; + + + System.out.println("SELECTED: " + format); + + + final DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); + final AudioInputStream audioStream; + + //verbesserung: https://stackoverflow.com/a/51240462 + try { + TargetDataLine targetLine = (TargetDataLine) AudioSystem.getLine(info); + targetLine.open(); + targetLine.start(); + audioStream = new AudioInputStream(targetLine); + + final byte[] buf = new byte[BUFFERSIZE]; + + final int numberOfSamples = buf.length / format.getFrameSize(); + final Transform fft = FFTFactory.getInstance().create(numberOfSamples); + while (audioThread != null) { + int read = audioStream.read(buf); + + fbuf = decode(buf, format); + + final float[][] transformed = fft.transform(fbuf); + final float[] realPart = transformed[0]; + final float[] imaginaryPart = transformed[1]; + magnitudes = toMagnitudes(realPart, imaginaryPart); + + //System.out.println("M"+ Arrays.toString(magnitudes)); + + int max = 0, avg = 0, min = 11111111; + for (double m : magnitudes) { + avg += m; + if (m > max) + max = (int) m; + if (m < min) + min = (int) m; + } + //System.out.println("M"+ max+" "+min+" "+avg/magnitudes.length+ " "+read+" "+magnitudes.length); + } + + audioStream.close(); + targetLine.close(); + } catch (Exception e) { + e.printStackTrace(); + } + }; + + audioThread = new Thread(audioRunnable); + audioThread.start(); + } + + @Override + public void unload() { + if (audioThread != null && audioThread.isAlive()) + audioThread = null; + } + + @Override + public void render(long timeDelta, Graphics g) { + for (int x = 0; x < WIDTH; x++) { + double val = 0; + + + if (magnitudes != null) { + double base = Math.exp(Math.log(magnitudes.length/2)/(WIDTH+3)); + + int intervalStart = (int) Math.pow(base,x+3), + intervalEnd = (int) Math.pow(base,x+4); + + //System.out.println(x+" "+intervalStart+"-"+intervalEnd); + + for(int magPos = intervalStart; magPos < intervalEnd; magPos++){ + val += magnitudes[magPos]; + } + + val /= intervalEnd-intervalStart; + /* + int magnitudesInPixel = (magnitudes.length / WIDTH) / 20; + + for (int sample = 0; sample < magnitudesInPixel; sample++) { + val += magnitudes[x * magnitudesInPixel + sample]; + } + val /= (double) magnitudes.length / WIDTH;*/ + } + int y = (int) Math.min(HEIGHT,Math.round(Math.max(1, val+10))/10); + g.setColor(new Color(Math.abs(y) + 1, 2, 0)); + g.drawRect(x, HEIGHT - y, 0, HEIGHT); + g.setColor(new Color(Math.abs(y), 0, 0)); + g.drawRect(x, HEIGHT - y, 0, 0); + } + } + + private static float[] decode(final byte[] buf, final AudioFormat format) { + final float[] fbuf = new float[buf.length / format.getFrameSize()]; + for (int pos = 0; pos < buf.length; pos += format.getFrameSize()) { + final int sample = format.isBigEndian() + ? byteToIntBigEndian(buf, pos, format.getFrameSize()) + : byteToIntLittleEndian(buf, pos, format.getFrameSize()); + // normalize to [0,1] + fbuf[pos / format.getFrameSize()] = sample / (Short.MAX_VALUE + 1.0f); + } + return fbuf; + } + + private static double[] toMagnitudes(final float[] realPart, final float[] imaginaryPart) { + final double[] powers = new double[realPart.length / 2]; + for (int i = 0; i < powers.length; i++) { + powers[i] = Math.sqrt(realPart[i] * realPart[i] + imaginaryPart[i] * imaginaryPart[i]); + } + return powers; + } + + private static int byteToIntLittleEndian(final byte[] buf, final int offset, final int bytesPerSample) { + int sample = 0; + for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { + final int aByte = buf[offset + byteIndex] & 0xff; + sample += aByte << 8 * (byteIndex); + } + return sample; + } + + private static int byteToIntBigEndian(final byte[] buf, final int offset, final int bytesPerSample) { + int sample = 0; + for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { + final int aByte = buf[offset + byteIndex] & 0xff; + sample += aByte << (8 * (bytesPerSample - byteIndex - 1)); + } + return sample; + } +} diff --git a/src/main/java/de/zuim/ledcontrol/effects/AudioVolume.java b/src/main/java/de/zuim/ledcontrol/effects/AudioVolume.java new file mode 100644 index 0000000..c34d6a1 --- /dev/null +++ b/src/main/java/de/zuim/ledcontrol/effects/AudioVolume.java @@ -0,0 +1,48 @@ +package de.zuim.ledcontrol.effects; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +import static de.zuim.ledcontrol.LEDControl.HEIGHT; +import static de.zuim.ledcontrol.LEDControl.WIDTH; + +public class AudioVolume extends AudioFFT { + + @Override + public String getDescription() { + return "Audio Volume"; + } + + List volHistory = new ArrayList<>(); + long timeDeltaSum = 0; + + @Override + public void render(long timeDelta, Graphics g) { + timeDeltaSum += timeDelta; + + if (fbuf != null) { + float avg = 0; + float max = 0; + for (float v : fbuf) { + avg += Math.abs(v); + if (v > max) { + max = v; + } + } + avg /= fbuf.length; + volHistory.add((int) (5 * avg)); + } + + if (volHistory.size() > WIDTH) { + volHistory.remove(0); + } + + for (int x = 0; x < volHistory.size(); x++) { + + g.setColor(new Color((int) ((Math.abs(volHistory.get(x)) + 1) * ((WIDTH - x) / (float) WIDTH)), 2, 0)); + g.drawRect(WIDTH - x - 1, HEIGHT - volHistory.get(x), 0, HEIGHT); + } + } + +} diff --git a/src/main/java/de/zuim/ledcontrol/effects/ClockEffect.java b/src/main/java/de/zuim/ledcontrol/effects/ClockEffect.java index 9eb9497..3fa49c6 100644 --- a/src/main/java/de/zuim/ledcontrol/effects/ClockEffect.java +++ b/src/main/java/de/zuim/ledcontrol/effects/ClockEffect.java @@ -36,7 +36,6 @@ public class ClockEffect implements LEDEffect { SimpleDateFormat formatter2 = new SimpleDateFormat("ss"); String text2 = formatter2.format(date); - g.clearRect(0,0,WIDTH,HEIGHT); g.setFont(font); g.setColor(new Color(0,10-date.getMinutes()/6,date.getMinutes()/6)); posOffset-=(4*getScale()*timeDelta)/1000000000.0; diff --git a/src/main/java/de/zuim/ledcontrol/effects/TemperatureEffect.java b/src/main/java/de/zuim/ledcontrol/effects/TemperatureEffect.java index 786aa1a..1f50972 100644 --- a/src/main/java/de/zuim/ledcontrol/effects/TemperatureEffect.java +++ b/src/main/java/de/zuim/ledcontrol/effects/TemperatureEffect.java @@ -1,58 +1,55 @@ package de.zuim.ledcontrol.effects; -import com.profesorfalken.jsensors.JSensors; -import com.profesorfalken.jsensors.model.components.Component; -import com.profesorfalken.jsensors.model.components.Components; -import com.profesorfalken.jsensors.model.components.Cpu; -import com.profesorfalken.jsensors.model.sensors.Fan; -import com.profesorfalken.jsensors.model.sensors.Load; -import com.profesorfalken.jsensors.model.sensors.Temperature; +import com.tagtraum.jipes.math.FFTFactory; +import com.tagtraum.jipes.math.Transform; import de.zuim.ledcontrol.LEDEffect; +import oshi.SystemInfo; +import oshi.hardware.*; +import javax.sound.sampled.*; import java.awt.*; -import java.util.ArrayList; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.List; +import static de.zuim.ledcontrol.LEDControl.WIDTH; +import static java.awt.image.ImageObserver.HEIGHT; + public class TemperatureEffect implements LEDEffect { - @Override - public String getDescription() { - return "Temperatur Sensoren"; - } + @Override + public String getDescription() { + return "Temperatur Sensoren"; + } - @Override - public void render(long timeDelta, Graphics g) { - /*Components components = JSensors.get.components(); + NetworkIF network = null; + CentralProcessor cpu = null; + Sensors sensors = null; - List comps = new ArrayList<>(components.cpus); - comps.addAll(components.disks); - comps.addAll(components.gpus); - comps.addAll(components.mobos); + @Override + public void load() { + if(sensors == null){ + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + network = hal.getNetworkIFs().get(0); + cpu = hal.getProcessor(); + sensors = hal.getSensors(); + } + } - if (comps != null) { - for (final Component c : comps) { - System.out.println("Found component: " + c.name); - if (c.sensors != null) { - System.out.println("Sensors: "); + private Font font = new Font("Calibri", Font.BOLD, 12*getScale()); - //Print temperatures - List temps = c.sensors.temperatures; - for (final Temperature temp : temps) { - System.out.println(temp.name + ": " + temp.value + " C"); - } + @Override + public void render(long timeDelta, Graphics g) { - //Print fan speed - List fans = c.sensors.fans; - for (final Fan fan : fans) { - System.out.println(fan.name + ": " + fan.value + " RPM"); - } - //Print fan speed - List loads = c.sensors.loads; - for (final Load load : loads) { - System.out.println(load.name + ": " + load.value + " %"); - } - } - } - }*/ - } + String text = "---"; + if(sensors!=null){ + text = Math.round(cpu.getSystemLoadAverage(1)[0]*100)+"%\n"; + text+= sensors.getCpuTemperature(); + } + + g.setFont(font); + g.setColor(new Color(26, 9, 9)); + g.drawString(text, 0, 8*getScale()); + } }