Explorar o código

完成4手柄功能

vothin hai 11 meses
pai
achega
1dfa8f2f78
Modificáronse 50 ficheiros con 681 adicións e 387 borrados
  1. 14 1
      i18n/zh_CN.tr
  2. 2 0
      jni/activity/deviceAddActivity.h
  3. 78 0
      jni/include/utils/ByteUtil.h
  4. 25 0
      jni/include/utils/StringHelper.h
  5. 40 54
      jni/logic/callLogic.cc
  6. 1 1
      jni/logic/customerAffairLogic.cc
  7. 40 2
      jni/logic/deviceAddLogic.cc
  8. 4 4
      jni/logic/deviceInfoLogic.cc
  9. 0 1
      jni/logic/functionLogic.cc
  10. 63 2
      jni/logic/mainLogic.cc
  11. 0 1
      jni/logic/navibar.cc
  12. 212 249
      jni/logic/startLogic.cc
  13. 3 0
      jni/net/tcp_model.h
  14. 74 0
      jni/net/tcp_util.cpp
  15. 5 0
      jni/net/tcp_util.h
  16. 0 36
      jni/service/BusinessConfig.cpp
  17. 4 0
      jni/service/BusinessConfig.h
  18. 115 36
      jni/uart/UartContext.cpp
  19. 1 0
      jni/uart/UartContext.h
  20. BIN=BIN
      libs/armeabi/libzkgui.so
  21. BIN=BIN
      obj/activity/callActivity.o
  22. BIN=BIN
      obj/activity/customerAffairActivity.o
  23. BIN=BIN
      obj/activity/deviceAddActivity.o
  24. BIN=BIN
      obj/activity/deviceInfoActivity.o
  25. BIN=BIN
      obj/activity/functionActivity.o
  26. BIN=BIN
      obj/activity/interactionActivity.o
  27. BIN=BIN
      obj/activity/mainActivity.o
  28. BIN=BIN
      obj/activity/medicalCareActivity.o
  29. BIN=BIN
      obj/activity/moreActivity.o
  30. BIN=BIN
      obj/activity/navibar.o
  31. BIN=BIN
      obj/activity/promptActivity.o
  32. BIN=BIN
      obj/activity/settingActivity.o
  33. BIN=BIN
      obj/activity/sipTestActivity.o
  34. BIN=BIN
      obj/activity/startActivity.o
  35. BIN=BIN
      obj/activity/statusbar.o
  36. BIN=BIN
      obj/activity/updateActivity.o
  37. BIN=BIN
      obj/core/update_assistant.o
  38. BIN=BIN
      obj/net/tcp_client.o
  39. BIN=BIN
      obj/net/tcp_model.o
  40. BIN=BIN
      obj/net/tcp_util.o
  41. BIN=BIN
      obj/server/http_server.o
  42. BIN=BIN
      obj/service/BusinessConfig.o
  43. BIN=BIN
      obj/service/time.o
  44. BIN=BIN
      obj/uart/UartContext.o
  45. BIN=BIN
      resources/main/affair_grey.png
  46. BIN=BIN
      resources/main/event_grey.png
  47. BIN=BIN
      ui/deviceAdd.ftu
  48. BIN=BIN
      ui/deviceInfo.ftu
  49. BIN=BIN
      ui/main.ftu
  50. BIN=BIN
      ui/setting.ftu

+ 14 - 1
i18n/zh_CN.tr

@@ -131,6 +131,13 @@
     <string name="ChoiceRoomMsg">选择要注册的房间</string>
     <string name="ChoiceBedMsg">选择要注册的床位</string>
     <string name="IsNfcLogout">请确认,是否退出登录?</string>
+    <string name="HCallSendSuccess">呼叫已发出</string>
+    <string name="SosDisconnected">紧急按钮已断连</string>
+    <string name="HandleDisconnected">手柄已断连</string>
+    <string name="Handle1Disconnected">手柄1已断连</string>
+    <string name="Handle2Disconnected">手柄2已断连</string>
+    <string name="Handle3Disconnected">手柄3已断连</string>
+    <string name="Handle4Disconnected">手柄4已断连</string>
     <!-- 医护界面 -->
     <string name="MedicalLoginMsg">请输入正确的密码,进入医护功能</string>
     <string name="InputMedicalPassword">输入密码进入医护</string>
@@ -229,6 +236,8 @@
     <string name="DeviceLocal">本机</string>
     <string name="DeviceExtension1">手柄1</string>
     <string name="DeviceExtension2">手柄2</string>
+    <string name="DeviceExtension3">手柄3</string>
+    <string name="DeviceExtension4">手柄4</string>
     <string name="Part">科室</string>
     <string name="Room">房间</string>
     <string name="Bed">床位</string>
@@ -236,7 +245,9 @@
     <string name="DeviceAddMsg">设备名称:本机        设备类型:3</string>
     <string name="DeviceAddMsg2">设备名称:手柄1	       设备类型:4</string>
     <string name="DeviceAddMsg3">设备名称:手柄2	       设备类型:4</string>
-    <string name="DeviceAddMsg4">注册ID:</string>
+    <string name="DeviceAddMsg4">设备名称:手柄3	       设备类型:4</string>
+    <string name="DeviceAddMsg5">设备名称:手柄4	       设备类型:4</string>
+    <string name="DeviceAddMsg6">注册ID:</string>
     <string name="RoomDevice">门口机</string>
     <string name="BedDevice">床头分机</string>
     <string name="AddDeviceSuccess">设备注册成功</string>
@@ -286,6 +297,8 @@
     <string name="DEVICE_FRAME_FAILED">设备类型和空间结构类型不匹配!</string>
     <string name="AddDeviceFailed">注册失败</string>
     <string name="AddDeviceFrameFailed">没有能够注册的空间id</string>
+    <string name="HandleError">手柄:</string>
+    <string name="NotAdd"> 没有注册</string>
     <!-- 版本界面 -->
     <string name="VersionTitle">版本升级</string>
     <string name="VersionInfo">版本信息</string>

+ 2 - 0
jni/activity/deviceAddActivity.h

@@ -28,6 +28,8 @@
 #include "window/ZKSlideWindow.h"
 
 /*TAG:Macro宏ID*/
+#define ID_DEVICEADD_DeviceRadioButton5    22005
+#define ID_DEVICEADD_DeviceRadioButton4    22004
 #define ID_DEVICEADD_DeviceAddTitleTextView    50007
 #define ID_DEVICEADD_DeviceAddPicPainter    52004
 #define ID_DEVICEADD_DeviceAddPainter    52002

+ 78 - 0
jni/include/utils/ByteUtil.h

@@ -0,0 +1,78 @@
+
+
+#ifndef _UTILS_TIME_BYTE_UTIL_H_
+#define _UTILS_TIME_BYTE_UTIL_H_
+
+#include <string>
+#include <iostream>
+#include <sstream>
+
+
+/**
+ * @brief 字节操作类
+ */
+class ByteUtil {
+public:
+	static void copyUnsignedCharArray(unsigned char* source, unsigned char destination[], size_t size) {
+	    std::copy(source, source + size, destination);
+	}
+
+	static void copyUnsignedCharArray(unsigned char* source, unsigned char* destination, size_t size, size_t& offset) {
+	    // 确保不超出目标数组的界限
+	    size_t remainingSize = offset + size > 1024 ? 1024 - offset : size;
+	    if (remainingSize > 0) {
+	        std::copy(source, source + remainingSize, destination + offset);
+	        offset += remainingSize; // 更新偏移量
+	    }
+	}
+
+//	std::string byteToString(const unsigned char* bytes, unsigned long int length) {
+//	    return std::string(reinterpret_cast<const char*>(bytes), length);
+//	}
+
+	static std::string byteToString(const unsigned char* data, size_t size) {
+	    std::string result;
+
+	    // 将每个 unsigned char 转换为 char 并添加到结果字符串中
+	    for (size_t i = 0; i < size; ++i) {
+	        result += static_cast<char>(data[i]);
+	    }
+
+	    return result;
+	}
+
+	static std::string convertToString(const unsigned char* data, size_t size) {
+        std::string dataStr = "";
+		for (int i = 0; i < size; ++i) {
+            char buf[1024];
+			sprintf(buf, "%02x", data[i]);
+			dataStr += buf;
+		}
+	    return dataStr;
+	}
+
+	static unsigned char stringToByte(const std::string& str) {
+	    std::stringstream ss;
+	    ss << std::hex << str;
+	    unsigned int intValue;
+	    ss >> intValue;
+	    return static_cast<unsigned char>(intValue);
+	}
+
+
+	static std::string timestampToHex(int timestamp) {
+	    std::stringstream ss;
+	    ss << std::hex << timestamp;
+	    return ss.str();
+	}
+
+
+	static std::string timestampToHex(time_t timestamp) {
+	    std::stringstream ss;
+	    ss << std::hex << timestamp;
+	    return ss.str();
+	}
+
+};
+
+#endif /* _UTILS_TIME_BYTE_UTIL_H_ */

+ 25 - 0
jni/include/utils/StringHelper.h

@@ -0,0 +1,25 @@
+/*
+ * StringHelper.h
+ *
+ *  Created on: 2024年7月19日
+ *      Author: m
+ */
+
+#ifndef JNI_INCLUDE_UTILS_STRINGHELPER_H_
+#define JNI_INCLUDE_UTILS_STRINGHELPER_H_
+
+#include <algorithm>
+#include <cctype>
+#include <string>
+
+class StringHelper {
+public:
+	static void toLowerCase(std::string& str) {
+	    std::transform(str.begin(), str.end(), str.begin(),
+	        [](unsigned char c) { return std::tolower(c); });
+	}
+};
+
+
+
+#endif /* JNI_INCLUDE_UTILS_STRINGHELPER_H_ */

+ 40 - 54
jni/logic/callLogic.cc

@@ -88,7 +88,8 @@ void callActivityFinish(CallFinishType type){
 
 					setSleepTimerRegistered(_isSleepTimerRegistered);
 					EASYUICONTEXT->goBack();
-				} else if (_isOutgoing == "false"){	//state = 5
+				}
+				else if (_isOutgoing == "false"){	//state = 5
 					mButtonAnswerPtr->setVisible(false);
 					TcpModel model = CallingStatus::instance()->getTcpModel();
 					model.data = model.json["id"].asString();
@@ -96,19 +97,26 @@ void callActivityFinish(CallFinishType type){
 
 					mActivityPtr->unregisterUserTimer(CALLING_TIME);
 
-				} else if (_isOutgoing == "true") {
+				}
+				else if (_isOutgoing == "true") {
 					sendVoiceTcp(VoiceAction::CANCEL, storeModel, storeModel.from_id);
 
 					setSleepTimerRegistered(_isSleepTimerRegistered);
 					EASYUICONTEXT->goBack();
 				}
+				else if (_isOutgoing == "handleHCall") {
+					sendVoiceCancel(storeModel.to_id, 0);
+
+					setSleepTimerRegistered(_isSleepTimerRegistered);
+					EASYUICONTEXT->goBack();
+				}
 			}
 
 			break;
 		case KEY6_CLICK:
 			LOGD("KEY6 click");
 
-			if (StoragePreferences::getString(STORE_SIGNAL_TYPE,"TCP")=="TCP"){
+			if (StoragePreferences::getString(STORE_SIGNAL_TYPE,"TCP") == "TCP"){
 				TcpModel storeModel = CallingStatus::instance()->getTcpModel();
 				//只回传iId
 				storeModel.data = storeModel.json["id"].asString();
@@ -125,11 +133,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 (_isOutgoing == "false"){	//state = 5
 					mButtonAnswerPtr->setVisible(false);
 					TcpModel model = CallingStatus::instance()->getTcpModel();
 					model.data = model.json["id"].asString();
@@ -268,7 +274,6 @@ static void onUI_intent(const Intent *intentPtr) {
 		        base::MediaPlayer::PlayMode::Loop);
 		// 键值解析
 		_isOutgoing = intentPtr->getExtra(isOutgoing);
-		std::string _audioOnly = intentPtr->getExtra(audioOnly);
 
 		if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "SIP"){
 			return;
@@ -281,34 +286,24 @@ static void onUI_intent(const Intent *intentPtr) {
 				toId = atoi(_toIdStr.c_str());
 			}
 
-			//TCP call
-			TcpModel tcpModel;
-			tcpModel.tid = base::format("t%d", TimeHelper::getCurrentTime());
-			tcpModel.type = TcpType::VOICE;
-			tcpModel.action = VoiceAction::CALL;
-			tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID,0);
-			tcpModel.to_id = toId;
-			std::string req = getTcpModelString(tcpModel);
-			LOGD("TCP CALL : %s",req.c_str());
-			setCallTid(tcpModel.tid);
-
-			//回调注册
-			TcpCallback callback;
-			callback.tid = tcpModel.tid;
-			callback.jsonStr = req;
-			callback.onSuccess = [](Json::Value json){
-				LOGD("voice callback success");
-				return 0;
-			};
-			callback.onFalied = [](Json::Value json){
-				LOGD("voice callback failed");
-				return 0;
-			};
-			TcpClient::instance()->sendMsgWithCb(req.c_str(), callback);
+			// 呼叫的时候需要把tid放进去
+			tid = sendVoiceCall(toId);
+			mButtonAnswerPtr->setVisible(false);
 
+			std::string _callName = intentPtr->getExtra(callName);
+			if (_callName != "") {
+				mTextViewNamePtr->setText(LANGUAGEMANAGER->getValue("Call") + _callName);
+			} else {
+				mTextViewNamePtr->setTextTr("CallOutTitle");
+			}
 
+			mActivityPtr->registerUserTimer(CALLING_TIME, 60000);	// 如果对方没接听,则发送一个CANCEL回去
+		}
+		else if (_isOutgoing == "handleHCall") {
+			string handleCallIdStr = intentPtr->getExtra(handleCallId);
+			int _handleCallId = std::stoi(handleCallIdStr);
 			// 呼叫的时候需要把tid放进去
-			tid = tcpModel.tid;
+			tid = sendVoiceHCall(_handleCallId);
 			mButtonAnswerPtr->setVisible(false);
 
 			std::string _callName = intentPtr->getExtra(callName);
@@ -319,7 +314,8 @@ static void onUI_intent(const Intent *intentPtr) {
 			}
 
 			mActivityPtr->registerUserTimer(CALLING_TIME, 60000);	// 如果对方没接听,则发送一个CANCEL回去
-		} else {
+		}
+		else {
 			TcpModel storeModel = CallingStatus::instance()->getTcpModel();
             TcpModel backTcp = storeModel;
             backTcp.data = storeModel.json["id"].asString();
@@ -447,18 +443,7 @@ static bool onUI_Timer(int id){
 	}
 	case CALLING_TIME: {
 		//TCP call
-		TcpModel tcpModel;
-		tcpModel.type = TcpType::VOICE;
-		tcpModel.action = VoiceAction::CANCEL;
-		tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID,0);
-		tcpModel.to_id = 0;
-		std::string req = getTcpModelString(tcpModel);
-		LOGD("TCP CALL : %s",req.c_str());
-		TcpClient::instance()->sendMsg(req.c_str());
-
-//		std::string heartStr = "DOORLED,000F";
-//		const char* sendMsg = heartStr.c_str();
-//		sendProtocolTo(UART_TTYS2, (byte*)(sendMsg), strlen(sendMsg));
+		sendVoiceCancel(StoragePreferences::getInt(STORE_DEVICE_ID,0), 0);
 		lightControl("DOORLED", "000F");
 
 		setSleepTimerRegistered(_isSleepTimerRegistered);
@@ -528,11 +513,16 @@ static bool onButtonClick_ButtonHangup(ZKButton *pButton) {
 				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 {
+			}
+			else if (_isOutgoing == "handleHCall") {
+				LOGD("storeModel.from_id ============> %d", storeModel.from_id);
+				sendVoiceCancel(storeModel.to_id, 0);
+
+				setSleepTimerRegistered(_isSleepTimerRegistered);
+				EASYUICONTEXT->goBack();
+			}
+			else {
 				storeModel.data = storeModel.json["id"].asString();
 				sendVoiceTcp(VoiceAction::REJECT, storeModel, storeModel.from_id);
 			}
@@ -541,10 +531,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");
 		}
 

+ 1 - 1
jni/logic/customerAffairLogic.cc

@@ -229,7 +229,7 @@ static void obtainListItemData_AffairListView(ZKListView *pListView,ZKListView::
 
 	string doTime = customerAffairs[index]["affair_do_time"].asString();
 	if (doTime != "") {
-		std::string _doTime = TimeHelper::getTimeStrOnTimeDifference(time, 8, "%d-%02d-%02d %02d:%02d:%02d");
+		std::string _doTime = TimeHelper::getTimeStrOnTimeDifference(doTime, 8, "%d-%02d-%02d %02d:%02d:%02d");
 		handle->setText(_doTime);
 		handle->setTextColor(BlackColor);
 		handle->setButtonStatusPic(ZK_CONTROL_STATUS_NORMAL, "");

+ 40 - 2
jni/logic/deviceAddLogic.cc

@@ -414,7 +414,7 @@ static void onCheckedChanged_DeviceRadioGroup(ZKRadioGroup* pRadioGroup, int che
     	break;
     case ID_DEVICEADD_DeviceRadioButton2:
     	choiceDeviceInt = 1;
-    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg2") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg4")  + mac + ":h1";
+    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg2") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg6")  + mac + ":h1";
     	mDeviceMacTextViewPtr->setText(deviceMacMsg);
 
     	mBedTextViewPtr->setVisible(true);
@@ -433,7 +433,7 @@ static void onCheckedChanged_DeviceRadioGroup(ZKRadioGroup* pRadioGroup, int che
     	break;
     case ID_DEVICEADD_DeviceRadioButton3:
     	choiceDeviceInt = 2;
-    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg3") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg4") + mac + ":h2";
+    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg3") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg6") + mac + ":h2";
     	mDeviceMacTextViewPtr->setText(deviceMacMsg);
 
     	mBedTextViewPtr->setVisible(true);
@@ -450,6 +450,44 @@ static void onCheckedChanged_DeviceRadioGroup(ZKRadioGroup* pRadioGroup, int che
 
     	initHospital();
     	break;
+    case ID_DEVICEADD_DeviceRadioButton4:
+    	choiceDeviceInt = 3;
+    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg4") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg6") + mac + ":h3";
+    	mDeviceMacTextViewPtr->setText(deviceMacMsg);
+
+    	mBedTextViewPtr->setVisible(true);
+    	mChoiceBedButtonPtr->setVisible(true);
+
+    	addDevice["device_type"] = 4;
+    	addDevice["name"] = LANGUAGEMANAGER->getValue("BedDevice");
+    	addDevice["eth_mac"] = mac + ":h3";
+    	addDevice["code"] = "SW10600101C-CM";
+    	addDevice["model"] = "linux_handle";
+    	addDevice["soft_ver"] = "SV1.0";
+    	addDevice["hard_ver"] = "HV1.0";
+    	addDevice["status"] = 1;
+
+    	initHospital();
+    	break;
+    case ID_DEVICEADD_DeviceRadioButton5:
+    	choiceDeviceInt = 4;
+    	deviceMacMsg = LANGUAGEMANAGER->getValue("DeviceAddMsg5") + " \n" + LANGUAGEMANAGER->getValue("DeviceAddMsg6") + mac + ":h4";
+    	mDeviceMacTextViewPtr->setText(deviceMacMsg);
+
+    	mBedTextViewPtr->setVisible(true);
+    	mChoiceBedButtonPtr->setVisible(true);
+
+    	addDevice["device_type"] = 4;
+    	addDevice["name"] = LANGUAGEMANAGER->getValue("BedDevice");
+    	addDevice["eth_mac"] = mac + ":h4";
+    	addDevice["code"] = "SW10600101C-CM";
+    	addDevice["model"] = "linux_handle";
+    	addDevice["soft_ver"] = "SV1.0";
+    	addDevice["hard_ver"] = "HV1.0";
+    	addDevice["status"] = 1;
+
+    	initHospital();
+    	break;
     }
 }
 

+ 4 - 4
jni/logic/deviceInfoLogic.cc

@@ -251,7 +251,7 @@ static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  */
 static void onUI_init(){
     //Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
-	string qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0") + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
+	string qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
 	mQRCodePtr->loadQRCode(qrStr.c_str());
 
 	mDeviceIdPtr->setText(StoragePreferences::getInt(STORE_DEVICE_ID, 0));
@@ -414,15 +414,15 @@ static void onCheckedChanged_QrCodeRadioGroup1(ZKRadioGroup* pRadioGroup, int ch
     string qrStr = "";
     switch (checkedID) {
     case ID_DEVICEINFO_QrCodeRadioButton1:
-    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0") + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
+    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
     	mQRCodePtr->loadQRCode(qrStr.c_str());
     	break;
     case ID_DEVICEINFO_QrCodeRadioButton2:
-    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0") + ":h1&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
+    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h1&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
     	mQRCodePtr->loadQRCode(qrStr.c_str());
     	break;
     case ID_DEVICEINFO_QrCodeRadioButton3:
-    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0") + ":h2&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
+    	qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h2&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
     	mQRCodePtr->loadQRCode(qrStr.c_str());
     	break;
     }

+ 0 - 1
jni/logic/functionLogic.cc

@@ -765,7 +765,6 @@ static bool onButtonClick_ConfirmCallButton(ZKButton *pButton) {
 		else {
 			Intent* intent = new Intent();
 			intent->putExtra(isOutgoing, "true");
-			intent->putExtra(audioOnly, "true");
 			intent->putExtra(toIdStr, toId);
 			intent->putExtra(callName, chooseBed["frame_bed"]["full_name"].asString()  + " " +  chooseBed["customer_name"].asString());
 			EASYUICONTEXT->openActivity("callActivity", intent);

+ 63 - 2
jni/logic/mainLogic.cc

@@ -19,6 +19,7 @@
 #include "os/UpgradeMonitor.h"
 #include "core/update_assistant.h"
 #include "utils/TimeHelper.h"
+#include "utils/StringHelper.h"
 
 
 #define ETHERNETMANAGER		NETMANAGER->getEthernetManager()
@@ -71,7 +72,14 @@ static int emptyBedCount = 0;
 static int mainThemeInt = StoragePreferences::getInt(STORE_THEME, defaultThemeInt);
 static int mainModeInt = StoragePreferences::getInt(STORE_MODE, defaultModeInt);
 
-
+static string handle1Mac = StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h1";
+static string handle2Mac = StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h2";
+static string handle3Mac = StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h3";
+static string handle4Mac = StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h4";
+static int handle1Id = 0;
+static int handle2Id = 0;
+static int handle3Id = 0;
+static int handle4Id = 0;
 
 
 #define HELP_TIMER_HANDLE 3	// 增援的定时器id
@@ -108,6 +116,29 @@ void setMainMode() {
 	}
 }
 
+int getHandleId(int id) {
+	if (id == 1) {
+		return handle1Id;
+	}
+	else if (id == 2) {
+		return handle2Id;
+	}
+	else if (id == 3) {
+		return handle3Id;
+	}
+	else if (id == 4) {
+		return handle4Id;
+	}
+	return 0;
+}
+
+bool isHandleId(int id) {
+	if (id == handle1Id || id == handle2Id || id == handle3Id || id == handle4Id) {
+		return true;
+	}
+	return false;
+}
+
 static void getServerInfo(){
 
 	string url = getHttpGateway() + "/ncs_url/server_info";
@@ -168,6 +199,21 @@ static void getFrameRoom(int frame_id) {
 				if (customerId != "") {
 					inBedCount += 1;
 				}
+
+				string bedDeviceMac = frameBedList[i]["bed_device_mac"].asString();
+				StringHelper::toLowerCase(bedDeviceMac);
+				if (bedDeviceMac == handle1Mac) {
+					handle1Id = frameBedList[i]["bed_device_id"].asInt();
+				}
+				else if (bedDeviceMac == handle2Mac) {
+					handle2Id = frameBedList[i]["bed_device_id"].asInt();
+				}
+				else if (bedDeviceMac == handle3Mac) {
+					handle3Id = frameBedList[i]["bed_device_id"].asInt();
+				}
+				else if (bedDeviceMac == handle4Mac) {
+					handle4Id = frameBedList[i]["bed_device_id"].asInt();
+				}
 			}
 			emptyBedCount = frameBedList.size() - inBedCount;
 			getBedCount();
@@ -440,7 +486,7 @@ static void getDeviceInfo(){
 		setDirectorAndHeadNurse();
 		return;
 	}
-	string url = getHttpGateway() + "/deviceRoom/get_device_by_eth_mac/" + StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0");
+	string url = getHttpGateway() + "/deviceRoom/get_device_by_eth_mac/" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr()));
 	LOGD("请求设备信息. url = %s", url.c_str());
 	//发起HTTP GET请求
 	RestClient::Response r = RestClient::get(url);
@@ -627,6 +673,8 @@ static void obtainListItemData_BedListView(ZKListView *pListView,ZKListView::ZKL
 		ZKListView::ZKListSubItem* nurseTitle = pListItem->findSubItemByID(ID_MAIN_NurseTitleSubItem);
 		ZKListView::ZKListSubItem* doctor = pListItem->findSubItemByID(ID_MAIN_DoctorSubItem);
 		ZKListView::ZKListSubItem* nurse = pListItem->findSubItemByID(ID_MAIN_NurseSubItem);
+		ZKListView::ZKListSubItem* affair = pListItem->findSubItemByID(ID_MAIN_AffairSubItem);
+		ZKListView::ZKListSubItem* event = pListItem->findSubItemByID(ID_MAIN_EventSubItem);
 
 
 		if (mainModeInt == 2) {
@@ -713,6 +761,16 @@ static void obtainListItemData_BedListView(ZKListView *pListView,ZKListView::ZKL
 		doctor->setText(frameBedList[index]["doctor_name"].asString());
 		nurse->setText(frameBedList[index]["nurse_name"].asString());
 
+		if (frameBedList[index]["bed_device_id"].asString() != "") {
+			affair->setInvalid(false);
+			event->setInvalid(false);
+		}
+		else {
+			affair->setInvalid(true);
+			event->setInvalid(true);
+		}
+
+
 //		// 护理项相关
 //		Json::Value nurseConfigList = frameBedList[index]["nurse_config_dtos"];
 //		if (nurseConfigList.size() > 0) {
@@ -767,6 +825,9 @@ static void obtainListItemData_BedListView(ZKListView *pListView,ZKListView::ZKL
 
 static void onListItemClick_BedListView(ZKListView *pListView, int index, int id) {
     //LOGD(" onListItemClick_ BedListView  !!!\n");
+	if (frameBedList[index]["bed_device_id"].asString() == "") {
+		return;
+	}
 	if (id == ID_MAIN_EventSubItem) {
 		string _customerId = frameBedList[index]["customer_id"].asString();
 		string _deviceId = frameBedList[index]["bed_device_id"].asString();

+ 0 - 1
jni/logic/navibar.cc

@@ -373,7 +373,6 @@ static bool onButtonClick_CallNurseButton(ZKButton *pButton) {
 	} else {
 		Intent* intent = new Intent();
 		intent->putExtra(isOutgoing, "true");
-		intent->putExtra(audioOnly, "true");
 		EASYUICONTEXT->openActivity("callActivity", intent);
 	}
     return false;

+ 212 - 249
jni/logic/startLogic.cc

@@ -28,8 +28,16 @@ static string callTid = "";
 
 static bool isConnectHandle = false;
 static bool isConnectSos = false;
+static bool isConnectHandle1 = false;
+static bool isConnectHandle2 = false;
+static bool isConnectHandle3 = false;
+static bool isConnectHandle4 = false;
 static bool isTriggerHandle = false;
 static bool isTriggerSos = false;
+static bool isTriggerHandle1 = false;
+static bool isTriggerHandle2 = false;
+static bool isTriggerHandle3 = false;
+static bool isTriggerHandle4 = false;
 
 
 #define FUNCTION_TIMER_HANDLE 3	// 增援的定时器id
@@ -42,6 +50,10 @@ static bool isTriggerSos = false;
 
 #define HANDLE_TRIGGER_TIME_HANDLE 15
 #define SOS_TRIGGER_TIME_HANDLE 16
+#define HANDLE1_TRIGGER_TIME_HANDLE 17
+#define HANDLE2_TRIGGER_TIME_HANDLE 18
+#define HANDLE3_TRIGGER_TIME_HANDLE 19
+#define HANDLE4_TRIGGER_TIME_HANDLE 20
 
 #define HTTP_SERVER_PORT  80
 
@@ -111,6 +123,7 @@ namespace {
 			}
 		}
 		if (state == voip::STATE_CALL_DISCONNECTED) {
+			LOGD("通话挂断");
 			if (telephone->GetCallCount() > 1) {
 				LOGD("call count > 1, return");
 				return;
@@ -139,6 +152,12 @@ namespace {
 				}
 			}
 
+			const char* currentAppName = EASYUICONTEXT->currentAppName();
+			string _currentAppName = currentAppName;
+			if (_currentAppName == "callActivity") {
+				callActivityFinish(HANDOFF);
+				return;
+			}
 			//PrintCallLog();
 		}
 	}
@@ -359,7 +378,6 @@ void handleMsg(byte* inBytes){
 				//来电话了
 				Intent* intent = new Intent();
 				intent->putExtra(isOutgoing, "false");
-				intent->putExtra(audioOnly, "true");
 				EASYUICONTEXT->openActivity("callActivity", intent);
 			}
 		} else if (tcpModel.action == VoiceAction::HANDOFF){
@@ -422,10 +440,22 @@ void handleMsg(byte* inBytes){
 		else if (tcpModel.action == SideAction::ACCEPT) {
 			// 进行门灯还原
 			lightControl("DOORLED", "000F");
+
+			if (isHandleId(tcpModel.to_id) && CallingStatus::instance()->busy()) {
+				CallingStatus::instance()->setTcpModel(tcpModel);
+				std::string toSipId = tcpModel.json["toSipId"].asString();
+				callActivityFinish(CallFinishType::ACCEPT);
+				//接听
+				buildSIP(toSipId);
+			}
+
 		}
 		else if (tcpModel.action == SideAction::CANCEL) {
 			// 进行门灯还原
 			lightControl("DOORLED", "000F");
+			if (isHandleId(tcpModel.to_id) && CallingStatus::instance()->busy()) {
+				callActivityFinish(CallFinishType::CANCEL);
+			}
 
 		}
 		else if (tcpModel.action == SideAction::SOS_CALL) {
@@ -562,6 +592,53 @@ void setCallTid(std::string tid) {
 	callTid = tid;
 }
 
+
+void handleHCall(int id) {
+	int handleId = getHandleId(id);
+	if (handleId != 0) {
+		const char* currentAppName = EASYUICONTEXT->currentAppName();
+		string _currentAppName = currentAppName;
+		if (_currentAppName == "callActivity") {
+			LOGD("已经在呼叫界面");
+			return;
+		}
+
+		string handleIdStr = to_string(handleId);
+		Intent* intent = new Intent();
+		intent->putExtra(isOutgoing, "handleHCall");
+		intent->putExtra(handleCallId, handleIdStr);
+		EASYUICONTEXT->openActivity("callActivity", intent);
+	}
+	else {
+		string errorMsg = LANGUAGEMANAGER->getValue("HandleError") +
+				StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0") + ":h" + to_string(id) +
+				LANGUAGEMANAGER->getValue("NotAdd");
+	    Intent* intent = new Intent();
+		intent->putExtra(functionWindows, "warn");
+		intent->putExtra(warnText, errorMsg);
+		EASYUICONTEXT->openActivity("functionActivity", intent);
+	}
+}
+
+void sosCall(string sosMsg) {
+	if (sosTimerRegistered) {
+		LOGD("TCP -> SOS_CALL");
+		sendSosCall(sosMsg);
+
+
+		// SOS亮红灯
+		lightControl("ULED", "1F");
+		// 门灯亮红灯
+		lightControl("DOORLED", "200F");
+
+		lightControl("CALLLED", "100F");
+
+		sosTimerRegistered = false;
+		mActivityPtr->registerUserTimer(SOS_CLICK_TIME_HANDLE, 10000);		// 10秒后才能触发
+		mActivityPtr->registerUserTimer(SOS_LAMP_TIME_HANDLE, 120000);		// 2分钟后才能触发
+	}
+}
+
 //================================= IO 口操作
 //紧急按钮灯,明/灭
 void setSOS_A5(bool light){
@@ -603,7 +680,6 @@ public:
 			} else {
 				Intent* intent = new Intent();
 				intent->putExtra(isOutgoing, "true");
-				intent->putExtra(audioOnly, "true");
 				EASYUICONTEXT->openActivity("callActivity", intent);
 			}
 		}
@@ -790,7 +866,7 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 //	if (data.msg != ""){
 //		LOGD("msg = %s", data.msg.c_str());
 //	}
-	if(UartContext::Uart3IsOpen()) {	// 如果是true,表示串口打开了
+	if(UartContext::Uart2IsOpen()) {	// 如果是true,表示串口打开了
 		string heartStr;
 
 		// 面板拨号
@@ -817,7 +893,6 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 					} else {
 						Intent* intent = new Intent();
 						intent->putExtra(isOutgoing, "true");
-						intent->putExtra(audioOnly, "true");
 						EASYUICONTEXT->openActivity("callActivity", intent);
 					}
 				}
@@ -854,45 +929,19 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 					} else {
 						Intent* intent = new Intent();
 						intent->putExtra(isOutgoing, "true");
-						intent->putExtra(audioOnly, "true");
 						EASYUICONTEXT->openActivity("callActivity", intent);
 					}
 				}
 			}
 			else if (data.state == "3") {
+				LOGD("手柄在线");
 				isConnectHandle = true;
 			}
 			else if (data.state == "4") {
 				if (!isConnectHandle) {
 					return;
 				}
-				if (sosTimerRegistered) {
-					LOGD("TCP -> SOS_CALL");
-					Json::Value data;
-					data["title"] = "手柄断连";
-
-					TcpModel tcpModel;
-					tcpModel.tid = base::format("t%d", TimeHelper::getCurrentTime());
-					tcpModel.type = TcpType::SOS;
-					tcpModel.action = SosAction::CALL;
-					tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
-					tcpModel.json = data;
-					std::string req = getTcpModelString(tcpModel);
-					LOGD("TCP SOS_CALL : %s",req.c_str());
-					TcpClient::instance()->sendMsg(req.c_str());
-
-
-					// SOS亮红灯
-					lightControl("ULED", "1F");
-					// 门灯亮红灯
-					lightControl("DOORLED", "200F");
-
-					lightControl("CALLLED", "100F");
-
-					sosTimerRegistered = false;
-					mActivityPtr->registerUserTimer(SOS_CLICK_TIME_HANDLE, 10000);		// 10秒后才能触发
-					mActivityPtr->registerUserTimer(SOS_LAMP_TIME_HANDLE, 120000);		// 2分钟后才能触发
-				}
+				sosCall(LANGUAGEMANAGER->getValue("HandleDisconnected"));
 			}
 
 		}
@@ -915,15 +964,7 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 			}
 			else if (data.state == "1") {
 				if (isTriggerSos) {
-					LOGD("TCP -> SOS_CALL");
-					TcpModel tcpModel;
-					tcpModel.type = TcpType::SOS;
-					tcpModel.action = SosAction::CALL;
-					tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
-					tcpModel.tid = base::format("t%d",TimeHelper::getCurrentTime());
-					std::string req = getTcpModelString(tcpModel);
-					LOGD("TCP SOS_CALL : %s",req.c_str());
-					TcpClient::instance()->sendMsg(req.c_str());
+					sendSosCall("");
 
 					// SOS亮红灯
 					lightControl("ULED", "1F");
@@ -937,39 +978,15 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 				}
 			}
 			else if (data.state == "3") {
+				LOGD("SOS按钮在线");
 				isConnectSos = true;
 			}
 			else if (data.state == "4") {
 				if (!isConnectSos) {
 					return;
 				}
-				if (sosTimerRegistered) {
-					LOGD("TCP -> SOS_CALL");
-					Json::Value data;
-					data["title"] = "紧急按钮断连";
-
-					TcpModel tcpModel;
-					tcpModel.tid = base::format("t%d", TimeHelper::getCurrentTime());
-					tcpModel.type = TcpType::SOS;
-					tcpModel.action = SosAction::CALL;
-					tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
-					tcpModel.json = data;
-					std::string req = getTcpModelString(tcpModel);
-					LOGD("TCP SOS_CALL : %s",req.c_str());
-					TcpClient::instance()->sendMsg(req.c_str());
-
-
-					// SOS亮红灯
-					lightControl("ULED", "1F");
-					// 门灯亮红灯
-					lightControl("DOORLED", "200F");
 
-					lightControl("CALLLED", "100F");
-
-					sosTimerRegistered = false;
-					mActivityPtr->registerUserTimer(SOS_CLICK_TIME_HANDLE, 10000);		// 10秒后才能触发
-					mActivityPtr->registerUserTimer(SOS_LAMP_TIME_HANDLE, 120000);		// 2分钟后才能触发
-				}
+				sosCall(LANGUAGEMANAGER->getValue("SosDisconnected"));
 			}
 
 		}
@@ -1006,194 +1023,120 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 			}
 //			lightControl("DOORLED", "111F");
 		}
+		else if (data.cmd == "HANDKEY00") {
+			if (data.state == "0") {
+				if (isSleep) {
+					scrrenOn();
+				}
+
+				isTriggerHandle1 = true;
+				mActivityPtr->registerUserTimer(HANDLE1_TRIGGER_TIME_HANDLE, 5 * 1000);
+			}
+			else if (data.state == "1") {
+				if (isTriggerHandle1) {
+					isTriggerHandle1 = false;
+
+					handleHCall(1);
+				}
+			}
+			else if (data.state == "3") {
+				LOGD("手柄1在线");
+				isConnectHandle1 = true;
+			}
+			else if (data.state == "4") {
+				if (!isConnectHandle1) {
+					return;
+				}
+				sosCall(LANGUAGEMANAGER->getValue("Handle1Disconnected"));
+			}
+		}
+		else if (data.cmd == "HANDKEY10") {
+			if (data.state == "0") {
+				if (isSleep) {
+					scrrenOn();
+				}
+
+				isTriggerHandle2 = true;
+				mActivityPtr->registerUserTimer(HANDLE2_TRIGGER_TIME_HANDLE, 5 * 1000);
+			}
+			else if (data.state == "1") {
+				if (isTriggerHandle2) {
+					isTriggerHandle2 = false;
+
+					handleHCall(2);
+				}
+			}
+			else if (data.state == "3") {
+				LOGD("手柄2在线");
+				isConnectHandle2 = true;
+			}
+			else if (data.state == "4") {
+				if (!isConnectHandle2) {
+					return;
+				}
+				sosCall(LANGUAGEMANAGER->getValue("Handle2Disconnected"));
+			}
+		}
+		else if (data.cmd == "HANDKEY20") {
+			if (data.state == "0") {
+				if (isSleep) {
+					scrrenOn();
+				}
+
+				isTriggerHandle3 = true;
+				mActivityPtr->registerUserTimer(HANDLE3_TRIGGER_TIME_HANDLE, 5 * 1000);
+			}
+			else if (data.state == "1") {
+				if (isTriggerHandle3) {
+					isTriggerHandle3 = false;
+
+					handleHCall(3);
+				}
+			}
+			else if (data.state == "3") {
+				LOGD("手柄3在线");
+				isConnectHandle3 = true;
+			}
+			else if (data.state == "4") {
+				if (!isConnectHandle3) {
+					return;
+				}
+				sosCall(LANGUAGEMANAGER->getValue("Handle3Disconnected"));
+			}
+		}
+		else if (data.cmd == "HANDKEY30") {
+			if (data.state == "0") {
+				if (isSleep) {
+					scrrenOn();
+				}
+
+				isTriggerHandle4 = true;
+				mActivityPtr->registerUserTimer(HANDLE4_TRIGGER_TIME_HANDLE, 5 * 1000);
+			}
+			else if (data.state == "1") {
+				if (isTriggerHandle4) {
+					isTriggerHandle4 = false;
+
+					handleHCall(4);
+				}
+			}
+			else if (data.state == "3") {
+				LOGD("手柄4在线");
+				isConnectHandle4 = true;
+			}
+			else if (data.state == "4") {
+				if (!isConnectHandle4) {
+					return;
+				}
+				sosCall(LANGUAGEMANAGER->getValue("Handle4Disconnected"));
+			}
+		}
 		else {
 			if (isSleep) {
 				scrrenOn();
 			}
 			lightControl("DOORLED", "000F");
 		}
-
-
-//		//按下
-//		if (data.state=="0"){    // 0表示正被按下,1表示短按松开,2表示长按松开。
-//			if (data.cmd == "KEY5") {	// key5是面板拨号按钮
-//				if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "SIP") {
-//					setCheckbox("KEY5");
-//					return;
-//				}
-//
-//				if (!StoragePreferences::getInt(STORE_SCREEN_LIGHT, 0)) {
-//					if (isSleep) {
-//						scrrenOn();
-//					}
-//					else {
-//						voip::CallInfo info = GetTelephone()->GetCallInfo();
-//						//拨打 或 挂断
-//						if (CallingStatus::instance()->busy()){
-//							callActivityFinish(CallFinishType::A1CLICK);
-//						} else {
-//							Intent* intent = new Intent();
-//							intent->putExtra(isOutgoing, "true");
-//							intent->putExtra(audioOnly, "true");
-//							EASYUICONTEXT->openActivity("callActivity", intent);
-//						}
-//					}
-//				}
-//				else {
-//					scrrenOn();
-//					voip::CallInfo info = GetTelephone()->GetCallInfo();
-//					//拨打 或 挂断
-//					if (CallingStatus::instance()->busy()){
-//						callActivityFinish(CallFinishType::A1CLICK);
-//					} else {
-//						Intent* intent = new Intent();
-//						intent->putExtra(isOutgoing, "true");
-//						intent->putExtra(audioOnly, "true");
-//						EASYUICONTEXT->openActivity("callActivity", intent);
-//					}
-//				}
-//			}
-//
-//			else if (data.cmd == "KEY6"){	// key6是手柄触发,手柄只有呼叫和挂断功能,没有取消功能,防止用户不停地按
-//
-//				if (!StoragePreferences::getInt(STORE_SCREEN_LIGHT, 0)) {
-//					if (isSleep) {
-//						scrrenOn();
-//					}
-//					else {
-//						voip::CallInfo info = GetTelephone()->GetCallInfo();
-//						//拨打 或 挂断
-//						if (CallingStatus::instance()->busy()){
-//							callActivityFinish(CallFinishType::KEY6_CLICK);
-//						} else {
-//							Intent* intent = new Intent();
-//							intent->putExtra(isOutgoing, "true");
-//							intent->putExtra(audioOnly, "true");
-//							EASYUICONTEXT->openActivity("callActivity", intent);
-//						}
-//					}
-//				}
-//				else {
-//					scrrenOn();
-//					voip::CallInfo info = GetTelephone()->GetCallInfo();
-//					//拨打 或 挂断
-//					if (CallingStatus::instance()->busy()){
-//						callActivityFinish(CallFinishType::KEY6_CLICK);
-//					} else {
-//						Intent* intent = new Intent();
-//						intent->putExtra(isOutgoing, "true");
-//						intent->putExtra(audioOnly, "true");
-//						EASYUICONTEXT->openActivity("callActivity", intent);
-//					}
-//				}
-//
-//			}
-//			else if (data.cmd == "KEY7"){	// key7是紧急按钮
-//				if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "SIP") {
-//					setCheckbox("KEY7");
-//					return;
-//				}
-//				if (isSleep) {
-//					scrrenOn();
-//				}
-//				if (sosTimerRegistered) {
-//					LOGD("TCP -> SOS_CALL");
-//					TcpModel tcpModel;
-//					tcpModel.type = TcpType::SOS;
-//					tcpModel.action = SosAction::CALL;
-//					tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
-//					tcpModel.tid = base::format("t%d",TimeHelper::getCurrentTime());
-//					std::string req = getTcpModelString(tcpModel);
-//					LOGD("TCP SOS_CALL : %s",req.c_str());
-//					TcpClient::instance()->sendMsg(req.c_str());
-//
-//					// SOS亮红灯
-//					lightControl("ULED", "1F");
-//					// 门灯亮红灯
-//					lightControl("DOORLED", "200F");
-//
-//					lightControl("CALLLED", "100F");
-//
-//					mActivityPtr->registerUserTimer(SOS_CLICK_TIME_HANDLE, 10000);		// 10秒后才能触发
-//					mActivityPtr->registerUserTimer(SOS_LAMP_TIME_HANDLE, 120000);		// 2分钟后才能触发
-//				}
-//			}
-//			else if (data.cmd == "KEY<") {	//下左3,红
-//				if (StoragePreferences::getString(STORE_SIGNAL_TYPE, SIGNAL_TYPE) == "SIP") {
-//					setCheckbox("KEY<");
-//					return;
-//				}
-//
-//				if (!StoragePreferences::getInt(STORE_SCREEN_LIGHT, 0)) {
-//					if (isSleep) {
-//						scrrenOn();
-//					}
-//					else {
-//						voip::CallInfo info = GetTelephone()->GetCallInfo();
-//						//拨打 或 挂断
-//						if (CallingStatus::instance()->busy()){
-//							callActivityFinish(CallFinishType::A1CLICK);
-//						} else {
-//							Intent* intent = new Intent();
-//							intent->putExtra(isOutgoing, "true");
-//							intent->putExtra(audioOnly, "true");
-//							EASYUICONTEXT->openActivity("callActivity", intent);
-//						}
-//					}
-//				}
-//				else {
-//					scrrenOn();
-//					voip::CallInfo info = GetTelephone()->GetCallInfo();
-//					//拨打 或 挂断
-//					if (CallingStatus::instance()->busy()){
-//						callActivityFinish(CallFinishType::A1CLICK);
-//					} else {
-//						Intent* intent = new Intent();
-//						intent->putExtra(isOutgoing, "true");
-//						intent->putExtra(audioOnly, "true");
-//						EASYUICONTEXT->openActivity("callActivity", intent);
-//					}
-//				}
-//			}
-//			else if (data.cmd == "KEY>") {	// key>是面板挂断按钮
-//				if (!StoragePreferences::getInt(STORE_SCREEN_LIGHT, 0)) {
-//					if (isSleep) {
-//						scrrenOn();
-//					}
-//					else {
-//						voip::CallInfo info = GetTelephone()->GetCallInfo();
-//						//拨打 或 挂断
-//						if (CallingStatus::instance()->busy()){
-//							callActivityFinish(CallFinishType::A1CLICK);
-//
-//							lightControl("DOORLED", "000F");
-//						}
-//					}
-//				}
-//				else {
-//					scrrenOn();
-//					voip::CallInfo info = GetTelephone()->GetCallInfo();
-//					//拨打 或 挂断
-//					if (CallingStatus::instance()->busy()){
-//						callActivityFinish(CallFinishType::A1CLICK);
-//
-//						lightControl("DOORLED", "000F");
-//					}
-//				}
-//			}
-//			else if (data.cmd == "KEY;"){	//下左4,白
-//				if (isSleep) {
-//					scrrenOn();
-//				}
-//				lightControl("DOORLED", "111F");
-//			}
-//			else {
-//				if (isSleep) {
-//					scrrenOn();
-//				}
-////				lightControl("DOORLED", "000F");
-//			}
-//		}
 	}
 }
 
@@ -1278,6 +1221,26 @@ static bool onUI_Timer(int id){
     	return false;
     }
     	break;
+    case HANDLE1_TRIGGER_TIME_HANDLE: {
+    	isTriggerHandle1 = false;
+    	return false;
+    }
+    	break;
+    case HANDLE2_TRIGGER_TIME_HANDLE: {
+    	isTriggerHandle2 = false;
+    	return false;
+    }
+    	break;
+    case HANDLE3_TRIGGER_TIME_HANDLE: {
+    	isTriggerHandle3 = false;
+    	return false;
+    }
+    	break;
+    case HANDLE4_TRIGGER_TIME_HANDLE: {
+    	isTriggerHandle4 = false;
+    	return false;
+    }
+    	break;
 	default:
 		break;
 	}

+ 3 - 0
jni/net/tcp_model.h

@@ -44,6 +44,9 @@ public:
 	inline static std::string TRANSFER = "TRANSFER";
 	inline static std::string HANDOFF = "HANDOFF";
 	inline static std::string CANCEL = "CANCEL";
+	inline static std::string HCALL = "HCALL";
+	inline static std::string HRESPONSE = "HRESPONSE";
+	inline static std::string HRESPONSED = "HRESPONSED";
 	inline static std::string SUCCESS = "SUCCESS";
 	inline static std::string FAILED = "FAILED";
 	inline static std::string CANCEL_BY_DOOR = "CANCEL_BY_DOOR";

+ 74 - 0
jni/net/tcp_util.cpp

@@ -164,3 +164,77 @@ void sendBlueCodeResponse(std::string tid, std::string blueCodeId) {
 	sendTcpModel(tcpModel);
 }
 
+
+std::string sendVoiceCall(int toId) {
+	TcpModel tcpModel;
+	tcpModel.tid = base::format("t%d", TimeHelper::getCurrentTime());
+	tcpModel.type = TcpType::VOICE;
+	tcpModel.action = VoiceAction::CALL;
+	tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID,0);
+	tcpModel.to_id = toId;
+
+	sendTcpModel(tcpModel);
+	return tcpModel.tid;
+}
+
+
+void sendVoiceTcp(std::string action, TcpModel model, int toId){
+	//发出TCP
+	TcpModel tcpModel;
+	tcpModel.tid = model.tid;
+	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){
+		tcpModel.json = model.json;
+	}
+
+	sendTcpModel(tcpModel);
+}
+
+
+void sendVoiceCancel(int fromId, int toId) {
+	TcpModel tcpModel;
+	tcpModel.type = TcpType::VOICE;
+	tcpModel.action = VoiceAction::CANCEL;
+	tcpModel.from_id = fromId;
+	tcpModel.to_id = toId;
+	sendTcpModel(tcpModel);
+}
+
+std::string sendVoiceHCall(int id) {
+	Json::Value json;
+	json["roleType"] = "NURSE";
+
+	TcpModel tcpModel;
+	tcpModel.tid = base::format("t%d",TimeHelper::getCurrentTime());
+	tcpModel.type = TcpType::VOICE;
+	tcpModel.action = VoiceAction::HCALL;
+	tcpModel.from_id = id;
+	tcpModel.json = json;
+
+	sendTcpModel(tcpModel);
+	return tcpModel.tid;
+}
+
+
+void sendSosCall(std::string sosMsg) {
+	TcpModel tcpModel;
+	tcpModel.tid = base::format("t%d", TimeHelper::getCurrentTime());
+	tcpModel.type = TcpType::SOS;
+	tcpModel.action = SosAction::CALL;
+	tcpModel.from_id = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
+	if (sosMsg != "") {
+		Json::Value data;
+		data["title"] = sosMsg;
+		tcpModel.json = data;
+	}
+
+	sendTcpModel(tcpModel);
+
+}
+

+ 5 - 0
jni/net/tcp_util.h

@@ -19,6 +19,11 @@ void sendReinforceCall();
 void sendCallByDoor();
 void sendBlueCodeCall();
 void sendBlueCodeResponse(std::string tid, std::string blueCodeId);
+std::string sendVoiceCall(int toId);
+void sendVoiceTcp(std::string action, TcpModel model, int toId);
+void sendVoiceCancel(int fromId, int toId);
+std::string sendVoiceHCall(int id);
+void sendSosCall(std::string sosMsg);
 
 
 

+ 0 - 36
jni/service/BusinessConfig.cpp

@@ -54,42 +54,6 @@ bool CallingStatus::busy() {
 	return instance()->_busy;
 }
 
-void sendVoiceTcp(std::string action, TcpModel model, int toId){
-	//发出TCP
-	TcpModel tcpModel;
-	tcpModel.tid = model.tid;
-	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){
-		tcpModel.json = model.json;
-	}
-
-	std::string req = getTcpModelString(tcpModel);
-	LOGD("sendVoiceTcp : %s",req.c_str());
-//	TcpClient::instance()->sendMsg(req.c_str());
-
-	//回调注册
-	TcpCallback callback;
-	callback.tid = tcpModel.tid;
-	callback.jsonStr = req;
-	callback.onSuccess = [](Json::Value json){
-		LOGD("voice callback success");
-		return 0;
-	};
-	callback.onFalied = [](Json::Value json){
-		LOGD("voice callback failed");
-		return 0;
-	};
-	TcpClient::instance()->sendMsgWithCb(req.c_str(), callback);
-}
-
-
-
 TcpCacheManager::TcpCacheManager() {
 }
 

+ 4 - 0
jni/service/BusinessConfig.h

@@ -218,6 +218,9 @@ void setBedFrameTree(int index);
 
 bool getClerkByPartIdAndPassNo(std::string passNo);
 
+int getHandleId(int id);
+bool isHandleId(int id);
+
 enum CallFinishType {
 	CANCEL,
 	REJECT,
@@ -339,6 +342,7 @@ static bool checkIsDay(){
 
 static std::string isOutgoing = "isOutgoing";
 static std::string audioOnly = "audioOnly";
+static std::string handleCallId = "handleCallId";
 static std::string toIdStr = "toIdStr";
 static std::string callName = "callName";
 static std::string functionWindows = "functionWindows";

+ 115 - 36
jni/uart/UartContext.cpp

@@ -12,6 +12,7 @@
 
 #include "uart/UartContext.h"
 #include "utils/Log.h"
+#include "utils/ByteUtil.h"
 #include "base/strings.hpp"
 #include "service/BusinessConfig.h"
 
@@ -63,6 +64,7 @@ UartContext::~UartContext() {
 }
 
 static bool mUart1IsOpen = false;
+static bool mUart2IsOpen = false;
 static bool mUart3IsOpen = false;
 
 // 打开串口,pFileName为串口号,baudRate为波特率
@@ -76,6 +78,9 @@ bool UartContext::openUart(const char *pFileName, UINT baudRate) {
 			mUart1IsOpen = false;
 		}
 		if(mUartNumber == 2) {
+			mUart2IsOpen = false;
+		}
+		if(mUartNumber == 3) {
 			mUart3IsOpen = false;
 		}
 		LOGD("uart%d open error", mUartNumber);
@@ -105,6 +110,9 @@ bool UartContext::openUart(const char *pFileName, UINT baudRate) {
 		if(mUartNumber == 1) {
 			mUart1IsOpen = true;
 		}
+		if(mUartNumber == 2) {
+			mUart2IsOpen = true;
+		}
 		if(mUartNumber == 3) {
 			mUart3IsOpen = true;
 		}
@@ -170,6 +178,69 @@ bool UartContext::readyToRun() {
 	return (mDataBufPtr != NULL);
 }
 
+
+void handleMsg(int ret, unsigned char* buffer) {
+	std::string revStr = "";
+	//依次将读取到的数据输出到日志
+	for (int i = 1; i < ret - 2; ++i) {
+		revStr += buffer[i];
+	}
+	buildProtocolData(revStr);
+}
+
+void handleMsg2(int ret, unsigned char* buffer) {
+	std::string revStr = "";
+	//std::string logInfo = " <<< ";
+	//依次将读取到的数据输出到日志
+	for (int i = 1; i < ret - 1; ++i) {
+		revStr += buffer[i];
+	}
+
+	std::vector<std::string> tokens;
+	std::string token;
+	std::istringstream stream(revStr);
+
+	while (std::getline(stream, token, '#')) {
+		if (!token.empty()) {  // 确保 token 不为空
+			size_t pos = token.find('$');
+			if (pos != std::string::npos) {
+				token = token.substr(pos + 1);
+			}
+			tokens.push_back(token);
+		}
+	}
+
+	if (!tokens.empty()) {
+		for (std::string t : tokens) {
+			buildProtocolData(t);
+		}
+	}
+	else {
+		buildProtocolData(revStr);
+	}
+}
+
+void nfcMsg(int ret, unsigned char* buffer) {
+	if (buffer[0] == 0xfe && buffer[2] == 0x03) {
+		if (buffer[1] == 0x08) {
+			std::string revStr = "";
+			for (int i = 0; i < ret; ++i) {
+				if (i==0 || i==1 || i==2 || i==3 || i==4 || i==ret-1){
+					continue;
+				}
+				char buf[1024];
+				sprintf(buf, "%02x", buffer[i]);
+				revStr += buf;
+			}
+			LOGD("nfc卡号 == %s", revStr.c_str());
+//          nfcLogin(revStr);
+			navibarNfcLogin(revStr);
+		}
+	}
+}
+
+unsigned char handle2Buffer[1024] = {0};
+size_t offset = 0;
 bool UartContext::threadLoop() {
 	if (mIsOpen) {
 #if 0
@@ -195,45 +266,52 @@ bool UartContext::threadLoop() {
 		int ret = read(mUartID, buffer, sizeof(buffer));
 		if (ret > 0) {
 			LOGD("收到串口消息");
-
-			if (buffer[0]==CMD_HEAD && buffer[ret-2] == CMD_END1 && buffer[ret-1] == CMD_END2){
-				std::string revStr = "";
-				//std::string logInfo = " <<< ";
-				//依次将读取到的数据输出到日志
-				for (int i = 0; i < ret; ++i) {
-					if (i==0 || i==ret-1 || i==ret-2){
-						continue;
+//            std::string revStr = "";
+//            std::string revStr2 = "";
+//            for (int i = 0; i < ret; ++i) {
+//            	revStr += buffer[i];
+//
+//                char buf[1024];
+//                sprintf(buf, "%02x", buffer[i]);
+//                revStr2 += buf;
+//            }
+//            LOGD("revStr == %s", revStr.c_str());
+//            LOGD("revStr2 == %s", revStr2.c_str());
+
+			if (mUartNumber == 2) {
+				if (buffer[0]==CMD_HEAD && buffer[ret-2] == CMD_END1 && buffer[ret-1] == CMD_END2){
+					handleMsg(ret, buffer);
+				}
+			}
+			else if (mUartNumber == 1) {
+//				LOGD("offset ================%d", offset);
+				ByteUtil::copyUnsignedCharArray(buffer, handle2Buffer, ret, offset);
+//				LOGD("offset2 ================%d", offset);
+//
+//				int size2Int = sizeof(handle2Buffer) / sizeof(unsigned char);
+//				std::string revStr = "";
+//				for (int i = 0; i < size2Int; ++i) {
+//					revStr += handle2Buffer[i];
+//				}
+
+				if (handle2Buffer[0]==CMD_HEAD && handle2Buffer[offset-1] == CMD_END1) {
+					handleMsg2(offset, handle2Buffer);
+
+					offset = 0;
+					std::fill(std::begin(handle2Buffer), std::end(handle2Buffer), 0);
+				}
+				else {
+					if (handle2Buffer[0] != CMD_HEAD || offset > 52) {
+						offset = 0;
+						std::fill(std::begin(handle2Buffer), std::end(handle2Buffer), 0);
+						LOGD("handle2Buffer 初始化");
 					}
-					//LOGD(" <<< %02x", buffer[i]);
-					revStr += buffer[i];
-					//logInfo += base::format("%02x",buffer[i]);
 				}
-				//LOGD(" %s",logInfo.c_str());
-				buildProtocolData(revStr);
+
+			}
+			else if (mUartNumber == 3) {
+				nfcMsg(ret, buffer);
 			}
-            else if (buffer[0] == 0xfe && buffer[2] == 0x03) {
-                if (buffer[1] == 0x08) {
-                    std::string revStr = "";
-                    for (int i = 0; i < ret; ++i) {
-                        if (i==0 || i==1 || i==2 || i==3 || i==4 || i==ret-1){
-                            continue;
-                        }
-                        char buf[1024];
-                        sprintf(buf, "%02x", buffer[i]);
-                        revStr += buf;
-                    }
-                    LOGD("revStr == %s", revStr.c_str());
-//                    nfcLogin(revStr);
-                    navibarNfcLogin(revStr);
-                }
-            }
-            else {
-                std::string revStr = "";
-                for (int i = 0; i < ret; ++i) {
-                	revStr += buffer[i];
-                }
-                LOGD("revStr == %s", revStr.c_str());
-            }
 		} else {
 		  //没收到数据时,休眠50ms,防止过度消耗cpu
 		  usleep(1000 * 50);
@@ -302,4 +380,5 @@ bool UartContext::sendTo(int uart, const BYTE* pData, UINT len) {
 }
 
 bool UartContext::Uart1IsOpen() {return mUart1IsOpen;}
+bool UartContext::Uart2IsOpen() {return mUart2IsOpen;}
 bool UartContext::Uart3IsOpen() {return mUart3IsOpen;}

+ 1 - 0
jni/uart/UartContext.h

@@ -28,6 +28,7 @@ public:
 	static bool sendTo(int uart, const BYTE *pData, UINT len);
 
 	static bool Uart1IsOpen();
+	static bool Uart2IsOpen();
 	static bool Uart3IsOpen();
 
 	//static UartContext* getInstance();

BIN=BIN
libs/armeabi/libzkgui.so


BIN=BIN
obj/activity/callActivity.o


BIN=BIN
obj/activity/customerAffairActivity.o


BIN=BIN
obj/activity/deviceAddActivity.o


BIN=BIN
obj/activity/deviceInfoActivity.o


BIN=BIN
obj/activity/functionActivity.o


BIN=BIN
obj/activity/interactionActivity.o


BIN=BIN
obj/activity/mainActivity.o


BIN=BIN
obj/activity/medicalCareActivity.o


BIN=BIN
obj/activity/moreActivity.o


BIN=BIN
obj/activity/navibar.o


BIN=BIN
obj/activity/promptActivity.o


BIN=BIN
obj/activity/settingActivity.o


BIN=BIN
obj/activity/sipTestActivity.o


BIN=BIN
obj/activity/startActivity.o


BIN=BIN
obj/activity/statusbar.o


BIN=BIN
obj/activity/updateActivity.o


BIN=BIN
obj/core/update_assistant.o


BIN=BIN
obj/net/tcp_client.o


BIN=BIN
obj/net/tcp_model.o


BIN=BIN
obj/net/tcp_util.o


BIN=BIN
obj/server/http_server.o


BIN=BIN
obj/service/BusinessConfig.o


BIN=BIN
obj/service/time.o


BIN=BIN
obj/uart/UartContext.o


BIN=BIN
resources/main/affair_grey.png


BIN=BIN
resources/main/event_grey.png


BIN=BIN
ui/deviceAdd.ftu


BIN=BIN
ui/deviceInfo.ftu


BIN=BIN
ui/main.ftu


BIN=BIN
ui/setting.ftu