You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
7.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { M9zService, LgnLatData, SunRiseSetData, SunRiseTimeData } from '../../utils/M9zService';
import { promptAction } from '@kit.ArkUI';
@Component
export struct ParameterSettings {
@Prop deviceId: string;
@Prop @Watch('onTabChange') currentTabIndex: number = 0;
@State isLoading: boolean = false;
@State lgnLat: LgnLatData = new LgnLatData();
@State sunRiseSet: SunRiseSetData = new SunRiseSetData();
@State sunRiseTime: SunRiseTimeData = new SunRiseTimeData();
private m9zService: M9zService = M9zService.getInstance();
aboutToAppear() {
if (this.deviceId) {
// initial load handled by onTabChange? No, initial index might be 0, this is 1. IF this is 1 initially?
// BluetoothControlPage sets index 0 default.
// If user goes to 1, onTabChange fires.
// If user starts at 0, this component might load but not show?
// Let's rely on onTabChange mostly, but for initial:
if (this.currentTabIndex === 1) {
this.refreshData();
}
}
}
onTabChange() {
if (this.currentTabIndex === 1 && this.deviceId) {
this.refreshData();
}
}
refreshData() {
this.isLoading = true;
// 1. Get LgnLat
this.m9zService.getLgnLat({
onSuccess: (data: LgnLatData): void => {
this.lgnLat = data;
this.fetchSunRiseSet();
},
onError: (err: string): void => {
// console.error('Get lgnlat failed', err);
this.fetchSunRiseSet();
}
});
}
fetchSunRiseSet() {
// 2. Get SunRiseSet
this.m9zService.getSunRiseSet({
onSuccess: (data: SunRiseSetData): void => {
this.sunRiseSet = data;
this.fetchSunRiseTime();
},
onError: (err: string): void => {
this.fetchSunRiseTime();
}
});
}
fetchSunRiseTime() {
// 3. Get SunRiseTime
this.m9zService.getSunRiseTime({
onSuccess: (data: SunRiseTimeData): void => {
this.sunRiseTime = data;
this.isLoading = false;
},
onError: (err: string): void => {
this.isLoading = false;
}
});
}
syncLocation() {
// 模拟同步定位实际应调用定位API
const newData = new LgnLatData();
newData.lgn = 113.123456;
newData.lat = 23.123456;
newData.loc = '广东省广州市';
this.m9zService.setLgnLat(newData, {
onSuccess: (success: boolean): void => {
this.lgnLat = newData;
promptAction.showToast({ message: '同步成功' });
},
onError: (err: string): void => {
promptAction.showToast({ message: '同步失败:' + err });
}
});
}
setLgnLat() {
this.m9zService.setLgnLat(this.lgnLat, {
onSuccess: (success: boolean): void => {
promptAction.showToast({ message: '设置经纬度成功' });
},
onError: (err: string): void => {
promptAction.showToast({ message: '设置失败:' + err });
}
});
}
setSunRiseSet() {
this.m9zService.setSunRiseSet(this.sunRiseSet, {
onSuccess: (success: boolean): void => {
promptAction.showToast({ message: '设置偏差成功' });
},
onError: (err: string): void => {
promptAction.showToast({ message: '设置失败:' + err });
}
});
}
restartDevice() {
AlertDialog.show({
title: '确认',
message: '确定要重启设备吗?',
primaryButton: {
value: '取消',
action: (): void => {}
},
secondaryButton: {
value: '重启',
action: (): void => {
this.m9zService.restartDevice({
onSuccess: (val: boolean): void => { promptAction.showToast({ message: '发送重启命令成功' }); },
onError: (err: string): void => { promptAction.showToast({ message: '失败:' + err }); }
});
}
}
});
}
build() {
Stack() {
Scroll() {
Column() {
// 经纬度设置
Column() {
Text('经纬度设置').fontSize(16).fontWeight(FontWeight.Bold).fontColor('#22fdc8').width('100%').margin({bottom: 10})
Row() {
Text('经度: ').fontColor('#eaf6fc')
TextInput({ text: this.lgnLat.lgn.toString() })
.width(100)
.onChange((val) => { this.lgnLat.lgn = Number(val); })
.fontColor('#fff').backgroundColor('#333')
}.width('100%').margin({bottom: 5})
Row() {
Text('纬度: ').fontColor('#eaf6fc')
TextInput({ text: this.lgnLat.lat.toString() })
.width(100)
.onChange((val) => { this.lgnLat.lat = Number(val); })
.fontColor('#fff').backgroundColor('#333')
}.width('100%').margin({bottom: 10})
Row() {
Button('同步手机定位').fontSize(12).onClick(() => this.syncLocation()).margin({right: 10})
Button('保存').fontSize(12).onClick(() => this.setLgnLat())
}
}
.padding(10)
.backgroundColor('rgba(20, 38, 81, 0.95)')
.borderRadius(8)
.margin({bottom: 15})
.width('100%')
// 日出日落偏差
Column() {
Text('日出日落偏差 (分钟)').fontSize(16).fontWeight(FontWeight.Bold).fontColor('#22fdc8').width('100%').margin({bottom: 10})
Row() {
Text('日出偏差: ').fontColor('#eaf6fc')
TextInput({ text: this.sunRiseSet.rise.toString() })
.width(80)
.onChange((val) => { this.sunRiseSet.rise = Number(val); })
.fontColor('#fff').backgroundColor('#333')
}.width('100%').margin({bottom: 5})
Row() {
Text('日落偏差: ').fontColor('#eaf6fc')
TextInput({ text: this.sunRiseSet.set.toString() })
.width(80)
.onChange((val) => { this.sunRiseSet.set = Number(val); })
.fontColor('#fff').backgroundColor('#333')
}.width('100%').margin({bottom: 10})
Row() {
Button('保存').fontSize(12).onClick(() => this.setSunRiseSet())
}
}
.padding(10)
.backgroundColor('rgba(20, 38, 81, 0.95)')
.borderRadius(8)
.margin({bottom: 15})
.width('100%')
// 当前日出日落时间
Column() {
Text('今日光照时间').fontSize(16).fontWeight(FontWeight.Bold).fontColor('#22fdc8').width('100%').margin({bottom: 10})
Text(`日出: ${this.sunRiseTime.sunrise ? this.formatTime(this.sunRiseTime.sunrise) : '--:--'}`).fontColor('#eaf6fc')
Text(`日落: ${this.sunRiseTime.sunset ? this.formatTime(this.sunRiseTime.sunset) : '--:--'}`).fontColor('#eaf6fc')
}
.padding(10)
.backgroundColor('rgba(20, 38, 81, 0.95)')
.borderRadius(8)
.margin({bottom: 15})
.width('100%')
// 重启
Button('重启设备')
.backgroundColor('#fa5050')
.width('80%')
.margin({top: 20})
.onClick(() => this.restartDevice())
}.width('100%').padding(10)
}
if (this.isLoading) {
Stack() {
Rect().width('100%').height('100%').fill('rgba(0,0,0,0.5)')
Column() {
LoadingProgress().width(50).height(50).color('#22fdc8')
Text('数据加载中...').fontColor('white').margin({top: 10})
}
}
.width('100%').height('100%')
.zIndex(1000)
}
}
}
formatTime(date: Date): string {
const h = String(date.getHours()).padStart(2, '0');
const m = String(date.getMinutes()).padStart(2, '0');
return `${h}:${m}`;
}
}