Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*******************************************************************************
* Copyright (c) 2017 Red Hat Inc and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc - initial API and implementation
*******************************************************************************/
package org.eclipse.kapua.kura.simulator.generator;
import java.time.Duration;
import java.time.Instant;
import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.function.ToDoubleFunction;
import org.eclipse.kapua.kura.simulator.app.Application;
import org.eclipse.kapua.kura.simulator.app.ApplicationContext;
import org.eclipse.kapua.kura.simulator.app.Descriptor;
import org.eclipse.kapua.kura.simulator.app.Handler;
import org.eclipse.kapua.kura.simulator.app.data.SimplePeriodicGenerator;
public final class Generators {
private Generators() {
}
public static Function sine(final Duration period, final double amplitude, final double offset, final Short shift) {
final ToDoubleFunction func = sineDouble(period, amplitude, offset, shift);
return timestamp -> func.applyAsDouble(timestamp);
}
public static ToDoubleFunction sineDouble(final Duration period, final double amplitude, final double offset, final Short shift) {
final double freq = 1.0 / period.toMillis() * Math.PI * 2.0;
if (shift == null) {
return (timestamp) -> Math.sin(freq * timestamp.toEpochMilli()) * amplitude + offset;
} else {
final double radShift = Math.toRadians(shift);
return (timestamp) -> Math.sin(freq * timestamp.toEpochMilli() + radShift) * amplitude + offset;
}
}
public static Function sineBetween(final Duration period, final double lower, final double upper, final Short shift) {
final ToDoubleFunction func = sineDoubleBetween(period, lower, upper, shift);
return timestamp -> func.applyAsDouble(timestamp);
}
public static ToDoubleFunction sineDoubleBetween(final Duration period, final double lower, final double upper, final Short shift) {
final double delta = Math.abs(upper - lower);
final double amplitude = delta / 2.0D;
final double offset = amplitude + Math.min(lower, upper);
return sineDouble(period, amplitude, offset, shift);
}
public static Function> fromSingle(final String name, final Function function) {
return function.andThen(value -> Collections.singletonMap(name, value));
}
public static Application simpleDataApplication(final String applicationId, final GeneratorScheduler scheduler, final String metricName,
final Function metricFunction) {
return createApplication(applicationId, scheduler, "metrics", Collections.singletonMap(metricName, metricFunction));
}
public static Application createApplication(final String applicationId, final GeneratorScheduler scheduler, final String dataTopic,
final String metricName, final Function metricFunction) {
return createApplication(applicationId, scheduler, dataTopic, Collections.singletonMap(metricName, metricFunction));
}
public static Application createApplication(final String applicationId, final GeneratorScheduler scheduler, final String dataTopic,
final Map> generators) {
final Descriptor descriptor = new Descriptor(applicationId);
return new Application() {
@Override
public Descriptor getDescriptor() {
return descriptor;
}
@Override
public Handler createHandler(final ApplicationContext context) {
return new SimplePeriodicGenerator(context, scheduler, dataTopic, generators);
}
};
}
}