blob: 9d8dca6278c5a9b8b58b3579fc55d88b414aadbb [file] [log] [blame]
Fabian Kozynski2d212122019-12-17 12:22:46 -05001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.service.controls.templates;
18
19import android.annotation.IntDef;
20import android.annotation.NonNull;
21import android.os.Bundle;
Fabian Kozynski2d212122019-12-17 12:22:46 -050022import android.util.Log;
23
24import com.android.internal.util.Preconditions;
25
26import java.lang.annotation.Retention;
27import java.lang.annotation.RetentionPolicy;
28
Fabian Kozynski2d212122019-12-17 12:22:46 -050029public final class TemperatureControlTemplate extends ControlTemplate {
30
31 private static final String TAG = "ThermostatTemplate";
32
33 private static final @TemplateType int TYPE = TYPE_TEMPERATURE;
34 private static final String KEY_TEMPLATE = "key_template";
35 private static final String KEY_CURRENT_MODE = "key_current_mode";
36 private static final String KEY_CURRENT_ACTIVE_MODE = "key_current_active_mode";
37 private static final String KEY_MODES = "key_modes";
38
39 /**
40 * @hide
41 */
42 @Retention(RetentionPolicy.SOURCE)
43 @IntDef({
44 MODE_UNKNOWN,
45 MODE_OFF,
46 MODE_HEAT,
47 MODE_COOL,
48 MODE_HEAT_COOL,
49 MODE_ECO
50 })
51 public @interface Mode {}
52
53 private static final int NUM_MODES = 6;
54 public static final @Mode int MODE_UNKNOWN = 0;
55
56 public static final @Mode int MODE_OFF = 1;
57
58 public static final @Mode int MODE_HEAT = 2;
59
60 public static final @Mode int MODE_COOL = 3;
61
62 public static final @Mode int MODE_HEAT_COOL = 4;
63
64 public static final @Mode int MODE_ECO = 5;
65
Fabian Kozynski1bb26b52020-01-08 18:20:36 -050066 /**
67 * @hide
68 */
Fabian Kozynski2d212122019-12-17 12:22:46 -050069 @Retention(RetentionPolicy.SOURCE)
70 @IntDef(flag = true, value = {
71 FLAG_MODE_OFF,
72 FLAG_MODE_HEAT,
73 FLAG_MODE_COOL,
74 FLAG_MODE_HEAT_COOL,
75 FLAG_MODE_ECO
76 })
77 public @interface ModeFlag {}
78
79 public static final int FLAG_MODE_OFF = 1 << MODE_OFF;
80 public static final int FLAG_MODE_HEAT = 1 << MODE_HEAT;
81 public static final int FLAG_MODE_COOL = 1 << MODE_COOL;
82 public static final int FLAG_MODE_HEAT_COOL = 1 << MODE_HEAT_COOL;
83 public static final int FLAG_MODE_ECO = 1 << MODE_ECO;
84 private static final int ALL_FLAGS =
85 FLAG_MODE_OFF |
86 FLAG_MODE_HEAT |
87 FLAG_MODE_COOL |
88 FLAG_MODE_HEAT_COOL |
89 FLAG_MODE_ECO;
90
91 private static final int[] modeToFlag = new int[]{
92 0,
93 FLAG_MODE_OFF,
94 FLAG_MODE_HEAT,
95 FLAG_MODE_COOL,
96 FLAG_MODE_HEAT_COOL,
97 FLAG_MODE_ECO
98 };
99
100 private final @NonNull ControlTemplate mTemplate;
101 private final @Mode int mCurrentMode;
102 private final @Mode int mCurrentActiveMode;
103 private final @ModeFlag int mModes;
104
105 public TemperatureControlTemplate(@NonNull String templateId,
106 @NonNull ControlTemplate controlTemplate,
107 @Mode int currentMode,
108 @Mode int currentActiveMode,
109 @ModeFlag int modesFlag) {
110 super(templateId);
111 Preconditions.checkNotNull(controlTemplate);
112 mTemplate = controlTemplate;
113
114 if (currentMode < 0 || currentMode >= NUM_MODES) {
115 Log.e(TAG, "Invalid current mode:" + currentMode);
116 mCurrentMode = MODE_UNKNOWN;
117 } else {
118 mCurrentMode = currentMode;
119 }
120
121 if (currentActiveMode < 0 || currentActiveMode >= NUM_MODES) {
122 Log.e(TAG, "Invalid current active mode:" + currentActiveMode);
123 mCurrentActiveMode = MODE_UNKNOWN;
124 } else {
125 mCurrentActiveMode = currentActiveMode;
126 }
127
128 mModes = modesFlag & ALL_FLAGS;
129 if (mCurrentMode != MODE_UNKNOWN && (modeToFlag[mCurrentMode] & mModes) == 0) {
130 throw new IllegalArgumentException("Mode " + mCurrentMode + " not supported in flag.");
131 }
132 if (mCurrentActiveMode != MODE_UNKNOWN && (modeToFlag[mCurrentActiveMode] & mModes) == 0) {
133 throw new IllegalArgumentException(
134 "Mode " + currentActiveMode + " not supported in flag.");
135 }
136 }
137
Fabian Kozynski1bb26b52020-01-08 18:20:36 -0500138 /**
139 * @param b
140 * @hide
141 */
Fabian Kozynski2d212122019-12-17 12:22:46 -0500142 TemperatureControlTemplate(@NonNull Bundle b) {
143 super(b);
Fabian Kozynski1bb26b52020-01-08 18:20:36 -0500144 mTemplate = ControlTemplate.createTemplateFromBundle(b.getBundle(KEY_TEMPLATE));
Fabian Kozynski2d212122019-12-17 12:22:46 -0500145 mCurrentMode = b.getInt(KEY_CURRENT_MODE);
146 mCurrentActiveMode = b.getInt(KEY_CURRENT_ACTIVE_MODE);
147 mModes = b.getInt(KEY_MODES);
148 }
149
Fabian Kozynski1bb26b52020-01-08 18:20:36 -0500150 /**
151 * @return
152 * @hide
153 */
Fabian Kozynski2d212122019-12-17 12:22:46 -0500154 @Override
Fabian Kozynski1bb26b52020-01-08 18:20:36 -0500155 @NonNull
156 Bundle getDataBundle() {
Fabian Kozynski2d212122019-12-17 12:22:46 -0500157 Bundle b = super.getDataBundle();
Fabian Kozynski1bb26b52020-01-08 18:20:36 -0500158 b.putBundle(KEY_TEMPLATE, mTemplate.getDataBundle());
Fabian Kozynski2d212122019-12-17 12:22:46 -0500159 b.putInt(KEY_CURRENT_MODE, mCurrentMode);
160 b.putInt(KEY_CURRENT_ACTIVE_MODE, mCurrentActiveMode);
161 b.putInt(KEY_MODES, mModes);
162 return b;
163 }
164
165 @NonNull
166 public ControlTemplate getTemplate() {
167 return mTemplate;
168 }
169
170 public int getCurrentMode() {
171 return mCurrentMode;
172 }
173
174 public int getCurrentActiveMode() {
175 return mCurrentActiveMode;
176 }
177
178 public int getModes() {
179 return mModes;
180 }
181
182 @Override
183 public int getTemplateType() {
184 return TYPE;
185 }
Fabian Kozynski2d212122019-12-17 12:22:46 -0500186}