fix standby_time

This commit is contained in:
2026-02-01 23:30:45 +08:00
parent 566efbcf1f
commit 242d4cadf0
4 changed files with 45 additions and 41 deletions

View File

@@ -136,6 +136,9 @@ async def lcd_set(request):
for k, v in json.loads(post_data).items(): for k, v in json.loads(post_data).items():
if k == "brightness": if k == "brightness":
display.brightness(int(v)) display.brightness(int(v))
elif k == "ui_type":
display.ui_type = v
config.set(k, v)
except Exception as e: except Exception as e:
ack["status"] = "error" ack["status"] = "error"
ack["message"] = str(e) ack["message"] = str(e)
@@ -370,7 +373,7 @@ def start():
machine.reset() machine.reset()
gc.collect() gc.collect()
display.load_ui() display.load_ui(config.get('ui_type'))
# init web server # init web server
from rom.nanoweb import Nanoweb from rom.nanoweb import Nanoweb

View File

@@ -243,8 +243,8 @@ class Display:
_print_mem() _print_mem()
# 初始化ui固定元素 # 初始化ui固定元素
def load_ui(self): def load_ui(self, ui_type='default'):
if self.ui_type == 'default': if ui_type == 'default':
# 默认黑色背景 # 默认黑色背景
self.tft.fill(0) self.tft.fill(0)
# 固定的环境数据图标 # 固定的环境数据图标
@@ -255,6 +255,7 @@ class Display:
# 更新其他默认数据 # 更新其他默认数据
self.update_ui() self.update_ui()
self.ui_type = ui_type
# 全局液晶屏实例 # 全局液晶屏实例
display = Display() display = Display()

View File

@@ -77,7 +77,7 @@ target="_blank"
> >
</small></div><div class="form-group"><label class="form-label">自动熄屏时间</label><input </small></div><div class="form-group"><label class="form-label">自动熄屏时间</label><input
type="time" type="time"
id="screen-timeout-input" id="standby-time-input"
class="form-control" class="form-control"
/><small class="text-muted">留空表示不自动熄屏</small></div><button class="btn btn-success" id="save-config-btn"> /><small class="text-muted">留空表示不自动熄屏</small></div><button class="btn btn-success" id="save-config-btn">
保存配置 保存配置
@@ -228,10 +228,10 @@ const response = await mw.ajax.get("/config");
const data = JSON.parse(response);currentConfig = data;// 更新配置表单 const data = JSON.parse(response);currentConfig = data;// 更新配置表单
if (data.city) { if (data.city) {
mw.val(mw.$("#city-input"), data.city); mw.val(mw.$("#city-input"), data.city);
}if (data.screen_timeout) { }if (data.standby_time) {
mw.val( mw.val(
mw.$("#screen-timeout-input"), mw.$("#standby-time-input"),
data.screen_timeout, data.standby_time,
); );
}// 更新配置表 }// 更新配置表
updateConfigTable(data); updateConfigTable(data);
@@ -271,14 +271,14 @@ mw.text(cell2, value);
async function saveConfig() { async function saveConfig() {
try { try {
const city = mw.val(mw.$("#city-input")); const city = mw.val(mw.$("#city-input"));
const screenTimeout = mw.val(mw.$("#screen-timeout-input"));if (!city) { const standbyTime = mw.val(mw.$("#standby-time-input"));if (!city) {
showMessage("城市名称不能为空", "error"); showMessage("城市名称不能为空", "error");
return; return;
}const configData = { }const configData = {
city: city, city: city,
};// 只有当输入了熄屏时间时才添加到配置中 };// 只有当输入了熄屏时间时才添加到配置中
if (screenTimeout !== "") { if (standbyTime !== "") {
configData.screen_timeout = screenTimeout; configData.standby_time = standbyTime;
}const response = await mw.ajax.post( }const response = await mw.ajax.post(
"/config/set", "/config/set",
configData, configData,

View File

@@ -1,26 +1,26 @@
const MicroWeb={$:t=>document.querySelector(t),$$:t=>document.querySelectorAll(t),show:t=>t.style.display="block",hide:t=>t.style.display="none",toggle:t=>t.style.display="none"===t.style.display?"block":"none",text(t,e){if(void 0===e)return t.textContent;t.textContent=e},html(t,e){if(void 0===e)return t.innerHTML;t.innerHTML=e},val(t,e){if(void 0===e)return t.value;t.value=e},addClass:(t,e)=>t.classList.add(e),removeClass:(t,e)=>t.classList.remove(e),hasClass:(t,e)=>t.classList.contains(e),on(t,e,r,i){"function"==typeof r?(i=r,t.addEventListener(e,i)):t.addEventListener(e,t=>{t.target.matches(r)&&i.call(t.target,t)})},ajax:{async get(t){try{let e=await fetch(t);return await e.text()}catch(r){return console.error("GET failed:",r),null}},async post(t,e){try{let r=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return await r.text()}catch(i){return console.error("POST failed:",i),null}},async postForm(t,e){let r=new FormData(e);try{let i=await fetch(t,{method:"POST",body:r});return await i.text()}catch(o){return console.error("Form POST failed:",o),null}}},bind(t,e=""){Object.keys(t).forEach(r=>{let i=document.querySelectorAll(`[data-bind="${e}${r}"]`);i.forEach(e=>{e.textContent=t[r]})})},render:(t,e)=>t.replace(/\{\{(\w+)\}\}/g,(t,r)=>void 0!==e[r]?e[r]:""),chart:{createProgress(t,e,r=100,i={}){let o=i.width||"100%",a=i.height||"20px",l=i.color||"#007bff",n=i.bgColor||"#f0f0f0",d=e/r*100,s=` const MicroWeb={$:t=>document.querySelector(t),$$:t=>document.querySelectorAll(t),show:t=>t.style.display="block",hide:t=>t.style.display="none",toggle:t=>t.style.display="none"===t.style.display?"block":"none",text(t,e){if(void 0===e)return t.textContent;t.textContent=e},html(t,e){if(void 0===e)return t.innerHTML;t.innerHTML=e},val(t,e){if(void 0===e)return t.value;t.value=e},attr(t,e,r){if(void 0===r)return t.getAttribute(e);t.setAttribute(e,r)},addClass:(t,e)=>t.classList.add(e),removeClass:(t,e)=>t.classList.remove(e),hasClass:(t,e)=>t.classList.contains(e),replaceClass(t,e,r){t.classList.remove(e),t.classList.add(r)},on(t,e,r,i){"function"==typeof r?(i=r,t.addEventListener(e,i)):t.addEventListener(e,t=>{t.target.matches(r)&&i.call(t.target,t)})},ajax:{async get(t,e={}){try{let r=e.headers||{},i=await fetch(t,{headers:r});return await i.text()}catch(o){return console.error("GET failed:",o),null}},async post(t,e,r={}){try{let i=Object.assign({"Content-Type":"application/json"},r.headers||{}),o=await fetch(t,{method:"POST",headers:i,body:JSON.stringify(e)});return await o.text()}catch(a){return console.error("POST failed:",a),null}},async postForm(t,e){let r=new FormData(e);try{let i=await fetch(t,{method:"POST",body:r});return await i.text()}catch(o){return console.error("Form POST failed:",o),null}}},bind(t,e=""){Object.keys(t).forEach(r=>{let i=document.querySelectorAll(`[data-bind="${e}${r}"]`);i.forEach(e=>{e.textContent=t[r]})})},render:(t,e)=>t.replace(/\{\{(\w+)\}\}/g,(t,r)=>void 0!==e[r]?e[r]:""),chart:{createProgress(t,e,r=100,i={}){let o=i.width||"100%",a=i.height||"20px",l=i.color||"#007bff",n=i.bgColor||"#f0f0f0",s=e/r*100,d=`
<div style=" <div style="
width: ${o}; width: ${o};
height: ${a}; height: ${a};
background: ${n}; background: ${n};
border-radius: 10px; border-radius: 10px;
overflow: hidden; overflow: hidden;
margin: 5px 0;"> margin: 5px 0;">
<div style=" <div style="
width: ${d}%; width: ${s}%;
height: 100%; height: 100%;
background: ${l}; background: ${l};
transition: width 0.3s; transition: width 0.3s;
border-radius: 10px;"> border-radius: 10px;">
</div> </div>
</div> </div>
<small>${e} / ${r} (${d.toFixed(1)}%)</small> <small>${e} / ${r} (${s.toFixed(1)}%)</small>
`;t.innerHTML=s},createBarChart(t,e,r={}){let i=Math.max(...e.values);r.width;let o=r.height||200,a=r.colors||["#007bff","#28a745","#ffc107","#dc3545"],l=`<div style="display: flex; align-items: flex-end; height: ${o}px; gap: 10px;">`;e.values.forEach((t,r)=>{let n=e.labels?e.labels[r]:`Item ${r+1}`,d=a[r%a.length];l+=` `;t.innerHTML=d},createBarChart(t,e,r={}){let i=Math.max(...e.values);r.width;let o=r.height||200,a=r.colors||["#007bff","#28a745","#ffc107","#dc3545",],l=`<div style="display: flex; align-items: flex-end; height: ${o}px; gap: 10px;">`;e.values.forEach((t,r)=>{let n=e.labels?e.labels[r]:`Item ${r+1}`,s=a[r%a.length];l+=`
<div style="text-align: center;"> <div style="text-align: center;">
<div style=" <div style="
width: 40px; width: 40px;
height: ${t/i*(o-40)}px; height: ${t/i*(o-40)}px;
background: ${d}; background: ${s};
border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0;
margin: 0 auto;"> margin: 0 auto;">
</div> </div>
@@ -30,34 +30,34 @@ const MicroWeb={$:t=>document.querySelector(t),$$:t=>document.querySelectorAll(t
</div> </div>
</div> </div>
`}),l+="</div>",t.innerHTML=l},createGauge(t,e,r=100,i={}){let o=i.size||150,a=i.color||"#007bff",l=` `}),l+="</div>",t.innerHTML=l},createGauge(t,e,r=100,i={}){let o=i.size||150,a=i.color||"#007bff",l=`
<div style="position: relative; width: ${o}px; height: ${o/2}px; <div style="position: relative; width: ${o}px; height: ${o}px;
overflow: hidden; margin: 0 auto;"> overflow: hidden; margin: 0 auto;">
<div style=" <div style="
position: absolute; position: absolute;
width: ${o}px; width: ${o}px;
height: ${o}px; height: ${o}px;
border: ${o/10}px solid #f0f0f0; border: ${o/10}px solid #f0f0f0;
border-radius: 50%; border-radius: 50%;
border-bottom-color: transparent; border-bottom-color: transparent;
border-left-color: transparent;"> border-left-color: transparent;">
</div> </div>
<div style=" <div style="
position: absolute; position: absolute;
width: ${o}px; width: ${o}px;
height: ${o}px; height: ${o}px;
border: ${o/10}px solid ${a}; border: ${o/10}px solid ${a};
border-radius: 50%; border-radius: 50%;
border-bottom-color: transparent; border-bottom-color: transparent;
border-left-color: transparent; border-left-color: transparent;
transform: rotate(${45+1.8*Math.min(e/r*100,100)}deg); transform: rotate(${45+1.8*Math.min(e/r*100,100)}deg);
transition: transform 0.5s;"> transition: transform 0.5s;">
</div> </div>
<div style=" <div style="
position: absolute; position: absolute;
width: 100%; width: 100%;
text-align: center; text-align: center;
top: ${o/2.5}px; top: ${o/2.5}px;
font-size: ${o/7}px; font-size: ${o/7}px;
font-weight: bold;"> font-weight: bold;">
${e} ${e}
<div style="font-size: ${o/10}px; color: #666;"> <div style="font-size: ${o/10}px; color: #666;">