diff --git a/entry/src/main/ets/pages/components/ParameterSettings.ets b/entry/src/main/ets/pages/components/ParameterSettings.ets index 00ffae5..117deea 100644 --- a/entry/src/main/ets/pages/components/ParameterSettings.ets +++ b/entry/src/main/ets/pages/components/ParameterSettings.ets @@ -10,9 +10,17 @@ export struct ParameterSettings { @State lgnLat: LgnLatData = new LgnLatData(); @State sunRiseSet: SunRiseSetData = new SunRiseSetData(); @State sunRiseTime: SunRiseTimeData = new SunRiseTimeData(); + @State weekModes: number[] = [0, 0, 0, 0, 0, 0, 0]; // Sun-Sat + @State fullWeekModeData: number[] = []; // Store full config data to write back + + private days: string[] = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; + private displayIndices: number[] = [1, 2, 3, 4, 5, 6, 0]; // Display order: Mon-Sat, Sun + private modeOptions: string[] = ['模式1', '模式2', '模式3']; 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? @@ -66,7 +74,24 @@ export struct ParameterSettings { this.m9zService.getSunRiseTime({ onSuccess: (data: SunRiseTimeData): void => { this.sunRiseTime = data; - this.isLoading = false; + // 4. Get Week Mode + this.m9zService.getWeekMode({ + onSuccess: (data: number[]): void => { + console.info('WeeklyMode Raw Data:', JSON.stringify(data)); // Debug log + if (data && data.length >= 7) { + this.fullWeekModeData = data; + // Assume last 7 bytes are the week modes (Mon-Sun). + const startIndex = data.length - 7; + this.weekModes = data.slice(startIndex); + console.info('WeeklyMode extracted:', JSON.stringify(this.weekModes)); + } + this.isLoading = false; + }, + onError: (err: string): void => { + console.error('WeeklyMode Error:', err); + this.isLoading = false; + } + }); }, onError: (err: string): void => { this.isLoading = false; @@ -134,6 +159,28 @@ export struct ParameterSettings { }); } + setWeekMode() { + if (this.fullWeekModeData.length < 7) { + promptAction.showToast({ message: '未获取到完整配置,无法保存' }); + return; + } + + // Update full data with current week modes + const startIndex = this.fullWeekModeData.length - 7; + for (let i = 0; i < 7; i++) { + this.fullWeekModeData[startIndex + i] = this.weekModes[i]; + } + + console.info('WeeklyMode Saving:', JSON.stringify(this.fullWeekModeData)); + + this.m9zService.setWeekMode(this.fullWeekModeData, { + onSuccess: (val: boolean): void => { promptAction.showToast({ message: '周模式保存成功' }); }, + onError: (err: string): void => { promptAction.showToast({ message: '保存失败: ' + err }); } + }); + } + + + build() { Stack() { Scroll() { @@ -209,8 +256,46 @@ export struct ParameterSettings { .backgroundColor('rgba(20, 38, 81, 0.95)') .borderRadius(8) .margin({bottom: 15}) + .margin({bottom: 15}) .width('100%') + // 周运行模式设置 + Column() { + Text('周运行模式设置').fontSize(16).fontWeight(FontWeight.Bold).fontColor('#22fdc8').width('100%').margin({bottom: 10}) + + ForEach(this.displayIndices, (dataIndex: number) => { + Row() { + Text(this.days[dataIndex]).fontColor('#eaf6fc').width(50) + Select([ + { value: '模式1' }, + { value: '模式2' }, + { value: '模式3' } + ]) + .selected(this.weekModes[dataIndex]) + .value(this.modeOptions[this.weekModes[dataIndex]]) + .font({ size: 14 }) + .fontColor('#fff') + .selectedOptionFont({ size: 14 }) + .optionFont({ size: 14 }) + .menuBackgroundColor('#2d3a51') + .onSelect((idx: number) => { + this.weekModes[dataIndex] = idx; + }) + .backgroundColor('#333') + .height(30) + }.width('100%').margin({bottom: 5}).justifyContent(FlexAlign.Start) + }) + + Row() { + Button('保存').fontSize(12).onClick(() => this.setWeekMode()) + }.margin({top: 10}) + } + .padding(10) + .backgroundColor('rgba(20, 38, 81, 0.95)') + .borderRadius(8) + .margin({bottom: 15}) + .width('100%') + // 重启 Button('重启设备') .backgroundColor('#fa5050') diff --git a/entry/src/main/ets/utils/M9zService.ets b/entry/src/main/ets/utils/M9zService.ets index e8e64a6..b94d43d 100644 --- a/entry/src/main/ets/utils/M9zService.ets +++ b/entry/src/main/ets/utils/M9zService.ets @@ -91,7 +91,7 @@ export class ControlTask { } // 定义联合类型以避免使用 any -export type ServiceData = boolean | number | Date | ManualData | LgnLatData | SunRiseSetData | SunRiseTimeData | TaskProgram | DeviceStatus; +export type ServiceData = boolean | number | number[] | Date | ManualData | LgnLatData | SunRiseSetData | SunRiseTimeData | TaskProgram | DeviceStatus; export interface Callback { onSuccess: (data: T) => void; @@ -378,6 +378,8 @@ export class M9zService { return this.parseLgnLat(data); case M9zCmd.SunRiseSet: // 0x06 return this.parseSunRiseSet(data); + case M9zCmd.DeviceConfig: // 0x11 + return data; // Return raw number[] for week mode case M9zCmd.StartTask: case M9zCmd.MiddleTask: case M9zCmd.StopTask: @@ -603,6 +605,16 @@ export class M9zService { this.registerCallback(M9zCmd.Mode, cb); this.sendFrame(this.buildM9zCommand(M9zCmd.Mode, CMD_WRITE, 0x00, [mode])); } + + public getWeekMode(cb: Callback): void { + this.registerCallback(M9zCmd.DeviceConfig, cb); + this.sendFrame(this.buildM9zCommand(M9zCmd.DeviceConfig, CMD_READ, 0x00, [])); + } + + public setWeekMode(modes: number[], cb: Callback): void { + this.registerCallback(M9zCmd.DeviceConfig, cb); + this.sendFrame(this.buildM9zCommand(M9zCmd.DeviceConfig, CMD_WRITE, 0x00, modes)); + } public restartDevice(cb: Callback): void { this.registerCallback(M9zCmd.Restart, cb);