Browse Source

增加应答功能

vothin 5 tháng trước cách đây
mục cha
commit
18ba8b142b
44 tập tin đã thay đổi với 324 bổ sung96 xóa
  1. 2 2
      .settings/com.zksw.flythings.easyui.prefs
  2. 2 2
      .settings/language.settings.xml
  3. 2 0
      i18n/en_US.tr
  4. 2 0
      i18n/es_ES-西班牙语.tr
  5. 2 0
      i18n/zh_CN.tr
  6. 21 0
      jni/activity/functionActivity.cpp
  7. 6 0
      jni/activity/functionActivity.h
  8. 2 1
      jni/core/utilities.cpp
  9. 85 61
      jni/logic/callLogic.cc
  10. 116 10
      jni/logic/functionLogic.cc
  11. 1 2
      jni/logic/navibar.cc
  12. 56 13
      jni/logic/startLogic.cc
  13. 4 0
      jni/net/tcp_model.h
  14. 12 1
      jni/net/tcp_util.cpp
  15. 1 0
      jni/net/tcp_util.h
  16. 10 4
      jni/service/BusinessConfig.h
  17. BIN
      libs/armeabi/libzkgui.so
  18. BIN
      obj/activity/callActivity.o
  19. BIN
      obj/activity/deviceInfoActivity.o
  20. BIN
      obj/activity/functionActivity.o
  21. BIN
      obj/activity/mainActivity.o
  22. BIN
      obj/activity/medicalCareActivity.o
  23. BIN
      obj/activity/moreActivity.o
  24. BIN
      obj/activity/navibar.o
  25. BIN
      obj/activity/promptActivity.o
  26. BIN
      obj/activity/settingActivity.o
  27. BIN
      obj/activity/sipTestActivity.o
  28. BIN
      obj/activity/startActivity.o
  29. BIN
      obj/activity/statusbar.o
  30. BIN
      obj/activity/updateActivity.o
  31. BIN
      obj/core/update_assistant.o
  32. BIN
      obj/core/utilities.o
  33. BIN
      obj/net/tcp_client.o
  34. BIN
      obj/net/tcp_model.o
  35. BIN
      obj/net/tcp_util.o
  36. BIN
      obj/server/http_server.o
  37. BIN
      obj/service/BusinessConfig.o
  38. BIN
      obj/service/time.o
  39. BIN
      obj/uart/UartContext.o
  40. BIN
      resources/Harmony_231030.ttf
  41. BIN
      resources/function/chooseBed-pink_400x52.png
  42. BIN
      resources/function/chooseBed_400x52.png
  43. BIN
      resources/function/noChooseBed_400x52.png
  44. BIN
      ui/function.ftu

+ 2 - 2
.settings/com.zksw.flythings.easyui.prefs

@@ -1,5 +1,5 @@
-easyui.cfg.debug={"baud"\:"115200","defBrightness"\:-1,"font"\:"/mnt/extsd/ui/Harmony_231030.ttf","languageCode"\:"zh_CN","languagePath"\:"/mnt/extsd/tr/","resPath"\:"/mnt/extsd/ui/","rotateScreen"\:0,"rotateTouch"\:0,"screensaverTimeOut"\:-1,"startupLibPath"\:"/mnt/extsd/lib/libzkgui.so","startupTouchCalib"\:false,"touchDev"\:"/dev/input/event1","uart"\:"ttyS1","zkdebug"\:false}
-easyui.cfg.release={"baud"\:"115200","defBrightness"\:-1,"font"\:"/res/ui/Harmony_231030.ttf","languageCode"\:"zh_CN","languagePath"\:"/res/tr/","resPath"\:"/res/ui/","rotateScreen"\:0,"rotateTouch"\:0,"screensaverTimeOut"\:-1,"startupLibPath"\:"/res/lib/libzkgui.so","startupTouchCalib"\:false,"touchDev"\:"/dev/input/event1","uart"\:"ttyS1","zkdebug"\:false}
+easyui.cfg.debug={"baud"\:"115200","defBrightness"\:-1,"font"\:"/mnt/extsd/ui/Harmony_240927.ttf","languageCode"\:"zh_CN","languagePath"\:"/mnt/extsd/tr/","resPath"\:"/mnt/extsd/ui/","rotateScreen"\:0,"rotateTouch"\:0,"screensaverTimeOut"\:-1,"startupLibPath"\:"/mnt/extsd/lib/libzkgui.so","startupTouchCalib"\:false,"touchDev"\:"/dev/input/event1","uart"\:"ttyS1","zkdebug"\:false}
+easyui.cfg.release={"baud"\:"115200","defBrightness"\:-1,"font"\:"/res/ui/Harmony_240927.ttf","languageCode"\:"zh_CN","languagePath"\:"/res/tr/","resPath"\:"/res/ui/","rotateScreen"\:0,"rotateTouch"\:0,"screensaverTimeOut"\:-1,"startupLibPath"\:"/res/lib/libzkgui.so","startupTouchCalib"\:false,"touchDev"\:"/dev/input/event1","uart"\:"ttyS1","zkdebug"\:false}
 eclipse.preferences.version=1
 platform={"name"\:"Z21","cprojectTemplateDir"\:"bundle/cproject/z21","internalCode"\:"z21"}
 resolution=800x480

+ 2 - 2
.settings/language.settings.xml

@@ -5,7 +5,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-372444128849131468" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-897966030472691006" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
@@ -16,7 +16,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-933989040777" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1866745283451" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>

+ 2 - 0
i18n/en_US.tr

@@ -98,6 +98,7 @@
     <string name="SosDisconnected">Emergency Button Disconnected</string>
     <string name="HandleDisconnected">Handle Disconnected</string>
     <string name="GainCall">Extension calling, click to answer</string>
+    <string name="InitiateCall">Start Call</string>
     <!-- 医护界面 -->
     <string name="MedicalLoginMsg">Please enter the correct password to access healthcare functions</string>
     <string name="InputMedicalPassword">Enter Password to Access Healthcare</string>
@@ -223,6 +224,7 @@
 	<string name="ConfigureEmployeeID">Please configure employee ID first</string>
 	<string name="PassNoError">Employee not found for this card</string>
     <string name="NotActivity">No Activity</string>
+    <string name="CallAnswered">The call has been answered or cancelled, cannot answer</string>
     <!-- 版本界面 -->
 	<string name="VersionTitle">Version Upgrade</string>
 	<string name="VersionInfo">Version Information</string>

+ 2 - 0
i18n/es_ES-西班牙语.tr

@@ -98,6 +98,7 @@
 	<string name="SosDisconnected">Botón de emergencia desconectado</string>
 	<string name="HandleDisconnected">Mando desconectado</string>
 	<string name="GainCall">Llamada de extensión, clic para responder</string>
+	<string name="InitiateCall">Iniciar Llamada</string>
     <!-- 医护界面 -->
 	<string name="MedicalLoginMsg">Por favor, introduzca la contraseña correcta para acceder a las funciones de atención médica</string>
 	<string name="InputMedicalPassword">Introducir contraseña para acceder a la atención médica</string>
@@ -223,6 +224,7 @@
 	<string name="ConfigureEmployeeID">Por favor, configure primero el número de empleado</string>
 	<string name="PassNoError">No se encontró al empleado de esta tarjeta</string>
 	<string name="NotActivity">Sin actividad</string>
+	<string name="CallAnswered">La llamada ha sido contestada o cancelada, no se puede contestar</string>
     <!-- 版本界面 -->
 	<string name="VersionTitle">Actualización de versión</string>
 	<string name="VersionInfo">Información de versión</string>

+ 2 - 0
i18n/zh_CN.tr

@@ -98,6 +98,7 @@
     <string name="SosDisconnected">紧急按钮已断连</string>
     <string name="HandleDisconnected">手柄已断连</string>
     <string name="GainCall">分机正在呼叫,可以点击接听按钮进行接听</string>
+    <string name="InitiateCall">发起呼叫</string>
     <!-- 医护界面 -->
     <string name="MedicalLoginMsg">请输入正确的密码,进入医护功能</string>
     <string name="InputMedicalPassword">输入密码进入医护</string>
@@ -223,6 +224,7 @@
     <string name="ConfigureEmployeeID">请先配置员工工号</string>
     <string name="PassNoError">未找到该卡员工</string>
     <string name="NotActivity">暂无界面</string>
+    <string name="CallAndwered">该通话已被接听或取消,无法接听</string>
     <!-- 版本界面 -->
     <string name="VersionTitle">版本升级</string>
     <string name="VersionInfo">版本信息</string>

+ 21 - 0
jni/activity/functionActivity.cpp

@@ -4,6 +4,12 @@
 #include "functionActivity.h"
 
 /*TAG:GlobalVariable全局变量*/
+static ZKListView* mGainCallListViewPtr;
+static ZKButton* mGainCancelButtonPtr;
+static ZKButton* mGainCallButtonPtr;
+static ZKTextView* mGainCallTextViewPtr;
+static ZKPainter* mGainCallPainterPtr;
+static ZKWindow* mGainCallWindowPtr;
 static ZKButton* mNursingTimeBackButtonPtr;
 static ZKButton* mNursingTimeButtonPtr;
 static ZKTextView* mUnitTextViewPtr;
@@ -94,6 +100,8 @@ typedef struct {
 
 /*TAG:ButtonCallbackTab按键映射表*/
 static S_ButtonCallback sButtonCallbackTab[] = {
+    ID_FUNCTION_GainCancelButton, onButtonClick_GainCancelButton,
+    ID_FUNCTION_GainCallButton, onButtonClick_GainCallButton,
     ID_FUNCTION_NursingTimeBackButton, onButtonClick_NursingTimeBackButton,
     ID_FUNCTION_NursingTimeButton, onButtonClick_NursingTimeButton,
     ID_FUNCTION_Reduce5Button, onButtonClick_Reduce5Button,
@@ -138,6 +146,7 @@ typedef struct {
 }S_ListViewFunctionsCallback;
 /*TAG:ListViewFunctionsCallback*/
 static S_ListViewFunctionsCallback SListViewFunctionsCallbackTab[] = {
+    ID_FUNCTION_GainCallListView, getListItemCount_GainCallListView, obtainListItemData_GainCallListView, onListItemClick_GainCallListView,
     ID_FUNCTION_TimeListView, getListItemCount_TimeListView, obtainListItemData_TimeListView, onListItemClick_TimeListView,
     ID_FUNCTION_CallBedListView, getListItemCount_CallBedListView, obtainListItemData_CallBedListView, onListItemClick_CallBedListView,
 };
@@ -190,6 +199,12 @@ functionActivity::~functionActivity() {
     unregisterProtocolDataUpdateListener(onProtocolDataUpdate);
     onUI_quit();
     mActivityPtr = NULL;
+    mGainCallListViewPtr = NULL;
+    mGainCancelButtonPtr = NULL;
+    mGainCallButtonPtr = NULL;
+    mGainCallTextViewPtr = NULL;
+    mGainCallPainterPtr = NULL;
+    mGainCallWindowPtr = NULL;
     mNursingTimeBackButtonPtr = NULL;
     mNursingTimeButtonPtr = NULL;
     mUnitTextViewPtr = NULL;
@@ -252,6 +267,12 @@ const char* functionActivity::getAppName() const{
 //TAG:onCreate
 void functionActivity::onCreate() {
 	Activity::onCreate();
+    mGainCallListViewPtr = (ZKListView*)findControlByID(ID_FUNCTION_GainCallListView);if(mGainCallListViewPtr!= NULL){mGainCallListViewPtr->setListAdapter(this);mGainCallListViewPtr->setItemClickListener(this);}
+    mGainCancelButtonPtr = (ZKButton*)findControlByID(ID_FUNCTION_GainCancelButton);
+    mGainCallButtonPtr = (ZKButton*)findControlByID(ID_FUNCTION_GainCallButton);
+    mGainCallTextViewPtr = (ZKTextView*)findControlByID(ID_FUNCTION_GainCallTextView);
+    mGainCallPainterPtr = (ZKPainter*)findControlByID(ID_FUNCTION_GainCallPainter);
+    mGainCallWindowPtr = (ZKWindow*)findControlByID(ID_FUNCTION_GainCallWindow);
     mNursingTimeBackButtonPtr = (ZKButton*)findControlByID(ID_FUNCTION_NursingTimeBackButton);
     mNursingTimeButtonPtr = (ZKButton*)findControlByID(ID_FUNCTION_NursingTimeButton);
     mUnitTextViewPtr = (ZKTextView*)findControlByID(ID_FUNCTION_UnitTextView);

+ 6 - 0
jni/activity/functionActivity.h

@@ -27,6 +27,12 @@
 #include "window/ZKSlideWindow.h"
 
 /*TAG:Macro宏ID*/
+#define ID_FUNCTION_GainCallListView    80003
+#define ID_FUNCTION_GainCancelButton    20014
+#define ID_FUNCTION_GainCallButton    20015
+#define ID_FUNCTION_GainCallTextView    50013
+#define ID_FUNCTION_GainCallPainter    52007
+#define ID_FUNCTION_GainCallWindow    110008
 #define ID_FUNCTION_NursingTimeBackButton    20022
 #define ID_FUNCTION_NursingTimeButton    20017
 #define ID_FUNCTION_UnitTextView    50023

+ 2 - 1
jni/core/utilities.cpp

@@ -86,7 +86,8 @@ voip::Telephone* GetTelephone() {
 //  LOGD("password: %s", conf.password.c_str());
 //  LOGD("user_agent: %s", conf.user_agent.c_str());
 #endif
-  bool enable_video = StoragePreferences::getBool(SIP_ENABLE_VIDEO, true);
+//  bool enable_video = StoragePreferences::getBool(SIP_ENABLE_VIDEO, true);
+  bool enable_video = StoragePreferences::getBool(SIP_ENABLE_VIDEO, false);
   conf.auto_transmit_video_to_remote = enable_video;
   //单实例
   telephone = new voip::Telephone(conf);

+ 85 - 61
jni/logic/callLogic.cc

@@ -14,8 +14,7 @@
 #include "voip/media_player.h"
 #include "manager/LanguageManager.h"
 
-
-std::string _isOutgoing;
+std::string _callActivityType = "wait";
 std::string _toIdStr;
 
 //voip::WAVPlayer wavPlayer;	// 播放音频
@@ -27,6 +26,7 @@ static base::MediaPlayer mediaPlayer;
 static bool _isSleepTimerRegistered = false;
 
 #define CALLING_TIME 60		// 用于控制呼叫时间,定时器
+#define GAIN_CALL_TIME 61
 
 
 
@@ -60,6 +60,13 @@ void callActivityFinish(CallFinishType type){
 			setSleepTimerRegistered(_isSleepTimerRegistered);
 			EASYUICONTEXT->goBack();
 			break;
+		case END:
+			LOGD("end");
+			if (mActivityPtr != NULL) {
+				mediaPlayer.Stop();
+				EASYUICONTEXT->goBack();
+			}
+			break;
 		case FAILED:
 //			wavPlayer.Stop();
 			mediaPlayer.Stop();
@@ -101,41 +108,54 @@ void callActivityFinish(CallFinishType type){
 		case ACCEPT:
 			mActivityPtr->unregisterUserTimer(CALLING_TIME);
 			break;
+		case GAIN_OK:
+			mActivityPtr->unregisterUserTimer(GAIN_CALL_TIME);
+			break;
+		case GAIN_FAIL:
+			mediaPlayer.Stop();
+			mTextViewNamePtr->setTextTr("CallAndwered");
+			mActivityPtr->registerUserTimer(goBack, 5000);
+			break;
 		case A1CLICK:
 			LOGD("a1 click");
 
 			if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "TCP"){
 				TcpModel storeModel = CallingStatus::instance()->getTcpModel();
-				//只回传iId
-				storeModel.data = storeModel.json["id"].asString();
-
-				voip::CallInfo info = GetTelephone()->GetCallInfo();
-				LOGD("info state = %d",info.state);
-				if (info.state == voip::STATE_CALL_CALLING
-						|| info.state == voip::STATE_CALL_CALLING
-						|| info.state == voip::STATE_CALL_CONFIRMED){
-					sendVoiceTcp(VoiceAction::HANDOFF, storeModel, storeModel.from_id);
-					GetTelephone()->Hangup(info.id, voip::SIP_STATUS_CODE_DECLINE);
-					GetTelephone()->Hangup();
-
-					setSleepTimerRegistered(_isSleepTimerRegistered);
-					EASYUICONTEXT->goBack();
-				} else if (_isOutgoing == "false"){	//state = 5
-					mediaPlayer.Stop();
-					mButtonAnswerPtr->setVisible(false);
-					TcpModel model = CallingStatus::instance()->getTcpModel();
-					model.data = model.json["id"].asString();
-					sendVoiceTcp(VoiceAction::ACCEPT, model, model.from_id);
-
-					mActivityPtr->unregisterUserTimer(CALLING_TIME);
-
-				} else if (_isOutgoing == "true") {
-					sendVoiceTcp(VoiceAction::CANCEL, storeModel, storeModel.from_id);
-
-					setSleepTimerRegistered(_isSleepTimerRegistered);
-					EASYUICONTEXT->goBack();
+				if (!storeModel.json.isNull() && storeModel.json > 0 && storeModel.json.isMember("id")) {
+					//只回传iId
+					storeModel.data = storeModel.json["id"].asString();
+
+					voip::CallInfo info = GetTelephone()->GetCallInfo();
+					LOGD("info state = %d",info.state);
+					if (info.state == voip::STATE_CALL_CALLING
+							|| info.state == voip::STATE_CALL_CALLING
+							|| info.state == voip::STATE_CALL_CONFIRMED){
+						sendVoiceTcp(VoiceAction::HANDOFF, storeModel, storeModel.from_id);
+						GetTelephone()->Hangup(info.id, voip::SIP_STATUS_CODE_DECLINE);
+						GetTelephone()->Hangup();
+
+						setSleepTimerRegistered(_isSleepTimerRegistered);
+						EASYUICONTEXT->goBack();
+					}
+					else if (_callActivityType == "toCall"){	//state = 5
+						mediaPlayer.Stop();
+						mButtonAnswerPtr->setVisible(false);
+						TcpModel model = CallingStatus::instance()->getTcpModel();
+						model.data = model.json["id"].asString();
+						sendVoiceTcp(VoiceAction::ACCEPT, model, model.from_id);
+
+						mActivityPtr->unregisterUserTimer(CALLING_TIME);
+					}
+					else if (_callActivityType == "fromCall") {
+						sendVoiceCancel(storeModel.from_id);
+					}
+				}
+				else {
+					sendVoiceCancel(0);
 				}
 			}
+			setSleepTimerRegistered(_isSleepTimerRegistered);
+			EASYUICONTEXT->goBack();
 
 			break;
 		case KEY6_CLICK:
@@ -158,11 +178,9 @@ void callActivityFinish(CallFinishType type){
 					setSleepTimerRegistered(_isSleepTimerRegistered);
 					EASYUICONTEXT->goBack();
 
-//					std::string heartStr = "DOORLED,000F";
-//					const char* sendMsg = heartStr.c_str();
-//					sendProtocolTo(UART_TTYS2, (byte*)(sendMsg), strlen(sendMsg));
 					lightControl("DOORLED", "000F");
-				} else if (_isOutgoing == "false"){	//state = 5
+				}
+				else if (_callActivityType == "toCall"){	//state = 5
 					mediaPlayer.Stop();
 					mButtonAnswerPtr->setVisible(false);
 					TcpModel model = CallingStatus::instance()->getTcpModel();
@@ -235,8 +253,6 @@ static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  */
 static void onUI_init(){
 
-	CallingStatus::instance()->setBusy(true);
-
 //	GetTelephone()->SetInputPcmGainSize(10.0);
 
 //	player = new ZKMediaPlayer(ZKMediaPlayer::E_MEDIA_TYPE_AUDIO);
@@ -290,23 +306,22 @@ static void onUI_init(){
 static void onUI_intent(const Intent *intentPtr) {
 	if(intentPtr != NULL) {
 		LOGD("打开通话页面,进行通话");
+		CallingStatus::instance()->setBusy(true);
+
 		BRIGHTNESSHELPER->screenOn();
 		_isSleepTimerRegistered = getSleepTimerRegistered();
 		setSleepTimerRegistered(false);
 
-//		wavPlayer.Play(CONFIGMANAGER->getResFilePath("ring.wav"));
-//		mediaPlayer.Play(CONFIGMANAGER->getResFilePath("ring.wav"));
 		mediaPlayer.Play(CONFIGMANAGER->getResFilePath("ring.wav"), "", 1000,
 		        base::MediaPlayer::PlayMode::Loop);
-		// 键值解析
-		_isOutgoing = intentPtr->getExtra(isOutgoing);
-		std::string _audioOnly = intentPtr->getExtra(audioOnly);
-
 		if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "SIP"){
 			return;
 		}
 
-		if (_isOutgoing == "true"){
+		// 键值解析
+		_callActivityType = intentPtr->getExtra(callActivityType);
+
+		if (_callActivityType == "fromCall") {
 			int toId = 0;
 			_toIdStr = intentPtr->getExtra(toIdStr);
 			if (_toIdStr != "") {
@@ -335,7 +350,8 @@ static void onUI_intent(const Intent *intentPtr) {
 			}
 
 			mActivityPtr->registerUserTimer(CALLING_TIME, 60000);	// 如果对方没接听,则发送一个CANCEL回去
-		} else {
+		}
+		else if (_callActivityType == "toCall") {
 			TcpModel storeModel = CallingStatus::instance()->getTcpModel();
             TcpModel backTcp = storeModel;
             backTcp.data = storeModel.json["id"].asString();
@@ -355,6 +371,18 @@ static void onUI_intent(const Intent *intentPtr) {
 				sendVoiceTcp(VoiceAction::ACCEPT, storeModel, storeModel.from_id);
 			}
 		}
+		else if (_callActivityType == "gainCall") {
+			mButtonAnswerPtr->setVisible(false);
+
+			std::string _callName = intentPtr->getExtra(callName);
+			if (_callName != "") {
+				mTextViewNamePtr->setText(LANGUAGEMANAGER->getValue("Call") + _callName);
+			} else {
+				mTextViewNamePtr->setTextTr("CallOutTitle");
+			}
+
+			mActivityPtr->registerUserTimer(GAIN_CALL_TIME, 60000);
+		}
 
 	}
 }
@@ -377,12 +405,13 @@ static void onUI_hide() {
  * 当界面完全退出时触发
  */
 static void onUI_quit() {
-	if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "TCP"){
-		EASYUICONTEXT->showNaviBar();
-		EASYUICONTEXT->showStatusBar();
+	EASYUICONTEXT->showNaviBar();
+	EASYUICONTEXT->showStatusBar();
 
-		CallingStatus::instance()->setBusy(false);
-		CallingStatus::instance()->clearTcpModel();
+	CallingStatus::instance()->setBusy(false);
+	CallingStatus::instance()->clearTcpModel();
+
+	if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "TCP"){
 
 		voip::CallInfo info = GetTelephone()->GetCallInfo();
 		if (info.state == voip::STATE_CALL_CALLING
@@ -393,7 +422,7 @@ static void onUI_quit() {
 		}
 	}
 
-
+	_callActivityType = "wait";
     mediaPlayer.Stop();
 	mActivityPtr->unregisterUserTimer(goBack);
 }
@@ -463,9 +492,6 @@ static bool onUI_Timer(int id){
 	case CALLING_TIME: {
 		sendVoiceCancel(StoragePreferences::getInt(STORE_DEVICE_ID,0), 0);
 
-//		std::string heartStr = "DOORLED,000F";
-//		const char* sendMsg = heartStr.c_str();
-//		sendProtocolTo(UART_TTYS2, (byte*)(sendMsg), strlen(sendMsg));
 		lightControl("DOORLED", "000F");
 
 		setSleepTimerRegistered(_isSleepTimerRegistered);
@@ -473,6 +499,11 @@ static bool onUI_Timer(int id){
 
 		break;
 	}
+	case GAIN_CALL_TIME: {
+		setSleepTimerRegistered(_isSleepTimerRegistered);
+		EASYUICONTEXT->goBack();
+		break;
+	}
 	default:
 		break;
 	}
@@ -531,13 +562,10 @@ static bool onButtonClick_ButtonHangup(ZKButton *pButton) {
 				sendVoiceTcp(VoiceAction::HANDOFF, storeModel, storeModel.from_id);
 				GetTelephone()->Hangup(info.id, voip::SIP_STATUS_CODE_DECLINE);
 				GetTelephone()->Hangup();
-			} else if (_isOutgoing == "true") {
+			} else if (_callActivityType == "fromCall" || _callActivityType == "gainCall") {
 				string storeModelStr = getTcpModelString(storeModel);
 				sendVoiceTcp(VoiceAction::CANCEL, storeModel, storeModel.from_id);
 
-//				std::string heartStr = "DOORLED,000F";
-//				const char* sendMsg = heartStr.c_str();
-//				sendProtocolTo(UART_TTYS2, (byte*)(sendMsg), strlen(sendMsg));
 				lightControl("DOORLED", "000F");
 			} else {
 				storeModel.data = storeModel.json["id"].asString();
@@ -548,10 +576,6 @@ static bool onButtonClick_ButtonHangup(ZKButton *pButton) {
 			tcpModel.tid = tid;
 			sendVoiceTcp(VoiceAction::CANCEL, tcpModel, StoragePreferences::getInt(STORE_DEVICE_ID,0));
 
-			// 还原成无灯光的状态
-//			std::string heartStr = "DOORLED,000F";
-//			const char* sendMsg = heartStr.c_str();
-//			sendProtocolTo(UART_TTYS2, (byte*)(sendMsg), strlen(sendMsg));
 			lightControl("DOORLED", "000F");
 		}
 

+ 116 - 10
jni/logic/functionLogic.cc

@@ -48,6 +48,9 @@ static uint32_t functionColor = buleDeepColour;
 
 static base::MediaPlayer mediaPlayer;
 
+int gainCallId = 0;
+static Json::Value gainCallDataList;
+
 #define FUNCTION_TIMER_HANDLE 3	// 功能模块的定时器id
 
 static int chooseNursingTime = 0;
@@ -85,8 +88,7 @@ void setFunctionTheme() {
         mRebootPowerButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_bule2.png");
         mRebootDeviceButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_bule2.png");
         mRebootLineButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_bule2.png");
-
-
+        mGainCallButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_bule.png");
 
         functionColor = buleDeepColour;
     }
@@ -105,11 +107,10 @@ void setFunctionTheme() {
         mRebootPowerButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_pink2.png");
         mRebootDeviceButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_pink2.png");
         mRebootLineButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_pink2.png");
-//
+        mGainCallButtonPtr->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "button/elliptic_pink.png");
 
         functionColor = redDeepColour;
     }
-
 }
 
 
@@ -149,7 +150,7 @@ static void help() {
 	mFunctionButtonPtr->setText(LANGUAGEMANAGER->getValue("Confirm"));
 	mFunctionWindowPtr->showWnd();
 
-	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 30 * 1000);	// 30秒
+	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 3 * 1000);	// 30秒
 }
 
 static void helpResopnse() {
@@ -160,7 +161,7 @@ static void helpResopnse() {
 	mFunctionButtonPtr->setText(LANGUAGEMANAGER->getValue("Confirm"));
 	mFunctionWindowPtr->showWnd();
 
-	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 30 * 1000);	// 30秒
+	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 3 * 1000);	// 30秒
 }
 
 void toFunctionActivity(std::string data) {
@@ -184,7 +185,7 @@ void position(string functionText) {
 	mFunctionButtonPtr->setText(LANGUAGEMANAGER->getValue("Confirm"));
 	mFunctionWindowPtr->showWnd();
 
-	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 30 * 1000);	// 30秒
+	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 3 * 1000);	// 30秒
 }
 
 void roomPatrol(string functionText) {
@@ -195,7 +196,7 @@ void roomPatrol(string functionText) {
 	mFunctionButtonPtr->setText(LANGUAGEMANAGER->getValue("Confirm"));
 	mFunctionWindowPtr->showWnd();
 
-	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 30 * 1000);	// 30秒
+	mActivityPtr->registerUserTimer(FUNCTION_TIMER_HANDLE, 3 * 1000);	// 30秒
 }
 
 
@@ -305,6 +306,39 @@ void setLanguage(string functionText) {
 }
 
 
+void addGainCallData(Json::Value data) {
+	gainCallDataList.append(data);
+	if (mActivityPtr != NULL) {
+		mGainCallListViewPtr->refreshListView();
+	}
+}
+
+
+void deleteGainCallData(string id) {
+	if (gainCallDataList.size() == 0) {
+		return;
+	}
+
+	for (int i = 0; i < gainCallDataList.size(); ++i) {
+		string _id = gainCallDataList[i]["id"].asString();
+		if (_id == id) {
+			Json::Value deleteGainCall;
+			gainCallDataList.removeIndex(i, &deleteGainCall);
+			break;
+		}
+	}
+
+	if (gainCallDataList.size() > 0) {
+		if (gainCallId >= gainCallDataList.size()) {
+			gainCallId = 0;
+		}
+		mGainCallListViewPtr->refreshListView();
+	}
+	else {
+        gainCallId = 0;
+		EASYUICONTEXT->closeActivity("functionActivity");
+	}
+}
 
 
 /**
@@ -395,6 +429,9 @@ static void onUI_intent(const Intent *intentPtr) {
 			_functionText = intentPtr->getExtra(functionText);
 			 setLanguage(_functionText);
 		}
+		else if (_functionWindows == "gainCall") {
+			mGainCallWindowPtr->showWnd();
+		}
 		else {
 			_warnText = LANGUAGEMANAGER->getValue("NotActivity");
 			warn(_warnText);
@@ -425,6 +462,7 @@ static void onUI_quit() {
 	mFunctionWindowPtr->hideWnd();
 	mWarnWindowPtr->hideWnd();
 	mLogoutWindowPtr->hideWnd();
+	mGainCallWindowPtr->hideWnd();
 
 
 //    EASYUICONTEXT->showStatusBar();
@@ -542,8 +580,7 @@ static bool onButtonClick_ConfirmCallButton(ZKButton *pButton) {
     }
     else {
 		Intent* intent = new Intent();
-		intent->putExtra(isOutgoing, "true");
-		intent->putExtra(audioOnly, "true");
+		intent->putExtra(callActivityType, "fromCall");
 		intent->putExtra(toIdStr, toId);
 		intent->putExtra(callName, chooseBed["frame_bed"]["full_name"].asString()  + " " +  chooseBed["customer_name"].asString());
 		EASYUICONTEXT->openActivity("callActivity", intent);
@@ -901,3 +938,72 @@ static bool onButtonClick_NursingTimeBackButton(ZKButton *pButton) {
     nursingTime = 5;
     return false;
 }
+
+static int getListItemCount_GainCallListView(const ZKListView *pListView) {
+    //LOGD("getListItemCount_GainCallListView !\n");
+    return gainCallDataList.size();
+}
+
+static void obtainListItemData_GainCallListView(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {
+    //LOGD(" obtainListItemData_ GainCallListView  !!!\n");
+	if (functionThemeInt == 1) {
+		pListItem->setButtonStatusPic(ZK_CONTROL_STATUS_SELECTED, "/function/chooseBed_400x52.png");
+	}
+	else if (functionThemeInt == 2) {
+		pListItem->setButtonStatusPic(ZK_CONTROL_STATUS_SELECTED, "/function/chooseBed-pink_400x52.png");
+	}
+	pListItem->setTextStatusColor(ZK_CONTROL_STATUS_SELECTED, functionColor);
+
+	if (gainCallDataList.size() > 0) {
+		pListItem->setText(gainCallDataList[index]["fromFrameFullName"].asString() + " " + gainCallDataList[index]["fromMemberName"].asString() + " " +  LANGUAGEMANAGER->getValue("InitiateCall"));
+	}
+
+	if (index == gainCallId) {
+		pListItem->setSelected(true);
+		gainCallId = index;
+	}
+	else {
+		pListItem->setSelected(false);
+	}
+}
+
+static void onListItemClick_GainCallListView(ZKListView *pListView, int index, int id) {
+    //LOGD(" onListItemClick_ GainCallListView  !!!\n");
+	gainCallId = index;
+}
+
+static bool onButtonClick_GainCallButton(ZKButton *pButton) {
+    LOGD(" ButtonClick GainCallButton !!!\n");
+    if (gainCallId < gainCallDataList.size()) {
+        Json::Value it;
+        it = gainCallDataList[gainCallId];
+        sendVoiceGainCall(it["tid"].asString(), it);
+
+        gainCallDataList.clear();
+        gainCallId = 0;
+
+		Intent* intent = new Intent();
+		intent->putExtra(callActivityType, "gainCall");
+		intent->putExtra(callName, it["fromFrameFullName"].asString()  + " " +  it["fromMemberName"].asString());
+		EASYUICONTEXT->openActivity("callActivity", intent);
+		EASYUICONTEXT->closeActivity("functionActivity");
+    }
+    else {
+        gainCallDataList.clear();
+        mGainCallWindowPtr->hideWnd();
+
+        warn(LANGUAGEMANAGER->getValue("CallAndwered"));
+    }
+
+    return false;
+}
+
+static bool onButtonClick_GainCancelButton(ZKButton *pButton) {
+    LOGD(" ButtonClick GainCancelButton !!!\n");
+    gainCallDataList.clear();
+    gainCallId = 0;
+
+    mGainCallWindowPtr->hideWnd();
+	EASYUICONTEXT->closeActivity("functionActivity");
+    return false;
+}

+ 1 - 2
jni/logic/navibar.cc

@@ -262,8 +262,7 @@ static bool onButtonClick_CallNurseButton(ZKButton *pButton) {
 		GetTelephone()->MakeCall(od_number_uri);
 	} else {
 		Intent* intent = new Intent();
-		intent->putExtra(isOutgoing, "true");
-		intent->putExtra(audioOnly, "true");
+		intent->putExtra(callActivityType, "fromCall");
 		EASYUICONTEXT->openActivity("callActivity", intent);
 	}
     return false;

+ 56 - 13
jni/logic/startLogic.cc

@@ -15,6 +15,7 @@
 #include <time.h>
 #include <thread>
 #include <string>
+#include <vector>
 #include <unistd.h>
 #include <sys/reboot.h>
 #include "service/BusinessConfig.h"
@@ -128,13 +129,22 @@ namespace {
 			pjsua_call_get_info(call_id, &ci);
 			LOGD("通话结束的状态码 ===> %d", ci.last_status);
 			if (ci.last_status == voip::SIP_NOT_FOUND) {
-				callActivityFinish(CallFinishType::NOT_FOUND);
+				if (CallingStatus::instance()->busy()){
+					callActivityFinish(CallFinishType::NOT_FOUND);
+				}
 				mActivityPtr->registerUserTimer(SIP_RECONNECT_TIME_HANDLE, 1 * 1000);
 			}
 			else if (ci.last_status == voip::SIP_REQUEST_TIMES) {
-				callActivityFinish(CallFinishType::REQUEST_TIMES);
+				if (CallingStatus::instance()->busy()){
+					callActivityFinish(CallFinishType::REQUEST_TIMES);
+				}
 				mActivityPtr->registerUserTimer(SIP_RECONNECT_TIME_HANDLE, 1 * 1000);
 			}
+			else {
+				if (CallingStatus::instance()->busy()){
+					callActivityFinish(CallFinishType::END);
+				}
+			}
 
 //			//保存通话记录
 //			voip::CallInfo info = telephone->GetCallInfo(call_id);
@@ -365,8 +375,7 @@ void handleMsg(byte* inBytes){
 
 				//来电话了
 				Intent* intent = new Intent();
-				intent->putExtra(isOutgoing, "false");
-				intent->putExtra(audioOnly, "true");
+				intent->putExtra(callActivityType, "toCall");
 				EASYUICONTEXT->openActivity("callActivity", intent);
 			}
 		} else if (tcpModel.action == VoiceAction::HANDOFF){
@@ -383,6 +392,16 @@ void handleMsg(byte* inBytes){
 		else if (tcpModel.action == VoiceAction::SIP_RECONNECT) {
 			mActivityPtr->registerUserTimer(SIP_RECONNECT_TIME_HANDLE, 1 * 1000);
 		}
+		else if (tcpModel.action == VoiceAction::GAIN_OK) {
+			CallingStatus::instance()->setTcpModel(tcpModel);
+			sleep(1);
+			callActivityFinish(CallFinishType::GAIN_OK);
+		}
+		else if (tcpModel.action == VoiceAction::GAIN_FAIL) {
+			if (CallingStatus::instance()->busy()){
+				callActivityFinish(CallFinishType::GAIN_FAIL);
+			}
+		}
 	}
 	else if (tcpModel.type == TcpType::SOS) {
 		if (tcpModel.action == SosAction::CANCEL) {
@@ -458,10 +477,38 @@ void handleMsg(byte* inBytes){
 			statusLight();
 		}
 		else if (tcpModel.action == SideAction::SHOW) {
+			const char* currentAppName = EASYUICONTEXT->currentAppName();
+			string _currentAppName = currentAppName;
+			if (_currentAppName == "callActivity") {
+				return;
+			}
 
+			Json::Value _it = tcpModel.json;
+			if (_it["actionType"].asString() != "VOICE") {
+				return;
+			}
+
+			if (_currentAppName != "functionActivity") {
+				Intent* intent = new Intent();
+				intent->putExtra(functionWindows, "gainCall");
+				EASYUICONTEXT->openActivity("functionActivity", intent);
+			}
+
+			size_t pos = tcpModel.tid.find("_");
+			if (pos != std::string::npos) {
+				_it["tid"] = tcpModel.tid.substr(0, pos);
+			} else {
+				 _it["tid"] = tcpModel.tid;
+			}
+
+			addGainCallData(_it);
 		}
 		else if (tcpModel.action == SideAction::CLEAR) {
-
+			const char* currentAppName = EASYUICONTEXT->currentAppName();
+			string _currentAppName = currentAppName;
+			if (_currentAppName == "functionActivity") {
+				deleteGainCallData(tcpModel.json["id"].asString());
+			}
 		}
 	}
 	else if (tcpModel.type == TcpType::CALLBACK) {
@@ -639,8 +686,7 @@ public:
 				callActivityFinish(CallFinishType::A1CLICK);
 			} else {
 				Intent* intent = new Intent();
-				intent->putExtra(isOutgoing, "true");
-				intent->putExtra(audioOnly, "true");
+				intent->putExtra(callActivityType, "fromCall");
 				EASYUICONTEXT->openActivity("callActivity", intent);
 			}
 		}
@@ -853,8 +899,7 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 						callActivityFinish(CallFinishType::A1CLICK);
 					} else {
 						Intent* intent = new Intent();
-						intent->putExtra(isOutgoing, "true");
-						intent->putExtra(audioOnly, "true");
+						intent->putExtra(callActivityType, "fromCall");
 						EASYUICONTEXT->openActivity("callActivity", intent);
 					}
 				}
@@ -888,8 +933,7 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 						callActivityFinish(CallFinishType::KEY6_CLICK);
 					} else {
 						Intent* intent = new Intent();
-						intent->putExtra(isOutgoing, "true");
-						intent->putExtra(audioOnly, "true");
+						intent->putExtra(callActivityType, "fromCall");
 						EASYUICONTEXT->openActivity("callActivity", intent);
 					}
 				}
@@ -960,8 +1004,7 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 						callActivityFinish(CallFinishType::A1CLICK);
 					} else {
 						Intent* intent = new Intent();
-						intent->putExtra(isOutgoing, "true");
-						intent->putExtra(audioOnly, "true");
+						intent->putExtra(callActivityType, "fromCall");
 						EASYUICONTEXT->openActivity("callActivity", intent);
 					}
 				}

+ 4 - 0
jni/net/tcp_model.h

@@ -43,6 +43,10 @@ public:
 	inline static std::string TRANSFER = "TRANSFER";
 	inline static std::string HANDOFF = "HANDOFF";
 	inline static std::string CANCEL = "CANCEL";
+	inline static std::string GAIN_CALL = "GAIN_CALL";
+	inline static std::string GAIN_OK = "GAIN_OK";
+	inline static std::string GAIN_FAIL = "GAIN_FAIL";
+	inline static std::string GAINED = "GAINED";
 	inline static std::string SUCCESS = "SUCCESS";
 	inline static std::string FAILED = "FAILED";
 	inline static std::string CANCEL_BY_DOOR = "CANCEL_BY_DOOR";

+ 12 - 1
jni/net/tcp_util.cpp

@@ -179,8 +179,8 @@ void sendVoiceTcp(std::string action, TcpModel model, int toId){
 	tcpModel.type = TcpType::VOICE;
 	tcpModel.action = action;
 	tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID,0);
-
 	tcpModel.to_id = toId;
+
 	if (model.data!=""){
 		tcpModel.data = model.data;
 	} else if (model.json>0){
@@ -210,6 +210,17 @@ void sendVoiceCancel(int toId) {
 	sendTcpModel(tcpModel);
 }
 
+void sendVoiceGainCall(std::string tid, Json::Value it) {
+	TcpModel tcpModel;
+	tcpModel.tid = tid;
+	tcpModel.type = TcpType::VOICE;
+	tcpModel.action = VoiceAction::GAIN_CALL;
+	tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID,0);
+	tcpModel.json = it;
+	tcpModel.to_id = it["fromDeviceId"].asInt();
+	sendTcpModel(tcpModel);
+}
+
 
 void sendSosCall(std::string sosMsg) {
 	TcpModel tcpModel;

+ 1 - 0
jni/net/tcp_util.h

@@ -29,6 +29,7 @@ std::string sendVoiceCall(Json::Value json);
 void sendVoiceTcp(std::string action, TcpModel model, int toId);
 void sendVoiceCancel(int fromId, int toId);
 void sendVoiceCancel(int toId);
+void sendVoiceGainCall(std::string tid, Json::Value it);
 
 void sendSosCall(std::string sosMsg);
 void sendSosCancel(std::string sosId);

+ 10 - 4
jni/service/BusinessConfig.h

@@ -15,6 +15,7 @@
 #include "net/tcp_model.h"
 #include "net/tcp_util.h"
 #include <map>
+#include <unordered_map>
 
 #ifndef JNI_SERVICE_BUSINESSCONFIG_H_
 #define JNI_SERVICE_BUSINESSCONFIG_H_
@@ -79,8 +80,8 @@ static uint32_t whiteColour = 0xFFFFFFFF;
 static int defaultThemeInt = 1;
 static int defaultModeInt = 3;
 
-static std::string versionCode = "v2.0.14";
-static int versionNo = 61;
+static std::string versionCode = "v2.0.15";
+static int versionNo = 62;
 static std::string serverIP = "172.28.100.100";
 static std::string tcpIP = "172.28.100.100";
 static int serverHttpPort = 8006;
@@ -199,6 +200,9 @@ void nfcLogin(std::string revStr);
 void deviceReboot();
 void systemRestart();
 
+void addGainCallData(Json::Value data);
+void deleteGainCallData(std::string id);
+
 enum CallFinishType {
 	CANCEL,
 	REJECT,
@@ -211,6 +215,9 @@ enum CallFinishType {
 	KEY6_CLICK,
 	NOT_FOUND,
 	REQUEST_TIMES,
+	GAIN_OK,
+	GAIN_FAIL,
+	END,
 };
 void callActivityFinish(CallFinishType type);
 void buildSIP(std::string toSipId);
@@ -320,8 +327,7 @@ static bool checkIsDay(){
 	//LOGD("tiDayStart %ld . tNightStart %ld . currentTime %ld", tDayStart, tNightStart, currentTime);
 }
 
-static std::string isOutgoing = "isOutgoing";
-static std::string audioOnly = "audioOnly";
+static std::string callActivityType = "callActivityType";
 static std::string callRoleType = "callRoleType";
 static std::string toIdStr = "toIdStr";
 static std::string callName = "callName";

BIN
libs/armeabi/libzkgui.so


BIN
obj/activity/callActivity.o


BIN
obj/activity/deviceInfoActivity.o


BIN
obj/activity/functionActivity.o


BIN
obj/activity/mainActivity.o


BIN
obj/activity/medicalCareActivity.o


BIN
obj/activity/moreActivity.o


BIN
obj/activity/navibar.o


BIN
obj/activity/promptActivity.o


BIN
obj/activity/settingActivity.o


BIN
obj/activity/sipTestActivity.o


BIN
obj/activity/startActivity.o


BIN
obj/activity/statusbar.o


BIN
obj/activity/updateActivity.o


BIN
obj/core/update_assistant.o


BIN
obj/core/utilities.o


BIN
obj/net/tcp_client.o


BIN
obj/net/tcp_model.o


BIN
obj/net/tcp_util.o


BIN
obj/server/http_server.o


BIN
obj/service/BusinessConfig.o


BIN
obj/service/time.o


BIN
obj/uart/UartContext.o


BIN
resources/Harmony_231030.ttf


BIN
resources/function/chooseBed-pink_400x52.png


BIN
resources/function/chooseBed_400x52.png


BIN
resources/function/noChooseBed_400x52.png


BIN
ui/function.ftu