切换页面或锁屏时关闭串口电源
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user