XPadPresenter.java 6.66 KB
package com.sunvote.xpadapp.presenter;

import com.sunvote.util.LogUtil;
import com.sunvote.xpadapp.App;
import com.sunvote.xpadapp.MainActivity;
import com.sunvote.xpadcomm.ComListener;
import com.sunvote.xpadcomm.XPadApi;
import com.sunvote.xpadcomm.XPadApiInterface.BaseInfo;
import com.sunvote.xpadcomm.XPadApiInterface.CmdDataInfo;
import com.sunvote.xpadcomm.XPadApiInterface.KeypadInfo;
import com.sunvote.xpadcomm.XPadApiInterface.ModelInfo;
import com.sunvote.xpadcomm.XPadApiInterface.OnLineInfo;
import com.sunvote.xpadcomm.XPadApiInterface.VoteInfo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.util.Log;

public class XPadPresenter implements ComListener {
	private String TAG = "XPadPresenter";
	private ComListener cl;
	private XPadApi XPad;
	private int batteryLevel=0;

	private ModelInfo mModelInfo;
	private KeypadInfo mKeypadInfo;



	public XPadPresenter(Context context) {
		cl = (ComListener) context;
		XPad = XPadApi.getInstance();
		XPad.setComListener(this);
		checkOnlineThread.start();
		monitorBatteryState();
	}

	public void getWorkMode() {
		XPad.getWorkMode();
	}

	public void setWorkMode(int iMode) {
		XPad.setWorkMode(iMode);
	}

	public void getBaseStatus() {
		LogUtil.d(TAG, "getBaseStatus------");
		XPad.getBaseStatus();
	}

	public void getVoteStatus() {
		LogUtil.d(TAG, "getVoteStatus-------");
		XPad.getVoteStatus();
	}

	public void getKeypadParam() {
		XPad.getKeypadParam();
	}

	public void setKeypadParam(int keyId, byte[] KEYSN) {
		XPad.setKeypadParam(keyId, KEYSN);
	}

	public void checkOnLine(int volt, int keyinStatus) {
		XPad.checkOnLine(volt, keyinStatus);
	}

	public void submitVote(int ansType, String value) {
		XPad.submitVote(ansType, value);
	}

	public void submitVoteAllOK() {
		XPad.submitVoteAllOK();
	}

	public void comCommunicationTest(int sendn,int okn ){
		XPad.comCommunicationTest(sendn,okn);
	}
	
	public void cancelSubmitVoteAllOK(){
		XPad.cancelSubmitVoteAllOK();
	}

	private long keypadMatchTIme=0;
	public void execKeypadMatch(int iMode, int channel) {
		keypadMatchTIme = System.currentTimeMillis();
		XPad.execKeypadMatch(iMode, channel);
	}

	public void configMode() {
		XPad.configMode();
	}
	
	public void startFirmUpdate(byte[] fileBuffer){
		XPad.startFirmUpdate(fileBuffer);
	}

	private long lastRecvHeartBeatTime= System.currentTimeMillis();
	private Thread checkOnlineThread = new Thread("heartbit") {
		public void run() {
			while (true) {
				try {
					Thread.sleep(5000);
					long curr = System.currentTimeMillis();
					if(curr - keypadMatchTIme < 3000){
						LogUtil.d(TAG, "keypad match abort check online...");
						continue;
					}
					XPad.checkOnLine(batteryLevel, 0);
					long diff = (curr - lastRecvHeartBeatTime)/1000;
					if(diff >= 10*1000){
						LogUtil.d(TAG, "lastRecvHeartBeatTime before(ms):"+diff);
						OnLineInfo ol= new OnLineInfo();
						ol.baseId = 0;
						ol.chan = 0;
						ol.keyId = 0;
						ol.onLine = 0;
						ol.rssi = 100;
						ol.rx =0;
						ol.tx =0;
						ol.comError = 1;
						cl.onOnLineEvent(ol);

					}

				} catch (Exception e) {
					// TODO Auto-generated catch block
					LogUtil.e(TAG,e);
				}

			}
		}
	};

	private final int REPEAT_INTERVAL = 500;

	@Override
	public void onComData(byte[] data, int len) {
		// LogUtil.d(TAG, XPad.getDataBufString(data,len,"Recv"));
	}

	@Override
	public void onSendData(byte[] data, int len) {
		// LogUtil.d(TAG, XPad.getDataBufString(data,len,"Send"));
	}

	@Override
	public void onModelEvent(ModelInfo info) {
		mModelInfo = info;
		cl.onModelEvent(info);
	}

	private long lastBaseEventTime = 0;

	@Override
	public void onBaseEvent(BaseInfo info) {

		if (System.currentTimeMillis() - lastBaseEventTime < REPEAT_INTERVAL) {
			LogUtil.d(TAG, "ignore onBaseEvent");
			return;
		}
		lastBaseEventTime = System.currentTimeMillis();
		cl.onBaseEvent(info);
	}

	private long lastVoteEventTime = 0;

	@Override
	public void onVoteEvent(VoteInfo info) {
		if (System.currentTimeMillis() - lastVoteEventTime < REPEAT_INTERVAL) {
			LogUtil.d(TAG, "repeat onVoteEvent");
			//return;
		}
		lastVoteEventTime = System.currentTimeMillis();
		cl.onVoteEvent(info);
	}

	@Override
	public void onVoteSubmitSuccess(XPadApi.VoteResultItem item) {
		cl.onVoteSubmitSuccess(item);
	}

	@Override
	public void onKeyPadEvent(KeypadInfo info) {
		cl.onKeyPadEvent(info);
		mKeypadInfo = info;
	}

	@Override
	public void onOnLineEvent(OnLineInfo info) {
		lastRecvHeartBeatTime = System.currentTimeMillis();
		cl.onOnLineEvent(info);
		if(mModelInfo==null && info.onLine == 1){
			getWorkMode();
		}
		try {
			Thread.sleep(30);
		} catch (InterruptedException e) {
			LogUtil.e(TAG,e);
		}
		if(mKeypadInfo == null && info.onLine == 1){
			getKeypadParam();
		}

	}

	@Override
	public void onCmdData(CmdDataInfo info) {
		cl.onCmdData(info);

	}

	@Override
	public void onMultiPackageData(byte[] data, int len) {
		cl.onMultiPackageData(data, len);

	}

	@Override
	public void onMultiPackageStartDownload(int downType, int downId) {

	}

	@Override
	public void onVoteSubmitAllOkSuccess() {
		cl.onVoteSubmitAllOkSuccess();
	}

	@Override
	public void onComCommunicationTest(int sendn,boolean checkOk) {
		cl.onComCommunicationTest(sendn,checkOk);
	}

	@Override
	public void onServiceSubmitSuccess() {
		cl.onServiceSubmitSuccess();
	}

	private IntentFilter batteryLevelFilter;

	private void monitorBatteryState() {
		MainActivity mact = (MainActivity) cl;
		mact.batteryLevelRcvr = new BroadcastReceiver() {

			public void onReceive(Context context, Intent intent) {
				if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
					int rawlevel = intent.getIntExtra("level", -1);
					int scale = intent.getIntExtra("scale", -1);
					int status = intent.getIntExtra("status", -1);
					int health = intent.getIntExtra("health", -1);
					int voltage = intent.getIntExtra("voltage", 0);
					int level = -1; // percentage, or -1 for unknown
					if (rawlevel >= 0 && scale > 0) {
						level = (rawlevel * 100) / scale;
					}

					float val = (float) voltage / 1000;
					batteryLevel = (int)(val/0.04);

				}
			}
		};
		batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
		mact.registerReceiver(mact.batteryLevelRcvr,batteryLevelFilter);
	}

	@Override
	public void onVoteSubmitError(XPadApi.VoteResultItem item) {
		cl.onVoteSubmitError(item);
	}

	@Override
	public void onFirmUpdate(int percent) {
		cl.onFirmUpdate(percent);
	}

	@Override
	public void onFirmUpdateResult(boolean success, String msg) {
		cl.onFirmUpdateResult(success, msg);
	}

	@Override
	public void onFirmUpdateInfo(String info) {
		cl.onFirmUpdateInfo(info);
	}


}