添加闹钟文件遗漏
authord15521469561 <d155214695615@qq.com>
Thu, 6 Apr 2023 09:20:28 +0000 (17:20 +0800)
committerd15521469561 <d155214695615@qq.com>
Thu, 6 Apr 2023 09:20:28 +0000 (17:20 +0800)
3.code/1.watch/2.code/alarm.py [new file with mode: 0644]
3.code/1.watch/2.code/static/0_weather.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/1_weather.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/2_weather.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/3_weather.jpg [new file with mode: 0644]

diff --git a/3.code/1.watch/2.code/alarm.py b/3.code/1.watch/2.code/alarm.py
new file mode 100644 (file)
index 0000000..ced93ed
--- /dev/null
@@ -0,0 +1,814 @@
+import modem
+import osTimer
+import utime
+import lvgl as lv
+from ext import EventMesh
+from machine import Timer
+from ext.ui import Screen
+from ext.common import Abstract, LogAdapter
+from machine import RTC
+import ujson
+import ql_fs
+"""
+可以添加/编辑闹钟时间、周期;
+最多添加三个闹钟;
+可以删除已有的闹钟;
+可以启用/禁用已有的闹钟;
+保存已添加/编辑的闹钟信息,并在下次运行时恢复。
+"""
+#标题高度
+TITLE_HEIGHT = 30
+#闹钟元素高度
+ALARM_HEIGHT = 75
+ALARM_WIDTH = 224
+#闹钟最大数量
+MAX_ALARM = 3
+#CONT的样式
+style_cont_alarm = lv.style_t()
+style_cont_alarm.init()
+style_cont_alarm.set_bg_color(lv.color_make(0x22, 0x28, 0x3D))
+style_cont_alarm.set_radius(5)
+style_cont_alarm.set_pad_left(0)
+style_cont_alarm.set_pad_right(0)
+style_cont_alarm.set_pad_top(0)
+style_cont_alarm.set_pad_bottom(0)
+
+#字体样式
+style_font_white = lv.style_t()
+style_font_white.init()
+style_font_white.set_text_color(lv.color_make(0xff, 0xff, 0xff))
+style_font_white.set_text_font_v2("font_20.bin",18,0)
+style_font_white.set_border_width(0)
+style_font_white.set_pad_left(0)
+style_font_white.set_pad_right(0)
+style_font_white.set_pad_top(0)
+style_font_white.set_pad_bottom(0)
+
+style_font_yellow = lv.style_t()
+style_font_yellow.init()
+style_font_yellow.set_text_color(lv.color_make(0xF1, 0xA3, 0x3B))
+style_font_yellow.set_text_font_v2("font_20.bin",18,0)
+
+#背景样式
+style_alarm_screen_default = lv.style_t()
+style_alarm_screen_default.init()
+style_alarm_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_alarm_screen_default.set_border_width(0)
+style_alarm_screen_default.set_pad_left(0)
+style_alarm_screen_default.set_pad_right(0)
+style_alarm_screen_default.set_pad_top(0)
+style_alarm_screen_default.set_pad_bottom(0)
+
+# -------------------------------------------clk_list screen----------------------------------------------------------
+clk_list_screen = lv.obj()
+clk_list_screen1 = lv.obj(clk_list_screen)
+clk_list_screen1.center()
+clk_list_screen1.set_size(240, 320)
+clk_list_screen1.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_list_title = lv.label(clk_list_screen1)
+clk_list_title.set_pos(0, 15)
+clk_list_title.set_size(240, 40)
+clk_list_title.set_text("闹钟列表")
+clk_list_title.set_long_mode(lv.label.LONG.WRAP)
+clk_list_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_list_title.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_list_add_btn = lv.btn(clk_list_screen1)
+clk_list_add_btn.set_pos(180,45)
+clk_list_add_btn.set_size(50,20)
+clk_list_add_btn.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_list_add = lv.label(clk_list_screen1)
+clk_list_add.set_pos(180, 45)
+clk_list_add.set_size(50, 20)
+clk_list_add.set_text("添加")
+clk_list_add.set_long_mode(lv.label.LONG.WRAP)
+clk_list_add.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_list_add.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_list_add.set_ext_click_area(15)
+
+clk_list_screen1_1 = lv.obj(clk_list_screen)
+clk_list_screen1_1.set_pos(0, 65)
+clk_list_screen1_1.set_size(240, 255)
+clk_list_screen1_1.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------clk_edit screen----------------------------------------------------------
+
+clk_edit_screen = lv.obj()
+clk_edit_screen.center()
+clk_edit_screen.set_size(240, 320)
+clk_edit_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_edit_title = lv.label(clk_edit_screen)
+clk_edit_title.set_pos(0, 0)
+clk_edit_title.set_size(240, TITLE_HEIGHT)
+clk_edit_title.set_text("编辑闹钟")
+clk_edit_title.set_long_mode(lv.label.LONG.WRAP)
+clk_edit_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_edit_title.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_edit_time = lv.btn(clk_edit_screen)
+clk_edit_time.set_size(224,75)
+clk_edit_time.set_pos(8,58)
+clk_edit_time.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_edit_time_label = lv.label(clk_edit_time)
+clk_edit_time_label.set_pos(60, 15)
+clk_edit_time_label.set_size(100, 40)
+clk_edit_time_label.set_text("编辑时间")
+clk_edit_time_label.set_long_mode(lv.label.LONG.WRAP)
+clk_edit_time_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_edit_time_label.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_edit_weekday = lv.btn(clk_edit_screen)
+clk_edit_weekday.set_size(224,75)
+clk_edit_weekday.set_pos(8,137)
+clk_edit_weekday.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_edit_weekday_label = lv.label(clk_edit_weekday)
+clk_edit_weekday_label.set_pos(60, 15)
+clk_edit_weekday_label.set_size(100, 40)
+clk_edit_weekday_label.set_text("编辑星期")
+clk_edit_weekday_label.set_long_mode(lv.label.LONG.WRAP)
+clk_edit_weekday_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_edit_weekday_label.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_delete_alarm = lv.btn(clk_edit_screen)
+clk_delete_alarm.set_size(224,75)
+clk_delete_alarm.set_pos(8,216)
+clk_delete_alarm.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_delete_alarm_label = lv.label(clk_delete_alarm)
+clk_delete_alarm_label.set_pos(60, 15)
+clk_delete_alarm_label.set_size(100, 40)
+clk_delete_alarm_label.set_text("删除闹钟")
+clk_delete_alarm_label.set_long_mode(lv.label.LONG.WRAP)
+clk_delete_alarm_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+clk_delete_alarm_label.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------clk_repeat screen----------------------------------------------------------
+clk_repeat_screen = lv.obj()
+clk_repeat_screen.center()
+clk_repeat_screen.set_scrollbar_mode(0)
+clk_repeat_screen.set_size(240, 320)
+clk_repeat_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_btn = lv.btn(clk_repeat_screen)
+clk_repeat_btn.set_size(224,40)
+clk_repeat_btn.set_pos(9,40)
+clk_repeat_btn.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label = lv.label(clk_repeat_btn)
+clk_repeat_label.set_pos(8, 0)
+clk_repeat_label.set_size(103, 40)
+clk_repeat_label.set_text("星期一")
+clk_repeat_label.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch = lv.switch(clk_repeat_btn)
+clk_repeat_switch.set_pos(191, 5)
+clk_repeat_switch.set_size(24, 24)
+clk_repeat_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch.set_ext_click_area(20)
+clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+clk_repeat_btn1 = lv.btn(clk_repeat_screen)
+clk_repeat_btn1.set_size(224,40)
+clk_repeat_btn1.set_pos(9,90)
+clk_repeat_btn1.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label1 = lv.label(clk_repeat_btn1)
+clk_repeat_label1.set_pos(8, 0)
+clk_repeat_label1.set_size(103, 40)
+clk_repeat_label1.set_text("星期二")
+clk_repeat_label1.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label1.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch1 = lv.switch(clk_repeat_btn1)
+clk_repeat_switch1.set_pos(191, 5)
+clk_repeat_switch1.set_size(24, 24)
+clk_repeat_switch1.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch1.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch1.set_ext_click_area(20)
+clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+
+clk_repeat_btn2 = lv.btn(clk_repeat_screen)
+clk_repeat_btn2.set_size(224,40)
+clk_repeat_btn2.set_pos(9,140)
+clk_repeat_btn2.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label2 = lv.label(clk_repeat_btn2)
+clk_repeat_label2.set_pos(8, 0)
+clk_repeat_label2.set_size(103, 40)
+clk_repeat_label2.set_text("星期三")
+clk_repeat_label2.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label2.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label2.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+
+clk_repeat_switch2 = lv.switch(clk_repeat_btn2)
+clk_repeat_switch2.set_pos(191, 5)
+clk_repeat_switch2.set_size(24, 24)
+clk_repeat_switch2.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch2.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch2.set_ext_click_area(20)
+clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+clk_repeat_btn3 = lv.btn(clk_repeat_screen)
+clk_repeat_btn3.set_size(224,40)
+clk_repeat_btn3.set_pos(9,190)
+clk_repeat_btn3.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label3 = lv.label(clk_repeat_btn3)
+clk_repeat_label3.set_pos(8, 0)
+clk_repeat_label3.set_size(103, 40)
+clk_repeat_label3.set_text("星期四")
+clk_repeat_label3.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label3.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label3.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch3 = lv.switch(clk_repeat_btn3)
+clk_repeat_switch3.set_pos(191, 5)
+clk_repeat_switch3.set_size(24, 24)
+clk_repeat_switch3.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch3.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch3.set_ext_click_area(20)
+clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+clk_repeat_btn4 = lv.btn(clk_repeat_screen)
+clk_repeat_btn4.set_size(224,40)
+clk_repeat_btn4.set_pos(9,240)
+clk_repeat_btn4.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label4 = lv.label(clk_repeat_btn4)
+clk_repeat_label4.set_pos(8, 0)
+clk_repeat_label4.set_size(103, 40)
+clk_repeat_label4.set_text("星期五")
+clk_repeat_label4.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label4.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label4.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch4 = lv.switch(clk_repeat_btn4)
+clk_repeat_switch4.set_pos(191, 5)
+clk_repeat_switch4.set_size(24, 24)
+clk_repeat_switch4.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch4.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch4.set_ext_click_area(20)
+clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+clk_repeat_btn5 = lv.btn(clk_repeat_screen)
+clk_repeat_btn5.set_size(224,40)
+clk_repeat_btn5.set_pos(9,290)
+clk_repeat_btn5.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label5 = lv.label(clk_repeat_btn5)
+clk_repeat_label5.set_pos(8, 0)
+clk_repeat_label5.set_size(103, 40)
+clk_repeat_label5.set_text("星期六")
+clk_repeat_label5.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label5.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label5.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch5 = lv.switch(clk_repeat_btn5)
+clk_repeat_switch5.set_pos(191, 5)
+clk_repeat_switch5.set_size(24, 24)
+clk_repeat_switch5.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch5.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch5.set_ext_click_area(20)
+
+clk_repeat_btn6 = lv.btn(clk_repeat_screen)
+clk_repeat_btn6.set_size(224,40)
+clk_repeat_btn6.set_pos(9,340)
+clk_repeat_btn6.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+clk_repeat_label6 = lv.label(clk_repeat_btn6)
+clk_repeat_label6.set_pos(8, 0)
+clk_repeat_label6.set_size(103, 40)
+clk_repeat_label6.set_text("星期日")
+clk_repeat_label6.set_long_mode(lv.label.LONG.DOT)
+clk_repeat_label6.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_repeat_label6.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+clk_repeat_switch6 = lv.switch(clk_repeat_btn6)
+clk_repeat_switch6.set_pos(191, 5)
+clk_repeat_switch6.set_size(24, 24)
+clk_repeat_switch6.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN)
+clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR)
+clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB)
+clk_repeat_switch6.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+clk_repeat_switch6.set_ext_click_area(20)
+clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED)
+
+# -------------------------------------------clk_repeat screen----------------------------------------------------------
+clk_time_screen = lv.obj()
+clk_time_screen.center()
+clk_time_screen.set_scrollbar_mode(0)
+clk_time_screen.set_size(240, 320)
+clk_time_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+#hour的样式
+style_roller_hour_main = lv.style_t()
+style_roller_hour_main.init()
+style_roller_hour_main.set_radius(6)
+style_roller_hour_main.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_roller_hour_main.set_bg_opa(102)
+style_roller_hour_main.set_border_width(0)
+
+style_roller_hour_selected = lv.style_t()
+style_roller_hour_selected.init()
+style_roller_hour_selected.set_radius(6)
+style_roller_hour_selected.set_bg_color(lv.color_make(0x2c, 0x2c, 0x2f))
+style_roller_hour_selected.set_border_width(0)
+
+#创建hour的roller
+clk_time_roller_1 = lv.roller(clk_time_screen)
+clk_time_roller_1.set_width(50)
+clk_time_roller_1.set_pos(60, 50)
+clk_time_roller_1.set_options(
+    "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23",
+    lv.roller.MODE.NORMAL)
+clk_time_roller_1.set_visible_row_count(5)
+clk_time_roller_1.add_style(style_roller_hour_main, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_time_roller_1.add_style(style_roller_hour_selected, lv.PART.SELECTED | lv.STATE.DEFAULT)
+
+#min的样式
+#创建min的roller
+clk_time_roller_2 = lv.roller(clk_time_screen)
+clk_time_roller_2.set_width(50)
+clk_time_roller_2.set_pos(130, 50)
+clk_time_roller_2.set_options(
+    "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59",
+    lv.roller.MODE.NORMAL)
+clk_time_roller_2.set_visible_row_count(5)
+clk_time_roller_2.add_style(style_roller_hour_main, lv.PART.MAIN | lv.STATE.DEFAULT)
+clk_time_roller_2.add_style(style_roller_hour_selected, lv.PART.SELECTED | lv.STATE.DEFAULT)
+
+#完成按钮
+alarm_ok= lv.btn(clk_time_screen)
+alarm_ok.set_size(150,40)
+alarm_ok.set_pos(45,250)
+alarm_ok.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+alarm_ok.set_ext_click_area(20)
+
+label_ok = lv.label(alarm_ok)
+label_ok.set_pos(30, 20)
+label_ok.set_size(100, 40)
+label_ok.set_text("完成")
+label_ok.set_long_mode(lv.label.LONG.DOT)
+label_ok.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+label_ok.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+
+#闹钟信息
+alarm_list = []
+
+class ClockManager(Abstract):
+    def __init__(self):
+        super().__init__()
+        self.rtc = RTC()
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("push_clock_info", self.set)
+        EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
+        EventMesh.subscribe("add_alarm", self.add_alarm)
+        EventMesh.subscribe("remove_alarm", self.remove_alarm)
+        EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
+
+    def set(self, event, msg):
+        global alarm_list
+        print("msg = {}".format(msg))
+        idx = msg.get("idx")
+        print("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
+        alarm_list[idx]["hour"] = msg["hour"]
+        alarm_list[idx]["minute"] = msg["minute"]
+        alarm_list[idx]["days"] = msg["days"]
+        alarm_list[idx]["enabled"] = msg["enabled"]
+
+        with open("/usr/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+            ujson.dump(alarm_list,fd)
+
+    def read_alarminjson(self, event, msg):
+        IFEXIST = ql_fs.path_exists("/usr/alarm_msg.json") 
+        global alarm_list      
+        if IFEXIST == False:
+            with open("/usr/alarm_msg.json","w",encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+                print("闹钟信息加载完成")
+        else:
+            with open("/usr/alarm_msg.json","r",encoding='utf-8') as fd:
+                alarm_list = ujson.load(fd)
+
+    def add_alarm(self, event, msg):
+        global alarm_list      
+        idx = len(alarm_list)
+        print("add_here-----idx:",idx)
+        alarm_list.append({"idx": idx, "hour": 0, "minute": 0, "days": [], "enabled": False})
+        with open("/usr/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+            ujson.dump(alarm_list,fd)
+
+    def remove_alarm(self, event, msg):
+        global alarm_list
+        print("ddddddddddddddddddd:",msg)
+        idx = msg.get("idx")
+        print("delete_here1-----{},{}:".format(idx,msg))
+
+        for i, alarm in enumerate(alarm_list):
+            print("delete_here2-----{},{}:".format(i,alarm))
+
+            if alarm["idx"] == idx:
+                del alarm_list[i]
+                print("delete_here3-----",alarm_list)
+
+                #删除闹钟后,对idx重新排序
+                if alarm_list:
+                    for j in range(i,len(alarm_list)):
+                        alarm_list[j]["idx"] -= 1
+                        print("delete_here4-----",alarm_list)
+
+        with open("/usr/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+            ujson.dump(alarm_list,fd)
+
+    def _rtc_callback(self,args):
+        print("---!!!!!!alarm_ring!!!!!!!---")
+        EventMesh.publish("set_rtc_alarm")
+
+    # def _reset_rtc_alarm_time(self, args):
+    #     print("---alarm_ring---")
+
+    def set_rtc_alarm(self,event,msg):
+        global alarm_list
+        EventMesh.publish("read_alarminjson")
+
+        print("00获取所有闹钟信息:{}".format(alarm_list))
+        new_alarm_list = [(alarm['hour'], alarm['minute'], alarm['days']) for alarm in alarm_list if alarm['enabled']]
+
+        print("01获取开启的闹钟:{}".format(new_alarm_list))
+        start_day = 0 # 周日
+        start_minute = 0 # 0点
+        end_minute = 60*24*7
+        minute_list = []
+
+        if not new_alarm_list:
+            print("02当前并没有开启的闹钟,退出闹钟设置程序:{}".format(new_alarm_list))
+            self.rtc.enable_alarm(0)
+            return
+        
+        for alarm in new_alarm_list:
+            hour, minute, days = alarm
+            for day in days:
+                minute_list.append(hour*60 + minute + (day-start_day)*24*60)
+
+        total_minutes = sorted(minute_list)
+        print("02以周日00:00为起点,计算所有开启闹钟的total_min并排序:{}".format(total_minutes))
+
+        #获取当前时间  (2020, 9, 11, 5, 15, 43, 23, 0)
+        # rtc_now_time = (2020, 9, 11, 6, 11, 43, 23, 0)
+        rtc_now_time = self.rtc.datetime()
+
+        print("03当前的rtc时间:{}".format(rtc_now_time))  
+
+        current_minute = rtc_now_time[4]*60 + rtc_now_time[5] + (rtc_now_time[3]-start_day)*24*60
+        print("04当前的rtc_total_minutes:{}".format(current_minute))  
+
+        if current_minute in minute_list:
+            print("当前时间和闹钟列表时间重复,删除重复的时间")
+            minute_list.remove(current_minute)
+
+        minute_list.append(current_minute)
+
+        # 对分钟数列表进行排序,并获取当前时间分钟数所在的位置
+        minute_list = sorted(minute_list)
+        current_index = minute_list.index(current_minute)
+
+        print("05将当前时间插入min_list后的min_list:{}".format(minute_list))  
+        print("06当前时间所在位置:{}".format(current_index))  
+
+        next_index = current_index + 1
+        if next_index >= len(minute_list):
+            next_minute = minute_list[0]
+            print("07下一个闹钟的分钟数:", next_minute)
+        else:
+            next_minute = minute_list[next_index]
+            print("07下一个闹钟的分钟数:", next_minute)
+
+        if next_minute >= current_minute:
+            interval_minute = next_minute - current_minute
+            print("08距离下一次响铃的的分钟数:", interval_minute)
+        else:
+            interval_minute = end_minute - current_minute + next_minute
+            print("08距离下一次响铃的的分钟数:", interval_minute)
+
+        #反向获取时间戳
+        time = utime.localtime()
+        print("09获取utime的时间戳:", time)
+        rtc_mktime = utime.mktime(time)
+        print("10反向获取utime的mktime:", rtc_mktime)
+
+        #加上下一次响铃需要的时间
+        next_alarm_mktime = rtc_mktime + interval_minute*60
+        print("11下一次响铃的mktime:", next_alarm_mktime)
+
+        #格式化时间戳,得到下一次闹钟的时间
+        next_alarm_time = utime.localtime(next_alarm_mktime)
+        print("12下一次响铃的准确时间:", next_alarm_time)
+        #将时间转换为rtc的格式
+        data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
+        #给rtc时间赋值
+        data_l[0] = next_alarm_time[0] #year
+        data_l[1] = next_alarm_time[1] #month                    
+        data_l[2] = next_alarm_time[2] #day                     
+        data_l[4] = next_alarm_time[3] #hour               
+        data_l[5] = next_alarm_time[4] #minute               
+        #转换为元组       
+        data_e=tuple(data_l)
+        print("13将该时间转换为RTC元组:", data_e)
+       
+        #设置rtc闹钟时间
+        self.rtc.register_callback(self._rtc_callback)
+
+        FLAG = self.rtc.set_alarm(data_e)
+        if FLAG == 0:
+            print("14成功设置rtc的到期时间:", data_e)
+        else:
+            print("14设置rtc的到期时间失败:", data_e)
+        
+        self.rtc.enable_alarm(1)
+           
+           
+
+#闹钟列表
+class ClkListScreen(Screen):
+    NAME = "clk_list"
+    def __init__(self):
+        super().__init__()
+        self.meta = clk_list_screen
+        self.clock_list = []
+        clk_list_add_btn.add_event_cb(lambda e: self.add_alarm_btn(e),
+                                     lv.EVENT.PRESSED, None)
+        self.weekdays_list = ["日","一","二","三","四","五","六"]
+    def initialization(self): 
+        EventMesh.publish("read_alarminjson")
+        EventMesh.publish("set_rtc_alarm")
+
+        print("n闹钟列表初始化!!")
+        self.alarm_draw_btn()
+        
+    def alarm_draw_btn(self):
+        global alarm_list 
+        self.clock_list = alarm_list  
+        if self.clock_list:
+            print("菜单的孩子个数:",clk_list_screen1.get_child_cnt())
+            for i ,each in enumerate(self.clock_list):
+                print("------刷新闹钟列表噢:",each)
+                _btn = lv.btn(clk_list_screen1_1)
+                _btn.set_size(224,75)
+                _btn.set_pos(8,79*i)
+                _btn.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT)
+                _btn.add_event_cb(lambda e: self.edit_alarm(e),
+                                        lv.EVENT.PRESSED, None)
+
+                _btn_label1 = lv.label(_btn)
+                _btn_label1.set_pos(50, 0)
+                _btn_label1.set_long_mode(lv.label.LONG.DOT)
+                _btn_label1.set_size(0, 0)
+                _btn_label1.set_text(str(i))
+
+                _btn_label2 = lv.label(_btn)
+                _btn_label2.set_pos(8, 10)
+                _btn_label2.set_size(97, 40)
+                _btn_label2.set_text("%02d" % each["hour"] + ":"+"%02d" % each["minute"])
+                # _btn_label2.set_text(str(each["days"]))
+
+                _btn_label2.set_long_mode(lv.label.LONG.DOT)
+                _btn_label2.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+                _btn_label2.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+                _new_list = sorted(each["days"])
+                _output = [self.weekdays_list[x] for x in _new_list]
+                _btn_label3 = lv.label(_btn)
+                _btn_label3.set_pos(10, 40)
+                _btn_label3.set_size(200, 40)
+                _btn_label3.set_text(",".join(_output))
+                _btn_label3.set_long_mode(lv.label.LONG.DOT)
+                _btn_label3.add_style(style_font_white, lv.PART.MAIN | lv.STATE.DEFAULT)
+                _btn_label3.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+
+                _btn_switch = lv.switch(_btn)
+                _btn_switch.set_pos(174, 29)
+                _btn_switch.set_size(34, 17)
+                _btn_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.INDICATOR)
+                _btn_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.INDICATOR| lv.STATE.CHECKED)
+                _btn_switch.add_event_cb(lambda e:
+                                        self.switch_event_cb(e),
+                                        lv.EVENT.VALUE_CHANGED,
+                                        None)
+
+                _btn_switch.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED)
+                _btn_switch.set_style_bg_color(lv.color_make(0x3d, 0x3d, 0x3d),lv.PART.KNOB)
+
+                _btn_switch.set_ext_click_area(20)
+                if each["enabled"]:
+                    _btn_switch.add_state(lv.STATE.CHECKED)
+                else:
+                    _btn_switch.clear_state(lv.STATE.CHECKED)
+
+    def edit_alarm(self, e):
+        idx = int(e.get_target().get_child(0).get_text())
+        print("edit!!!!!!!!!!!!:",idx)
+        clock_info = self.clock_list[idx]
+        clock_info["idx"] = idx
+        EventMesh.publish("load_screen", {"screen": "new_edit_clk","meta": clock_info})
+
+    def add_alarm_btn(self, e):
+
+        if len(self.clock_list) >= 3:
+            return
+        print("!!!!!!!!!!!!!!!!!------")
+        EventMesh.publish("add_alarm")
+        self.alarm_draw_btn()
+
+    def switch_event_cb(self, e):
+        obj = e.get_target()
+        idx = int(e.get_target().get_parent().get_child(0).get_text())
+        clock_info = self.clock_list[idx]
+        print("修改闹钟开关:",self.clock_list[idx])
+        clock_info["idx"] = idx
+        if obj.has_state(lv.STATE.CHECKED):
+            print("ON ~~~")
+            clock_info["enabled"] = True
+        else:
+            print("OFF ~~~")
+            clock_info["enabled"] = False
+        EventMesh.publish("push_clock_info", clock_info)
+        EventMesh.publish("set_rtc_alarm")
+
+        print("sw_event_cb ~~~")
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+               
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class NewEditClk(Screen):
+    NAME = "new_edit_clk"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = clk_edit_screen
+        clk_edit_weekday.add_event_cb(lambda e: self.edit_weekday(e), lv.EVENT.PRESSED, None)
+        clk_edit_time.add_event_cb(lambda e: self.edit_time(e), lv.EVENT.PRESSED, None)
+        clk_delete_alarm.add_event_cb(lambda e: self.delete_alarm(e), lv.EVENT.PRESSED, None)
+
+    def initialization(self):  
+        print("hahahahh",self.meta_info["idx"])
+
+    def delete_alarm(self, e):
+           
+        clk_list_screen1_1.clean()
+
+        EventMesh.publish("remove_alarm",self.meta_info)
+
+        self.load_screen(e, {"screen": "clk_list"})
+
+
+    def edit_weekday(self,e):
+        self.load_screen(e, {"screen": "clk_period",
+                             "meta": self.meta_info})
+
+    def edit_time(self,e):
+        self.load_screen(e, {"screen": "clk_time",
+                             "meta": self.meta_info})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+               
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+class CLKTimeScreen(Screen):
+    NAME = "clk_time"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = clk_time_screen
+        alarm_ok.add_event_cb(lambda e: self.handler(e), lv.EVENT.PRESSED, None)
+
+    def initialization(self):
+        roll_1_v = self.meta_info["hour"]
+        roll_2_v = self.meta_info["minute"]
+        
+        clk_time_roller_1.set_selected(int(roll_1_v), lv.ANIM.ON)
+        clk_time_roller_2.set_selected(int(roll_2_v), lv.ANIM.ON)
+
+    def handler(self, e):
+        option_1 = " " * 10
+        option_2 = " " * 10
+        clk_time_roller_2.get_selected_str(option_2, len(option_2))
+        clk_time_roller_1.get_selected_str(option_1, len(option_1))
+        option_1_strip = option_1.strip()[:2]
+        option_2_strip = option_2.strip()[:2]
+        print("option_1_strip = {} option_2_strip = {}".format(option_1_strip, option_2_strip))
+        self.meta_info["hour"] = int(option_1_strip)
+        self.meta_info["minute"] = int(option_2_strip)
+        EventMesh.publish("push_clock_info", self.meta_info)
+
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+               
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+class ClkPeriod(Screen):
+    NAME = "clk_period"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = clk_repeat_screen
+        self.choice_list=[]
+        self.alarm_info={}
+        self.clk_switch_list = [
+            clk_repeat_switch6,
+            clk_repeat_switch,
+            clk_repeat_switch1,
+            clk_repeat_switch2,
+            clk_repeat_switch3,
+            clk_repeat_switch4,
+            clk_repeat_switch5,
+
+        ]
+
+        clk_repeat_switch.add_event_cb(lambda e: self.save_choice(e,1), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch1.add_event_cb(lambda e: self.save_choice(e,2), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch2.add_event_cb(lambda e: self.save_choice(e,3), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch3.add_event_cb(lambda e: self.save_choice(e,4), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch4.add_event_cb(lambda e: self.save_choice(e,5), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch5.add_event_cb(lambda e: self.save_choice(e,6), lv.EVENT.VALUE_CHANGED, None)
+        clk_repeat_switch6.add_event_cb(lambda e: self.save_choice(e,0), lv.EVENT.VALUE_CHANGED, None)
+
+    def initialization(self):
+        self.choice_list = self.meta_info["days"]
+        self.alarm_info = self.meta_info
+        print("初始化:{},{}".format(self.alarm_info,self.choice_list))
+
+
+        for i in range(0,6):
+            if i in self.choice_list:
+                self.clk_switch_list[i].add_state(lv.STATE.CHECKED)
+
+            else:
+                self.clk_switch_list[i].clear_state(lv.STATE.CHECKED)
+
+
+    def save_choice(self,e,i):
+        if i in self.choice_list:
+            self.clk_switch_list[i].clear_state(lv.STATE.CHECKED)
+            self.choice_list.remove(i)
+            print("here1-----",self.choice_list,i)
+
+        else:
+            self.clk_switch_list[i].add_state(lv.STATE.CHECKED)
+            self.choice_list.append(i)
+            print("here2-----",self.choice_list,i)
+
+        print("here-----",self.choice_list)
+        self.alarm_info["days"] = self.choice_list
+
+        print("编辑星期:{}".format(self.alarm_info))
+        EventMesh.publish("push_clock_info", self.alarm_info)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+               
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "clk_list"})
+
diff --git a/3.code/1.watch/2.code/static/0_weather.jpg b/3.code/1.watch/2.code/static/0_weather.jpg
new file mode 100644 (file)
index 0000000..7531acb
Binary files /dev/null and b/3.code/1.watch/2.code/static/0_weather.jpg differ
diff --git a/3.code/1.watch/2.code/static/1_weather.jpg b/3.code/1.watch/2.code/static/1_weather.jpg
new file mode 100644 (file)
index 0000000..aac5b3c
Binary files /dev/null and b/3.code/1.watch/2.code/static/1_weather.jpg differ
diff --git a/3.code/1.watch/2.code/static/2_weather.jpg b/3.code/1.watch/2.code/static/2_weather.jpg
new file mode 100644 (file)
index 0000000..b23ac85
Binary files /dev/null and b/3.code/1.watch/2.code/static/2_weather.jpg differ
diff --git a/3.code/1.watch/2.code/static/3_weather.jpg b/3.code/1.watch/2.code/static/3_weather.jpg
new file mode 100644 (file)
index 0000000..15ecdc9
Binary files /dev/null and b/3.code/1.watch/2.code/static/3_weather.jpg differ