/**
 *	Generated by Dragonfly SDK
 *
 */
package audioeventtester.servicetracker;

import org.osgi.framework.BundleContext;
import org.osgi.service.log.LogService;

import com.buglabs.application.AbstractServiceTracker;
import com.buglabs.bug.module.audio.pub.IAudioEventProvider;
import com.buglabs.bug.module.audio.pub.IAudioModuleControl;
import com.buglabs.device.ButtonEvent;
import com.buglabs.device.IButtonEventListener;
import com.buglabs.util.LogServiceUtil;

 /**
 *	Service tracker for the BugApp Bundle;
 *
 */
public class AudioEventTesterServiceTracker extends AbstractServiceTracker implements IButtonEventListener {	

	private IAudioEventProvider aep;
	private LogService log;
	private IAudioModuleControl amc;

	public AudioEventTesterServiceTracker(BundleContext context) {
		super(context);
		this.context = context;
	}
	
	/**
	 * Determines if the application can start.
	 */
	public boolean canStart() {
		return super.canStart();
	}
	
	/**
	 * If canStart returns true
     * this method is called to start the application.
     * Place your fun logic here. 
	 */
	public void doStart() {
		System.out.println("AudioJackAndButtonTestServiceTracker: start");
		log = LogServiceUtil.getLogService(context);
		aep = (IAudioEventProvider)getService(IAudioEventProvider.class);
		amc = (IAudioModuleControl)getService(IAudioModuleControl.class);
		aep.addListener(this);
		
	}

	/**
	 * Called when a service that this application depends is unregistered.
	 */
	public void doStop() {
		System.out.println("AudioJackAndButtonTestServiceTracker: stop");
		aep.removeListener(this);

	}

	/**
	 * Allows the user to set the service dependencies by
     * adding them to services list returned by getServices().
     * i.e.nl getServices().add(MyService.class.getName());
	 */
	public void initServices() {
		getServices().add("com.buglabs.bug.module.audio.pub.IAudioEventProvider");
		getServices().add("com.buglabs.bug.module.audio.pub.IAudioModuleControl");
		
	}

	/*
	 * Method to handle events from IAudioEventProvider service.  It just sets the Audio module's
	 * Green LED to ON while the event is "occuring" (i.e. jack is inserted, or button is pressed)
	 * then sets it to OFF when the event is over.  
	 * 
	 * NOTE: In fact, there is no way to distinguish between the "over" part of the events, 
	 * as there is with the beginning of events.  For example, if you put a jack into HP, then
	 * plug and remove a jack into LO, there is no way for me to distinguish which jack has been 
	 * removed.  
	 * 
	 * (non-Javadoc)
	 * @see com.buglabs.device.IButtonEventListener#buttonEvent(com.buglabs.device.ButtonEvent)
	 */
	public void buttonEvent(ButtonEvent event) {
/*		 System.out.println("Action:" +event.getAction());
		 System.out.println("Button:" +event.getButton());
		 System.out.println("Raw:" +event.getRawValue());*/
		try {
			if (event.getAction() == IAudioEventProvider.LINEIN_INSERTED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: linein inserted");
			} else if (event.getAction() == IAudioEventProvider.MIC_INSERTED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: mic inserted");
			} else if (event.getAction() == IAudioEventProvider.HEADPHONE_INSERTED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: headphone inserted");
			} else if (event.getAction() == IAudioEventProvider.LINEOUT_INSERTED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: lineout inserted");
			} else if (event.getAction() == IAudioEventProvider.BUTTON_AUDIO_VOLUP_PRESSED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: Button up pressed");
			} else if (event.getAction() == IAudioEventProvider.BUTTON_AUDIO_VOLDOWN_PRESSED_ACTION) {
				amc.setLEDGreen(true);
				log.log(LogService.LOG_INFO, "Received event: Button down pressed");
			} else if (event.getButton() == ButtonEvent.BUTTON_AUDIO && event.getRawValue() == 40 && 
					(event.getAction() == IAudioEventProvider.BUTTON_RELEASED_ACTION || event.getAction() == IAudioEventProvider.JACK_REMOVED_ACTION)){
			   amc.setLEDGreen(false);
			   log.log(LogService.LOG_INFO, "Received event: release");
			}
		} catch (Exception e) {}
	}
	
}