package kr.co.icontrols.callengine.pstn; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.media.AudioManager; import android.media.ToneGenerator; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.util.Log; import com.artncore.wallpadapi.IGW300API; import com.util.LogUtil; import kr.co.icontrols.callengine.engine.CallManager.CALLEVENTTYPE; import kr.co.icontrols.callengine.engine.CallManager.CALLPATH; import kr.co.icontrols.callengine.engine.CallManager.CALLSTATUS; import kr.co.icontrols.callengine.pstn.ATCmds.PSTNHANDLERMSG; import kr.co.icontrols.wallpadcall.MainActivity; import kr.co.icontrols.wallpadcall.declare.DataClasses.RemoteIDInfo; import kr.co.icontrols.wallpadcall.declare.DataClasses.PSTNInfo; import kr.co.icontrols.wallpadcall.declare.Declare.IGW300CMD; import kr.co.icontrols.wallpadcall.declare.Global; import kr.co.icontrols.wallpadcall.declare.Global.BOARD_TYPE; import kr.co.icontrols.wallpadcall.declare.Global.ConfigValues; import kr.co.icontrols.wallpadcall.screen.TalkPSTN; import kr.co.icontrols.wallpadsupport.Version; public class PSTNController { String TAG = "PSTNController"; boolean bLOG = true; private void LOG(String log) { if (bLOG) Log.v(TAG, log); } boolean bLOG_DEBUG = true; private void LOG_DEBUG(String log) { if (bLOG_DEBUG) Log.d(TAG, log); } boolean bLOG_INFO = true; private void LOG_INFO(String log) { if (bLOG_INFO) Log.i(TAG, log); } boolean bLOG_WARN = true; private void LOG_WARN(String log) { if (bLOG_WARN) Log.w(TAG, log); } Context mContext; Messenger mRemoteMsn; Messenger mLocalMsn = new Messenger(new PSTNControllerHandler()); PSTNInfo mPSTNInfo; public PSTNController(Context context) { try { LOG("[PSTNController]"); mContext = context; if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { Global.bEnablePSTN = true; startGWDTMFSender(); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { Global.bEnablePSTN = true; mToneGenerator = new ToneGenerator(AudioManager.STREAM_DTMF, ToneGenerator.MAX_VOLUME); startGWDTMFSender(); } else { mContext.startService(new Intent(mContext, PSTNSerialManager.class)); bindPSTNSerialManagerService(); } mPSTNInfo = new PSTNInfo(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] PSTNController()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void releasePSTNController() { try { // if (ConfigValues.eWallPadType == Global.WALLPADTYPE.MAIN) { // if (ConfigValues.bPSTNEnable) { // sendReject(); // sendHookOffDelay(); // } // } // else { // if (ConfigValues.eSubWallPadPSTNType == Global.SUBWALLPAD_PSTNTYPE.DIRECT) { // sendReject(); // sendHookOffDelay(); // } // } if (mPSTNPathCheckHandler != null) { mPSTNPathCheckHandler.removeMessages(0); mPSTNPathCheckHandler.removeMessages(1); mPSTNPathCheckHandler.removeMessages(2); mPSTNPathCheckHandler.removeMessages(3); } if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { stopGWDTMFSender(); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (mToneGenerator != null) { mToneGenerator.stopTone(); mToneGenerator.release(); mToneGenerator = null; } stopGWDTMFSender(); } else { unbindPSTNSerialManagerService(); } stopPSTNRingCntThread(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] releasePSTNController()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void bindPSTNSerialManagerService() { try { mContext.bindService(new Intent(mContext, PSTNSerialManager.class), mServiceConnection, Context.BIND_AUTO_CREATE); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] bindPSTNSerialManagerService()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void unbindPSTNSerialManagerService() { try { ctrlRemoteServiceRegister(false); mContext.unbindService(mServiceConnection); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] unbindPSTNSerialManagerService()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { try { LOG_INFO("[mServiceConnection.onServiceConnected] name [" + name + "], service [" + service + "]"); mRemoteMsn = new Messenger(service); ctrlRemoteServiceRegister(true); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] mServiceConnection.onServiceConnected(ComponentName name, IBinder service)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onServiceDisconnected(ComponentName name) { try { LOG_INFO("[mServiceConnection.onServiceDisconnected] name [" + name + "]"); mRemoteMsn = null; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] mServiceConnection.onServiceDisconnected(ComponentName name)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } }; private void ctrlRemoteServiceRegister(boolean bRegister) { try { LOG_INFO("[ctrlRemoteServiceRegister] bRegister [" + bRegister + "]"); if (mRemoteMsn != null) { Message msg; if (bRegister) { msg = Message.obtain(null, PSTNHANDLERMSG.REGISTER, 0, 0, TAG); } else { msg = Message.obtain(null, PSTNHANDLERMSG.UNREGISTER, 0, 0, TAG); } msg.replyTo = mLocalMsn; mRemoteMsn.send(msg); } else { LOG_WARN("[ctrlRemoteServiceRegister] mRemoteMsn is null!! bRegister [" + bRegister + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ctrlRemoteServiceRegister(boolean bRegister)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendMsgToLocalService(int nMsg, String strMessage) { try { if (mLocalMsn != null) { Message msg = Message.obtain(null, nMsg, 0, 0, strMessage); mLocalMsn.send(msg); } else { LOG_WARN("[sendMsgToLocalService] mLocalMsn is null!! nMsg [" + nMsg + "], strMessage [" + strMessage + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendMsgToLocalService(int nMsg, String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendMsgToRemoteService(int nMsg, String strMessage) { try { if (mRemoteMsn != null) { Message msg = Message.obtain(null, nMsg, 0, 0, strMessage); mRemoteMsn.send(msg); } else { LOG_WARN("[sendMsgToRemoteService] mRemoteMsn is null!! nMsg [" + nMsg + "], strMessage [" + strMessage + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendMsgToRemoteService(int nMsg, String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } class PSTNControllerHandler extends Handler { @Override public void handleMessage(Message msg) { LOG("[PSTNControllerHandler] what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "], obj [" + msg.obj + "]"); switch (msg.what) { case PSTNHANDLERMSG.RECEIVE_RING: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_RING"); // if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { // MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.RECEIVE_CALL, null, null); // Log.d(TAG, "[PSTNControllerHandler] bARSEnable [" + ConfigValues.bARSEnable + "], bUnoccupiedMode [" + ConfigValues.bUnoccupiedMode + "]"); // if (ConfigValues.bPSTNEnable && ConfigValues.bARSEnable && ConfigValues.bUnoccupiedMode) { // ((MainActivity) mContext).sendHandlerMsgDelayed(MainActivity.HANDLERMSG.SEND_PSTN_ARS_MODE, 0, 0, 3000); // } // } // else receivePSTNRing(); receivePSTNRing(); break; case PSTNHANDLERMSG.RECEIVE_RING_END: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_RING_END"); if (MainActivity.mCallController != null && MainActivity.mCallController.mCallInfo != null && MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) { MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.TERMINATE_CALL, null, null); } break; case PSTNHANDLERMSG.RECEIVE_DDU: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_DDU"); break; case PSTNHANDLERMSG.RECEIVE_CID_DATE: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_DATE"); mPSTNInfo.initVariables(); mPSTNInfo.setPSTN_DATE(msg.obj.toString()); break; case PSTNHANDLERMSG.RECEIVE_CID_TIME: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_TIME"); mPSTNInfo.setPSTN_TIME(msg.obj.toString()); break; case PSTNHANDLERMSG.RECEIVE_CID_NMBR: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_NMBR"); mPSTNInfo.setPSTN_CID(msg.obj.toString()); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CALLERID, mPSTNInfo, null); break; case PSTNHANDLERMSG.RECEIVE_DTMF: LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_DTMF"); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_DTMF, null, msg.obj.toString()); break; default: break; } } } public void sendHookOn() { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { ((MainActivity) mContext).sendPSTNRingEndBR(); ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki) } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { MainActivity.mIOInterface.ctrlPSTNHookOn(true); MainActivity.mIOInterface.ctrlSetTalkPathPSTN(); } else { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_ON, null); stopPSTNRingCntThread(); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHookOn()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendHookOff() { try { LOG("[sendHookOff]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { ((MainActivity) mContext).sendPSTNRingEndBR(); ((MainActivity) mContext).sendHandlerMsg(IGW300CMD.AUDIO_OFF, 2, 0); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { MainActivity.mIOInterface.ctrlPSTNHookOn(false); } else { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_OFF, null); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHookOff()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendHookOffDelay() { try { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_OFF_DELAY, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHookOffDelay()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendGetPSTNPath() { try { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_GET_PSTN_PATH, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendGetPSTNPath()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendReject() { try { LOG("[sendReject]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { // ((MainActivity) mContext).sendHandlerMsg(IGW300CMD.AUDIO_PSTN_REJECT, 0, 0); // 핸들러로 동작시니키, 메시지가 전달되는 지연이 발생한다. if (ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101 || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101_I || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101_I_LX2 || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101K || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101K_I || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101_I_OCF) { ((MainActivity) mContext).sendPSTNRingEndBR(); } if (MainActivity.mIOInterface != null) MainActivity.mIOInterface.IGW300_CallPathCtrl(IGW300API.TEL_PATH.WPAD_TEL); else Log.d(TAG, "[sendReject] mIOInterface is null!! -> IGW300_CallPathCtrl(IGW300API.TEL_PATH.WPAD_TEL)"); Thread.sleep(500); // 수신 후 종료 if (MainActivity.mIOInterface != null) MainActivity.mIOInterface.IGW300_CallPathCtrl(IGW300API.TEL_PATH.OFF); else Log.d(TAG, "[MainHandler] mIOInterface is null!! -> IGW300_CallPathCtrl(IGW300API.TEL_PATH.OFF)"); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { MainActivity.mIOInterface.ctrlPSTNHookOn(true); Thread.sleep(500); // 수신 후 종료 MainActivity.mIOInterface.ctrlPSTNHookOn(false); } else { // 모뎀을 사용하는 경우 sendMsgToRemoteService(PSTNHANDLERMSG.SEND_REJECT, null); stopPSTNRingCntThread(); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendReject()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendDial(String strDialNo) { try { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_DIAL, strDialNo); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendDial(String strDialNo)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendDTMF(String strDTMF) { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { bAutoSend = false; addGWDTMFBuffer(strDTMF); } else { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_DTMF, strDTMF); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendDTMF(String strDTMF)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } String strDTMFNo = ""; public void sendHookOnNDialNo(String strDialNo) { try { Log.d(TAG, "[sendHookOnNDialNo] strDialNo [" + strDialNo + "], DEVICE_BOARDTYPE [" + ConfigValues.DEVICE_BOARDTYPE + "]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { // 월패드 키패드를 통해 전화 걸 때 MainActivity.mIOInterface.setDTMFOutDelayTime(200); // DTMF Delay Time MainActivity.mIOInterface.setDTMFOutOnOff(true); // DTMF OUT Enable MainActivity.mIOInterface.setDTMFInOnOff(true); // DTMF IN Enable ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki) sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDialNo, 2500); // send dial (delay 조정 seulki) } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { // ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki) // MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅 // strDTMFNo = strDialNo; // mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신 // 기존 ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki) strDTMFNo = strDialNo; sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDTMFNo, 3000); // DTMF 송신 } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40) { MainActivity.mIOInterface.ctrlPSTNHookOn(true); MainActivity.mIOInterface.ctrlSetTalkPathPSTN(); MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅 strDTMFNo = strDialNo; mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신 } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { MainActivity.mIOInterface.ctrlPSTNHookOn(true); MainActivity.mIOInterface.ctrlSetTalkPathPSTN(); MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅 strDTMFNo = strDialNo; mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신 } else { sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOKON_DIAL, strDialNo); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHookOnDialNo()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void cancelSendDTMF() { try { sendHandlerMsgDelayed(GWPSTNHANDLERMSG.CANCEL_SEND_DTMF, 0, 0, null, 0); // DTMF 송신 } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] cancelSendDTMF()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void receivePSTNRing() { try { Log.e(TAG, "[receivePSTNRing] nRingCnt [" + nRingCnt + "]"); if (0 < nRingCnt) { nRingCnt = nRINGINGCNT; mPSTNInfo.printValue(); Log.d(TAG, "[receivePSTNRing] bARSEnable: " + ConfigValues.bARSEnable + ", bUnoccupiedMode: " + ConfigValues.bUnoccupiedMode); if (ConfigValues.bPSTNEnable && ConfigValues.bARSEnable && ConfigValues.bUnoccupiedMode) MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_RING, null, null); } else { startPSTNRingCntThread(); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] receivePSTNRing()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void startPSTNRingCntThread() { try { Log.e(TAG, "[startPSTNRingCntThread]"); if (mPSTNRingCntThread != null) { stopPSTNRingCntThread(); } MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.RECEIVE_CALL, null, null); nRingCnt = nRINGINGCNT; bRingCntEnable = true; Log.e(TAG, "[startPSTNRingCntThread] ========= PSTNRingCntThread START ========="); mPSTNRingCntThread = new PSTNRingCntThread(); mPSTNRingCntThread.start(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] startPSTNRingCntThread()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void stopPSTNRingCntThread() { try { nRingCnt = -99; bRingCntEnable = false; mPSTNRingCntThread = null; Log.d(TAG, "[stopPSTNRingCntThread] ========= PSTNRingCntThread END!!! ========="); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] stopPSTNRingCntThread()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public boolean isPSTNReceiving() { try { return bRingCntEnable; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] isPSTNReceiving()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } public void clearPSTNCall() { try { stopPSTNRingCntThread(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] clearPSTNCall()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void initPSTNModem() { try { sendMsgToRemoteService(PSTNHANDLERMSG.INIT_PSTNMODEM, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] initPSTNModem()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } boolean bRingCntEnable = false; int nRINGINGCNT = 10; // PSTN 링의 최대 간격 int nRingCnt = 0; // PSTN 링 타임아웃 PSTNRingCntThread mPSTNRingCntThread; class PSTNRingCntThread extends Thread { @Override public void run() { try { while (0 < nRingCnt && bRingCntEnable) { Log.e(TAG, "[PSTNRingCntThread.run()] nRingCnt [" + nRingCnt + "], bRingCntEnable [" + bRingCntEnable + "]"); Thread.sleep(1000); nRingCnt--; } Log.e(TAG, "[PSTNRingCntThread.run()] nRingCnt [" + nRingCnt + "], bRingCntEnable [" + bRingCntEnable + "]"); sendMsgToLocalService(PSTNHANDLERMSG.RECEIVE_RING_END, null); stopPSTNRingCntThread(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] PSTNRingCntThread().run() : " + e); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } } ToneGenerator mToneGenerator; public void sendDTMFNo(boolean bAutoSend, String strNo) { try { LOG("[sendDTMFNo] bAutoSend [" + bAutoSend + "], strNo [" + strNo + "]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (strNo.equals("")) { // DTMF 전송 이후 패스 변경 sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SETTALKPATH_PSTN, 0, 0, null, 1000); return; } } int nNo = -1; if (strNo.equals("0")) nNo = 0; else if (strNo.equals("1")) nNo = 1; else if (strNo.equals("2")) nNo = 2; else if (strNo.equals("3")) nNo = 3; else if (strNo.equals("4")) nNo = 4; else if (strNo.equals("5")) nNo = 5; else if (strNo.equals("6")) nNo = 6; else if (strNo.equals("7")) nNo = 7; else if (strNo.equals("8")) nNo = 8; else if (strNo.equals("9")) nNo = 9; else if (strNo.equals("*")) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) nNo = 14; else nNo = 10; } else if (strNo.equals("#")) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) nNo = 15; else nNo = 11; } int nDelayTime = 0; if (bAutoSend) nDelayTime = 1000; if (nNo >= 0) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMFNO_V40_IGW300, 0, 0, String.valueOf(nNo), nDelayTime); else sendHandlerMsgDelayed(GWPSTNHANDLERMSG.START_TONE, nDelayTime, 0, String.valueOf(nNo), nDelayTime); // DTMF 송신 (ToneGenerator - 각 번호별 Interval: 1s) } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendDTMFNo(String strNo)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void startGWDTMFSender() { try { LOG("[startGWDTMFSender]"); runDTMFSender(true); mGWDTMFSenderThread = new GWDTMFSenderThread(); mGWDTMFSenderThread.start(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] startGWDTMFSender()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void stopGWDTMFSender() { try { LOG("[stopGWDTMFSender]"); if (bSenderRun) runDTMFSender(false); if (mGWDTMFSenderThread != null) { mGWDTMFSenderThread = null; } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] stopGWDTMFSender()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void runDTMFSender(boolean bRun) { try { LOG("[runDTMFSender] bRun [" + bRun + "]"); if (!bRun && mGWDTMFSendDataBuilder != null) { mGWDTMFSendDataBuilder.delete(0, mGWDTMFSendDataBuilder.length()); LOG("[runDTMFSender] mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]"); } bSenderRun = bRun; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] runDTMFSender(boolean bRun)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void addGWDTMFBuffer(String strDTMF) { try { LOG("[addGWDTMFBuffer] strDTMF [" + strDTMF + "]"); mGWDTMFSendDataBuilder.append(strDTMF); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] addGWDTMFBuffer(String strDTMF)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void cancelGWDTMFBuffer() { try { LOG("[cancelGWDTMFBuffer] Before mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]"); mGWDTMFSendDataBuilder.delete(0, mGWDTMFSendDataBuilder.length()); LOG("[cancelGWDTMFBuffer] After mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]"); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] addGWDTMFBuffer(String strDTMF)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } static StringBuilder mGWDTMFSendDataBuilder = new StringBuilder(); boolean bSenderRun = false; boolean bAutoSend = true; private GWDTMFSenderThread mGWDTMFSenderThread; private class GWDTMFSenderThread extends Thread { String strSendingDTMF = ""; public GWDTMFSenderThread() { LOG_INFO("[GWDTMFSenderThread()] ===== START ====="); } public void run() { try { LOG_INFO("[GWDTMFSenderThread().run()] bSenderRun [" + bSenderRun + "], bAutoSend [" + bAutoSend + "]"); while (bSenderRun) { // LOG_INFO("[GWDTMFSenderThread().run()] bSenderRun [" + bSenderRun + "]"); if (0 < mGWDTMFSendDataBuilder.length()) { LOG_INFO("[GWDTMFSenderThread().run()] mGWDTMFSendDataBuilder.toString() [" + mGWDTMFSendDataBuilder.toString() + "]"); strSendingDTMF = String.valueOf(mGWDTMFSendDataBuilder.charAt(0)); sendDTMFNo(bAutoSend, strSendingDTMF); // 각각의 DTMF 신호사이에 딜레이를 준다. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { if (bAutoSend) Thread.sleep(70); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (bAutoSend) { Thread.sleep(400); // LOG("[GWDTMFSenderThread().run()] Thread.sleep() bAutoCall [" + RemoteIDInfo.bAutoCall + "]"); // if (RemoteIDInfo.bAutoCall) { // if (ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_1020B_I) Thread.sleep(400); // AS와 같은 AutoCall일 경우 300ms로 term을 설정하면 전화발신이 잘못됨 // } // else Thread.sleep(300); } } if (mGWDTMFSendDataBuilder.length() > 0) mGWDTMFSendDataBuilder.deleteCharAt(0); if (mGWDTMFSendDataBuilder.length() == 0) { RemoteIDInfo.bAutoCall = false; // LOG("[GWDTMFSenderThread().run()] bAutoCall [" + RemoteIDInfo.bAutoCall + "]"); if (bAutoSend) { Log.d(TAG, "[mGWDTMFSendDataBuilder.run()] DTMF send Over!!"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { sendDTMFNo(bAutoSend, ""); // DTMF 전송 끝을 알리기 위하여 빈스트링 전송 -> "" 전송시 패스 변경 } } } } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] GWDTMFSenderThread.run()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } } public final class GWPSTNHANDLERMSG { public final static int SEND_DTMF = 100; public final static int CANCEL_SEND_DTMF = 110; public final static int SEND_DTMFNO_V40_IGW300 = 150; public final static int START_TONE = 200; public final static int SETTALKPATH_PSTN = 300; public final static int SETVOLUME_PSTN = 400; public final static int RELEASE_PSTN_END_BLOCK = 500; } public Handler GWPSTNHandler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message msg) { LOG("[GWPSTNHandler] what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "], obj [" + msg.obj + "]"); switch (msg.what) { case GWPSTNHANDLERMSG.SEND_DTMF: addGWDTMFBuffer(msg.obj.toString()); break; case GWPSTNHANDLERMSG.CANCEL_SEND_DTMF: cancelGWDTMFBuffer(); break; case GWPSTNHANDLERMSG.SEND_DTMFNO_V40_IGW300: MainActivity.mIOInterface.sendDTMF(Integer.parseInt(msg.obj.toString())); break; case GWPSTNHANDLERMSG.START_TONE: LOG("[GWPSTNHandler] START_TONE nNo [" + msg.obj.toString() + "], nDelayTime [" + msg.arg1 + "]"); int nDuration = 100; if (msg.arg1 > 0) nDuration = 200; if (mToneGenerator!= null) mToneGenerator.startTone(Integer.parseInt(msg.obj.toString()), nDuration); break; case GWPSTNHANDLERMSG.SETTALKPATH_PSTN: LOG("[GWPSTNHandler] SETTALKPATH_PSTN"); if (MainActivity.mCallController.getTalkPath() != CALLPATH.PSTN) { MainActivity.mCallController.setTalkPath(CALLPATH.PSTN); mPSTNPathCheckHandler.sendEmptyMessage(2); } break; case GWPSTNHANDLERMSG.SETVOLUME_PSTN: LOG("[GWPSTNHandler] SETVOLUME_PSTN [" + msg.obj.toString() + "]"); Global.setV40WallPadVolume_PSTN(Integer.parseInt(msg.obj.toString())); break; case GWPSTNHANDLERMSG.RELEASE_PSTN_END_BLOCK: TalkPSTN.bBLOCK_PSTNEND = false; TalkPSTN.BTN_END.setButtonEventOffDisable(); ((MainActivity) mContext).TopHomeBtn.setButtonEventOffDisable(); break; default: LOG("MainHandler : " + msg.what); break; } } }; public void sendHandlerMsg(int what, int arg1, int arg2) { try { LOG("[sendHandlerMsg] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "]"); Message HandleMsg = GWPSTNHandler.obtainMessage(); HandleMsg.what = what; HandleMsg.arg1 = arg1; HandleMsg.arg2 = arg2; GWPSTNHandler.sendMessage(HandleMsg); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHandlerMsg(msg)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendHandlerMsgDelayed(int what, int arg1, int arg2, String obj, long delay) { try { LOG("[sendHandlerMsgDelayed] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "], obj [" + obj + "], delay [" + delay + "]"); Message HandleMsg = GWPSTNHandler.obtainMessage(); HandleMsg.what = what; HandleMsg.arg1 = arg1; HandleMsg.arg2 = arg2; HandleMsg.obj = obj; GWPSTNHandler.sendMessageDelayed(HandleMsg, delay); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHandlerMsgDelayed(int what, int arg1, int arg2, String obj, long delay)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } int nCheckCnt1 = 0, nCheckCnt2 = 0; public Handler mPSTNPathCheckHandler = new Handler() { @Override public void handleMessage(Message msg) { // Log.d(TAG, "[mPSTNPathCheckHandler.handleMessage]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (msg.what == 0) { nCheckCnt1++; if (nCheckCnt1 > 200) { mPSTNPathCheckHandler.removeMessages(0); mPSTNPathCheckHandler.removeMessages(1); } else { if (MainActivity.mCallController.getTalkPath() == CALLPATH.DTMF) mPSTNPathCheckHandler.sendEmptyMessageDelayed(1, 50); else mPSTNPathCheckHandler.sendEmptyMessageDelayed(0, 50); } } else if (msg.what == 1) { LOG("[mPSTNPathCheckHandler.handleMessage] Handler finish! =========== V40 DTMF =========== PSTH [DTMF] [" + strDTMFNo + "]"); sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDTMFNo, 1500); // 뚜~하고 1.5s 이후 DTMF 송신 } else if (msg.what == 2) { nCheckCnt2++; if (nCheckCnt2 > 200) { mPSTNPathCheckHandler.removeMessages(2); mPSTNPathCheckHandler.removeMessages(3); } else { if (MainActivity.mCallController.getTalkPath() == CALLPATH.PSTN) mPSTNPathCheckHandler.sendEmptyMessageDelayed(3, 50); else mPSTNPathCheckHandler.sendEmptyMessageDelayed(2, 50); } } else if (msg.what == 3) { LOG("[mPSTNPathCheckHandler.handleMessage] Handler finish! =========== V40 DTMF =========== PSTH [PSTN] RELEASE_PSTN_END_BLOCK"); sendHandlerMsgDelayed(GWPSTNHANDLERMSG.RELEASE_PSTN_END_BLOCK, 0, 0, null, 200); } } } }; }