切换页面或锁屏时关闭串口电源

This commit is contained in:
cxc
2023-09-04 17:27:55 +08:00
parent 6dbda9c163
commit d925542852
20 changed files with 324 additions and 73 deletions

View File

@ -7,6 +7,7 @@ import 'package:fengshui_compass/components/my_icon.dart';
import 'package:fengshui_compass/pages/login_page.dart';
import 'package:fengshui_compass/states/region.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_serial_port_api/flutter_serial_port_api.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
@ -23,7 +24,7 @@ class CompassPage extends StatefulWidget {
State<StatefulWidget> createState() => _CompassState();
}
class _CompassState extends State<CompassPage> {
class _CompassState extends State<CompassPage> with WidgetsBindingObserver {
// 串口相关
bool isPortOpened = false;
SerialPort _serialPort;
@ -54,16 +55,53 @@ class _CompassState extends State<CompassPage> {
@override
void initState() {
super.initState();
print("init");
// 添加观察者以监听生命周期事件
WidgetsBinding.instance?.addObserver(this);
initPort();
}
@override
void dispose() {
turnOffPower();
// 在小部件被销毁时移除观察者,以防止内存泄漏
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
print("dispose");
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// 在这里处理应用程序生命周期状态变化事件
if (state == AppLifecycleState.paused) {
// 应用程序进入后台
print('App entered background');
turnOffPower();
} else if (state == AppLifecycleState.resumed) {
// 应用程序回到前台
print('App returned to foreground');
initPort();
} else if (state == AppLifecycleState.inactive) {
// 应用程序处于非活动状态(例如:锁屏、电话来电)
print('App in inactive state');
turnOffPower();
}
}
Future<void> initPort() async {
await turnOnPower();
// todo:
setState(() {
isLock = true;
isUpClose = true;
isSideClose = true;
});
// 20ms接收一次串口数据防抖定义接收缓存
final debounceTransformer = StreamTransformer<Uint8List, dynamic>.fromBind(
(s) => s.transform(debounceBuffer(const Duration(milliseconds: 20))));
if (!isPortOpened) {
Device theDevice = Device("/dev/ttyS2", "/dev/ttyS2");
Device theDevice = Device("/dev/ttyS3", "/dev/ttyS3");
var serialPort = await FlutterSerialPortApi.createSerialPort(
theDevice, 115200,
parity: 0, dataBits: 8, stopBit: 1);
@ -89,6 +127,24 @@ class _CompassState extends State<CompassPage> {
}
}
Future<void> turnOnPower() async {
const platform = MethodChannel('toggle_power');
await platform.invokeMethod("turnOnPower");
}
Future<void> turnOffPower() async {
const platform = MethodChannel('toggle_power');
await platform.invokeMethod("turnOffPower");
if (mounted) {
setState(() {
isLock = false;
isUpClose = false;
isSideClose = false;
isPortOpened = false;
});
}
}
Future<void> closePort() async {
bool closeResult = await _serialPort.close();
setState(() {
@ -204,40 +260,50 @@ class _CompassState extends State<CompassPage> {
w_y_tmp = 0.5 - 0.07 * roll_tmp / 30.0;
w_x_tmp = 0.5 - 0.07 * pitch_tmp / 30.0;
} else if (w_total > 30) {
//todo
w_y_tmp = 0.5 - 0.07 * w_total / 30.0;
w_x_tmp = 0.5 - 0.07 * w_total / 30.0;
// //todo
// w_y_tmp = 0.5 - 0.07 * w_total / 30.0;
// w_x_tmp = 0.5 - 0.07 * w_total / 30.0;
var radius = sqrt(0.07 * 0.07 * 2);
//todo;
var _angle = atan2(roll_tmp, -pitch_tmp);
if (_angle < 0) {
_angle += 2 * pi;
}
w_y_tmp = 0.5 - radius * sin(_angle);
w_x_tmp = 0.5 + radius * cos(_angle);
}
// todo 其他情况
var meanValue;
if (lista.length < 20) {
lista.add(temp_myaw);
meanValue = null;
} else {
lista.removeAt(0);
lista.add(temp_myaw);
meanValue = lista.map((e) => e).reduce((a, b) => a + b) / lista.length;
// if (lista.length < 20) {
// lista.add(temp_myaw);
// meanValue = null;
// } else {
// lista.removeAt(0);
// lista.add(temp_myaw);
// meanValue = lista.map((e) => e).reduce((a, b) => a + b) / lista.length;
// }
if (mounted) {
setState(() {
// print("roll: $roll_tmp pitch: $pitch_tmp");
// print("w_x: $w_x_tmp, w_y: $w_y_tmp");
// if (meanValue != null) {
// myaw = meanValue;
// } else {
// myaw = 0;
// }
myaw = temp_myaw;
w_x = w_x_tmp;
w_y = w_y_tmp;
// 水平仪 0.5+-0.07范围
// x旋转y在动 y旋转x在动 roll改变y坐标pitch改变x坐标
});
}
setState(() {
// print("roll: $roll_tmp pitch: $pitch_tmp");
// print("w_x: $w_x_tmp, w_y: $w_y_tmp");
// if (meanValue != null) {
// myaw = meanValue;
// } else {
// myaw = 0;
// }
myaw = temp_myaw;
w_x = w_x_tmp;
w_y = w_y_tmp;
// 水平仪 0.5+-0.07范围
// x旋转y在动 y旋转x在动 roll改变y坐标pitch改变x坐标
});
} else if (str.contains("9E010401") &&
(str.length >= ((str.indexOf("9E010401") + 26)))) {
var pos = str.indexOf("9E010401");
@ -311,7 +377,8 @@ class _CompassState extends State<CompassPage> {
} else if (angle > 180) {
result = angle - 180;
} else {
result = 0.0;
// result = 0.0;
result = angle;
}
return result;
}