diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart index 25158c67..e2b13e7b 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart @@ -49,14 +49,21 @@ class _CatEyeCustomModePageState extends State { SizedBox( height: 30.h, ), - _buildSubTitleItem( - '人体侦测距离', '有人出现在门前1.5米范围时启动录像', state.detectionRange.value, () { - _openBottomItemSheet(state.detectionRangeList.value, 1); - }), - Expanded( - child: SizedBox( + Obx(() => _buildSubTitleItem( + '人体侦测距离', '有人出现在门前1.5米范围时启动录像', state.detectionRange.value, + () { + _openBottomItemSheet(state.detectionRangeList.value, 1); + })), + SizedBox( height: 30.h, - )), + ), + CommonItem( + leftTitel: '实时画面', + rightTitle: "全天", + isHaveLine: false, + isHaveDirection: true, + isHaveRightWidget: false, + ) ], )); } @@ -135,6 +142,10 @@ class _CatEyeCustomModePageState extends State { if (clickIndex == 0) { //感应距离 state.showsUpVideo.value = state.showsUpVideoList.value[value]; + } else if (clickIndex == 1) { + //录像时长 + state.detectionRange.value = + state.detectionRangeList.value[value]; } setState(() {}); diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/videoSlot/videoSlot_page.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/videoSlot/videoSlot_page.dart index 4419dfba..8665dc34 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/videoSlot/videoSlot_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/videoSlot/videoSlot_page.dart @@ -37,7 +37,7 @@ class _VideoSlotPageState extends State { SizedBox( height: 30.h, ), - _buildTipsView('自定义时间', '', 1, boolList[1]), + _buildCustomTimeView('自定义时间', '', 1), ], )); } @@ -49,9 +49,7 @@ class _VideoSlotPageState extends State { width: ScreenUtil().screenWidth - 40.w, margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), decoration: BoxDecoration( - color: isClick - ? AppColors.blueViewBgColor - : AppColors.greyBackgroundColor, + color: AppColors.greyBackgroundColor, borderRadius: BorderRadius.circular(10.0), ), child: Padding( @@ -59,19 +57,13 @@ class _VideoSlotPageState extends State { left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), child: Row( children: [ - isClick - ? Image.asset( - 'images/mine/icon_mine_blueSelect.png', - width: 20.w, - height: 14.w, - ) - : SizedBox( - width: 20.w, - height: 14.w, - ), + SizedBox( + width: 20.w, + height: 14.w, + ), SizedBox(width: 10.w), Expanded( - child: _buildRichText(titleStr, subTitle, isClick), + child: _buildRichText(titleStr, subTitle, false), ), SizedBox( width: 10.w, @@ -93,6 +85,91 @@ class _VideoSlotPageState extends State { ); } +//自定义时间 + Widget _buildCustomTimeView(String leftStr, String rightStr, int isEndTIme) { + return GestureDetector( + child: Container( + width: ScreenUtil().screenWidth - 40.w, + margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), + decoration: BoxDecoration( + color: AppColors.blueViewBgColor, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: EdgeInsets.only( + left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), + child: Column( + children: [ + Row( + children: [ + Image.asset( + 'images/mine/icon_mine_blueSelect.png', + width: 20.w, + height: 14.w, + ), + SizedBox(width: 10.w), + Expanded( + child: _buildRichText('自定义时间', '', true), + ), + SizedBox( + width: 10.w, + ), + ], + ), + Container( + height: 1, + margin: EdgeInsets.only( + left: 20.w, right: 20.w, top: 20.h, bottom: 20.h), + color: AppColors.blueTextTipsColor, + ), + startAndEndTimeRow(false), + SizedBox( + height: 30.h, + ), + startAndEndTimeRow(true), + ], + )), + ), + onTap: () {}, + ); + } + + // + Widget startAndEndTimeRow(bool isEndTime) { + return GestureDetector( + child: Row( + children: [ + SizedBox( + width: 20.w, + ), + Text( + isEndTime == false ? '开始时间' : '结束时间', + style: + TextStyle(color: AppColors.blueTextTipsColor, fontSize: 22.sp), + ), + Expanded( + child: SizedBox( + width: 20.w, + )), + Text( + isEndTime == false ? '当日22:00' : '次日08:00', + style: + TextStyle(color: AppColors.blueTextTipsColor, fontSize: 22.sp), + ), + SizedBox( + width: 10.w, + ), + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ) + ], + ), + onTap: () {}, + ); + } + Widget _buildRichText(String titleStr, String subTitle, bool isClick) { //高亮样式 final TextStyle titleStyle = TextStyle( diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart index 681f3191..cb6c69c4 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -279,8 +279,8 @@ class LockMonitoringLogic extends BaseGetXController { topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF); topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8); - print( - "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}"); + // print( + // "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}"); topBytes.addAll(bytes); Get.log("setVoiceBytes:$topBytes"); diff --git a/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart b/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart index 5fc67fce..fe0931b0 100644 --- a/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart +++ b/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart @@ -41,51 +41,11 @@ class RealTimePictureLogic extends BaseGetXController { StreamSubscription? _getUDPStatusRefreshUIEvent; void _getUDPStatusRefreshUIAction() { _getUDPStatusRefreshUIEvent = - eventBus.on().listen((event) { + eventBus.on().listen((event) { state.udpStatus.value = event.udpStatus; - if (state.udpStatus.value == 8) { - // 接听成功了,然后刷新界面的时间 60秒以后自动挂断 - state.oneMinuteTimeTimer = - Timer.periodic(const Duration(seconds: 1), (Timer t) async { - state.oneMinuteTime.value++; - // Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}'); - if (state.oneMinuteTime.value >= 60) { - // 超过60秒了 - state.oneMinuteTimeTimer.cancel(); - state.oneMinuteTime.value = 0; - // 挂断 - UDPSenderManage.sendMainProtocol( - command: 150, - commandTypeIsCalling: 1, - subCommand: 30, - lockID: state.getLockName.value, - lockIP: UDPManage().host, - userMobile: await state.userMobile, - userMobileIP: await state.userMobileIP, - endData: []); - CallTalk().stopPcmSound(); - - // 关闭当前界面 - Get.back(); - } - }); - } }); } - //查询监视状态 - udpQueryMonitoringStatusAction() async { - UDPSenderManage.sendMainProtocol( - command: 152, - commandTypeIsCalling: 1, - subCommand: 20, - lockID: state.getLockName.value, - lockIP: UDPManage().host, - userMobile: await state.userMobile, - userMobileIP: await state.userMobileIP, - endData: []); - } - /// 监视 udpMonitorAction() async { UDPSenderManage.sendMainProtocol( @@ -100,19 +60,6 @@ class RealTimePictureLogic extends BaseGetXController { // print('得到lockName------${state.getLockName.value}'); } - /// 接听 - udpAnswerAction() async { - UDPSenderManage.sendMainProtocol( - command: 150, - commandTypeIsCalling: 1, - subCommand: 6, - lockID: UDPManage().lockId, - lockIP: UDPManage().host, - userMobile: await state.userMobile, - userMobileIP: await state.userMobileIP, - endData: []); - } - /// 挂断 udpHangUpAction() async { UDPSenderManage.sendMainProtocol( @@ -232,67 +179,11 @@ class RealTimePictureLogic extends BaseGetXController { String? lockIP = args["lockIP"]; String? userMobile = args["userMobile"]; String? userMobileIP = args["userMobileIP"]; - - // int length = 320; // 每个子List的长度 - // List list = state.listAudioData.value.sublist(0, 320); - // for (int i = 0; i < bytes.length; i += length) { - // int end = (i + length < bytes.length) ? i + length : bytes.length; - // bytes.sublist(i, end); - // // _sendRecordData(bytes.sublist(i, end)); - // // // 刚进来是接听状态,然后改为长按对讲 - // } - - // while(list.isNotEmpty) { state.udpSendDataFrameNumber++; if (state.udpSendDataFrameNumber >= 65536) state.udpSendDataFrameNumber = 1; // 57 List topBytes = []; - // var cID = "XXXCID"; - // List cIDData = utf8.encode(cID!); - // topBytes.addAll(cIDData); - // // topBytes = getFixedLengthList(cIDData, 20 - cIDData.length); - // for (int i = 0; i < 6 - cIDData.length; i++) { - // topBytes.add(0); - // } - // - // // 命令 - // topBytes.add(150); - // - // // 命令类型 - // topBytes.add(1); - // - // // 子命令 - // topBytes.add(8); - // - // // lockID - // List lockIDData = utf8.encode(lockID!); - // topBytes.addAll(lockIDData); - // // topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length); - // for (int i = 0; i < 20 - lockIDData.length; i++) { - // topBytes.add(0); - // } - // - // // lockIP - // var lockIPList = lockIP!.split("."); - // lockIPList.forEach((element) { - // topBytes.add(int.parse(element)); - // }); - // - // // userMobile - // List userMobileData = utf8.encode(userMobile!); - // topBytes.addAll(userMobileData); - // // topBytes = getFixedLengthList(topBytes, 20 - userMobileData.length); - // for (int i = 0; i < 20 - userMobileData.length; i++) { - // topBytes.add(0); - // } - // - // // userMobileIP - // var userMobileIPList = userMobileIP!.split("."); - // userMobileIPList.forEach((element) { - // topBytes.add(int.parse(element)); - // }); - topBytes.addAll([ 1, 1, 1, 1, // 时间戳 1, 0, // 音频 @@ -307,13 +198,13 @@ class RealTimePictureLogic extends BaseGetXController { topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF); topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8); - print( - "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}"); + // print( + // "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}"); topBytes.addAll(bytes); Get.log("setVoiceBytes:$topBytes"); UDPSenderManage.sendMainProtocol( - command: 150, + command: 152, commandTypeIsCalling: 1, subCommand: 8, lockID: lockID, @@ -427,6 +318,7 @@ class RealTimePictureLogic extends BaseGetXController { void onClose() { // TODO: implement onClose print("锁详情界面销毁了"); + CallTalk().stopPcmSound(); _getTVDataRefreshUIEvent!.cancel(); _getUDPStatusRefreshUIEvent!.cancel(); if (state.oneMinuteTimeTimer != null) { @@ -434,8 +326,5 @@ class RealTimePictureLogic extends BaseGetXController { } stopProcessing(); state.listData.value = Uint8List(0); - if (state.realTimePicTimer != null) { - state.realTimePicTimer.cancel(); - } } } diff --git a/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart b/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart index eed5ab49..68c67210 100644 --- a/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart +++ b/star_lock/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/talk/call/callTalk.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/showTFView.dart'; @@ -32,8 +33,11 @@ class _RealTimePicturePageState extends State Get.back(); }); - state.animationController = - AnimationController(duration: const Duration(seconds: 1), vsync: this); + state.animationController = AnimationController( + vsync: this, // 确保使用的TickerProvider是当前Widget + duration: const Duration(seconds: 1), + ); + ; state.animationController.repeat(); //动画开始、结束、向前移动或向后移动时会调用StatusListener state.animationController.addStatusListener((status) { @@ -200,8 +204,12 @@ class _RealTimePicturePageState extends State // 接听 Obx(() => bottomBtnItemWidget( getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async { - Toast.show(msg: "监视中无音频"); + //监视状态下不能发送录音 + Toast.show(msg: '监视状态下不能发送录音'); + }, longPress: () async { /* + // 开始长按 + print("onLongPress"); //获取麦克风权限 await logic.getPermissionStatus().then((value) async { if (!value) { @@ -209,15 +217,8 @@ class _RealTimePicturePageState extends State } // state.isSenderAudioData.value = false; - print("发送接听了"); - // 刚进来是接听状态,然后改为长按对讲 - logic.udpAnswerAction(); }); - */ - }, longPress: () { - /* - // 开始长按 - print("onLongPress"); + state.listAudioData.value = []; if (state.udpStatus.value == 8) { state.udpStatus.value = 9; @@ -238,6 +239,7 @@ class _RealTimePicturePageState extends State "images/main/icon_lockDetail_hangUp.png", "挂断", Colors.red, () async { // 挂断 logic.udpHangUpAction(); + CallTalk().stopPcmSound(); Get.back(); }), bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", @@ -257,7 +259,7 @@ class _RealTimePicturePageState extends State case 9: return "images/main/icon_lockDetail_monitoringTalkback.png"; default: - return "images/main/icon_lockDetail_monitoringAnswerCalls.png"; + return "images/main/icon_lockDetail_monitoringUnTalkback.png"; } } @@ -268,7 +270,7 @@ class _RealTimePicturePageState extends State case 9: return "松开发送"; default: - return "接听"; + return "长按说话"; } } @@ -377,8 +379,11 @@ class _RealTimePicturePageState extends State void _handleFailure() { // 在这里处理失败的逻辑 - state.animationController.stop(); + CallTalk().stopPcmSound(); state.realTimePicTimer.cancel(); + if (state.animationController != null) { + state.animationController.stop(); + } } @override diff --git a/star_lock/lib/talk/udp/udp_reciverData.dart b/star_lock/lib/talk/udp/udp_reciverData.dart index 5ca238b0..699a138e 100644 --- a/star_lock/lib/talk/udp/udp_reciverData.dart +++ b/star_lock/lib/talk/udp/udp_reciverData.dart @@ -155,6 +155,8 @@ class CommandUDPReciverManager { { //监视成功 print("监视成功"); + UDPTalkClass().status = 8; + eventBus.fire(GetUDPStatusMonitorUI(UDPTalkClass().status)); } break; case 7: @@ -192,6 +194,8 @@ class CommandUDPReciverManager { break; case 30: { + CallTalk().stopPcmSound(); + // 监视结束 if ((data[7] & 0x3) == 1) { // 对方结束监视 @@ -200,6 +204,7 @@ class CommandUDPReciverManager { //结束监视反馈 print("结束监视反馈"); } + // Toast.show(msg: "对方已结束监视"); // UDPTalkClass().status = 0; // UDPTalkClass().isBeCall = false; diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 6e60b3fc..740d77e1 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -62,6 +62,12 @@ class GetUDPStatusRefreshUI { GetUDPStatusRefreshUI(this.udpStatus); } +/// 获取到UDP接收状态然后刷新监控界面 +class GetUDPStatusMonitorUI { + int udpStatus; + GetUDPStatusMonitorUI(this.udpStatus); +} + /// 获取到第一帧图片数据后跳转 class GetFirstFrameGoPush { bool isFirstFrame;