CameraCheck.java 7.96 KB
package com.sw.laryngoscope.manager;

import static com.sw.laryngoscope.common.InitParam.CAM_OV6946;
import static com.sw.laryngoscope.common.InitParam.CAM_OV9734;
import static com.sw.laryngoscope.common.InitParam.CAM_TYPE_C;
import static com.sw.laryngoscope.common.InitParam.pwmPath;

import android.content.Context;
import android.os.Handler;
import android.util.Log;

import com.sw.laryngoscope.activity.HomeActivity;
import com.sw.laryngoscope.common.InitParam;
import com.sw.laryngoscope.utils.Logger;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class CameraCheck implements Runnable {
	public static final String TAG = "CameraCheck";

	private static CameraCheck ourInstance = null;
	private Thread mCheckThread = null;

	String path = "/sys/class/weiken_adc_keydet/camera_model";

	int cam_1 = -1, cam_2 = -1;
	boolean isReopenCam = false;

	boolean isStartCheck9734 = true;
	String check9734Path = "/sys/class/weiken_adc_keydet/ov9734_reset";
		
	public static CameraCheck getInstance(Context context) {
        if ( null == ourInstance ) {
            synchronized (CameraCheck.class) {
                if (null == ourInstance ) {
                    ourInstance = new CameraCheck(context);
                }
            }
        }
        return ourInstance;
    }
			
	private CameraCheck(Context context) {
		mCheckThread = new Thread(this);
		mCheckThread.start();
		//mOv9734ResetThread.start();
	}

	int ty = -3;

	@Override
	public void run() {
		while(true) {
			try {
//				int type = readFile(path);
				int type = InitParam.CAM_VALUE.OV6946.ordinal();
				int pre_cam_1 = -1, pre_cam_2 = -1;
				if ( type == InitParam.CAM_VALUE.NON.ordinal() ) {
					pre_cam_1 = -1;
					pre_cam_2 = -1;
				} else if ( type == InitParam.CAM_VALUE.OV6946.ordinal() ) {
					pre_cam_1 = CAM_OV6946;
					pre_cam_2 = -1;
				} else if ( type == InitParam.CAM_VALUE.OV9734.ordinal() ) {
					pre_cam_1 = CAM_OV9734;
					pre_cam_2 = -1;
				} else if ( type == InitParam.CAM_VALUE.TYPEC1.ordinal() ||
						type == InitParam.CAM_VALUE.TYPEC2.ordinal() ) {
					pre_cam_1 = CAM_TYPE_C;
					pre_cam_2 = -1;
				} else if ( type == InitParam.CAM_VALUE.OV6946_TYPEC1.ordinal() ) {
					if ( cam_2 == CAM_OV6946 || cam_1 == CAM_TYPE_C ) {
						pre_cam_1 = CAM_TYPE_C;
						pre_cam_2 = CAM_OV6946;
					} else {
						pre_cam_1 = CAM_OV6946;
						pre_cam_2 = CAM_TYPE_C;
					}
					isReopenCam = true;
				} else if ( type == InitParam.CAM_VALUE.OV9734_TYPEC1.ordinal() ) {
					if ( cam_2 == CAM_OV9734 || cam_1 == CAM_TYPE_C ) {
						pre_cam_1 = CAM_TYPE_C;
						pre_cam_2 = CAM_OV9734;
					} else {
						pre_cam_1 = CAM_OV9734;
						pre_cam_2 = CAM_TYPE_C;
					}
					isReopenCam = true;
				} else if ( type == InitParam.CAM_VALUE.OV6946_TYPEC2.ordinal() ) {
					if ( cam_2 == CAM_OV6946 || cam_1 == CAM_TYPE_C ) {
						pre_cam_1 = CAM_TYPE_C;
						pre_cam_2 = CAM_OV6946;
					} else {
						pre_cam_1 = CAM_OV6946;
						pre_cam_2 = CAM_TYPE_C;
					}
					isReopenCam = true;
				} else if ( type == InitParam.CAM_VALUE.OV9734_TYPEC2.ordinal() ) {
					if ( cam_2 == CAM_OV9734 || cam_1 == CAM_TYPE_C ) {
						pre_cam_1 = CAM_TYPE_C;
						pre_cam_2 = CAM_OV9734;
					} else {
						pre_cam_1 = CAM_OV9734;
						pre_cam_2 = CAM_TYPE_C;
					}
					isReopenCam = true;
				}

				//Logger.d(TAG,"pre_cam_1 : " + pre_cam_1 + "pre_cam_2 : " + pre_cam_2);
				cam_1 = pre_cam_1;
				cam_2 = pre_cam_2;
				if ( /*cam_1 != pre_cam_1 || */(type != ty) ) {
					Logger.d(TAG,"pre_cam_1 : " + pre_cam_1 + " isInMainWin " + HomeActivity.isInMainWin);
					if ( mCameraCallback != null && HomeActivity.isInMainWin ) {//cam_1放置在主摄像位置
						mCameraCallback.setMainCamChange(cam_1);
					}
					setOVLight(pre_cam_1);
					setCameraInfo();
				}
				sleep(200);
				if ( /*cam_2 != pre_cam_2 || */(type != ty) ) {
					Logger.d(TAG,"pre_cam_2 : " + pre_cam_2 + " isInMainWin " + HomeActivity.isInMainWin);
					if ( mCameraCallback != null && HomeActivity.isInMainWin ) {//cam_2放置在次摄像位置
						mCameraCallback.setSecCamChange(cam_2);
					}
					setOVLight(pre_cam_2);
					setCameraInfo();
				}
				sleep(200);//ms
				isReopenCam = false;
				if ( type != ty ) {
					Logger.d(TAG,"readFile : " + type);
					ty = type;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public boolean isSingleCam() {
		boolean ret = false;
		if ( ty == InitParam.CAM_VALUE.OV6946.ordinal() ) {
			ret = true;
		} else if ( ty == InitParam.CAM_VALUE.OV9734.ordinal() ) {
			ret = true;
		} else if ( ty == InitParam.CAM_VALUE.TYPEC1.ordinal() ||
				ty == InitParam.CAM_VALUE.TYPEC2.ordinal() ) {
			ret = true;
		}
		return ret;
	}

	public void setOVLight(int cam) {
		if ( cam == CAM_OV6946 ) {
			writeVal(pwmPath, "0");
			sleep(10);
			writeVal(pwmPath, SpManager.get_light_ov6946()+"");
		}
		if ( cam == CAM_OV9734 ) {
			writeVal(pwmPath, "0");
			sleep(10);
			writeVal(pwmPath, SpManager.get_light_ov9734()+"");
		}
	}

	public void sleep(int ms) {
		try {
			Thread.sleep(ms);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public CameraCallback mCameraCallback;

	public void setCameraTypeCb(CameraCallback cameraCallback) {
		this.mCameraCallback = cameraCallback;
	}

	public int getCam_1() {
		return cam_1;
	}

	public int getCam_2() {
		return cam_2;
	}

	//cam_1放置在主摄像位置,cam_2放置在次摄像位置
	public int getTypeCPos() {
		int pos = -1;
		if ( cam_1 == CAM_TYPE_C ) {
			pos = InitParam.CAM_BACK;
		} else if ( cam_2 == CAM_TYPE_C ) {
			pos = InitParam.CAM_FRONT;
		}
		return pos;
	}

	//cam_1放置在主摄像位置,cam_2放置在次摄像位置
	public int getOVPos() {
		int pos = -1;
		if ( cam_1 == CAM_OV6946 ) {
			pos = InitParam.CAM_BACK;
		} else if ( cam_2 == CAM_OV6946 ) {
			pos = InitParam.CAM_FRONT;
		}
		if ( cam_1 == CAM_OV9734 ) {
			pos = InitParam.CAM_BACK;
		} else if ( cam_2 == CAM_OV9734 ) {
			pos = InitParam.CAM_FRONT;
		}
		return pos;
	}

	public void setCameraInfo() {
		if ( getOVPos() != -1 ) {
			CameraInfoMg.getInstance(null).startReadCam();
		} else if ( getTypeCPos() != -1 ) {
			CameraInfoMg.getInstance(null).showTypeCCamTime();
		} else {
			CameraInfoMg.getInstance(null).resetInfoCB();
		}
	}

	private Thread mOv9734ResetThread = new Thread(new Runnable() {
		@Override
		public void run() {
			while( isStartCheck9734 ) {
				try {
					int open9734 = readFile(check9734Path);
					if ( open9734 == 1 ) {
						Logger.d("==========check9734Path=====" + open9734);
						if ( mCameraCallback != null && HomeActivity.isInMainWin ) {
						} else {
							continue;
						}
						if ( cam_1 == CAM_OV9734 ) {
							mCameraCallback.setMainCamChange(cam_1);
						} else if ( cam_2 == CAM_OV9734 ) {
							mCameraCallback.setSecCamChange(cam_2);
						}
						writeVal(check9734Path, "0");
					}
					sleep(200);
				} catch (Exception e) {
				}
			}
		}
	});

	public interface CameraCallback {
		void setMainCamChange(int cam);
		void setSecCamChange(int cam);
	}

	public int readFile(String path) {
		int iRet = -1;
		BufferedReader read = null;
		File file = new File(path);
		if (!file.exists()) {
			return iRet;
		}
		try {
			read = new BufferedReader(new FileReader(file));
			String str = null;
			while((str = read.readLine()) != null) {
				iRet = Integer.parseInt(str.substring(0, 1));
			}
			read.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return iRet;
	}

	public static void writeVal(String path, String value) {
		BufferedWriter writer = null;
		try {
			writer = new BufferedWriter(new FileWriter(path));
			writer.write(value+"\n");
			writer.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

}