Skip to content

Commit

Permalink
deploy: 2764a2d
Browse files Browse the repository at this point in the history
  • Loading branch information
hyansuper committed Dec 28, 2024
0 parents commit 67f859a
Show file tree
Hide file tree
Showing 368 changed files with 17,152 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*_build/
*__pycache__/
Empty file added .nojekyll
Empty file.
13 changes: 13 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
os: ubuntu-22.04
commands:
- mkdir -p $READTHEDOCS_OUTPUT/html/
- cp -r docs/* $READTHEDOCS_OUTPUT/html/
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# XDial web pages

zh-cn [![Documentation Status](https://readthedocs.org/projects/xdial/badge/?version=latest)](https://xdial.readthedocs.io/zh-cn/latest/?badge=latest)

en [![Documentation Status](https://readthedocs.org/projects/xdial-en/badge/?version=latest)](https://xdial.readthedocs.io/en/latest/?badge=latest)
Empty file added docs/.nojekyll
Empty file.
Binary file added docs/gallery/assets/abstract/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/abstract/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/abstract/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/abstract/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/abstract/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/capybara/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/capybara/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/13.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/emoji/9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/ikun/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/ikun/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/ikun/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/ikun/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/gallery/assets/ikun/4.png
Binary file added docs/gallery/assets/ikun/5.png
Binary file added docs/gallery/assets/ikun/6.png
Binary file added docs/gallery/assets/paris_olympics/0.png
Binary file added docs/gallery/assets/paris_olympics/1.png
Binary file added docs/gallery/assets/paris_olympics/10.png
Binary file added docs/gallery/assets/paris_olympics/11.png
Binary file added docs/gallery/assets/paris_olympics/12.png
Binary file added docs/gallery/assets/paris_olympics/13.png
Binary file added docs/gallery/assets/paris_olympics/14.png
Binary file added docs/gallery/assets/paris_olympics/15.png
Binary file added docs/gallery/assets/paris_olympics/16.png
Binary file added docs/gallery/assets/paris_olympics/17.png
Binary file added docs/gallery/assets/paris_olympics/2.png
Binary file added docs/gallery/assets/paris_olympics/3.png
Binary file added docs/gallery/assets/paris_olympics/4.png
Binary file added docs/gallery/assets/paris_olympics/5.png
Binary file added docs/gallery/assets/paris_olympics/6.png
Binary file added docs/gallery/assets/paris_olympics/7.png
Binary file added docs/gallery/assets/paris_olympics/8.png
Binary file added docs/gallery/assets/paris_olympics/9.png
Binary file added docs/gallery/assets/pokemon/0.png
Binary file added docs/gallery/assets/pokemon/1.png
Binary file added docs/gallery/assets/pokemon/2.png
Binary file added docs/gallery/assets/pokemon/3.png
Binary file added docs/gallery/assets/pokemon/4.png
Binary file added docs/gallery/assets/pokemon/5.png
Binary file added docs/gallery/assets/pokemon/6.png
Binary file added docs/gallery/assets/pokemon/7.png
Binary file added docs/gallery/assets/puppies/0.png
Binary file added docs/gallery/assets/puppies/1.png
Binary file added docs/gallery/assets/puppies/2.png
Binary file added docs/gallery/assets/puppies/3.png
Binary file added docs/gallery/assets/puppies/4.png
Binary file added docs/gallery/assets/puppies/x1.png
Binary file added docs/gallery/assets/puppies/x5.png
Binary file added docs/gallery/assets/puppies/x6.png
Binary file added docs/gallery/assets/puppies/x8.png
Binary file added docs/gallery/assets/puppies/x9.png
Binary file added docs/gallery/assets/rick_and_morty/0.png
Binary file added docs/gallery/assets/rick_and_morty/1.png
Binary file added docs/gallery/assets/rick_and_morty/2.png
Binary file added docs/gallery/assets/rick_and_morty/3.png
Binary file added docs/gallery/assets/rick_and_morty/4.png
Binary file added docs/gallery/assets/rick_and_morty/5.png
Binary file added docs/gallery/assets/spongebob/0.png
Binary file added docs/gallery/assets/spongebob/1.png
Binary file added docs/gallery/assets/spongebob/2.png
Binary file added docs/gallery/assets/spongebob/3.png
Binary file added docs/gallery/assets/test/0.png
Binary file added docs/gallery/assets/test/1.png
Binary file added docs/gallery/assets/test/2.png
Binary file added docs/gallery/assets/test/3.png
Binary file added docs/gallery/assets/test/4.png
Binary file added docs/gallery/assets/test/5.png
52 changes: 52 additions & 0 deletions docs/gallery/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<!DOCTYPE html><html><head>
<title>xDial</title>
<meta charset="UTF-8"><meta name='viewport' content='width=device-width, initial-scale=1'/>
<meta http-equiv="Content-Security-Policy" content="connect-src http:" />
</head><script src="util.js"></script>
<style>
*{font-size:1em;margin:.25em}
h1{font-size:1.25em;text-align:center;margin-top: 1em;}
div:has(h2){border-top:1px solid #ccc;
h2{
font-weight: normal; display: flex;justify-content: space-between;
a{text-decoration: none;margin-right:0.5em;}
}
div{overflow: auto;white-space: nowrap;
img{width:64px;height:64px;border-radius:50%;}
}
}
</style><body>
<div style="float:left;margin:0;">📦<select oninput="update_asset_ln()" id="server"><option value="github" data-fmt="https://github.com/r-cute/xdial-cf-gallery/releases/download/${ver}/${name}.bin">github</option><option value="gitee" data-fmt="https://gitee.com/r-cute/xdial-cf-gallery/releases/download/${ver}/${name}.bin">gitee</option></select></div>
</body><script>
str_fmt=(template,args)=>Object.entries(args).reduce((result, [arg, val]) => result?.replace(`$\{${arg}}`, `${val}`),template);
qry=new URLSearchParams(location.search);
if(qry.get('asset_fmt')) {
q('#server').parentNode.style.display="none";
} else if(qry.get('server')) {
q('#server').value=qry.get('server');
}
make_asset_url=(ver,name)=>str_fmt(qry.get('asset_fmt')??q('#server>option:checked').dataset.fmt,{ver:ver,name:name});
prev_num=4;
ver="1.0.0";
multi_lang();
range=x=>Array(x).keys();
(
ml('h1')(['Clock Face Gallery','表盘广场'])
+j2h({'<>':'div','[]':split,html:[{'<>':'h2',html:[ml('span'),{'<>':'div',html:x=>`<a href='#0' onclick='cpy_ln("${x[2]}")'>🔗</a><a data-name='${x[2]}' onclick='return confirm(selang("New clock face will overwrite the current one, continue?/新表盘将覆盖当前的可选表盘, 是否继续?"))' target='_blank'>⬇️</a>`}]},{'<>':'div',html:x=>[...range(parseInt(x[3]))].map(i=>`<img src="assets/${x[2]}/${i}.png" loading="lazy" />`).join('')}]}).batch([
'iKun/iKun/ikun/7',
'Abstract/抽象/abstract/5',
'Puppies/小狗/puppies/5',
'Paris Olympics 2024/巴黎奥运 2024/paris_olympics/18',
'Emoji/Emoji/emoji/14',
'Pokémon/宝可梦/pokemon/8',
'Rick and Morty/瑞克和莫蒂/rick_and_morty/6',
'SpongeBob/海绵宝宝/spongebob/4',
'Capybara/卡皮巴拉/capybara/2',
])
).dom();
qa_ln=s=>qa('a').filter(e=>e.textContent==s);
cpy_ln=n=>{navigator.clipboard.writeText(`${make_asset_url(ver,n)}`);alert(selang("Copied to clipboard/链接已复制"));};
update_asset_ln=()=>qa_ln('⬇️').forEach(e=>e.href=decodeURIComponent(str_fmt(qry.get("dl"),{url:make_asset_url(ver,e.dataset.name)})));
update_asset_ln();
qry.get('dl')?.length||qa_ln('⬇️').forEach(e=>{e.style.opacity=0.5;e.style['pointer-events']='none';});
</script></html>
56 changes: 56 additions & 0 deletions docs/gallery/util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
q=(s,e)=>(e??document).querySelector(s);
qa=(s,e)=>[...(e??document).querySelectorAll(s)];
zip=(x,...y)=>x.map((v,i)=>[v,...y.map(j=>j[i])]);
get_json=s=>fetch(s).then(r=>r.text()).then(r=>eval(`(${r})`));
a2b=(a,b)=>[...range(b-a)].map(x=>x+a);
b2i=b=>b?1:0;
is_num=s=>/^-?\d+$/.test(s);
is_str=s=>typeof(s)=='string';
ver_cmp=(x,y)=>zip(...[x,y].map(o=>o.split('.').map(x=>parseInt(x)))).reduce((o,[a,b])=>o||a-b,0);
partial=(f,...a)=>(...b)=>f(...a,...b);
_split=s=>x=>x.split(s);split=_split('/');
dash2Camel=i=>{var o=i.split('-');return o[0]+o.slice(1).map(x=>x[0].toUpperCase()+x.slice(1)).join('');}
sel_lang=(i,e)=>qa('[data-en]',e).forEach(x=>x.attr(x.hasAttribute('placeholder')?'placeholder':'innerHTML',x.dataset[dash2Camel(i)]));
selang=x=>split(x)[q("#_ml_sel").selectedIndex];
attr=(o,a,v)=>{if(typeof(a)=='object')return Object.assign(o,a);if(v==undefined)return o[a];o[a]=v;return o;};
(function(){
var add_meth=(cls,nf)=>Object.entries(nf).map(([n,f])=>{cls.prototype[n]=f});
add_meth(HTMLElement,{'attr':function(s,v){return attr(this,s,v)},'css':function(s,v){if(typeof(s)=='object'){Object.entries(s).forEach(([k,v])=>{this.style[k]=v});return this};if(v==null)return this.style[s];this.style[s]=v;return this}});
add_meth(String,{'dom':function(){document.write(this)}});
add_meth(Object,{'merge':function(x){return Object.assign(this,x)},'str':function(){return JSON.stringify(this)},'has':this.hasOwnProperty,'get':function(s,f){return this.has(s)?this[s]:f},'pop':function(s,f){var r=this.get(s,f);delete this[s];return r;}});

arr2tab=(hdr,arr)=>arr.map(a=>Object.fromEntries((is_str(hdr)?hdr.split('/'):hdr).map((k,i)=>[k,a[i]])));
var no_tail_el=['input','br'];
var binary_attr = ['selected', 'checked'];
var special_prop=['html','{}','<>','[]'];
var if_fn=(f,...d)=>typeof(f)=='function'?f(...d):f;
var j2h_fn=(tmpl,data,index)=>{
if(Array.isArray(tmpl))return tmpl.map(t=>j2h_fn(t,data)).join('');
if(typeof(tmpl)=='object'){
var ndata=tmpl.get('{}',o=>o)(data); // new data
var idata=tmpl.get('[]',o=>ndata)(data); // inner data
var html=tmpl.get('html','');
var tag=if_fn(tmpl.get('<>',''),ndata);
if(tag==='') return j2h_fn(html,idata);
var attr_list=Object.entries(tmpl).filter(([k,v])=>!special_prop.includes(k)).map(([k,v])=>{v=if_fn(v,ndata,index);return binary_attr.includes(k)?(v?k:''):`${k}='${v}'`}).join(' ');
return '<' + tag + (attr_list.length? (' '+attr_list): '') + (no_tail_el.includes(tag)? '/>': `>${j2h_fn(html,idata,index)}</${tag}>`);
}
return ''+if_fn(tmpl,data,index);
};
j2h=tmpl=>{
var fn=data=>j2h_fn(tmpl,data);
fn.batch=data=>data.map((d,i)=>j2h_fn(tmpl,d,i)).join('');
return fn;
};
_id=o=>o.id;_txt=o=>o.text;_val=o=>o;_i=(o,i)=>i;_0=o=>o[0];_1=o=>o[1];_2=o=>o[2];_3=o=>o[3];
ml=(tag,opt)=>j2h(({'<>':tag,'data-en':_0,'data-zh-cn':x=>(x[1]??x[0])}).merge(opt));
}());
multi_lang=()=>{
j2h({'<>':'div',style:'text-align:right',html:['🌐',{'<>':'select',id:'_ml_sel',oninput:'sel_lang(this.value)',html:j2h({'<>':'option',value:_0,html:_1}).batch}]})([['en','English'],['zh-cn','中文']]).dom();
addEventListener("load", e=> {
var query = new URLSearchParams(location.search);
var s=q('#_ml_sel');
s.value=query.get('lang')??'zh-cn';
s.oninput();
});
};
13 changes: 13 additions & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<html><script>location.pathname=location.pathname.replace(/\/+$/, '')+'/manual/zh-cn';</script><body></body></html>
<!-- <html><head><title>xDial</title><meta charset="UTF-8"><meta name='viewport' content='width=device-width, initial-scale=1'/></head><style>
</style><body style="text-align: center;">
<h1>xDial</h1>
<h3 style="margin-top:-1em;">天气时钟创意桌摆</h3>
<img style="border-radius: 6px;max-width:90%" src="splash.png">
<ul style="margin-left:auto;margin-right:auto;width:14em;text-align: left;">
<li><a href="./manual/zh-cn">使用说明</a></li>
<li><a href="./manual/zh-cn/faq.html">常见问题</a></li>
<li><a href="https://github.com/r-cute/xdial/discussions">讨论 / 建议 / 问题</a></li>
</ul>
</body></html> -->
4 changes: 4 additions & 0 deletions docs/manual/en/.buildinfo
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: f7ecfb36f28e516ecc6ae9121778f3e7
tags: 645f666f9bcd5a90fca523b33c5a78b7
Empty file added docs/manual/en/.nojekyll
Empty file.
Binary file added docs/manual/en/_images/alarm.dev.png
Binary file added docs/manual/en/_images/cf_list.dev.png
Binary file added docs/manual/en/_images/cf_opt.web.png
Binary file added docs/manual/en/_images/clock_faces.web.png
Binary file added docs/manual/en/_images/gallery.web.png
Binary file added docs/manual/en/_images/input.png
Binary file added docs/manual/en/_images/left_btn_back.dev.png
Binary file added docs/manual/en/_images/left_btn_func.dev.png
Binary file added docs/manual/en/_images/menu_cf.dev.png
Binary file added docs/manual/en/_images/menu_perfmon.dev.png
Binary file added docs/manual/en/_images/menu_settings.dev.png
Binary file added docs/manual/en/_images/ota.web.png
Binary file added docs/manual/en/_images/perfmon.dev.png
Binary file added docs/manual/en/_images/settings.dev.png
Binary file added docs/manual/en/_images/settings.web.png
Binary file added docs/manual/en/_images/wifi_prov.dev.png
26 changes: 26 additions & 0 deletions docs/manual/en/_sources/alarms.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Alarms
================

The alarms behave similarly to alarms on phones.

Snooze mode
---------------

With snooze mode on, the alarm will ring at set time for 10 minutes, followed by a 9 minute break, and repeat this pattern till next day (24 hours).

.. figure:: _static/alarm.dev.png
:class: dev

Press left button for snooze, or right button to turn it off.


If snooze mode is disabled, it will ring at most 10 minutes then go off.

Repeat
----------------

You can select what days in the week you want the alarm to repeat. If none is selected, it becomes an one-off alarm.

.. important::
Don't forget to hit the save button after alarm settings are changed

56 changes: 56 additions & 0 deletions docs/manual/en/_sources/clock_faces.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
Clock Face customization
============================


.. figure:: _static/menu_cf.dev.png
:class: dev

Go to "Clock faces" selection interface

.. figure:: _static/cf_list.dev.png
:class: dev

Choose from built-in clock faces and optional ones.


Built-in clock faces
--------------------------

| In settings web page, select relevant clock face from drop down menu.
| Color or style of built-in clock faces are customizable.
.. image:: _static/clock_faces.web.png
:class: web
:align: center

\


Optional clock faces
-------------------------

Optional clock faces can be downloaded.

Select "optional N" from drop down menu. then click the "gallery" link

.. image:: _static/cf_opt.web.png
:class: web
:align: center

\

Download clock face of choice by clicking the ⬇️ button.

.. image:: _static/gallery.web.png
:class: web
:align: center

\

.. raw:: html

<div class="ver">
<b>Video guide</b>
<iframe src="https://www.bilibili.com/blackboard/html5mobileplayer.html?aid=1206308138&bvid=BV1Sf421q7bu&cid=1628971459&p=1&high_quality=1&danmaku=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
</div>

18 changes: 18 additions & 0 deletions docs/manual/en/_sources/coincap_assets.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
coincap assets
==================

.. raw:: html

<style>
#assets{
border-collapse: collapse;
th,td{border:1px solid grey;text-align: center;}
th{background-color: lightgrey}
}
</style>
<table id='assets'><thead><tr><th>id</th><th>symbol</th><th>name</th></tr></thead><tbody></tbody></table>
<script>
fetch('https://api.coincap.io/v2/assets').then(r=>r.json()).then(
assets=>document.querySelector('#assets tbody').innerHTML += assets.data.map(({id,name,symbol})=>`<tr><td>${id}</td><td>${symbol}</td><td>${name}</td></tr>`).join('')
);
</script>
75 changes: 75 additions & 0 deletions docs/manual/en/_sources/faq.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
FAQ
============

Firstly, make sure you `update firmware <ota.html>`_ to latest version.

How to re-configure WiFi settings?
---------------------------------------

When the device failed to access WiFi network on startup, it will enter WiFi provision mode.

It can also be manually set it to WiFi provision mode, by:

#. Hold down **left button**, then power on device, until a beep.
#. Follow instructions on device's screen, connect to its WiFi hotspot, then re-configure WiFi settings.

Settings web page can't be accessed
----------------------------------------

#. Make sure your phone is in the same WLAN as the device, and the WiFi is 2.4GHz, not 5GHz.
#. Check that the device's `settings server is turned on <settings.html>`_

Weather interface shows no data
------------------------------------

#. Follow instructions on how to `setup weather data <weather.html>`_
#. In the device's weather interface, click right button to force a manual update, see if any :xref:`error code <https://dev.qweather.com/en/docs/resource/status-code/>` shows up.


Cryptocurrency prices not showing
-----------------------------------

#. Check that :xref:`https://coincap.io <https://coincap.io>` is accessible via your router.
#. In the settings web page, make sure you input correct `ids <coincap_assets.html>`_ in the "Others" textbox, if any.

Device fails to reboot after after firmware update
------------------------------------------------------

This happens occasionally when newly updated firmware cannot read previous settings, please try delete previous settings by :ref:`factory reset <How to factory reset?>`

Device repeatedly reboots after downloading new clock face
---------------------------------------------------------------

If errors occur when downloading optional clock faces, or the downloaded resource is malformed, the device may have problem loading the resources on startup, then it reboots, and then fail again...

You can force device to skip loading clock face resources on startup, then delete them:

#. Hold down **right button**, then power on device, until a beep.
#. After device starts, go to the settings web page → *Clock Faces* → select *(Optional N)* from dropdown menu → click *delete* button.
#. Check for `firmware updates <ota.html>`_.
#. If the problem remains, try :ref:`factory reset <How to factory reset?>`



How to factory reset?
-------------------------

* Click the *reset* button in settings web page.

* Or, you can hard reset device on startup by:

#. Hold down **both buttons**, then power on device, until you hear 2 beeps.
#. Now the device will delete all custom settings, including QWeather KEY and any optional clock faces, but WiFi settings will be kept.



Can I design my own clock face (and share it)?
---------------------------------------------------

It's currently impractical for users to design custom clock faces, due to lack of a user-friendly software with graphical interface to facilitate this.


Can I flash 3rd party firmware?
------------------------------------

No, the serial port is disabled.
42 changes: 42 additions & 0 deletions docs/manual/en/_sources/index.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
User Manual
=================

.. toctree::
:maxdepth: 1

wifi_provision
input
settings
ota
clock_faces
alarms
weather
perfmon
faq


Product parameters
--------------------

.. csv-table::

"Shell", "Resin 3D printed"
"Size", "52×47×54 mm"
"Screen", "Ø 32 mm, 240×240 px"
"Power", "5V, USB Type-C"
"Processor", "ESP32-C3"
"WiFi", "2.4 GHz, 802.11 b/g/n"
"Flash", "32 Mbit"
"Language", "En/中文"

..
.. warning::
The shell is 3D printed with resin, it may soften and deform in high-temperature environment.
..
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
Loading

0 comments on commit 67f859a

Please sign in to comment.