package pl.llp.aircasting.service;
import pl.llp.aircasting.helper.SettingsHelper;
import pl.llp.aircasting.helper.SoundHelper;
import pl.llp.aircasting.model.Sensor;
import pl.llp.aircasting.model.SensorManager;
import pl.llp.aircasting.model.events.MeasurementLevelEvent;
import pl.llp.aircasting.model.internal.MeasurementLevel;
import pl.llp.aircasting.sensor.ExternalSensorDescriptor;
import android.content.Intent;
import android.os.IBinder;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
import ioio.lib.api.PwmOutput;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.IOIOLooperProvider;
import ioio.lib.util.android.IOIOAndroidApplicationHelper;
import roboguice.service.RoboService;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class IOIOService extends RoboService implements IOIOLooperProvider
{
@Inject SensorManager sensorManager;
@Inject SoundHelper soundHelper;
@Inject EventBus eventBus;
@Inject SettingsHelper settings;
AtomicInteger redPower = new AtomicInteger();
AtomicInteger greenPower = new AtomicInteger();
AtomicInteger bluePower = new AtomicInteger();
private final IOIOAndroidApplicationHelper helper = new IOIOAndroidApplicationHelper(this, this);
private boolean started = false;
public IOIOService()
{
setColors(Colors.BLACK);
}
@Override
public void onCreate()
{
super.onCreate();
helper.create();
}
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
boolean found = shouldReallyStart();
if(!found)
{
return;
}
if (started)
{
helper.restart();
}
else
{
helper.start();
started = true;
}
eventBus.register(this);
}
private boolean shouldReallyStart()
{
List<ExternalSensorDescriptor> known = settings.knownSensors();
for (ExternalSensorDescriptor descriptor : known)
{
if(descriptor.getName().startsWith("IOIO"))
return true;
}
return false;
}
@Override
public void onDestroy()
{
stop();
helper.destroy();
super.onDestroy();
}
protected void stop()
{
if (started)
{
helper.stop();
started = false;
eventBus.unregister(this);
}
}
@Subscribe
public void onEvent(MeasurementLevelEvent event)
{
Sensor visibleSensor = sensorManager.getVisibleSensor();
if(visibleSensor.matches(event.getSensor()))
{
MeasurementLevel level = event.getLevel();
switch (level)
{
case TOO_LOW:
setColors(Colors.BLACK);
break;
case VERY_LOW:
setColors(Colors.GREEN);
break;
case LOW:
setColors(Colors.YELLOW);
break;
case MID:
setColors(Colors.ORANGE);
break;
case HIGH:
case VERY_HIGH:
setColors(Colors.RED);
break;
}
}
}
private void setColors(Colors color)
{
redPower.set(color.getRed());
greenPower.set(color.getGreen());
bluePower.set(color.getBlue());
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public IOIOLooper createIOIOLooper(String connectionType, Object extra)
{
return new BaseIOIOLooper()
{
private final int BLUE_LED_PIN = 34;
private final int RED_LED_PIN = 35;
private final int GREEN_LED_PIN = 36;
private PwmOutput blueLed;
private PwmOutput redLed;
private PwmOutput greenLed;
@Override
protected void setup() throws ConnectionLostException,
InterruptedException
{
blueLed = ioio_.openPwmOutput(BLUE_LED_PIN, 1000);
redLed = ioio_.openPwmOutput(RED_LED_PIN, 1000);
greenLed = ioio_.openPwmOutput(GREEN_LED_PIN, 1000);
}
@Override
public void loop() throws ConnectionLostException,
InterruptedException
{
redLed.setPulseWidth(redPower.get());
greenLed.setPulseWidth(greenPower.get());
blueLed.setPulseWidth(bluePower.get());
Thread.sleep(100);
}
};
}
}