PSTNController.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. package kr.co.icontrols.callengine.pstn;
  2. import android.content.ComponentName;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.media.AudioManager;
  7. import android.media.ToneGenerator;
  8. import android.os.Handler;
  9. import android.os.IBinder;
  10. import android.os.Looper;
  11. import android.os.Message;
  12. import android.os.Messenger;
  13. import android.util.Log;
  14. import com.artncore.wallpadapi.IGW300API;
  15. import com.util.LogUtil;
  16. import kr.co.icontrols.callengine.engine.CallManager.CALLEVENTTYPE;
  17. import kr.co.icontrols.callengine.engine.CallManager.CALLPATH;
  18. import kr.co.icontrols.callengine.engine.CallManager.CALLSTATUS;
  19. import kr.co.icontrols.callengine.pstn.ATCmds.PSTNHANDLERMSG;
  20. import kr.co.icontrols.wallpadcall.MainActivity;
  21. import kr.co.icontrols.wallpadcall.declare.DataClasses.RemoteIDInfo;
  22. import kr.co.icontrols.wallpadcall.declare.DataClasses.PSTNInfo;
  23. import kr.co.icontrols.wallpadcall.declare.Declare.IGW300CMD;
  24. import kr.co.icontrols.wallpadcall.declare.Global;
  25. import kr.co.icontrols.wallpadcall.declare.Global.BOARD_TYPE;
  26. import kr.co.icontrols.wallpadcall.declare.Global.ConfigValues;
  27. import kr.co.icontrols.wallpadcall.screen.TalkPSTN;
  28. import kr.co.icontrols.wallpadsupport.Version;
  29. public class PSTNController {
  30. String TAG = "PSTNController";
  31. boolean bLOG = true;
  32. private void LOG(String log) {
  33. if (bLOG) Log.v(TAG, log);
  34. }
  35. boolean bLOG_DEBUG = true;
  36. private void LOG_DEBUG(String log) {
  37. if (bLOG_DEBUG) Log.d(TAG, log);
  38. }
  39. boolean bLOG_INFO = true;
  40. private void LOG_INFO(String log) {
  41. if (bLOG_INFO) Log.i(TAG, log);
  42. }
  43. boolean bLOG_WARN = true;
  44. private void LOG_WARN(String log) {
  45. if (bLOG_WARN) Log.w(TAG, log);
  46. }
  47. Context mContext;
  48. Messenger mRemoteMsn;
  49. Messenger mLocalMsn = new Messenger(new PSTNControllerHandler());
  50. PSTNInfo mPSTNInfo;
  51. public PSTNController(Context context) {
  52. try {
  53. LOG("[PSTNController]");
  54. mContext = context;
  55. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) {
  56. Global.bEnablePSTN = true;
  57. startGWDTMFSender();
  58. }
  59. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  60. Global.bEnablePSTN = true;
  61. mToneGenerator = new ToneGenerator(AudioManager.STREAM_DTMF, ToneGenerator.MAX_VOLUME);
  62. startGWDTMFSender();
  63. }
  64. else {
  65. mContext.startService(new Intent(mContext, PSTNSerialManager.class));
  66. bindPSTNSerialManagerService();
  67. }
  68. mPSTNInfo = new PSTNInfo();
  69. } catch (RuntimeException re) {
  70. LogUtil.errorLogInfo("", TAG, re);
  71. } catch (Exception e) {
  72. Log.e(TAG, "[Exception] PSTNController()");
  73. //e.printStackTrace();
  74. LogUtil.errorLogInfo("", TAG, e);
  75. }
  76. }
  77. public void releasePSTNController() {
  78. try {
  79. // if (ConfigValues.eWallPadType == Global.WALLPADTYPE.MAIN) {
  80. // if (ConfigValues.bPSTNEnable) {
  81. // sendReject();
  82. // sendHookOffDelay();
  83. // }
  84. // }
  85. // else {
  86. // if (ConfigValues.eSubWallPadPSTNType == Global.SUBWALLPAD_PSTNTYPE.DIRECT) {
  87. // sendReject();
  88. // sendHookOffDelay();
  89. // }
  90. // }
  91. if (mPSTNPathCheckHandler != null) {
  92. mPSTNPathCheckHandler.removeMessages(0);
  93. mPSTNPathCheckHandler.removeMessages(1);
  94. mPSTNPathCheckHandler.removeMessages(2);
  95. mPSTNPathCheckHandler.removeMessages(3);
  96. }
  97. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) {
  98. stopGWDTMFSender();
  99. }
  100. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  101. if (mToneGenerator != null) {
  102. mToneGenerator.stopTone();
  103. mToneGenerator.release();
  104. mToneGenerator = null;
  105. }
  106. stopGWDTMFSender();
  107. }
  108. else {
  109. unbindPSTNSerialManagerService();
  110. }
  111. stopPSTNRingCntThread();
  112. } catch (RuntimeException re) {
  113. LogUtil.errorLogInfo("", TAG, re);
  114. } catch (Exception e) {
  115. Log.e(TAG, "[Exception] releasePSTNController()");
  116. //e.printStackTrace();
  117. LogUtil.errorLogInfo("", TAG, e);
  118. }
  119. }
  120. private void bindPSTNSerialManagerService() {
  121. try {
  122. mContext.bindService(new Intent(mContext, PSTNSerialManager.class), mServiceConnection, Context.BIND_AUTO_CREATE);
  123. } catch (RuntimeException re) {
  124. LogUtil.errorLogInfo("", TAG, re);
  125. } catch (Exception e) {
  126. Log.e(TAG, "[Exception] bindPSTNSerialManagerService()");
  127. //e.printStackTrace();
  128. LogUtil.errorLogInfo("", TAG, e);
  129. }
  130. }
  131. private void unbindPSTNSerialManagerService() {
  132. try {
  133. ctrlRemoteServiceRegister(false);
  134. mContext.unbindService(mServiceConnection);
  135. } catch (RuntimeException re) {
  136. LogUtil.errorLogInfo("", TAG, re);
  137. } catch (Exception e) {
  138. Log.e(TAG, "[Exception] unbindPSTNSerialManagerService()");
  139. //e.printStackTrace();
  140. LogUtil.errorLogInfo("", TAG, e);
  141. }
  142. }
  143. ServiceConnection mServiceConnection = new ServiceConnection() {
  144. @Override
  145. public void onServiceConnected(ComponentName name, IBinder service) {
  146. try {
  147. LOG_INFO("[mServiceConnection.onServiceConnected] name [" + name + "], service [" + service + "]");
  148. mRemoteMsn = new Messenger(service);
  149. ctrlRemoteServiceRegister(true);
  150. } catch (RuntimeException re) {
  151. LogUtil.errorLogInfo("", TAG, re);
  152. } catch (Exception e) {
  153. Log.e(TAG, "[Exception] mServiceConnection.onServiceConnected(ComponentName name, IBinder service)");
  154. //e.printStackTrace();
  155. LogUtil.errorLogInfo("", TAG, e);
  156. }
  157. }
  158. @Override
  159. public void onServiceDisconnected(ComponentName name) {
  160. try {
  161. LOG_INFO("[mServiceConnection.onServiceDisconnected] name [" + name + "]");
  162. mRemoteMsn = null;
  163. } catch (RuntimeException re) {
  164. LogUtil.errorLogInfo("", TAG, re);
  165. } catch (Exception e) {
  166. Log.e(TAG, "[Exception] mServiceConnection.onServiceDisconnected(ComponentName name)");
  167. //e.printStackTrace();
  168. LogUtil.errorLogInfo("", TAG, e);
  169. }
  170. }
  171. };
  172. private void ctrlRemoteServiceRegister(boolean bRegister) {
  173. try {
  174. LOG_INFO("[ctrlRemoteServiceRegister] bRegister [" + bRegister + "]");
  175. if (mRemoteMsn != null) {
  176. Message msg;
  177. if (bRegister) {
  178. msg = Message.obtain(null, PSTNHANDLERMSG.REGISTER, 0, 0, TAG);
  179. } else {
  180. msg = Message.obtain(null, PSTNHANDLERMSG.UNREGISTER, 0, 0, TAG);
  181. }
  182. msg.replyTo = mLocalMsn;
  183. mRemoteMsn.send(msg);
  184. } else {
  185. LOG_WARN("[ctrlRemoteServiceRegister] mRemoteMsn is null!! bRegister [" + bRegister + "]");
  186. }
  187. } catch (RuntimeException re) {
  188. LogUtil.errorLogInfo("", TAG, re);
  189. } catch (Exception e) {
  190. Log.e(TAG, "[Exception] ctrlRemoteServiceRegister(boolean bRegister)");
  191. //e.printStackTrace();
  192. LogUtil.errorLogInfo("", TAG, e);
  193. }
  194. }
  195. public void sendMsgToLocalService(int nMsg, String strMessage) {
  196. try {
  197. if (mLocalMsn != null) {
  198. Message msg = Message.obtain(null, nMsg, 0, 0, strMessage);
  199. mLocalMsn.send(msg);
  200. } else {
  201. LOG_WARN("[sendMsgToLocalService] mLocalMsn is null!! nMsg [" + nMsg + "], strMessage [" + strMessage + "]");
  202. }
  203. } catch (RuntimeException re) {
  204. LogUtil.errorLogInfo("", TAG, re);
  205. } catch (Exception e) {
  206. Log.e(TAG, "[Exception] sendMsgToLocalService(int nMsg, String strMessage)");
  207. //e.printStackTrace();
  208. LogUtil.errorLogInfo("", TAG, e);
  209. }
  210. }
  211. public void sendMsgToRemoteService(int nMsg, String strMessage) {
  212. try {
  213. if (mRemoteMsn != null) {
  214. Message msg = Message.obtain(null, nMsg, 0, 0, strMessage);
  215. mRemoteMsn.send(msg);
  216. } else {
  217. LOG_WARN("[sendMsgToRemoteService] mRemoteMsn is null!! nMsg [" + nMsg + "], strMessage [" + strMessage + "]");
  218. }
  219. } catch (RuntimeException re) {
  220. LogUtil.errorLogInfo("", TAG, re);
  221. } catch (Exception e) {
  222. Log.e(TAG, "[Exception] sendMsgToRemoteService(int nMsg, String strMessage)");
  223. //e.printStackTrace();
  224. LogUtil.errorLogInfo("", TAG, e);
  225. }
  226. }
  227. class PSTNControllerHandler extends Handler {
  228. @Override
  229. public void handleMessage(Message msg) {
  230. LOG("[PSTNControllerHandler] what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "], obj [" + msg.obj + "]");
  231. switch (msg.what) {
  232. case PSTNHANDLERMSG.RECEIVE_RING:
  233. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_RING");
  234. // if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) {
  235. // MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.RECEIVE_CALL, null, null);
  236. // Log.d(TAG, "[PSTNControllerHandler] bARSEnable [" + ConfigValues.bARSEnable + "], bUnoccupiedMode [" + ConfigValues.bUnoccupiedMode + "]");
  237. // if (ConfigValues.bPSTNEnable && ConfigValues.bARSEnable && ConfigValues.bUnoccupiedMode) {
  238. // ((MainActivity) mContext).sendHandlerMsgDelayed(MainActivity.HANDLERMSG.SEND_PSTN_ARS_MODE, 0, 0, 3000);
  239. // }
  240. // }
  241. // else receivePSTNRing();
  242. receivePSTNRing();
  243. break;
  244. case PSTNHANDLERMSG.RECEIVE_RING_END:
  245. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_RING_END");
  246. if (MainActivity.mCallController != null && MainActivity.mCallController.mCallInfo != null && MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) {
  247. MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.TERMINATE_CALL, null, null);
  248. }
  249. break;
  250. case PSTNHANDLERMSG.RECEIVE_DDU:
  251. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_DDU");
  252. break;
  253. case PSTNHANDLERMSG.RECEIVE_CID_DATE:
  254. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_DATE");
  255. mPSTNInfo.initVariables();
  256. mPSTNInfo.setPSTN_DATE(msg.obj.toString());
  257. break;
  258. case PSTNHANDLERMSG.RECEIVE_CID_TIME:
  259. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_TIME");
  260. mPSTNInfo.setPSTN_TIME(msg.obj.toString());
  261. break;
  262. case PSTNHANDLERMSG.RECEIVE_CID_NMBR:
  263. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_CID_NMBR");
  264. mPSTNInfo.setPSTN_CID(msg.obj.toString());
  265. MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CALLERID, mPSTNInfo, null);
  266. break;
  267. case PSTNHANDLERMSG.RECEIVE_DTMF:
  268. LOG_INFO("[PSTNControllerHandler] PSTNHANDLERMSG.RECEIVE_DTMF");
  269. MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_DTMF, null, msg.obj.toString());
  270. break;
  271. default:
  272. break;
  273. }
  274. }
  275. }
  276. public void sendHookOn() {
  277. try {
  278. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) {
  279. ((MainActivity) mContext).sendPSTNRingEndBR();
  280. ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki)
  281. } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  282. MainActivity.mIOInterface.ctrlPSTNHookOn(true);
  283. MainActivity.mIOInterface.ctrlSetTalkPathPSTN();
  284. } else {
  285. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_ON, null);
  286. stopPSTNRingCntThread();
  287. }
  288. } catch (RuntimeException re) {
  289. LogUtil.errorLogInfo("", TAG, re);
  290. } catch (Exception e) {
  291. Log.e(TAG, "[Exception] sendHookOn()");
  292. //e.printStackTrace();
  293. LogUtil.errorLogInfo("", TAG, e);
  294. }
  295. }
  296. public void sendHookOff() {
  297. try {
  298. LOG("[sendHookOff]");
  299. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) {
  300. ((MainActivity) mContext).sendPSTNRingEndBR();
  301. ((MainActivity) mContext).sendHandlerMsg(IGW300CMD.AUDIO_OFF, 2, 0);
  302. } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  303. MainActivity.mIOInterface.ctrlPSTNHookOn(false);
  304. } else {
  305. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_OFF, null);
  306. }
  307. } catch (RuntimeException re) {
  308. LogUtil.errorLogInfo("", TAG, re);
  309. } catch (Exception e) {
  310. Log.e(TAG, "[Exception] sendHookOff()");
  311. //e.printStackTrace();
  312. LogUtil.errorLogInfo("", TAG, e);
  313. }
  314. }
  315. public void sendHookOffDelay() {
  316. try {
  317. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOK_OFF_DELAY, null);
  318. } catch (RuntimeException re) {
  319. LogUtil.errorLogInfo("", TAG, re);
  320. } catch (Exception e) {
  321. Log.e(TAG, "[Exception] sendHookOffDelay()");
  322. //e.printStackTrace();
  323. LogUtil.errorLogInfo("", TAG, e);
  324. }
  325. }
  326. public void sendGetPSTNPath() {
  327. try {
  328. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_GET_PSTN_PATH, null);
  329. } catch (RuntimeException re) {
  330. LogUtil.errorLogInfo("", TAG, re);
  331. } catch (Exception e) {
  332. Log.e(TAG, "[Exception] sendGetPSTNPath()");
  333. //e.printStackTrace();
  334. LogUtil.errorLogInfo("", TAG, e);
  335. }
  336. }
  337. public void sendReject() {
  338. try {
  339. LOG("[sendReject]");
  340. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) {
  341. // ((MainActivity) mContext).sendHandlerMsg(IGW300CMD.AUDIO_PSTN_REJECT, 0, 0); // 핸들러로 동작시니키, 메시지가 전달되는 지연이 발생한다.
  342. 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
  343. || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101K || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101K_I
  344. || ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_D101_I_OCF) {
  345. ((MainActivity) mContext).sendPSTNRingEndBR();
  346. }
  347. if (MainActivity.mIOInterface != null) MainActivity.mIOInterface.IGW300_CallPathCtrl(IGW300API.TEL_PATH.WPAD_TEL);
  348. else Log.d(TAG, "[sendReject] mIOInterface is null!! -> IGW300_CallPathCtrl(IGW300API.TEL_PATH.WPAD_TEL)");
  349. Thread.sleep(500); // 수신 후 종료
  350. if (MainActivity.mIOInterface != null) MainActivity.mIOInterface.IGW300_CallPathCtrl(IGW300API.TEL_PATH.OFF);
  351. else Log.d(TAG, "[MainHandler] mIOInterface is null!! -> IGW300_CallPathCtrl(IGW300API.TEL_PATH.OFF)");
  352. }
  353. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  354. MainActivity.mIOInterface.ctrlPSTNHookOn(true);
  355. Thread.sleep(500); // 수신 후 종료
  356. MainActivity.mIOInterface.ctrlPSTNHookOn(false);
  357. }
  358. else {
  359. // 모뎀을 사용하는 경우
  360. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_REJECT, null);
  361. stopPSTNRingCntThread();
  362. }
  363. } catch (RuntimeException re) {
  364. LogUtil.errorLogInfo("", TAG, re);
  365. } catch (Exception e) {
  366. Log.e(TAG, "[Exception] sendReject()");
  367. //e.printStackTrace();
  368. LogUtil.errorLogInfo("", TAG, e);
  369. }
  370. }
  371. public void sendDial(String strDialNo) {
  372. try {
  373. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_DIAL, strDialNo);
  374. } catch (RuntimeException re) {
  375. LogUtil.errorLogInfo("", TAG, re);
  376. } catch (Exception e) {
  377. Log.e(TAG, "[Exception] sendDial(String strDialNo)");
  378. //e.printStackTrace();
  379. LogUtil.errorLogInfo("", TAG, e);
  380. }
  381. }
  382. public void sendDTMF(String strDTMF) {
  383. try {
  384. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40
  385. || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  386. bAutoSend = false;
  387. addGWDTMFBuffer(strDTMF);
  388. }
  389. else {
  390. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_DTMF, strDTMF);
  391. }
  392. } catch (RuntimeException re) {
  393. LogUtil.errorLogInfo("", TAG, re);
  394. } catch (Exception e) {
  395. Log.e(TAG, "[Exception] sendDTMF(String strDTMF)");
  396. //e.printStackTrace();
  397. LogUtil.errorLogInfo("", TAG, e);
  398. }
  399. }
  400. String strDTMFNo = "";
  401. public void sendHookOnNDialNo(String strDialNo) {
  402. try {
  403. Log.d(TAG, "[sendHookOnNDialNo] strDialNo [" + strDialNo + "], DEVICE_BOARDTYPE [" + ConfigValues.DEVICE_BOARDTYPE + "]");
  404. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) {
  405. // 월패드 키패드를 통해 전화 걸 때
  406. MainActivity.mIOInterface.setDTMFOutDelayTime(200); // DTMF Delay Time
  407. MainActivity.mIOInterface.setDTMFOutOnOff(true); // DTMF OUT Enable
  408. MainActivity.mIOInterface.setDTMFInOnOff(true); // DTMF IN Enable
  409. ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki)
  410. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDialNo, 2500); // send dial (delay 조정 seulki)
  411. }
  412. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) {
  413. // ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki)
  414. // MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅
  415. // strDTMFNo = strDialNo;
  416. // mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신
  417. // 기존
  418. ((MainActivity) mContext).sendHandlerMsgDelayed(IGW300CMD.AUDIO_PSTN_WALLPAD, 0, 0, 1000); // 패스변경 후 릴레이 제어 delay (seulki)
  419. strDTMFNo = strDialNo;
  420. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDTMFNo, 3000); // DTMF 송신
  421. }
  422. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40) {
  423. MainActivity.mIOInterface.ctrlPSTNHookOn(true);
  424. MainActivity.mIOInterface.ctrlSetTalkPathPSTN();
  425. MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅
  426. strDTMFNo = strDialNo;
  427. mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신
  428. }
  429. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  430. MainActivity.mIOInterface.ctrlPSTNHookOn(true);
  431. MainActivity.mIOInterface.ctrlSetTalkPathPSTN();
  432. MainActivity.mCallController.setTalkPath(CALLPATH.DTMF); // DTMF 톤을 PhoneOut 라인을 통해 외부로 전달하기 위한 오디오모드 셋팅
  433. strDTMFNo = strDialNo;
  434. mPSTNPathCheckHandler.sendEmptyMessage(0); // DTMF 패스 변경 후 DTMF 송신
  435. }
  436. else {
  437. sendMsgToRemoteService(PSTNHANDLERMSG.SEND_HOOKON_DIAL, strDialNo);
  438. }
  439. } catch (RuntimeException re) {
  440. LogUtil.errorLogInfo("", TAG, re);
  441. } catch (Exception e) {
  442. Log.e(TAG, "[Exception] sendHookOnDialNo()");
  443. //e.printStackTrace();
  444. LogUtil.errorLogInfo("", TAG, e);
  445. }
  446. }
  447. public void cancelSendDTMF() {
  448. try {
  449. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.CANCEL_SEND_DTMF, 0, 0, null, 0); // DTMF 송신
  450. } catch (RuntimeException re) {
  451. LogUtil.errorLogInfo("", TAG, re);
  452. } catch (Exception e) {
  453. Log.e(TAG, "[Exception] cancelSendDTMF()");
  454. //e.printStackTrace();
  455. LogUtil.errorLogInfo("", TAG, e);
  456. }
  457. }
  458. public void receivePSTNRing() {
  459. try {
  460. Log.e(TAG, "[receivePSTNRing] nRingCnt [" + nRingCnt + "]");
  461. if (0 < nRingCnt) {
  462. nRingCnt = nRINGINGCNT;
  463. mPSTNInfo.printValue();
  464. Log.d(TAG, "[receivePSTNRing] bARSEnable: " + ConfigValues.bARSEnable + ", bUnoccupiedMode: " + ConfigValues.bUnoccupiedMode);
  465. if (ConfigValues.bPSTNEnable && ConfigValues.bARSEnable && ConfigValues.bUnoccupiedMode)
  466. MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_RING, null, null);
  467. }
  468. else {
  469. startPSTNRingCntThread();
  470. }
  471. } catch (RuntimeException re) {
  472. LogUtil.errorLogInfo("", TAG, re);
  473. } catch (Exception e) {
  474. Log.e(TAG, "[Exception] receivePSTNRing()");
  475. //e.printStackTrace();
  476. LogUtil.errorLogInfo("", TAG, e);
  477. }
  478. }
  479. private void startPSTNRingCntThread() {
  480. try {
  481. Log.e(TAG, "[startPSTNRingCntThread]");
  482. if (mPSTNRingCntThread != null) {
  483. stopPSTNRingCntThread();
  484. }
  485. MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.RECEIVE_CALL, null, null);
  486. nRingCnt = nRINGINGCNT;
  487. bRingCntEnable = true;
  488. Log.e(TAG, "[startPSTNRingCntThread] ========= PSTNRingCntThread START =========");
  489. mPSTNRingCntThread = new PSTNRingCntThread();
  490. mPSTNRingCntThread.start();
  491. } catch (RuntimeException re) {
  492. LogUtil.errorLogInfo("", TAG, re);
  493. } catch (Exception e) {
  494. Log.e(TAG, "[Exception] startPSTNRingCntThread()");
  495. //e.printStackTrace();
  496. LogUtil.errorLogInfo("", TAG, e);
  497. }
  498. }
  499. public void stopPSTNRingCntThread() {
  500. try {
  501. nRingCnt = -99;
  502. bRingCntEnable = false;
  503. mPSTNRingCntThread = null;
  504. Log.d(TAG, "[stopPSTNRingCntThread] ========= PSTNRingCntThread END!!! =========");
  505. } catch (RuntimeException re) {
  506. LogUtil.errorLogInfo("", TAG, re);
  507. } catch (Exception e) {
  508. Log.e(TAG, "[Exception] stopPSTNRingCntThread()");
  509. //e.printStackTrace();
  510. LogUtil.errorLogInfo("", TAG, e);
  511. }
  512. }
  513. public boolean isPSTNReceiving() {
  514. try {
  515. return bRingCntEnable;
  516. } catch (RuntimeException re) {
  517. LogUtil.errorLogInfo("", TAG, re);
  518. return false;
  519. } catch (Exception e) {
  520. Log.e(TAG, "[Exception] isPSTNReceiving()");
  521. //e.printStackTrace();
  522. LogUtil.errorLogInfo("", TAG, e);
  523. return false;
  524. }
  525. }
  526. public void clearPSTNCall() {
  527. try {
  528. stopPSTNRingCntThread();
  529. } catch (RuntimeException re) {
  530. LogUtil.errorLogInfo("", TAG, re);
  531. } catch (Exception e) {
  532. Log.e(TAG, "[Exception] clearPSTNCall()");
  533. //e.printStackTrace();
  534. LogUtil.errorLogInfo("", TAG, e);
  535. }
  536. }
  537. public void initPSTNModem() {
  538. try {
  539. sendMsgToRemoteService(PSTNHANDLERMSG.INIT_PSTNMODEM, null);
  540. } catch (RuntimeException re) {
  541. LogUtil.errorLogInfo("", TAG, re);
  542. } catch (Exception e) {
  543. Log.e(TAG, "[Exception] initPSTNModem()");
  544. //e.printStackTrace();
  545. LogUtil.errorLogInfo("", TAG, e);
  546. }
  547. }
  548. boolean bRingCntEnable = false;
  549. int nRINGINGCNT = 10; // PSTN 링의 최대 간격
  550. int nRingCnt = 0; // PSTN 링 타임아웃
  551. PSTNRingCntThread mPSTNRingCntThread;
  552. class PSTNRingCntThread extends Thread {
  553. @Override
  554. public void run() {
  555. try {
  556. while (0 < nRingCnt && bRingCntEnable) {
  557. Log.e(TAG, "[PSTNRingCntThread.run()] nRingCnt [" + nRingCnt + "], bRingCntEnable [" + bRingCntEnable + "]");
  558. Thread.sleep(1000);
  559. nRingCnt--;
  560. }
  561. Log.e(TAG, "[PSTNRingCntThread.run()] nRingCnt [" + nRingCnt + "], bRingCntEnable [" + bRingCntEnable + "]");
  562. sendMsgToLocalService(PSTNHANDLERMSG.RECEIVE_RING_END, null);
  563. stopPSTNRingCntThread();
  564. } catch (RuntimeException re) {
  565. LogUtil.errorLogInfo("", TAG, re);
  566. } catch (Exception e) {
  567. Log.e(TAG, "[Exception] PSTNRingCntThread().run() : " + e);
  568. //e.printStackTrace();
  569. LogUtil.errorLogInfo("", TAG, e);
  570. }
  571. }
  572. }
  573. ToneGenerator mToneGenerator;
  574. public void sendDTMFNo(boolean bAutoSend, String strNo) {
  575. try {
  576. LOG("[sendDTMFNo] bAutoSend [" + bAutoSend + "], strNo [" + strNo + "]");
  577. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  578. if (strNo.equals("")) {
  579. // DTMF 전송 이후 패스 변경
  580. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SETTALKPATH_PSTN, 0, 0, null, 1000);
  581. return;
  582. }
  583. }
  584. int nNo = -1;
  585. if (strNo.equals("0")) nNo = 0;
  586. else if (strNo.equals("1")) nNo = 1;
  587. else if (strNo.equals("2")) nNo = 2;
  588. else if (strNo.equals("3")) nNo = 3;
  589. else if (strNo.equals("4")) nNo = 4;
  590. else if (strNo.equals("5")) nNo = 5;
  591. else if (strNo.equals("6")) nNo = 6;
  592. else if (strNo.equals("7")) nNo = 7;
  593. else if (strNo.equals("8")) nNo = 8;
  594. else if (strNo.equals("9")) nNo = 9;
  595. else if (strNo.equals("*")) {
  596. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) nNo = 14;
  597. else nNo = 10;
  598. } else if (strNo.equals("#")) {
  599. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) nNo = 15;
  600. else nNo = 11;
  601. }
  602. int nDelayTime = 0;
  603. if (bAutoSend) nDelayTime = 1000;
  604. if (nNo >= 0) {
  605. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMFNO_V40_IGW300, 0, 0, String.valueOf(nNo), nDelayTime);
  606. else sendHandlerMsgDelayed(GWPSTNHANDLERMSG.START_TONE, nDelayTime, 0, String.valueOf(nNo), nDelayTime); // DTMF 송신 (ToneGenerator - 각 번호별 Interval: 1s)
  607. }
  608. } catch (RuntimeException re) {
  609. LogUtil.errorLogInfo("", TAG, re);
  610. } catch (Exception e) {
  611. Log.e(TAG, "[Exception] sendDTMFNo(String strNo)");
  612. //e.printStackTrace();
  613. LogUtil.errorLogInfo("", TAG, e);
  614. }
  615. }
  616. private void startGWDTMFSender() {
  617. try {
  618. LOG("[startGWDTMFSender]");
  619. runDTMFSender(true);
  620. mGWDTMFSenderThread = new GWDTMFSenderThread();
  621. mGWDTMFSenderThread.start();
  622. } catch (RuntimeException re) {
  623. LogUtil.errorLogInfo("", TAG, re);
  624. } catch (Exception e) {
  625. Log.e(TAG, "[Exception] startGWDTMFSender()");
  626. //e.printStackTrace();
  627. LogUtil.errorLogInfo("", TAG, e);
  628. }
  629. }
  630. private void stopGWDTMFSender() {
  631. try {
  632. LOG("[stopGWDTMFSender]");
  633. if (bSenderRun) runDTMFSender(false);
  634. if (mGWDTMFSenderThread != null) {
  635. mGWDTMFSenderThread = null;
  636. }
  637. } catch (RuntimeException re) {
  638. LogUtil.errorLogInfo("", TAG, re);
  639. } catch (Exception e) {
  640. Log.e(TAG, "[Exception] stopGWDTMFSender()");
  641. //e.printStackTrace();
  642. LogUtil.errorLogInfo("", TAG, e);
  643. }
  644. }
  645. public void runDTMFSender(boolean bRun) {
  646. try {
  647. LOG("[runDTMFSender] bRun [" + bRun + "]");
  648. if (!bRun && mGWDTMFSendDataBuilder != null) {
  649. mGWDTMFSendDataBuilder.delete(0, mGWDTMFSendDataBuilder.length());
  650. LOG("[runDTMFSender] mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]");
  651. }
  652. bSenderRun = bRun;
  653. } catch (RuntimeException re) {
  654. LogUtil.errorLogInfo("", TAG, re);
  655. } catch (Exception e) {
  656. Log.e(TAG, "[Exception] runDTMFSender(boolean bRun)");
  657. //e.printStackTrace();
  658. LogUtil.errorLogInfo("", TAG, e);
  659. }
  660. }
  661. public void addGWDTMFBuffer(String strDTMF) {
  662. try {
  663. LOG("[addGWDTMFBuffer] strDTMF [" + strDTMF + "]");
  664. mGWDTMFSendDataBuilder.append(strDTMF);
  665. } catch (RuntimeException re) {
  666. LogUtil.errorLogInfo("", TAG, re);
  667. } catch (Exception e) {
  668. Log.e(TAG, "[Exception] addGWDTMFBuffer(String strDTMF)");
  669. //e.printStackTrace();
  670. LogUtil.errorLogInfo("", TAG, e);
  671. }
  672. }
  673. public void cancelGWDTMFBuffer() {
  674. try {
  675. LOG("[cancelGWDTMFBuffer] Before mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]");
  676. mGWDTMFSendDataBuilder.delete(0, mGWDTMFSendDataBuilder.length());
  677. LOG("[cancelGWDTMFBuffer] After mGWDTMFSendDataBuilder [" + mGWDTMFSendDataBuilder.toString() + "]");
  678. } catch (RuntimeException re) {
  679. LogUtil.errorLogInfo("", TAG, re);
  680. } catch (Exception e) {
  681. Log.e(TAG, "[Exception] addGWDTMFBuffer(String strDTMF)");
  682. //e.printStackTrace();
  683. LogUtil.errorLogInfo("", TAG, e);
  684. }
  685. }
  686. static StringBuilder mGWDTMFSendDataBuilder = new StringBuilder();
  687. boolean bSenderRun = false;
  688. boolean bAutoSend = true;
  689. private GWDTMFSenderThread mGWDTMFSenderThread;
  690. private class GWDTMFSenderThread extends Thread {
  691. String strSendingDTMF = "";
  692. public GWDTMFSenderThread() {
  693. LOG_INFO("[GWDTMFSenderThread()] ===== START =====");
  694. }
  695. public void run() {
  696. try {
  697. LOG_INFO("[GWDTMFSenderThread().run()] bSenderRun [" + bSenderRun + "], bAutoSend [" + bAutoSend + "]");
  698. while (bSenderRun) {
  699. // LOG_INFO("[GWDTMFSenderThread().run()] bSenderRun [" + bSenderRun + "]");
  700. if (0 < mGWDTMFSendDataBuilder.length()) {
  701. LOG_INFO("[GWDTMFSenderThread().run()] mGWDTMFSendDataBuilder.toString() [" + mGWDTMFSendDataBuilder.toString() + "]");
  702. strSendingDTMF = String.valueOf(mGWDTMFSendDataBuilder.charAt(0));
  703. sendDTMFNo(bAutoSend, strSendingDTMF);
  704. // 각각의 DTMF 신호사이에 딜레이를 준다.
  705. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) {
  706. if (bAutoSend) Thread.sleep(70);
  707. }
  708. else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  709. if (bAutoSend) {
  710. Thread.sleep(400);
  711. // LOG("[GWDTMFSenderThread().run()] Thread.sleep() bAutoCall [" + RemoteIDInfo.bAutoCall + "]");
  712. // if (RemoteIDInfo.bAutoCall) {
  713. // if (ConfigValues.DEVICE_MODELTYPE == Version.MODEL_TYPE.IHN_1020B_I) Thread.sleep(400); // AS와 같은 AutoCall일 경우 300ms로 term을 설정하면 전화발신이 잘못됨
  714. // }
  715. // else Thread.sleep(300);
  716. }
  717. }
  718. if (mGWDTMFSendDataBuilder.length() > 0) mGWDTMFSendDataBuilder.deleteCharAt(0);
  719. if (mGWDTMFSendDataBuilder.length() == 0) {
  720. RemoteIDInfo.bAutoCall = false;
  721. // LOG("[GWDTMFSenderThread().run()] bAutoCall [" + RemoteIDInfo.bAutoCall + "]");
  722. if (bAutoSend) {
  723. Log.d(TAG, "[mGWDTMFSendDataBuilder.run()] DTMF send Over!!");
  724. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  725. sendDTMFNo(bAutoSend, ""); // DTMF 전송 끝을 알리기 위하여 빈스트링 전송 -> "" 전송시 패스 변경
  726. }
  727. }
  728. }
  729. }
  730. }
  731. } catch (RuntimeException re) {
  732. LogUtil.errorLogInfo("", TAG, re);
  733. } catch (Exception e) {
  734. Log.e(TAG, "[Exception] GWDTMFSenderThread.run()");
  735. //e.printStackTrace();
  736. LogUtil.errorLogInfo("", TAG, e);
  737. }
  738. }
  739. }
  740. public final class GWPSTNHANDLERMSG {
  741. public final static int SEND_DTMF = 100;
  742. public final static int CANCEL_SEND_DTMF = 110;
  743. public final static int SEND_DTMFNO_V40_IGW300 = 150;
  744. public final static int START_TONE = 200;
  745. public final static int SETTALKPATH_PSTN = 300;
  746. public final static int SETVOLUME_PSTN = 400;
  747. public final static int RELEASE_PSTN_END_BLOCK = 500;
  748. }
  749. public Handler GWPSTNHandler = new Handler(Looper.getMainLooper()) {
  750. public void handleMessage(Message msg) {
  751. LOG("[GWPSTNHandler] what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "], obj [" + msg.obj + "]");
  752. switch (msg.what) {
  753. case GWPSTNHANDLERMSG.SEND_DTMF:
  754. addGWDTMFBuffer(msg.obj.toString());
  755. break;
  756. case GWPSTNHANDLERMSG.CANCEL_SEND_DTMF:
  757. cancelGWDTMFBuffer();
  758. break;
  759. case GWPSTNHANDLERMSG.SEND_DTMFNO_V40_IGW300:
  760. MainActivity.mIOInterface.sendDTMF(Integer.parseInt(msg.obj.toString()));
  761. break;
  762. case GWPSTNHANDLERMSG.START_TONE:
  763. LOG("[GWPSTNHandler] START_TONE nNo [" + msg.obj.toString() + "], nDelayTime [" + msg.arg1 + "]");
  764. int nDuration = 100;
  765. if (msg.arg1 > 0) nDuration = 200;
  766. if (mToneGenerator!= null) mToneGenerator.startTone(Integer.parseInt(msg.obj.toString()), nDuration);
  767. break;
  768. case GWPSTNHANDLERMSG.SETTALKPATH_PSTN:
  769. LOG("[GWPSTNHandler] SETTALKPATH_PSTN");
  770. if (MainActivity.mCallController.getTalkPath() != CALLPATH.PSTN) {
  771. MainActivity.mCallController.setTalkPath(CALLPATH.PSTN);
  772. mPSTNPathCheckHandler.sendEmptyMessage(2);
  773. }
  774. break;
  775. case GWPSTNHANDLERMSG.SETVOLUME_PSTN:
  776. LOG("[GWPSTNHandler] SETVOLUME_PSTN [" + msg.obj.toString() + "]");
  777. Global.setV40WallPadVolume_PSTN(Integer.parseInt(msg.obj.toString()));
  778. break;
  779. case GWPSTNHANDLERMSG.RELEASE_PSTN_END_BLOCK:
  780. TalkPSTN.bBLOCK_PSTNEND = false;
  781. TalkPSTN.BTN_END.setButtonEventOffDisable();
  782. ((MainActivity) mContext).TopHomeBtn.setButtonEventOffDisable();
  783. break;
  784. default:
  785. LOG("MainHandler : " + msg.what);
  786. break;
  787. }
  788. }
  789. };
  790. public void sendHandlerMsg(int what, int arg1, int arg2) {
  791. try {
  792. LOG("[sendHandlerMsg] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "]");
  793. Message HandleMsg = GWPSTNHandler.obtainMessage();
  794. HandleMsg.what = what;
  795. HandleMsg.arg1 = arg1;
  796. HandleMsg.arg2 = arg2;
  797. GWPSTNHandler.sendMessage(HandleMsg);
  798. } catch (RuntimeException re) {
  799. LogUtil.errorLogInfo("", TAG, re);
  800. } catch (Exception e) {
  801. Log.e(TAG, "[Exception] sendHandlerMsg(msg)");
  802. //e.printStackTrace();
  803. LogUtil.errorLogInfo("", TAG, e);
  804. }
  805. }
  806. public void sendHandlerMsgDelayed(int what, int arg1, int arg2, String obj, long delay) {
  807. try {
  808. LOG("[sendHandlerMsgDelayed] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "], obj [" + obj + "], delay [" + delay + "]");
  809. Message HandleMsg = GWPSTNHandler.obtainMessage();
  810. HandleMsg.what = what;
  811. HandleMsg.arg1 = arg1;
  812. HandleMsg.arg2 = arg2;
  813. HandleMsg.obj = obj;
  814. GWPSTNHandler.sendMessageDelayed(HandleMsg, delay);
  815. } catch (RuntimeException re) {
  816. LogUtil.errorLogInfo("", TAG, re);
  817. } catch (Exception e) {
  818. Log.e(TAG, "[Exception] sendHandlerMsgDelayed(int what, int arg1, int arg2, String obj, long delay)");
  819. //e.printStackTrace();
  820. LogUtil.errorLogInfo("", TAG, e);
  821. }
  822. }
  823. int nCheckCnt1 = 0, nCheckCnt2 = 0;
  824. public Handler mPSTNPathCheckHandler = new Handler() {
  825. @Override
  826. public void handleMessage(Message msg) {
  827. // Log.d(TAG, "[mPSTNPathCheckHandler.handleMessage]");
  828. if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
  829. if (msg.what == 0) {
  830. nCheckCnt1++;
  831. if (nCheckCnt1 > 200) {
  832. mPSTNPathCheckHandler.removeMessages(0);
  833. mPSTNPathCheckHandler.removeMessages(1);
  834. } else {
  835. if (MainActivity.mCallController.getTalkPath() == CALLPATH.DTMF) mPSTNPathCheckHandler.sendEmptyMessageDelayed(1, 50);
  836. else mPSTNPathCheckHandler.sendEmptyMessageDelayed(0, 50);
  837. }
  838. } else if (msg.what == 1) {
  839. LOG("[mPSTNPathCheckHandler.handleMessage] Handler finish! =========== V40 DTMF =========== PSTH [DTMF] [" + strDTMFNo + "]");
  840. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.SEND_DTMF, 0, 0, strDTMFNo, 1500); // 뚜~하고 1.5s 이후 DTMF 송신
  841. } else if (msg.what == 2) {
  842. nCheckCnt2++;
  843. if (nCheckCnt2 > 200) {
  844. mPSTNPathCheckHandler.removeMessages(2);
  845. mPSTNPathCheckHandler.removeMessages(3);
  846. } else {
  847. if (MainActivity.mCallController.getTalkPath() == CALLPATH.PSTN)
  848. mPSTNPathCheckHandler.sendEmptyMessageDelayed(3, 50);
  849. else mPSTNPathCheckHandler.sendEmptyMessageDelayed(2, 50);
  850. }
  851. } else if (msg.what == 3) {
  852. LOG("[mPSTNPathCheckHandler.handleMessage] Handler finish! =========== V40 DTMF =========== PSTH [PSTN] RELEASE_PSTN_END_BLOCK");
  853. sendHandlerMsgDelayed(GWPSTNHANDLERMSG.RELEASE_PSTN_END_BLOCK, 0, 0, null, 200);
  854. }
  855. }
  856. }
  857. };
  858. }