BusClassifier.java :  » UnTagged » cubt » edu » cuhk » cubt » classifier » Android Open Source

Android Open Source » UnTagged » cubt 
cubt » edu » cuhk » cubt » classifier » BusClassifier.java
package edu.cuhk.cubt.classifier;

import android.os.Handler;
import android.os.Message;
import android.text.format.Time;
import edu.cuhk.cubt.state.BusState;
import edu.cuhk.cubt.state.PoiState;
import edu.cuhk.cubt.state.SpeedState;
import edu.cuhk.cubt.state.State;
import edu.cuhk.cubt.state.event.StateChangeEvent;

public class BusClassifier extends AbstractClassifier<BusState>
  implements Classifier{
  
  private static final int MSG_STOP_LEAVE_DELAY = 13101;
  private static int STOP_LEAVE_DELAY_TIME = 15 * 1000;
  
  private Time stopLeaveTime = new Time();
  private Time stopEnterTime = new Time();
  
  private boolean isInStop = false;
  private boolean isActivePeriod = false;
  
  PoiClassifier poiClassifier;
  SpeedClassifier speedClassifier;
  
  public BusClassifier(PoiClassifier poiClassifier, SpeedClassifier speedClassifier){
    super(BusState.UNKNOWN);
    
    this.speedClassifier = speedClassifier;
    this.poiClassifier =  poiClassifier;
  }

  @Override
  protected void processClassification() {
    if(!isActivePeriod) return; //don't classify when in stop
    
    Time now = new Time();
    now.setToNow();    
    
    //inside delay time
    if(now.toMillis(false) < stopLeaveTime.toMillis(false) + STOP_LEAVE_DELAY_TIME){
      if(speedClassifier.getState() == SpeedState.NORMAL){
        setState(BusState.ONBUS);      
        isActivePeriod = false;
      }
    }else{
      setState(BusState.OFFBUS);    
      isActivePeriod = false;    
    }
  }

  private void onStopLeavedEvent() {
    stopLeaveTime.setToNow();
    isInStop = false;
    if(speedClassifier.getState() == SpeedState.NORMAL){
      this.setState(BusState.ONBUS);
    }else{
      isActivePeriod = true;
      mHandler.obtainMessage(MSG_STOP_LEAVE_DELAY);
      mHandler.sendEmptyMessageDelayed(MSG_STOP_LEAVE_DELAY, STOP_LEAVE_DELAY_TIME);
    }
  }

  private void onStopEnteredEvent() {
    stopEnterTime.setToNow();
    isInStop = true;
    if(getState() != BusState.ONBUS){
      setState(BusState.WAITBUS);
    }
  }
  
  Handler mHandler = new Handler(){
    @SuppressWarnings("unchecked")
    @Override
    public void handleMessage(Message msg){
      switch(msg.what){
      case State.TYPE_SPEED:
        StateChangeEvent<SpeedState> evt = (StateChangeEvent<SpeedState>) msg.obj;
        SpeedState state = evt.getNewState();
        if(state == SpeedState.NORMAL){
          processClassification();
        }
        break;

      case State.TYPE_POI:
        StateChangeEvent<PoiState> poiState = (StateChangeEvent<PoiState>) msg.obj;
        if(poiState.getNewState() == PoiState.INSIDE_BUS_STOP){
          onStopEnteredEvent();
        }
        if(poiState.getOldState() == PoiState.INSIDE_BUS_STOP){
          onStopLeavedEvent();
        }
        break;
        
      case MSG_STOP_LEAVE_DELAY:
        processClassification();        
        break;
      }      
    }
  };

  @Override
  protected void onStart() {
    poiClassifier.addHandler(mHandler);
    speedClassifier.addHandler(mHandler);
  }

  @Override
  protected void onStop() {
    poiClassifier.removeHandler(mHandler);
    speedClassifier.removeHandler(mHandler);
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.