sipTestLogic.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. #pragma once
  2. #include "uart/ProtocolSender.h"
  3. #include "voip/media_player.h"
  4. #include "manager/ConfigManager.h"
  5. #include "core/utilities.h"
  6. #include "service/BusinessConfig.h"
  7. #include "core/wavfile.h"
  8. #include "voip/audio_player.h"
  9. #include "zkaudio.h"
  10. /*
  11. *此文件由GUI工具生成
  12. *文件功能:用于处理用户的逻辑相应代码
  13. *功能说明:
  14. *========================onButtonClick_XXXX
  15. 当页面中的按键按下后系统会调用对应的函数,XXX代表GUI工具里面的[ID值]名称,
  16. 如Button1,当返回值为false的时候系统将不再处理这个按键,返回true的时候系统将会继续处理此按键。比如SYS_BACK.
  17. *========================onSlideWindowItemClick_XXXX(int index)
  18. 当页面中存在滑动窗口并且用户点击了滑动窗口的图标后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  19. 如slideWindow1;index 代表按下图标的偏移值
  20. *========================onSeekBarChange_XXXX(int progress)
  21. 当页面中存在滑动条并且用户改变了进度后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  22. 如SeekBar1;progress 代表当前的进度值
  23. *========================ogetListItemCount_XXXX()
  24. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表的总数目,XXX代表GUI工具里面的[ID值]名称,
  25. 如List1;返回值为当前列表的总条数
  26. *========================oobtainListItemData_XXXX(ZKListView::ZKListItem *pListItem, int index)
  27. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表当前条目下的内容信息,XXX代表GUI工具里面的[ID值]名称,
  28. 如List1;pListItem 是贴图中的单条目对象,index是列表总目的偏移量。具体见函数说明
  29. *========================常用接口===============
  30. *LOGD(...) 打印调试信息的接口
  31. *mTextXXXPtr->setText("****") 在控件TextXXX上显示文字****
  32. *mButton1Ptr->setSelected(true); 将控件mButton1设置为选中模式,图片会切换成选中图片,按钮文字会切换为选中后的颜色
  33. *mSeekBarPtr->setProgress(12) 在控件mSeekBar上将进度调整到12
  34. *mListView1Ptr->refreshListView() 让mListView1 重新刷新,当列表数据变化后调用
  35. *mDashbroadView1Ptr->setTargetAngle(120) 在控件mDashbroadView1上指针显示角度调整到120度
  36. *
  37. * 在Eclipse编辑器中 使用 “alt + /” 快捷键可以打开智能提示
  38. */
  39. static base::MediaPlayer media_player;
  40. void setSipTestTheme() {
  41. int sipTestThemeInt = StoragePreferences::getInt(STORE_THEME, defaultThemeInt);
  42. if (sipTestThemeInt == 1) {
  43. msip_backPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/back_bule.png");
  44. mSipPicPainterPtr->setBackgroundPic("/medicalCare/dianhua.png");
  45. mEditTextDestURIPtr->setBackgroundPic("/function/input.png");
  46. mCallButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  47. mHandleKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  48. mPanelCallKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  49. mPanelCancelKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  50. mRecordTestButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  51. mButton1Ptr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_blue_383x52.png");
  52. }
  53. else if (sipTestThemeInt == 2) {
  54. msip_backPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/back_pink.png");
  55. mSipPicPainterPtr->setBackgroundPic("/medicalCare/dianhua-pink.png");
  56. mEditTextDestURIPtr->setBackgroundPic("/function/input-pink.png");
  57. mCallButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  58. mHandleKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  59. mPanelCallKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  60. mPanelCancelKeysCheckboxPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  61. mRecordTestButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  62. mButton1Ptr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "/button/elliptic_pink_383x52.png");
  63. }
  64. }
  65. namespace {
  66. FILE* file = NULL;
  67. class RecordTest : public Thread {
  68. public:
  69. void recordAudio() {
  70. file = wavfile_write_open("/mnt/usb1/record.wav");
  71. if (0 != zk_audio_input_init(2, 8000)) {
  72. LOGD("audio input init failed");
  73. mRecordTestButtonPtr->setText(LANGUAGEMANAGER->getValue("RecordFailed"));
  74. mRecordTestButtonPtr->setSelected(false);
  75. return;
  76. }
  77. // //aec apc 初始化
  78. // init();
  79. const int buf_len = zk_audio_input_get_channel_buffer_size();
  80. uint8_t* buf[2];
  81. buf[0] = (uint8_t*)malloc(buf_len);
  82. buf[1] = (uint8_t*)malloc(buf_len);
  83. time_t deadline = time(NULL) + 5;
  84. while (time(NULL) < deadline) {
  85. zk_audio_input_get_frame((uint8_t**)buf);
  86. wavfile_write(file, ( short*) buf[1],
  87. ZK_AUDIO_NUMBER_OF_SAMPLES_PER_FRAME);
  88. }
  89. free(buf[0]);
  90. free(buf[1]);
  91. zk_audio_input_deinit();
  92. wavfile_write_close(file);
  93. mRecordTestButtonPtr->setText(LANGUAGEMANAGER->getValue("RecordPlay"));
  94. playAudio();
  95. }
  96. void playAudio() {
  97. zk_audio_output_set_volume_native(zk_audio_output_volume_native_max());
  98. std::ifstream ifs("/mnt/usb1/record.wav",
  99. std::ios::binary | std::ios::in);
  100. if (!ifs.is_open()) {
  101. LOGD("file not found");
  102. return;
  103. }
  104. base::AudioParameter in;
  105. in.number_of_channels = 1;
  106. in.sample_rate = 8000;
  107. in.sample_format = base::SAMPLE_FMT_S16;
  108. base::AudioPlayer player(in);
  109. uint8_t buffer[256];
  110. player.Play();
  111. while (!ifs.eof()) {
  112. ifs.read((char*)buffer, int(sizeof(buffer)));
  113. int n = ifs.gcount();
  114. player.PutSamples(buffer, n);
  115. }
  116. ifs.close();
  117. player.Stop();
  118. mRecordTestButtonPtr->setText(LANGUAGEMANAGER->getValue("RecordStop"));
  119. mRecordTestButtonPtr->setSelected(false);
  120. }
  121. void Record() {
  122. if(!isRunning()) {
  123. mRecordTestButtonPtr->setText(LANGUAGEMANAGER->getValue("RecordStart"));
  124. play_ = true;
  125. this->run("recordTest");
  126. }
  127. }
  128. void Play() {
  129. if(!isRunning()) {
  130. play_ = false;
  131. this->run("recordTest");
  132. }
  133. }
  134. virtual bool threadLoop() {
  135. if(play_) {
  136. recordAudio();
  137. return false;
  138. }
  139. playAudio ();
  140. return false;
  141. }
  142. private:
  143. bool play_ = true;
  144. };
  145. static RecordTest recordTest;
  146. }
  147. static bool panelCallKeysCheckbox = false;
  148. void setCheckbox(std::string check) {
  149. if (check == "KEY<") {
  150. if (panelCallKeysCheckbox) {
  151. panelCallKeysCheckbox = false;
  152. mPanelCallKeysCheckboxPtr->setChecked(false);
  153. }
  154. else {
  155. panelCallKeysCheckbox = true;
  156. mPanelCallKeysCheckboxPtr->setChecked(true);
  157. }
  158. }
  159. }
  160. /**
  161. * 注册定时器
  162. * 填充数组用于注册定时器
  163. * 注意:id不能重复
  164. */
  165. static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  166. //{0, 6000}, //定时器id=0, 时间间隔6秒
  167. //{1, 1000},
  168. };
  169. /**
  170. * 当界面构造时触发
  171. */
  172. static void onUI_init(){
  173. //Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
  174. mEditTextDestURIPtr->setText(StoragePreferences::getString(SIP_REG_DOOR_ACCOUNT, SIP_REG_DOOR_ACCOUNT_DEFAULT));
  175. }
  176. /**
  177. * 当切换到该界面时触发
  178. */
  179. static void onUI_intent(const Intent *intentPtr) {
  180. if (intentPtr != NULL) {
  181. //TODO
  182. }
  183. }
  184. /*
  185. * 当界面显示时触发
  186. */
  187. static void onUI_show() {
  188. EASYUICONTEXT->hideNaviBar();
  189. EASYUICONTEXT->hideStatusBar();
  190. setSipTestTheme();
  191. // 切换成SIP模式
  192. StoragePreferences::putString(STORE_SIGNAL_TYPE, "SIP");
  193. }
  194. /*
  195. * 当界面隐藏时触发
  196. */
  197. static void onUI_hide() {
  198. }
  199. /*
  200. * 当界面完全退出时触发
  201. */
  202. static void onUI_quit() {
  203. LOGD(">>>>>>>>>>> sip test quit !!!\n");
  204. EASYUICONTEXT->showStatusBar();
  205. EASYUICONTEXT->showNaviBar();
  206. // 切换回TCP模式
  207. StoragePreferences::putString(STORE_SIGNAL_TYPE, "TCP");
  208. }
  209. /**
  210. * 串口数据回调接口
  211. */
  212. static void onProtocolDataUpdate(const SProtocolData &data) {
  213. }
  214. /**
  215. * 定时器触发函数
  216. * 不建议在此函数中写耗时操作,否则将影响UI刷新
  217. * 参数: id
  218. * 当前所触发定时器的id,与注册时的id相同
  219. * 返回值: true
  220. * 继续运行当前定时器
  221. * false
  222. * 停止运行当前定时器
  223. */
  224. static bool onUI_Timer(int id){
  225. switch (id) {
  226. break;
  227. default:
  228. break;
  229. }
  230. return true;
  231. }
  232. /**
  233. * 有新的触摸事件时触发
  234. * 参数:ev
  235. * 新的触摸事件
  236. * 返回值:true
  237. * 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上
  238. * false
  239. * 触摸事件将继续传递到控件上
  240. */
  241. static bool onsipTestActivityTouchEvent(const MotionEvent &ev) {
  242. switch (ev.mActionStatus) {
  243. case MotionEvent::E_ACTION_DOWN://触摸按下
  244. //LOGD("时刻 = %ld 坐标 x = %d, y = %d", ev.mEventTime, ev.mX, ev.mY);
  245. break;
  246. case MotionEvent::E_ACTION_MOVE://触摸滑动
  247. break;
  248. case MotionEvent::E_ACTION_UP: //触摸抬起
  249. break;
  250. default:
  251. break;
  252. }
  253. return false;
  254. }
  255. static void onEditTextChanged_EditTextDestURI(const std::string &text) {
  256. //LOGD(" onEditTextChanged_ EditTextDestURI %s !!!\n", text.c_str());
  257. StoragePreferences::putString(SIP_REG_DOOR_ACCOUNT, text);
  258. }
  259. static bool onButtonClick_CallButton(ZKButton *pButton) {
  260. LOGD(" ButtonClick CallButton !!!\n");
  261. int port = StoragePreferences::getInt(SIP_REG_PORT, SIP_REG_PORT_DEFAULT);
  262. std::string domain = StoragePreferences::getString(SIP_REG_DOMAIN, SIP_REG_DOMAIN_DEFAULT);
  263. std::string od_number = StoragePreferences::getString(SIP_REG_DOOR_ACCOUNT, SIP_REG_DOOR_ACCOUNT_DEFAULT);
  264. std::string od_number_uri = URI(od_number, domain, port);
  265. LOGD("od_number_uri: %s", od_number_uri.c_str());
  266. voip::CallSetting setting;
  267. setting.enable_video = false;
  268. GetTelephone()->MakeCall(od_number_uri, setting);
  269. return false;
  270. }
  271. static void onCheckedChanged_Checkbox1(ZKCheckBox* pCheckBox, bool isChecked) {
  272. LOGD(" Checkbox Checkbox1 checked %d", isChecked);
  273. }
  274. static void onCheckedChanged_HandleKeysCheckbox(ZKCheckBox* pCheckBox, bool isChecked) {
  275. LOGD(" Checkbox HandleKeysCheckbox checked %d", isChecked);
  276. }
  277. static bool onButtonClick_RecordTestButton(ZKButton *pButton) {
  278. LOGD(" ButtonClick RecordTestButton !!!\n");
  279. // 如果线程在运行,则不能重复运行
  280. if(recordTest.isRunning()) {
  281. return false;
  282. }
  283. if(!pButton->isSelected()) {
  284. pButton->setSelected(true);
  285. }
  286. recordTest.Record();
  287. return false;
  288. }
  289. static void onCheckedChanged_PanelCallKeysCheckbox(ZKCheckBox* pCheckBox, bool isChecked) {
  290. LOGD(" Checkbox PanelCallKeysCheckbox checked %d", isChecked);
  291. }
  292. static bool onButtonClick_sip_back(ZKButton *pButton) {
  293. LOGD(" ButtonClick sip_back !!!\n");
  294. EASYUICONTEXT->goBack();
  295. return false;
  296. }
  297. static void onCheckedChanged_PanelCancelKeysCheckbox(ZKCheckBox* pCheckBox, bool isChecked) {
  298. LOGD(" Checkbox PanelCancelKeysCheckbox checked %d", isChecked);
  299. }
  300. static bool onButtonClick_Button1(ZKButton *pButton) {
  301. LOGD(" ButtonClick Button1 !!!\n");
  302. EASYUICONTEXT->openActivity("colorActivity");
  303. return false;
  304. }