From: p15692025051 <846603105@qq.com> Date: Tue, 21 Mar 2023 10:09:59 +0000 (+0800) Subject: 3.code提交 X-Git-Url: http://git.snicker.com.cn/img/static/gitweb.css?a=commitdiff_plain;h=19aebc1ba358f2d7c72bf3132117eeb81ff09eb6;p=mirrors%2FASR1603_G5.git 3.code提交 --- diff --git a/3.code/1.watch/1.doc/ALIPAY_API.xlsx b/3.code/1.watch/1.doc/ALIPAY_API.xlsx new file mode 100644 index 00000000..606aa8e9 Binary files /dev/null and b/3.code/1.watch/1.doc/ALIPAY_API.xlsx differ diff --git "a/3.code/1.watch/1.doc/Quecpython_EC800M\345\244\226\347\275\256flash\347\203\247\345\275\225\346\214\207\345\257\274.pdf" "b/3.code/1.watch/1.doc/Quecpython_EC800M\345\244\226\347\275\256flash\347\203\247\345\275\225\346\214\207\345\257\274.pdf" new file mode 100644 index 00000000..4c76c932 Binary files /dev/null and "b/3.code/1.watch/1.doc/Quecpython_EC800M\345\244\226\347\275\256flash\347\203\247\345\275\225\346\214\207\345\257\274.pdf" differ diff --git "a/3.code/1.watch/1.doc/Quectel_ALIPAY_API\350\257\264\346\230\216_2023_01_31.pdf" "b/3.code/1.watch/1.doc/Quectel_ALIPAY_API\350\257\264\346\230\216_2023_01_31.pdf" new file mode 100644 index 00000000..ce2bd79a Binary files /dev/null and "b/3.code/1.watch/1.doc/Quectel_ALIPAY_API\350\257\264\346\230\216_2023_01_31.pdf" differ diff --git "a/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200IOT\345\215\217\350\256\256V6.9-All(1).pdf" "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200IOT\345\215\217\350\256\256V6.9-All(1).pdf" new file mode 100644 index 00000000..ef25a0ca Binary files /dev/null and "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200IOT\345\215\217\350\256\256V6.9-All(1).pdf" differ diff --git "a/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200\347\241\254\344\273\266\345\274\200\346\224\276\345\271\263\345\217\26020221116.pdf" "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200\347\241\254\344\273\266\345\274\200\346\224\276\345\271\263\345\217\26020221116.pdf" new file mode 100644 index 00000000..29c6bffd Binary files /dev/null and "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200\347\241\254\344\273\266\345\274\200\346\224\276\345\271\263\345\217\26020221116.pdf" differ diff --git "a/3.code/1.watch/1.doc/\347\240\224\345\274\272\347\211\251\350\201\224\344\272\221\345\271\263\345\217\260\344\270\232\345\212\241\346\216\245\345\217\243\350\247\204\350\214\203_V1.0-\345\267\262\350\275\254\346\241\243.pdf" "b/3.code/1.watch/1.doc/\347\240\224\345\274\272\347\211\251\350\201\224\344\272\221\345\271\263\345\217\260\344\270\232\345\212\241\346\216\245\345\217\243\350\247\204\350\214\203_V1.0-\345\267\262\350\275\254\346\241\243.pdf" new file mode 100644 index 00000000..85877771 Binary files /dev/null and "b/3.code/1.watch/1.doc/\347\240\224\345\274\272\347\211\251\350\201\224\344\272\221\345\271\263\345\217\260\344\270\232\345\212\241\346\216\245\345\217\243\350\247\204\350\214\203_V1.0-\345\267\262\350\275\254\346\241\243.pdf" differ diff --git a/3.code/1.watch/2.code/EventMesh.py b/3.code/1.watch/2.code/EventMesh.py new file mode 100644 index 00000000..1b32fbdd --- /dev/null +++ b/3.code/1.watch/2.code/EventMesh.py @@ -0,0 +1,74 @@ +import _thread +import usys + + +class EventStore(object): + def __init__(self): + self.map = dict() + self.log = None + self.__filters = [] + + def add_filter(self, flt): + self.__filters.append(flt) + + def append(self, event, cb): + self.map[event] = cb + + def fire_async(self, event, msg): + if event in self.map: + _thread.start_new_thread(self.map[event], (event, msg)) + if self.log: + self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None)) + + def fire_sync(self, event, msg): + res = None + try: + if event in self.map: + res = self.map[event](event, msg) + except Exception as e: + usys.print_exception(e) + if self.log: + self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res)) + if event not in self.__filters: + if self.log: + self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res)) + return res + + +event_store = EventStore() + + +def subscribe(event, cb): + """ + subscribe event and cb + """ + return event_store.append(event, cb) + + +def publish(event, msg=None): + """ + publish event and msg + """ + return publish_sync(event, msg) + + +def publish_async(event, msg=None): + """ + 异步发送 + """ + return event_store.fire_async(event, msg) + + +def publish_sync(event, msg=None): + """ + 同步发送 + """ + return event_store.fire_sync(event, msg) + + +def set_log(log_adapter): + event_store.log = log_adapter + + +def add_filter(flt): + event_store.add_filter(flt) diff --git a/3.code/1.watch/2.code/appAlipay.py b/3.code/1.watch/2.code/appAlipay.py new file mode 100644 index 00000000..cf513d8d --- /dev/null +++ b/3.code/1.watch/2.code/appAlipay.py @@ -0,0 +1,876 @@ +import modem +import sim +import osTimer +import ALIPAY +from ext.common import Lock, Abstract, LogAdapter +import utime +import lvgl as lv +from ext import EventMesh +from machine import Timer +from ext import constants +from misc import Power +import pm +from ext.ui import Screen + +style_font_youyuan_20 = lv.style_t() +style_font_youyuan_20.init() +style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff)) +style_font_youyuan_20.set_text_font_v2("font.bin",0) + +style_btn_alipay = lv.style_t() +style_btn_alipay.init() +style_btn_alipay.set_radius(20) +style_btn_alipay.set_bg_opa(lv.OPA.COVER) +style_btn_alipay.set_bg_color(lv.palette_main(lv.PALETTE.BLUE)) +style_btn_alipay.set_bg_grad_color(lv.palette_darken(lv.PALETTE.BLUE, 2)) +style_btn_alipay.set_bg_grad_dir(lv.GRAD_DIR.VER) + +style_cont_alipay = lv.style_t() +style_cont_alipay.init() +style_cont_alipay.set_radius(20) +style_cont_alipay.set_bg_opa(lv.OPA.COVER) +style_cont_alipay.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) + + +class Alipay(Abstract): + """ + 支付宝 + """ + def __init__(self): + self.imei = modem.getDevImei() + if self.imei == None : + self.imei = "1111" + self.iccid = sim.getIccid() + if self.iccid == -1 : + self.iccid = "1111" + self.imsi = sim.getImsi() + if self.imsi == -1: + self.imsi = "1111" + self.mac = "123456" + self.sn = modem.getDevSN() + self.vendor = "ZHSX" + self.product_name = "ZHSX" + self. product_model = modem.getDevModel() + self.pk_alipay = "uHTfYqOlGlA" + self.pk_aliyun = "a15PcyZ3IHA" + self.ps_aliyun = "kOGGPhtXAg1Lz1vg" + self.product_type = 0 + self.timer_Alipay = osTimer() + self.timer_Alipay_check = osTimer() + self.alipay = None + self.is_simcard_identify = 255 + self.is_init = 255 + self.upay_bound = 0 #绑定结果 + def post_processor_after_instantiation(self): + print("post_processor_after_instantiation") + self.timer_Alipay.start(20000, 1, self.timeout_Alipay) + + + self.alipay = ALIPAY(self.imei, self.iccid,self.imsi, self.mac, self.sn,self.vendor, self.product_name, self. product_model, self.pk_alipay , self.pk_aliyun, self.ps_aliyun,0) + #self.alipay = ALIPAY("867387060319491", "898604293619F0549750","460044917509047", "123456", "P1Q22I80C0007530P","ZHIHUISHIXUN", "ZHIHUISHIXUN", "EC800M", "uHTfYqOlGlA" , "a15PcyZ3IHA", "kOGGPhtXAg1Lz1vg",0) + self.alipay.register_print() + self.alipay.set_log_limit(0) + EventMesh.subscribe("alipay_1", self.alipay_1) + EventMesh.subscribe("get_payment_code", self.get_payment_code) + EventMesh.subscribe("get_collect_code", self.get_collect_code) + EventMesh.subscribe("get_parent_code", self.get_parent_code) + + def timeout_Alipay(self, *args, **kwargs): + #print("timeout_Alipay1:{}".format(EventMesh.publish(constants.EVENT.GET_CONNECT))) + time = utime.localtime() + + #if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and self.alipay != None and (self.is_simcard_identify != 0 or time[3] == 0 or time[3] == 12): + if self.alipay != None and (self.is_simcard_identify != 0 or time[3] == 0 or time[3] == 12): + self.is_simcard_identify = self.alipay.start_simcard_identify() + print("is_simcard_identify:%d"%self.is_simcard_identify) + + #if self.is_simcard_identify == 0 and EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and self.is_init != 0: + if self.is_simcard_identify == 0 and self.is_init != 0: + id2_st = bytearray([0]) + id2_ret = self.alipay.id2_init() + print("id2_ret:%d"%id2_ret) + self.alipay.id2_check_status(id2_st) + print("id2_st:",str(id2_st)) + if id2_st[0] != 1: + return + self.is_init = self.alipay.pay_init(90000, 90000,\ + 2000, 2000, \ + 200, 40*1024, \ + self.upay_display_notify_cb, 0) + #alipay.pay_init(90000, 90000,2000, 2000,200, 40*1024,upay_display_notify_cb, 0) + print("self.is_pay_init:%d"%self.is_init) + if self.is_init == 0 : + self.alipay.enable_collectioncode(1) + + def upay_display_notify_cb(self,arg): + #print("upay_display_notify_cb!!!!!!!!!!!!!!!!!!!!") + cmd = arg[0] + rsp_code = arg[1] + result = arg[2] + result_len = arg[3] + userdata = arg[4] + print("upay_display_notify_cb:\r\ncmd:{}\r\nrsp_code:{}".format(cmd,rsp_code)) + + if rsp_code == 4 : + # 打印获取到的绑定码 + print("bindcode[%d]: %s\n"%(result_len, result)) + #查询绑定结果 + utime.sleep_ms(5000); + cmd_t = 2 #UPAY_MSG_GET_BINDING_RESULT; + userdata_t = None + args = None + ret = self.alipay.msg_send(cmd_t,args,userdata_t) + #EventMesh.subscribe("get_binding_code", self.get_binding_code) + #EventMesh.publish("load_screen", {"screen": "alipay_invite","meta":{"result":result,"result_len":result_len}}) + EventMesh.publish("load_screen", {"screen": "alipay_invite","meta":str(result)}) + + #case UPAY_RSP_PROCESSING: + elif rsp_code == 1: + #轮询绑定结果 + if cmd == 2 : + print("upay_display_notify_cb: bind processing\n") + + elif rsp_code == 5: + #获取付款码回调 + print("upay_display_notify_cb: paycode[%d]: %s\n"%( result_len, result)) + EventMesh.publish("load_screen", {"screen": "alipay_paycode","meta":str(result)}) + + # 查询付款结果 + print("upay_display_notify_cb: get payment result\n") + utime.sleep_ms(5000) + cmd_t = 4 + userdata_t = None + args = None + ret = self.alipay.msg_send(cmd_t,args,userdata_t) + + elif rsp_code == 6: + #打印获取到的收款码 + print("upay_display_notify_cb: collectioncode[%d]: %s\n"%(result_len, result)) + EventMesh.publish("load_screen", {"screen": "alipay_collect","meta":str(result)}) + utime.sleep_ms(5000) + + elif rsp_code == 7: + #打印家长控制码 + print("upay_display_notify_cb: parentctrlcode[%d]: %s\n"%(result_len, result) ) + EventMesh.publish("load_screen", {"screen": "alipay_parent","meta":str(result)}) + + + elif rsp_code == 8: + #付款结果 + print("upay_display_notify_cb: order result, bitmap size %d\n"%(result_len)) + EventMesh.publish("load_screen", {"screen": "alipay_pay_success","meta":str(result)}) + + elif rsp_code == 3: + #绑定成功 + print("upay_display_notify_cb: bind complete\n") + EventMesh.publish("load_screen", {"screen": "alipay_success"}) + + self.upay_bound = 1 + + elif rsp_code == 2: + # 绑定进度 + print("upay_display_notify_cb: bind progress %s\n"%(str(result))) + EventMesh.publish("load_screen", {"screen": "alipay_inviting"}) + + elif rsp_code == 11: + # 解绑成功 + print("upay_display_notify_cb: unbind complete\n") + + + elif rsp_code == 9: + #主扫码解析结果 + print("%s: recv scancode info\n") + #upay_scancode_info_t *scancode_info = (upay_scancode_info_t *)result + seller_name = result[10]#未验证 + amount = result[20]#未验证 + print("upay_display_notify_cb: seller name %s, amount %s\n"%(seller_name, amount)) + + #发起主扫支付 + cmd_t = 7 #UPAY_MSG_POST_SCAN_PAYMENT; + args = amount + userdata_t = None + print("upay_display_notify_cb: ---------------------------- post scan payment\n") + ret = self.alipay.msg_send(cmd_t,args,userdata_t) + + elif rsp_code == 20: + if cmd == 6 : + print("TODO:show 网络异常,请重试") + + elif rsp_code == 21: + if cmd == 6 : + print("TODO:show 二维码无法识别") + + elif rsp_code == 46: + if cmd == 6 : + print("TODO:show 网络异常,请重试") + + elif rsp_code == 48: + if cmd == 6 : + print("TODO:show 网络异常,请重试") + + elif rsp_code == 37: + if cmd == 6 : + print("TODO:show 网络异常,请重试") + + elif rsp_code == 49: + if cmd == 6: + print("TODO:show 网络异常,请重试") + + elif rsp_code == 50: + if cmd == 6: + print("TODO:show 网络异常,请重试") + + elif rsp_code == 10: + #发起主扫支付结果 + print("upay_display_notify_cb: post scan payment complete\n") + + elif rsp_code == 18: + # 发起主扫支付结果 + print("upay_display_notify_cb: post scan payment failed\n") + + elif rsp_code == 19: + # 发起主扫支付结果 + print("upay_display_notify_cb: post scan payment failed\n") + + elif rsp_code == 42: + #发起主扫支付结果 + print("upay_display_notify_cb: post scan payment failed\n") + + elif rsp_code == 43: + # 发起主扫支付结果 + print("upay_display_notify_cb: post scan payment failed\n") + + elif rsp_code == 44: + # 服务端已解绑 + print("upay_display_notify_cb: not bind !\n") + + def get_binding_code(self, event, msg): + return self.result + + def get_payment_code(self, event, msg): + if self.is_init == 0 : + args = "" + userdata = "" + ret = self.alipay.msg_send(3,args,userdata) + + def get_collect_code(self, event, msg): + if self.is_init == 0 : + args = "" + userdata = "" + ret = self.alipay.msg_send(5,args,userdata) + + def get_parent_code(self, event, msg): + if self.is_init == 0 : + args = "" + userdata = "" + ret = self.alipay.msg_send(8,args,userdata) + + + def alipay_1(self, event, msg): + #本地判断是否绑定 + check_bind = self.alipay.check_bind_status() + check_bind_online = self.alipay.check_bind_status() + print("check_bind:{} check_bind_online:{}".format(check_bind,check_bind_online)) + if check_bind == 4: #已绑定 + EventMesh.publish("load_screen", {"screen": "alipay_1_1"}) + # if self.is_init == 0 : + # args = "" + # userdata = "" + # ret = self.alipay.msg_send(3,args,userdata) #发送获取付款码消息 + # ret = self.alipay.msg_send(5,args,userdata) #发送获取收款码消息 + elif check_bind == 5: #未绑定 + #EventMesh.publish("load_screen", {"screen": "alipay_invite"}) + if self.is_init == 0 : + # bindcode = bytearray(500) + # bindcode_len = bytearray([500]) + # self.alipay.get_bindcode(bindcode,bindcode_len) + # print("len:{} qrcode:{}".format(bindcode_len,bindcode)) + # self.timer_Alipay_check.start(2000, 1, self.timeout_Alipay_check_cb) + args = "" + userdata = "" + print("--000--") + ret = self.alipay.msg_send(1,args,userdata) #发送获取绑定码消息 + print("alipay_1 send msg:HELIOS_PAY_MSG_GET_BIND_CODE:{}".format(ret)) + else : + print("check bind error!!!") + + def timeout_Alipay_check_cb(self, *args, **kwargs): + + ret = self.alipay.query_bind_result() + print("query_bind_result:{}".format(ret)) + +style_alipay_screen_default = lv.style_t() +style_alipay_screen_default.init() +style_alipay_screen_default.set_radius(0) +style_alipay_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) +style_alipay_screen_default.set_bg_opa(255) +style_alipay_screen_default.set_border_width(0) +style_alipay_screen_default.set_pad_left(0) +style_alipay_screen_default.set_pad_right(0) +style_alipay_screen_default.set_pad_top(0) +style_alipay_screen_default.set_pad_bottom(0) + +style_alipay_img_default = lv.style_t() +style_alipay_img_default.init() +style_alipay_img_default.set_img_opa(255) +style_alipay_img_default.set_img_recolor_opa(0) +style_alipay_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) + +class AlipayOpenScreen(Screen): + NAME = "alipay_open" + #打开支付宝 + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #进入图片 + self.watchface_mpsignal_img = lv.img(self.meta) + self.watchface_mpsignal_img.set_pos(int(70),int(80)) + self.watchface_mpsignal_img.set_size(100,100) + self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_mpsignal_img.set_src("E:/static/APP/alipay/1.jpg") + self.watchface_mpsignal_img.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + def initialization(self): + + pass + + def post_processor_after_initialization(self): + print("----init----") + EventMesh.publish("alipay_1") + pass + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_1_1(Screen): + NAME = "alipay_1_1" + #已绑定,显示功能列表 + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #付款码 + self.alipay_imgbtn_3 = lv.imgbtn(self.meta) + self.alipay_imgbtn_3.set_size(224, 68) + self.alipay_imgbtn_3.set_pos(8, 10) + self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_13.png", None, None) + self.alipay_imgbtn_3.add_event_cb(lambda e: self.alipay_paycode(e), + lv.EVENT.PRESSED, None) + + self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_13.png", None, None) + self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_13.png", None, None) + self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_13.png", None, None) + self.alipay_imgbtn_3.add_flag(lv.obj.FLAG.CHECKABLE) + self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED) + self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED) + + #收钱 + self.alipay_imgbtn_2 = lv.imgbtn(self.meta) + self.alipay_imgbtn_2.set_size(224, 69) + self.alipay_imgbtn_2.set_pos(8, 86) + self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_12.png", None, None) + self.alipay_imgbtn_2.add_event_cb(lambda e: self.alipay_collect(e), + lv.EVENT.PRESSED, None) + + self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_12.png", None, None) + self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_12.png", None, None) + self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_12.png", None, None) + self.alipay_imgbtn_2.add_flag(lv.obj.FLAG.CHECKABLE) + self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED) + self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED) + + #家长设置 + self.alipay_imgbtn_1 = lv.imgbtn(self.meta) + self.alipay_imgbtn_1.set_size(224, 69) + self.alipay_imgbtn_1.set_pos(8, 168) + + self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_11.png", None, None) + self.alipay_imgbtn_1.add_event_cb(lambda e: self.alipay_parent(e), + lv.EVENT.PRESSED, None) + self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_11.png", None, None) + self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_11.png", None, None) + self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_11.png", None, None) + self.alipay_imgbtn_1.add_flag(lv.obj.FLAG.CHECKABLE) + self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED) + self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED) + + def initialization(self): + pass + + def post_processor_after_initialization(self): + pass + + def Close(self): + pass + + def alipay_paycode(self,e): + # Alipay.alipay.msg_send(3,"","") #发送获取付款码消息 + + EventMesh.publish("get_payment_code") + + def alipay_collect(self,e): + EventMesh.publish("get_collect_code") + # EventMesh.publish("load_screen", {"screen": "alipay_collect"}) + + def alipay_parent(self,e): + EventMesh.publish("get_parent_code") + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_invite(Screen): + NAME = "alipay_invite" + #未绑定,获取二维码显示 + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #背景 + self.bg = lv.img(self.meta) + self.bg.center() + self.bg.set_size(240,240) + self.bg.set_src("E:/static/APP/alipay/1_2.jpg") + self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #提示词 + self.label = lv.label(self.bg) + self.label.set_pos(6, 8) + self.label.set_size(228, 48) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("请家长用手机支付宝扫一扫") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #二维码 + self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) + self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) + + self.alipay_qr = lv.qrcode(self.bg, 150, self.fg_color, self.bg_color) + self.alipay_qr.set_pos(41,67) + # Add a border with bg_color + self.alipay_qr.set_style_border_color(self.bg_color, 0) + self.alipay_qr.set_style_border_width(5, 0) + + + + def initialization(self): + pass + + def post_processor_after_initialization(self): + # 二维码数据 + self.alipay_qr_data = str(self.meta_info) + print("alipay_invite:",str(self.meta_info)) + self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) + + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_inviting(Screen): + NAME = "alipay_inviting" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + # self.bg = lv.img(self.meta) + # self.bg.set_pos(80,54) + # self.bg.set_size(80,80) + # self.bg.set_src("E:/static/APP/alipay/loading.jpg") + # self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #提示词 + self.label = lv.label(self.meta) + self.label.set_pos(30, 158) + self.label.set_size(180, 24) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("绑定中,不要走开") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + def initialization(self): + pass + + def post_processor_after_initialization(self): + pass + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +# class Alipay_default(Screen): +# NAME = "alipay_default" + +# def __init__(self): +# super().__init__() +# self.meta = lv.obj() +# self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) +# # add style for watchface +# self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + +# #背景 +# self.bg = lv.img(self.meta) +# self.bg.set_pos(56,30) +# self.bg.set_size(240,240) +# self.bg.set_src("E:/static/APP/alipay/1_2_2.png") +# self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + +# #提示词 +# self.label = lv.label(self.meta) +# self.label.set_pos(68, 168) +# self.label.set_size(104, 29) +# self.label.set_long_mode(lv.label.LONG.WRAP) +# self.label.set_text("绑定失败") +# self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +# self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# def initialization(self): +# pass + +# def Close(self): +# pass + +# def btn1_release(self): +# EventMesh.publish("load_screen", {"screen": "main_menu"}) + +# def btn8_press(self): +# EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_success(Screen): + NAME = "alipay_success" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #背景 + self.bg = lv.img(self.meta) + self.bg.set_pos(56,30) + self.bg.set_size(128,127) + self.bg.set_src("E:/static/APP/alipay/1_2_1.png") + self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #提示词 + self.label = lv.label(self.meta) + self.label.set_pos(68, 168) + self.label.set_size(104, 29) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("绑定成功") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + def initialization(self): + pass + + def post_processor_after_initialization(self): + pass + + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_paycode(Screen): + NAME = "alipay_paycode" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.alipay_paycode = lv.tileview(self.meta) + self.alipay_paycode.center() + self.alipay_paycode.set_size(240, 320) + self.alipay_paycode.add_style(style_alipay_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) + + # 1 - 条形码界面 + self.alipay_barcode = self.alipay_paycode.add_tile(0, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + #椭圆背景 + self.cont = lv.obj(self.alipay_barcode) + self.cont.set_size(240,220) + self.cont.set_pos(0,21) + self.cont.add_style(style_cont_alipay, lv.PART.MAIN | lv.STATE.DEFAULT) + + + #提示词 + self.label = lv.label(self.alipay_barcode) + self.label.set_pos(10, 33) + self.label.set_size(220, 24) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("收银员扫一扫,完成付款") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + #条形码 + self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) + self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) + self.alipay_bar = lv.qrcode(self.alipay_barcode, 150, self.fg_color, self.bg_color) + self.alipay_bar.set_pos(33,61) + self.alipay_bar.set_style_border_color(self.bg_color, 0) + self.alipay_bar.set_style_border_width(5, 0) + + #编号 + + # 2 - 二维码界面 + self.alipay_qrcode = self.alipay_paycode.add_tile(1, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + #白色背景 + + #提示词 + self.label1 = lv.label(self.alipay_qrcode) + self.label1.set_pos(10, 33) + self.label1.set_size(220, 24) + self.label1.set_long_mode(lv.label.LONG.WRAP) + self.label1.set_text("收银员扫一扫,完成付款") + self.label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + #二维码 + + self.alipay_qr = lv.qrcode(self.alipay_qrcode, 150, self.fg_color, self.bg_color) + self.alipay_qr.set_pos(33,61) + self.alipay_qr.set_style_border_color(self.bg_color, 0) + self.alipay_qr.set_style_border_width(5, 0) + + + def post_processor_after_initialization(self): + self.alipay_qr_data = str(self.meta_info) + print("alipay_paycode:",str(self.meta_info)) + self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) + self.alipay_bar.update(self.alipay_qr_data,len(self.alipay_qr_data)) + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_pay_success(Screen): + NAME = "alipay_pay_success" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #支付成功LOGO + self.bg = lv.img(self.meta) + self.bg.center() + self.bg.set_size(240,240) + self.bg.set_src("E:/static/APP/alipay/1_13_1_1.png") + self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #付款金额 + self.label = lv.label(self.meta) + self.label.set_pos(78, 114) + self.label.set_size(84, 43) + self.label.set_long_mode(lv.label.LONG.WRAP) + + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #完成按钮 + self.btn = lv.btn(self.meta) + self.btn.set_size(224,58) + self.btn.set_pos(8,174) + self.btn.remove_style_all() + self.btn.add_style(style_btn_alipay,0) + + self.label_btn = lv.label(self.btn) + self.label_btn.set_text("支付完成") + self.label_btn.center() + self.label_btn.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + def post_processor_after_initialization(self): + print("money:",str(self.meta_info)) + self.label.set_text(str(self.meta_info)) + + + def initialization(self): + pass + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class Alipay_collect(Screen): + NAME = "alipay_collect" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #二维码 + self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) + self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) + + self.alipay_qr = lv.qrcode(self.meta, 150, self.fg_color, self.bg_color) + self.alipay_qr.set_pos(33,22) + # Add a border with bg_color + self.alipay_qr.set_style_border_color(self.bg_color, 0) + self.alipay_qr.set_style_border_width(5, 0) + + #提示词 + self.label = lv.label(self.meta) + self.label.set_pos(20, 204) + self.label.set_size(200, 24) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("请对方使用支付宝扫码") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + def initialization(self): + pass + + def post_processor_after_initialization(self): + self.alipay_qr_data = str(self.meta_info) + print("alipay_collect:",str(self.meta_info)) + self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class Alipay_parent(Screen): + NAME = "alipay_parent" + + def __init__(self): + super().__init__() + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #家长头像 + self.bg = lv.img(self.meta) + self.bg.set_pos(8,12) + self.bg.set_size(81,81) + self.bg.set_src("E:/static/APP/alipay/1_11_1.png") + self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #提示词 + self.label = lv.label(self.meta) + self.label.set_pos(104, 12) + self.label.set_size(96, 29) + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_text("家长设置") + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.label1 = lv.label(self.meta) + self.label1.set_pos(100, 43) + self.label1.set_size(120, 29) + self.label1.set_long_mode(lv.label.LONG.WRAP) + self.label1.set_text("零花钱管理") + self.label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.label2 = lv.label(self.meta) + self.label2.set_pos(100, 71) + self.label2.set_size(120, 29) + self.label2.set_long_mode(lv.label.LONG.WRAP) + self.label2.set_text("解绑退钱") + self.label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #家长码 + self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) + self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) + + self.alipay_qr = lv.qrcode(self.meta, 150, self.fg_color, self.bg_color) + self.alipay_qr.set_pos(8,171) + # Add a border with bg_color + self.alipay_qr.set_style_border_color(self.bg_color, 0) + self.alipay_qr.set_style_border_width(5, 0) + + + def initialization(self): + pass + + def post_processor_after_initialization(self): + self.alipay_qr_data = str(self.meta_info) + print("alipay_parent:",str(self.meta_info)) + self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) + + def Close(self): + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) \ No newline at end of file diff --git a/3.code/1.watch/2.code/btn_device_ec800m.py b/3.code/1.watch/2.code/btn_device_ec800m.py new file mode 100644 index 00000000..e893a9fd --- /dev/null +++ b/3.code/1.watch/2.code/btn_device_ec800m.py @@ -0,0 +1,76 @@ +from ext.common import Abstract +import machine +import osTimer +from misc import PowerKey +from ext import EventMesh +from machine import Pin + + +class BtnDevice(Abstract): + + def __init__(self, tp=None): + self.pk = PowerKey() + self.__pwk_timer = osTimer() + self.keypad = machine.KeyPad(1, 1) + self.__PowerDownTimeOut = 2000 + self.__tp = tp + + def post_processor_after_instantiation(self): + self.keypad.init() + self.keypad.set_callback(self.key_callback) + self.pk.powerKeyEventRegister(self.pwk_callback) + if self.__tp: + self.__tp.set_callback(self.__ui_callback) + + def __ui_callback(self, para): + print("para = {}".format(para)) + if para == 0: + EventMesh.publish("done_left_to_right") + print("<-") + elif para == 1: + EventMesh.publish("done_right_to_left") + print("->") + elif para == 2: + EventMesh.publish("done_bottom_to_top") + print("^") + elif para == 3: + EventMesh.publish("done_top_to_bottom") + print("V") + elif para == 4: + EventMesh.publish("done_return") + print("return") + elif para == 5: + EventMesh.publish("done_click") + print("CLICK") + elif (para == 6): + EventMesh.publish("done_error") + print("error") + + def key_callback(self, l_list): + #print("key_callback:",str(l_list)) + if l_list[0] == 1: + # 马达震动预留 + pass + if (l_list[1] == 1) and (l_list[2] == 0): + if l_list[0] == 1: + EventMesh.publish("btn1_press") + else: + EventMesh.publish("btn1_release") + + + + def pwk_callback(self, status): + print('==pwr:', status) + if status == 1: + self.__pwk_timer.start(self.__PowerDownTimeOut, 0, self.__pwk_long_press_cb) + elif status == 0: + self.__pwk_timer.stop() + # print("btn_back:{}".format(mdls.screen_size_style[mdls.models][1])) + EventMesh.publish("btn8_press") + + def __pwk_long_press_cb(self, *args): + '''KEY2:联动屏幕右下角或返回键长按关机''' + EventMesh.publish("btn8_long_press") + + def start(self): + self.post_processor_after_instantiation() diff --git a/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py b/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py new file mode 100644 index 00000000..b99420f4 --- /dev/null +++ b/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py @@ -0,0 +1,977 @@ +""" +*Name : capacitive_hynitron_cst816d_update.h +*Author : gary +*Version : V1.0 +*Copyright : Hynitron +*ProjectName : CSW_2211527_CST816D_COB_ZT_YAT_K5_G1_JL_55028.hex Modify at 2022-11-21 17:57:42 +""" + +app_bin_816d = [ +0x00, 0x00, 0x00, 0x3c, 0x78, 0xa8, +0x02, 0x1f, 0xc9, 0x7f, 0x00, 0x22, 0x02, 0x34, 0x9c, 0x22, 0x00, 0x00, 0x02, 0x33, 0xd2, 0x02, +0x33, 0x5f, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0x75, 0xf0, 0x05, 0xe5, 0x21, 0x02, 0x0c, 0xa0, +0x00, 0x02, 0x28, 0xf5, 0x8f, 0x22, 0xe5, 0x09, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0x70, 0x03, +0x02, 0x07, 0x77, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, +0x63, 0xe0, 0xc3, 0x9f, 0x50, 0x58, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x54, 0xfe, +0xf0, 0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0xf0, 0xe5, 0x09, 0x24, 0x13, +0x12, 0x12, 0x63, 0xe4, 0xf0, 0x12, 0x12, 0x6e, 0x12, 0x13, 0x2c, 0x24, 0x1b, 0x12, 0x12, 0x63, +0x12, 0x12, 0x6b, 0x12, 0x13, 0x2a, 0x24, 0x1d, 0x12, 0x12, 0x29, 0x12, 0x12, 0x6b, 0x12, 0x13, +0x2c, 0x24, 0x15, 0x12, 0x12, 0x63, 0x12, 0x12, 0x6b, 0x12, 0x13, 0x2a, 0x24, 0x17, 0x12, 0x12, +0x63, 0x12, 0x14, 0x46, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0x02, 0x01, 0xe1, 0xe5, 0x09, +0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x30, 0xe0, 0x03, 0x02, 0x01, 0x3f, 0xe5, 0x09, 0x24, 0x1b, +0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x12, 0x70, 0x12, 0x13, 0xe9, 0xf5, 0x28, +0xec, 0x9e, 0xf5, 0x27, 0xe5, 0x09, 0x24, 0x1d, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, +0x12, 0x12, 0x70, 0x12, 0x13, 0xe7, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0x12, 0x12, 0x89, 0x74, +0x19, 0x93, 0xff, 0xe4, 0x8f, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0xf5, 0x33, 0x12, 0x13, 0x62, 0x90, +0x02, 0xb8, 0xe0, 0x24, 0x01, 0xff, 0xe4, 0x33, 0xfe, 0x12, 0x13, 0xc6, 0x8f, 0x36, 0x8e, 0x35, +0x8d, 0x34, 0x8c, 0x33, 0xaf, 0x2a, 0xae, 0x29, 0x12, 0x2b, 0x6f, 0xc0, 0x06, 0xc0, 0x07, 0xaf, +0x28, 0xae, 0x27, 0x12, 0x2b, 0x6f, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x12, 0x13, +0x5d, 0xc3, 0x12, 0x0c, 0x2e, 0x50, 0x0d, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x44, +0x01, 0xf0, 0x80, 0x37, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x2a, 0x80, 0x2c, 0xe5, +0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x12, 0x70, 0x12, 0x13, +0xe9, 0xf5, 0x28, 0xec, 0x9e, 0xf5, 0x27, 0x12, 0x12, 0x5f, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, +0x12, 0x70, 0x12, 0x13, 0xe7, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0xe5, 0x09, 0x24, 0x11, 0x12, +0x12, 0x63, 0x12, 0x13, 0x56, 0xe5, 0x28, 0x9f, 0xfd, 0xe5, 0x27, 0x9e, 0xfc, 0xef, 0x78, 0x02, +0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0x12, +0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x28, 0x8e, 0x27, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0x12, +0x13, 0x56, 0xe5, 0x2a, 0x9f, 0xfd, 0xe5, 0x29, 0x9e, 0xfc, 0xef, 0x78, 0x02, 0xc3, 0x33, 0xce, +0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0x12, 0x14, 0x01, 0xd8, +0xfb, 0xf5, 0x2a, 0x8e, 0x29, 0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0xe5, 0x27, 0xf0, 0xa3, +0xe5, 0x28, 0xf0, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0xe5, 0x29, 0xf0, 0xa3, 0xe5, 0x2a, +0xf0, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, +0xc3, 0x9f, 0x50, 0x03, 0x02, 0x07, 0x35, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0xe0, 0xfe, +0xa3, 0xe0, 0x25, 0x28, 0xff, 0xe5, 0x27, 0x3e, 0xfe, 0x12, 0x13, 0x7c, 0x12, 0x12, 0x70, 0x12, +0x14, 0x08, 0x12, 0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x24, 0x8e, 0x23, 0x12, 0x12, 0x5f, 0xe0, 0xfe, +0xa3, 0xe0, 0x25, 0x2a, 0xff, 0xe5, 0x29, 0x3e, 0xfe, 0x12, 0x13, 0x7c, 0x12, 0x12, 0x70, 0xa3, +0xa3, 0x12, 0x14, 0x08, 0x12, 0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x26, 0x8e, 0x25, 0xc3, 0xe5, 0x24, +0x94, 0x01, 0xe5, 0x23, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x75, 0x23, 0x00, 0x75, 0x24, 0x01, +0x80, 0x1d, 0x12, 0x12, 0x89, 0x74, 0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 0xff, 0xd3, 0x95, 0x24, +0xee, 0x95, 0x23, 0x50, 0x0a, 0xef, 0x24, 0xff, 0xf5, 0x24, 0xee, 0x34, 0xff, 0xf5, 0x23, 0xc3, +0xe5, 0x26, 0x94, 0x01, 0xe5, 0x25, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x75, 0x25, 0x00, 0x75, +0x26, 0x01, 0x80, 0x1d, 0x12, 0x12, 0x89, 0x74, 0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0xd3, +0x95, 0x26, 0xee, 0x95, 0x25, 0x50, 0x0a, 0xef, 0x24, 0xff, 0xf5, 0x26, 0xee, 0x34, 0xff, 0xf5, +0x25, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x09, 0x24, +0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x50, 0x5d, +0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0x12, 0x07, 0xc9, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, +0xfd, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, +0x12, 0x13, 0xd7, 0x12, 0x14, 0x15, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0x12, 0x07, 0xc9, +0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xfd, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, +0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 0x12, 0x12, 0xf4, 0xf5, 0x83, 0x12, 0x14, 0x15, 0x75, 0x3b, +0x00, 0x75, 0x3c, 0x5a, 0x75, 0x3d, 0x00, 0x75, 0x3e, 0x5a, 0x02, 0x05, 0x45, 0xe5, 0x09, 0x24, +0x11, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, 0x6f, 0x8e, 0x46, 0x8f, 0x47, +0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, 0x6f, 0x8e, +0x48, 0x8f, 0x49, 0xd3, 0xe5, 0x47, 0x94, 0xff, 0xe5, 0x46, 0x94, 0x00, 0x40, 0x06, 0x75, 0x46, +0x00, 0x75, 0x47, 0xff, 0xd3, 0xe5, 0x49, 0x94, 0xff, 0xe5, 0x48, 0x94, 0x00, 0x40, 0x06, 0x75, +0x48, 0x00, 0x75, 0x49, 0xff, 0x85, 0x46, 0x3f, 0x85, 0x47, 0x40, 0x85, 0x48, 0x41, 0x85, 0x49, +0x42, 0x75, 0x45, 0x09, 0x12, 0x12, 0xa5, 0xe0, 0x25, 0x40, 0xf5, 0x40, 0xe4, 0x35, 0x3f, 0xf5, +0x3f, 0x12, 0x12, 0xf4, 0x12, 0x12, 0xb2, 0xe0, 0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x41, 0xf5, +0x41, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbe, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0x12, 0x12, +0xb2, 0xe0, 0xff, 0x12, 0x12, 0xa5, 0xef, 0xf0, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xd2, +0xf5, 0x82, 0xe4, 0x34, 0x02, 0x12, 0x12, 0xb2, 0xe0, 0xff, 0x12, 0x12, 0xf4, 0x12, 0x12, 0xb2, +0xef, 0xf0, 0x15, 0x45, 0xe5, 0x45, 0x70, 0xac, 0x12, 0x13, 0xd7, 0xe5, 0x47, 0xf0, 0x12, 0x12, +0xf4, 0xf5, 0x83, 0xe5, 0x49, 0xf0, 0xd3, 0xe5, 0x40, 0x95, 0x42, 0xe5, 0x3f, 0x95, 0x41, 0x40, +0x26, 0x75, 0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x41, 0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, +0x75, 0x4f, 0x3f, 0x75, 0x50, 0x00, 0x75, 0x51, 0x00, 0x75, 0x52, 0x3b, 0x75, 0x53, 0x00, 0x75, +0x54, 0x00, 0x75, 0x55, 0x3d, 0x80, 0x24, 0x75, 0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x3f, +0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, 0x75, 0x4f, 0x41, 0x75, 0x50, 0x00, 0x75, 0x51, 0x00, 0x75, +0x52, 0x3d, 0x75, 0x53, 0x00, 0x75, 0x54, 0x00, 0x75, 0x55, 0x3b, 0x12, 0x14, 0x64, 0x45, 0xf0, +0x70, 0x06, 0x75, 0xf0, 0x01, 0x12, 0x0a, 0xc5, 0xab, 0x4d, 0xaa, 0x4e, 0xa9, 0x4f, 0x12, 0x0a, +0x15, 0xae, 0xf0, 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x12, 0x14, 0x64, +0xfd, 0xac, 0xf0, 0x12, 0x09, 0x74, 0x8e, 0x43, 0x8f, 0x44, 0xe5, 0x09, 0x24, 0x0b, 0x12, 0x12, +0x63, 0x12, 0x13, 0x77, 0xe5, 0x44, 0x2f, 0xff, 0xe5, 0x43, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, +0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x44, 0x8e, 0x43, 0xc3, 0x94, 0x28, 0xe5, 0x43, 0x94, +0x00, 0x50, 0x08, 0x75, 0x43, 0x00, 0x75, 0x44, 0x28, 0x80, 0x11, 0xd3, 0xe5, 0x44, 0x94, 0x46, +0xe5, 0x43, 0x94, 0x00, 0x40, 0x06, 0x75, 0x43, 0x00, 0x75, 0x44, 0x46, 0xae, 0x43, 0xaf, 0x44, +0x7c, 0x00, 0x7d, 0x0a, 0x12, 0x09, 0x62, 0xef, 0x24, 0xca, 0xff, 0xee, 0x34, 0xfe, 0xab, 0x53, +0xaa, 0x54, 0xa9, 0x55, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0xe5, 0x44, 0x25, 0xe0, 0xff, 0xe5, 0x43, +0x33, 0xfe, 0xc3, 0x74, 0xaa, 0x9f, 0xff, 0xe4, 0x9e, 0xab, 0x50, 0xaa, 0x51, 0xa9, 0x52, 0x8f, +0xf0, 0x12, 0x0a, 0xc5, 0xe5, 0x09, 0x24, 0x0b, 0x12, 0x12, 0x63, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, +0x44, 0xf0, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7d, 0x03, +0x12, 0x09, 0x62, 0xe5, 0x3c, 0x2f, 0xff, 0xe5, 0x3b, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, +0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3c, 0x8e, 0x3b, 0xe5, 0x09, 0x24, 0x0f, 0x12, 0x12, 0x63, +0x12, 0x13, 0x77, 0xe5, 0x3e, 0x2f, 0xff, 0xe5, 0x3d, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, +0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3e, 0x8e, 0x3d, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, +0xe5, 0x3b, 0xf0, 0xa3, 0xe5, 0x3c, 0xf0, 0xe5, 0x09, 0x24, 0x0f, 0x12, 0x12, 0x63, 0xe5, 0x3d, +0xf0, 0xa3, 0xe5, 0x3e, 0xf0, 0x12, 0x12, 0x5f, 0x12, 0x07, 0xd2, 0x7c, 0x00, 0x7d, 0x02, 0x12, +0x09, 0xc9, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x07, 0xe2, +0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0, 0x8f, 0x36, 0x8e, 0x35, 0xf5, +0x34, 0xf5, 0x33, 0xad, 0x34, 0xac, 0x33, 0x12, 0x12, 0x78, 0x12, 0x14, 0x2f, 0xe5, 0x36, 0x2f, +0xf5, 0x36, 0xe5, 0x35, 0x3e, 0xf5, 0x35, 0xe5, 0x34, 0x3d, 0xf5, 0x34, 0xe5, 0x33, 0x3c, 0xf5, +0x33, 0xae, 0x3b, 0xaf, 0x3c, 0xe4, 0xfc, 0xfd, 0x12, 0x13, 0x62, 0xd3, 0x12, 0x0c, 0x2e, 0x40, +0x0b, 0xe4, 0x85, 0x3c, 0x36, 0x85, 0x3b, 0x35, 0xf5, 0x34, 0xf5, 0x33, 0xc3, 0xe5, 0x3c, 0x95, +0x36, 0xfb, 0xe5, 0x3b, 0x95, 0x35, 0xfa, 0xe4, 0x95, 0x34, 0xf9, 0xe4, 0x95, 0x33, 0xf8, 0xe5, +0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x13, 0xc1, 0x8f, 0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, +0x2b, 0xae, 0x23, 0xaf, 0x24, 0xee, 0x12, 0x13, 0x5d, 0x12, 0x0b, 0x11, 0xef, 0x25, 0x2e, 0xff, +0xee, 0x35, 0x2d, 0xfe, 0xed, 0x35, 0x2c, 0xfd, 0xec, 0x35, 0x2b, 0xfc, 0x12, 0x13, 0x6e, 0xe5, +0x3b, 0xc3, 0x13, 0xfe, 0xe5, 0x3c, 0x12, 0x13, 0x34, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3b, 0xaf, +0x3c, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, 0x8f, +0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x07, +0xe2, 0x7c, 0x00, 0x7d, 0x02, 0x12, 0x09, 0xc9, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, 0x5f, 0x12, +0x07, 0xd2, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0, 0x8f, 0x3a, 0x8e, +0x39, 0xf5, 0x38, 0xf5, 0x37, 0xad, 0x38, 0xac, 0x37, 0x12, 0x12, 0x78, 0x12, 0x14, 0x2f, 0xe5, +0x3a, 0x2f, 0xf5, 0x3a, 0xe5, 0x39, 0x3e, 0xf5, 0x39, 0xe5, 0x38, 0x3d, 0xf5, 0x38, 0xe5, 0x37, +0x3c, 0xf5, 0x37, 0xae, 0x3d, 0xaf, 0x3e, 0xe4, 0xfc, 0xfd, 0xab, 0x3a, 0xaa, 0x39, 0xa9, 0x38, +0xa8, 0x37, 0xd3, 0x12, 0x0c, 0x2e, 0x40, 0x0b, 0xe4, 0x85, 0x3e, 0x3a, 0x85, 0x3d, 0x39, 0xf5, +0x38, 0xf5, 0x37, 0xc3, 0xe5, 0x3e, 0x95, 0x3a, 0xfb, 0xe5, 0x3d, 0x95, 0x39, 0xfa, 0xe4, 0x95, +0x38, 0xf9, 0xe4, 0x95, 0x37, 0xf8, 0x12, 0x12, 0x5f, 0x12, 0x13, 0xc1, 0x8f, 0x32, 0x8e, 0x31, +0x8d, 0x30, 0x8c, 0x2f, 0xae, 0x25, 0xaf, 0x26, 0xee, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0xab, 0x3a, +0xaa, 0x39, 0xa9, 0x38, 0xa8, 0x37, 0x12, 0x0b, 0x11, 0xef, 0x25, 0x32, 0xff, 0xee, 0x35, 0x31, +0xfe, 0xed, 0x35, 0x30, 0xfd, 0xec, 0x35, 0x2f, 0xfc, 0x12, 0x13, 0x6e, 0xe5, 0x3d, 0xc3, 0x13, +0xfe, 0xe5, 0x3e, 0x12, 0x13, 0x34, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3d, 0xaf, 0x3e, 0xab, 0x07, +0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, 0x8f, 0x32, 0x8e, 0x31, +0x8d, 0x30, 0x8c, 0x2f, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x30, 0xe0, 0x11, 0x12, +0x12, 0x70, 0xe5, 0x2d, 0xf0, 0xa3, 0xe5, 0x2e, 0x12, 0x12, 0x6f, 0xa3, 0xa3, 0xee, 0x80, 0x21, +0xe5, 0x09, 0x24, 0x1b, 0x12, 0x12, 0x63, 0xe0, 0xff, 0xa3, 0xe0, 0x12, 0x12, 0x70, 0xcf, 0x12, +0x14, 0x47, 0x24, 0x1d, 0x12, 0x12, 0x63, 0xe0, 0xff, 0xa3, 0xe0, 0x12, 0x12, 0x70, 0xa3, 0xa3, +0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x13, 0x2c, 0x24, +0x15, 0x12, 0x12, 0x63, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x12, 0x5f, 0x12, 0x13, 0x2c, 0x24, +0x17, 0x12, 0x12, 0x29, 0x12, 0x14, 0x46, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x94, 0x14, +0x50, 0x0a, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0x04, 0xf0, 0xe5, 0x09, 0x24, 0x0a, +0x12, 0x12, 0x63, 0x74, 0x01, 0xf0, 0x22, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0xd3, +0x94, 0x00, 0x40, 0x0a, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x14, 0xf0, 0xe5, 0x09, +0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x70, 0x30, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe4, +0xf0, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x5a, 0xf0, 0xe5, 0x09, +0x24, 0x0f, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x5a, 0xf0, 0xe5, 0x09, 0x24, 0x0b, 0x12, +0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x28, 0xf0, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, +0x6f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x26, 0xff, 0xee, 0x95, 0x25, 0xfe, 0x12, 0x2b, +0x6f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x24, 0xff, 0xee, 0x95, 0x23, 0xfe, 0x12, 0x2b, +0x6f, 0x22, 0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, +0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, +0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, +0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, +0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, +0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, +0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, +0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, +0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, +0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, +0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, +0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, +0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, +0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, +0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, +0x23, 0x45, 0x82, 0x23, 0x90, 0x08, 0x42, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, +0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, +0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, +0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, +0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, +0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, +0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, +0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, +0xf2, 0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c, 0xf0, 0xa4, 0x28, 0xce, 0x8d, 0xf0, +0xa4, 0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29, 0xef, 0x8d, 0xf0, 0x84, 0xff, 0xad, +0xf0, 0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xec, 0x33, +0xfc, 0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d, 0xfe, 0x0f, 0xd5, 0xf0, 0xe9, 0xe4, +0xce, 0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20, 0xd2, 0x1c, 0xfe, 0xad, 0xf0, 0x75, +0xf0, 0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07, 0x98, 0x50, 0x06, 0xd5, 0xf0, 0xf2, +0x22, 0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xc2, 0xd5, 0xec, 0x30, 0xe7, 0x09, 0xb2, +0xd5, 0xe4, 0xc3, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0xee, 0x30, 0xe7, 0x15, 0xb2, 0xd5, 0xe4, 0xc3, +0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x12, 0x09, 0x74, 0xc3, 0xe4, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0x80, +0x03, 0x12, 0x09, 0x74, 0x30, 0xd5, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 0xc5, +0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, +0x83, 0xe0, 0x38, 0xf0, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, +0xe0, 0x22, 0x50, 0x06, 0x87, 0xf0, 0x09, 0xe7, 0x19, 0x22, 0xbb, 0xfe, 0x07, 0xe3, 0xf5, 0xf0, +0x09, 0xe3, 0x19, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xf5, 0xf0, 0x74, 0x01, 0x93, 0x22, +0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, +0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, +0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, +0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, 0xbb, 0x01, 0x0d, 0xc5, 0x82, 0x29, 0xc5, 0x82, +0xc5, 0x83, 0x3a, 0xc5, 0x83, 0x02, 0x09, 0xff, 0x50, 0x11, 0xc5, 0x82, 0x29, 0xf8, 0x08, 0xe5, +0xf0, 0x26, 0xf6, 0x18, 0xf5, 0xf0, 0xe5, 0x82, 0x36, 0xf6, 0x22, 0xbb, 0xfe, 0x11, 0xc5, 0x82, +0x29, 0xf8, 0x08, 0xe2, 0x25, 0xf0, 0xf5, 0xf0, 0xf2, 0x18, 0xe2, 0x35, 0x82, 0xf2, 0x22, 0xf8, +0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0x74, 0x01, 0x93, 0x25, 0xf0, 0xf5, +0xf0, 0xe4, 0x93, 0x38, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, +0xf0, 0x22, 0x50, 0x06, 0xf7, 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, +0x09, 0xf3, 0x19, 0x22, 0xf8, 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, +0xf5, 0x83, 0xe8, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, +0x08, 0xa6, 0xf0, 0x22, 0xbb, 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, +0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, 0x2c, 0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, +0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, 0xf0, 0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, +0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, 0xf0, 0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, +0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, 0xf0, 0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, +0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, 0x35, 0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, +0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, +0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, +0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, +0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, +0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, +0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, +0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, +0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, +0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, +0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, +0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, +0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, +0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, +0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, +0x60, 0x0f, 0xef, 0xc3, 0x33, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, +0xf1, 0x22, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe4, 0x93, +0xfc, 0x74, 0x01, 0x93, 0xfd, 0x74, 0x02, 0x93, 0xfe, 0x74, 0x03, 0x93, 0xff, 0x22, 0xe6, 0xfb, +0x08, 0xe6, 0xf9, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xcb, 0xf8, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, +0x08, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xe4, 0x93, 0xf6, 0x08, 0x74, +0x01, 0x93, 0xf6, 0x08, 0x74, 0x02, 0x93, 0xf6, 0x08, 0x74, 0x03, 0x93, 0xf6, 0x74, 0x04, 0x73, +0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xec, 0x8e, 0xf0, 0xa4, +0xcc, 0xc5, 0xf0, 0xcc, 0xcd, 0xf8, 0xef, 0xa4, 0xce, 0xc5, 0xf0, 0x2d, 0xfd, 0xe4, 0x3c, 0xfc, +0xe8, 0xa4, 0x2e, 0xc8, 0xc5, 0xf0, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xef, 0xa4, 0xff, 0xe5, 0xf0, +0x28, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0xef, 0x4e, 0x60, 0x12, 0xef, 0x60, 0x01, +0x0e, 0xed, 0xbb, 0x01, 0x0b, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x22, +0x89, 0xf0, 0x50, 0x07, 0xf7, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xbb, 0xfe, 0xfc, 0xf3, 0x09, +0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xe4, 0xf5, 0x23, 0xe5, 0x1e, 0x60, 0x07, 0xe5, 0x1f, 0x70, 0x03, +0x02, 0x0f, 0x70, 0xe5, 0x1f, 0x60, 0x07, 0xe5, 0x1e, 0x70, 0x03, 0x02, 0x0f, 0x70, 0xe5, 0x1e, +0x70, 0x03, 0x02, 0x0e, 0xd8, 0xe5, 0x1f, 0x70, 0x03, 0x02, 0x0e, 0xd8, 0xe5, 0x20, 0xd3, 0x94, +0x01, 0x40, 0x0a, 0x78, 0xa2, 0xe6, 0x94, 0x64, 0x50, 0x0c, 0x06, 0x80, 0x09, 0x78, 0xa1, 0xe6, +0xc3, 0x94, 0x64, 0x50, 0x01, 0x06, 0x78, 0x9e, 0xe6, 0x65, 0x20, 0x60, 0x12, 0xe4, 0x78, 0x9c, +0xf6, 0x78, 0x92, 0x12, 0x27, 0x98, 0x78, 0x90, 0xf6, 0x08, 0xf6, 0x78, 0x9e, 0xa6, 0x20, 0x78, +0x90, 0xe6, 0xff, 0x60, 0x13, 0xe5, 0x1e, 0x12, 0x0f, 0x82, 0x50, 0x0c, 0x78, 0x90, 0xe6, 0xff, +0xc3, 0xe5, 0x1e, 0x78, 0x93, 0x12, 0x27, 0xb4, 0x78, 0x90, 0xa6, 0x1e, 0x08, 0xe6, 0xff, 0x60, +0x13, 0xe5, 0x1f, 0x12, 0x0f, 0x82, 0x50, 0x0c, 0x78, 0x91, 0xe6, 0xff, 0xc3, 0xe5, 0x1f, 0x78, +0x95, 0x12, 0x27, 0xb4, 0x78, 0x91, 0xa6, 0x1f, 0x78, 0x96, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, +0x2b, 0x6f, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0f, 0x77, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x27, 0xd7, +0x40, 0x04, 0x78, 0x92, 0x80, 0x02, 0x78, 0x96, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x96, 0xa6, +0x06, 0x08, 0xa6, 0x07, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0xc0, 0x06, 0xc0, +0x07, 0x12, 0x0f, 0xa4, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x27, 0xd7, 0x40, 0x04, 0x78, 0x94, 0x80, +0x02, 0x78, 0x98, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x98, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xe4, +0x78, 0x9d, 0xf6, 0x78, 0xa3, 0xe6, 0x54, 0x3c, 0x60, 0x79, 0x12, 0x0f, 0x77, 0x12, 0x27, 0xee, +0x50, 0x08, 0x12, 0x0f, 0xa4, 0x12, 0x27, 0xee, 0x40, 0x69, 0x78, 0x90, 0xe6, 0x78, 0x94, 0x60, +0x0f, 0x12, 0x27, 0xcb, 0x78, 0x92, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x12, 0x09, 0xc9, 0x80, 0x03, +0x12, 0x27, 0xcb, 0x8e, 0x24, 0x8f, 0x25, 0xaf, 0x25, 0xae, 0x24, 0x12, 0x2b, 0x6f, 0xd3, 0xef, +0x95, 0x21, 0x74, 0x80, 0xf8, 0x6e, 0x98, 0x40, 0x1c, 0x78, 0xa3, 0xe6, 0x54, 0x0c, 0x60, 0x33, +0x78, 0x95, 0x12, 0x27, 0xe3, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x01, 0x12, 0x27, 0xa0, 0x30, 0xe1, +0x02, 0x7f, 0x0c, 0x80, 0x1a, 0x78, 0xa3, 0xe6, 0x54, 0x30, 0x60, 0x17, 0x78, 0x93, 0x12, 0x27, +0xe3, 0x7f, 0x03, 0x40, 0x02, 0x7f, 0x04, 0x12, 0x27, 0xa0, 0x30, 0xe2, 0x02, 0x7f, 0x30, 0x78, +0xa3, 0xa6, 0x07, 0x78, 0xa3, 0xe6, 0x30, 0xe1, 0x52, 0x90, 0x01, 0x9b, 0xe0, 0x60, 0x4c, 0x78, +0x92, 0x12, 0x0f, 0xaf, 0x50, 0x45, 0x78, 0x94, 0x12, 0x0f, 0xaf, 0x50, 0x3e, 0xe5, 0x20, 0x64, +0x01, 0x70, 0x18, 0x12, 0x27, 0xc2, 0x9f, 0x40, 0x12, 0x75, 0x23, 0x0c, 0x90, 0x01, 0xaa, 0xe0, +0x7f, 0x02, 0x30, 0xe0, 0x02, 0x7f, 0x00, 0x78, 0xa3, 0xa6, 0x07, 0xe5, 0x20, 0xd3, 0x94, 0x01, +0x40, 0x19, 0x12, 0x27, 0xc2, 0xd3, 0x9f, 0x40, 0x12, 0x75, 0x23, 0x1c, 0x90, 0x01, 0xaa, 0xe0, +0x7f, 0x02, 0x30, 0xe0, 0x02, 0x7f, 0x00, 0x78, 0xa3, 0xa6, 0x07, 0x78, 0x9c, 0xe6, 0x60, 0x03, +0x02, 0x0f, 0x70, 0x76, 0x01, 0x02, 0x0f, 0x70, 0x78, 0x9c, 0xe6, 0xff, 0x60, 0x4c, 0x78, 0xa3, +0xe6, 0x30, 0xe0, 0x22, 0xef, 0xd3, 0x94, 0x01, 0x40, 0x1c, 0x12, 0x27, 0xc2, 0x9f, 0x50, 0x16, +0x79, 0xa1, 0xe7, 0x78, 0xa2, 0x96, 0x40, 0x08, 0xe4, 0x78, 0xa0, 0xf6, 0x18, 0x06, 0x80, 0x06, +0xe4, 0x78, 0x9f, 0xf6, 0x08, 0x06, 0xe4, 0x78, 0x90, 0x12, 0x27, 0x98, 0x08, 0x12, 0x27, 0x98, +0x08, 0xf6, 0x08, 0xf6, 0x78, 0x9c, 0xf6, 0x78, 0xa1, 0xf6, 0x08, 0xf6, 0x78, 0x9e, 0xf6, 0x18, +0x76, 0x01, 0x78, 0xa3, 0xe6, 0x44, 0x3e, 0xf6, 0x80, 0x46, 0x90, 0x01, 0x9c, 0xe0, 0x7f, 0x01, +0x30, 0xe0, 0x02, 0x7f, 0x14, 0x78, 0x9d, 0xe6, 0xfe, 0xd3, 0x9f, 0x40, 0x33, 0xee, 0x94, 0x1e, +0x50, 0x2e, 0x78, 0xa3, 0xe6, 0x30, 0xe0, 0x1e, 0x78, 0x9f, 0xe6, 0xff, 0xb4, 0x01, 0x05, 0x75, +0x23, 0x05, 0x80, 0x12, 0xef, 0xb4, 0x02, 0x05, 0x75, 0x23, 0x0b, 0x80, 0x09, 0x78, 0xa0, 0xe6, +0xb4, 0x01, 0x03, 0x75, 0x23, 0x15, 0x78, 0xa3, 0x76, 0xff, 0xe4, 0x78, 0x9f, 0xf6, 0x08, 0xf6, +0x78, 0xa4, 0xa6, 0x23, 0xaf, 0x23, 0x22, 0x78, 0x92, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, +0x6f, 0x22, 0xc3, 0x9f, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0x12, 0x2b, 0x6f, 0xac, 0x06, 0xad, 0x07, +0xe5, 0x22, 0x75, 0xf0, 0x04, 0xa4, 0xff, 0xc3, 0xed, 0x9f, 0xe5, 0xf0, 0x64, 0x80, 0xf8, 0xec, +0x64, 0x80, 0x98, 0x22, 0x78, 0x94, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0x22, 0xe6, +0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0xc3, 0xef, 0x95, 0x22, 0x74, 0x80, 0xf8, 0x6e, 0x98, +0x22, 0xef, 0x12, 0x12, 0xc2, 0xe0, 0xf5, 0x2f, 0x12, 0x12, 0x89, 0xe4, 0x93, 0xfd, 0x7c, 0x00, +0x74, 0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0x12, 0x09, 0x74, 0x8e, 0x30, 0x8f, 0x31, 0xe5, +0x2f, 0x70, 0x58, 0x75, 0x22, 0x01, 0x12, 0x13, 0x04, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0x78, 0x02, +0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x01, 0x12, 0x13, 0x49, 0x78, 0x06, 0xe2, 0xfe, 0x08, 0xe2, +0xff, 0x78, 0x05, 0x12, 0x13, 0xcd, 0x74, 0x09, 0x93, 0xfc, 0x74, 0x0a, 0x93, 0xfd, 0xc3, 0xec, +0x94, 0x00, 0x50, 0x05, 0x12, 0x14, 0x3a, 0x80, 0x04, 0xae, 0x25, 0xaf, 0x26, 0x12, 0x12, 0xd0, +0x40, 0x06, 0xae, 0x29, 0xaf, 0x2a, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x25, 0x8f, 0x26, +0x78, 0x0a, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x09, 0x80, 0x62, 0x78, 0xaa, 0xe6, 0x14, 0x65, +0x2f, 0x70, 0x6a, 0xf5, 0x22, 0x12, 0x13, 0x04, 0x12, 0x12, 0x89, 0x74, 0x03, 0x93, 0xf5, 0x27, +0x74, 0x04, 0x93, 0xf5, 0x28, 0x12, 0x12, 0x90, 0x12, 0x13, 0x46, 0x12, 0x12, 0x9e, 0x24, 0xfe, +0x12, 0x12, 0x98, 0x24, 0xfd, 0x12, 0x13, 0xcc, 0x74, 0x0b, 0x93, 0xfc, 0x74, 0x0c, 0x93, 0xfd, +0xc3, 0xec, 0x94, 0x00, 0x50, 0x05, 0x12, 0x14, 0x3a, 0x80, 0x04, 0xae, 0x25, 0xaf, 0x26, 0x12, +0x12, 0xd0, 0x40, 0x06, 0xae, 0x29, 0xaf, 0x2a, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x25, +0x8f, 0x26, 0x12, 0x12, 0x9e, 0x24, 0xfa, 0x12, 0x12, 0x98, 0x24, 0xf9, 0xf8, 0x12, 0x13, 0x15, +0xfe, 0xe4, 0x8f, 0x2e, 0x8e, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0x02, 0x11, 0x5d, 0x12, 0x13, 0x9e, +0xac, 0x06, 0xad, 0x07, 0xe5, 0x30, 0xc3, 0x13, 0xfe, 0xe5, 0x31, 0x13, 0x2d, 0xf5, 0x28, 0xec, +0x3e, 0xf5, 0x27, 0x12, 0x12, 0x9e, 0x24, 0xfe, 0x12, 0x12, 0x98, 0x24, 0xfd, 0x12, 0x13, 0x48, +0x12, 0x12, 0x9e, 0x24, 0x06, 0x12, 0x12, 0x98, 0x24, 0x05, 0x12, 0x13, 0xcc, 0xd3, 0xe5, 0x24, +0x95, 0x26, 0xe5, 0x23, 0x95, 0x25, 0x40, 0x38, 0xe5, 0x2f, 0xb4, 0x01, 0x25, 0xe5, 0x31, 0xae, +0x30, 0x78, 0x02, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x7c, 0x00, 0x7d, 0x05, 0x12, +0x09, 0x74, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x13, 0x9e, 0xef, 0x2b, 0xf5, 0x28, 0xee, 0x3a, 0x12, +0x13, 0x02, 0xe4, 0xf5, 0x22, 0x12, 0x14, 0x59, 0x85, 0x23, 0x25, 0x85, 0x24, 0x26, 0x80, 0x37, +0x78, 0xaa, 0xe6, 0x24, 0xfe, 0xb5, 0x2f, 0x1b, 0x12, 0x13, 0x9e, 0xaa, 0x06, 0xab, 0x07, 0xae, +0x30, 0xaf, 0x31, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09, 0x74, 0xeb, 0x2f, 0xf5, 0x28, 0xea, 0x3e, +0x12, 0x13, 0x02, 0x75, 0x22, 0x01, 0xe4, 0x85, 0x24, 0x2e, 0x85, 0x23, 0x2d, 0xf5, 0x2c, 0xf5, +0x2b, 0x85, 0x25, 0x25, 0x85, 0x26, 0x26, 0x12, 0x12, 0x90, 0x12, 0x13, 0x46, 0xae, 0x23, 0xaf, +0x24, 0xe4, 0xfc, 0xfd, 0xab, 0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0xc3, 0x12, 0x0c, 0x2e, +0x50, 0x29, 0xae, 0x25, 0xaf, 0x26, 0xe4, 0xfc, 0xfd, 0xa8, 0x2b, 0xc3, 0x12, 0x0c, 0x2e, 0x50, +0x1a, 0xae, 0x2d, 0xaf, 0x2e, 0xc3, 0xe5, 0x24, 0x9f, 0xf5, 0x24, 0xe5, 0x23, 0x9e, 0xf5, 0x23, +0xc3, 0xe5, 0x26, 0x9f, 0xf5, 0x26, 0xe5, 0x25, 0x9e, 0xf5, 0x25, 0xe4, 0x12, 0x14, 0x59, 0x7f, +0x80, 0xfe, 0xfd, 0xfc, 0xab, 0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0x12, 0x13, 0x6b, 0xae, +0x30, 0xaf, 0x31, 0x12, 0x13, 0xc6, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x24, 0x25, 0x26, 0xff, 0xe5, +0x23, 0x35, 0x25, 0xab, 0x07, 0xfa, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, +0xef, 0x24, 0x40, 0xff, 0xe4, 0x3e, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe4, 0x7b, 0x80, +0xfa, 0xf9, 0xf8, 0x12, 0x0b, 0x9c, 0x8f, 0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xe5, 0x22, +0x60, 0x1b, 0xe4, 0xfc, 0xfd, 0xe5, 0x2e, 0x25, 0x28, 0xf5, 0x2e, 0xe5, 0x2d, 0x35, 0x27, 0xf5, +0x2d, 0xed, 0x35, 0x2c, 0xf5, 0x2c, 0xec, 0x35, 0x2b, 0xf5, 0x2b, 0x80, 0x17, 0xc3, 0xe5, 0x28, +0x95, 0x2e, 0xf5, 0x2e, 0xe5, 0x27, 0x95, 0x2d, 0xf5, 0x2d, 0xe4, 0x95, 0x2c, 0xf5, 0x2c, 0xe4, +0x95, 0x2b, 0xf5, 0x2b, 0xae, 0x2d, 0xaf, 0x2e, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, +0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, +0xff, 0xe5, 0x09, 0x24, 0x21, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, +0xf0, 0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, +0x09, 0x24, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 0x22, 0xee, 0xf0, 0xef, 0xa3, 0xf0, +0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0x22, 0xe4, 0x7b, 0x0a, 0xfa, 0xf9, 0xf8, 0x12, 0x0b, +0x9c, 0xa8, 0x04, 0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x85, 0x0b, 0x82, 0x85, 0x0a, 0x83, 0x22, +0xe5, 0x2f, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xe5, 0x2f, +0x25, 0xe0, 0x25, 0xe0, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbf, 0xf5, 0x82, 0xe4, +0x34, 0x02, 0xf5, 0x83, 0xe5, 0x82, 0x25, 0x45, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, +0xe5, 0x21, 0x75, 0xf0, 0x27, 0xa4, 0x24, 0x69, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, +0x8e, 0x29, 0x8f, 0x2a, 0x12, 0x09, 0x62, 0x7c, 0x00, 0x7d, 0x32, 0x12, 0x09, 0x74, 0xef, 0x25, +0x26, 0xf5, 0x2a, 0xee, 0x35, 0x25, 0xf5, 0x29, 0xd3, 0xe5, 0x2a, 0x94, 0x00, 0xe5, 0x29, 0x64, +0x80, 0x94, 0x80, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xd3, 0xf5, 0x82, 0xe4, 0x34, +0x02, 0x22, 0xf5, 0x27, 0xe5, 0x31, 0x25, 0x31, 0xf5, 0x31, 0xe5, 0x30, 0x33, 0xf5, 0x30, 0x22, +0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x2f, 0xff, 0x18, 0xe2, 0x3e, 0x22, 0x74, 0x01, 0x93, 0xfe, +0x74, 0x02, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x6e, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, +0xff, 0xe5, 0x09, 0x22, 0x13, 0xff, 0xe4, 0xfc, 0xfd, 0xeb, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xed, +0x39, 0xfd, 0xec, 0x38, 0xfc, 0x22, 0x24, 0x01, 0xf8, 0xe2, 0x2f, 0xf5, 0x24, 0x18, 0xe2, 0x3e, +0xf5, 0x23, 0x22, 0x90, 0x02, 0x8c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x22, 0x33, 0x95, 0xe0, +0xfd, 0xfc, 0xab, 0x36, 0xaa, 0x35, 0xa9, 0x34, 0xa8, 0x33, 0x22, 0x12, 0x0b, 0x11, 0xa8, 0x04, +0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7c, 0x00, 0x7d, 0x03, +0x02, 0x09, 0x62, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x12, 0x0c, 0x6e, 0x12, 0x0b, 0x11, 0xe4, 0x7b, +0x02, 0xfa, 0xf9, 0xf8, 0x22, 0x7b, 0x01, 0x7e, 0x00, 0x7f, 0x07, 0x02, 0x08, 0xc2, 0xaf, 0x2f, +0x7e, 0x00, 0xac, 0x30, 0xad, 0x31, 0x02, 0x09, 0x62, 0x3e, 0xf5, 0x25, 0xd3, 0xe5, 0x24, 0x95, +0x26, 0xe5, 0x23, 0x95, 0x25, 0x22, 0x7e, 0x00, 0x7f, 0x06, 0x7d, 0x00, 0x7b, 0x01, 0x02, 0x0c, +0xd9, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0b, 0x11, 0xf8, 0xe2, 0x2f, 0xf5, +0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbf, 0xf5, +0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0x22, +0x78, 0x6e, 0xfe, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x7b, 0xf0, 0xe5, 0x21, 0x75, 0xf0, 0x27, 0xa4, +0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0x2f, 0xff, 0xee, 0x3c, +0xfe, 0xef, 0x78, 0x02, 0x22, 0xe5, 0x82, 0x2d, 0xf5, 0x82, 0xe5, 0x83, 0x3c, 0xf5, 0x83, 0xef, +0xf0, 0x22, 0x78, 0x72, 0x12, 0x0c, 0x52, 0x78, 0x6e, 0x12, 0x0c, 0x6e, 0xeb, 0x2f, 0x22, 0x74, +0x1a, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0xfe, 0x02, 0x0b, 0x11, 0xc3, 0xe5, 0x24, 0x95, 0x26, 0xff, +0xe5, 0x23, 0x95, 0x25, 0xfe, 0x22, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x09, 0x22, 0x74, 0x24, +0x25, 0x23, 0xf8, 0xa6, 0x06, 0x78, 0x74, 0xe6, 0x22, 0x85, 0x26, 0x2e, 0x85, 0x25, 0x2d, 0xf5, +0x2c, 0xf5, 0x2b, 0x22, 0xab, 0x4a, 0xaa, 0x4b, 0xa9, 0x4c, 0x02, 0x0a, 0x15, 0xf8, 0xe2, 0xfe, +0x08, 0xe2, 0xff, 0x22, 0x90, 0x02, 0x6e, 0xe0, 0x60, 0x0e, 0x90, 0x02, 0x95, 0xe0, 0x7f, 0x01, +0x60, 0x02, 0x7f, 0x02, 0x8f, 0x27, 0x80, 0x0c, 0x90, 0x02, 0x95, 0xe0, 0x7f, 0x00, 0x60, 0x02, +0x7f, 0x01, 0x8f, 0x27, 0x90, 0x02, 0x8e, 0xe0, 0xff, 0x60, 0x0e, 0x90, 0x02, 0xb5, 0xe0, 0x7e, +0x01, 0x60, 0x02, 0x7e, 0x02, 0x8e, 0x28, 0x80, 0x0c, 0x90, 0x02, 0xb5, 0xe0, 0x7e, 0x00, 0x60, +0x02, 0x7e, 0x01, 0x8e, 0x28, 0xe4, 0xf5, 0x22, 0xe5, 0x27, 0x64, 0x01, 0x70, 0x54, 0xe5, 0x28, +0x70, 0x03, 0x02, 0x15, 0xe2, 0xe5, 0x28, 0xb4, 0x01, 0x12, 0xef, 0x60, 0x03, 0x02, 0x15, 0xe2, +0x90, 0x02, 0xb5, 0xe0, 0x70, 0x03, 0x02, 0x15, 0xe2, 0x02, 0x15, 0xdf, 0xe5, 0x28, 0x64, 0x02, +0x60, 0x03, 0x02, 0x15, 0xe2, 0x12, 0x16, 0x77, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x10, 0xd0, +0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x12, 0x16, 0x29, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x45, +0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, 0xe0, 0x12, 0x13, 0xa9, 0x50, 0x03, 0x02, 0x15, 0xe2, 0x02, +0x15, 0xdf, 0xe5, 0x27, 0x64, 0x02, 0x60, 0x03, 0x02, 0x15, 0xe2, 0xe5, 0x28, 0x70, 0x03, 0x02, +0x15, 0xe2, 0xe5, 0x28, 0x64, 0x01, 0x70, 0x73, 0x90, 0x02, 0x8e, 0xe0, 0x60, 0x2c, 0x12, 0x16, +0x77, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x10, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x3e, +0xf5, 0x23, 0x90, 0x02, 0x8a, 0x12, 0x16, 0x90, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x13, 0x53, 0x90, +0x02, 0x94, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x93, 0x80, 0x2a, 0x90, 0x02, 0xb1, 0x12, 0x16, 0x90, +0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x5e, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x12, 0x16, +0x29, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x02, 0xb3, 0x12, 0x13, 0x56, 0x90, 0x02, 0x6d, 0xe0, 0x9f, +0xff, 0x90, 0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, +0xe0, 0x3e, 0xf5, 0x25, 0x12, 0x13, 0xac, 0x40, 0x49, 0x80, 0x44, 0xe5, 0x28, 0x64, 0x02, 0x70, +0x41, 0x12, 0x16, 0x5e, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x13, 0x53, 0x90, 0x02, 0x6d, 0xe0, 0x90, +0x02, 0x6c, 0x12, 0x16, 0xa6, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x3e, 0xf5, 0x23, 0x12, +0x13, 0x53, 0x90, 0x02, 0x94, 0xe0, 0x90, 0x02, 0x93, 0x12, 0x16, 0xa6, 0xc0, 0x06, 0xc0, 0x07, +0x12, 0x16, 0x45, 0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, 0xe0, 0x12, 0x13, 0xa9, 0x40, 0x03, 0x75, +0x22, 0x01, 0xe5, 0x22, 0x60, 0x29, 0x78, 0x6e, 0x7c, 0x00, 0x7d, 0x00, 0x7a, 0x02, 0x79, 0x69, +0x12, 0x13, 0x95, 0x78, 0x69, 0x7c, 0x02, 0x7d, 0x01, 0x7a, 0x02, 0x79, 0x90, 0x12, 0x13, 0x95, +0x78, 0x90, 0x7c, 0x02, 0x7d, 0x01, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x6e, 0x12, 0x13, 0x97, 0x22, +0x90, 0x02, 0x8c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x6d, 0xe0, 0x9f, 0xff, 0x90, +0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x3e, 0xf5, 0x23, 0x90, 0x02, 0xb1, 0xe0, +0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x6b, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6a, 0xe0, 0x9e, +0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, 0xb3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, +0x6d, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, +0xb3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x94, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x93, +0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, 0x8a, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, +0x90, 0x02, 0x6b, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6a, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, +0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x92, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x91, 0xe0, +0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x9f, 0xff, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x15, +0x0f, 0x15, 0x0f, 0x12, 0x25, 0x8a, 0x78, 0x8c, 0xe6, 0xa8, 0x0f, 0xf6, 0x78, 0x8a, 0xe6, 0x60, +0x33, 0xa8, 0x0f, 0x08, 0xe4, 0xf6, 0xa8, 0x0f, 0x08, 0xe6, 0xff, 0xc3, 0x78, 0x8f, 0x96, 0x50, +0x58, 0x12, 0x24, 0x95, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x27, 0xf8, 0xa8, 0x0f, 0x08, 0x12, 0x24, +0x93, 0xa8, 0x0f, 0xe6, 0x7d, 0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, 0x29, 0xd6, 0xa8, 0x0f, +0x08, 0x06, 0x80, 0xd2, 0x78, 0x7d, 0x12, 0x24, 0x93, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x27, 0xf8, +0x78, 0x7d, 0x12, 0x24, 0x93, 0xa8, 0x0f, 0xe6, 0x7d, 0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, +0x29, 0xd6, 0x12, 0x24, 0x91, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x24, 0x8e, 0xa8, 0x0f, 0xe6, 0x7d, +0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, 0x29, 0xd6, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, +0xff, 0x78, 0x7d, 0xe6, 0xfd, 0x12, 0x24, 0xe0, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x5a, +0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x18, 0xe6, 0x12, 0x24, 0xe0, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x74, +0x55, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x79, 0x08, 0xe6, 0xff, 0x24, +0x55, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xef, 0x12, 0x24, 0xb8, 0xe0, +0xfe, 0xa3, 0xe0, 0xff, 0xe6, 0x12, 0x24, 0xe0, 0x12, 0x25, 0x74, 0x12, 0x2b, 0x6f, 0x90, 0x02, +0x51, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x7c, 0xe6, 0xff, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, +0xe0, 0xfd, 0xef, 0x12, 0x24, 0xe0, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x9d, 0xff, 0xee, 0x9c, 0xfe, +0x12, 0x2b, 0x6f, 0x90, 0x02, 0x53, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x24, 0xee, 0x74, 0x07, +0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0xc3, 0x90, 0x02, 0x52, 0xe0, 0x9f, 0x90, 0x02, 0x51, 0xe0, +0x9e, 0x50, 0x61, 0xc3, 0x90, 0x02, 0x54, 0xe0, 0x9f, 0x90, 0x02, 0x53, 0xe0, 0x9e, 0x50, 0x54, +0x12, 0x25, 0x7f, 0x80, 0x4f, 0x12, 0x25, 0x7f, 0x12, 0x24, 0xee, 0x78, 0x7d, 0x12, 0x24, 0xae, +0x12, 0x24, 0xd6, 0x12, 0x25, 0x1d, 0x40, 0x16, 0xe6, 0x12, 0x24, 0xe0, 0xc0, 0x83, 0xc0, 0x82, +0x90, 0x02, 0x51, 0x12, 0x25, 0x0e, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x24, +0xee, 0x78, 0x7c, 0x12, 0x24, 0xae, 0x12, 0x24, 0xd6, 0x12, 0x25, 0x1d, 0x40, 0x16, 0xe6, 0x12, +0x24, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x02, 0x53, 0x12, 0x25, 0x0e, 0xd0, 0x82, 0xd0, 0x83, +0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x8d, 0xe6, 0x70, 0x0a, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, +0xf0, 0x80, 0x03, 0x12, 0x28, 0xa7, 0x05, 0x0f, 0x05, 0x0f, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, +0x20, 0x7e, 0x00, 0x7f, 0x0c, 0x7d, 0x00, 0x12, 0x0c, 0xd9, 0x7a, 0x02, 0x79, 0x6a, 0x12, 0x13, +0xb6, 0x7a, 0x02, 0x79, 0x91, 0x12, 0x13, 0xb6, 0x78, 0xae, 0xe6, 0x14, 0x60, 0x34, 0x04, 0x60, +0x03, 0x02, 0x19, 0xb1, 0xe4, 0x78, 0xad, 0xf6, 0xff, 0x12, 0x2b, 0x57, 0x12, 0x1d, 0xe7, 0x78, +0x30, 0xe2, 0x30, 0xe2, 0x09, 0x78, 0x89, 0xe6, 0x30, 0xe4, 0x03, 0x02, 0x19, 0xb5, 0x7e, 0x00, +0x7f, 0x4e, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x69, 0x12, 0x0c, 0xd9, 0x78, 0xae, 0x76, +0x01, 0x22, 0x12, 0x1d, 0xe7, 0x78, 0x30, 0xe2, 0x30, 0xe2, 0x09, 0x78, 0x89, 0xe6, 0x30, 0xe4, +0x03, 0x02, 0x19, 0xb1, 0x78, 0x89, 0xe6, 0x20, 0xe3, 0x03, 0x02, 0x19, 0x4e, 0x12, 0x22, 0x5f, +0x78, 0xab, 0xe6, 0xff, 0x12, 0x27, 0x22, 0x78, 0xab, 0xa6, 0x07, 0x08, 0xe6, 0xff, 0x12, 0x27, +0x22, 0x78, 0xac, 0xa6, 0x07, 0x75, 0x25, 0xfe, 0x75, 0x26, 0x00, 0x75, 0x27, 0x00, 0x7b, 0x00, +0x7a, 0x00, 0x79, 0xab, 0x12, 0x33, 0xea, 0xe4, 0xf5, 0x21, 0x74, 0xab, 0x25, 0x21, 0xf8, 0xe6, +0xff, 0x12, 0x12, 0xc0, 0xef, 0xf0, 0x12, 0x12, 0xc0, 0xe0, 0xf4, 0x60, 0x49, 0xaf, 0x21, 0x12, +0x1c, 0x8e, 0x12, 0x13, 0xfa, 0x24, 0x6a, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, +0xa3, 0xef, 0xf0, 0xaf, 0x21, 0x12, 0x0f, 0xc1, 0x12, 0x13, 0xfa, 0x24, 0x6c, 0xf5, 0x82, 0xe4, +0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0x12, 0x13, 0xf9, 0x24, 0x6e, 0xf5, 0x82, 0xe4, +0x34, 0x02, 0xf5, 0x83, 0x74, 0x01, 0x12, 0x13, 0xf9, 0x24, 0x6a, 0xf9, 0x74, 0x02, 0x35, 0xf0, +0xfa, 0x7b, 0x01, 0x12, 0x00, 0x09, 0x05, 0x21, 0xe5, 0x21, 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x12, +0x14, 0x74, 0x78, 0x89, 0xe6, 0x30, 0xe5, 0x15, 0x78, 0xad, 0x76, 0x01, 0x80, 0x0f, 0x90, 0x02, +0xb7, 0x74, 0xff, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x02, 0xbd, 0xf0, 0xa3, 0xf0, 0x75, 0x08, 0x02, +0x75, 0x09, 0x69, 0xe4, 0xf5, 0x21, 0xe5, 0x21, 0xc3, 0x94, 0x02, 0x50, 0x17, 0xaf, 0x21, 0x12, +0x00, 0x24, 0x12, 0x1f, 0x3e, 0x05, 0x21, 0x74, 0x27, 0x25, 0x09, 0xf5, 0x09, 0xe4, 0x35, 0x08, +0xf5, 0x08, 0x80, 0xe2, 0xa8, 0x20, 0xac, 0x1f, 0xad, 0x1e, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x6a, +0x7e, 0x00, 0x7f, 0x06, 0x12, 0x08, 0xc2, 0xe5, 0x20, 0x24, 0x06, 0xf9, 0xe4, 0x35, 0x1f, 0xa8, +0x01, 0xfc, 0xad, 0x1e, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x91, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x08, +0xc2, 0xe4, 0x78, 0xae, 0xf6, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 0x20, 0x43, 0xad, 0x04, 0x90, +0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x37, 0xf0, 0x90, +0xff, 0x49, 0x74, 0x0d, 0xf0, 0xe4, 0xf5, 0x27, 0xf5, 0x27, 0x12, 0x2a, 0x55, 0xe5, 0x27, 0xc3, +0x9f, 0x50, 0x22, 0xe9, 0x24, 0x0c, 0xf9, 0xe4, 0x3a, 0x12, 0x2a, 0x46, 0xe4, 0xfd, 0x12, 0x2a, +0x0a, 0x12, 0x2a, 0x3c, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x12, 0x2a, 0x3c, 0xe4, 0xfd, 0x12, 0x29, +0xd6, 0x05, 0x27, 0x80, 0xd5, 0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, +0xe4, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43, 0x74, 0x9f, +0xf0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x08, 0xe8, 0x90, 0xff, 0x48, 0xf0, 0x90, 0x00, +0x01, 0x12, 0x09, 0x01, 0x90, 0xff, 0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x09, 0x01, 0x90, 0xff, +0x55, 0xf0, 0xe4, 0x90, 0xff, 0x5d, 0xf0, 0x90, 0x00, 0x03, 0x12, 0x09, 0x01, 0x90, 0xff, 0x54, +0xf0, 0xe4, 0x90, 0xff, 0x5c, 0xf0, 0xf5, 0x27, 0x12, 0x2a, 0x55, 0xe5, 0x27, 0xc3, 0x9f, 0x50, +0x5b, 0xe4, 0xf5, 0x28, 0x75, 0x29, 0x64, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x03, 0x43, 0x28, +0x01, 0xe5, 0x28, 0x64, 0x01, 0x60, 0x03, 0xd5, 0x29, 0xed, 0x12, 0x2a, 0x63, 0x12, 0x2a, 0x3c, +0x7d, 0x06, 0x12, 0x28, 0x53, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x90, 0xff, 0x40, 0xe0, 0x20, +0xe0, 0xf9, 0x12, 0x2a, 0x3c, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, +0xe0, 0xff, 0xab, 0x21, 0xe5, 0x23, 0xf9, 0x24, 0x02, 0xf5, 0x23, 0xe5, 0x22, 0xfa, 0x34, 0x00, +0xf5, 0x22, 0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0x05, 0x27, 0x80, 0x9c, 0xe4, 0xf5, 0x27, 0x75, +0x28, 0x01, 0x12, 0x2a, 0x3c, 0x7d, 0x07, 0x12, 0x28, 0x53, 0xe5, 0x28, 0x24, 0x02, 0x90, 0xff, +0x55, 0xf0, 0xe4, 0xf5, 0x29, 0xf5, 0x2a, 0x05, 0x2a, 0xe5, 0x2a, 0x70, 0x02, 0x05, 0x29, 0xb4, +0x20, 0xf5, 0xe5, 0x29, 0xb4, 0x03, 0xf0, 0x90, 0xff, 0x50, 0xe0, 0x30, 0xe7, 0x0c, 0x12, 0x2a, +0x63, 0x05, 0x28, 0xe5, 0x28, 0xc3, 0x94, 0x64, 0x40, 0xd0, 0xab, 0x24, 0xaa, 0x25, 0xa9, 0x26, +0x85, 0x27, 0x82, 0x75, 0x83, 0x00, 0xe5, 0x28, 0x12, 0x09, 0x40, 0x12, 0x2a, 0x3c, 0x7d, 0x08, +0x12, 0x28, 0x53, 0x12, 0x2a, 0x63, 0x12, 0x2a, 0x55, 0x05, 0x27, 0xe5, 0x27, 0xc3, 0x9f, 0x40, +0x9e, 0xe4, 0x90, 0xff, 0x50, 0xf0, 0xff, 0x22, 0x8b, 0x1f, 0x8a, 0x20, 0x89, 0x21, 0x43, 0xad, +0x04, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x80, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, +0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x7d, 0xf0, +0x90, 0xff, 0x5d, 0xf0, 0xe4, 0x12, 0x2a, 0x8a, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x26, 0xf5, 0x27, +0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x25, 0xe4, 0x90, 0xff, 0x50, 0x12, 0x2a, 0x7a, 0xf4, 0x60, 0x0d, +0xe4, 0xfd, 0x12, 0x29, 0xd6, 0x12, 0x2a, 0x7f, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x12, 0x2a, 0x6c, +0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x29, 0xd6, 0x12, 0x2a, 0x6c, 0x7d, 0x08, 0x12, 0x28, 0x53, +0xe4, 0xff, 0x00, 0x0f, 0xbf, 0xc8, 0xfb, 0x90, 0xff, 0x50, 0x74, 0x03, 0x12, 0x2a, 0x7a, 0xf4, +0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x2a, 0x0a, 0x12, 0x2a, 0x7f, 0x7d, 0x07, 0x12, 0x28, 0x53, 0x12, +0x2a, 0x6c, 0xf4, 0x60, 0x0d, 0x7d, 0x01, 0x12, 0x2a, 0x0a, 0x12, 0x2a, 0x6c, 0x7d, 0x07, 0x12, +0x28, 0x53, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 0xff, +0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x09, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, +0x90, 0xff, 0x43, 0xe0, 0x30, 0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x52, +0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x27, 0xf5, 0x27, 0xee, 0x35, 0x26, 0xf5, 0x26, 0x90, 0xff, 0x5a, +0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x29, 0xf5, 0x29, 0xee, 0x35, 0x28, 0xf5, 0x28, 0x05, 0x25, 0xe5, +0x25, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x02, 0x1b, 0x66, 0xe5, 0x27, 0xae, 0x26, 0x78, 0x02, 0xce, +0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0xee, 0x8f, 0xf0, +0x12, 0x0a, 0xc5, 0xe5, 0x29, 0xae, 0x28, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, +0xff, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x90, 0x00, 0x02, 0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xe4, +0x53, 0x95, 0x7f, 0xe4, 0x90, 0xff, 0x41, 0xf0, 0x90, 0xff, 0x49, 0xf0, 0x90, 0xff, 0x4a, 0xf0, +0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x55, 0xf0, +0x90, 0xff, 0x5d, 0xf0, 0x12, 0x2a, 0x8a, 0x12, 0x2a, 0x7e, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, +0x28, 0x53, 0x12, 0x2a, 0x6c, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 0x28, 0x53, 0x22, 0xef, 0x12, +0x12, 0xc2, 0xe0, 0xff, 0x70, 0x04, 0xf5, 0x22, 0x80, 0x18, 0x78, 0xaa, 0xe6, 0xfe, 0x14, 0xb5, +0x07, 0x09, 0xee, 0x25, 0xe0, 0x24, 0xfa, 0xf5, 0x22, 0x80, 0x07, 0xef, 0x25, 0xe0, 0x24, 0xfe, +0xf5, 0x22, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x04, 0x12, 0x14, 0x6d, 0xe5, 0x22, 0x12, 0x13, 0x10, +0xfe, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x09, 0x12, 0x13, 0x14, 0xfe, 0x90, 0x02, 0xbd, 0xe0, 0xfa, +0xa3, 0xe0, 0xfb, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0x12, 0x13, 0xf0, 0xe5, 0x22, 0x25, 0xe0, +0x24, 0x06, 0x12, 0x14, 0x6d, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x03, 0x12, 0x13, 0x14, 0xfe, 0xe5, +0x22, 0x25, 0xe0, 0x24, 0x0b, 0x12, 0x13, 0x14, 0xcf, 0xc3, 0x9b, 0xcf, 0x9a, 0x78, 0x72, 0x12, +0x13, 0xf2, 0x12, 0x12, 0x89, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x78, 0x72, 0x12, 0x13, 0x83, +0x12, 0x0b, 0x11, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, 0x89, 0x78, 0x72, +0x12, 0x13, 0x1c, 0x12, 0x0b, 0x11, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xef, 0x2b, +0xff, 0xee, 0x3a, 0x12, 0x13, 0x3e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, +0x89, 0x74, 0x05, 0x93, 0xfe, 0x74, 0x06, 0x78, 0x6e, 0x12, 0x13, 0x83, 0x12, 0x13, 0x6b, 0xd0, +0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x99, +0xfd, 0xec, 0x98, 0xfc, 0x78, 0x76, 0x12, 0x0c, 0x7b, 0x78, 0x76, 0x12, 0x0c, 0x52, 0xec, 0x33, +0x50, 0x0b, 0x78, 0x6e, 0x12, 0x0c, 0x87, 0x00, 0x00, 0x00, 0x01, 0x80, 0x64, 0x12, 0x14, 0x22, +0xff, 0xea, 0x3e, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c, 0xfc, 0x12, 0x13, 0x8e, 0x12, 0x0b, 0x9c, +0x78, 0x76, 0x12, 0x0c, 0x6e, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0x12, 0x13, 0x3e, 0xc0, 0x04, 0xc0, +0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x14, 0x22, 0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 0xf9, 0xe8, +0x3c, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x0b, 0x9c, 0x78, 0x6e, 0x12, +0x0c, 0x7b, 0x12, 0x12, 0x89, 0x78, 0x6e, 0x12, 0x13, 0x1c, 0xd3, 0x12, 0x0c, 0x2e, 0x40, 0x11, +0x12, 0x12, 0x89, 0x74, 0x02, 0x93, 0x24, 0xff, 0xff, 0x74, 0x01, 0x93, 0x34, 0xff, 0x12, 0x13, +0xf0, 0x78, 0x6e, 0x12, 0x0c, 0x52, 0x22, 0xe4, 0x78, 0x89, 0xf6, 0x18, 0xe6, 0x14, 0x70, 0x03, +0x02, 0x1e, 0xac, 0x14, 0x70, 0x03, 0x02, 0x1f, 0x15, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1f, 0x39, +0xe4, 0x78, 0x8e, 0xf6, 0x78, 0x89, 0xf6, 0xfe, 0x7f, 0x8c, 0xfd, 0x12, 0x24, 0xf5, 0x7f, 0x1c, +0x7a, 0x00, 0x79, 0x00, 0x12, 0x25, 0x4b, 0x7f, 0x0e, 0x7a, 0x00, 0x79, 0x20, 0x12, 0x25, 0x4b, +0x12, 0x24, 0xee, 0x74, 0x02, 0x93, 0x78, 0x8f, 0xf6, 0x78, 0x84, 0xe6, 0x30, 0xe0, 0x08, 0x75, +0x23, 0x05, 0x75, 0x24, 0x01, 0x80, 0x06, 0x75, 0x23, 0x08, 0xe4, 0xf5, 0x24, 0xe4, 0xf5, 0x22, +0xe5, 0x22, 0xc3, 0x78, 0x8f, 0x96, 0x50, 0x60, 0xe5, 0x59, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, +0x58, 0xf5, 0x83, 0xe5, 0x82, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, +0xf5, 0x25, 0xe5, 0x22, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe5, +0x58, 0x3e, 0xf5, 0x83, 0xe4, 0x93, 0xf5, 0x26, 0xe4, 0xfd, 0xaf, 0x25, 0x12, 0x2a, 0x0a, 0x7d, +0x01, 0xaf, 0x26, 0x12, 0x2a, 0x0a, 0xad, 0x24, 0xaf, 0x25, 0x12, 0x29, 0xd6, 0xad, 0x24, 0xaf, +0x26, 0x12, 0x29, 0xd6, 0xad, 0x23, 0xaf, 0x25, 0x12, 0x28, 0x53, 0xad, 0x23, 0xaf, 0x26, 0x12, +0x28, 0x53, 0x05, 0x22, 0x05, 0x22, 0x80, 0x98, 0x78, 0x88, 0x76, 0x01, 0x12, 0x24, 0xee, 0x74, +0x08, 0x93, 0x25, 0xe0, 0xf5, 0x25, 0x74, 0x07, 0x93, 0x33, 0xf5, 0x24, 0x75, 0x23, 0x04, 0x12, +0x2a, 0xbe, 0x7f, 0xff, 0x12, 0x26, 0x5a, 0x12, 0x2a, 0xbe, 0xe4, 0xf5, 0x22, 0xe5, 0x22, 0xc3, +0x78, 0x8f, 0x96, 0x50, 0x36, 0xe5, 0x22, 0x12, 0x24, 0xb8, 0xe0, 0xfe, 0xa3, 0xe0, 0x78, 0x02, +0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe5, 0x22, 0x12, 0x24, 0xc8, 0xee, 0x8f, 0xf0, +0x12, 0x09, 0xff, 0xe5, 0x22, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x22, 0x12, +0x25, 0x54, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05, 0x22, 0x80, 0xc2, 0x15, 0x23, 0xe5, 0x23, 0x70, +0xb1, 0x78, 0x88, 0x76, 0x02, 0x12, 0x2a, 0xbe, 0x7f, 0xff, 0x12, 0x26, 0x5a, 0x78, 0x8f, 0xe6, +0xfd, 0xe4, 0xff, 0x12, 0x21, 0x29, 0x78, 0x89, 0xe6, 0x30, 0xe1, 0x04, 0x78, 0x8e, 0x76, 0x50, +0x78, 0x8f, 0xe6, 0xfd, 0xe4, 0xff, 0x02, 0x1f, 0xf2, 0xe4, 0x78, 0x88, 0xf6, 0x22, 0xe5, 0x09, +0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0x60, 0x12, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, 0x63, 0xe0, +0x7e, 0x01, 0x60, 0x02, 0x7e, 0x03, 0xaf, 0x06, 0x80, 0x1e, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, +0x63, 0xe0, 0x60, 0x12, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x7e, 0x02, 0x60, 0x02, +0x7e, 0x03, 0xaf, 0x06, 0x80, 0x02, 0xe4, 0xff, 0xe5, 0x09, 0x24, 0x06, 0x12, 0x12, 0x63, 0xef, +0xf0, 0xe5, 0x09, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, +0x63, 0xee, 0x12, 0x12, 0x6f, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, +0x63, 0xec, 0xf0, 0xed, 0x12, 0x12, 0x6e, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x12, 0x12, +0x5f, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xe5, 0x09, 0x24, 0x06, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xe5, +0x09, 0x24, 0x26, 0x12, 0x12, 0x63, 0xee, 0xf0, 0x22, 0x78, 0xff, 0xe4, 0xf6, 0xd8, 0xfd, 0x90, +0x00, 0x00, 0x7f, 0x00, 0x7e, 0x03, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x75, 0x81, 0xb0, +0x75, 0xa0, 0x00, 0x02, 0x2c, 0xb9, 0x12, 0x2b, 0x22, 0x22, 0x90, 0x00, 0x04, 0x02, 0x09, 0x01, +0x01, 0x06, 0x8f, 0x27, 0x8d, 0x28, 0x78, 0x8e, 0xe6, 0x60, 0x01, 0x16, 0x12, 0x24, 0xc6, 0xe0, +0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x27, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xf5, +0x2a, 0xec, 0x9e, 0xf5, 0x29, 0x12, 0x25, 0x27, 0xe0, 0xf5, 0x2b, 0x78, 0x8e, 0xe6, 0x60, 0x09, +0xd3, 0x12, 0x25, 0x62, 0x40, 0x03, 0x02, 0x20, 0xe2, 0xaf, 0x2a, 0xae, 0x29, 0x12, 0x2b, 0x6f, +0x12, 0x24, 0xee, 0xc3, 0x74, 0x08, 0x93, 0x9f, 0x74, 0x07, 0x93, 0x9e, 0x50, 0x0d, 0x12, 0x25, +0x62, 0x40, 0x04, 0x05, 0x2b, 0x80, 0x57, 0x15, 0x2b, 0x80, 0x53, 0x12, 0x24, 0xfe, 0xe0, 0xff, +0x33, 0x95, 0xe0, 0xfe, 0xef, 0x25, 0x2a, 0xf5, 0x2a, 0xee, 0x35, 0x29, 0xf5, 0x29, 0xd3, 0xe5, +0x2a, 0x94, 0x78, 0x12, 0x25, 0x66, 0x40, 0x09, 0x12, 0x24, 0xc6, 0xe4, 0x75, 0xf0, 0x01, 0x80, +0x1a, 0xe5, 0x2a, 0x24, 0x78, 0xe4, 0x35, 0x29, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x27, 0x75, +0xf0, 0x0a, 0x50, 0x11, 0x12, 0x24, 0xcb, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x09, 0xff, 0x12, 0x24, +0xfe, 0xe4, 0xf0, 0x80, 0x06, 0x12, 0x25, 0x03, 0xe5, 0x2a, 0xf0, 0xe4, 0xf5, 0x2b, 0x12, 0x24, +0xee, 0x74, 0x04, 0x93, 0xff, 0xd3, 0x64, 0x80, 0xf8, 0xe5, 0x2b, 0x64, 0x80, 0x98, 0x50, 0x17, +0xef, 0x33, 0x95, 0xe0, 0xfe, 0xad, 0x2b, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 0x3e, +0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x15, 0xe4, 0xf5, 0x2b, 0xe5, 0x27, 0x12, 0x24, 0xb8, 0xe0, +0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x24, 0xc6, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x25, 0x27, 0xe5, +0x2b, 0xf0, 0x78, 0x8e, 0xe6, 0x70, 0x36, 0x12, 0x24, 0xc6, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, +0x27, 0x12, 0x25, 0x54, 0x12, 0x25, 0x74, 0x12, 0x2b, 0x6f, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x24, +0xee, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x09, 0x62, +0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x06, 0x78, 0x89, 0xe6, 0x44, 0x10, 0xf6, 0x05, 0x27, 0x15, +0x28, 0xe5, 0x28, 0x60, 0x03, 0x02, 0x1f, 0xfc, 0x22, 0xab, 0x07, 0xaa, 0x05, 0xe4, 0x90, 0x01, +0xb0, 0xf0, 0xeb, 0x12, 0x24, 0xb8, 0xe0, 0xf5, 0x29, 0xa3, 0xe0, 0xf5, 0x2a, 0x78, 0x8f, 0xe6, +0xff, 0xeb, 0xc3, 0x9f, 0x40, 0x04, 0x78, 0x86, 0x80, 0x02, 0x78, 0x7e, 0xe6, 0x75, 0x27, 0x00, +0xf5, 0x28, 0xae, 0x27, 0xaf, 0x28, 0x7c, 0x00, 0x7d, 0xfc, 0x12, 0x09, 0x62, 0xd3, 0xe5, 0x2a, +0x9f, 0xe5, 0x29, 0x9e, 0x40, 0x0e, 0x78, 0x89, 0xe6, 0x44, 0x20, 0xf6, 0x74, 0x20, 0x2b, 0xf8, +0xe2, 0x44, 0x10, 0xf2, 0x12, 0x24, 0xee, 0x74, 0x08, 0x93, 0x25, 0xe0, 0xf5, 0x2a, 0x74, 0x07, +0x93, 0x33, 0xf5, 0x29, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0xf9, 0x30, 0xe0, 0x19, 0xe5, 0x2a, 0xae, +0x29, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xc3, 0xe5, 0x2a, 0x9f, 0xf5, +0x2a, 0xe5, 0x29, 0x9e, 0xf5, 0x29, 0xe5, 0x29, 0xc3, 0x13, 0xfe, 0xe5, 0x2a, 0x13, 0xff, 0xeb, +0x12, 0x24, 0xc8, 0xe0, 0xfc, 0xa3, 0xe0, 0x2f, 0xff, 0xec, 0x3e, 0xfe, 0xeb, 0x12, 0x24, 0xb8, +0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x51, 0x74, 0x20, 0x2b, 0xf8, 0xe9, 0x44, +0x02, 0xf2, 0xeb, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x2a, 0xff, 0xe5, 0x29, 0x3e, +0xfe, 0xeb, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x22, 0x78, +0x89, 0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0xf6, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0x44, 0x01, 0xf2, +0x78, 0x8f, 0xe6, 0xff, 0xeb, 0xc3, 0x9f, 0x50, 0x1a, 0x90, 0x01, 0xb0, 0xe0, 0x04, 0xf0, 0x80, +0x12, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0x54, 0xfe, 0xf2, 0x80, 0x08, 0x74, 0x20, 0x2b, 0xf8, 0xe9, +0x54, 0xfd, 0xf2, 0xeb, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xeb, 0x12, 0x24, 0xb8, +0x12, 0x25, 0x1d, 0xeb, 0x40, 0x17, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0x12, 0x25, 0x15, +0xf8, 0xeb, 0x25, 0xe0, 0x24, 0x00, 0xc8, 0xf2, 0x08, 0xef, 0xf2, 0x80, 0x09, 0x25, 0xe0, 0x24, +0x00, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0x0b, 0x1a, 0xea, 0x60, 0x03, 0x02, 0x21, 0x32, 0x22, 0xe4, +0x78, 0x74, 0xf6, 0x08, 0xf6, 0x78, 0x6e, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, +0x08, 0xf6, 0xf5, 0x22, 0xff, 0xf5, 0x23, 0x7e, 0xff, 0xe5, 0x22, 0xc3, 0x78, 0xaa, 0x96, 0x40, +0x03, 0x02, 0x23, 0x11, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf8, 0xe2, 0xfc, 0x08, +0xe2, 0xfd, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x2d, 0xf5, 0x28, 0x18, +0xe2, 0x3c, 0xf5, 0x27, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0x78, 0x74, 0xe6, 0xfc, 0x08, 0xe6, +0xfd, 0x74, 0x08, 0x93, 0x2d, 0xfb, 0x74, 0x07, 0x93, 0x3c, 0xfa, 0xd3, 0xe5, 0x28, 0x9b, 0xe5, +0x27, 0x9a, 0x40, 0x05, 0x7f, 0x01, 0x18, 0x80, 0x3c, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0x74, +0x08, 0x93, 0x25, 0x28, 0xfb, 0x74, 0x07, 0x93, 0x35, 0x27, 0xfa, 0xd3, 0xed, 0x9b, 0xec, 0x9a, +0x40, 0x2a, 0xef, 0x60, 0x1e, 0xe4, 0xff, 0x12, 0x14, 0x4e, 0xfc, 0x08, 0xe6, 0xfd, 0xe5, 0x23, +0x25, 0xe0, 0x24, 0x6e, 0xf8, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x05, 0x23, 0xe5, 0x23, 0xc3, 0x94, +0x03, 0x50, 0x0e, 0x78, 0x74, 0xa6, 0x27, 0x08, 0xa6, 0x28, 0xae, 0x22, 0x05, 0x22, 0x02, 0x22, +0x79, 0xef, 0x60, 0x1c, 0xe5, 0x23, 0xc3, 0x94, 0x02, 0x50, 0x15, 0x12, 0x14, 0x4e, 0xfe, 0x08, +0xe6, 0xff, 0xe5, 0x23, 0x25, 0xe0, 0x24, 0x6e, 0xf8, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x05, 0x23, +0x7b, 0x00, 0x7a, 0x00, 0x79, 0x6e, 0x75, 0x2d, 0xff, 0x12, 0x23, 0x6d, 0xb4, 0xff, 0x04, 0x7f, +0xff, 0x80, 0x07, 0x74, 0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x78, 0xab, 0xa6, 0x07, 0x7b, 0x00, +0x7a, 0x00, 0x79, 0x6e, 0x85, 0x22, 0x2d, 0x12, 0x23, 0x6d, 0xb4, 0xff, 0x04, 0x7f, 0xff, 0x80, +0x07, 0x74, 0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x78, 0xac, 0xa6, 0x07, 0x22, 0xad, 0x23, 0x12, +0x29, 0x30, 0x8f, 0x22, 0xe5, 0x22, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 0x20, 0xe4, 0xf5, 0x21, +0xf5, 0x22, 0xf5, 0x23, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0xe4, 0x93, 0xff, 0xe5, 0x21, 0xc3, +0x9f, 0x40, 0x03, 0x02, 0x24, 0x58, 0x12, 0x00, 0x18, 0x74, 0x01, 0x93, 0xf5, 0x24, 0x12, 0x00, +0x12, 0x74, 0x02, 0x93, 0xf5, 0x25, 0x12, 0x00, 0x12, 0x74, 0x04, 0x93, 0xfc, 0x74, 0x05, 0x93, +0xfd, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xd3, 0x9d, 0xee, +0x9c, 0x40, 0x6f, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09, 0x62, 0xe5, 0x25, 0x25, 0xe0, 0x24, 0x01, +0xf8, 0xe2, 0x24, 0x01, 0xfd, 0x18, 0xe2, 0x34, 0x00, 0xfc, 0x12, 0x09, 0x74, 0x8e, 0x26, 0x8f, +0x27, 0x12, 0x00, 0x12, 0x74, 0x03, 0x93, 0x30, 0xe7, 0x2b, 0x54, 0x7f, 0xc3, 0x95, 0x27, 0xff, +0xe4, 0x95, 0x26, 0xfe, 0x12, 0x2b, 0x6f, 0xc3, 0x74, 0x03, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, +0x80, 0x98, 0x40, 0x2e, 0xaf, 0x21, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, +0xfc, 0x42, 0x22, 0x80, 0x1d, 0x12, 0x00, 0x12, 0x74, 0x03, 0x93, 0xc3, 0x95, 0x27, 0xe4, 0x95, +0x26, 0x50, 0x0f, 0xaf, 0x21, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, +0x42, 0x22, 0x12, 0x00, 0x12, 0x74, 0x01, 0x93, 0x24, 0x20, 0xf8, 0xe2, 0xc3, 0x13, 0x20, 0xe0, +0x0f, 0x12, 0x00, 0x12, 0x74, 0x02, 0x93, 0x24, 0x20, 0xf8, 0xe2, 0xc3, 0x13, 0x30, 0xe0, 0x03, +0x75, 0x23, 0x01, 0x05, 0x21, 0x02, 0x23, 0x84, 0x90, 0x00, 0x36, 0xe0, 0x65, 0x22, 0x60, 0x0a, +0xe5, 0x22, 0xf0, 0xe4, 0x90, 0x00, 0x35, 0xf0, 0x80, 0x14, 0x90, 0x00, 0x35, 0xe0, 0x04, 0xf0, +0xc3, 0x94, 0x03, 0x40, 0x09, 0xe0, 0x14, 0xf0, 0x90, 0x00, 0x37, 0xe5, 0x22, 0xf0, 0x90, 0x00, +0x37, 0xe0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x09, 0x2e, 0xaf, 0x23, 0x22, 0x12, 0x27, +0xf8, 0x78, 0x7c, 0xe6, 0xff, 0xe5, 0x59, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, +0xe5, 0x82, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 0xff, 0x22, 0x74, 0x07, +0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0xe6, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb1, 0xf5, 0x82, +0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb3, 0xf5, 0x82, +0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe0, 0xfa, 0xa3, 0xe0, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xed, +0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb7, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0x85, 0x59, +0x82, 0x85, 0x58, 0x83, 0x22, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0xb1, 0x02, 0x0c, 0xd9, 0xe5, 0x27, +0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe0, 0xc3, +0x13, 0xfe, 0xa3, 0xe0, 0x13, 0xff, 0xc3, 0xed, 0x9f, 0xff, 0xec, 0x9e, 0x22, 0xe0, 0xfc, 0xa3, +0xe0, 0xfd, 0xd3, 0x9f, 0xec, 0x9e, 0x22, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb6, 0xf5, +0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe6, 0x90, 0xff, 0x55, 0xf0, 0x90, 0xff, 0x5d, 0xf0, +0x22, 0x43, 0xad, 0x04, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x7b, +0xfe, 0x02, 0x0c, 0xd9, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb9, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, +0x83, 0x22, 0xe5, 0x2a, 0x94, 0x00, 0xe5, 0x29, 0x64, 0x80, 0x94, 0x80, 0x22, 0x85, 0x1f, 0x82, +0x85, 0x1e, 0x83, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xff, 0xec, 0x9e, 0xfe, 0x22, 0x78, +0x7d, 0x06, 0x06, 0x18, 0x06, 0x06, 0x78, 0x8d, 0x16, 0x22, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, +0x22, 0x8e, 0x1e, 0x8f, 0x1f, 0xe4, 0x78, 0x88, 0xf6, 0x78, 0x8b, 0xf6, 0x85, 0x1e, 0x58, 0x85, +0x1f, 0x59, 0xe5, 0x1f, 0x24, 0x31, 0xff, 0xe4, 0x35, 0x1e, 0xfa, 0xa9, 0x07, 0x7b, 0xff, 0x78, +0x7e, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x0a, 0x12, 0x08, 0xc2, 0x7e, 0x00, 0x7f, 0xa0, +0x7d, 0x00, 0x12, 0x24, 0xf5, 0x12, 0x25, 0x6d, 0x74, 0x31, 0x93, 0x78, 0x7e, 0xf6, 0x12, 0x25, +0x6d, 0x74, 0x39, 0x93, 0x78, 0x86, 0xf6, 0x12, 0x24, 0xee, 0x74, 0x05, 0x93, 0xff, 0x7e, 0x00, +0x7c, 0x10, 0x7d, 0x00, 0x12, 0x0c, 0xac, 0xe4, 0x7b, 0xc8, 0xfa, 0xf9, 0xf8, 0x12, 0x0b, 0x9c, +0x78, 0x7a, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xe4, 0x78, 0x8d, 0xf6, 0x43, 0x95, 0x80, 0x90, 0xff, +0x41, 0x74, 0x77, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0x12, 0x25, 0x6d, 0xe4, 0x93, 0xf5, +0x20, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x20, 0x12, 0x29, 0xd6, 0xe4, 0xfd, 0x12, 0x26, 0x46, +0x12, 0x25, 0x6d, 0x74, 0x01, 0x93, 0xf5, 0x20, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x20, 0x12, +0x29, 0xd6, 0x7d, 0x01, 0x12, 0x26, 0x46, 0x78, 0x84, 0xe6, 0x7f, 0x08, 0x30, 0xe0, 0x02, 0x7f, +0x05, 0x78, 0x8c, 0xa6, 0x07, 0x22, 0xaf, 0x20, 0x12, 0x2a, 0x0a, 0x7d, 0x08, 0xaf, 0x20, 0x12, +0x28, 0x53, 0x7d, 0x07, 0xaf, 0x20, 0x12, 0x28, 0x53, 0x22, 0x90, 0xff, 0x4a, 0x74, 0x71, 0xf0, +0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xe4, 0x90, 0xff, 0x40, 0xf0, 0x12, +0x25, 0x8a, 0x78, 0x81, 0xe6, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x78, 0x7f, 0xe6, +0x90, 0xff, 0x42, 0xf0, 0x78, 0x83, 0x12, 0x25, 0x37, 0x90, 0xff, 0x48, 0x74, 0x02, 0xf0, 0x12, +0x25, 0x41, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x08, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 0x80, +0xf1, 0x12, 0x25, 0x8a, 0xe4, 0x78, 0x8a, 0xf6, 0x78, 0x7d, 0xbf, 0xff, 0x1b, 0xf6, 0x18, 0x76, +0x01, 0x78, 0x8f, 0xe6, 0xc3, 0x13, 0x78, 0x8d, 0xf6, 0x78, 0x7f, 0xe6, 0x90, 0xff, 0x42, 0xf0, +0x08, 0x12, 0x25, 0x37, 0x78, 0x7e, 0x80, 0x1b, 0xa6, 0x07, 0xef, 0x04, 0x18, 0xf6, 0x78, 0x8d, +0x76, 0x01, 0x78, 0x8a, 0x76, 0x01, 0x78, 0x85, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x78, 0x87, 0x12, +0x25, 0x37, 0x18, 0xe6, 0x90, 0xff, 0x48, 0xf0, 0x7e, 0x00, 0x7f, 0x14, 0x7d, 0x00, 0x7b, 0x01, +0x7a, 0x02, 0x79, 0x55, 0x12, 0x0c, 0xd9, 0x12, 0x28, 0xa7, 0x78, 0x82, 0xe6, 0x30, 0xe7, 0x1b, +0x12, 0x25, 0x41, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x08, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, +0x80, 0xf1, 0x12, 0x16, 0xaf, 0x78, 0x8d, 0xe6, 0x70, 0xe9, 0x22, 0x53, 0xad, 0xfb, 0x12, 0x25, +0x44, 0x22, 0xab, 0x07, 0xbb, 0xff, 0x03, 0x7f, 0xff, 0x22, 0xeb, 0x70, 0x0c, 0x12, 0x12, 0x89, +0x74, 0x11, 0x93, 0xf5, 0x22, 0x74, 0x12, 0x80, 0x1d, 0x78, 0xaa, 0xe6, 0x14, 0xb5, 0x03, 0x0c, +0x12, 0x12, 0x89, 0x74, 0x13, 0x93, 0xf5, 0x22, 0x74, 0x14, 0x80, 0x0a, 0x12, 0x12, 0x89, 0x74, +0x0f, 0x93, 0xf5, 0x22, 0x74, 0x10, 0x93, 0xf5, 0x23, 0x90, 0x02, 0x8f, 0xe0, 0x70, 0x06, 0x90, +0x02, 0xb6, 0xe0, 0x60, 0x14, 0xe5, 0x23, 0x25, 0xe0, 0xff, 0xe5, 0x22, 0x33, 0xfe, 0x7c, 0x00, +0x7d, 0x03, 0x12, 0x09, 0x74, 0x8e, 0x22, 0x8f, 0x23, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, +0x12, 0x14, 0x6d, 0xeb, 0x25, 0xe0, 0x12, 0x13, 0x10, 0xfe, 0xc3, 0xef, 0x95, 0x23, 0xee, 0x95, +0x22, 0xaf, 0x03, 0x50, 0x02, 0x7f, 0xff, 0x22, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x22, +0x8f, 0x23, 0xe4, 0x78, 0x94, 0xf6, 0x08, 0xf6, 0x78, 0x92, 0xf6, 0x08, 0xf6, 0x90, 0x01, 0x9c, +0xe0, 0x7f, 0x00, 0x22, 0x9f, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0xef, 0x26, 0xf6, 0x18, 0xee, 0x36, +0xf6, 0x22, 0x90, 0x01, 0x9b, 0xe0, 0xff, 0x78, 0x9c, 0xe6, 0x22, 0xe6, 0xfe, 0x08, 0xe6, 0xff, +0x7c, 0x00, 0x7d, 0x0a, 0x02, 0x09, 0x62, 0xd3, 0xef, 0x9d, 0xec, 0x64, 0x80, 0xf8, 0xee, 0x64, +0x80, 0x98, 0x22, 0xd3, 0xe6, 0x94, 0x00, 0x18, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x22, 0xd3, 0xef, +0x95, 0x22, 0x74, 0x80, 0xf8, 0x6e, 0x98, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xa9, 0x93, 0xfe, +0xf4, 0xfc, 0xef, 0x54, 0xf0, 0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x16, 0xbd, +0x08, 0x02, 0x7d, 0x02, 0x78, 0x12, 0xed, 0x30, 0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, +0x5c, 0xf2, 0x18, 0x80, 0x08, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf8, 0xed, 0x24, 0xfb, +0x60, 0x0b, 0x14, 0x60, 0x11, 0x24, 0xfe, 0x70, 0x14, 0xe2, 0x5c, 0x80, 0x0b, 0xe2, 0x5c, 0xf2, +0x18, 0xe2, 0x4e, 0xf2, 0x80, 0x07, 0xe2, 0x4e, 0xf2, 0x18, 0xe2, 0x5c, 0xf2, 0xe4, 0xf5, 0xa0, +0xd2, 0xaf, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xb1, 0x93, 0xfe, 0xf4, 0xfc, 0xef, 0x54, 0xf0, +0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x16, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x78, +0x12, 0xed, 0x30, 0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0x80, 0x08, +0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf8, 0xed, 0x30, 0xe1, 0x05, 0xe2, 0x4e, 0xf2, 0x80, +0x03, 0xe2, 0x5c, 0xf2, 0x18, 0xed, 0x30, 0xe0, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, +0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x15, 0x0f, 0xa8, 0x0f, 0x76, 0x64, 0x90, 0xff, 0x58, +0xe0, 0xff, 0x90, 0xff, 0x50, 0xe0, 0x4f, 0x30, 0xe7, 0x06, 0xa8, 0x0f, 0x16, 0xe6, 0x70, 0xed, +0x78, 0x8a, 0xe6, 0x60, 0x1b, 0xa8, 0x0f, 0xe4, 0xf6, 0xa8, 0x0f, 0xe6, 0xff, 0xc3, 0x78, 0x8f, +0x96, 0x50, 0x1c, 0x12, 0x24, 0x95, 0x7d, 0x06, 0x12, 0x28, 0x53, 0xa8, 0x0f, 0x06, 0x80, 0xe9, +0x78, 0x7d, 0x12, 0x24, 0x93, 0x7d, 0x06, 0x12, 0x24, 0x8e, 0x7d, 0x06, 0x12, 0x27, 0xf8, 0x12, +0x25, 0x44, 0x05, 0x0f, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, +0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, +0xc0, 0x07, 0x12, 0x16, 0xaf, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, +0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, +0x8d, 0x2c, 0xe4, 0xff, 0xf5, 0x2e, 0xf5, 0x2f, 0x7e, 0xff, 0xef, 0xc3, 0x95, 0x2c, 0x50, 0x28, +0xef, 0x65, 0x2d, 0x60, 0x19, 0x12, 0x0a, 0x15, 0xfd, 0xac, 0xf0, 0xd3, 0x95, 0x2f, 0xec, 0x95, +0x2e, 0x40, 0x0b, 0xed, 0x24, 0x20, 0xf5, 0x2f, 0xe4, 0x3c, 0xf5, 0x2e, 0xae, 0x07, 0x0f, 0x74, +0x02, 0x29, 0xf9, 0xe4, 0x3a, 0xfa, 0x80, 0xd2, 0xaf, 0x06, 0x22, 0xe4, 0x90, 0x00, 0x3a, 0xf0, +0xef, 0x70, 0x11, 0x75, 0x88, 0x08, 0xf5, 0x8d, 0xf5, 0x8c, 0xf5, 0x8f, 0xf5, 0x8e, 0xf5, 0x88, +0x43, 0xac, 0x02, 0x22, 0x75, 0x88, 0x08, 0xe4, 0xf5, 0x8d, 0xf5, 0x8c, 0xef, 0x75, 0xf0, 0x20, +0xa4, 0xff, 0xe5, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x88, 0xa0, 0x53, 0xac, 0xfd, +0x22, 0xe4, 0x78, 0xae, 0xf6, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x64, 0x93, 0x78, 0xaa, 0xf6, 0xef, +0x24, 0x64, 0xf5, 0x0b, 0xe4, 0x3e, 0xf5, 0x0a, 0x78, 0x30, 0xe2, 0x54, 0xfe, 0xf2, 0x54, 0xfd, +0xf2, 0x54, 0xfb, 0xf2, 0xe4, 0x90, 0x02, 0x72, 0xf0, 0x90, 0x02, 0x99, 0xf0, 0x90, 0x02, 0x73, +0xf0, 0x90, 0x02, 0x9a, 0xf0, 0x22, 0x12, 0x2b, 0x4a, 0xfb, 0xef, 0xf4, 0x60, 0x2b, 0xc2, 0xaf, +0x75, 0xa0, 0xff, 0xbb, 0x01, 0x04, 0x7e, 0x18, 0x80, 0x08, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, +0x12, 0xfe, 0xed, 0xa8, 0x06, 0x60, 0x05, 0xe2, 0x4c, 0xf2, 0x80, 0x08, 0xe2, 0xff, 0xec, 0xf4, +0xfd, 0xef, 0x5d, 0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x12, 0x2b, 0x4a, 0xfe, 0xef, 0xf4, +0x60, 0x29, 0x90, 0xff, 0x13, 0xee, 0xd3, 0x94, 0x03, 0x40, 0x11, 0xaf, 0x06, 0xef, 0x75, 0xf0, +0x04, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0xed, 0x60, 0x04, 0xe0, +0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0xab, 0x1e, 0xe5, 0x20, +0x24, 0x0c, 0xf9, 0xe4, 0x35, 0x1f, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 0x27, 0xf9, 0xee, 0x3a, 0xfa, +0x12, 0x08, 0xe8, 0xff, 0x22, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x90, 0x00, 0x0b, 0x12, 0x09, +0x01, 0xff, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 0x22, 0xab, 0x1f, 0xaa, 0x20, +0xa9, 0x21, 0x90, 0x00, 0x01, 0x12, 0x09, 0x01, 0xff, 0x22, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xab, +0x1f, 0xaa, 0x20, 0xa9, 0x21, 0x12, 0x08, 0xe8, 0xff, 0x22, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, +0x5c, 0xf0, 0x90, 0xff, 0x48, 0x22, 0x75, 0x9b, 0x5a, 0x75, 0x9a, 0xa5, 0x75, 0x99, 0xf0, 0x75, +0x98, 0x0f, 0x75, 0xac, 0xff, 0x75, 0xad, 0xff, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74, 0xc0, +0xf0, 0x90, 0xff, 0x01, 0x74, 0x0f, 0xf0, 0x43, 0x95, 0x60, 0xe4, 0xf5, 0x96, 0x22, 0x78, 0x8d, +0xe6, 0x70, 0xfb, 0xff, 0xef, 0x12, 0x24, 0xe0, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x12, 0x24, +0xb8, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0x0f, 0xbf, 0x10, 0xea, 0x22, 0xef, 0x14, 0x60, 0x0a, 0x04, +0x70, 0x0e, 0x78, 0x30, 0xed, 0xf2, 0x7f, 0x00, 0x22, 0x78, 0xae, 0xa6, 0x05, 0x7f, 0x00, 0x22, +0x7f, 0x01, 0x22, 0xef, 0x24, 0x3b, 0xf5, 0x5b, 0xe4, 0x3e, 0xf5, 0x5a, 0x7e, 0x00, 0x7f, 0x03, +0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0x35, 0x02, 0x0c, 0xd9, 0x78, 0x9c, 0xe6, 0x60, 0x06, +0xc3, 0x94, 0xff, 0x50, 0x01, 0x06, 0x78, 0x9d, 0xe6, 0x60, 0x06, 0xc3, 0x94, 0xff, 0x50, 0x01, +0x06, 0x22, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb1, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, +0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x22, 0x7e, 0x00, 0x7f, 0x15, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, +0x79, 0x90, 0x12, 0x0c, 0xd9, 0x78, 0xa3, 0x76, 0xff, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xb1, +0x93, 0xfc, 0xef, 0xc4, 0x54, 0x0f, 0x22, 0x78, 0x88, 0xa6, 0x07, 0xef, 0x70, 0x04, 0x78, 0x8b, +0xa6, 0x07, 0x22, 0xef, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x22, 0xee, +0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 0x11, 0x16, 0x0e, 0x01, 0x0f, +0x78, 0x0f, 0x00, 0x64, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43, +0x17, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x28, 0x00, +0x80, 0x64, 0x00, 0x40, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc8, +0x00, 0xc8, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x11, 0x16, 0x0c, 0x02, 0x0f, 0x78, 0x14, 0x00, 0x3c, 0x41, 0x44, 0x51, +0x45, 0x52, 0x46, 0x53, 0x56, 0x54, 0x55, 0x43, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x2f, 0x28, 0x00, 0x80, 0x78, 0x00, 0x40, 0x0e, 0x14, 0x01, +0x0a, 0x08, 0x07, 0x00, 0x82, 0x1f, 0x1e, 0x32, 0x01, 0x2c, 0x1b, 0x1a, 0x32, 0x01, 0x2c, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xef, 0x01, 0x3f, 0x00, 0x28, 0x00, +0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xf0, 0x01, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x01, 0x01, 0x05, 0x02, 0x02, 0x30, 0x03, 0x07, 0x28, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x18, +0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, +0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xc2, 0xaf, 0x51, 0x96, 0xe5, 0x9b, 0xb4, +0x5a, 0x16, 0xe5, 0x9a, 0xb4, 0xa5, 0x11, 0xe5, 0x99, 0xb4, 0xf0, 0x0c, 0xe5, 0x98, 0xb4, 0x0f, +0x07, 0x90, 0xff, 0x85, 0xe0, 0x44, 0x20, 0xf0, 0x75, 0x8a, 0x0a, 0xd2, 0xaf, 0x7f, 0x0c, 0x31, +0x6b, 0x12, 0x33, 0xd9, 0x91, 0xea, 0xf1, 0x7e, 0x80, 0xfa, 0x75, 0x8f, 0x81, 0x75, 0x8e, 0x80, +0x75, 0x8a, 0xa0, 0x75, 0x8a, 0x0a, 0x90, 0x00, 0x38, 0xe0, 0x70, 0x02, 0xa1, 0xae, 0x14, 0x70, +0x02, 0xa1, 0xd6, 0x24, 0xfc, 0x70, 0x02, 0xc1, 0xb0, 0x04, 0x60, 0x02, 0xe1, 0x02, 0xe4, 0xf5, +0x1d, 0xf5, 0x1c, 0xf5, 0x1b, 0xf5, 0x1a, 0x75, 0x0d, 0x2b, 0x75, 0x0e, 0x7b, 0x12, 0x35, 0x0c, +0xe4, 0xfd, 0xff, 0x51, 0xdb, 0xf1, 0x87, 0x12, 0x18, 0x3b, 0xe4, 0xf5, 0x19, 0xf1, 0x67, 0x74, +0x02, 0x93, 0xff, 0xe5, 0x19, 0xc3, 0x9f, 0x50, 0x33, 0xaf, 0x19, 0x12, 0x1f, 0xe6, 0xd3, 0xef, +0x94, 0xb0, 0xee, 0x94, 0x36, 0x40, 0x21, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 0xfc, 0xa9, 0x19, 0xa8, +0x01, 0x12, 0x0c, 0x3f, 0xe5, 0x1d, 0x4f, 0xf5, 0x1d, 0xe5, 0x1c, 0x4e, 0xf5, 0x1c, 0xe5, 0x1b, +0x4d, 0xf5, 0x1b, 0xe5, 0x1a, 0x4c, 0xf5, 0x1a, 0x05, 0x19, 0x80, 0xc1, 0x75, 0x0c, 0x04, 0xe5, +0x0c, 0x70, 0x02, 0xe1, 0x02, 0xff, 0x12, 0x34, 0xef, 0x8e, 0x0d, 0x8f, 0x0e, 0xef, 0x4e, 0x60, +0x05, 0xe4, 0x90, 0x00, 0x38, 0xf0, 0x90, 0x01, 0x5a, 0xe5, 0x0c, 0xf1, 0x66, 0x74, 0x85, 0x93, +0x90, 0x01, 0xa5, 0xf1, 0x66, 0x74, 0x86, 0x93, 0x90, 0x01, 0xa6, 0xf1, 0x66, 0x74, 0x87, 0x93, +0x90, 0x01, 0xa7, 0xf1, 0x66, 0x74, 0x88, 0x93, 0x90, 0x01, 0xa8, 0xf0, 0xe1, 0x02, 0xe4, 0x78, +0xa5, 0xf6, 0xf1, 0x8e, 0xef, 0x64, 0x01, 0x60, 0xf9, 0x12, 0x35, 0x0c, 0xaf, 0x0e, 0xae, 0x0d, +0x51, 0xf3, 0xe4, 0xfd, 0xff, 0x51, 0xdb, 0x71, 0x36, 0xe4, 0x78, 0xa8, 0xf6, 0x08, 0xf6, 0x90, +0x00, 0x38, 0x04, 0xf0, 0xe1, 0x02, 0xe4, 0x78, 0x60, 0xf6, 0x08, 0xf6, 0x90, 0x01, 0xaf, 0xe0, +0xb4, 0x01, 0x08, 0x90, 0x00, 0x38, 0x74, 0x05, 0xf0, 0xe1, 0x02, 0x78, 0xa5, 0x76, 0x01, 0xf1, +0x87, 0x12, 0x18, 0x3b, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x61, 0x12, 0x23, 0x77, 0x78, 0x60, 0xa6, +0x07, 0x78, 0x66, 0xe6, 0x60, 0x07, 0x78, 0x6c, 0xe6, 0x60, 0x02, 0xc1, 0x9f, 0x78, 0x61, 0xe6, +0x30, 0xe0, 0x0f, 0x08, 0x76, 0x00, 0x08, 0x76, 0x64, 0x08, 0x76, 0x01, 0x08, 0x76, 0x90, 0x08, +0x76, 0x01, 0x78, 0x66, 0xe6, 0x60, 0x11, 0x78, 0x63, 0xe6, 0x78, 0x5c, 0xf6, 0x78, 0x65, 0xe6, +0x78, 0x5d, 0xf6, 0x08, 0x76, 0x01, 0x80, 0x08, 0xe4, 0x78, 0x5c, 0xf6, 0x08, 0xf6, 0x08, 0xf6, +0x78, 0x1e, 0x7c, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x5c, 0x7e, 0x00, 0x7f, 0x03, +0x12, 0x08, 0xc2, 0x90, 0x01, 0x9f, 0xe0, 0xf5, 0x21, 0x75, 0x22, 0x0f, 0x12, 0x0d, 0x05, 0x78, +0x5f, 0xa6, 0x07, 0x78, 0x66, 0xe6, 0x60, 0x3d, 0x90, 0x01, 0xab, 0xe0, 0xff, 0x60, 0x15, 0x78, +0x5f, 0xe6, 0x70, 0x10, 0x12, 0x34, 0xfd, 0x70, 0x01, 0x06, 0x86, 0x04, 0xd3, 0x9f, 0xec, 0x9e, +0x40, 0x23, 0x80, 0x1b, 0x90, 0x01, 0xac, 0xe0, 0xff, 0x60, 0x1a, 0x78, 0x5f, 0xe6, 0xb4, 0x0c, +0x14, 0x12, 0x34, 0xfd, 0x70, 0x01, 0x06, 0x86, 0x04, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x06, 0xe4, +0x90, 0x00, 0x38, 0xf0, 0x22, 0xf1, 0x87, 0x78, 0x61, 0xe6, 0xfd, 0x12, 0x30, 0xac, 0x80, 0x52, +0xf1, 0x67, 0x74, 0x02, 0x93, 0xff, 0x90, 0x01, 0x7b, 0xf0, 0x7e, 0x00, 0xe5, 0x0e, 0x24, 0x09, +0xfd, 0xe4, 0x35, 0x0d, 0xfa, 0xa9, 0x05, 0x7b, 0xff, 0x78, 0x7c, 0x7c, 0x01, 0x7d, 0x01, 0x12, +0x08, 0xc2, 0x90, 0x01, 0xaf, 0xe0, 0xb4, 0x01, 0x29, 0x75, 0x21, 0x01, 0x75, 0x22, 0x00, 0x75, +0x23, 0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x01, 0x75, 0x26, 0x30, 0x7b, 0x01, 0x7a, 0x01, 0x79, +0x70, 0x12, 0x19, 0xb6, 0xe4, 0x90, 0x01, 0xaf, 0xf0, 0x75, 0x8a, 0xa0, 0x90, 0x00, 0x3a, 0xf0, +0x80, 0xd0, 0x90, 0x01, 0x95, 0xe0, 0x64, 0x03, 0x70, 0x20, 0x7f, 0x01, 0x12, 0x32, 0xe8, 0x7f, +0x3c, 0x31, 0x6b, 0x75, 0x8d, 0x83, 0x75, 0x8c, 0xe8, 0xf1, 0x7e, 0x75, 0x8a, 0xa0, 0xf0, 0x75, +0x91, 0xc3, 0xf5, 0x91, 0xf1, 0xee, 0xf1, 0xee, 0x80, 0xef, 0xe4, 0x75, 0x1c, 0x88, 0x75, 0x1b, +0x13, 0xf5, 0x1a, 0xf5, 0x19, 0x78, 0xa5, 0xe6, 0x60, 0x2b, 0xaf, 0x1c, 0xae, 0x1b, 0xad, 0x1a, +0xac, 0x19, 0xec, 0x4d, 0x4e, 0x4f, 0x60, 0x1d, 0xf1, 0x7e, 0x75, 0x91, 0xc1, 0xf5, 0x91, 0xef, +0x24, 0xff, 0xf5, 0x1c, 0xee, 0x34, 0xff, 0xf5, 0x1b, 0xed, 0x34, 0xff, 0xf5, 0x1a, 0xec, 0x34, +0xff, 0xf5, 0x19, 0x80, 0xd0, 0x22, 0xf0, 0x85, 0x0e, 0x82, 0x85, 0x0d, 0x83, 0x22, 0x75, 0xf0, +0x20, 0xa4, 0x24, 0x08, 0xff, 0xe4, 0x35, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x8a, +0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x62, 0x22, 0xe4, 0xf5, +0x1e, 0xaa, 0x0d, 0xa9, 0x0e, 0x7b, 0xff, 0x75, 0x22, 0x01, 0x75, 0x23, 0x00, 0x75, 0x24, 0x31, +0x12, 0x1b, 0x28, 0xf1, 0x67, 0xe4, 0x93, 0xf4, 0x60, 0x0f, 0x90, 0x00, 0x31, 0x12, 0x35, 0x1a, +0x40, 0x04, 0xf1, 0xe6, 0x40, 0x03, 0x75, 0x1e, 0x01, 0xf1, 0x67, 0x74, 0x01, 0x93, 0xf4, 0x60, +0x0f, 0x90, 0x00, 0x33, 0x12, 0x35, 0x1a, 0x40, 0x04, 0xf1, 0xe6, 0x40, 0x03, 0x75, 0x1e, 0x01, +0x78, 0x60, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0x31, 0x7e, 0x00, 0x7f, 0x04, +0x12, 0x08, 0xc2, 0xaf, 0x1e, 0x22, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x22, 0x75, 0x8a, +0xa0, 0xf0, 0x75, 0x8a, 0xa0, 0xf0, 0x22, 0x7c, 0x00, 0x7d, 0xb0, 0x7f, 0x15, 0x12, 0x33, 0x18, +0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, +0x00, 0x79, 0xb0, 0x12, 0x0c, 0xd9, 0x51, 0xd5, 0x7d, 0x03, 0x7f, 0x12, 0x12, 0x28, 0x53, 0x90, +0xff, 0x1b, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x01, 0x57, +0x74, 0xb6, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0x04, 0xf0, 0xe4, 0x90, 0x01, 0x9c, 0xf0, 0xa3, 0x04, +0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x06, 0xf0, 0x90, 0x01, 0xa4, 0x74, 0x04, 0xf0, 0x90, 0x01, 0xa9, +0x74, 0x02, 0xf0, 0xa3, 0x74, 0x60, 0xf0, 0xa3, 0x74, 0x2d, 0xf0, 0xa3, 0x74, 0x32, 0xf0, 0xa3, +0x74, 0x01, 0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x9b, 0x74, 0x64, 0xf0, 0x90, 0x01, 0x9a, 0x74, 0x03, +0xf0, 0xe4, 0x78, 0xb0, 0xf6, 0x11, 0x81, 0x78, 0xaf, 0x76, 0x01, 0xe4, 0x90, 0x00, 0xaf, 0xf0, +0x22, 0x90, 0x01, 0xad, 0xe0, 0xff, 0x30, 0xe0, 0x05, 0x43, 0x90, 0x10, 0x80, 0x03, 0x53, 0x90, +0xef, 0xef, 0x90, 0xff, 0x10, 0x30, 0xe1, 0x06, 0xe0, 0x54, 0xe7, 0xf0, 0x80, 0x04, 0xe0, 0x44, +0x18, 0xf0, 0x90, 0x01, 0xad, 0xe0, 0x30, 0xe2, 0x02, 0x51, 0xdd, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, +0x89, 0x20, 0x8d, 0x21, 0x90, 0x01, 0xaa, 0xe0, 0xf5, 0x22, 0xe4, 0xf5, 0x23, 0x85, 0x21, 0x21, +0x51, 0xd5, 0x12, 0x1f, 0xea, 0xff, 0x7e, 0x00, 0x60, 0x02, 0x7e, 0x01, 0x90, 0x00, 0xb2, 0xee, +0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x00, 0x75, 0x26, 0xb3, 0xef, 0x60, 0x10, 0x51, 0x44, 0xab, +0x24, 0xaa, 0x25, 0xa9, 0x26, 0x74, 0x10, 0x75, 0xf0, 0x00, 0x12, 0x0a, 0xc5, 0x7e, 0x00, 0x7f, +0x17, 0x7d, 0xff, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0xb9, 0x12, 0x0c, 0xd9, 0x90, 0x00, 0xb2, 0xe0, +0xff, 0x78, 0xb0, 0xe6, 0xfe, 0x6f, 0x60, 0x24, 0xa3, 0xe0, 0x54, 0x3f, 0xf0, 0xee, 0x60, 0x06, +0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0a, 0x90, 0x00, 0xb3, 0xe0, 0xf0, 0xe4, 0x90, 0x00, 0xb1, 0xf0, +0x90, 0x00, 0xb2, 0xe0, 0x78, 0xb0, 0xf6, 0x75, 0x23, 0x01, 0x80, 0x0d, 0xee, 0x60, 0x0a, 0x90, +0x00, 0xb3, 0xe0, 0x54, 0x3f, 0xf0, 0x44, 0x80, 0xf0, 0xe5, 0x22, 0x20, 0xe7, 0x1c, 0x30, 0xe6, +0x07, 0x51, 0x3d, 0x12, 0x1f, 0xea, 0x70, 0x12, 0xe5, 0x22, 0x30, 0xe5, 0x04, 0xe5, 0x23, 0x70, +0x09, 0xe5, 0x22, 0x30, 0xe4, 0x0b, 0xe5, 0x21, 0x60, 0x07, 0x90, 0x01, 0x9d, 0xe0, 0xff, 0x51, +0x97, 0x90, 0x01, 0xad, 0xe0, 0x78, 0xaf, 0x66, 0x60, 0x07, 0x11, 0x81, 0x90, 0x01, 0xad, 0xe0, +0xf6, 0x90, 0x00, 0xaf, 0xe0, 0x70, 0x02, 0x41, 0x3c, 0xe5, 0x21, 0x60, 0x13, 0x51, 0x3d, 0xe4, +0xf5, 0xf0, 0x12, 0x0a, 0xc5, 0x51, 0x3d, 0x90, 0x00, 0x02, 0xe4, 0xf5, 0xf0, 0x12, 0x0a, 0xe4, +0x75, 0x2b, 0x30, 0xaf, 0x2b, 0x05, 0x2b, 0x74, 0xb0, 0x2f, 0x51, 0x8f, 0x74, 0x30, 0xf0, 0x51, +0x8b, 0xe5, 0x21, 0xf0, 0x05, 0x2b, 0x51, 0x3d, 0x12, 0x1f, 0xea, 0x7f, 0x00, 0x60, 0x02, 0x7f, +0x01, 0x51, 0x8b, 0xef, 0xf0, 0x90, 0x00, 0x0a, 0x12, 0x09, 0x01, 0x60, 0x05, 0x51, 0x8b, 0xe0, +0x04, 0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x00, 0x75, 0x26, 0xe3, 0x51, 0x44, 0x51, 0x3d, 0x90, +0x00, 0x06, 0x51, 0x6f, 0x51, 0x3d, 0x90, 0x00, 0x08, 0x51, 0x6f, 0x90, 0x00, 0xf0, 0x74, 0x40, +0xf0, 0x90, 0x01, 0x10, 0x74, 0x60, 0xf0, 0x90, 0x01, 0x30, 0x74, 0x80, 0xf0, 0x75, 0x24, 0x01, +0x75, 0x25, 0x00, 0x75, 0x26, 0xf1, 0x75, 0x27, 0x01, 0x75, 0x28, 0x01, 0x75, 0x29, 0x11, 0x75, +0x2b, 0x81, 0xe4, 0xf5, 0x2a, 0xaf, 0x2a, 0x12, 0x1f, 0xe6, 0x51, 0x75, 0xaf, 0x2a, 0x12, 0x2b, +0x63, 0xab, 0x27, 0xe5, 0x29, 0xf9, 0x24, 0x02, 0xf5, 0x29, 0xe5, 0x28, 0xfa, 0x34, 0x00, 0xf5, +0x28, 0x51, 0x85, 0xaf, 0x2a, 0x12, 0x00, 0x03, 0xae, 0x2b, 0x05, 0x2b, 0x74, 0xb0, 0x2e, 0x51, +0x8f, 0xef, 0xf0, 0x05, 0x2a, 0xe5, 0x2a, 0xc3, 0x94, 0x10, 0x40, 0xc9, 0x22, 0xab, 0x1e, 0xaa, +0x1f, 0xa9, 0x20, 0x22, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x0a, 0x15, 0xff, 0xae, 0xf0, +0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 0xfa, 0x34, 0x00, 0xf5, 0x25, +0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x90, 0x00, 0x02, 0x12, +0x0a, 0x40, 0xff, 0xae, 0xf0, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, +0xfa, 0x34, 0x00, 0xf5, 0x25, 0xee, 0x8f, 0xf0, 0x02, 0x0a, 0xc5, 0x74, 0xb0, 0x25, 0x2b, 0xf5, +0x82, 0xe4, 0x34, 0x00, 0xf5, 0x83, 0x22, 0xac, 0x07, 0x90, 0x01, 0xad, 0xe0, 0xfd, 0x30, 0xe2, +0x0a, 0x90, 0xff, 0x19, 0xe0, 0x54, 0xfb, 0xf0, 0x43, 0xac, 0x08, 0x90, 0xff, 0x18, 0xe0, 0x54, +0xfb, 0xf0, 0xec, 0x12, 0x2f, 0x6e, 0x75, 0x8a, 0x0a, 0x75, 0x91, 0xc1, 0xf5, 0x91, 0x51, 0xd5, +0x90, 0x01, 0x9e, 0xe0, 0x12, 0x2f, 0x6e, 0x75, 0x8a, 0x0a, 0x78, 0xa5, 0x76, 0x01, 0xed, 0x30, +0xe2, 0x02, 0x51, 0xdd, 0x22, 0x90, 0xff, 0x18, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x90, 0xff, 0x19, +0xe0, 0x44, 0x04, 0xf0, 0x53, 0xac, 0xf7, 0x22, 0xef, 0x60, 0x0e, 0x43, 0xac, 0x10, 0x71, 0x05, +0x44, 0x18, 0xf0, 0xe4, 0xf5, 0xa6, 0xf5, 0xa2, 0x22, 0x11, 0x81, 0x75, 0xa6, 0x68, 0x75, 0xa2, +0xc1, 0x53, 0xac, 0xef, 0x22, 0x90, 0xff, 0x12, 0xe0, 0x54, 0xe7, 0xf0, 0x90, 0xff, 0x11, 0xe0, +0x44, 0x18, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x22, 0xab, 0x07, 0x8c, 0x56, 0x8d, 0x57, 0x71, 0x05, +0x54, 0xe7, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, +0xf0, 0xe4, 0x90, 0x00, 0x39, 0xf0, 0x53, 0xac, 0xef, 0xf5, 0xa3, 0xeb, 0x44, 0x80, 0xf5, 0xa1, +0x75, 0xa6, 0x68, 0x75, 0xa2, 0xc1, 0x71, 0x53, 0xf5, 0xd5, 0x8f, 0xd4, 0x75, 0xd2, 0xff, 0x75, +0xd1, 0x5a, 0x22, 0xe0, 0x25, 0x57, 0xff, 0xe4, 0x35, 0x56, 0xf5, 0xd7, 0x8f, 0xd6, 0x22, 0xc0, +0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x85, 0xa3, 0x18, 0xaf, 0xa6, 0x75, +0xa3, 0x08, 0xef, 0x30, 0xe4, 0x0b, 0x90, 0x00, 0x39, 0x71, 0x53, 0x75, 0xd2, 0xff, 0x75, 0xd1, +0x5a, 0xe5, 0x18, 0x30, 0xe3, 0x16, 0xe5, 0xa6, 0x20, 0xe0, 0x0c, 0x75, 0xd2, 0x01, 0x75, 0xd5, +0x00, 0x75, 0xd4, 0x39, 0x75, 0xd1, 0x55, 0x75, 0xa3, 0x00, 0x80, 0x2d, 0xe5, 0x18, 0x30, 0xe0, +0x28, 0x90, 0x00, 0x39, 0xe0, 0xff, 0x25, 0x57, 0xfd, 0xe4, 0x35, 0x56, 0xf5, 0xd5, 0x8d, 0xd4, +0x75, 0xd2, 0xff, 0xef, 0xc3, 0x94, 0xc0, 0x40, 0x10, 0x75, 0xd1, 0x55, 0x90, 0x00, 0x39, 0xe0, +0xb4, 0xfe, 0x06, 0x90, 0x00, 0xaf, 0x74, 0x01, 0xf0, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, +0xe0, 0x32, 0x75, 0x91, 0xcc, 0x75, 0x91, 0x00, 0x32, 0x12, 0x2f, 0xf7, 0x78, 0xa6, 0x76, 0x00, +0x08, 0x76, 0x28, 0x90, 0x00, 0x38, 0x74, 0x04, 0xf0, 0x22, 0x8b, 0x22, 0x8a, 0x23, 0x89, 0x24, +0x90, 0x01, 0x9a, 0xe0, 0x30, 0xe1, 0x76, 0xe4, 0xf5, 0x28, 0xf5, 0x29, 0x12, 0x2f, 0x67, 0x74, +0x02, 0x93, 0xff, 0xe5, 0x29, 0xc3, 0x9f, 0x50, 0x36, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x75, +0xf0, 0x02, 0xe5, 0x29, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x12, 0x0a, 0x40, 0xfb, 0xaa, 0xf0, +0x12, 0x2f, 0x67, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, +0x09, 0x62, 0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x02, 0x05, 0x28, 0x05, 0x29, 0x80, 0xbd, 0x12, +0x2f, 0x67, 0x74, 0x02, 0x93, 0x75, 0xf0, 0x04, 0xa4, 0xff, 0xae, 0xf0, 0x7c, 0x00, 0x7d, 0x05, +0x12, 0x09, 0x74, 0xe5, 0x28, 0xc3, 0x9f, 0x40, 0x14, 0x91, 0x95, 0x74, 0xff, 0x12, 0x09, 0x2e, +0x91, 0x95, 0x90, 0x00, 0x01, 0x12, 0x09, 0x40, 0xe4, 0x90, 0x00, 0x38, 0xf0, 0x91, 0x95, 0x12, +0x08, 0xe8, 0xb4, 0x04, 0x1f, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x90, 0x00, 0x10, 0x12, 0x0a, +0x40, 0xff, 0xae, 0xf0, 0x7c, 0x00, 0x7d, 0x06, 0x12, 0x09, 0x74, 0x90, 0x00, 0x10, 0xee, 0x8f, +0xf0, 0x12, 0x0a, 0x78, 0x22, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, +0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, +0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x75, 0x89, 0x80, 0x90, 0x00, 0x3a, 0xe0, +0xc3, 0x94, 0x0a, 0x50, 0x06, 0xe0, 0x04, 0xf0, 0x75, 0x8a, 0x0a, 0x78, 0xa5, 0xe6, 0x60, 0x01, +0x16, 0x12, 0x2b, 0x0b, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, +0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xef, +0x24, 0xfc, 0x70, 0x05, 0x7e, 0x2c, 0x7f, 0x04, 0x22, 0xe4, 0xfe, 0xff, 0x22, 0xef, 0x75, 0xf0, +0x64, 0xa4, 0xff, 0xae, 0xf0, 0x78, 0xa8, 0x08, 0x06, 0xe6, 0x18, 0x22, 0xaf, 0x0e, 0xae, 0x0d, +0x12, 0x25, 0x91, 0xaf, 0x0e, 0xae, 0x0d, 0x02, 0x29, 0xa1, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, +0x94, 0x78, 0xee, 0x94, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xb6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xa8, +0x43, 0x53, 0x57, 0x5f, 0x32, 0x32, 0x31, 0x31, 0x35, 0x32, 0x37, 0x5f, 0x43, 0x53, 0x54, 0x38, +0x31, 0x36, 0x44, 0x5f, 0x43, 0x4f, 0x42, 0x5f, 0x5a, 0x54, 0x5f, 0x59, 0x41, 0x54, 0x5f, 0x4b, +0x35, 0x5f, 0x47, 0x31, 0x5f, 0x4a, 0x4c, 0x5f, 0x35, 0x35, 0x30, 0x32, 0x38, 0x2e, 0x68, 0x65, +0x78, +] + +#endif /*CAPACITIVE_HYNITRON_CST816D_UPDATE_H__*/ diff --git a/3.code/1.watch/2.code/common.py b/3.code/1.watch/2.code/common.py new file mode 100644 index 00000000..04489e7b --- /dev/null +++ b/3.code/1.watch/2.code/common.py @@ -0,0 +1,145 @@ +import _thread +import utime +from event_message import Event, EventManager + + +class Lock(object): + + def __init__(self): + self.lock = _thread.allocate_lock() + + def __enter__(self, *args, **kwargs): + self.lock.acquire() + + def __exit__(self, *args, **kwargs): + self.lock.release() + + +class LOG_LV(object): + """日志等级""" + DEBUG = "DEBUG" + INFO = "INFO" + WARNING = "WARNING" + ERROR = "ERROR" + CRITICAL = "CRITICAL" + + +class Abstract(object): + def post_processor_after_instantiation(self, *args, **kwargs): + """实例化后调用""" + pass + + def post_processor_before_initialization(self, *args, **kwargs): + """初始化之前调用""" + pass + + def initialization(self, *args, **kwargs): + """初始化load""" + pass + + def post_processor_after_initialization(self, *args, **kwargs): + """初始化之后调用""" + pass + + +class AbstractOutput(object): + def open(self): + pass + + def output(self, message, **kwargs): + pass + + def close(self): + pass + + +class PrintLogOutput(AbstractOutput): + def output(self, message, **kwargs): + fmt = "{} [ {} ] {} {}" + print(fmt.format(*message)) + + +class LogService(Abstract): + """ + default log is async queue + you can set + """ + INSTANCE = None + REPORTER = PrintLogOutput() + LEVEL = LOG_LV.DEBUG + MODE = 1 + LEVEL_MAP = { + LOG_LV.DEBUG: 0, + LOG_LV.INFO: 1, + LOG_LV.WARNING: 2, + LOG_LV.ERROR: 3, + LOG_LV.CRITICAL: 4 + } + + def __init__(self): + self.__event = Event(__name__) + self.__em = EventManager() + self.__em.register_event(self.__event) + + @classmethod + def create(cls): + if not cls.INSTANCE: + cls.INSTANCE = LogService() + cls.INSTANCE.start() + return cls.INSTANCE + + def log_send(self, tag, level, msg, mode): + if self.MODE: + mode = self.MODE + if self.LEVEL_MAP[level] >= self.LEVEL_MAP.get(self.LEVEL, 0): + output_format = "{ascdate} {asctime}" + rt = utime.localtime() + d_f = "{0:02}" + send_msg = (output_format.format( + ascdate=str(rt[0]) + "-" + d_f.format(rt[1]) + "-" + d_f.format(rt[2]) + , asctime=d_f.format(rt[3]) + ":" + d_f.format(rt[4]) + ":" + d_f.format(rt[5]) + ), tag, level, msg) + # self.REPORTER.output(send_msg) + print("{} [ {} ] {} {}".format(*send_msg)) + # self.__event.post(send_msg) + + def output(self, *args, **kwargs): + emo = kwargs.get("event_message") + self.REPORTER.output(emo.msg) + + def start(self): + self.__event.add_handler(self.output) + self.__em.start() + + +class LogAdapter(object): + """ + log adapter mode + mode used : adapter proxy single LogService + """ + + def __init__(self, tag, enable=1): + self.log_service = LogService.create() + self.tag = tag + self.enable = enable + self.mode = 1 + + def critical(self, msg): + if self.enable: + self.log_service.log_send(self.tag, LOG_LV.CRITICAL, msg, self.mode) + + def debug(self, msg): + if self.enable: + self.log_service.log_send(self.tag, LOG_LV.DEBUG, msg, self.mode) + + def info(self, msg): + if self.enable: + self.log_service.log_send(self.tag, LOG_LV.INFO, msg, self.mode) + + def warning(self, msg): + if self.enable: + self.log_service.log_send(self.tag, LOG_LV.WARNING, msg, self.mode) + + def error(self, msg): + if self.enable: + self.log_service.log_send(self.tag, LOG_LV.ERROR, msg, self.mode) diff --git a/3.code/1.watch/2.code/constants.py b/3.code/1.watch/2.code/constants.py new file mode 100644 index 00000000..1c7ca857 --- /dev/null +++ b/3.code/1.watch/2.code/constants.py @@ -0,0 +1,71 @@ +class PROTOCOL: + LK_SEND = "LK_SEND" + LK_RECV = "LK_RECV" + + PING_SEND = "PING_SEND" + PING_RECV = "PING_RECV" + + KA_SEND = "KA_SEND" + KA_RECV = "KA_RECV" + + UD_SEND = "UD_SEND" + UD_RECV = "UD_RECV" + + CR_SEND = "CR_SEND" + CR_RECV = "CR_RECV" + + FIND_SEND = "FIND_SEND" + FIND_RECV = "FIND_RECV" + + POWEROFF_SEND = "POWEROFF_SEND" + POWEROFF_RECV = "POWEROFF_RECV" + + H10_SEND = "H10_SEND" + H10_RECV = "H10_RECV" + + H11_SEND = "H11_SEND" + H11_RECV = "H11_RECV" + + H12_SEND = "H12_SEND" + H12_RECV = "H12_RECV" + + H13_SEND = "H13_SEND" + H13_RECV = "H13_RECV" + + H14_SEND = "H14_SEND" + H14_RECV = "H14_RECV" + +class EVENT: + CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND" + START_LOCATION = "START_LOCATION" + READ_LOCATION = "READ_LOCATION" + CLOSE_LOCATION = "CLOSE_LOCATION" + GPSOPEN = "GPSOPEN" + GPSCLOSE = "GPSCLOSE" + GPSINFO = "GPSINFO" + WIFISCANOPEN = "WIFISCANOPEN" + WIFIINFO = "WIFIINFO" + + GET_KEY = "GET_KEY" + SET_KEY = "SET_KEY" + GET_IMEI = "GET_IMEI" + GET_CID = "GET_CID" + SET_CID = "SET_CID" + GET_IMSI = "GET_IMSI" + GET_PASSWORD = "GET_PASSWORD" + SET_PASSWORD = "SET_PASSWORD" + GET_BATTERY = "GET_BATTERY" + PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET" + PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE" + SET_PING = "SET_PING" + GET_PING = "GET_PING" + SET_CONNECT = "SET_CONNECT" + GET_CONNECT = "GET_CONNECT" + GET_STEP = "GET_STEP" + PUSH_STEP = "PUSH_STEP" + SYSTEM_SLEEP = "SYSTEM_SLEEP" + SYSTEM_UP = "SYSTEM_UP" + START_HEART = "START_HEART" + PUSH_HEART = "PUSH_HEART" + START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" + PUSHT_BLOOD_OXYGEN = "PUSHT_BLOOD_OXYGEN" \ No newline at end of file diff --git a/3.code/1.watch/2.code/initTP.py b/3.code/1.watch/2.code/initTP.py new file mode 100644 index 00000000..da530304 --- /dev/null +++ b/3.code/1.watch/2.code/initTP.py @@ -0,0 +1,214 @@ +import log +from machine import I2C +import utime +from machine import Pin +import example +import uos +ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) +uos.mount(ldev,'/ext') +from ext import capacitive_hynitron_cst816d_update + +TP_HYN_I2C_UPDATE_WRITE_ADDR = (0x6A<<1) +TP_HYN_I2C_UPDATE_READ_ADDR = ((0x6A<<1)|1) +PER_LEN = 512 +x = 0 +y = 0 +#--------------------------------------------------------------------- +# cst816d_read_checksum +#--------------------------------------------------------------------- +def cst816d_read_checksum(): + + if -1 == cst816d_enter_bootmode(): + return -1 + + i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE) + cmd = [0] + + ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x03]), 2, bytearray(cmd), 1) + print("读取checksum写命令 ret:{} cmd[0]:{:#X} ".format(ret,cmd[0])) + utime.sleep_ms(500) + + r_data = bytearray(1) + ret = i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x08]), 2, r_data, 1, 0) + print("读取checksum读命令 ret:{} cmd[0]:{:#X} ".format(ret,r_data[0])) + + return r_data[0] +#--------------------------------------------------------------------- +# GPIO_ResetTP +#--------------------------------------------------------------------- +def GPIO_ResetTP(): + + print("GPIO_ResetTP") + + gpio_power = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_PU, 0) + gpio_power.write(1) + + gpio_reset = Pin(Pin.GPIO32, Pin.OUT, Pin.PULL_PU, 0) + gpio_reset.write(0) + utime.sleep_ms(10) + gpio_reset.write(1) + utime.sleep_ms(10) + +#--------------------------------------------------------------------- +# cst816d_update +#--------------------------------------------------------------------- +def cst816d_update(startAddr, length, data): + print("cst816d_update") + sum_len = 0 + cmd = [0,0] + global x + while 1: + x += 1 + #print("烧录次数:",str(x)) + if sum_len >= length: + print("sum_len >= length,退出循环") + return + a = startAddr&0xFF + #print('cmd[0]',a) + cmd[0]=a + b = startAddr>>8 + #print('cmd[1]',b) + cmd[1]=b + i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE) + + ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x14]), 2, bytearray(cmd), 2) + utime.sleep(1) + #print("烧写固件第一次写命令 ret:{} cmd[0]:{:#X} cmd[1]:{:#X}".format(ret,cmd[0],cmd[1])) + + ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x18]), 2, bytearray(data), PER_LEN) + utime.sleep(1) + #print("烧写固件包 ret : ",ret) + #print("data[0]:{:#X} data[1]:{:#X} data[2]:{:#X} data[510]:{:#X} data[511]:{:#X}".format(data[0],data[1],data[2],data[510],data[511])) + + cmd[0] = 0xEE + ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x04]), 2, bytearray(cmd), 1) + #print("烧写固件第二次写命令 ret:{} cmd[0]:{:#X} ".format(ret,cmd[0])) + utime.sleep(1) + + retrycnt = 51 + for i in range (retrycnt): + r_data = bytearray(1) + ret = i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x05]), 2, r_data, 1, 0) + utime.sleep(1) + #print("烧写固件读数据 ret:{} r_data[0]:{:#X} ".format(ret,r_data[0])) + if r_data[0] == 0x55: + print("r_data[0] = 0x55,break") + break + + startAddr = startAddr + PER_LEN + del data[0:PER_LEN] + #data = data + PER_LEN + sum_len = sum_len + PER_LEN + #print("PER_LEN:",PER_LEN) + #print('startAddr:',hex(startAddr)) + #print("data[0]:{:#X} data[1]:{:#X} data[2]:{:#X} data[510]:{:#X} data[511]:{:#X}".format(data[0],data[1],data[2],data[510],data[511])) + #print('sum_len:',sum_len) + +#--------------------------------------------------------------------- +# cst816d_enter_bootmode +#--------------------------------------------------------------------- +def cst816d_enter_bootmode(): + + print("cst816s_enter_bootmode") + GPIO_ResetTP() + i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE) + + cmd = [0xAB] + #进入boot模式 + retrycnt = 10 + global y + for i in range (retrycnt): + y += 1 + print("第{}次尝试进入boot模式".format(y)) + if 0 == i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x01]), 2, bytearray(cmd), 1): + utime.sleep_ms(2) + print("boot模式写命令 cmd[0]:{:#X} ".format(cmd[0])) + else: + print("boot模式写命令失败") + + r_data = bytearray(1) + if -1 == i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x03]), 2, r_data, 1, 0): + utime.sleep_ms(2) + print("boot模式读flag失败") + else: + if 0xc1 == r_data[0]: + print("成功进入boot模式 flag:{:#X} ".format(r_data[0])) + utime.sleep_ms(2) + return 0 + else: + print("boot模式进入失败") + + return -1 +#--------------------------------------------------------------------- +# ctp_hynitron_update +#--------------------------------------------------------------------- +def ctp_hynitron_update(): + + print("ctp_hynitron_update") + # 初始化固件数组和数组长度 + p_app_bin = [] + app_bin_len = 0 + + #进入boot模式 + if -1 == cst816d_enter_bootmode(): + return + + # 获取固件数组 + p_app_bin = capacitive_hynitron_cst816d_update.app_bin_816d + # 获取固件数组的长度 + app_bin_len = len(p_app_bin) + print("获取固件文件 length ",app_bin_len) + + if app_bin_len > 10: + startAddr = p_app_bin[1] + length = p_app_bin[3] + checksum = p_app_bin[5] + + startAddr <<= 8; startAddr |= p_app_bin[0] + length <<= 8; length |= p_app_bin[2] + checksum <<= 8; checksum |= p_app_bin[4] + print("startAddr:%x"%startAddr) + print("length:%x"%length) + print("checksum:%x"%checksum) + + del p_app_bin[0:6] + cst816d_update(startAddr, length, p_app_bin) + + # #检查checksum + # if cst816d_read_checksum() != checksum: + + # del p_app_bin[0:6] + # cst816d_update(startAddr, length, p_app_bin) + + # #升级后再次确认checksum + # if checksum == cst816d_read_checksum(): + # print("固件升级成功!") + + # elif checksum == cst816d_read_checksum(): + # print("固件包checksum相同") + + # else: + # print("checksum读取失败") +#--------------------------------------------------------------------- +# HYN_Initial +#--------------------------------------------------------------------- +def HYN_Initial(): + + print("HYN_Initial") + GPIO_ResetTP() + + ctp_hynitron_update() + + GPIO_ResetTP() +#--------------------------------------------------------------------- +# main +#--------------------------------------------------------------------- +print("tpcst816d_test: tp start init!!") +HYN_Initial() +print("tpcst816d_test: tp start init end!!") + + + + + + diff --git a/3.code/1.watch/2.code/lcd.py b/3.code/1.watch/2.code/lcd.py new file mode 100644 index 00000000..2f83db90 --- /dev/null +++ b/3.code/1.watch/2.code/lcd.py @@ -0,0 +1,198 @@ +import lvgl as lv +from machine import LCD, Pin +from tp import cst816 +import _thread +import utime +from ext import EventMesh + + +init_data = ( + + 0, 0, 0x11, + 2, 0, 120, + + 0, 1, 0x36, + 1, 1, 0x00, + + 0, 1, 0x35, + 1, 1, 0x00, + + 0, 1, 0x3a, + 1, 1, 0x05, + + 0, 5, 0xB2, + 1, 1, 0x0c, + 1, 1, 0x0c, + 1, 1, 0x00, + 1, 1, 0x33, + 1, 1, 0x33, + + 0, 1, 0xB7, + 1, 1, 0x77, + + 0, 1, 0xBB, + 1, 1, 0x2c, + + 0, 1, 0xC0, + 1, 1, 0x2C, + + 0, 1, 0xC2, + 1, 1, 0x01, + + 0, 1, 0xC3, + 1, 1, 0x21, + + 0, 1, 0xC4, + 1, 1, 0x20, + + 0, 1, 0xC6, + 1, 1, 0x10, + + 0, 2, 0xD0, + 1, 1, 0xA4, + 1, 1, 0xA1, + + 0, 14, 0xE0, + 1, 1, 0xd0, + 1, 1, 0x03, + 1, 1, 0x08, + 1, 1, 0x0e, + 1, 1, 0x12, + 1, 1, 0x2d, + 1, 1, 0x42, + 1, 1, 0x45, + 1, 1, 0x53, + 1, 1, 0x29, + 1, 1, 0x16, + 1, 1, 0x15, + 1, 1, 0x22, + 1, 1, 0x24, + + 0, 14, 0xE1, + 1, 1, 0xd0, + 1, 1, 0x03, + 1, 1, 0x08, + 1, 1, 0x0e, + 1, 1, 0x13, + 1, 1, 0x2c, + 1, 1, 0x42, + 1, 1, 0x54, + 1, 1, 0x50, + 1, 1, 0x2c, + 1, 1, 0x16, + 1, 1, 0x16, + 1, 1, 0x20, + 1, 1, 0x27, + #0, 0, 0x11, + 0, 0, 0x21, + 0, 0, 0x29, + #0, 1, 0xe7, + #1, 1, 0x11, +) + +XSTART_H = 0xf0 +XSTART_L = 0xf1 +YSTART_H = 0xf2 +YSTART_L = 0xf3 +XEND_H = 0xE0 +XEND_L = 0xE1 +YEND_H = 0xE2 +YEND_L = 0xE3 + +XSTART = 0xD0 +XEND = 0xD1 +YSTART = 0xD2 +YEND = 0xD3 + +lcd = LCD() + +init_buf = bytearray(init_data) + +init_data2 = ( + 0, 4, 0x2a, + 1, 1, XSTART_H, + 1, 1, XSTART_L, + 1, 1, XEND_H, + 1, 1, XEND_L, + 0, 4, 0x2b, + 1, 1, YSTART_H, + 1, 1, YSTART_L, + 1, 1, YEND_H, + 1, 1, YEND_L, + 0, 0, 0x2c, +) +invalid = bytearray(init_data2) + +init_data3 = ( + 0, 0, 0x28, + 2, 0, 120, + 0, 0, 0x10, +) +displayoff = bytearray(init_data3) + +init_data4 = ( + 0, 0, 0x11, + 2, 0, 20, + 0, 0, 0x29, +) +displayon = bytearray(init_data4) + + +lcd_ctrl = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_DISABLE, 1) +lcd.lcd_init(init_buf, 240, 320, 52000, 1, 4, 0, invalid, displayon, displayoff, None,TESel = True,TEPin = 7) +gpio_backlight = Pin(Pin.GPIO17, Pin.OUT, Pin.PULL_PU, 0) +gpio_backlight.write(1) + +LCD_SIZE_W = 240 +LCD_SIZE_H = 320 + +# 初始化lvgl +lv.init() + +# Register SDL display driver. +disp_buf1 = lv.disp_draw_buf_t() +buf1_1 = bytearray(LCD_SIZE_W * LCD_SIZE_H * 2) +buf1_2= bytearray(LCD_SIZE_W * LCD_SIZE_H * 2) + +disp_buf1.init(buf1_1, buf1_2, len(buf1_1)) +disp_drv = lv.disp_drv_t() +disp_drv.init() +disp_drv.draw_buf = disp_buf1 +disp_drv.flush_cb = lcd.lcd_write +disp_drv.hor_res = LCD_SIZE_W +disp_drv.ver_res = LCD_SIZE_H +disp_drv.register() + +# CST816初始化 +tp_cst816 = cst816(i2c_no = 2,irq=33, reset=32) +tp_cst816.activate() +tp_cst816.init() +print("cst816 init...") +# LVGL触摸注册 +indev_drv = lv.indev_drv_t() +indev_drv.init() +indev_drv.type = lv.INDEV_TYPE.POINTER +indev_drv.read_cb = tp_cst816.read +indev_drv.long_press_time = 300 +indev_drv.register() +gpio4 = Pin(Pin.GPIO33, Pin.OUT, Pin.PULL_PU, 0) + +# def indev_task(): +# while 1: +# pos_s = tp_cst816.read_xy() +# # import _thread +# # x = _thread.get_heap_size() +# # print('heap:',x) +# if pos_s: +# if 100 == pos_s[0] and 400 == pos_s[1]: +# EventMesh.publish("done_return") +# print("return") +# utime.sleep_ms(200) +# else: +# utime.sleep_ms(200) + +# _thread.start_new_thread(indev_task,()) + +# 启动lvgv线程 +lv.tick_inc(5) +lv.task_handler() diff --git a/3.code/1.watch/2.code/location.py b/3.code/1.watch/2.code/location.py new file mode 100644 index 00000000..dad14903 --- /dev/null +++ b/3.code/1.watch/2.code/location.py @@ -0,0 +1,1024 @@ +# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import ure +import net +import math +import utime +import osTimer +import _thread +import wifiScan +import cellLocator + +from queue import Queue +from machine import UART, Pin + +try: + from wifilocator import wifilocator +except: + wifilocator = None + +from log import getLogger + +try: + import quecgnss +except ImportError: + quecgnss = None + +log = getLogger(__name__) + +_gps_read_lock = _thread.allocate_lock() +_gps_data_set_lock = _thread.allocate_lock() + +EE = 0.00669342162296594323 +EARTH_RADIUS = 6378.137 # Approximate Earth Radius(km) +M_PI = math.pi + + +class _loc_method(object): + gps = 0x1 + cell = 0x2 + wifi = 0x4 + + +class _gps_mode(object): + none = 0x0 + internal = 0x1 + external = 0x2 + + +def transformLat(x, y): + ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(math.fabs(x)) + ret += (20.0 * math.sin(6.0 * x * M_PI) + 20.0 * math.sin(2.0 * x * M_PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(y * M_PI) + 40.0 * math.sin(y / 3.0 * M_PI)) * 2.0 / 3.0 + ret += (160.0 * math.sin(y / 12.0 * M_PI) + 320 * math.sin(y * M_PI / 30.0)) * 2.0 / 3.0 + return ret + + +def transformLon(x, y): + ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(math.fabs(x)) + ret += (20.0 * math.sin(6.0 * x * M_PI) + 20.0 * math.sin(2.0 * x * M_PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(x * M_PI) + 40.0 * math.sin(x / 3.0 * M_PI)) * 2.0 / 3.0 + ret += (150.0 * math.sin(x / 12.0 * M_PI) + 300.0 * math.sin(x / 30.0 * M_PI)) * 2.0 / 3.0 + return ret + + +def WGS84ToGCJ02(lon, lat): + dLat = transformLat(lon - 105.0, lat - 35.0) + dLon = transformLon(lon - 105.0, lat - 35.0) + radLat = lat / 180.0 * M_PI + magic = math.sin(radLat) + magic = 1 - magic * magic * EE + sqrtMagic = math.sqrt(magic) + + dLat = (dLat * 180.0) / ((EARTH_RADIUS * 1000 * (1 - EE)) / (magic * sqrtMagic) * M_PI) + dLon = (dLon * 180.0) / (EARTH_RADIUS * 1000 / sqrtMagic * math.cos(radLat) * M_PI) + lon02 = lon + dLon + lat02 = lat + dLat + + return lon02, lat02 + + +class GPSMatch(object): + """This class is match gps NEMA 0183""" + + def GxRMC(self, gps_data): + """Match Recommended Minimum Specific GPS/TRANSIT Data(RMC) + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: RMC NMEA string. + """ + if gps_data: + rmc_re = ure.search( + r"\$G[NP]RMC,\d*\.*\d*,*[AV],*\d*\.*\d*,*[NS],*\d*\.*\d*,*[EW],*\d*\.*\d*,*\d*\.*\d*,*\d*,*\d*\.*\d*,*[EW]*,*[ADEN]*,*[SCUV]*\**(\d|\w)*", + gps_data) + if rmc_re: + return rmc_re.group(0) + return "" + + def GxGGA(self, gps_data): + """Match Global Positioning System Fix Data(GGA) + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: GGA NMEA string. + """ + if gps_data: + gga_re = ure.search( + r"\$G[BLPN]GGA,\d*\.*\d*,*\d*\.*\d*,*[NS],*\d*\.*\d*,*[EW],*[0126],*\d*,*\d*\.*\d*,*-*\d*\.*\d*,*M,*-*\d*\.*\d*,*M,*\d*,*\**(\d|\w)*", + gps_data) + if gga_re: + return gga_re.group(0) + return "" + + def GxVTG(self, gps_data): + """Match Track Made Good and Ground Speed(VTG) + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: VTG NMEA string. + """ + if gps_data: + vtg_re = ure.search(r"\$G[NP]VTG,\d*\.*\d*,*T,*\d*\.*\d*,*M,*\d*\.*\d*,*N,*\d*\.*\d*,*K,*[ADEN]*\*(\d|\w)*", + gps_data) + if vtg_re: + return vtg_re.group(0) + return "" + + def GxGSV(self, gps_data): + """Mactch GPS Satellites in View(GSV) + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: GSV NMEA string. + """ + if gps_data: + gsv_re = ure.search( + r"\$G[NP]GSV,\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*\**(\d|\w)*", + gps_data) + if gsv_re: + return gsv_re.group(0) + return "" + + def GxGLL(self, gps_data): + """Geographic Position + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: GLL NMEA string. + """ + if gps_data: + gll_re = ure.search(r"\$G[NP]GLL,\d*\.*\d*,*[NS]*,*\d*\.*\d*,*[EW]*,*\d*\.*\d*,*[AV]*,*[ADEN]*\**(\d|\w)*", + gps_data) + if gll_re: + return gll_re.group(0) + + def GxGSA(self, gps_data): + """GNSS DOP and Active Satellites + + Args: + gps_data(str): GPS NMEA string. + + Returns: + str: GSA NMEA string. + """ + if gps_data: + gsa_re = ure.search( + r"\$G[NP]GSA,[MA]*,*[123]*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*\.*\d*,*\d*\.*\d*,*\d*\.*\d*,*(\d|\w)*\**(\d|\w)*", + gps_data) + if gsa_re: + return gsa_re.group(0) + + +class GPSParse(object): + """Parse details from gps data""" + + def GxGGA_satellite_num(self, gga_data): + """Parse satellite num from GGA""" + if gga_data: + satellite_num_re = ure.search(r",[EW],[0126],\d+,", gga_data) + if satellite_num_re: + return satellite_num_re.group(0).split(",")[-2] + return "" + + def GxGGA_latitude(self, gga_data): + """Parse latitude from GGA""" + if gga_data: + latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data) + if latitude_re: + latitude = latitude_re.group(0)[1:-3] + return str(float(latitude[:2]) + float(latitude[2:]) / 60) + return "" + + def GxGGA_longitude(self, gga_data): + """Parse longitude from GGA""" + if gga_data: + longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data) + if longitude_re: + longitude = longitude_re.group(0)[1:-3] + return str(float(longitude[:3]) + float(longitude[3:]) / 60) + return "" + + def GxGGA_altitude(self, gga_data): + """Parse altitude from GGA""" + if gga_data: + altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data) + if altitude_re: + return altitude_re.group(0)[1:-3] + return "" + + def GxVTG_speed(self, vtg_data): + """Parse speed from VTG""" + if vtg_data: + speed_re = ure.search(r",N,\d+\.\d+,K,", vtg_data) + if speed_re: + return speed_re.group(0)[3:-3] + return "" + + def GxGSV_satellite_num(self, gsv_data): + """Parse satellite num from GSV""" + if gsv_data: + satellite_num_re = ure.search(r"\$G[NP]GSV,\d+,\d+,\d+,", gsv_data) + if satellite_num_re: + return satellite_num_re.group(0).split(",")[-2] + return "" + + def GxRMC_loc_status(self, rmc_data): + if rmc_data: + loc_status_re = ure.search(r"\$G[NP]RMC,\d*\.*\d*,[AV],", rmc_data) + if loc_status_re: + loc_status = loc_status_re.group(0).split(",")[-2] + return True if loc_status == "A" else False + return False + + def __nmea_parse(self, nmea): + return tuple(nmea[1:].split("*")[0].split(",")) if nmea else () + + def GxRMC(self, rmc_data): + return self.__nmea_parse(rmc_data) + + def GxGGA(self, gga_data): + return self.__nmea_parse(gga_data) + + def GxGSV(self, gsv_data): + return self.__nmea_parse(gsv_data) + + def GxGSA(self, gsa_data): + return self.__nmea_parse(gsa_data) + + def GxVTG(self, vtg_data): + return self.__nmea_parse(vtg_data) + + def GxGLL(self, gll_data): + return self.__nmea_parse(gll_data) + + +class GPS(object): + """This class if for reading gps data. + + Now support external gps and internal gps. + + Sleep power consumption: + power off < backup < standby + """ + + __RMC = 0 + __GGA = 1 + __GSV = 2 + __GSA = 3 + __VTG = 4 + __GLL = 5 + __NMEA = 0b010111 + + def __init__(self, UARTn, buadrate, databits, parity, stopbits, flowctl, PowerPin, StandbyPin, BackupPin, gps_mode): + """Init GPS module + + [description] + + Args: + UARTn(int): UART No. + buadrate(int): baud rate + databits(int): data bits (5 ~ 8) + parity(int): parity (0 – NONE,1 – EVEN,2 - ODD) + stopbits(int): stop bit + flowctl(int): hardware control flow (0 – FC_NONE, 1 – FC_HW) + PowerPin(int): Power GIPO Pin + StandbyPin(int): Standby GPIO Pin + BackupPin(int): Back GPIO Pin + gps_mode(int): GPS mode + 0 - None + 1 - internal GPS + 2 - external GPS + """ + self.__UARTn = UARTn + self.__buadrate = buadrate + self.__databits = databits + self.__parity = parity + self.__stopbits = stopbits + self.__flowctl = flowctl + self.__PowerPin = PowerPin + self.__StandbyPin = StandbyPin + self.__BackupPin = BackupPin + self.__gps_mode = gps_mode + + self.__external_obj = None + self.__internal_obj = quecgnss + self.__gps_match = GPSMatch() + self.__gps_parse = GPSParse() + self.__gps_power_gpio = None + self.__gps_standby_gpio = None + self.__gps_backup_gpio = None + + self.__external_retrieve_queue = None + self.__queue_size = 2 + self.__first_break = 0 + self.__break = 0 + self.__gps_data = "" + self.__rmc_data = "" + self.__gga_data = "" + self.__vtg_data = "" + self.__gsv_data = "" + self.__gps_timer = osTimer() + self.__gps_data_check_timer = osTimer() + + if self.__gps_mode & _gps_mode.external: + self.__external_init() + elif self.__gps_mode & _gps_mode.internal: + self.__internal_init() + #print("GPS:__init__%d",self.__gps_mode) + def __gps_power_control(self, GPIOn, onoff, method): + if method == "power_switch": + if self.__gps_power_gpio is None: + self.__gps_power_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff) + gpio_obj = self.__gps_power_gpio + elif method == "standby": + if self.__gps_standby_gpio is None: + self.__gps_standby_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff) + gpio_obj = self.__gps_standby_gpio + elif method == "backup": + if self.__gps_backup_gpio is None: + self.__gps_backup_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff) + gpio_obj = self.__gps_backup_gpio + else: + raise TypeError("Param method %s is not compare." % method) + + if gpio_obj.read() != onoff: + gpio_obj.write(onoff) + if gpio_obj.read() != onoff: + return False + return True + + def __reverse_gps_data(self, this_gps_data): + """Reverse GPS data for regular match get the latest data""" + log.debug("this_gps_data: \n%s" % this_gps_data) + delimiter = "\r\n" + if this_gps_data: + _gps_data = self.__get_gps_data() + if _gps_data: + _gps_data = delimiter.join(_gps_data.split(delimiter)[::-1]) + _gps_data += this_gps_data.strip().replace("\r", "").replace("\n", "").replace("$", delimiter + "$") + _gps_data = delimiter.join(_gps_data.split(delimiter)[::-1]) + self.__set_gps_data(_gps_data) + + def __read_latitude(self, gps_data): + """Read latitude from gps data""" + return self.__gps_parse.GxGGA_latitude(self.__gps_match.GxGGA(gps_data)) + + def __read_longitude(self, gps_data): + """Read longitude from gps data""" + return self.__gps_parse.GxGGA_longitude(self.__gps_match.GxGGA(gps_data)) + + def __read_altitude(self, gps_data): + """Read altitude from gps data""" + return self.__gps_parse.GxGGA_altitude(self.__gps_match.GxGGA(gps_data)) + + def __set_gps_data(self, gps_data): + self.__gps_data = gps_data + + def __get_gps_data(self): + return self.__gps_data + + def __gps_timer_callback(self, args): + """GPS read timer callback + When over time to get uart data, break queue wait + """ + self.__break = 1 + if self.__external_retrieve_queue is not None: + self.__external_retrieve_queue.put(False) + + def __gps_data_check_callback(self, args): + """GPS read old data clean timer callback + When GPS read over time, clean old gps data, wait to read new gps data. + """ + clean = False + if "" in (self.__rmc_data, self.__gga_data, self.__gsv_data): + clean = True + else: + if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data: + clean = True + elif self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data: + clean = True + elif self.__nmea_statement_exist(self.__GLL) and not self.__gll_data: + clean = True + + if clean: + self.__gps_nmea_data_clean() + + def __external_init(self): + """External GPS init""" + self.__external_retrieve_queue = Queue(maxsize=self.__queue_size) + + def __external_open(self): + """External GPS start, UART init""" + self.power_switch(1) + self.__external_obj = UART( + self.__UARTn, + self.__buadrate, + self.__databits, + self.__parity, + self.__stopbits, + self.__flowctl + ) + self.__external_obj.set_callback(self.__external_retrieve_cb) + + def __external_close(self): + """External GPS close, UART close, NOT GPS stop""" + self.__external_obj.close() + + def __external_retrieve_cb(self, args): + """ + GPS data retrieve callback from UART + When data comes, send a message to queue of data length + """ + # log.debug("GPS __external_retrieve_cb args: %s" % str(args)) + if self.__external_retrieve_queue.size() >= self.__queue_size: + self.__external_retrieve_queue.get() + self.__external_retrieve_queue.put(True) + + def __internal_init(self): + """Internal GPS init""" + if self.__internal_obj: + if self.__internal_obj.init() != 0: + self.__internal_open() + log.error("GNSS INIT Failed.") + else: + log.debug("GNSS INIT Success.") + else: + log.error("Module quecgnss Import Error.") + + def __internal_open(self): + """Internal GPS enable""" + if self.__internal_obj.get_state() == 0: + return True if self.__internal_obj.gnssEnable(1) == 0 else False + else: + return True + + def __internal_close(self): + """Internal GPS close""" + return True if self.__internal_obj.gnssEnable(0) == 0 else False + + def __nmea_statement_exist(self, nmea_item): + return (self.__NMEA & (0b1 << nmea_item)) >> nmea_item + + def __gps_nmea_data_clean(self): + self.__set_gps_data("") + self.__rmc_data = "" + self.__gga_data = "" + self.__gsv_data = "" + self.__gsa_data = "" + self.__vtg_data = "" + self.__gll_data = "" + + def __check_gps_valid(self, gps_data): + self.__reverse_gps_data(gps_data) + + if not self.__rmc_data: + self.__rmc_data = self.__gps_match.GxRMC(self.__get_gps_data()) + loc_status = self.__gps_parse.GxRMC_loc_status(self.__rmc_data) + + if self.__rmc_data and loc_status: + if self.__nmea_statement_exist(self.__GGA) and not self.__gga_data: + self.__gga_data = self.__gps_match.GxGGA(self.__get_gps_data()) + if self.__nmea_statement_exist(self.__GSV) and not self.__gsv_data: + self.__gsv_data = self.__gps_match.GxGSV(self.__get_gps_data()) + if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data: + self.__gsa_data = self.__gps_match.GxGSA(self.__get_gps_data()) + if self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data: + self.__vtg_data = self.__gps_match.GxVTG(self.__get_gps_data()) + if self.__nmea_statement_exist(self.__GLL) and not self.__gll_data: + self.__gll_data = self.__gps_match.GxGLL(self.__get_gps_data()) + + if self.__nmea_statement_exist(self.__GGA) and not self.__gga_data: + return False + if self.__nmea_statement_exist(self.__GSV) and not self.__gsv_data: + return False + if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data: + return False + if self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data: + return False + if self.__nmea_statement_exist(self.__GLL) and not self.__gll_data: + return False + return True + + return False + + def __external_read(self): + """Read external GPS data + + Return: + $GPTXT,01,01,02,ANTSTATUS=OPEN*2B + $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07 + $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22 + $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56 + $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02 + $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03 + $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54 + $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58 + $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B + $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71 + $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71 + $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70 + $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78 + $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72 + $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E + """ + self.__external_open() + log.debug("__external_read start") + + while self.__break == 0: + self.__gps_timer.start(50, 0, self.__gps_timer_callback) + signal = self.__external_retrieve_queue.get() + log.debug("[first] signal: %s" % signal) + if signal: + to_read = self.__external_obj.any() + log.debug("[first] to_read: %s" % to_read) + if to_read > 0: + self.__set_gps_data(self.__external_obj.read(to_read).decode()) + self.__gps_timer.stop() + self.__break = 0 + + self.__gps_nmea_data_clean() + self.__gps_data_check_timer.start(2000, 1, self.__gps_data_check_callback) + cycle = 0 + while self.__break == 0: + self.__gps_timer.start(1500, 0, self.__gps_timer_callback) + signal = self.__external_retrieve_queue.get() + log.debug("[second] signal: %s" % signal) + if signal: + to_read = self.__external_obj.any() + log.debug("[second] to_read: %s" % to_read) + if to_read > 0: + if self.__check_gps_valid(self.__external_obj.read(to_read).decode()): + self.__break = 1 + + self.__gps_timer.stop() + cycle += 1 + if cycle >= self.__retry: + self.__break = 1 + if self.__break != 1: + utime.sleep(1) + self.__gps_data_check_timer.stop() + self.__break = 0 + + # To check GPS data is usable or not. + self.__gps_data_check_callback(None) + self.__external_close() + log.debug("__external_read data: %s" % self.__get_gps_data()) + return self.__get_gps_data() + + def __internal_read(self): + from ext import EventMesh + log.debug("__internal_read start.") + """Read internal GPS data + + Return: + $GPTXT,01,01,02,ANTSTATUS=OPEN*2B + $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07 + $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22 + $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56 + $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02 + $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03 + $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54 + $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58 + $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B + $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71 + $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71 + $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70 + $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78 + $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72 + $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E + """ + + #self.__gps_nmea_data_clean() + + cycle = 0 + #while self.__break == 0: + gnss_data = quecgnss.read(1024*3) + #print("__internal_read") + #print(gnss_data) + if gnss_data and gnss_data[1]: + this_gps_data = gnss_data[1].decode() if len(gnss_data) > 1 and gnss_data[1] else "" + _gps_valid = self.__check_gps_valid(this_gps_data) + log.debug("_gps_valid: %s" % _gps_valid) + + #print("_gps_valid:",_gps_valid) + #print(str(_gps_valid),self.__get_gps_data()) + if _gps_valid == True : + #EventMesh.publish("time", [self.__get_gps_data(),"0",str(_gps_valid),"0"]) + return self.__get_gps_data() + else : + EventMesh.publish("time", [self.__get_gps_data(),"0",str(_gps_valid),"0"]) + return "" + + def read(self, retry=30): + """For user to read gps data + + Return: (res_code, gps_data) + res_code: + - 0: Success + - -1: Failed + gps_data: + $GPTXT,01,01,02,ANTSTATUS=OPEN*2B + $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07 + $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22 + $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56 + $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02 + $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03 + $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54 + $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58 + $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B + $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71 + $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71 + $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70 + $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78 + $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72 + $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E + """ + self.__retry = retry + gps_data = "" + if self.__gps_mode & _gps_mode.external: + gps_data = self.__external_read() + elif self.__gps_mode & _gps_mode.internal: + gps_data = self.__internal_read() + + res = 0 if gps_data else -1 + return (res, gps_data) + + def read_coordinates(self, gps_data): + """Read positioning coordinates. + + Params: + gps_data: read gps data. + map_coordinate_system: `WGS84` or GCJ02 + + Return: + (longitude, latitude, altitude) + """ + latitude = self.__read_latitude(gps_data) + latitude = float(latitude) if latitude else latitude + longitude = self.__read_longitude(gps_data) + longitude = float(longitude) if longitude else longitude + altitude = self.__read_altitude(gps_data) + altitude = float(altitude) if altitude else altitude + return (longitude, latitude, altitude) + + def power_switch(self, onoff): + """GPS module power switch + + Params: + onoff: 0 -- off, 1 -- on + """ + if self.__gps_mode & _gps_mode.external: + if self.__PowerPin is not None: + return self.__gps_power_control(self.__PowerPin, onoff, "power_switch") + else: + return False + elif self.__gps_mode & _gps_mode.internal: + # TODO: Interal GNSS power down will not be used this api. + if onoff == 0: + return self.__internal_close() + else: + return self.__internal_open() + + def backup(self, onoff): + """GPS module low enery mode backup + + Params: + onoff: 0 -- off, 1 -- on + """ + if self.__BackupPin is not None: + return self.__gps_power_control(self.__BackupPin, onoff, "backup") + else: + return False + + def standby(self, onoff): + """GPS module low enery mode standby + + Params: + onoff: 0 -- off, 1 -- on + """ + if self.__StandbyPin is not None: + return self.__gps_power_control(self.__StandbyPin, onoff, "standby") + else: + return False + + def set_nmea_statement(self, nmea_statement): + """Set NMEA statement to check gps info valid + + RMC, GGA, GSV must be required. + + Args: + nmea_statement(int): + RMC - 0b1 << 0 (bit0), 0 - off, 1 - on + GGA - 0b1 << 1 (bit1), 0 - off, 1 - on + GSV - 0b1 << 2 (bit2), 0 - off, 1 - on + GSA - 0b1 << 3 (bit3), 0 - off, 1 - on + VTG - 0b1 << 4 (bit4), 0 - off, 1 - on + GLL - 0b1 << 5 (bit5), 0 - off, 1 - on + + Returns: + bool: True - success, False - falied. + """ + if nmea_statement >= 0b111: + self.__NMEA = nmea_statement + return True + return False + + +class CellLocator(object): + """This class is for reading cell location data""" + + def __init__(self, serverAddr, port, token, timeout, profileIdx): + self.__serverAddr = serverAddr + self.__port = port + self.__token = token + self.__timeout = timeout + self.__profileIdx = profileIdx + + def read(self): + read_loc_res = self.__read_loc() + read_cell_res = self.__read_cell() + res = 0 if read_loc_res[0] == 0 or read_cell_res[0] == 0 else -1 + return (res, read_loc_res[1], read_cell_res[1]) + + def __read_loc(self): + """Read cell location data. + + Return: (res_code, loc_data) + res_code: + - 0: Success + - -1: Initialization failed + - -2: The server address is too long (more than 255 bytes) + - -3: Wrong key length, must be 16 bytes + - -4: The timeout period is out of range, the supported range is (1 ~ 300) s + - -5: The specified PDP network is not connected, please confirm whether the PDP is correct + - -6: Error getting coordinates + loc_data: + (117.1138, 31.82279, 550) + """ + res = -1 + loc_data = cellLocator.getLocation( + self.__serverAddr, + self.__port, + self.__token, + self.__timeout, + self.__profileIdx + ) + if isinstance(loc_data, tuple) and len(loc_data) == 3: + res = 0 + else: + res = loc_data + loc_data = () + + return (res, loc_data) + + def __read_cell(self): + res = -1 + near_cell = [] + server_cell = [] + + near_cells = net.getCi() + if near_cells != -1 and isinstance(near_cells, list): + near_cell = list(map(str, near_cells)) + + server_cells = net.getCellInfo() + if server_cells != -1 and isinstance(server_cells, tuple): + server_cell = server_cells + + res = 0 if near_cell or server_cell else -1 + return (res, {"near_cell": near_cell, "server_cell": server_cell}) + + +class WiFiLocator(object): + """This class is for reading wifi location data""" + + def __init__(self, token): + self.__wifilocator_obj = wifilocator(token) + + def read(self): + read_loc_res = self.__read_loc() + read_mac_res = self.__read_mac() + res = 0 if read_loc_res[0] == 0 or read_mac_res[0] == 0 else -1 + return (res, read_loc_res[1], read_mac_res[1]) + + def __read_loc(self): + """Read wifi location data. + + Return: (res_code, loc_data) + res_code: + - 0: Success + - -1: The current network is abnormal, please confirm whether the dial-up is normal + - -2: Wrong key length, must be 16 bytes + - -3: Error getting coordinates + loc_data: + (117.1138, 31.82279, 550) + """ + res = -1 + loc_data = self.__wifilocator_obj.getwifilocator() + if isinstance(loc_data, tuple) and len(loc_data) == 3: + res = 0 + else: + res = loc_data + loc_data = () + + return (res, loc_data) + + def __read_mac(self): + res = -1 + macs = [] + if wifiScan.support(): + if wifiScan.control(1) == 0: + if wifiScan.getState(): + wifisacn_start = wifiScan.start() + if wifisacn_start != -1 and wifisacn_start[0] > 0: + macs = [i[0] for i in wifisacn_start[1]] + res = 0 + wifiScan.control(0) + return (res, macs) + + +class Location(object): + """This class is for reading location data from gps, cell, wifi""" + gps = None + cellLoc = None + wifiLoc = None + + def __init__(self, loc_method, locator_init_params): + """Init Location module + + 1. If loc_method include gps then init gps module; + 2. If loc_method inculde cell then init cell module; + 3. If loc_method Include wifi then init wifi module; + + Args: + loc_method(int): + 1 - gps + 2 - cell + 3 - cell & gps + 4 - wifi + 5 - wifi & gps + 6 - wifi & cell + 7 - wifi & cell & gps + locator_init_params(dict): + gps_cfg(dict):GPS module init args + cell_cfg(dict):CELL module init args + wifi_cfg(dict):WIFI module init args + """ + self.__loc_method = loc_method + self.__locator_init_params = locator_init_params + self.__locater_init() + + def __locater_init(self): + """Init gps, cell, wifi by loc_method""" + + if self.__loc_method & _loc_method.gps: + if self.gps is None: + _gps_cfg = self.__locator_init_params.get("gps_cfg", {}) + if _gps_cfg: + self.gps = GPS(**_gps_cfg) + if _gps_cfg.get("nmea_cfg") is not None: + self.gps.set_nmea_statement(_gps_cfg.get("nmea_cfg")) + else: + raise ValueError("Invalid gps init parameters.") + else: + self.gps = None + + if self.__loc_method & _loc_method.cell: + if self.cellLoc is None: + _cell_cfg = self.__locator_init_params.get("cell_cfg") + if _cell_cfg: + self.cellLoc = CellLocator(**_cell_cfg) + else: + raise ValueError("Invalid cell-locator init parameters.") + else: + self.cellLoc = None + + if self.__loc_method & _loc_method.wifi: + if self.wifiLoc is None: + _wifi_cfg = self.__locator_init_params.get("wifi_cfg") + if _wifi_cfg: + self.wifiLoc = WiFiLocator(**_wifi_cfg) + else: + raise ValueError("Invalid wifi-locator init parameters.") + else: + self.wifiLoc = None + + def __read_gps(self, retry): + """Read loction data from gps module + + Return: + $GPTXT,01,01,02,ANTSTATUS=OPEN*2B + $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07 + $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22 + $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56 + $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02 + $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03 + $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54 + $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58 + $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B + $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71 + $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71 + $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70 + $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78 + $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72 + $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E + """ + if self.gps: + return self.gps.read(retry)[1] + return "" + + def __read_cell(self): + """Read loction data from cell module + + Return: + (117.1138, 31.82279, 550) or () + """ + if self.cellLoc: + cell_loc_data = self.cellLoc.read() + return (cell_loc_data[1], cell_loc_data[2]) + return () + + def __read_wifi(self): + """Read loction data from wifi module + + Return: + (117.1138, 31.82279, 550) or () + """ + if self.wifiLoc: + wifi_loc_data = self.wifiLoc.read() + return (wifi_loc_data[1], wifi_loc_data[2]) + return () + + def read(self, retry=30): + """Read location data + + args: + retry(int): gps read uart data retry count. + + Returns: + dict: + key: + 1 - GPS data + 2 - CELL data + 4 - WIFI data + .e.g: + { + 1: "$GPGGA,XXX", + 2: (0.00, 0.00, 0.00), + 4: (0.00, 0.00, 0.00), + } + """ + loc_data = {} + + if self.__loc_method & _loc_method.gps: + loc_data[_loc_method.gps] = self.__read_gps(retry) + + if self.__loc_method & _loc_method.cell: + loc_data[_loc_method.cell] = self.__read_cell() + + if self.__loc_method & _loc_method.wifi: + loc_data[_loc_method.wifi] = self.__read_wifi() + + return loc_data + + def wgs84togcj02(self, Longitude, Latitude): + return WGS84ToGCJ02(Longitude, Latitude) + + +if __name__ == '__main__': + _gps_cfg = { + "UARTn": UART.UART1, + "buadrate": 115200, + "databits": 8, + "parity": 0, + "stopbits": 1, + "flowctl": 0, + "PowerPin": Pin.GPIO2, + "StandbyPin": Pin.GPIO3, + "BackupPin": None, + "gps_mode": 0x01, + } + gps = GPS(**_gps_cfg) + print("read {}".format(gps.read(300))) diff --git a/3.code/1.watch/2.code/main_1.py b/3.code/1.watch/2.code/main_1.py new file mode 100644 index 00000000..525ff7d0 --- /dev/null +++ b/3.code/1.watch/2.code/main_1.py @@ -0,0 +1,148 @@ + + + +class App(object): + def __init__(self): + self.managers = [] + + def append_manager(self, manager): + if isinstance(manager, Abstract): + manager.post_processor_after_instantiation() + self.managers.append(manager) + return self + + def start(self): + for manager in self.managers: + manager.post_processor_before_initialization() + manager.initialization() + manager.post_processor_after_initialization() + + +class watchApp(App): + def __init__(self): + super(watchApp, self).__init__() + self.__ui = None + + def set_ui(self, ui): + self.__ui = ui + + def start(self): + if self.__ui is not None: + self.__ui.start() + super().start() + + + +if __name__ == '__main__': + import uos + ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) + uos.mount(ldev,'/ext') + res = uos.statvfs("/ext") + res = list(res) + print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024))) + + from ext import EventMesh + from ext.common import Abstract + from ext.lcd import gpio_backlight,tp_cst816 + from ext.btn_device_ec800m import BtnDevice + from ext.protocol import LK_ProtoCol,PING_ProtoCol, CR_ProtoCol,UD_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,ProtoColResolver + import ext.mgr as mgr + import ext.ui as _ui + from ext.mgr import ConfigStoreManager, DeviceInfoManager, LocationManager, SockManager, \ + NetManager, BatteryManager,AddrBookManager,MsgManager,MsgdetailManager,CallLogManager,PhoneCallingManager + from ext.appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\ + Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent + from ext.ui_WatchFaceScreen import WatchFaceScreen + from ext.ui_main_menu import MainMenuScreen + + btn_device = BtnDevice(tp_cst816) + btn_device.start() + + ui = _ui.UI(gpio_backlight) + ui.add_screen(WatchFaceScreen()) + ui.add_screen(_ui.PopupScreen()) + ui.add_screen(_ui.PhoneScreen()) + ui.add_screen(MainMenuScreen()) + ui.add_screen(_ui.HeartrateScreen()) + ui.add_screen(_ui.SettingScreen()) + ui.add_screen(_ui.ToolboxScreen()) + ui.add_screen(_ui.StepScreen()) + ui.add_screen(_ui.AlarmScreen()) + ui.add_screen(_ui.CountdownScreen()) + ui.add_screen(_ui.StopwatchScreen()) + ui.add_screen(_ui.WeatherScreen()) + ui.add_screen(_ui.Spo2Screen()) + ui.add_screen(_ui.TemperatureScreen()) + ui.add_screen(_ui.ContactsScreen()) + ui.add_screen(_ui.WechatScreen()) + ui.add_screen(_ui.CountdownScreen()) + ui.add_screen(_ui.LanguageScreen()) + ui.add_screen(_ui.DialswitchScreen()) + ui.add_screen(_ui.ThemeswitchScreen()) + ui.add_screen(_ui.ImeiScreen()) + ui.add_screen(_ui.AppScreen()) + ui.add_screen(_ui.BrightnessScreen()) + ui.add_screen(_ui.VolumeScreen()) + ui.add_screen(_ui.RestoreScreen()) + ui.add_screen(_ui.PoweroffScreen()) + ui.add_screen(_ui.VersionScreen()) + ui.add_screen(_ui.UpdateScreen()) + ui.add_screen(_ui.AlarmvolumeScreen()) + ui.add_screen(_ui.MsgvolumeScreen()) + ui.add_screen(_ui.PhoneringScreen()) + ui.add_screen(_ui.DialingScreen()) + ui.add_screen(_ui.CallLogScreen()) + ui.add_screen(AlipayOpenScreen()) + ui.add_screen(Alipay_1_1()) + ui.add_screen(Alipay_invite()) + ui.add_screen(Alipay_inviting()) + ui.add_screen(Alipay_success()) + ui.add_screen(Alipay_paycode()) + ui.add_screen(Alipay_pay_success()) + ui.add_screen(Alipay_collect()) + ui.add_screen(Alipay_parent()) + ui.add_screen(_ui.UIFINDScreen()) + ui.add_screen(_ui.MsgDetailScreen()) + ui.add_screen(_ui.IncomingCallScreen()) + ui.add_screen(_ui.OnCallScreen()) + # ui.add_screen(_ui.Setting2Screen()) + # ui.add_screen(_ui.Setting3Screen()) + + + app = watchApp() + app.set_ui(ui) + app.append_manager(mgr.BrightNessLevelManager()) \ + .append_manager(mgr.AlarmVolumeLevelManager()) \ + .append_manager(mgr.MsgVolumeLevelManager()) \ + .append_manager(mgr.PhoneVolumeLevelManager()) \ + .append_manager(mgr.DeviceInfoManager()) \ + .append_manager(mgr.BatteryManager()) \ + + # .append_manager(mgr.StopwatchManager()) \ + # .append_manager(mgr.CountdownManager()) \ + + app.append_manager(Alipay()) + app.append_manager(ConfigStoreManager()) + app.append_manager(NetManager()) + app.append_manager(LocationManager()) + app.append_manager(AddrBookManager()) + app.append_manager(MsgManager()) + app.append_manager(MsgdetailManager()) + app.append_manager(CallLogManager()) + app.append_manager(PhoneCallingManager()) + + pcr = ProtoColResolver() + pcr.add_support(LK_ProtoCol()) + pcr.add_support(PING_ProtoCol()) + pcr.add_support(KA_ProtoCol()) + pcr.add_support(UD_ProtoCol()) + pcr.add_support(CR_ProtoCol()) + pcr.add_support(FIND_ProtoCol()) + pcr.add_support(POWEROFF_ProtoCol()) + sm = SockManager() + sm.add_support_resolver(pcr) + app.append_manager(sm) + app.start() + + EventMesh.publish("load_screen", {"screen": "watchface"}) + diff --git a/3.code/1.watch/2.code/main_4.py b/3.code/1.watch/2.code/main_4.py new file mode 100644 index 00000000..2f872f86 --- /dev/null +++ b/3.code/1.watch/2.code/main_4.py @@ -0,0 +1,15 @@ +import example +import uos +ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) +uos.mount(ldev,'/ext') + +#from usr.Alipay import Alipay + +#alipay = Alipay() +#alipay.post_processor_after_instantiation() + +example.exec('/ext/initTP.py') + + + + \ No newline at end of file diff --git a/3.code/1.watch/2.code/main_t.py b/3.code/1.watch/2.code/main_t.py new file mode 100644 index 00000000..7c7eec66 --- /dev/null +++ b/3.code/1.watch/2.code/main_t.py @@ -0,0 +1,131 @@ +from ext import EventMesh +from ext.common import Abstract +from ext.lcd import gpio_backlight,tp_cst816 +from ext.btn_device_ec800m import BtnDevice + + +class App(object): + def __init__(self): + self.managers = [] + + def append_manager(self, manager): + if isinstance(manager, Abstract): + manager.post_processor_after_instantiation() + self.managers.append(manager) + return self + + def start(self): + for manager in self.managers: + manager.post_processor_before_initialization() + manager.initialization() + manager.post_processor_after_initialization() + + +class watchApp(App): + def __init__(self): + super(watchApp, self).__init__() + self.__ui = None + + def set_ui(self, ui): + self.__ui = ui + + def start(self): + if self.__ui is not None: + self.__ui.start() + super().start() + + + +if __name__ == '__main__': + + # ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) + # uos.mount(ldev,'/ext') + #import ext.ui as _ui + from ext.protocol import LK_ProtoCol,PING_ProtoCol, CR_ProtoCol,UD_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,ProtoColResolver + import ext.mgr as mgr + import ext.ui as _ui + from ext.mgr import ConfigStoreManager, DeviceInfoManager, LocationManager, SockManager, \ + NetManager, BatteryManager + from ext.Alipay import Alipay + from ext.ui_WatchFaceScreen import WatchFaceScreen + + btn_device = BtnDevice(tp_cst816) + btn_device.start() + + ui = _ui.UI(gpio_backlight) + ui.add_screen(WatchFaceScreen()) \ + .add_screen(_ui.PopupScreen()) \ + .add_screen(_ui.PhoneScreen()) \ + .add_screen(_ui.TilemenuScreen()) \ + .add_screen(_ui.HeartrateScreen()) \ + .add_screen(_ui.SettingScreen()) \ + .add_screen(_ui.ToolboxScreen()) \ + .add_screen(_ui.StepScreen()) \ + .add_screen(_ui.AlarmScreen()) \ + .add_screen(_ui.CountdownScreen()) \ + .add_screen(_ui.StopwatchScreen()) \ + .add_screen(_ui.WeatherScreen()) \ + .add_screen(_ui.Spo2Screen()) \ + .add_screen(_ui.TemperatureScreen()) \ + .add_screen(_ui.ContactsScreen()) \ + .add_screen(_ui.WechatScreen()) \ + .add_screen(_ui.CountdownScreen()) \ + .add_screen(_ui.LanguageScreen()) \ + .add_screen(_ui.DialswitchScreen()) \ + .add_screen(_ui.ThemeswitchScreen()) \ + .add_screen(_ui.ImeiScreen()) \ + .add_screen(_ui.AppScreen()) \ + .add_screen(_ui.BrightnessScreen()) \ + .add_screen(_ui.VolumeScreen()) \ + .add_screen(_ui.RestoreScreen()) \ + .add_screen(_ui.PoweroffScreen()) \ + .add_screen(_ui.VersionScreen()) \ + .add_screen(_ui.UpdateScreen()) \ + .add_screen(_ui.AlarmvolumeScreen()) \ + .add_screen(_ui.MsgvolumeScreen()) \ + .add_screen(_ui.PhoneringScreen()) \ + .add_screen(_ui.DialingScreen()) \ + .add_screen(_ui.AlipayinviteScreen()) \ + .add_screen(_ui.AlipayinvitedefaultScreen()) \ + .add_screen(_ui.AlipayinvitewaitScreen()) \ + .add_screen(_ui.AlipayinvitesuccessScreen()) \ + .add_screen(_ui.AlipayMenuScreen()) \ + .add_screen(_ui.AlipaySettingScreen()) \ + .add_screen(_ui.AlipayPaycodeScreen()) \ + .add_screen(_ui.AlipayCollectScreen()) \ + .add_screen(_ui.PaymentSuccessScreen()) \ + .add_screen(_ui.RedbagdetailScreen()) \ + + + app = watchApp() + app.set_ui(ui) + app.append_manager(mgr.BrightNessLevelManager()) \ + .append_manager(mgr.AlarmVolumeLevelManager()) \ + .append_manager(mgr.MsgVolumeLevelManager()) \ + .append_manager(mgr.PhoneVolumeLevelManager()) \ + .append_manager(mgr.DeviceInfoManager()) \ + .append_manager(mgr.BatteryManager()) \ + + # .append_manager(mgr.StopwatchManager()) \ + # .append_manager(mgr.CountdownManager()) \ + + app.append_manager(Alipay()) + app.append_manager(ConfigStoreManager()) + app.append_manager(NetManager()) + app.append_manager(LocationManager()) + + pcr = ProtoColResolver() + pcr.add_support(LK_ProtoCol()) + pcr.add_support(PING_ProtoCol()) + pcr.add_support(KA_ProtoCol()) + pcr.add_support(UD_ProtoCol()) + pcr.add_support(CR_ProtoCol()) + pcr.add_support(FIND_ProtoCol()) + pcr.add_support(POWEROFF_ProtoCol()) + sm = SockManager() + sm.add_support_resolver(pcr) + app.append_manager(sm) + app.start() + + EventMesh.publish("load_screen", {"screen": "watchface"}) + diff --git a/3.code/1.watch/2.code/mgr.py b/3.code/1.watch/2.code/mgr.py new file mode 100644 index 00000000..2ad1eab3 --- /dev/null +++ b/3.code/1.watch/2.code/mgr.py @@ -0,0 +1,1225 @@ +from ext.common import Abstract, LogAdapter +from ext import EventMesh +import usocket +import ql_fs +import ujson +import _thread +import modem +import utime +import sim +import net +import dataCall +import checkNet +import osTimer +from ext import constants + +from ext.common import Lock, Abstract, LogAdapter +from ext.location import GPS, GPSMatch,CellLocator +from misc import USB, Power, ADC +from machine import ExtInt, Pin,Timer,RTC,UART +from ext import EventMesh +import audio +from Gsensor import SC7A20 +from Hsensor import GH3018 +import quecgnss +import wifiScan +import math +import voiceCall + +class BrightNessLevelManager(Abstract): + def __init__(self): + self.level = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("push_add_brightness_level", self.add) + EventMesh.subscribe("push_reduce_brightness_level", self.reduce) + EventMesh.subscribe("get_brightness_level", self.get) + + def add(self, event, msg): + if self.level < 7: + self.level = self.level + 1 + + def reduce(self, event, msg): + if self.level > 0: + self.level = self.level - 1 + + def get(self, event=None, msg=None): + return self.level + +class PhoneVolumeLevelManager(Abstract): + def __init__(self): + self.level = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("push_add_phonering_level", self.add) + EventMesh.subscribe("push_reduce_phonering_level", self.reduce) + EventMesh.subscribe("get_phonering_level", self.get) + + def add(self, event, msg): + if self.level < 7: + self.level = self.level + 1 + + def reduce(self, event, msg): + if self.level > 0: + self.level = self.level - 1 + + def get(self, event=None, msg=None): + return self.level + +class MsgVolumeLevelManager(Abstract): + def __init__(self): + self.level = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("push_add_msgvolume_level", self.add) + EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce) + EventMesh.subscribe("get_msgvolume_level", self.get) + + def add(self, event, msg): + if self.level < 7: + self.level = self.level + 1 + + def reduce(self, event, msg): + if self.level > 0: + self.level = self.level - 1 + + def get(self, event=None, msg=None): + return self.level + +class AlarmVolumeLevelManager(Abstract): + def __init__(self): + self.level = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("push_add_alarmvolume_level", self.add) + EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce) + EventMesh.subscribe("get_alarmvolume_level", self.get) + + def add(self, event, msg): + if self.level < 7: + self.level = self.level + 1 + + def reduce(self, event, msg): + if self.level > 0: + self.level = self.level - 1 + + def get(self, event=None, msg=None): + return self.level + +class StopwatchManager(Abstract): + def __init__(self): + self.level = 0 + self.ms_value = 0 + self.sec_value = 0 + self.min_value = 0 + self.timer = Timer(Timer.Timer1) + + def post_processor_after_instantiation(self): + EventMesh.subscribe("stopwatch_start", self.start) + EventMesh.subscribe("stopwatch_stop", self.paused) + EventMesh.subscribe("stopwatch_reset", self.reset) + EventMesh.subscribe("get_stopwatch_ms", self.get_ms) + EventMesh.subscribe("get_stopwatch_sec", self.get_sec) + EventMesh.subscribe("get_stopwatch_min", self.get_min) + + def start(self, event, msg): + self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun) + + def paused(self, event, msg): + self.timer.stop() + + def reset(self, event, msg): + self.timer.stop() + self.sec_value = 0 + self.min_value = 0 + self.ms_value = 0 + + def fun(self): + self.ms_value += 1 + if self.ms_value > 9: + self.ms_value = 0 + self.sec_value += 1 + if self.sec_value > 60: + self.sec_value = 0 + self.min_value += 1 + if self.min_value > 60: + self.timer.stop() + + def get_ms(self, event=None, msg=None): + return self.ms_value + + def get_min(self, event=None, msg=None): + return self.min_value + + def get_sec(self, event=None, msg=None): + return self.sec_value + +class CountdownManager(Abstract): + def __init__(self): + self.level = 0 + self.sec = 0 + self.min = 0 + self.hour = 0 + self.timer = Timer(Timer.Timer3) + self.total = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("add_countdown_sec", self.add_sec) + EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec) + EventMesh.subscribe("add_countdown_min", self.add_min) + EventMesh.subscribe("reduce_countdown_min", self.reduce_min) + EventMesh.subscribe("add_countdown_hour", self.add_hour) + EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour) + EventMesh.subscribe("get_countdown_sec", self.get_sec) + EventMesh.subscribe("get_countdown_min", self.get_min) + EventMesh.subscribe("get_countdown_hour", self.get_hour) + EventMesh.subscribe("stopwatch_start", self.start) + EventMesh.subscribe("stopwatch_reset", self.reset) + + + + + + def add_sec(self, event, msg): + if self.sec < 59: + self.sec = self.sec + 1 + + def reduce_sec(self, event, msg): + if self.sec > 0: + self.sec = self.sec - 1 + + def add_min(self, event, msg): + if self.min < 59: + self.min = self.min + 1 + + def reduce_min(self, event, msg): + if self.min > 0: + self.min = self.min - 1 + + def add_hour(self, event, msg): + if self.hour < 23: + self.hour = self.hour + 1 + + def reduce_hour(self, event, msg): + if self.hour > 0: + self.hour = self.hour - 1 + + def get_sec(self, event=None, msg=None): + return self.sec + + def get_min(self, event=None, msg=None): + return self.min + + def get_hour(self, event=None, msg=None): + return self.hour + + def start(self, event=None, msg=None): + self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.fun) + + def fun(self): + + self.total = self.get_hour()*60*60 + self.get_min()*60 + self.get_sec() + self.total = self.total - 1 + self.hour = self.total/3600 + self.min = (self.total - self.hour*3600) / 60 + self.sec = self.total % 60 + + if self.total < 1: + self.timer.stop() + + def reset(self, event=None, msg=None): + self.hour = 0 + self.min = 0 + self.sec = 0 + self.timer.stop() + + def pause(self, event=None, msg=None): + self.timer.stop() + +BATTERY_OCV_TABLE = { + "nix_coy_mnzo2": { + 55: { + 4152: 100, 4083: 95, 4023: 90, 3967: 85, 3915: 80, 3864: 75, 3816: 70, 3773: 65, 3737: 60, 3685: 55, + 3656: 50, 3638: 45, 3625: 40, 3612: 35, 3596: 30, 3564: 25, 3534: 20, 3492: 15, 3457: 10, 3410: 5, 3380: 0, + }, + 20: { + 4143: 100, 4079: 95, 4023: 90, 3972: 85, 3923: 80, 3876: 75, 3831: 70, 3790: 65, 3754: 60, 3720: 55, + 3680: 50, 3652: 45, 3634: 40, 3621: 35, 3608: 30, 3595: 25, 3579: 20, 3548: 15, 3511: 10, 3468: 5, 3430: 0, + }, + 0: { + 4147: 100, 4089: 95, 4038: 90, 3990: 85, 3944: 80, 3899: 75, 3853: 70, 3811: 65, 3774: 60, 3741: 55, + 3708: 50, 3675: 45, 3651: 40, 3633: 35, 3620: 30, 3608: 25, 3597: 20, 3585: 15, 3571: 10, 3550: 5, 3500: 0, + }, + }, +} + + + +class Battery(object): + """This class is for battery info. + + This class can get battery voltage and energy. + if adc_args is not None, use cbc to read battery + + adc_args: (adc_num, adc_period, factor) + + adc_num: ADC channel num + adc_period: Cyclic read ADC cycle period + factor: calculation coefficient + """ + + def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None): + self.__energy = 100 + self.__temp = 55 + + # ADC params + self.__adc = None + if adc_args: + self.__adc_num, self.__adc_period, self.__factor = adc_args + if not isinstance(self.__adc_num, int): + raise TypeError("adc_args adc_num is not int number.") + if not isinstance(self.__adc_period, int): + raise TypeError("adc_args adc_period is not int number.") + if not isinstance(self.__factor, float): + raise TypeError("adc_args factor is not int float.") + self.__adc = ADC() + + # Charge params + self.__charge_callback = None + self.__charge_status = None + self.__chrg_gpion = chrg_gpion + self.__stdby_gpion = stdby_gpion + self.__chrg_gpio = None + self.__stdby_gpio = None + self.__chrg_exint = None + self.__stdby_exint = None + if self.__chrg_gpion is not None and self.__stdby_gpion is not None: + self.__init_charge() + + def __chrg_callback(self, args): + self.__update_charge_status() + if self.__charge_callback is not None: + self.__charge_callback(self.__charge_status) + + def __stdby_callback(self, args): + self.__update_charge_status() + if self.__charge_callback is not None: + self.__charge_callback(self.__charge_status) + + def __update_charge_status(self): + if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1: + self.__charge_status = 0 + elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1: + self.__charge_status = 1 + elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0: + self.__charge_status = 2 + else: + raise TypeError("CHRG and STDBY cannot be 0 at the same time!") + + def __init_charge(self): + self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE) + self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE) + self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback) + self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, + self.__stdby_callback) + self.__chrg_exint.enable() + self.__stdby_exint.enable() + self.__update_charge_status() + + def __get_soc_from_dict(self, key, volt_arg): + """Get battery energy from map""" + if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]: + volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True) + pre_volt = 0 + volt_not_under = 0 # Determine whether the voltage is lower than the minimum voltage value of soc. + for volt in volts: + if volt_arg > volt: + volt_not_under = 1 + soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0) + soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0) + break + else: + pre_volt = volt + if pre_volt == 0: # Input Voltarg > Highest Voltarg + return soc1 + elif volt_not_under == 0: + return 0 + else: + return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt) + + def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"): + """Get battery energy by temperature and voltage""" + if bat_type == "nix_coy_mnzo2": + if temp > 30: + return self.__get_soc_from_dict(55, volt_arg) + elif temp < 10: + return self.__get_soc_from_dict(0, volt_arg) + else: + return self.__get_soc_from_dict(20, volt_arg) + + def __get_power_vbatt(self): + return int(sum([Power.getVbatt() for i in range(100)]) / 100) + + def __get_adc_vbatt(self): + self.__adc.open() + utime.sleep_ms(self.__adc_period) + adc_list = list() + for i in range(self.__adc_period): + adc_list.append(self.__adc.read(self.__adc_num)) + utime.sleep_ms(self.__adc_period) + adc_list.remove(min(adc_list)) + adc_list.remove(max(adc_list)) + adc_value = int(sum(adc_list) / len(adc_list)) + self.__adc.close() + vbatt_value = adc_value * (self.__factor + 1) + return vbatt_value + + def set_temp(self, temp): + """Set now temperature.""" + if isinstance(temp, int) or isinstance(temp, float): + self.__temp = temp + return True + return False + + def get_voltage(self): + """Get battery voltage""" + if self.__adc is None: + return self.__get_power_vbatt() + else: + return self.__get_adc_vbatt() + + def get_energy(self): + """Get battery energy""" + self.__energy = self.__get_soc(self.__temp, self.get_voltage()) + return self.__energy + + def set_charge_callback(self, charge_callback): + if self.__chrg_gpion is not None and self.__stdby_gpion is not None: + if callable(charge_callback): + self.__charge_callback = charge_callback + return True + return False + + def get_charge_status(self): + return self.__charge_status + + +class BatteryManager(Abstract): + def __init__(self): + """电池管理器""" + self.battery = Battery() + self.low_battery = False + + def post_processor_after_instantiation(self): + """订阅此类所有的事件到 EventMesh中""" + EventMesh.subscribe("get_battery", self.get_battery) + + def get_battery(self, event=None, msg=None): + battery = self.battery.get_energy() + return battery + + def get_voltage(self, event=None, msg=None): + voltage = self.battery.get_voltage() + return voltage + +class ConfigStoreManager(Abstract): + """ + 持久化落盘存储 + """ + + def __init__(self): + self.file_name = "/ext/conf_store.json" + self.lock = Lock() + self.map = dict() + + def post_processor_after_instantiation(self): + if ql_fs.path_exists(self.file_name): + self.map = ql_fs.read_json(self.file_name) + else: + self.__store() + EventMesh.subscribe("persistent_config_get", self.__read) + EventMesh.subscribe("persistent_config_store", self.__store) + + def __read(self, event, msg): + with self.lock: + return self.map.get(msg) + + def __store(self, event=None, msg=None): + if msg is None: + msg = dict() + with self.lock: + self.map.update(msg) + ql_fs.touch(self.file_name, self.map) + +def voice_callback(args): + if args[0] == 10: + print('voicecall incoming call, PhoneNO.: ', args[6]) + EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(args[6])}) + + elif args[0] == 11: + print('voicecall connected, PhoneNO.: ', args[6]) + EventMesh.publish("load_screen", {"screen": "on_call","meta":str(args[6])}) + + elif args[0] == 12: + print('voicecall disconnect') + EventMesh.publish("load_screen", {"screen": "watchface"}) + + elif args[0] == 13: + print('voicecall is waiting, PhoneNO.: ', args[6]) + elif args[0] == 14: + print('voicecall dialing, PhoneNO.: ', args[6]) + elif args[0] == 15: + print('voicecall alerting, PhoneNO.: ', args[6]) + elif args[0] == 16: + print('voicecall holding, PhoneNO.: ', args[6]) + +class DeviceInfoManager(Abstract): + + """ + 设备信息管理 + """ + + def __init__(self): + self.key = "" + self.imei = "" + self.cid = "ETEST20221014010" + self.imsi = "" + self.password = "000000" + #self.__city = None + #self.__location = None + self.timer_push_schedule = osTimer() + self.usb = USB() + #self.battery_push_schedule = osTimer() + self.check_battery_list = [] + self.__bat_num = 0 + self.usb.setCallback(self.usb_event_cb) + self.log = LogAdapter(self.__class__.__name__) + self.rtc = RTC() + self.step = [0,0,0,0] + self.timer_push=0 + self.timer_push_tmp=60 + self.PING = "0" #绑定状态 + self.connect = 0 #服务器连接状态 + self.KA_time = 0 + self.UD_time = 0 + self.UD_timeout = 7*60 + print("DeviceInfoManager:1") + self.gsensor = SC7A20() + print("DeviceInfoManager:1.0") + self.gsensor.activate() + print("DeviceInfoManager:1.1") + self.gsensor.init() + print("DeviceInfoManager:2") + # self.hsensor = GH3018() + # self.hsensor.activate() + # self.hsensor.init() + # self.hsensor.close() + # self.hsensor_time = osTimer() + # self.hsensor_time_count = 0 + # #print("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart())) + print("DeviceInfoManager:3") + ret = quecgnss.init() + if ret == 0: + print('GNSS init ok.') + else: + print('GNSS init failed.') + + def post_processor_after_instantiation(self): + print("post_processor_after_instantiation:1") + """订阅此类所有的事件到 EventMesh中""" + EventMesh.subscribe("screen_get_ope", self.get_device_ope) + EventMesh.subscribe("screen_get_sig", self.get_signal) + EventMesh.subscribe("screen_get_time", self.get_time) + EventMesh.subscribe("about_get_imei", self.get_imei) + EventMesh.subscribe("about_get_iccid", self.get_ic_cid) + EventMesh.subscribe("about_get_phonenum", self.get_phone_num) + EventMesh.subscribe("screen_get_battery", self.get_battery) + EventMesh.subscribe("get_fw_version", self.get_device_fw_version) + EventMesh.subscribe("get_standby_time", self.get_standby_time) + EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count) + EventMesh.subscribe("sim_slot_get", self.sim_slot_get) + EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch) + EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key) + EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key) + EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei) + EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid) + EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid) + EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi) + EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password) + EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password) + EventMesh.subscribe(constants.EVENT.READ_LOCATION, self.READ_LOCATION) + EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping) + EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping) + EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect) + EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect) + + + EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen) + EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart) + print("post_processor_after_instantiation:2") + self.timer_push_schedule.start(10000, 1, self.publish_event) + # self.battery_push_schedule.start(3000, 1, self.__check_battery) + self.log.debug("post_processor_after_instantiation finished") + #EventMesh.publish(constants.EVENT.START_HEART) + # 设备开机立刻更新一次参数 + self.publish_event() + print("post_processor_after_instantiation:3") + + + def publish_event(self, *args, **kwargs): + """ + 主动推送事件 + :param args: + :param kwargs: + :return: + """ + + self.timer_push = self.timer_push+1 + #if self.timer_push > 10 : + # EventMesh.publish("time", self.get_time()) + # EventMesh.publish("battery", self.get_battery()) + # EventMesh.publish("signal", self.get_signal()) + self.timer_push = 0 + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + if math.fabs(time_tmp - self.KA_time) > 7*60: #7分钟一次心跳 + self.KA_time = time_tmp + EventMesh.publish(constants.PROTOCOL.KA_SEND) + if math.fabs(time_tmp - self.UD_time) > self.UD_timeout: #7分钟一次定位 + self.UD_time = time_tmp + EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位 + EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count()) + #self.timer_push_tmp = self.timer_push_tmp+1 + + voiceCall.setCallback(voice_callback) + + #quecgnss.gnssEnable(0) + + + def READ_LOCATION(self, event, msg) : + #print("READ_LOCATIO",msg) + + EventMesh.publish(constants.PROTOCOL.UD_SEND,msg) + + def get_device_ope(self, event, msg): + """ + 获取设备运营商信息 + :param event: + :param msg: + :return: 运营商 + """ + net_ope_map = { + "UNICOM": "中国联通HD", + "CMCC": "中国移动HD", + "CT": "中国电信HD" + } + """获取运营商""" + try: + short_eons = net.operatorName()[1] + except Exception: + return "无" + return net_ope_map.get(short_eons, None) + + def get_signal(self, event=None, msg=None): + """ + 获取信号事件 + :param event: + :param msg: + :return: int 类型 + """ + return net.csqQueryPoll() + + def get_time_bucket(self, time): + if time < 12: + return '上午' + else: + return '下午' + + def get_week(self, week): + if week == 1: + return '一' + elif week == 2: + return '二' + elif week == 3: + return '三' + elif week == 4: + return '四' + elif week == 5: + return '五' + elif week == 6: + return '六' + elif week == 7 or week == 0: + return '日' + + def get_time(self, event=None, msg=None): + """ + 获取时间事件 + :param event: + :param msg: + :return: HH:MM 格式 + """ + rtc_time = self.rtc.datetime() + date = ("%d月%d日" % (rtc_time[1], rtc_time[2])) + week = ("星期%s"%(self.get_week(rtc_time[3]))) + time = [rtc_time[4], rtc_time[5]] + time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4]))) + + result = [time, time_quantum, date , week] + #时分,上午下午,日期,星期 + return result + + def get_step_count(self, event=None, msg=None): + """ + 获取步数 + """ + XYZ = self.gsensor.get_x_y_z() + tmp = 0 + #print("x:%d,y:%d,z:%d",XYZ[0],XYZ[1],XYZ[2]) + tmp = self.gsensor.get_step() + self.step[0]= tmp + self.step[1] = XYZ[0] + self.step[2] = XYZ[1] + self.step[3] = XYZ[2] + #print(self.step) + return self.step + + def get_ic_cid(self, event, msg): + """ + 获取ic cid事件 + :param event: + :param msg: + :return: str ic cid + """ + return sim.getIccid() + + def get_phone_num(self, event, msg): + """ + 获取电话号码事件 + :param event: + :param msg: + :return: str number + """ + return sim.getPhoneNumber() + + def get_battery(self, event=None, msg=None): + """ + 获取电池事件,暂时没支持 + :param event: + :param msg: + :return: + """ + + charge_state = '0' + if self.get_usb_state() == 1: + charge_state = '1' + else: + charge_state = '0' + + vbat = 0 + temp = Power.getVbatt() + if temp <= 3500: + + vbat = 20 #"E:/vbat_20.png" + elif temp <= 3600: + vbat = 40 #"E:/vbat_40.png" + elif temp <= 3800: + vbat = 60 #"E:/vbat_60.png" + elif temp <= 4000: + vbat = 80 #"E:/vbat_80.png" + else: + vbat = 100 #"E:/vbat_100.png" + + result = [charge_state, vbat] + + return result + + def get_device_fw_version(self, *args): + ''' + 获取设备固件版本号 + ''' + fw_version = modem.getDevFwVersion() + if isinstance(fw_version, str): + return fw_version + return "--" + + def get_standby_time(self, *args): + ''' + 获取设备单次开机待机时间 + ''' + time_msg = utime.time() + d = int( + time_msg / 86400) # The int call removes the decimals. Conveniently, it always rounds down. int(2.9) returns 2 instead of 3, for example. + time_msg -= ( + d * 86400) # This updates the value of x to show that the already counted seconds won't be double counted or anything. + h = int(time_msg / 3600) + time_msg -= (h * 3600) + m = int(time_msg / 60) + time_msg -= (m * 60) + s = time_msg + result = "{}天{}小时{}分".format(d, h, m) + return result + + def set_key(self, topic, msg): + self.key = msg["value"] + def get_key(self, topic, msg): + return self.key + + def get_imei(self, topic, msg): + if not self.imei: + self.imei = modem.getDevImei() + return self.imei + + def get_cid(self, topic, msg): + return self.cid + + def set_cid(self, topic, msg): + self.cid = msg["value"] + + def get_imsi(self, topic, msg): + if not self.imei: + self.imei = sim.getImsi() + return self.imsi + + def get_password(self, topic, msg): + return self.password + + def set_password(self, topic, msg): + self.password = msg["value"] + + def set_ping(self, topic, msg): + self.PING = msg + def get_ping(self, topic, msg): + return self.PING + + def set_connect(self, topic, msg): + #print("set_connect:{}".format(msg)) + self.connect = msg + def get_connect(self, topic, msg): + return self.connect + + def start_blood_oxygen(self, topic, msg): + print("start_blood_oxygen!!!") + self.hsensor.open_blood_oxygen() + self.hsensor_time.start(1000, 1, self.hsensor_time_cb) + self.hsensor_time_count = 0 + + def start_heart(self, topic, msg): + print("start_heart!!!") + self.hsensor.open_heart() + self.hsensor_time.start(1000, 1, self.hsensor_time_cb) + self.hsensor_time_count = 0 + + def hsensor_time_cb(self, *args, **kwargs): + #data 心律、血氧、高压、低压、HRV、佩戴状态 + data = self.hsensor.get_all_data() + self.hsensor_time_count += 1 + print("hsensor_time_cb:",str(data)) + if (data[0] != 0 and self.hsensor_time_count > 35) or self.hsensor_time_count > 45: + self.hsensor.close() + self.hsensor_time.stop() + EventMesh.publish(constants.EVENT.PUSH_HEART,[str(data[0]),str(data[2]),str(data[3])]) + if (data[1] != 0 and self.hsensor_time_count > 35) or self.hsensor_time_count > 45: + self.hsensor.close() + self.hsensor_time.stop() + EventMesh.publish(constants.EVENT.PUSHT_BLOOD_OXYGEN,str(data[1])) + + + def sim_slot_get(self, topic=None, msg=None): + return sim.getCurSimid() + + def sim_slot_switch(self, topic=None, slot=None): + """ + sim 卡槽切换 + :param topic: + :param slot: + :return: 切换sim卡卡槽 0 切换成功, 1 无需切换, -1 切换失败 + """ + if self.sim_slot_get() == slot: + return 1 + else: + return sim.switchCard(slot) + + def usb_event_cb(self, state): + EventMesh.publish("battery", self.get_battery()) + + def get_usb_state(self): + state = self.usb.getStatus() + if state == -1: + state = 0 + return state + +class SockManager(Abstract): + #END = "]" + + def __init__(self): + self.sock = None + self.resolver = None + self.run_flag = False + self.lost_conn_check_time = 5 * 60 * 30 + self.monitor_timer = osTimer() + self.connect_tmp = 0 + + def post_processor_after_instantiation(self): + EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send) + self.monitor_timer.start(7 * 60 * 1000, 1, self.check) + + def add_support_resolver(self, resolver): + self.resolver = resolver + + def initialization(self, *args, **kwargs): + self.connect() + + def connect(self): + print("tcp connect:api.xcloudtech.com") + try: + if(self.sock != None) : + self.sock.close() + self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) + self.sock.connect(("api.xcloudtech.com", 9000)) + _thread.start_new_thread(self.recv, ()) + utime.sleep(1) + # 发送数据 + EventMesh.publish(constants.PROTOCOL.LK_SEND) + except Exception as e: + print(e) + self.run_flag = False + else: + self.run_flag = True + + def check(self, *args): + if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了 + print("tcp reconnect!!!!!!!!!!!!!!!!!!") + EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网 + if(self.sock != None) : + self.sock.close() + _thread.start_new_thread(self.reconnect, ()) #重连 + + self.connect_tmp = 0 + + def reconnect(self, *args): + self.connect() + + def send(self, topic, msg): + self.sock.send(msg) + + def recv(self): + data = b'' + while True: + try: + r = self.sock.recv(512) + except Exception as e: + self.run_flag = False + if(self.sock != None) : + self.sock.close() + _thread.start_new_thread(self.reconnect, ()) + break + if not r: + self.run_flag = False + if(self.sock != None) : + self.sock.close() + _thread.start_new_thread(self.reconnect, ()) + break + data = data + r + if len(data) < 3: + continue + self.connect_tmp = 1 #有数据,就认为是连接状态 + EventMesh.publish(constants.EVENT.SET_CONNECT, 1) + self.resolver.handler(data.decode('ascii')) + data = b'' + +class NetManager(Abstract): + THRESHOLD = 10 + + def __init__(self): + self.__data_call = dataCall + self.__net = net + self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version") + self.timer = osTimer() + self.check_net_timeout = 100 * 1000 + + def post_processor_after_instantiation(self, *args, **kwargs): + count = 0 + while True: + count += 1 + if count > 5 : + return + data = dataCall.getInfo(1, 0) + print("data call INFO {}".format(data)) + if data[2][0]: + break + utime.sleep(1) + self.__data_call.start(2, 0, "", "", "", 0) + self.__data_call.setCallback(self.__datacall_cb) + + def __datacall_cb(self, args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + state = 2 + print("*** network %d connected! ***" % pdp) + EventMesh.publish('network_state', state) + else: + state = 3 + print("*** network %d not connected! ***" % pdp) + EventMesh.publish('network_state', state) + +def wifiScan_cb(args): + EventMesh.publish(constants.EVENT.WIFIINFO, args) + +class LocationManager(Abstract): + + def __init__(self): + self.gps = None + self.match = GPSMatch() + self.timer_read_GPS_info = osTimer() + self.wifi_data = [] + self.gps_data = [] + self.cell_data = [] + self.location_timer_count = 0 + self.location_check_data_timer_count = 0 + @staticmethod + def get_date(): + return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + + @staticmethod + def get_time(): + return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6]) + + def post_processor_after_instantiation(self): + _gps_cfg = { + "UARTn": UART.UART1, + "buadrate": 115200, + "databits": 8, + "parity": 0, + "stopbits": 1, + "flowctl": 0, + "PowerPin": Pin.GPIO2, + "StandbyPin": Pin.GPIO3, + "BackupPin": None, + "gps_mode": 0x01, + } + self.gps = GPS(**_gps_cfg) + self.gps.power_switch(0)#关闭GPS + EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open) + EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close) + EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location) + EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO) + EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open) + EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location) + + #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close) + + def start_location(self, event, msg): + #self.gps_open(event, msg) + #print("start_location") + EventMesh.publish(constants.EVENT.GPSOPEN) + self.location_timer_count = 0 + self.timer_read_GPS_info.start(1000, 1, self.location_timer) + self.wifi_data = [] + self.gps_data = [] + self.cell_data = [] + EventMesh.publish(constants.EVENT.WIFISCANOPEN) + + + def close_location(self, event, msg): + self.gps.power_switch(0) + wifiScan.control(0) + self.timer_read_GPS_info.stop() + + def WIFI_INFO(self, event, msg): + self.wifi_data = msg + # print("WIFI_INFO:") + # print([msg[0],msg]) + + def WIFI_scan_open(self, event, msg): + #print("WIFI_scan_open") + self.wifi_data = [] + if wifiScan.support(): + if wifiScan.getState() == False : + wifiScan.control(1) + wifiScan.setConfig(4, 2, 5, 6, 0) #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先 + wifiScan.setCallback(wifiScan_cb) #注册回调函数 + wifiScan.asyncStart() + #print("wifiScan.asyncStart") + else : + print("WIFI_scan_open:error1") + + + + def gps_open(self, event, msg): + #print("publish:gps_open") + quecgnss.init() + self.gps.__gps_nmea_data_clean() + + + def gps_close(self, event, msg): + quecgnss.gnssEnable(0) + + + def location_timer(self, *args, **kwargs): + self.location_timer_count = self.location_timer_count +1 + if self.location_timer_count > 60 : #1分钟定位超时,超时发送数据,停止定时器及关闭定位 + #print("publish:CLOSE_LOCATION") + self.location_timer_count = 0 + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data])#发送数据 + + + self.location_check_data_timer_count = self.location_check_data_timer_count+1 + if self.location_check_data_timer_count > 5 :#5秒查一次 + self.location_check_data_timer_count = 0 + #print(self.location_timer_count) + #检查wifi数据 + if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0: + EventMesh.publish(constants.EVENT.WIFISCANOPEN) + #检查GNSS数据 + if self.gps_data == [] and quecgnss.get_state() == 2: + self.gps.__gps_nmea_data_clean() + data = quecgnss.read(4096) + #print(data[1].decode()) + if data[0] > 0 : #有数据 + if self.gps.__check_gps_valid(data[1].decode()): #数据齐全 + match_gmc_data = self.match.GxRMC(data[1]).split(",") + match_vtg_data = self.match.GxVTG(data[1]).split(",") + match_gga_data = self.match.GxGGA(data[1]).split(",") + data = self.gps.read_coordinates(data[1]) + latitude_tmp = str(data[1]).split(".") + if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5: + latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6]) + latitude = "%s,%s"%(latitude,match_gmc_data[4] ) + longitude_tmp = str(data[0]).split(".") + if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5: + longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6]) + longitude = "%s,%s"%(longitude,match_gmc_data[6] ) #match_gmc_data[6] + str(data[1]) + high = str(data[2]) + self.gps_data = { + "latitude": latitude, + "longitude": longitude, + "high": high, + "direction": match_vtg_data[1], + "speed": match_vtg_data[5], + "number": match_gga_data[7], + + + } + #检查基站数据 + if self.cell_data == []: + + self.cell_data = net.getCellInfo() + for cell in self.cell_data: + if cell and cell[0][0] == 0 : + self.cell_data = cell + break + + if self.gps_data != [] : #or( self.wifi_data != [] and self.cell_data != []): + #print("publish:READ_LOCATION") + EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data]) + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + + +class AddrBookManager(Abstract): + # 通讯录 + def post_processor_after_instantiation(self): + EventMesh.subscribe("get_addr_book_list", self.get) + # 可通过此push_addr_book_list主动推送 + + def get(self, event, msg): + return { + "张三": "15692025051", + "李四": "15692025051", + "崔崔": "15692025051", + "鱼鱼": "15692025051", + "坤坤": "15692025051", + } + +class MsgManager(Abstract): + # 短信 + def __init__(self): + self.msg_nums = 0 + self.msg_detail = "" + + def post_processor_after_instantiation(self): + EventMesh.subscribe("get_msg_nums", self.get_msg_nums) + # 可通过此push_addr_book_list主动推送 + EventMesh.subscribe("get_msg_detail", self.get_msg_detail) + + def get_msg_nums(self, event, msg): + self.msg_nums = sms.getMsgNums() + return self.msg_nums + + def get_msg_detail(self, event, msg): + #self.msg_detail = sms.searchTextMsg(msg) + return{ + "小明":"有内鬼,停止交易", + "小红":"今晚十点一起吃饭" + } + +class MsgdetailManager(Abstract): + def __init__(self): + self.level = 0 + self.msg_name = "" + self.msg_content = "" + + def post_processor_after_instantiation(self): + EventMesh.subscribe("save_msg_name", self.save_msg_name) + EventMesh.subscribe("save_msg_content", self.save_msg_content) + EventMesh.subscribe("get_msg_name", self.get_msg_name) + EventMesh.subscribe("get_msg_content", self.get_msg_content) + + def save_msg_name(self, event, msg): + self.msg_name = str(msg) + + def save_msg_content(self, event, msg): + self.msg_content = str(msg) + + def get_msg_content(self, event, msg): + return self.msg_content + + def get_msg_name(self, event, msg): + return self.msg_name + +class CallLogManager(Abstract): + # 通话记录 + def __init__(self): + self.log = [ + #电话 次数 时间 姓名 + ["15692025051","2","12:59","哥"], + ["15692025051","3","12:49","爸"], + ["15692025051","4","12:39","妈"], + ] + + def post_processor_after_instantiation(self): + EventMesh.subscribe("get_call_log_list", self.get) + + def get(self, event, msg): + return self.log + + def call_usr(self,event,msg): + content = self.log[msg] + # 参数1 姓名 参数2 电话 参数3 1/主动呼叫 0别人呼叫 + EventMesh.publish("call_in", [content[-1], content[0], 1]) + +class PhoneCallingManager(Abstract): + def __init__(self): + self.level = 0 + self.phonenum = "" + self.phonename = "" + + def post_processor_after_instantiation(self): + EventMesh.subscribe("save_phonenum", self.save_phonenum) + EventMesh.subscribe("get_phonenum", self.get_phonenum) + EventMesh.subscribe("get_phonename", self.get_phonename) + EventMesh.subscribe("save_phonename", self.save_phonename) + + def get_phonename(self, event, msg): + self.phonename = str(msg) + + def save_phonename(self, event, msg): + self.phonename = str(msg) + + def save_phonenum(self, event, msg): + self.phonenum = str(msg) + + def get_phonenum(self, event, msg): + return self.phonenum + diff --git a/3.code/1.watch/2.code/protocol.py b/3.code/1.watch/2.code/protocol.py new file mode 100644 index 00000000..d8df86b1 --- /dev/null +++ b/3.code/1.watch/2.code/protocol.py @@ -0,0 +1,370 @@ +import ujson +import utime +from ext import EventMesh +from ext import constants +from ext.common import Abstract +import uhashlib +import ubinascii +from misc import Power +import audio +from machine import Pin +class ProtoCol(Abstract): + TYPE = "" + HEADER = "#@{}@#;" + SEPARATOR = ";" + END = ";" + chr(0x01) + + def __init__(self): + self.content = None + self.check_sum = None + self.location_old_data = None + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + self.HEADER = self.HEADER.format(self.TYPE) + + def initialization(self, *args, **kwargs): + EventMesh.subscribe(self.TYPE + "_SEND", self.handler) + EventMesh.subscribe(self.TYPE + "_RECV", self.handler) + + def handler(self, event, msg): + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + if event.endswith("_SEND"): + self.send(event, msg) + else: + self.recv(event, msg) + + def send(self, event, msg): + pass + + def recv(self, event, msg): + pass + + @staticmethod + def get_date(): + return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + + @staticmethod + def get_time(): + return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6]) + + def calc_crc(self): + data = self.content + if not isinstance(data, bytes): + data = data.encode() + count = 0 + for x in data: + count += x + self.check_sum = 100 - count % 100 + + def pack(self): + self.calc_crc() + return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode() + + def pack_MD5_head(self,data): + key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + + MD5_head = "" + hash_obj = uhashlib.md5(data+key) + res = hash_obj.digest() + + # 转成十六进制表示 + MD5_head = ubinascii.hexlify(res) + MD5_head = MD5_head.decode('ascii') + #print("pack_MD5_head:") + #print(res) + #print(MD5_head) + return MD5_head + +class LK_ProtoCol(ProtoCol): + """链路保持""" + TYPE = "LK" + + def send(self, event, msg): + #[SZKW*334588000000156*0002*LK] + #print('self.imei:%s'%(self.imei)) + send_data = "SZKW*%s*0002*LK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("LK_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: LK成功 + @param msg: 接收到的下行数据 + """ + print("LK_ProtoCol:recv:%s"%(msg)) + EventMesh.publish(constants.PROTOCOL.PING_SEND) + EventMesh.publish(constants.PROTOCOL.KA_SEND) + + +class PING_ProtoCol(ProtoCol): + """获取绑定状态""" + TYPE = "PING" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = "SZKW*%s*0004*PING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("PING_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #print("PING_ProtoCol:recv:%s"%(msg)) + data_tmp = msg.split(']')[0] #去掉] + EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1]) + +class KA_ProtoCol(ProtoCol): + """心跳""" + TYPE = "KA" + + def send(self, event, msg): + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12] + date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3]) + date = date[2:] + #print("date:",date) + #步数 + step = EventMesh.publish(constants.EVENT.GET_STEP)[0] + # 电池电量百分比 + bat_tmp = EventMesh.publish("screen_get_battery") + battery_caption = bat_tmp[1] + send_data = "KA,%s,%d,%d,%d"%(date,step,0,battery_caption) + send_len = len(send_data) + + send_data = "SZKW*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("KA_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #print("KA_ProtoCol:recv:%s"%(msg)) + +class UD_ProtoCol(ProtoCol): + """位置信息""" + TYPE = "UD" + + def send(self, event, msg): + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4, + # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88] + date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6]) + date = date[2:] + GPS_type = "V" + latitude = "0.000000,N" + longitude = "0.000000,E" + speed = "0.00" + direction = "0.0" + high = "100.0" + number = "0" + if msg[0] != [] :#有GPS数据 + GPS_type = "A" + # 纬度 + latitude = msg[0]["latitude"] + # 经度 + longitude = msg[0]["longitude"] + # 速度 + speed = msg[0]["speed"] + # 方向 + direction = "0" + if msg[0]["direction"] : + direction = msg[0]["direction"] + # 高度 + high = msg[0]["high"] + high_tmp = high.split(".") + if len(high_tmp) >= 2 : + high = "%s"%(high_tmp[0]) + # 讯号质量:搜索到的卫星数目 + number = msg[0]["number"] + #gsm 信号强度 + gsm_sig = str((100//31)*EventMesh.publish("screen_get_sig")) + # 电池电量百分比 + bat_tmp = EventMesh.publish("screen_get_battery") + battery_caption = str(bat_tmp[1]) + #步数 + step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0]) + #翻转次数 + turn_count = "0" + #终端状态 + state = "00000000" + #基站数据 + CELL_num = len(msg[2]) + CELL_data = "1," #时延 + if msg[2] != []: + for CELL in msg[2] : + if CELL[0] == 0 : + CELL_data += "%X,"%(int(CELL[2])) #MCC + CELL_data += str(CELL[3]) +","#MNC + CELL_data += str(CELL[5]) +","#tac,区域码 + CELL_data += str(CELL[1]) +","#基站编号 CID + CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi + else : + CELL_data += str(CELL[5]) +","#tac,区域码 + CELL_data += str(CELL[1]) +","#基站编号 CID + CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi + CELL_data = CELL_data[:(len(CELL_data)-1)] + #WIFI数据 + WIFI_num = 0 + WIFI_data = "" + if msg[1] : + WIFI_num = msg[1][0] + i = 0 + for MAC in msg[1][1] : + WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1]) + i += 1 + WIFI_data = WIFI_data[:(len(WIFI_data)-1)] + WIFI_data = WIFI_data.lower() + #send_data = "UD ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s ,%d ,%s ,%d ,%s"\ + # %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data) + send_data = "UD,%s,%s,%s"%(date,GPS_type,latitude) + send_data += ",%s,%s,%s"%(longitude,speed,direction) + send_data += ",%s,%s,%s"%(high,number,gsm_sig,) + send_data += ",%s,%s,%s"%(battery_caption,step,turn_count) + send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data) + send_data += ",%d,%s"%(WIFI_num,WIFI_data) + + send_len = len(send_data) + + send_data = "SZKW*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("UD_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #print("KA_ProtoCol:recv:%s"%(msg)) + +class CR_ProtoCol(ProtoCol): + """立即定位""" + TYPE = "CR" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = "SZKW*%s*0002*CR"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("CR_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.CR_SEND) + EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位 + #print("CR_ProtoCol:recv:%s"%(msg)) + +class FIND_ProtoCol(ProtoCol): + """查找设备""" + TYPE = "FIND" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = "SZKW*%s*0004*FIND"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("FIND_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: FIND,播放铃声 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.FIND_SEND) + # a = audio.Audio(0) + # a.set_pa(Pin.GPIO29) + # a.setVolume(10) + # a.play(1, 0, 'E:/audio_audio_haixiu.mp3') #文件名前面要加上路径 + EventMesh.publish("load_screen", {"screen": "FIND"}) + #print("FIND_ProtoCol:recv:%s"%(msg)) + +class POWEROFF_ProtoCol(ProtoCol): + """关机""" + TYPE = "POWEROFF" + + def send(self, event, msg): + # [SZKW*867387060319491*0008*POWEROFF] + send_data = "SZKW*%s*0008*POWEROFF"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #print("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: POWEROFF关机 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND) + #print("POWEROFF_ProtoCol:recv:%s"%(msg)) + Power.powerDown() + + +class ProtoColResolver(object): + def __init__(self): + self.protocol_list = [] + + def add_support(self, prot): + self.protocol_list.append(prot) + prot.initialization() + + def handler(self, data): + # 这里接收数据 + + #print("handler -> {}".format(data)) + # if data.startswith('Init;'): + # data = data[5:] + # EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']}) + + # elif data.startswith("Update;"): + # data = data[7:] + # EventMesh.publish(constants.PROTOCOL.H04_RECV, data) + data_tmp = data.split(']')[0] #去掉] + ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识 + ProtoCol_type = ProtoCol_type.split(',')[0] + ProtoCol_type = "%s_RECV"%(ProtoCol_type) + #print("ProtoCol_type:%s"%(ProtoCol_type)) + EventMesh.publish(ProtoCol_type, data) #返回协议read diff --git a/3.code/1.watch/2.code/static/APP/alipay/1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1.jpg new file mode 100644 index 00000000..78bf3c55 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg new file mode 100644 index 00000000..81d42b03 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg new file mode 100644 index 00000000..88c0c4b7 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg new file mode 100644 index 00000000..284ff431 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg new file mode 100644 index 00000000..3b304a66 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg new file mode 100644 index 00000000..433682da Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg new file mode 100644 index 00000000..1b43e750 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg new file mode 100644 index 00000000..40fdf420 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg new file mode 100644 index 00000000..6a7be6fd Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg new file mode 100644 index 00000000..d54e4b17 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg new file mode 100644 index 00000000..ba423662 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg differ diff --git a/3.code/1.watch/2.code/static/APP/alipay/loading.jpg b/3.code/1.watch/2.code/static/APP/alipay/loading.jpg new file mode 100644 index 00000000..77261017 Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/loading.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg b/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg new file mode 100644 index 00000000..ca88cccf Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg new file mode 100644 index 00000000..92f76063 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg new file mode 100644 index 00000000..95e0d79a Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg new file mode 100644 index 00000000..4f02c402 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg new file mode 100644 index 00000000..ec55e37f Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg new file mode 100644 index 00000000..8f30f367 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg b/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg new file mode 100644 index 00000000..8c1aa403 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg b/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg new file mode 100644 index 00000000..c73bc5d8 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg b/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg new file mode 100644 index 00000000..2a42a823 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg new file mode 100644 index 00000000..0a5fbbb4 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg new file mode 100644 index 00000000..35e08c11 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg new file mode 100644 index 00000000..7500ae70 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg new file mode 100644 index 00000000..8783cfa8 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg new file mode 100644 index 00000000..90d2a3ee Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg new file mode 100644 index 00000000..c66444d0 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg new file mode 100644 index 00000000..43450ece Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg new file mode 100644 index 00000000..c4087a55 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg new file mode 100644 index 00000000..e979dc92 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg new file mode 100644 index 00000000..522f3fbc Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg new file mode 100644 index 00000000..754a1fcc Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg new file mode 100644 index 00000000..ecba5a6e Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg new file mode 100644 index 00000000..393a5818 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg new file mode 100644 index 00000000..2a3aafb8 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg new file mode 100644 index 00000000..b10a13ac Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg new file mode 100644 index 00000000..737bcbc8 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg new file mode 100644 index 00000000..b5884b2c Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg new file mode 100644 index 00000000..8c5cc3ac Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg new file mode 100644 index 00000000..cb2ef0d6 Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg differ diff --git a/3.code/1.watch/2.code/static/IMAGE_STEP.jpg b/3.code/1.watch/2.code/static/IMAGE_STEP.jpg new file mode 100644 index 00000000..2f9d654f Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_STEP.jpg differ diff --git a/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg b/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg new file mode 100644 index 00000000..57acd14a Binary files /dev/null and b/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg differ diff --git a/3.code/1.watch/2.code/static/add_btn.jpg b/3.code/1.watch/2.code/static/add_btn.jpg new file mode 100644 index 00000000..86b84fc8 Binary files /dev/null and b/3.code/1.watch/2.code/static/add_btn.jpg differ diff --git a/3.code/1.watch/2.code/static/answer.jpg b/3.code/1.watch/2.code/static/answer.jpg new file mode 100644 index 00000000..7a7072ee Binary files /dev/null and b/3.code/1.watch/2.code/static/answer.jpg differ diff --git a/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 b/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 new file mode 100644 index 00000000..97d5db5b Binary files /dev/null and b/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 differ diff --git a/3.code/1.watch/2.code/static/cancel_icon.jpg b/3.code/1.watch/2.code/static/cancel_icon.jpg new file mode 100644 index 00000000..36c338ba Binary files /dev/null and b/3.code/1.watch/2.code/static/cancel_icon.jpg differ diff --git a/3.code/1.watch/2.code/static/charge_in.jpg b/3.code/1.watch/2.code/static/charge_in.jpg new file mode 100644 index 00000000..79380286 Binary files /dev/null and b/3.code/1.watch/2.code/static/charge_in.jpg differ diff --git a/3.code/1.watch/2.code/static/cloudy.jpg b/3.code/1.watch/2.code/static/cloudy.jpg new file mode 100644 index 00000000..aac5b3c8 Binary files /dev/null and b/3.code/1.watch/2.code/static/cloudy.jpg differ diff --git a/3.code/1.watch/2.code/static/degree.jpg b/3.code/1.watch/2.code/static/degree.jpg new file mode 100644 index 00000000..ba3324bd Binary files /dev/null and b/3.code/1.watch/2.code/static/degree.jpg differ diff --git a/3.code/1.watch/2.code/static/fine.jpg b/3.code/1.watch/2.code/static/fine.jpg new file mode 100644 index 00000000..7531acb8 Binary files /dev/null and b/3.code/1.watch/2.code/static/fine.jpg differ diff --git a/3.code/1.watch/2.code/static/hang_up.jpg b/3.code/1.watch/2.code/static/hang_up.jpg new file mode 100644 index 00000000..9fa5c3b0 Binary files /dev/null and b/3.code/1.watch/2.code/static/hang_up.jpg differ diff --git a/3.code/1.watch/2.code/static/lightrain.jpg b/3.code/1.watch/2.code/static/lightrain.jpg new file mode 100644 index 00000000..b23ac858 Binary files /dev/null and b/3.code/1.watch/2.code/static/lightrain.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg new file mode 100644 index 00000000..ebd1ccc6 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg new file mode 100644 index 00000000..4b78c8e9 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg new file mode 100644 index 00000000..fbefbce2 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg new file mode 100644 index 00000000..86e9a902 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg new file mode 100644 index 00000000..d129946d Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png b/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png new file mode 100644 index 00000000..8414d97c Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg new file mode 100644 index 00000000..4afb319b Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg new file mode 100644 index 00000000..537e0f5c Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg new file mode 100644 index 00000000..6ba5f723 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg new file mode 100644 index 00000000..98393c2e Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg new file mode 100644 index 00000000..c6f0cbd4 Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg new file mode 100644 index 00000000..93ffe9dd Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg new file mode 100644 index 00000000..f207090f Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg new file mode 100644 index 00000000..740f0a1b Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg differ diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg new file mode 100644 index 00000000..aa98ef5f Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_app_qrcode.jpg b/3.code/1.watch/2.code/static/menu_app_qrcode.jpg new file mode 100644 index 00000000..e4b9eccd Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_app_qrcode.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_bright.jpg b/3.code/1.watch/2.code/static/menu_bright.jpg new file mode 100644 index 00000000..d5072f0b Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_bright.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_connect_device.jpg b/3.code/1.watch/2.code/static/menu_connect_device.jpg new file mode 100644 index 00000000..ba518ada Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_connect_device.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg b/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg new file mode 100644 index 00000000..79ceca49 Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_language.jpg b/3.code/1.watch/2.code/static/menu_language.jpg new file mode 100644 index 00000000..a156a9b9 Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_language.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_poweroff.jpg b/3.code/1.watch/2.code/static/menu_poweroff.jpg new file mode 100644 index 00000000..52a73e2d Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_poweroff.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_restore.jpg b/3.code/1.watch/2.code/static/menu_restore.jpg new file mode 100644 index 00000000..3f3b87df Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_restore.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_theme_switch.jpg b/3.code/1.watch/2.code/static/menu_theme_switch.jpg new file mode 100644 index 00000000..55112318 Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_theme_switch.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_time.jpg b/3.code/1.watch/2.code/static/menu_time.jpg new file mode 100644 index 00000000..7d4f722c Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_time.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_upgrade.jpg b/3.code/1.watch/2.code/static/menu_upgrade.jpg new file mode 100644 index 00000000..8332b8ce Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_upgrade.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_version.jpg b/3.code/1.watch/2.code/static/menu_version.jpg new file mode 100644 index 00000000..f1e9618d Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_version.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_volume.jpg b/3.code/1.watch/2.code/static/menu_volume.jpg new file mode 100644 index 00000000..064581d3 Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_volume.jpg differ diff --git a/3.code/1.watch/2.code/static/menu_watch_switch.jpg b/3.code/1.watch/2.code/static/menu_watch_switch.jpg new file mode 100644 index 00000000..bdef4412 Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_watch_switch.jpg differ diff --git a/3.code/1.watch/2.code/static/mpsignal1.jpg b/3.code/1.watch/2.code/static/mpsignal1.jpg new file mode 100644 index 00000000..520bd7fb Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal1.jpg differ diff --git a/3.code/1.watch/2.code/static/mpsignal2.jpg b/3.code/1.watch/2.code/static/mpsignal2.jpg new file mode 100644 index 00000000..dd915c88 Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal2.jpg differ diff --git a/3.code/1.watch/2.code/static/mpsignal3.jpg b/3.code/1.watch/2.code/static/mpsignal3.jpg new file mode 100644 index 00000000..05baf08a Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal3.jpg differ diff --git a/3.code/1.watch/2.code/static/mpsignal4.jpg b/3.code/1.watch/2.code/static/mpsignal4.jpg new file mode 100644 index 00000000..deeaffa8 Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal4.jpg differ diff --git a/3.code/1.watch/2.code/static/mpsignal5.jpg b/3.code/1.watch/2.code/static/mpsignal5.jpg new file mode 100644 index 00000000..f0bbbfdc Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal5.jpg differ diff --git a/3.code/1.watch/2.code/static/off_icon.jpg b/3.code/1.watch/2.code/static/off_icon.jpg new file mode 100644 index 00000000..9f019e31 Binary files /dev/null and b/3.code/1.watch/2.code/static/off_icon.jpg differ diff --git a/3.code/1.watch/2.code/static/poweroff_icon.jpg b/3.code/1.watch/2.code/static/poweroff_icon.jpg new file mode 100644 index 00000000..e3aff09a Binary files /dev/null and b/3.code/1.watch/2.code/static/poweroff_icon.jpg differ diff --git a/3.code/1.watch/2.code/static/reduce_btn.jpg b/3.code/1.watch/2.code/static/reduce_btn.jpg new file mode 100644 index 00000000..2d76ae23 Binary files /dev/null and b/3.code/1.watch/2.code/static/reduce_btn.jpg differ diff --git a/3.code/1.watch/2.code/static/snow.jpg b/3.code/1.watch/2.code/static/snow.jpg new file mode 100644 index 00000000..15ecdc97 Binary files /dev/null and b/3.code/1.watch/2.code/static/snow.jpg differ diff --git a/3.code/1.watch/2.code/static/stopwatch_play.jpg b/3.code/1.watch/2.code/static/stopwatch_play.jpg new file mode 100644 index 00000000..9deda48c Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_play.jpg differ diff --git a/3.code/1.watch/2.code/static/stopwatch_reset.jpg b/3.code/1.watch/2.code/static/stopwatch_reset.jpg new file mode 100644 index 00000000..013ff61f Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_reset.jpg differ diff --git a/3.code/1.watch/2.code/static/stopwatch_stop.jpg b/3.code/1.watch/2.code/static/stopwatch_stop.jpg new file mode 100644 index 00000000..4b4a9982 Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_stop.jpg differ diff --git a/3.code/1.watch/2.code/static/sunny.jpg b/3.code/1.watch/2.code/static/sunny.jpg new file mode 100644 index 00000000..f49510e5 Binary files /dev/null and b/3.code/1.watch/2.code/static/sunny.jpg differ diff --git a/3.code/1.watch/2.code/static/temp_bg.jpg b/3.code/1.watch/2.code/static/temp_bg.jpg new file mode 100644 index 00000000..59bdff68 Binary files /dev/null and b/3.code/1.watch/2.code/static/temp_bg.jpg differ diff --git a/3.code/1.watch/2.code/static/time_down.jpg b/3.code/1.watch/2.code/static/time_down.jpg new file mode 100644 index 00000000..ac9cc05a Binary files /dev/null and b/3.code/1.watch/2.code/static/time_down.jpg differ diff --git a/3.code/1.watch/2.code/static/time_finish.jpg b/3.code/1.watch/2.code/static/time_finish.jpg new file mode 100644 index 00000000..0259ac01 Binary files /dev/null and b/3.code/1.watch/2.code/static/time_finish.jpg differ diff --git a/3.code/1.watch/2.code/static/time_up.jpg b/3.code/1.watch/2.code/static/time_up.jpg new file mode 100644 index 00000000..441aa09d Binary files /dev/null and b/3.code/1.watch/2.code/static/time_up.jpg differ diff --git a/3.code/1.watch/2.code/static/update.jpg b/3.code/1.watch/2.code/static/update.jpg new file mode 100644 index 00000000..3ce99f03 Binary files /dev/null and b/3.code/1.watch/2.code/static/update.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_0.jpg b/3.code/1.watch/2.code/static/vbat_0.jpg new file mode 100644 index 00000000..511db7c3 Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_0.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_100.jpg b/3.code/1.watch/2.code/static/vbat_100.jpg new file mode 100644 index 00000000..c8b4259d Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_100.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_20.jpg b/3.code/1.watch/2.code/static/vbat_20.jpg new file mode 100644 index 00000000..fd0b86e1 Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_20.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_40.jpg b/3.code/1.watch/2.code/static/vbat_40.jpg new file mode 100644 index 00000000..1f00b2a4 Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_40.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_60.jpg b/3.code/1.watch/2.code/static/vbat_60.jpg new file mode 100644 index 00000000..047e69bd Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_60.jpg differ diff --git a/3.code/1.watch/2.code/static/vbat_80.jpg b/3.code/1.watch/2.code/static/vbat_80.jpg new file mode 100644 index 00000000..31bee1df Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_80.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg new file mode 100644 index 00000000..750057c1 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg new file mode 100644 index 00000000..edc286dc Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg new file mode 100644 index 00000000..05f942a8 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg new file mode 100644 index 00000000..f16ef9cc Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg new file mode 100644 index 00000000..62e72ad3 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg new file mode 100644 index 00000000..7f84eca3 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg new file mode 100644 index 00000000..137d2098 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg new file mode 100644 index 00000000..b00537d0 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg new file mode 100644 index 00000000..00d38374 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg new file mode 100644 index 00000000..51870ff3 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg new file mode 100644 index 00000000..d5bd2f2b Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg new file mode 100644 index 00000000..17a9fbc2 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg new file mode 100644 index 00000000..e06aff66 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg new file mode 100644 index 00000000..a4e2c9d1 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg new file mode 100644 index 00000000..621c9333 Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg differ diff --git a/3.code/1.watch/2.code/ui.py b/3.code/1.watch/2.code/ui.py new file mode 100644 index 00000000..ec3d337f --- /dev/null +++ b/3.code/1.watch/2.code/ui.py @@ -0,0 +1,3480 @@ +import utime +import osTimer +import lvgl as lv +from ext import EventMesh +from machine import Timer +import voiceCall +import osTimer +from ext import constants +from misc import Power +import pm +import ujson +import ql_fs +import audio +from machine import Pin +from ext.lcd import gpio_backlight,lcd,lcd_ctrl,tp_cst816 +# -----------------------------------------style create-------------------------------------- +style_screen = lv.style_t() +style_screen.init() +style_screen.set_radius(0) +style_screen.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) +style_screen.set_bg_opa(255) +style_screen.set_border_width(0) +style_screen.set_pad_left(0) +style_screen.set_pad_right(0) +style_screen.set_pad_top(0) +style_screen.set_pad_bottom(0) + +style_font_youyuan_20 = lv.style_t() +style_font_youyuan_20.init() +style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff)) +style_font_youyuan_20.set_text_font_v2("font.bin",0) + +# 默认白色 + + +class LabelStyle(object): + def __init__(self): + self.style = lv.style_t() + + def style_label(self, font): + self.style.init() + self.style.set_text_color(lv.color_make(0xff, 0xff, 0xff)) + self.style.set_text_font(font) + return self.style + +# cont style +class ContStyle(object): + def __init__(self): + self.style = lv.style_t() + + def style_cont(self, radius, color1, color2, opa): + self.style.init() + self.style.set_radius(radius) + self.style.set_bg_color(color1) + self.style.set_bg_grad_color(color2) + self.style.set_bg_grad_dir(lv.GRAD_DIR.VER) + self.style.set_bg_opa(opa) + self.style.set_border_width(0) + self.style.set_pad_left(0) + self.style.set_pad_right(0) + self.style.set_pad_top(0) + self.style.set_pad_bottom(0) + return self.style + +style_img = lv.style_t() +style_img.init() +style_img.set_img_opa(255) + +style_line = lv.style_t() +style_line.init() +style_line.set_line_width(2) +style_line.set_line_color(lv.color_make(0xff, 0xff, 0xff)) + + +style_list = lv.style_t() +style_list.init() +style_list.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) +style_list.set_radius(0) +style_list.set_bg_opa(255) +style_list.set_border_width(0) +style_list.set_pad_left(0) +style_list.set_pad_right(0) +style_list.set_pad_top(0) + +style_list_scro = lv.style_t() +style_list_scro.init() +style_list_scro.set_bg_opa(0) + +# create style style_btn +style_btn = lv.style_t() +style_btn.init() +style_btn.set_bg_opa(0) +style_btn.set_shadow_opa(0) +style_btn.set_border_width(0) + +style_contact_btn = lv.style_t() +style_contact_btn.init() +style_contact_btn.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) +style_contact_btn.set_border_width(0) +style_contact_btn.set_shadow_opa(0) + +style_contact_btn_pressed = lv.style_t() +style_contact_btn_pressed.init() +style_contact_btn_pressed.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) +style_contact_btn_pressed.set_bg_opa(100) +style_contact_btn_pressed.set_border_width(0) +style_contact_btn_pressed.set_shadow_opa(0) + +style_alipay_btn = lv.style_t() +style_alipay_btn.init() +style_alipay_btn.set_bg_color(lv.color_make(0xFF, 0xFF, 0xff)) +style_alipay_btn.set_bg_opa(20) +style_alipay_btn.set_border_width(0) +style_alipay_btn.set_shadow_opa(0) + +style_volume_btn = lv.style_t() +style_volume_btn.init() +style_volume_btn.set_shadow_opa(0) +style_volume_btn.set_border_width(0) +style_volume_btn.set_bg_color(lv.color_make(0x80, 0x80, 0x80)) + +style_circle = lv.style_t() +style_circle.init() +style_circle.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) +style_circle.set_radius(0x7FFF) + +style_bar = lv.style_t() +style_bar.init() +style_bar.set_radius(10) +style_bar.set_bg_color(lv.color_make(0xA0, 0xA0, 0xA0)) +style_bar.set_bg_grad_color(lv.color_make(0xA0, 0xA0, 0xA0)) +style_bar.set_bg_grad_dir(lv.GRAD_DIR.VER) +style_bar.set_bg_opa(60) +style_bar.set_pad_left(0) +style_bar.set_pad_right(0) +style_bar.set_pad_top(0) +style_bar.set_pad_bottom(0) + +style_bar_indic = lv.style_t() +style_bar_indic.init() +style_bar_indic.set_radius(10) +style_bar_indic.set_bg_color(lv.color_make(0xff, 0x61, 0x3a)) +style_bar_indic.set_bg_grad_color(lv.color_make(0xff, 0x61, 0x3a)) +style_bar_indic.set_bg_grad_dir(lv.GRAD_DIR.VER) +style_bar_indic.set_bg_opa(255) + + +# -------------------------------------------phone screen---------------------------------------------------------- +phone_screen = lv.obj() +phone = lv.obj(phone_screen) +phone.center() +phone.set_size(240, 320) +phone.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + + +phone_label = lv.label(phone) +phone_label.set_pos(0, 50) +phone_label.set_size(240, 30) +phone_label.set_text("") +phone_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_label.set_long_mode(lv.label.LONG.WRAP) +phone_label.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) + +phone_one = lv.img(phone) +phone_one.set_src("E:/static/IMAGE_NUMBER_KEY1_ICON.png") +phone_one.add_flag(lv.obj.FLAG.CLICKABLE) +phone_one.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_one.set_pos(3, 100) + +phone_two = lv.img(phone) +phone_two.set_size(76, 40) +phone_two.set_src("E:/static/IMAGE_NUMBER_KEY2_ICON.png") +phone_two.add_flag(lv.obj.FLAG.CLICKABLE) +phone_two.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_two.set_pos(82, 100) + +phone_three = lv.img(phone) +phone_three.set_size(76, 40) +phone_three.set_src("E:/static/IMAGE_NUMBER_KEY3_ICON.png") +phone_three.add_flag(lv.obj.FLAG.CLICKABLE) +phone_three.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_three.set_pos(161, 100) + +phone_four = lv.img(phone) +phone_four.set_size(76, 40) +phone_four.set_src("E:/static/IMAGE_NUMBER_KEY4_ICON.png") +phone_four.add_flag(lv.obj.FLAG.CLICKABLE) +phone_four.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_four.set_pos(3, 142) + +phone_five = lv.img(phone) +phone_five.set_size(76, 40) +phone_five.set_src("E:/static/IMAGE_NUMBER_KEY5_ICON.png") +phone_five.add_flag(lv.obj.FLAG.CLICKABLE) +phone_five.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_five.set_pos(82, 142) + +phone_six = lv.img(phone) +phone_six.set_size(76, 40) +phone_six.set_src("E:/static/IMAGE_NUMBER_KEY6_ICON.png") +phone_six.add_flag(lv.obj.FLAG.CLICKABLE) +phone_six.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_six.set_pos(161, 142) + +phone_seven = lv.img(phone) +phone_seven.set_size(76, 40) +phone_seven.set_src("E:/static/IMAGE_NUMBER_KEY7_ICON.png") +phone_seven.add_flag(lv.obj.FLAG.CLICKABLE) +phone_seven.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_seven.set_pos(3, 184) + +phone_eight = lv.img(phone) +phone_eight.set_size(76, 40) +phone_eight.set_src("E:/static/IMAGE_NUMBER_KEY8_ICON.png") +phone_eight.add_flag(lv.obj.FLAG.CLICKABLE) +phone_eight.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_eight.set_pos(82, 184) + +phone_nine = lv.img(phone) +phone_nine.set_size(76, 40) +phone_nine.set_src("E:/static/IMAGE_NUMBER_KEY9_ICON.png") +phone_nine.add_flag(lv.obj.FLAG.CLICKABLE) +phone_nine.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_nine.set_pos(161, 184) + +phone_start = lv.img(phone) +phone_start.set_size(76, 40) +phone_start.set_src("E:/static/IMAGE_NUMBER_KEYSTAR_ICON.png") +phone_start.add_flag(lv.obj.FLAG.CLICKABLE) +phone_start.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_start.set_pos(3, 226) + +phone_zero = lv.img(phone) +phone_zero.set_size(76, 40) +phone_zero.set_src("E:/static/IMAGE_NUMBER_KEY0_ICON.png") +phone_zero.add_flag(lv.obj.FLAG.CLICKABLE) +phone_zero.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_zero.set_pos(82, 226) + +phone_hash = lv.img(phone) +phone_hash.set_size(76, 40) +phone_hash.set_src("E:/static/IMAGE_NUMBER_KEYSTAR_ICON.png") +phone_hash.add_flag(lv.obj.FLAG.CLICKABLE) +phone_hash.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_hash.set_pos(161, 226) + +phone_call = lv.img(phone) +phone_call.set_size(76, 40) +phone_call.set_src("E:/static/IMAGE_BUTTON_DIAL.png") +phone_call.add_flag(lv.obj.FLAG.CLICKABLE) +phone_call.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_call.set_pos(3, 268) + +phone_contact = lv.img(phone) +phone_contact.set_size(76, 40) +phone_contact.set_src("E:/static/IMAGE_BUTTON_DIAL_CONTACT.png") +phone_contact.add_flag(lv.obj.FLAG.CLICKABLE) +phone_contact.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_contact.set_pos(84, 268) + +phone_delete = lv.img(phone) +phone_delete.set_size(76, 40) +phone_delete.set_src("E:/static/IMAGE_BUTTON_DELKEY.png") +phone_delete.add_flag(lv.obj.FLAG.CLICKABLE) +phone_delete.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +phone_delete.set_pos(161, 268) + +# -------------------------------------------heartrate screen---------------------------------------------------------- +heartrate_screen = lv.obj() +heartrate = lv.obj(heartrate_screen) +heartrate.center() +heartrate.set_size(240, 320) +heartrate.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +heartrate_label = lv.label(heartrate) +heartrate_label.set_pos(0, 10) +heartrate_label.set_size(240, 40) +heartrate_label.set_text("心率") +heartrate_label.set_long_mode(lv.label.LONG.WRAP) +heartrate_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +heartrate_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +heartrate_done_img = lv.img(heartrate) +heartrate_done_img.set_pos(0, 50) +heartrate_done_img.set_size(240, 96) +heartrate_done_img.set_src("E:/static/IMAGE_HEART_ONLY_TEST_DONE.jpg") + +heartrate_start_label = lv.label(heartrate) +heartrate_start_label.set_size(240,40) +heartrate_start_label.set_pos(0,160) +heartrate_start_label.set_text(" ") +heartrate_start_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +heartrate_start_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +heartrate_start_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3a), lv.STATE.DEFAULT) + + +heartrate_bpm_label = lv.label(heartrate) +heartrate_bpm_label.set_size(240, 40) +heartrate_bpm_label.set_pos(0, 210) +heartrate_bpm_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + +heartrate_bpm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +heartrate_bpm_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3f), lv.STATE.DEFAULT) + + +heartrate_mmhg_label = lv.label(heartrate) +heartrate_mmhg_label.set_size(240, 40) +heartrate_mmhg_label.set_pos(0, 240) +heartrate_mmhg_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + +heartrate_mmhg_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +heartrate_mmhg_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3f), lv.STATE.DEFAULT) + + + +# -------------------------------------------toolbox screen---------------------------------------------------------- +toolbox_screen = lv.obj() +toolbox = lv.obj(toolbox_screen) +toolbox.center() +toolbox.set_size(240, 320) +toolbox.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox.set_scrollbar_mode(0) + +toolbox_title = lv.label(toolbox) +toolbox_title.set_pos(0, 10) +toolbox_title.set_size(240, 40) +toolbox_title.set_text("工具箱") +toolbox_title.set_long_mode(lv.label.LONG.WRAP) +toolbox_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +toolbox_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_cont = lv.obj(toolbox) +toolbox_cont.set_pos(0, 50) +toolbox_cont.set_size(240, 270) +toolbox_cont_style = ContStyle() +toolbox_cont.add_style( + toolbox_cont_style.style_cont(0, lv.color_make(0x00, 0x00, 0x00), lv.color_make(0x00, 0x00, 0x00), 255), + lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_step = lv.btn(toolbox_cont) +toolbox_step.set_pos(0, 0) +toolbox_step.set_size(240, 54) +toolbox_step_label = lv.label(toolbox_step) +toolbox_step_label.set_text("计步") +toolbox_step.set_style_pad_all(0, lv.STATE.DEFAULT) +toolbox_step_label.align(lv.ALIGN.LEFT_MID, 70, 0) +toolbox_step_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_step.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_step_img = lv.img(toolbox_cont) +toolbox_step_img.set_pos(10, 0) +toolbox_step_img.set_size(47, 47) +toolbox_step_img.add_flag(lv.obj.FLAG.CLICKABLE) +toolbox_step_img.set_src("E:/static/IMAGE_SECMENU_STEP.png") +toolbox_step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_weather = lv.btn(toolbox_cont) +toolbox_weather.set_pos(0, 60) +toolbox_weather.set_size(240, 54) +toolbox_weather_label = lv.label(toolbox_weather) +toolbox_weather_label.set_text("天气") +toolbox_weather.set_style_pad_all(0, lv.STATE.DEFAULT) +toolbox_weather_label.align(lv.ALIGN.LEFT_MID, 70, 0) +toolbox_weather_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_weather.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_weather_img = lv.img(toolbox_cont) +toolbox_weather_img.set_pos(10, 60) +toolbox_weather_img.set_size(47, 47) +toolbox_weather_img.add_flag(lv.obj.FLAG.CLICKABLE) +toolbox_weather_img.set_src("E:/static/IMAGE_SECMENU_WEATHER.png") +toolbox_weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_alarm = lv.btn(toolbox_cont) +toolbox_alarm.set_pos(0, 120) +toolbox_alarm.set_size(240, 54) +toolbox_alarm_label = lv.label(toolbox_alarm) +toolbox_alarm_label.set_text("闹钟") +toolbox_alarm.set_style_pad_all(0, lv.STATE.DEFAULT) +toolbox_alarm_label.align(lv.ALIGN.LEFT_MID, 70, 0) +toolbox_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_alarm.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_alarm_img = lv.img(toolbox_cont) +toolbox_alarm_img.set_pos(10, 120) +toolbox_alarm_img.set_size(47, 47) +toolbox_alarm_img.add_flag(lv.obj.FLAG.CLICKABLE) +toolbox_alarm_img.set_src("E:/static/IMAGE_SECMENU_ALARM.png") +toolbox_alarm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_countdown = lv.btn(toolbox_cont) +toolbox_countdown.set_pos(0, 180) +toolbox_countdown.set_size(240, 54) +toolbox_countdown_label = lv.label(toolbox_countdown) +toolbox_countdown_label.set_text("倒计时") +toolbox_countdown.set_style_pad_all(0, lv.STATE.DEFAULT) +toolbox_countdown_label.align(lv.ALIGN.LEFT_MID, 70, 0) +toolbox_countdown_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_countdown.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_countdown_img = lv.img(toolbox_cont) +toolbox_countdown_img.set_pos(10, 180) +toolbox_countdown_img.set_size(47, 47) +toolbox_countdown_img.add_flag(lv.obj.FLAG.CLICKABLE) +toolbox_countdown_img.set_src("E:/static/IMAGE_SECMENU_COUNTDOWN.png") +toolbox_countdown_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +toolbox_stopwatch = lv.btn(toolbox_cont) +toolbox_stopwatch.set_pos(0, 240) +toolbox_stopwatch.set_size(240, 54) +toolbox_stopwatch_label = lv.label(toolbox_stopwatch) +toolbox_stopwatch_label.set_text("秒表") +toolbox_stopwatch.set_style_pad_all(0, lv.STATE.DEFAULT) +toolbox_stopwatch_label.align(lv.ALIGN.LEFT_MID, 70, 0) +toolbox_stopwatch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_stopwatch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +toolbox_stopwatch_img = lv.img(toolbox_cont) +toolbox_stopwatch_img.set_pos(10, 240) +toolbox_stopwatch_img.set_size(47, 47) +toolbox_stopwatch_img.add_flag(lv.obj.FLAG.CLICKABLE) +toolbox_stopwatch_img.set_src("E:/static/IMAGE_SECMENU_STOPWATCH.png") +toolbox_stopwatch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------setting screen---------------------------------------------------------- +setting_screen = lv.obj() +setting = lv.obj(setting_screen) +setting.center() +setting.set_size(240, 320) +setting.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_title = lv.label(setting) +setting_title.set_pos(0, 10) +setting_title.set_size(240, 40) +setting_title.set_text("设置") +setting_title.set_long_mode(lv.label.LONG.WRAP) +setting_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +setting_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_cont = lv.obj(setting) +setting_cont.set_pos(0, 50) +setting_cont.set_size(240, 270) +setting_cont_style = ContStyle() +setting_cont.add_style( + setting_cont_style.style_cont(0, lv.color_make(0x00, 0x00, 0x00), lv.color_make(0x00, 0x00, 0x00), 255), + lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_language = lv.btn(setting_cont) +setting_language.set_pos(0, 0) +setting_language.set_size(240, 54) +setting_language_label = lv.label(setting_language) +setting_language_label.set_text("语言设置") +setting_language.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_language_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_language_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_language_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_language.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_language_img = lv.img(setting_cont) +setting_language_img.set_pos(10, 0) +setting_language_img.set_size(47, 47) +setting_language_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_language_img.set_src("E:/static/menu_language.png") +setting_language_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_dialswitch = lv.btn(setting_cont) +setting_dialswitch.set_pos(0, 60) +setting_dialswitch.set_size(240, 54) +setting_dialswitch_label = lv.label(setting_dialswitch) +setting_dialswitch_label.set_text("表盘切换") +setting_dialswitch.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_dialswitch_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_dialswitch_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_dialswitch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_dialswitch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_dialswitch_img = lv.img(setting_cont) +setting_dialswitch_img.set_pos(10, 60) +setting_dialswitch_img.set_size(47, 47) +setting_dialswitch_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_dialswitch_img.set_src("E:/static/menu_watch_switch.png") +setting_dialswitch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_themeswitch = lv.btn(setting_cont) +setting_themeswitch.set_pos(0, 120) +setting_themeswitch.set_size(240, 54) +setting_themeswitch_label = lv.label(setting_themeswitch) +setting_themeswitch_label.set_text("主题切换") +setting_themeswitch.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_themeswitch_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_themeswitch_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_themeswitch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_themeswitch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_themeswitch_img = lv.img(setting_cont) +setting_themeswitch_img.set_pos(10, 120) +setting_themeswitch_img.set_size(47, 47) +setting_themeswitch_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_themeswitch_img.set_src("E:/static/menu_theme_switch.png") +setting_themeswitch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_imei = lv.btn(setting_cont) +setting_imei.set_pos(0, 180) +setting_imei.set_size(240, 54) +setting_imei_label = lv.label(setting_imei) +setting_imei_label.set_text("设备IMEI号") +setting_imei.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_imei_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_imei_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_imei_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_imei.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_imei_img = lv.img(setting_cont) +setting_imei_img.set_pos(10, 180) +setting_imei_img.set_size(47, 47) +setting_imei_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_imei_img.set_src("E:/static/menu_imei_qrcode.png") +setting_imei_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_app = lv.btn(setting_cont) +setting_app.set_pos(0, 240) +setting_app.set_size(240, 54) +setting_app_label = lv.label(setting_app) +setting_app_label.set_text("手机安装APP") +setting_app.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_app_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_app_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_app_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_app.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_app_img = lv.img(setting_cont) +setting_app_img.set_pos(10, 240) +setting_app_img.set_size(47, 47) +setting_app_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_app_img.set_src("E:/static/menu_app_qrcode.png") +setting_app_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_bright = lv.btn(setting_cont) +setting_bright.set_pos(0, 300) +setting_bright.set_size(240, 54) +setting_bright_label = lv.label(setting_bright) +setting_bright_label.set_text("屏幕调节") +setting_bright.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_bright_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_bright_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_bright_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_bright.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_bright_img = lv.img(setting_cont) +setting_bright_img.set_pos(10, 300) +setting_bright_img.set_size(47, 47) +setting_bright_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_bright_img.set_src("E:/static/menu_bright.png") +setting_bright_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_volume = lv.btn(setting_cont) +setting_volume.set_pos(0, 360) +setting_volume.set_size(240, 54) +setting_volume_label = lv.label(setting_volume) +setting_volume_label.set_text("铃声") +setting_volume.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_volume_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_volume_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_volume_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_volume.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_volume_img = lv.img(setting_cont) +setting_volume_img.set_pos(10, 360) +setting_volume_img.set_size(47, 47) +setting_volume_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_volume_img.set_src("E:/static/menu_volume.png") +setting_volume_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_restore = lv.btn(setting_cont) +setting_restore.set_pos(0, 420) +setting_restore.set_size(240, 54) +setting_restore_label = lv.label(setting_restore) +setting_restore_label.set_text("回复出厂设置") +setting_restore.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_restore_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_restore_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_restore_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_restore.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_restore_img = lv.img(setting_cont) +setting_restore_img.set_pos(10, 420) +setting_restore_img.set_size(47, 47) +setting_restore_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_restore_img.set_src("E:/static/menu_restore.png") +setting_restore_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +setting_poweroff = lv.btn(setting_cont) +setting_poweroff.set_pos(0, 480) +setting_poweroff.set_size(240, 54) +setting_poweroff_label = lv.label(setting_poweroff) +setting_poweroff_label.set_text("关机") +setting_poweroff.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_poweroff_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_poweroff_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_poweroff_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_poweroff.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_poweroff_img = lv.img(setting_cont) +setting_poweroff_img.set_pos(10, 480) +setting_poweroff_img.set_size(47, 47) +setting_poweroff_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_poweroff_img.set_src("E:/static/menu_poweroff.png") +setting_poweroff_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_version = lv.btn(setting_cont) +setting_version.set_pos(0, 540) +setting_version.set_size(240, 54) +setting_version_label = lv.label(setting_version) +setting_version_label.set_text("关于设备") +setting_version.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_version_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_version_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_version_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_version.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_version_img = lv.img(setting_cont) +setting_version_img.set_pos(10, 540) +setting_version_img.set_size(47, 47) +setting_version_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_version_img.set_src("E:/static/menu_version.png") +setting_version_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +setting_update = lv.btn(setting_cont) +setting_update.set_pos(0, 600) +setting_update.set_size(240, 54) +setting_update_label = lv.label(setting_update) +setting_update_label.set_text("系统升级") +setting_update.set_style_pad_all(0, lv.STATE.DEFAULT) +setting_update_label.align(lv.ALIGN.LEFT_MID, 70, 0) +setting_update_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +setting_update_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_update.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +setting_update_img = lv.img(setting_cont) +setting_update_img.set_pos(10, 600) +setting_update_img.set_size(47, 47) +setting_update_img.add_flag(lv.obj.FLAG.CLICKABLE) +setting_update_img.set_src("E:/static/menu_upgrade.png") +setting_update_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------step screen---------------------------------------------------------- +step_screen = lv.obj() +step = lv.obj(step_screen) +step.center() +step.set_size(240, 320) +step.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +step_label = lv.label(step) +step_label.set_pos(10, 30) +step_label.set_size(100, 50) +step_label.set_text("今日步数") +step_label.set_long_mode(lv.label.LONG.WRAP) +step_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +step_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +step_label_01 = lv.label(step) +step_label_01.set_pos(50, 100) +step_label_01.set_size(100, 50) +step_label_01.set_text("666 æ­¥") +step_label_01.set_long_mode(lv.label.LONG.WRAP) +step_label_01.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +step_label_01.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +step_img = lv.img(step) +step_img.set_pos(100, 150) +step_img.set_size(40, 65) +step_img.set_src("E:/static/IMAGE_STEP.png") +step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------weather screen---------------------------------------------------------- +weather_screen = lv.obj() +weather = lv.obj(weather_screen) +weather.center() +weather.set_size(240, 320) +weather.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +weather_img = lv.img(weather) +weather_img.set_pos(10, 10) +weather_img.set_size(135, 120) +weather_img.set_src("E:/static/cloudy.png") +weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +weather_tem_label = lv.label(weather) +weather_tem_label.set_pos(140, 40) +weather_tem_label.set_size(50, 50) +weather_tem_label.set_text("19°C") +weather_tem_label.set_long_mode(lv.label.LONG.WRAP) +weather_tem_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +weather_tem_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +weather_detail_label = lv.label(weather) +weather_detail_label.set_pos(140, 80) +weather_detail_label.set_size(50, 50) +weather_detail_label.set_text("01/30") +weather_detail_label.set_long_mode(lv.label.LONG.WRAP) +weather_detail_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +weather_detail_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +weather_location_label = lv.label(weather) +weather_location_label.set_pos(100, 200) +weather_location_label.set_size(80, 50) +weather_location_label.set_text("深圳市") +weather_location_label.set_long_mode(lv.label.LONG.WRAP) +weather_location_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +weather_location_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------alarm screen---------------------------------------------------------- +alarm_screen = lv.obj() +alarm = lv.obj(alarm_screen) +alarm.center() +alarm.set_size(240, 320) +alarm.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +# alarm_nodata_img = lv.img(alarm) +# alarm_nodata_img.center() +# alarm_nodata_img.set_size(113, 152) +# alarm_nodata_img.set_src("E:/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png") +# alarm_nodata_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +alarm_title = lv.label(alarm) +alarm_title.set_pos(0, 20) +alarm_title.set_size(240, 20) +alarm_title.set_text("闹钟") +alarm_title.set_long_mode(lv.label.LONG.WRAP) +alarm_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +alarm_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# alarm_list = lv.list(alarm) +# alarm_list.set_pos(0, 50) +# alarm_list.set_size(240, 250) +# alarm_list.add_style(style_list, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------countdown screen---------------------------------------------------------- +countdown_screen = lv.obj() +countdown = lv.obj(countdown_screen) +countdown.center() +countdown.set_size(240, 320) +countdown.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_title = lv.label(countdown) +countdown_title.set_pos(0, 20) +countdown_title.set_size(240, 20) +countdown_title.set_text("倒计时") +countdown_title.set_long_mode(lv.label.LONG.WRAP) +countdown_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +countdown_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_hour = lv.label(countdown) +countdown_hour.set_pos(30, 140) +countdown_hour.set_size(30, 30) +countdown_hour.set_text(" 00") +countdown_hour.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_hour.set_long_mode(lv.label.LONG.WRAP) +countdown_hour.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) + +countdown_min = lv.label(countdown) +countdown_min.set_pos(80, 140) +countdown_min.set_size(30, 30) +countdown_min.set_text("00 ") +countdown_min.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_min.set_long_mode(lv.label.LONG.WRAP) +countdown_min.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) + +countdown_sec = lv.label(countdown) +countdown_sec.set_pos(160, 140) +countdown_sec.set_size(30, 30) +countdown_sec.set_text("00 ") +countdown_sec.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_sec.set_long_mode(lv.label.LONG.WRAP) +countdown_sec.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) + +countdown_hour_up = lv.img(countdown) +countdown_hour_up.set_size(34, 30) +countdown_hour_up.set_pos(23, 100) +countdown_hour_up.set_src("E:/static/time_up.png") + + + +countdown_hour_up.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_hour_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_hour_down = lv.img(countdown) +countdown_hour_down.set_size(34, 30) +countdown_hour_down.set_pos(23, 180) +countdown_hour_down.set_src("E:/static/time_down.png") + + + +countdown_hour_down.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_hour_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_min_up = lv.img(countdown) +countdown_min_up.set_size(34, 30) +countdown_min_up.set_pos(80, 100) +countdown_min_up.set_src("E:/static/time_up.png") + + + +countdown_min_up.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_min_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_min_down = lv.img(countdown) +countdown_min_down.set_size(34, 30) +countdown_min_down.set_pos(80, 180) +countdown_min_down.set_src("E:/static/time_down.png") + + + +countdown_min_down.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_min_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_sec_up = lv.img(countdown) +countdown_sec_up.set_size(34, 30) +countdown_sec_up.set_pos(160, 100) +countdown_sec_up.set_src("E:/static/time_up.png") + + + +countdown_sec_up.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_sec_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_sec_down = lv.img(countdown) +countdown_sec_down.set_size(34, 30) +countdown_sec_down.set_pos(160, 180) +countdown_sec_down.set_src("E:/static/time_down.png") + + + +countdown_sec_down.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_sec_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +countdown_reset_imgbtn = lv.img(countdown) +countdown_reset_imgbtn.set_size(99, 36) +countdown_reset_imgbtn.set_src("E:/static/stopwatch_reset.png") + + + +countdown_reset_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_reset_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_reset_imgbtn.set_pos(10, 260) + +countdown_start_imgbtn = lv.img(countdown) +countdown_start_imgbtn.set_size(99, 36) +countdown_start_imgbtn.set_src("E:/static/stopwatch_play.png") + + + +countdown_start_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_start_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_start_imgbtn.set_pos(120, 260) + +countdown_stop_imgbtn = lv.img(countdown) +countdown_stop_imgbtn.set_size(99, 36) +countdown_stop_imgbtn.set_src("E:/static/stopwatch_stop.png") + + + +countdown_stop_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +countdown_stop_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +countdown_stop_imgbtn.set_pos(120, 260) +countdown_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + + +# -------------------------------------------stopwatch screen---------------------------------------------------------- +stopwatch_screen = lv.obj() +stopwatch = lv.obj(stopwatch_screen) +stopwatch.center() +stopwatch.set_size(240, 320) +stopwatch.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +stopwatch_title = lv.label(stopwatch) +stopwatch_title.set_pos(0, 20) +stopwatch_title.set_size(240, 20) +stopwatch_title.set_text("秒表") +stopwatch_title.set_long_mode(lv.label.LONG.WRAP) +stopwatch_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +stopwatch_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +stopwatch_label_min = lv.label(stopwatch) +stopwatch_label_min.set_pos(20, 100) +stopwatch_label_min.set_size(40, 20) +stopwatch_label_min.set_long_mode(lv.label.LONG.WRAP) +stopwatch_label_min.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +stopwatch_label_min.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +#stopwatch_label_min.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT) +stopwatch_label_min.set_text("00") + +stopwatch_label_sec = lv.label(stopwatch) +stopwatch_label_sec.set_pos(80, 100) +stopwatch_label_sec.set_size(40, 20) +stopwatch_label_sec.set_long_mode(lv.label.LONG.WRAP) +stopwatch_label_sec.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +stopwatch_label_sec.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +#stopwatch_label_sec.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT) +stopwatch_label_sec.set_text("00") + +stopwatch_label_ms = lv.label(stopwatch) +stopwatch_label_ms.set_pos(140, 100) +stopwatch_label_ms.set_size(40, 20) +stopwatch_label_ms.set_text("00") +stopwatch_label_ms.set_long_mode(lv.label.LONG.WRAP) +stopwatch_label_ms.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +stopwatch_label_ms.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +#stopwatch_label_ms.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT) + + +stopwatch_reset_imgbtn = lv.img(stopwatch) +stopwatch_reset_imgbtn.set_size(99, 36) +stopwatch_reset_imgbtn.set_src("E:/static/stopwatch_reset.png") +stopwatch_reset_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +stopwatch_reset_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +stopwatch_reset_imgbtn.set_pos(10, 210) + +stopwatch_start_imgbtn = lv.img(stopwatch) +stopwatch_start_imgbtn.set_size(99, 36) + +stopwatch_start_imgbtn.set_src("E:/static/stopwatch_play.png") +stopwatch_start_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +stopwatch_start_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +stopwatch_start_imgbtn.set_pos(115, 210) + +stopwatch_stop_imgbtn = lv.img(stopwatch) +stopwatch_stop_imgbtn.set_size(99, 36) +stopwatch_stop_imgbtn.set_src("E:/static/stopwatch_stop.png") +stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +stopwatch_stop_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +stopwatch_stop_imgbtn.set_pos(115, 210) +stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + +# -------------------------------------------temperature screen---------------------------------------------------------- +temperature_screen = lv.obj() +temperature = lv.obj(temperature_screen) +temperature.center() +temperature.set_size(240, 320) +temperature.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_bg_img = lv.img(temperature) +temperature_bg_img.set_pos(0, 0) +temperature_bg_img.set_size(71, 170) +temperature_bg_img.set_src("E:/static/temp_bg.png") +temperature_bg_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_body_label = lv.label(temperature) +temperature_body_label.set_pos(80, 40) +temperature_body_label.set_size(100, 20) +temperature_body_label.set_text("当前体温") +temperature_body_label.set_long_mode(lv.label.LONG.WRAP) +temperature_body_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +temperature_body_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_degree_img = lv.img(temperature) +temperature_degree_img.set_pos(150, 70) +temperature_degree_img.set_size(22, 22) +temperature_degree_img.set_src("E:/static/degree.png") +temperature_degree_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_value_label = lv.label(temperature) +temperature_value_label.set_pos(100,70) +temperature_value_label.set_size(50, 20) +temperature_value_label.set_text("36.1") +temperature_value_label.set_long_mode(lv.label.LONG.WRAP) +temperature_value_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +temperature_value_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_wrist_label = lv.label(temperature) +temperature_wrist_label.set_pos(80,120) +temperature_wrist_label.set_size(100, 20) +temperature_wrist_label.set_text("当前腕温") +temperature_wrist_label.set_long_mode(lv.label.LONG.WRAP) +temperature_wrist_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +temperature_wrist_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_wrist_degree_img = lv.img(temperature) +temperature_wrist_degree_img.set_pos(150, 150) +temperature_wrist_degree_img.set_size(22, 22) +temperature_wrist_degree_img.set_src("E:/static/degree.png") +temperature_wrist_degree_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +temperature_wrist_value_label = lv.label(temperature) +temperature_wrist_value_label.set_pos(100,150) +temperature_wrist_value_label.set_size(50, 20) +temperature_wrist_value_label.set_text("24.9") +temperature_wrist_value_label.set_long_mode(lv.label.LONG.WRAP) +temperature_wrist_value_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +temperature_wrist_value_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + +# temperature_status_label = lv.label(temperature) +# temperature_status_label.set_pos(80,160) +# temperature_status_label.set_size(100, 20) +# temperature_status_label.set_text("对对对对") +# temperature_status_label.set_long_mode(lv.label.LONG.WRAP) +# temperature_status_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +# temperature_status_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# temperature_notice_label = lv.label(temperature) +# temperature_notice_label.set_pos(50,200) +# temperature_notice_label.set_size(100, 20) +# temperature_notice_label.set_text("对对对对对对") +# temperature_notice_label.set_long_mode(lv.label.LONG.WRAP) +# temperature_notice_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +# temperature_notice_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------spo2 screen---------------------------------------------------------- +spo2_screen = lv.obj() +spo2 = lv.obj(spo2_screen) +spo2.center() +spo2.set_size(240, 320) +spo2.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +spo2_label = lv.label(spo2) +spo2_label.set_pos(0, 10) +spo2_label.set_size(240, 40) +spo2_label.set_text("血氧") +spo2_label.set_long_mode(lv.label.LONG.WRAP) +spo2_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +spo2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +spo2_done_img = lv.img(spo2) +spo2_done_img.set_pos(0, 50) +spo2_done_img.set_size(240, 96) +spo2_done_img.set_src("E:/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg") + +# spo2_finish_gif = lv.gif(spo2) +# spo2_finish_gif.set_pos(0, 40) +# spo2_finish_gif.set_size(240, 120) +# #spo2_finish_img.add_flag(lv.obj.FLAG.CLICKABLE) +# spo2_finish_gif.set_src("E:/static/IMAGE_SPO2_ONLY_ANI.gif") +# #spo2_finish_gif.set_opa(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +spo2_label = lv.label(spo2) +spo2_label.set_size(240,30) +spo2_label.set_pos(0,160) +spo2_label.set_text(" ") +spo2_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +spo2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +spo2_label_1 = lv.label(spo2) +spo2_label_1.set_size(240,40) +spo2_label_1.set_pos(0,200) +spo2_label_1.set_text(" ") +spo2_label_1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +spo2_label_1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +line_points = [{"x":0,"y":245},{"x":240,"y":245}] +spo2_line = lv.line(spo2) +spo2_line.set_points(line_points,2) +spo2_line.add_style(style_line,0) + +spo2_last_time = lv.label(spo2) +spo2_last_time.set_size(240, 15) +spo2_last_time.set_pos(0, 250) +spo2_last_time.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +spo2_last_time.set_text("2023.01.29 19:33") +spo2_last_time.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + +spo2_last_value = lv.label(spo2) +spo2_last_value.set_size(240, 15) +spo2_last_value.set_pos(0, 280) +spo2_last_value.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +spo2_last_value.set_text("96%") +spo2_last_value.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + + + +# -------------------------------------------wechat screen---------------------------------------------------------- +wechat_screen = lv.obj() +wechat = lv.obj(wechat_screen) +wechat.center() +wechat.set_size(240, 320) +wechat.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +wechat_press_btn = lv.btn(wechat) +wechat_press_btn.set_pos(0, 260) +wechat_press_btn.set_size(220, 56) +wechat_press_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +wechat_press_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) +wechat_press_btn.set_style_radius(30,0) + +wechat_press_label = lv.label(wechat_press_btn) +wechat_press_label.set_text("请按住说话") +wechat_press_label.align(lv.ALIGN.CENTER, 10, 0) +wechat_press_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +wechat_label = lv.label(wechat) +wechat_label.center() +wechat_label.set_size(240, 40) +wechat_label.set_long_mode(lv.label.LONG.WRAP) +wechat_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +wechat_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------contacts screen---------------------------------------------------------- +contacts_screen = lv.obj() +contacts = lv.obj(contacts_screen) +contacts.center() +contacts.set_size(240, 320) +contacts.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------language screen---------------------------------------------------------- +language_screen = lv.obj() +language = lv.obj(language_screen) +language.center() +language.set_size(240, 320) +language.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +language_title = lv.label(language) +language_title.set_pos(0, 10) +language_title.set_size(240, 40) +language_title.set_text("语言设置") +language_title.set_long_mode(lv.label.LONG.WRAP) +language_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +language_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +language_english_btn = lv.btn(language) +language_english_btn.set_size(240,50) +language_english_btn.set_pos(0, 60) +language_english_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +language_english_btn.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +language_english_btn_label = lv.label(language_english_btn) +language_english_btn_label.set_text("English") +language_english_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0) +language_english_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +language_chinese_btn = lv.btn(language) +language_chinese_btn.set_size(240,50) +language_chinese_btn.set_pos(0, 120) +language_chinese_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +language_chinese_btn.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +language_chinese_btn_label = lv.label(language_chinese_btn) +language_chinese_btn_label.set_text("简体中文") +language_chinese_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0) +language_chinese_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------dialswitch screen---------------------------------------------------------- +dialswitch_screen = lv.obj() +dialswitch = lv.obj(dialswitch_screen) +dialswitch.center() +dialswitch.set_size(240, 320) +dialswitch.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +dialswitch_title = lv.label(dialswitch) +dialswitch_title.set_pos(0, 10) +dialswitch_title.set_size(240, 40) +dialswitch_title.set_text("表盘切换") +dialswitch_title.set_long_mode(lv.label.LONG.WRAP) +dialswitch_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +dialswitch_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +dialswitch_btn1 = lv.btn(dialswitch) +dialswitch_btn1.set_size(240,54) +dialswitch_btn1.set_pos(0, 50) +dialswitch_btn1.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +dialswitch_btn1.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +dialswitch_btn1_label = lv.label(dialswitch_btn1) +dialswitch_btn1_label.set_text("表盘1") +dialswitch_btn1_label.align(lv.ALIGN.LEFT_MID, 10, 0) +dialswitch_btn1_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +dialswitch_btn2 = lv.btn(dialswitch) +dialswitch_btn2.set_size(240,54) +dialswitch_btn2.set_pos(0, 104) +dialswitch_btn2.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +dialswitch_btn2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +dialswitch_btn2_label = lv.label(dialswitch_btn2) +dialswitch_btn2_label.set_text("表盘2") +dialswitch_btn2_label.align(lv.ALIGN.LEFT_MID, 10, 0) +dialswitch_btn2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +btn1_switch = lv.switch(dialswitch_btn1) +btn1_switch.set_pos(185, 3) +btn1_switch.set_size(10, 10) +btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR) +btn1_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED) +btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB) + +btn2_switch = lv.switch(dialswitch_btn2) +btn2_switch.set_pos(185, 3) +btn2_switch.set_size(10, 10) +btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR) +btn2_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED) +btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB) + +# -------------------------------------------menustyle screen---------------------------------------------------------- +menustyle_screen = lv.obj() +menustyle = lv.obj(menustyle_screen) +menustyle.center() +menustyle.set_size(240, 320) +menustyle.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +menustyle_title = lv.label(menustyle) +menustyle_title.set_pos(0, 10) +menustyle_title.set_size(240, 40) +menustyle_title.set_text("主菜单风格") +menustyle_title.set_long_mode(lv.label.LONG.WRAP) +menustyle_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +menustyle_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +menustyle_btn1 = lv.btn(menustyle) +menustyle_btn1.set_size(240,54) +menustyle_btn1.set_pos(0, 50) +menustyle_btn1.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +menustyle_btn1.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +menustyle_btn1_label = lv.label(menustyle_btn1) +menustyle_btn1_label.set_text("四宫格") +menustyle_btn1_label.align(lv.ALIGN.LEFT_MID, 10, 0) +menustyle_btn1_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +menu_btn1_switch = lv.switch(menustyle_btn1) +menu_btn1_switch.set_pos(185, 3) +menu_btn1_switch.set_size(10, 10) +menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR) +menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED) +menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB) + +menustyle_btn2 = lv.btn(menustyle) +menustyle_btn2.set_size(240,54) +menustyle_btn2.set_pos(0, 104) +menustyle_btn2.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED) +menustyle_btn2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +menustyle_btn2_label = lv.label(menustyle_btn2) +menustyle_btn2_label.set_text("单页") +menustyle_btn2_label.align(lv.ALIGN.LEFT_MID, 10, 0) +menustyle_btn2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +menu_btn2_switch = lv.switch(menustyle_btn2) +menu_btn2_switch.set_pos(185, 3) +menu_btn2_switch.set_size(10, 10) +menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR) +menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED) +menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB) + + +# -------------------------------------------imei screen---------------------------------------------------------- +imei_screen = lv.obj() +imei = lv.obj(imei_screen) +imei.center() +imei.set_size(240, 320) +imei.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) +fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) + +imei_qr = lv.qrcode(imei, 150, fg_color, bg_color) +imei_qr.center() +# Add a border with bg_color +imei_qr.set_style_border_color(bg_color, 0) +imei_qr.set_style_border_width(5, 0) +imei_qr_data = str("867387060319145") +imei_qr.update(imei_qr_data,len(imei_qr_data)) + +imei_label = lv.label(imei) +imei_label.set_pos(0, 280) +imei_label.set_size(240, 20) +imei_label.set_text("867387060319145") +imei_label.set_long_mode(lv.label.LONG.WRAP) +imei_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +imei_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------app screen---------------------------------------------------------- +app_screen = lv.obj() +app = lv.obj(app_screen) +app.center() +app.set_size(240, 320) +app.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +app_qr = lv.qrcode(imei, 150, fg_color, bg_color) +app_qr.center() +# Add a border with bg_color +app_qr.set_style_border_color(bg_color, 0) +app_qr.set_style_border_width(5, 0) +app_qr_data = str("https://fangzoudiu.xcloudtech.com/xiao_jian") +app_qr.update(app_qr_data,len(app_qr_data)) + +app_label = lv.label(app) +app_label.set_pos(0, 280) +app_label.set_size(240, 20) +app_label.set_text("867387060319145") +app_label.set_long_mode(lv.label.LONG.WRAP) +app_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +app_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------brightness screen---------------------------------------------------------- +brightness_screen = lv.obj() +brightness = lv.obj(brightness_screen) +brightness.center() +brightness.set_size(240, 320) +brightness.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +brightness_title = lv.label(brightness) +brightness_title.set_pos(0, 10) +brightness_title.set_size(240, 40) +brightness_title.set_text("屏幕调节") +brightness_title.set_long_mode(lv.label.LONG.WRAP) +brightness_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +brightness_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +brightness_label1 = lv.label(brightness) +brightness_label1.set_pos(10, 60) +brightness_label1.set_size(50, 40) +brightness_label1.set_text("亮度") +brightness_label1.set_long_mode(lv.label.LONG.WRAP) +brightness_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) +brightness_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +brightness_bar = lv.bar(brightness) +brightness_bar.set_pos(20, 120) +brightness_bar.set_size(200, 15) +brightness_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT) +brightness_bar.set_mode(lv.bar.MODE.NORMAL) +brightness_bar.set_value(50, lv.ANIM.OFF) +brightness_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) +brightness_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT) + +brightness_add_imgbtn = lv.img(brightness) +brightness_add_imgbtn.set_pos(50, 250) +brightness_add_imgbtn.set_size(34, 30) +brightness_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +brightness_add_imgbtn.set_src("E:/static/time_up.png") +brightness_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +brightness_reduce_imgbtn = lv.img(brightness) +brightness_reduce_imgbtn.set_pos(150, 250) +brightness_reduce_imgbtn.set_size(34, 30) +brightness_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +brightness_reduce_imgbtn.set_src("E:/static/time_down.png") +brightness_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------volume screen---------------------------------------------------------- +volume_screen = lv.obj() +volume = lv.obj(volume_screen) +volume.center() +volume.set_size(240, 320) +volume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_phone_btn = lv.btn(volume) +volume_phone_btn.set_size(200,50) +volume_phone_btn.set_pos(20,30) +volume_phone_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_phone_label = lv.label(volume_phone_btn) +volume_phone_label.set_text("电话铃声") +volume_phone_label.align(lv.ALIGN.LEFT_MID, 50, 0) +volume_phone_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_alarm_btn = lv.btn(volume) +volume_alarm_btn.set_size(200,50) +volume_alarm_btn.set_pos(20,100) +volume_alarm_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_alarm_label = lv.label(volume_alarm_btn) +volume_alarm_label.set_text("闹钟铃声") +volume_alarm_label.align(lv.ALIGN.LEFT_MID, 50, 0) +volume_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_message_btn = lv.btn(volume) +volume_message_btn.set_size(200,50) +volume_message_btn.set_pos(20,170) +volume_message_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + +volume_message_label = lv.label(volume_message_btn) +volume_message_label.set_text("消息铃声") +volume_message_label.align(lv.ALIGN.LEFT_MID, 50, 0) +volume_message_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------phonering screen---------------------------------------------------------- +phonering_screen = lv.obj() +phonering = lv.obj(phonering_screen) +phonering.center() +phonering.set_size(240, 320) +phonering.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +phonering_title = lv.label(phonering) +phonering_title.set_pos(0, 10) +phonering_title.set_size(240, 40) +phonering_title.set_text("电话铃声") +phonering_title.set_long_mode(lv.label.LONG.WRAP) +phonering_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +phonering_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +phonering_label1 = lv.label(phonering) +phonering_label1.set_pos(10, 60) +phonering_label1.set_size(50, 40) +phonering_label1.set_text("电话铃声") +phonering_label1.set_long_mode(lv.label.LONG.WRAP) +phonering_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) +phonering_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +phonering_bar = lv.bar(phonering) +phonering_bar.set_pos(20, 120) +phonering_bar.set_size(200, 15) +phonering_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT) +phonering_bar.set_mode(lv.bar.MODE.NORMAL) +phonering_bar.set_value(50, lv.ANIM.OFF) +phonering_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) +phonering_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT) + +phonering_add_imgbtn = lv.img(phonering) +phonering_add_imgbtn.set_pos(50, 250) +phonering_add_imgbtn.set_size(34, 30) +phonering_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +phonering_add_imgbtn.set_src("E:/static/time_up.png") +phonering_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +phonering_reduce_imgbtn = lv.img(phonering) +phonering_reduce_imgbtn.set_pos(150, 250) +phonering_reduce_imgbtn.set_size(34, 30) +phonering_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) + +phonering_reduce_imgbtn.set_src("E:/static/time_down.png") + +phonering_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------alarmvolume screen---------------------------------------------------------- +alarmvolume_screen = lv.obj() +alarmvolume = lv.obj(alarmvolume_screen) +alarmvolume.center() +alarmvolume.set_size(240, 320) +alarmvolume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +alarmvolume_title = lv.label(alarmvolume) +alarmvolume_title.set_pos(0, 10) +alarmvolume_title.set_size(240, 40) +alarmvolume_title.set_text("闹钟铃声") +alarmvolume_title.set_long_mode(lv.label.LONG.WRAP) +alarmvolume_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +alarmvolume_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +alarmvolume_label1 = lv.label(alarmvolume) +alarmvolume_label1.set_pos(10, 60) +alarmvolume_label1.set_size(50, 40) +alarmvolume_label1.set_text("闹钟铃声") +alarmvolume_label1.set_long_mode(lv.label.LONG.WRAP) +alarmvolume_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) +alarmvolume_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +alarmvolume_bar = lv.bar(alarmvolume) +alarmvolume_bar.set_pos(20, 120) +alarmvolume_bar.set_size(200, 15) +alarmvolume_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT) +alarmvolume_bar.set_mode(lv.bar.MODE.NORMAL) +alarmvolume_bar.set_value(50, lv.ANIM.OFF) +alarmvolume_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) +alarmvolume_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT) + +alarmvolume_add_imgbtn = lv.img(alarmvolume) +alarmvolume_add_imgbtn.set_pos(50, 250) +alarmvolume_add_imgbtn.set_size(34, 30) +alarmvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) + +alarmvolume_add_imgbtn.set_src("E:/static/time_up.png") + +alarmvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +alarmvolume_reduce_imgbtn = lv.img(alarmvolume) +alarmvolume_reduce_imgbtn.set_pos(150, 250) +alarmvolume_reduce_imgbtn.set_size(34, 30) +alarmvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) + +alarmvolume_reduce_imgbtn.set_src("E:/static/time_down.png") + +alarmvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------msgvolume screen---------------------------------------------------------- +msgvolume_screen = lv.obj() +msgvolume = lv.obj(msgvolume_screen) +msgvolume.center() +msgvolume.set_size(240, 320) +msgvolume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +msgvolume_title = lv.label(msgvolume) +msgvolume_title.set_pos(0, 10) +msgvolume_title.set_size(240, 40) +msgvolume_title.set_text("消息铃声") +msgvolume_title.set_long_mode(lv.label.LONG.WRAP) +msgvolume_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +msgvolume_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +msgvolume_label1 = lv.label(msgvolume) +msgvolume_label1.set_pos(10, 60) +msgvolume_label1.set_size(50, 40) +msgvolume_label1.set_text("消息铃声") +msgvolume_label1.set_long_mode(lv.label.LONG.WRAP) +msgvolume_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) +msgvolume_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +msgvolume_bar = lv.bar(msgvolume) +msgvolume_bar.set_pos(20, 120) +msgvolume_bar.set_size(200, 15) +msgvolume_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT) +msgvolume_bar.set_mode(lv.bar.MODE.NORMAL) +msgvolume_bar.set_value(50, lv.ANIM.OFF) +msgvolume_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) +msgvolume_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT) + +msgvolume_add_imgbtn = lv.img(msgvolume) +msgvolume_add_imgbtn.set_pos(50, 250) +msgvolume_add_imgbtn.set_size(34, 30) +msgvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) + +msgvolume_add_imgbtn.set_src("E:/static/time_up.png") + +msgvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +msgvolume_reduce_imgbtn = lv.img(msgvolume) +msgvolume_reduce_imgbtn.set_pos(150, 250) +msgvolume_reduce_imgbtn.set_size(34, 30) +msgvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) + +msgvolume_reduce_imgbtn.set_src("E:/static/time_down.png") + +msgvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------restore screen---------------------------------------------------------- +restore_screen = lv.obj() +restore = lv.obj(restore_screen) +restore.center() +restore.set_size(240, 320) +restore.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +restore_label = lv.label(restore) +restore_label.set_pos(0, 100) +restore_label.set_size(240, 40) +restore_label.set_text("恢复出厂设置?") +restore_label.set_long_mode(lv.label.LONG.WRAP) +restore_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +restore_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +restore_confirm = lv.label(restore) +restore_confirm.set_text("确认") +restore_confirm.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +restore_confirm.set_size(120, 20) +restore_confirm.set_pos(0,280) +restore_confirm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +restore_confirm.add_flag(lv.obj.FLAG.CLICKABLE) +restore_confirm.set_ext_click_area(20) + +restore_cancel = lv.label(restore) +restore_cancel.set_text("返回") +restore_cancel.set_size(120, 20) +restore_cancel.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +restore_cancel.set_pos(120,280) +restore_cancel.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +restore_cancel.add_flag(lv.obj.FLAG.CLICKABLE) +restore_cancel.set_ext_click_area(20) + + + +# -------------------------------------------poweroff screen---------------------------------------------------------- +poweroff_screen = lv.obj() +poweroff = lv.obj(poweroff_screen) +poweroff.center() +poweroff.set_size(240, 320) +poweroff.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +poweroff_img = lv.img(poweroff) +poweroff_img.set_pos(100, 30) +poweroff_img.set_size(61, 61) +poweroff_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +poweroff_img.set_src("E:/static/poweroff_icon.png") + +poweroff_label = lv.label(poweroff) +poweroff_label.set_text("是否关机?") +poweroff_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +poweroff_label.set_size(240, 20) +poweroff_label.set_pos(0,120) +poweroff_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +poweroff_confirm = lv.img(poweroff) +poweroff_confirm.set_size(176, 46) +poweroff_confirm.set_pos(32, 150) +poweroff_confirm.set_src("E:/static/off_icon.png") +poweroff_confirm.add_flag(lv.obj.FLAG.CLICKABLE) +poweroff_confirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +poweroff_confirm.set_ext_click_area(20) + +poweroff_confirm_label = lv.label(poweroff_confirm) +poweroff_confirm_label.set_text("关机") +poweroff_confirm_label.align(lv.ALIGN.CENTER, 10, 0) +poweroff_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +poweroff_return = lv.img(poweroff) +poweroff_return.set_size(176, 46) +poweroff_return.set_pos(32, 210) +poweroff_return.set_src("E:/static/cancel_icon.png") +poweroff_return.add_flag(lv.obj.FLAG.CLICKABLE) +poweroff_return.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +poweroff_return_label = lv.label(poweroff_return) +poweroff_return_label.set_text("返回") +poweroff_return_label.align(lv.ALIGN.CENTER, 10, 0) +poweroff_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +poweroff_return.set_ext_click_area(20) + +# -------------------------------------------version screen---------------------------------------------------------- +version_screen = lv.obj() +version = lv.obj(version_screen) +version.center() +version.set_size(240, 320) +version.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +version_msg = """Software Version: +MMI +Version:UIX8910_C55_V +1.0_Release +Build Time: +2-17-2023 +9:32:5 +IMEI: +867387060319145 +""" + +version_label = lv.label(version) +version_label.set_pos(0, 0) +version_label.set_size(240, 320) +version_label.set_long_mode(lv.label.LONG.WRAP) +version_label.set_text(version_msg) + +version_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +version_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +# -------------------------------------------update screen---------------------------------------------------------- +update_screen = lv.obj() +update = lv.obj(update_screen) +update.center() +update.set_size(240, 320) +update.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +update_title = lv.label(update) +update_title.set_pos(0, 10) +update_title.set_size(240, 40) +update_title.set_text("系统更新") +update_title.set_long_mode(lv.label.LONG.WRAP) +update_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +update_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +update_label = lv.label(update) +update_label.set_text(" 检查版本更新!/n 请稍后...") +update_label.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) +update_label.set_size(240, 50) +update_label.set_pos(0,50) +update_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +update_return = lv.label(update) +update_return.set_text("返回") +update_return.set_size(120, 20) +update_return.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) +update_return.set_pos(0,280) +update_return.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +update_return.add_flag(lv.obj.FLAG.CLICKABLE) + + +# -------------------------------------------dialing screen---------------------------------------------------------- +dialing_screen = lv.obj() +dialing = lv.obj(dialing_screen) +dialing.center() +dialing.set_size(240, 320) +dialing.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +dialing_img = lv.img(dialing) +dialing_img.set_pos(80, 50) +dialing_img.set_size(64, 64) +dialing_img.set_src("E:/static/IMAGE_NOTICE_CALL.png") +dialing_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +dialing_label = lv.label(dialing) +dialing_label.set_pos(0, 150) +dialing_label.set_size(240, 50) +dialing_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +dialing_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +hangup_imgbtn = lv.img(dialing) +hangup_imgbtn.set_size(64, 64) +hangup_imgbtn.set_src("E:/static/IMG_CC_HUNGUP1.png") + + + +hangup_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) +hangup_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +hangup_imgbtn.set_pos(80, 220) + +# -------------------------------------------incoming_call screen---------------------------------------------------------- +incoming_call_screen = lv.obj() +incoming_call = lv.obj(incoming_call_screen) +incoming_call.center() +incoming_call.set_size(240, 320) +incoming_call.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +incoming_call_img = lv.img(incoming_call) +incoming_call_img.set_pos(80, 50) +incoming_call_img.set_size(64, 64) +incoming_call_img.set_src("E:/static/IMAGE_NOTICE_CALL.png") +incoming_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +incoming_call_label = lv.label(incoming_call) +incoming_call_label.set_pos(0, 150) +incoming_call_label.set_size(240, 50) +incoming_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +incoming_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +incoming_call_answer = lv.img(incoming_call) +incoming_call_answer.set_size(64, 64) +incoming_call_answer.add_flag(lv.obj.FLAG.CLICKABLE) +incoming_call_answer.set_pos(30, 220) +incoming_call_answer.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +incoming_call_answer.set_src("E:/static/answer.png") + +incoming_call_hangup = lv.img(incoming_call) +incoming_call_hangup.set_size(64, 64) +incoming_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE) +incoming_call_hangup.set_pos(150, 220) +incoming_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +incoming_call_hangup.set_src("E:/static/hang_up.png") + +# -------------------------------------------on_call screen---------------------------------------------------------- +on_call_screen = lv.obj() +on_call = lv.obj(on_call_screen) +on_call.center() +on_call.set_size(240, 320) +on_call.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +on_call_img = lv.img(on_call) +on_call_img.set_pos(80, 50) +on_call_img.set_size(64, 64) +on_call_img.set_src("E:/static/IMAGE_NOTICE_CALL.png") +on_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) + +on_call_label = lv.label(on_call) +on_call_label.set_pos(0, 150) +on_call_label.set_size(240, 50) +on_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +on_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +on_call_hangup = lv.img(on_call) +on_call_hangup.set_size(64, 64) +on_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE) +on_call_hangup.set_pos(85, 220) +on_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) +on_call_hangup.set_src("E:/static/hang_up.png") + + +# -------------------------------------------sms_detail screen---------------------------------------------------------- +msg_detail_screen = lv.obj() +sms_detail = lv.obj(msg_detail_screen) +sms_detail.center() +sms_detail.set_size(240, 320) +sms_detail.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +msg_detail_title = lv.label(sms_detail) +msg_detail_title.set_pos(0, 10) +msg_detail_title.set_size(240, 40) +msg_detail_title.set_long_mode(lv.label.LONG.WRAP) +msg_detail_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +msg_detail_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +msg_detail_cont = lv.label(sms_detail) +msg_detail_cont.set_pos(0, 50) +msg_detail_cont.set_size(240, 200) +msg_detail_cont.set_long_mode(lv.label.LONG.WRAP) +msg_detail_cont.set_style_text_align(lv.TEXT_ALIGN.LEFT, 20) +msg_detail_cont.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + +# -------------------------------------------call_log screen---------------------------------------------------------- +call_log_screen = lv.obj() +call_log = lv.obj(call_log_screen) +call_log.center() +call_log.set_size(240, 320) +call_log.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +call_log_title = lv.label(call_log) +call_log_title.set_pos(0, 10) +call_log_title.set_size(240, 40) +call_log_title.set_long_mode(lv.label.LONG.WRAP) +call_log_title.set_text("通话记录") +call_log_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +call_log_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + +from ext.common import Abstract + +class Screen(Abstract): + def __init__(self): + self.meta = None + self.meta_info = None + self.last_screen_info = None + self.bg_img = None + + def set_bg_img(self, _fp): + print("bg _fp = {} NAME = {} bg_img = {}".format(_fp, self.NAME, self.bg_img)) + if self.bg_img: + self.bg_img.set_src(_fp) + + def load_screen(self, e, msg): + print("msg = {}".format(msg)) + EventMesh.publish("load_screen", msg) + + def load_screen_anim(self, e, msg): + print("msg = {}".format(msg)) + EventMesh.publish("load_screen_anim", msg) + + def load_screen_animtop(self, e, msg): + print("msg = {}".format(msg)) + EventMesh.publish("load_screen_animtop", msg) + + def load(self): + pass + + def get_meta(self): + return self.meta + + def Close(self): + pass + + def done_left_to_right(self): + pass + + def done_right_to_left(self): + pass + + def done_bottom_to_top(self): + pass + + def done_top_to_bottom(self): + pass + + def done_return(self): + pass + + def done_click(self): + pass + + def done_error(self): + pass + +class PhoneScreen(Screen): + NAME = "Phone" + + def __init__(self): + + super().__init__() + self.meta = phone_screen + self.phone_num = '' + self.phone_list = [] + phone_one.add_event_cb(lambda e: self.one(e), + lv.EVENT.CLICKED, None) + phone_two.add_event_cb(lambda e: self.two(e), + lv.EVENT.CLICKED, None) + phone_three.add_event_cb(lambda e: self.three(e), + lv.EVENT.CLICKED, None) + phone_four.add_event_cb(lambda e: self.four(e), + lv.EVENT.CLICKED, None) + phone_five.add_event_cb(lambda e: self.five(e), + lv.EVENT.CLICKED, None) + phone_six.add_event_cb(lambda e: self.six(e), + lv.EVENT.CLICKED, None) + phone_seven.add_event_cb(lambda e: self.seven(e), + lv.EVENT.CLICKED, None) + phone_eight.add_event_cb(lambda e: self.eight(e), + lv.EVENT.CLICKED, None) + phone_nine.add_event_cb(lambda e: self.nine(e), + lv.EVENT.CLICKED, None) + phone_zero.add_event_cb(lambda e: self.zero(e), + lv.EVENT.CLICKED, None) + + phone_call.add_event_cb(lambda e: self.call(e), + lv.EVENT.CLICKED, None) + phone_contact.add_event_cb(lambda e: self.contact(e), + lv.EVENT.CLICKED, None) + phone_delete.add_event_cb(lambda e: self.delete(e), + lv.EVENT.CLICKED, None) + + def one(self,e): + self.phone_list.append("1") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def two(self,e): + self.phone_list.append("2") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def three(self,e): + self.phone_list.append("3") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def four(self,e): + self.phone_list.append("4") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def five(self,e): + self.phone_list.append("5") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def six(self,e): + self.phone_list.append("6") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def seven(self,e): + self.phone_list.append("7") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def eight(self,e): + self.phone_list.append("8") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def nine(self,e): + self.phone_list.append("9") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def zero(self,e): + self.phone_list.append("0") + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def delete(self,e): + if self.phone_list is not None: + self.phone_list.pop() + self.phone_num = ''.join(self.phone_list) + self.show_num() + + def contact(self,e): + EventMesh.publish("load_screen", {"screen": "contacts"}) + + def call(self,e): + EventMesh.publish("load_screen", {"screen": "dialing"}) + voiceCall.callStart(self.phone_num) + + def show_num(self): + phone_label.set_text(self.phone_num) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +CALLLOG_FLAG = 0 +class CallLogScreen(Screen): + NAME = "call_log" + + def __init__(self): + super().__init__() + self.meta = call_log_screen + self.log_list = [] + + def post_processor_before_initialization(self): + self.log_list = EventMesh.publish("get_call_log_list") + + def initialization(self): + global CALLLOG_FLAG + if CALLLOG_FLAG == 0: + self.btn_create() + + def btn_create(self): + h = 0 + for i ,each in enumerate(self.log_list): + + _btn = lv.btn(call_log) + _btn.set_size(240,50) + _btn.set_pos(0,52*h + 50) + _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) + _btn.add_event_cb(lambda e: self.calling(e), + lv.EVENT.PRESSED, None) + + _btn_label1 = lv.label(_btn) + _btn_label1.set_pos(0, 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(0, 5) + _btn_label2.set_size(100, 25) + _btn_label2.set_text(each[0]) + _btn_label2.set_long_mode(lv.label.LONG.DOT) + _btn_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + # + _btn_label3 = lv.label(_btn) + _btn_label3.set_pos(100, 5) + _btn_label3.set_size(100, 25) + _btn_label3.set_text("(" + each[1] + ") " + each[3]) + _btn_label3.set_long_mode(lv.label.LONG.DOT) + _btn_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + h = h + 1 + + def calling(self,e): + _i = int(e.get_target().get_child(0).get_text()) + _msg = self.log_list[_i] + EventMesh.publish("save_phonenum",_msg[1]) + EventMesh.publish("load_screen", {"screen": "dialing"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "tilemenu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + +class DialingScreen(Screen): + NAME = "dialing" + + def __init__(self): + super().__init__() + self.meta = dialing_screen + hangup_imgbtn.add_event_cb(lambda e: self.hangup(e), + lv.EVENT.CLICKED, None) + self.value = "" + + + def initialization(self): + #获取字符串 + self.value = EventMesh.publish("get_phonenum") + dialing_label.set_text(self.value) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def hangup(self,e): + voiceCall.callEnd() + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +MSG_FLAG = 0 +class PopupScreen(Screen): + NAME = "popup" + + def __init__(self): + super().__init__() + # -------------------------------------------popup_menu screen---------------------------------------------------------- + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.msg_title = lv.label(self.meta) + self.msg_title.set_pos(0, 10) + self.msg_title.set_size(240, 40) + self.msg_title.set_text("信息") + self.msg_title.set_long_mode(lv.label.LONG.WRAP) + self.msg_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.msg_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + # def post_processor_before_initialization(self): + # EventMesh.publish("get_msg_count") + # self.msg_detail = EventMesh.publish("get_msg_detail") + + def post_processor_before_initialization(self): + check_json = ql_fs.path_exists("/usr/msg.json") + self.msg_detail = EventMesh.publish("get_msg_detail") + if check_json == False: + with open("usr/msg.json","w",encoding="utf-8") as fd: + ujson.dump(self.msg_detail,fd) + print("创建短信") + else: + with open("usr/msg.json","r",encoding="utf-8") as fd: + self.msg_detail = ujson.load(fd) + print("读取短信") + + + def initialization(self): + global MSG_FLAG + if MSG_FLAG == 0: + self.btn_create() + + def btn_create(self): + global MSG_FLAG + MSG_FLAG = 1 + i = 0 + for key in self.msg_detail.keys(): + msg_btn = lv.btn(self.meta) + msg_btn.set_size(240,50) + msg_btn.set_pos(0,52*i) + msg_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + msg_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) + msg_btn.add_event_cb(lambda e: self.calling(e), + lv.EVENT.PRESSED, None) + + contact_btn_label = lv.label(msg_btn) + contact_btn_label.set_text(key) + contact_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0) + contact_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + detail = self.msg_detail[key] + print("------:",detail) + contact_content_label = lv.label(msg_btn) + contact_content_label.set_text(detail[:15]) + contact_content_label.align(lv.ALIGN.LEFT_MID, 80, 0) + contact_content_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + i = i + 1 + # self.name.append(str(key)) + + # print(self.name) + def calling(self,e): + #上传标题和内容 + _name = e.get_target().get_child(0).get_text() + EventMesh.publish("save_msg_name", _name) + #_content = e.get_target().get_child(1).get_text() + EventMesh.publish("save_msg_content", self.msg_detail[_name]) + print(_name,self.msg_detail[_name]) + #显示详细页面 + EventMesh.publish("load_screen", {"screen": "msg_detail"}) + + + def done_bottom_to_top(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class MsgDetailScreen(Screen): + NAME = "msg_detail" + + def __init__(self): + super().__init__() + self.meta = msg_detail_screen + + self.name = "" + self.contetn = "" + + + def initialization(self): + #获取字符串 + self.name = EventMesh.publish("get_msg_name") + self.content = EventMesh.publish("get_msg_content") + msg_detail_title.set_text(self.name) + msg_detail_cont.set_text(self.content) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def hangup(self,e): + voiceCall.callEnd() + EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class HeartrateScreen(Screen): + NAME = "heartrate" + + def __init__(self): + super().__init__() + self.meta = heartrate_screen + self.point = 0 + #self.timer = Timer(Timer.Timer1) + self.timer = osTimer() + + def initialization(self): + heartrate_bpm_label.add_flag(lv.obj.FLAG.HIDDEN) + heartrate_mmhg_label.add_flag(lv.obj.FLAG.HIDDEN) + heartrate_start_label.clear_flag(lv.obj.FLAG.HIDDEN) + + #self.monitor_timer.start(7 * 60 * 1000, 1, self.check) + + def post_processor_after_initialization(self): + self.timer.start(1*1000, 1, self.start_measure) + #self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.start_measure) + + + def start_measure(self,*args): + self.point = self.point + 1 + print("point:",self.point) + if self.point == 1: + heartrate_start_label.set_text("测量中...") + if self.point == 2: + heartrate_start_label.set_text("测量中.....") + if self.point == 3: + heartrate_bpm_label.clear_flag(lv.obj.FLAG.HIDDEN) + heartrate_mmhg_label.clear_flag(lv.obj.FLAG.HIDDEN) + heartrate_start_label.add_flag(lv.obj.FLAG.HIDDEN) + heartrate_bpm_label.set_text("74 bpm") + heartrate_mmhg_label.set_text("110 / 70 mmhg") + self.point = 0 + self.timer.stop() + + def done_return(self): + heartrate_bpm_label.add_flag(lv.obj.FLAG.HIDDEN) + heartrate_mmhg_label.add_flag(lv.obj.FLAG.HIDDEN) + heartrate_start_label.clear_flag(lv.obj.FLAG.HIDDEN) + self.timer.stop() + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + + +class ToolboxScreen(Screen): + NAME = "toolbox" + + def __init__(self): + super().__init__() + self.meta = toolbox_screen + toolbox_step.add_event_cb(lambda e: self.load_screen(e, {"screen": "step"}), lv.EVENT.CLICKED, None) + toolbox_weather.add_event_cb(lambda e: self.load_screen(e, {"screen": "weather"}), lv.EVENT.CLICKED, None) + toolbox_alarm.add_event_cb(lambda e: self.load_screen(e, {"screen": "alarm"}), lv.EVENT.CLICKED, None) + toolbox_countdown.add_event_cb(lambda e: self.load_screen(e, {"screen": "countdown"}), lv.EVENT.CLICKED, None) + toolbox_stopwatch.add_event_cb(lambda e: self.load_screen(e, {"screen": "stopwatch"}), lv.EVENT.CLICKED, None) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class SettingScreen(Screen): + NAME = "setting" + + def __init__(self): + super().__init__() + self.meta = setting_screen + setting_language.add_event_cb(lambda e: self.load_screen(e, {"screen": "language"}), lv.EVENT.CLICKED, None) + setting_dialswitch.add_event_cb(lambda e: self.load_screen(e, {"screen": "dialswitch"}), lv.EVENT.CLICKED, None) + setting_themeswitch.add_event_cb(lambda e: self.load_screen(e, {"screen": "themeswitch"}), lv.EVENT.CLICKED, None) + setting_imei.add_event_cb(lambda e: self.load_screen(e, {"screen": "imei"}), lv.EVENT.CLICKED, None) + setting_app.add_event_cb(lambda e: self.load_screen(e, {"screen": "app"}), lv.EVENT.CLICKED, None) + setting_bright.add_event_cb(lambda e: self.load_screen(e, {"screen": "brightness"}), lv.EVENT.CLICKED, None) + setting_volume.add_event_cb(lambda e: self.load_screen(e, {"screen": "volume"}), lv.EVENT.CLICKED, None) + setting_restore.add_event_cb(lambda e: self.load_screen(e, {"screen": "restore"}), lv.EVENT.CLICKED, None) + setting_poweroff.add_event_cb(lambda e: self.load_screen(e, {"screen": "poweroff"}), lv.EVENT.CLICKED, None) + setting_update.add_event_cb(lambda e: self.load_screen(e, {"screen": "update"}), lv.EVENT.CLICKED, None) + setting_version.add_event_cb(lambda e: self.load_screen(e, {"screen": "version"}), lv.EVENT.CLICKED, None) + + def done_bottom_to_top(self): + #上滑添加动画切屏:动画类型,时间,延迟,auto_del + EventMesh.publish("load_screen", {"screen": "setting2"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class RestoreScreen(Screen): + NAME = "restore" + + def __init__(self): + super().__init__() + self.meta = restore_screen + restore_confirm.add_event_cb(lambda e: self.confirm(e),lv.EVENT.CLICKED, None) + restore_cancel.add_event_cb(lambda e: self.concel(e),lv.EVENT.CLICKED, None) + + def confirm(self, e): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def concel(self, e): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class UpdateScreen(Screen): + NAME = "update" + + def __init__(self): + super().__init__() + self.meta = update_screen + update_return.add_event_cb(lambda e: self.back(e),lv.EVENT.CLICKED, None) + + def back(self,e): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class VersionScreen(Screen): + NAME = "version" + + def __init__(self): + super().__init__() + self.meta = version_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class PoweroffScreen(Screen): + NAME = "poweroff" + + def __init__(self): + super().__init__() + self.meta = poweroff_screen + poweroff_confirm.add_event_cb(lambda e: self.confirm(e),lv.EVENT.CLICKED, None) + poweroff_return.add_event_cb(lambda e: self.concel(e),lv.EVENT.CLICKED, None) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def confirm(self, e): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def concel(self, e): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class LanguageScreen(Screen): + NAME = "language" + + def __init__(self): + super().__init__() + self.meta = language_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class DialswitchScreen(Screen): + NAME = "dialswitch" + + def __init__(self): + super().__init__() + self.meta = dialswitch_screen + dialswitch_btn1.add_event_cb(lambda e: self.watchface01(e), + lv.EVENT.PRESSED, None) + + dialswitch_btn2.add_event_cb(lambda e: self.watchface02(e), + lv.EVENT.PRESSED, None) + + def watchface01(self,e): + #watchface2.add_flag(lv.obj.FLAG.HIDDEN) + #watchface01.clear_flag(lv.obj.FLAG.HIDDEN) + btn1_switch.add_state(lv.STATE.CHECKED) + btn2_switch.clear_state(lv.STATE.CHECKED) + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def watchface02(self,e): + #watchface01.add_flag(lv.obj.FLAG.HIDDEN) + #watchface2.clear_flag(lv.obj.FLAG.HIDDEN) + btn1_switch.clear_state(lv.STATE.CHECKED) + btn2_switch.add_state(lv.STATE.CHECKED) + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class ThemeswitchScreen(Screen): + NAME = "themeswitch" + + def __init__(self): + super().__init__() + self.meta = menustyle_screen + menustyle_btn1.add_event_cb(lambda e: self.fun1(e), + lv.EVENT.PRESSED, None) + + menustyle_btn2.add_event_cb(lambda e: self.fun2(e), + lv.EVENT.PRESSED, None) + + def fun1(self,e): + menu_btn1_switch.add_state(lv.STATE.CHECKED) + menu_btn2_switch.clear_state(lv.STATE.CHECKED) + EventMesh.publish("change_style", "MainMenu1") + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def fun2(self,e): + menu_btn1_switch.clear_state(lv.STATE.CHECKED) + menu_btn2_switch.add_state(lv.STATE.CHECKED) + EventMesh.publish("change_style", "MainMenu2") + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class ImeiScreen(Screen): + NAME = "imei" + + def __init__(self): + super().__init__() + self.meta = imei_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class AppScreen(Screen): + NAME = "app" + + def __init__(self): + super().__init__() + self.meta = app_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class BrightnessScreen(Screen): + NAME = "brightness" + + def __init__(self): + super().__init__() + self.level = 0 + self.meta = brightness_screen + brightness_add_imgbtn.add_event_cb(lambda e: self.add_level(e), + lv.EVENT.CLICKED, None) + brightness_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e), + lv.EVENT.CLICKED, None) + + def add_level(self, e): + EventMesh.publish("push_add_brightness_level") + self.level = EventMesh.publish("get_brightness_level") + self.show_bar() + + def reduce_level(self, e): + EventMesh.publish("push_reduce_brightness_level") + self.level = EventMesh.publish("get_brightness_level") + self.show_bar() + + def show_bar(self): + brightness_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF) + + def initialization(self): + self.level = EventMesh.publish("get_brightness_level") + self.show_bar() + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class VolumeScreen(Screen): + NAME = "volume" + + def __init__(self): + super().__init__() + self.meta = volume_screen + volume_phone_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "phonering"}), lv.EVENT.CLICKED, None) + volume_message_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "msgvolume"}), lv.EVENT.CLICKED, None) + volume_alarm_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "alarmvolume"}), lv.EVENT.CLICKED, None) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "setting"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + +class PhoneringScreen(Screen): + NAME = "phonering" + + def __init__(self): + super().__init__() + self.level = 0 + self.meta = phonering_screen + phonering_add_imgbtn.add_event_cb(lambda e: self.add_level(e), + lv.EVENT.CLICKED, None) + phonering_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e), + lv.EVENT.CLICKED, None) + phonering_add_imgbtn.set_ext_click_area(20) + phonering_reduce_imgbtn.set_ext_click_area(20) + + def add_level(self, e): + EventMesh.publish("push_add_phonering_level") + self.level = EventMesh.publish("get_phonering_level") + self.show_bar() + + def reduce_level(self, e): + EventMesh.publish("push_reduce_phonering_level") + self.level = EventMesh.publish("get_phonering_level") + self.show_bar() + + def show_bar(self): + phonering_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF) + + def initialization(self): + self.level = EventMesh.publish("get_phonering_level") + self.show_bar() + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "volume"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + +class AlarmvolumeScreen(Screen): + NAME = "alarmvolume" + + def __init__(self): + super().__init__() + self.level = 0 + self.meta = alarmvolume_screen + alarmvolume_add_imgbtn.add_event_cb(lambda e: self.add_level(e), + lv.EVENT.CLICKED, None) + alarmvolume_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e), + lv.EVENT.CLICKED, None) + + def add_level(self, e): + EventMesh.publish("push_add_alarmvolume_level") + self.level = EventMesh.publish("get_alarmvolume_level") + self.show_bar() + + def reduce_level(self, e): + EventMesh.publish("push_reduce_alarmvolume_level") + self.level = EventMesh.publish("get_alarmvolume_level") + self.show_bar() + + def show_bar(self): + alarmvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF) + + def initialization(self): + self.level = EventMesh.publish("get_alarmvolume_level") + self.show_bar() + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "volume"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + +class MsgvolumeScreen(Screen): + NAME = "msgvolume" + + def __init__(self): + super().__init__() + self.level = 0 + self.meta = msgvolume_screen + msgvolume_add_imgbtn.add_event_cb(lambda e: self.add_level(e), + lv.EVENT.CLICKED, None) + msgvolume_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e), + lv.EVENT.CLICKED, None) + + def add_level(self, e): + EventMesh.publish("push_add_msgvolume_level") + self.level = EventMesh.publish("get_msgvolume_level") + self.show_bar() + + def reduce_level(self, e): + EventMesh.publish("push_reduce_msgvolume_level") + self.level = EventMesh.publish("get_msgvolume_level") + self.show_bar() + + def show_bar(self): + alarmvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF) + + def initialization(self): + self.level = EventMesh.publish("get_msgvolume_level") + self.show_bar() + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "volume"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class IncomingCallScreen(Screen): + NAME = "incoming_call" + + def __init__(self): + super().__init__() + self.meta = incoming_call_screen + incoming_call_answer.add_event_cb(lambda e: self.answer(e), + lv.EVENT.CLICKED, None) + incoming_call_hangup.add_event_cb(lambda e: self.hangup(e), + lv.EVENT.CLICKED, None) + + def post_processor_after_initialization(self): + + incoming_call_label.set_text(str(self.meta_info)) + + def answer(self,e): + voiceCall.callAnswer() + + def hangup(self,e): + voiceCall.callEnd() + + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class OnCallScreen(Screen): + NAME = "oncall" + + def __init__(self): + super().__init__() + self.meta = on_call_screen + on_call_hangup.add_event_cb(lambda e: self.hangup(e), + lv.EVENT.CLICKED, None) + + def post_processor_after_initialization(self): + on_call_label.set_text(str(self.meta_info)) + + def hangup(self,e): + voiceCall.callEnd() + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +class StepScreen(Screen): + NAME = "step" + + def __init__(self): + super().__init__() + self.meta = step_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + +class WeatherScreen(Screen): + NAME = "weather" + + def __init__(self): + super().__init__() + self.meta = weather_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class WechatScreen(Screen): + NAME = "wechat" + + def __init__(self): + super().__init__() + self.meta = wechat_screen + wechat_press_btn.add_event_cb(lambda e: self.talking(e), + lv.EVENT.PRESSING, None) + wechat_press_btn.add_event_cb(lambda e: self.sending(e), + lv.EVENT.PRESS_LOST, None) + self.timer = osTimer() + wechat_label.set_text(" ") + + def talking(self,e): + wechat_label.set_text("松开发送,上滑取消") + + def sending(self,e): + wechat_label.set_text("发送中") + self.timer.start(2 * 1000, 0, self.hide_label) + + def hide_label(self,*args): + wechat_label.add_flag(lv.obj.FLAG.HIDDEN) + # self.make_btn() + + # def make_btn(self): + # _btn = lv.btn(alarm) + # _btn.set_size(60,50) + # _btn.set_pos(, 52*i + 50) + # _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + # _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) + + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class StepScreen(Screen): + NAME = "step" + + def __init__(self): + super().__init__() + self.meta = step_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +CONTACT_FLAG = 0 +class ContactsScreen(Screen): + NAME = "contacts" + + def __init__(self): + super().__init__() + self.meta = contacts_screen + self.phonebook = {} + self.count = 0 + self.phone_num = "" + self.name = [] + + def post_processor_before_initialization(self): + check_json = ql_fs.path_exists("/usr/phonebook.json") + self.phonebook = EventMesh.publish("get_addr_book_list") + if check_json == False: + with open("usr/phonebook.json","w",encoding="utf-8") as fd: + ujson.dump(self.phonebook,fd) + print("创建电话簿") + else: + with open("usr/phonebook.json","r",encoding="utf-8") as fd: + self.phonebook = ujson.load(fd) + print("读取电话簿") + + def initialization(self): + #读取json文件中的字典放到self.phonebook中 + global CONTACT_FLAG + #创建btn + if CONTACT_FLAG == 0: + self.btn_create() + + def btn_create(self): + #读取json文件中的键作为label文本; + global CONTACT_FLAG + CONTACT_FLAG = 1 + for key in self.phonebook.keys(): + + contact_btn = lv.btn(contacts) + contact_btn.set_size(240,50) + contact_btn.set_pos(0,52*self.count ) + contact_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + contact_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) + contact_btn.add_event_cb(lambda e: self.calling(e), + lv.EVENT.PRESSED, None) + + contact_btn_label = lv.label(contact_btn) + contact_btn_label.set_text(key) + contact_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0) + contact_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + self.count += 1 + + def calling(self,e): + _msg = e.get_target().get_child(0).get_text() + EventMesh.publish("save_phonenum", _msg) + self.phone_num = self.phonebook[_msg] + print(_msg,self.phone_num,_msg) + voiceCall.callStart(self.phone_num) + EventMesh.publish("load_screen", {"screen": "dialing"}) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "tilemenu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class AlarmScreen(Screen): + NAME = "alarm" + + def __init__(self): + super().__init__() + self.meta = alarm_screen + self.count = 2 + + def post_processor_after_initialization(self): + self.btn_create() + + def btn_create(self): + for i in range(self.count): + + _btn = lv.btn(alarm) + _btn.set_size(240,50) + _btn.set_pos(0, 52*i + 50) + _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED) + + _label = lv.label(_btn) + _label.set_text("08:00") + _label.set_pos(2, 0) + _label.set_size(100, 25) + + _label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #频率 + _label2 = lv.label(_btn) + _label2.set_pos(2, 25) + _label2.set_size(100, 25) + _label2.set_text("一 二 三") + _label2.set_long_mode(lv.label.LONG.DOT) + _label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #开关 + _switch = lv.switch(_btn) + _switch.set_pos(150, 3) + _switch.set_size(50, 25) + _switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR) + _switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB) + + + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class TemperatureScreen(Screen): + NAME = "temperature" + + def __init__(self): + super().__init__() + self.meta = temperature_screen + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +class Spo2Screen(Screen): + NAME = "spo2" + + def __init__(self): + super().__init__() + self.meta = spo2_screen + self.timer = osTimer() + self.point = 0 + + def post_processor_after_initialization(self): + self.timer.start(1*1000, 1, self.start_measure) + + def start_measure(self,*args): + self.point = self.point + 1 + if self.point == 1: + spo2_label.set_text("96 %") + spo2_label_1.set_text("测量中") + + if self.point == 2: + spo2_label.set_text("97 %") + spo2_label_1.set_text("测量中") + + if self.point == 3: + spo2_label.set_text("98 %") + spo2_label_1.set_text("测量中") + + if self.point == 4: + spo2_label.set_text("99 %") + spo2_label_1.set_text("测量完成") + self.timer.stop() + self.point = 0 + + def done_return(self): + spo2_start_btn.clear_flag(lv.obj.FLAG.HIDDEN) + spo2_now_value.add_flag(lv.obj.FLAG.HIDDEN) + self.timer.stop() + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + +class CountdownScreen(Screen): + NAME = "countdown" + + def __init__(self): + super().__init__() + self.meta = countdown_screen + self.timer = Timer(Timer.Timer1) + self.sec = 0 + self.min = 0 + self.hour = 0 + self.total = 0 + self.flag = 1 + countdown_sec_up.add_event_cb(lambda e: self.sec_up(e), + lv.EVENT.CLICKED, None) + countdown_sec_down.add_event_cb(lambda e: self.sec_down(e), + lv.EVENT.CLICKED, None) + countdown_min_up.add_event_cb(lambda e: self.min_up(e), + lv.EVENT.CLICKED, None) + countdown_min_down.add_event_cb(lambda e: self.min_down(e), + lv.EVENT.CLICKED, None) + countdown_hour_up.add_event_cb(lambda e: self.hour_up(e), + lv.EVENT.CLICKED, None) + countdown_hour_down.add_event_cb(lambda e: self.hour_down(e), + lv.EVENT.CLICKED, None) + countdown_start_imgbtn.add_event_cb(lambda e: self.start(e), + lv.EVENT.CLICKED, None) + countdown_reset_imgbtn.add_event_cb(lambda e: self.reset(e), + lv.EVENT.CLICKED, None) + countdown_stop_imgbtn.add_event_cb(lambda e: self.stop(e), + lv.EVENT.CLICKED, None) + + def sec_up(self,e): + if self.sec < 59: + self.sec = self.sec + 1 + print("sec_up:",self.sec) + self.show_value() + + def sec_down(self,e): + if self.sec > 0: + self.sec = self.sec - 1 + print("sec_down:",self.sec) + self.show_value() + + def min_up(self,e): + if self.min < 59: + self.min = self.min + 1 + print("min_up:",self.min) + self.show_value() + + def min_down(self,e): + if self.min > 0: + self.min = self.min - 1 + print("min_down:",self.min) + self.show_value() + + def hour_up(self,e): + if self.hour < 23: + self.hour = self.hour + 1 + print("hour_up:",self.hour) + self.show_value() + + def hour_down(self,e): + if self.hour > 0: + self.hour = self.hour - 1 + print("hour_down:",self.hour) + self.show_value() + + def start(self,e): + self.total = self.hour*60*60 + self.min*60 + self.sec + print("--00:",self.total,self.hour,self.min,self.sec) + self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.fun) + countdown_stop_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN) + countdown_start_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + + def stop(self,e): + print("in stop") + countdown_start_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN) + countdown_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + self.timer.stop() + self.show_value() + + def fun(self,e): + self.show_value() + self.total = self.total - 1 + if self.total < 1: + self.timer.stop() + self.sec = self.sec - 1 + + if self.sec < 0: + self.sec = 59 + self.min = self.min -1 + + + def reset(self,e): + print("in reset") + self.timer.stop() + self.hour = 0 + self.min = 0 + self.sec = 0 + self.show_value() + + def show_value(self): + + print(" in show value :",str(self.sec),str(self.min),str(self.hour)) + countdown_sec.set_text(str(self.sec)) + countdown_min.set_text(str(self.min)) + countdown_hour.set_text(str(self.hour)) + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + +class StopwatchScreen(Screen): + NAME = "stopwatch" + + def __init__(self): + super().__init__() + self.meta = stopwatch_screen + self.ms_value = 0 + self.sec_value = 0 + self.min_value = 0 + self.timer = Timer(Timer.Timer1) + stopwatch_start_imgbtn.add_event_cb(lambda e: self.start(e), + lv.EVENT.CLICKED, None) + + stopwatch_reset_imgbtn.add_event_cb(lambda e: self.reset(e), + lv.EVENT.CLICKED, None) + stopwatch_stop_imgbtn.add_event_cb(lambda e: self.paused(e), + lv.EVENT.CLICKED, None) + + def start(self, e): + #self.timer.start(100, 1, self._fun) + self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self._fun) + stopwatch_stop_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN) + stopwatch_start_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + + + def paused(self, e): + print("stopwatch pause") + stopwatch_start_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN) + stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN) + self.timer.stop() + self.show_value() + + def reset(self, e): + print("stopwatch reset") + self.sec_value = 0 + self.min_value = 0 + self.ms_value = 0 + self.timer.stop() + self.show_value() + + def _fun(self,e): + self.ms_value += 1 + if self.ms_value > 9: + self.ms_value = 0 + self.sec_value += 1 + if self.sec_value > 60: + self.sec_value = 0 + self.min_value += 1 + if self.min_value > 60: + self.timer.stop() + self.show_value() + + def show_value(self): + + stopwatch_label_ms.set_text(str(self.ms_value)) + stopwatch_label_sec.set_text(str(self.sec_value)) + stopwatch_label_min.set_text(str(self.min_value)) + + def done_return(self): + self.timer.stop() + EventMesh.publish("load_screen", {"screen": "toolbox"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + self.timer.stop() + + + + +class UIFINDScreen(Screen): + NAME = "FIND" + def __init__(self): + super().__init__() + self.aud = audio.Audio(0) + self.aud.set_pa(Pin.GPIO29) + self.aud.setVolume(10) + self.FIND_timer = osTimer() + self.FIND_timer_count = 0 + + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # add style for watchface + self.meta.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) + #进入图片 + self.watchface_mpsignal_img = lv.img(self.meta) + self.watchface_mpsignal_img.set_pos(int(0),int(80)) + self.watchface_mpsignal_img.set_size(140,140) + self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_mpsignal_img.set_src("E:/static/time_finish.png") + self.watchface_mpsignal_img.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) + + def initialization(self): + self.FIND_timer.start(3000, 1, self.FIND_timer_cb) + self.aud.play(1, 0, 'E:/static/audio_audio_haixiu.mp3') #播放声音 + + def post_processor_after_instantiation(self): + pass + def post_processor_after_initialization(self): + pass + def FIND_timer_cb(self, *args): + self.aud.play(1, 0, 'E:/static/audio_audio_haixiu.mp3') + self.FIND_timer_count += 1 + if self.FIND_timer_count > 40: #120秒 + self.stop_FIND() + + def stop_FIND(self) : + self.FIND_timer.stop() + self.aud.stopAll() + + def done_left_to_right(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def done_right_to_left(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def done_bottom_to_top(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def done_top_to_bottom(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def done_return(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def done_click(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + + + def Close(self): + self.stop_FIND() + pass + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + + +#from usr.ui_WatchFaceScreen import WatchFaceScreen +class UI(object): + def __init__(self, lcd_gpio): + #self.screen = WatchFaceScreen() + #self.screen_old = self.screen + self.screen = None + self.screen_old = None + self.screen_list = [] + self.lv = lv + self.lcd_gpio = lcd_gpio + self.system_sleep_timer = osTimer() + self.system_sleep_timer_count = 0 + self.main_flag = 0 + self.sleep_flag = 1 + + def post_processor_after_instantiation(self): + EventMesh.subscribe("load_screen", self.load_screen) + EventMesh.subscribe("load_screen_anim", self.load_screen_anim) + EventMesh.subscribe("load_screen_animtop", self.load_screen_animtop) + + EventMesh.subscribe("btn1_press", self.btn_press) + EventMesh.subscribe("btn8_press", self.btn_press) + EventMesh.subscribe("btn8_long_press", self.btn_press) + + EventMesh.subscribe("btn1_release", self.btn_release) + + EventMesh.subscribe("done_left_to_right", self.ui_press) + EventMesh.subscribe("done_right_to_left", self.ui_press) + EventMesh.subscribe("done_bottom_to_top", self.ui_press) + EventMesh.subscribe("done_top_to_bottom", self.ui_press) + EventMesh.subscribe("done_return", self.ui_press) + EventMesh.subscribe("done_click", self.ui_press) + EventMesh.subscribe("done_error", self.ui_press) + EventMesh.subscribe("call_in", self.publish_call_in) + + + #EventMesh.subscribe("call_in", self.publish_call_in) + #EventMesh.subscribe("set_bg_img", self.set_bg_img) + + EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep) + EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up) + self.system_sleep_timer.start(1000, 1, self.system_sleep_timer_cb) + + for screen in self.screen_list: + screen.post_processor_after_instantiation() + + def ui_press(self, event, key): + self.system_sleep_timeout_rest() + print("ui press {}".format(event)) + if event == "done_left_to_right": + self.screen.done_left_to_right() + if event == "done_right_to_left": + self.screen.done_right_to_left() + if event == "done_bottom_to_top": + self.screen.done_bottom_to_top() + if event == "done_top_to_bottom": + self.screen.done_top_to_bottom() + if event == "done_return": + self.screen.done_return() + if event == "done_click": + self.screen.done_click() + def btn_press(self, event, key): + print("btn_press: {}".format(event)) + #主表盘按电源键,息屏 + if event == "btn8_press" and self.main_flag == 1: + if self.sleep_flag == 1 : + self.__lcd_off() + return + #息屏状态按按钮都亮屏 + + self.__lcd_on() + + # if event == "btn1_press": + # self.screen.btn1_press() + + if event == "btn8_press": + self.screen.btn8_press() + if event == "btn8_long_press": + Power.powerDown() + + def btn_release(self, event, msg): + print("btn_release: {}".format(event)) + if event == "btn1_release": + self.screen.btn1_release() + + def __lcd_state(self): + return self.lcd_gpio.read() + + def __lcd_on(self): + print("__lcd_on") + if self.sleep_flag == 0 : + self.sleep_flag = 1 + self.system_sleep_timeout_rest() + gpio_backlight.write(1) + #lcd_ctrl.write(1) + #utime.sleep(10) + tp_cst816.resume() + lcd.lcd_display_on() + lv.autoSleep(0) + pm.autosleep(0) + + def publish_call_in(self, event, msg): + EventMesh.publish("load_screen", {"screen": "dialing", "meta": msg}) + + def __lcd_off(self): + print("__lcd_off") + if self.sleep_flag == 1 : + self.sleep_flag = 0 + gpio_backlight.write(0) + #lcd_ctrl.write(0) + #utime.sleep(10) + tp_cst816.suspend() + lcd.lcd_display_off() + lv.autoSleep(1) + pm.autosleep(1) + + def system_sleep(self, event, msg) : + self.__lcd_off() + + def system_up(self, event, msg): + self.__lcd_on() + + def system_sleep_timer_cb(self, *args): + self.system_sleep_timer_count += 1 + if self.system_sleep_timer_count > 50 : + self.system_sleep_timer_count = 0 + #print("__lcd_state") + #if self.sleep_flag == 1: # 未息屏状态,熄灭屏幕 + self.__lcd_off() + + def system_sleep_timeout_rest(self) : + #print("system_sleep_timeout_rest") + self.system_sleep_timer_count = 0 + + def start(self): + self.post_processor_after_instantiation() + + def add_screen(self, screen): + self.screen_list.append(screen) + return self + + + def load_screen(self, topic, msg): + print("msg={}".format(msg)) + for scr in self.screen_list: + if scr.NAME == msg["screen"]: + # 每次屏幕切换开始息屏倒计时 + self.__lcd_on() + if scr.NAME == 'watchface': + self.main_flag = 1 + else : + self.main_flag = 0 + self.screen = scr + if self.screen_old != None : + self.screen_old.Close() #先关闭上一次界面 + self.lv.img.cache_invalidate_src(None) #清img cache + self.lv.img.cache_set_size(16) #开img cache + self.screen_old = self.screen + if msg.get("meta"): + self.screen.meta_info = msg.get("meta") + self.screen.post_processor_before_initialization() + self.screen.initialization() + + print("load_screen.load()") + self.screen.load() + self.lv.scr_load(self.screen.get_meta()) + self.screen.post_processor_after_initialization() + + def load_screen_anim(self, topic, msg): + print("msg={}".format(msg)) + for scr in self.screen_list: + if scr.NAME == msg["screen"]: + # 每次屏幕切换开始息屏倒计时 + self.__lcd_on() + if scr.NAME == 'watchface': + self.main_flag = 1 + else : + self.main_flag = 0 + self.screen = scr + if self.screen_old != None : + self.screen_old.Close() #先关闭上一次界面 + self.screen_old = self.screen + if msg.get("meta"): + self.screen.meta_info = msg.get("meta") + self.screen.post_processor_before_initialization() + self.screen.initialization() + + print("load_screen.load()") + print("**************") + self.screen.load() + self.lv.scr_load_anim(self.screen.get_meta(),lv.SCR_LOAD_ANIM.MOVE_BOTTOM,100,0,0) + self.screen.post_processor_after_initialization() + + def load_screen_animtop(self, topic, msg): + print("msg={}".format(msg)) + for scr in self.screen_list: + if scr.NAME == msg["screen"]: + # 每次屏幕切换开始息屏倒计时 + self.__lcd_on() + if scr.NAME == 'watchface': + self.main_flag = 1 + else : + self.main_flag = 0 + self.screen = scr + if self.screen_old != None : + self.screen_old.Close() #先关闭上一次界面 + self.screen_old = self.screen + if msg.get("meta"): + self.screen.meta_info = msg.get("meta") + self.screen.post_processor_before_initialization() + self.screen.initialization() + + print("load_screen.load()") + print("**************") + self.screen.load() + self.lv.scr_load_anim(self.screen.get_meta(),lv.SCR_LOAD_ANIM.MOVE_TOP,100,0,0) + self.screen.post_processor_after_initialization() + + + diff --git a/3.code/1.watch/2.code/ui_WatchFaceScreen.py b/3.code/1.watch/2.code/ui_WatchFaceScreen.py new file mode 100644 index 00000000..ac50e44c --- /dev/null +++ b/3.code/1.watch/2.code/ui_WatchFaceScreen.py @@ -0,0 +1,503 @@ +#表盘 +import utime +import osTimer +import lvgl as lv +from ext import EventMesh +from machine import Timer +import voiceCall +import osTimer +from ext import constants +from misc import Power +import pm +from ext.ui import Screen + +class Watchface2(): + NAME = "Watchface2" + # # #表盘1 + def __init__(self): + print("Watchface2:__init__") + + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # create style watchface_default + self.watchface_default = lv.style_t() + self.watchface_default.init() + self.watchface_default.set_bg_color(lv.color_make(0x00,0x00,0x00)) + self.watchface_default.set_bg_opa(255) + # add style for watchface + self.meta.add_style(self.watchface_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.style_watchface_img_default = lv.style_t() + self.style_watchface_img_default.init() + self.style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) + self.style_watchface_img_default.set_img_recolor_opa(0) + self.style_watchface_img_default.set_img_opa(255) + + #状态栏 + + self.watchface_mpsignal_img = lv.img(self.meta) + self.watchface_mpsignal_img.set_pos(int(0),int(0)) + self.watchface_mpsignal_img.set_size(24,17) + self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png") + self.watchface_mpsignal_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface_res_stat_battery_img = lv.img(self.meta) + self.watchface_res_stat_battery_img.set_pos(int(200),int(0)) + self.watchface_res_stat_battery_img.set_size(30,18) + self.watchface_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_res_stat_battery_img.set_src("E:/static/vbat_100.png") + self.watchface_res_stat_battery_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface_res_stat_charge_in_img = lv.img(self.meta) + self.watchface_res_stat_charge_in_img.set_pos(int(190),int(0)) + self.watchface_res_stat_charge_in_img.set_size(10,18) + self.watchface_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png") + # add style for watchface_res_stat_charge_in_img + self.watchface_res_stat_charge_in_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #时间 + x = 10 + y = 60 + self.watchface1_time1_img = lv.img(self.meta) + self.watchface1_time1_img.set_pos(int(x),int(y)) + self.watchface1_time1_img.set_size(56,56) + self.watchface1_time1_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time1_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time1_img.set_src("E:/static/watch_plate/style_2/time/1.png") + self.watchface1_time1_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time2_img = lv.img(self.meta) + self.watchface1_time2_img.set_pos(int(x+60),int(y)) + self.watchface1_time2_img.set_size(56,56) + self.watchface1_time2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time2_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time2_img.set_src("E:/static/watch_plate/style_2/time/3.png") + self.watchface1_time2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time4_img = lv.img(self.meta) + self.watchface1_time4_img.set_pos(int(x),int(y + 5 + 56)) + self.watchface1_time4_img.set_size(56,56) + self.watchface1_time4_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time4_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time4_img.set_src("E:/static/watch_plate/style_2/time/2.png") + self.watchface1_time4_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time5_img = lv.img(self.meta) + self.watchface1_time5_img.set_pos(int(x+60),int(y+5+56)) + self.watchface1_time5_img.set_size(56,56) + self.watchface1_time5_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time5_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time5_img.set_src("E:/static/watch_plate/style_2/time/3.png") + self.watchface1_time5_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #星期 + + self.weekday = lv.img(self.meta) + self.weekday.set_pos(15,190) + self.weekday.set_size(56,56) + self.weekday.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.weekday.add_flag(lv.obj.FLAG.CLICKABLE) + self.weekday.set_src("E:/static/watch_plate/style_2/week/fri.png") + self.weekday.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + #日期 + + self.date = lv.label(self.meta) + self.date.set_pos() + self.date.set_size() + self.date.set_long_mode(lv.label.LONG.WRAP) + self.date.set_text() + self.date.set_style_text_align(lv.TEXT_ALIGN.CENTER,0) + self.date.add_style(style_font_youyuan_20,lv.PART.MAIN|lv.STATE.DEFAULT) + + #阴历 + self.date = lv.label(self.meta) + self.date.set_pos() + self.date.set_size() + self.date.set_long_mode(lv.label.LONG.WRAP) + self.date.set_text() + self.date.set_style_text_align(lv.TEXT_ALIGN.CENTER,0) + self.date.add_style(style_font_youyuan_20,lv.PART.MAIN|lv.STATE.DEFAULT) + + #天气logo + self.weather = lv.img(self.meta) + self.weather.set_pos(0, 50) + self.weather.set_size(240, 96) + self.weather.set_src("E:/static/IMAGE_HEART_ONLY_TEST_DONE.jpg") + #温度 + + +class Watchface1(): + NAME = "Watchface1" + # # #表盘1 + def __init__(self): + print("Watchface1:__init__") + + self.meta = lv.obj() + self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + # create style watchface_default + self.watchface_default = lv.style_t() + self.watchface_default.init() + self.watchface_default.set_bg_color(lv.color_make(0x00,0x00,0x00)) + self.watchface_default.set_bg_opa(255) + # add style for watchface + self.meta.add_style(self.watchface_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + # create style style_watchface_img_default + self.style_watchface_img_default = lv.style_t() + self.style_watchface_img_default.init() + self.style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) + self.style_watchface_img_default.set_img_recolor_opa(0) + self.style_watchface_img_default.set_img_opa(255) + + #状态栏 + + self.watchface_mpsignal_img = lv.img(self.meta) + self.watchface_mpsignal_img.set_pos(int(0),int(0)) + self.watchface_mpsignal_img.set_size(24,17) + self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png") + self.watchface_mpsignal_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface_res_stat_battery_img = lv.img(self.meta) + self.watchface_res_stat_battery_img.set_pos(int(200),int(0)) + self.watchface_res_stat_battery_img.set_size(30,18) + self.watchface_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_res_stat_battery_img.set_src("E:/static/vbat_100.png") + self.watchface_res_stat_battery_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface_res_stat_charge_in_img = lv.img(self.meta) + self.watchface_res_stat_charge_in_img.set_pos(int(190),int(0)) + self.watchface_res_stat_charge_in_img.set_size(10,18) + self.watchface_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png") + # add style for watchface_res_stat_charge_in_img + self.watchface_res_stat_charge_in_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #主图片 + self.watchface1_bg_img = lv.img(self.meta) + self.watchface1_bg_img.set_pos(int(0),int(40)) + self.watchface1_bg_img.set_size(240,280) + self.watchface1_bg_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_bg_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_bg_img.set_src("E:/static/watch_plate/style_1/bg.png") + self.watchface1_bg_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + #时间 + x = 40 + y = 80 + self.watchface1_time1_img = lv.img(self.meta) + self.watchface1_time1_img.set_pos(int(x),int(y)) + self.watchface1_time1_img.set_size(36,44) + self.watchface1_time1_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time1_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time1_img.set_src("E:/static/watch_plate/style_1/time/1.png") + self.watchface1_time1_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time2_img = lv.img(self.meta) + self.watchface1_time2_img.set_pos(int(x+36),int(y)) + self.watchface1_time2_img.set_size(36,44) + self.watchface1_time2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time2_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time2_img.set_src("E:/static/watch_plate/style_1/time/3.png") + self.watchface1_time2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time3_img = lv.img(self.meta) + self.watchface1_time3_img.set_pos(int(x+36+36+4),int(y+2)) + self.watchface1_time3_img.set_size(8,24) + self.watchface1_time3_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time3_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time3_img.set_src("E:/static/watch_plate/style_1/time/colon.png") + self.watchface1_time3_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time4_img = lv.img(self.meta) + self.watchface1_time4_img.set_pos(int(x+36+36+16),int(y)) + self.watchface1_time4_img.set_size(36,44) + self.watchface1_time4_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time4_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time4_img.set_src("E:/static/watch_plate/style_1/time/2.png") + self.watchface1_time4_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_time5_img = lv.img(self.meta) + self.watchface1_time5_img.set_pos(int(x+36+36+16+36),int(y)) + self.watchface1_time5_img.set_size(36,44) + self.watchface1_time5_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_time5_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_time5_img.set_src("E:/static/watch_plate/style_1/time/3.png") + self.watchface1_time5_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + #日期 + self.watchface1_date = lv.spangroup(self.meta) + self.watchface1_date.set_pos(int(24),int(131)) + self.watchface1_date.set_size(84,17) + self.watchface1_date.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_date.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_date.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_date.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_date_span = self.watchface1_date.new_span() + self.watchface1_date_span.set_text("12月9日") + self.watchface1_date_span.style.set_text_color(lv.color_make(0xe0,0xd7,0xd7)) + self.watchface1_date_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + self.watchface1_date_span.style.set_size(100) + #main_style_1_spangroup_date_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_date.refr_mode() + # create style self.watchface1_style_default + self.watchface1_style_default = lv.style_t() + self.watchface1_style_default.init() + self.watchface1_style_default.set_radius(0) + self.watchface1_style_default.set_bg_color(lv.color_make(0x21,0x95,0xf6)) + self.watchface1_style_default.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6)) + self.watchface1_style_default.set_bg_grad_dir(lv.GRAD_DIR.NONE) + self.watchface1_style_default.set_bg_opa(0) + self.watchface1_style_default.set_border_color(lv.color_make(0x00,0x00,0x00)) + self.watchface1_style_default.set_border_width(0) + self.watchface1_style_default.set_border_opa(255) + self.watchface1_style_default.set_pad_left(0) + self.watchface1_style_default.set_pad_right(0) + self.watchface1_style_default.set_pad_top(0) + self.watchface1_style_default.set_pad_bottom(0) + self.watchface1_style_default.set_text_font_v2("font.bin",0) #将外部字体库与该style对象绑定 + # add style for main_style_1_spangroup_date + self.watchface1_date.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + #星期 + self.watchface1_week = lv.spangroup(self.meta) + self.watchface1_week.set_pos(int(29),int(163)) + self.watchface1_week.set_size(64,17) + self.watchface1_week.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_week.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_week.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_week.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_week_span = self.watchface1_week.new_span() + self.watchface1_week_span.set_text("星期四") + self.watchface1_week_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7)) + self.watchface1_week_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + #self.watchface1_week_week_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_week.refr_mode() + # add style for main_style_1_spangroup_week + self.watchface1_week.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #阴历 + self.watchface1_lunar_calendar = lv.spangroup(self.meta) + self.watchface1_lunar_calendar.set_pos(int(124),int(131)) + self.watchface1_lunar_calendar.set_size(110,17) + self.watchface1_lunar_calendar.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_lunar_calendar.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_lunar_calendar.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_lunar_calendar.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_lunar_calendar_span = self.watchface1_lunar_calendar.new_span() + self.watchface1_lunar_calendar_span.set_text("三月初三") + self.watchface1_lunar_calendar_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7)) + self.watchface1_lunar_calendar_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + #self.watchface1_lunar_calendar_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_lunar_calendar.refr_mode() + # add style for main_style_1_spangroup_week + self.watchface1_lunar_calendar.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #计步 + self.watchface1_step_img = lv.img(self.meta) + self.watchface1_step_img.set_pos(int(130),int(154)) + self.watchface1_step_img.set_size(26,24) + self.watchface1_step_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_step_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_step_img.set_src("E:/static/watch_plate/style_1/step.png") + self.watchface1_step_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_step_txt = lv.spangroup(self.meta) + self.watchface1_step_txt.set_pos(int(170),int(163)) + self.watchface1_step_txt.set_size(60,18) + self.watchface1_step_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_step_txt.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_step_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_step_txt.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_step_span = self.watchface1_step_txt.new_span() + self.watchface1_step_span.set_text("16888") + self.watchface1_step_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7)) + self.watchface1_step_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + #self.watchface1_week_step_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_step_txt.refr_mode() + # add style for main_style_1_spangroup_week + self.watchface1_step_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #心律 + self.watchface1_HB_img = lv.img(self.meta) + self.watchface1_HB_img.set_pos(int(53),int(198)) + self.watchface1_HB_img.set_size(30,27) + self.watchface1_HB_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_HB_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_HB_img.set_src("E:/static/watch_plate/style_1/heart.png") + self.watchface1_HB_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_HB_txt = lv.spangroup(self.meta) + self.watchface1_HB_txt.set_pos(int(55),int(235)) + self.watchface1_HB_txt.set_size(45,18) + self.watchface1_HB_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_HB_txt.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_HB_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_HB_txt.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_HB_span = self.watchface1_HB_txt.new_span() + self.watchface1_HB_span.set_text("199") + self.watchface1_HB_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7)) + self.watchface1_HB_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + #self.watchface1_week_HB_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_HB_txt.refr_mode() + # add style for main_style_1_spangroup_week + self.watchface1_HB_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + #血氧 + self.watchface1_SPO2_img = lv.img(self.meta) + self.watchface1_SPO2_img.set_pos(int(161),int(193)) + self.watchface1_SPO2_img.set_size(23,32) + self.watchface1_SPO2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_SPO2_img.add_flag(lv.obj.FLAG.CLICKABLE) + self.watchface1_SPO2_img.set_src("E:/static/watch_plate/style_1/blood.png") + self.watchface1_SPO2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + self.watchface1_SPO2_txt = lv.spangroup(self.meta) + self.watchface1_SPO2_txt.set_pos(int(160),int(235)) + self.watchface1_SPO2_txt.set_size(42,18) + self.watchface1_SPO2_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + self.watchface1_SPO2_txt.set_align(lv.TEXT_ALIGN.LEFT) + self.watchface1_SPO2_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP) + self.watchface1_SPO2_txt.set_mode(lv.SPAN_MODE.BREAK) + self.watchface1_SPO2_span = self.watchface1_SPO2_txt.new_span() + self.watchface1_SPO2_span.set_text("199") + self.watchface1_SPO2_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7)) + self.watchface1_SPO2_span.style.set_text_decor(lv.TEXT_DECOR.NONE) + #self.watchface1_week_SPO2_span.style.set_text_font(lv.font_harmony_19) + self.watchface1_SPO2_txt.refr_mode() + # add style for main_style_1_spangroup_week + self.watchface1_SPO2_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT) + + + def initialization(self): + #获取信号 + signal = EventMesh.publish("screen_get_sig") + if signal: + self.__signal(None, signal) + # 获取电池电量 + battery = EventMesh.publish("screen_get_battery") + if battery: + self.__battery(None, battery) + time = EventMesh.publish("screen_get_time") + #print("publish_time:"+time) + if time: + self.__time(None, time) + + def timerout_update(self): + #获取信号 + signal = EventMesh.publish("screen_get_sig") + if signal: + self.__signal(None, signal) + # 获取电池电量 + battery = EventMesh.publish("screen_get_battery") + if battery: + self.__battery(None, battery) + + time = EventMesh.publish("screen_get_time") + #print("publish_time:"+time) + if time: + self.__time(None, time) + + def __time(self, event, msg): + #时间 + hour1_chose = (msg[0][0])//10%10 + hour2_chose = (msg[0][0])%10 + min1_chose = (msg[0][1])//10%10 + min2_chose = (msg[0][1])%10 + self.watchface1_time1_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(hour1_chose)) + self.watchface1_time2_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(hour2_chose)) + self.watchface1_time4_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(min1_chose)) + self.watchface1_time5_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(min2_chose)) + self.watchface1_date_span.set_text(msg[2])#日期 + self.watchface1_week_span.set_text(msg[3]) #星期 + + def __signal(self, event, msg): + #print("__signal_cb:",str(msg)) + # 信号强度值范围0 ~ 31,值越大表示信号强度越好 + #print("__signal_cb:{}".format(msg//8)) + if msg: + if msg >= 0 and msg<=31 : + self.watchface_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8)) + else : + self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png") + + def __battery(self, event, msg): + #print("__battery_cb:",str(msg)) + #print(msg) + if msg[0] == '1': + self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png") + else: + self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in1.png") + + self.watchface_res_stat_battery_img.set_src("E:/static/vbat_%d.png"%(msg[1]))#"E:/vbat_60.png" + pass + + +class WatchFaceScreen(Screen): + NAME = "watchface" + + def __init__(self): + super().__init__() + #表盘 + self.watchface_list = [] + self.meta = None + self.watchface_style_num = "Watchface1" + + self.timer_update = osTimer() + + def initialization(self): + print("watchface INIT !!!!!!!!") + if self.watchface_list == [] : #第一次初始化 + self.watchface_list.append( Watchface1()) + + for wat in self.watchface_list: + if wat.NAME == self.watchface_style_num : + self.watchface_style = wat + self.meta = self.watchface_style.meta + self.watchface_style.initialization() + self.timer_update.start(10000, 1, self.timerout_update) + + def post_processor_after_initialization(self): + EventMesh.subscribe("change_face", self.change_face) + + + def change_face(self, event=None, msg=None): + print("change face :",msg) + self.watchface_style_num = msg + + def timerout_update(self, *args, **kwargs): + self.watchface_style.timerout_update() + + + + + def Close(self): + print("watchface Close !!!!!!!!") + self.timer_update.stop() + return + + + + def done_right_to_left(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + #EventMesh.publish("load_screen", {"screen": "watchface"}) + #self.timer_update.stop() + + def done_top_to_bottom(self): + #EventMesh.publish("load_screen", {"screen": "watchface"}) + #self.timer_update.stop() + EventMesh.publish("load_screen", {"screen": "popup"}) + + def done_bottom_to_top(self): + EventMesh.publish("load_screen", {"screen": "call_log"}) + #EventMesh.publish("load_screen", {"screen": "watchface"}) + #self.timer_update.stop() + def btn1_release(self): + pass + def btn8_press(self): + pass diff --git a/3.code/1.watch/2.code/ui_main_menu.py b/3.code/1.watch/2.code/ui_main_menu.py new file mode 100644 index 00000000..a75b11eb --- /dev/null +++ b/3.code/1.watch/2.code/ui_main_menu.py @@ -0,0 +1,447 @@ +#主菜单 +import utime +import osTimer +import lvgl as lv +from ext import EventMesh +from machine import Timer +import voiceCall +import osTimer +from ext import constants +from misc import Power +import pm +from ext.ui import Screen +style_MainMenu_screen_default = lv.style_t() +style_MainMenu_screen_default.init() +style_MainMenu_screen_default.set_radius(0) +style_MainMenu_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) +style_MainMenu_screen_default.set_bg_opa(255) +style_MainMenu_screen_default.set_border_width(0) +style_MainMenu_screen_default.set_pad_left(0) +style_MainMenu_screen_default.set_pad_right(0) +style_MainMenu_screen_default.set_pad_top(0) +style_MainMenu_screen_default.set_pad_bottom(0) + +style_MainMenu_img_default = lv.style_t() +style_MainMenu_img_default.init() +style_MainMenu_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) +style_MainMenu_img_default.set_img_recolor_opa(0) +style_MainMenu_img_default.set_img_opa(255) + +style_font_youyuan_20 = lv.style_t() +style_font_youyuan_20.init() +style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff)) +style_font_youyuan_20.set_text_font_v2("font.bin",0) + +style_btn = lv.style_t() +style_btn.init() +style_btn.set_bg_opa(lv.OPA.TRANSP) +style_btn.set_shadow_opa(0) +style_btn.set_border_width(0) + +class MainMenuScreen(Screen): + NAME = "main_menu" + + def __init__(self): + super().__init__() + #主菜单 + self.main_menu_list = [] + self.meta = None + self.main_menu_style_num = "MainMenu2" + + def initialization(self): + print("main_menu INIT !!!!!!!!") + if self.main_menu_list == [] : #第一次初始化 + self.main_menu_list.append( MainMenu1()) + self.main_menu_list.append( MainMenu2()) + + for menu in self.main_menu_list: + if menu.NAME == self.main_menu_style_num : + self.main_menu_style = menu + self.meta = self.main_menu_style.meta + self.main_menu_style.initialization() + + def post_processor_after_instantiation(self): + EventMesh.subscribe("change_style", self.change_style) + + + def change_style(self, event=None, msg=None): + print("change style :",msg) + self.main_menu_style_num = msg + + + def Close(self): + print("main_menu Close !!!!!!!!") + return + + # def done_return(self): + # EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + def btn8_press(self): + EventMesh.publish("load_screen", {"screen": "watchface"}) + +#主菜单风格1,四宫格 +class MainMenu1(): + NAME = "MainMenu1" + def __init__(self): + print("MainMenuSquare:__init__") + self.meta = lv.obj() + self.MainMenu1 = lv.tileview(self.meta) + self.MainMenu1.set_scrollbar_mode(0) + self.MainMenu1.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) + #第一页 + self.MainMenu1_1 = self.MainMenu1.add_tile(0, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + # #闹钟 + self.MainMenu1_img_alarm = lv.btn(self.MainMenu1_1) + self.MainMenu1_img_alarm.set_size(70, 70) + self.MainMenu1_img_alarm.set_pos(30,60) + self.MainMenu1_img_alarm.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_alarm.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) + + # #支付宝 + self.MainMenu1_img_ali = lv.btn(self.MainMenu1_1) + self.MainMenu1_img_ali.set_size(70, 70) + self.MainMenu1_img_ali.set_pos(140,60) + self.MainMenu1_img_ali.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_ali.add_event_cb(lambda e: self.img_cb(e, "alipay_open"), lv.EVENT.CLICKED, None) + + # #拍照 + self.MainMenu1_img_camera = lv.btn(self.MainMenu1_1) + self.MainMenu1_img_camera.set_size(70, 70) + self.MainMenu1_img_camera.set_pos(30,190) + self.MainMenu1_img_camera.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_camera.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) + + # #倒计时 + self.MainMenu1_img_countdown = lv.btn(self.MainMenu1_1) + self.MainMenu1_img_countdown.set_size(70, 70) + self.MainMenu1_img_countdown.set_pos(140,190) + self.MainMenu1_img_countdown.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_countdown.add_event_cb(lambda e: self.img_cb(e, "countdown"), lv.EVENT.CLICKED, None) + + #第一页图片 + self.MainMenu1_1_img = lv.img(self.MainMenu1_1) + self.MainMenu1_1_img.set_size(240, 200) + self.MainMenu1_1_img.set_pos(0,60) + self.MainMenu1_1_img.set_src("E:/static/main_menu/main_menu1/4-1.jpg") + self.MainMenu1_1_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + + + + + + #第二页 + self.MainMenu1_2 = self.MainMenu1.add_tile(1, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + # #通话 + self.MainMenu1_img_call = lv.btn(self.MainMenu1_2) + self.MainMenu1_img_call.set_size(70, 70) + self.MainMenu1_img_call.set_pos(30,60) + self.MainMenu1_img_call.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_call.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) + + # #心率 + self.MainMenu1_img_hr = lv.btn(self.MainMenu1_2) + self.MainMenu1_img_hr.set_size(70, 70) + self.MainMenu1_img_hr.set_pos(140,60) + self.MainMenu1_img_hr.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_hr.add_event_cb(lambda e: self.img_cb(e, "heartrate"), lv.EVENT.CLICKED, None) + + # #血氧 + self.MainMenu1_img_spo2 = lv.btn(self.MainMenu1_2) + self.MainMenu1_img_spo2.set_size(70, 70) + self.MainMenu1_img_spo2.set_pos(30,190) + self.MainMenu1_img_spo2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.MainMenu1_img_spo2.add_event_cb(lambda e: self.img_cb(e, "spo2"), lv.EVENT.CLICKED, None) + + # #短信 + self.MainMenu1_img_sms = lv.btn(self.MainMenu1_2) + self.MainMenu1_img_sms.set_size(70, 70) + self.MainMenu1_img_sms.set_pos(140,190) + self.MainMenu1_img_sms.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.MainMenu1_img_sms.add_event_cb(lambda e: self.img_cb(e, "popup"), lv.EVENT.CLICKED, None) + + #第二页图片 + self.MainMenu1_2_img = lv.img(self.MainMenu1_2) + self.MainMenu1_2_img.set_size(240, 200) + self.MainMenu1_2_img.set_pos(0,60) + self.MainMenu1_2_img.set_src("E:/static/main_menu/main_menu1/4-2.jpg") + self.MainMenu1_2_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + + #第三页 + self.MainMenu1_3 = self.MainMenu1.add_tile(2, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + #第三页图片 + self.MainMenu1_3_img = lv.img(self.MainMenu1_3) + self.MainMenu1_3_img.set_size(240, 200) + self.MainMenu1_3_img.set_pos(0,60) + self.MainMenu1_3_img.set_src("E:/static/main_menu/main_menu1/4-3.jpg") + self.MainMenu1_3_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + + # #通讯录 + self.MainMenu1_img_contacts = lv.btn(self.MainMenu1_3) + self.MainMenu1_img_contacts.set_size(70, 70) + self.MainMenu1_img_contacts.set_pos(30,60) + self.MainMenu1_img_contacts.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_contacts.add_event_cb(lambda e: self.img_cb(e, "contacts"), lv.EVENT.CLICKED, None) + + # #照片 + self.MainMenu1_img_photo = lv.btn(self.MainMenu1_3) + self.MainMenu1_img_photo.set_size(70, 70) + self.MainMenu1_img_photo.set_pos(140,60) + self.MainMenu1_img_photo.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_photo.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) + + # #设置 + self.MainMenu1_img_setting = lv.btn(self.MainMenu1_3) + self.MainMenu1_img_setting.set_size(70, 70) + self.MainMenu1_img_setting.set_pos(30,190) + self.MainMenu1_img_setting.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_setting.add_event_cb(lambda e: self.img_cb(e, "setting"), lv.EVENT.CLICKED, None) + + # #步数 + self.MainMenu1_img_steps = lv.btn(self.MainMenu1_3) + self.MainMenu1_img_steps.set_size(70, 70) + self.MainMenu1_img_steps.set_pos(30,190) + self.MainMenu1_img_steps.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_steps.add_event_cb(lambda e: self.img_cb(e, "step"), lv.EVENT.CLICKED, None) + + #第四页 + self.MainMenu1_4 = self.MainMenu1.add_tile(3, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + #第四页图片 + self.MainMenu1_4_img = lv.img(self.MainMenu1_4) + self.MainMenu1_4_img.set_size(240, 200) + self.MainMenu1_4_img.set_pos(0,60) + self.MainMenu1_4_img.set_src("E:/static/main_menu/main_menu1/4-4.jpg") + self.MainMenu1_4_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + + # #秒表 + self.MainMenu1_img_stopwatch = lv.btn(self.MainMenu1_4) + self.MainMenu1_img_stopwatch.set_size(70, 70) + self.MainMenu1_img_stopwatch.set_pos(30,60) + self.MainMenu1_img_stopwatch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_stopwatch.add_event_cb(lambda e: self.img_cb(e, "stopwatch"), lv.EVENT.CLICKED, None) + + # #天气 + self.MainMenu1_img_weather = lv.btn(self.MainMenu1_4) + self.MainMenu1_img_weather.set_size(70, 70) + self.MainMenu1_img_weather.set_pos(140,60) + self.MainMenu1_img_weather.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.MainMenu1_img_weather.add_event_cb(lambda e: self.img_cb(e, "weather"), lv.EVENT.CLICKED, None) + + # #工具箱 + self.MainMenu1_img_toolbox = lv.btn(self.MainMenu1_4) + self.MainMenu1_img_toolbox.set_size(70, 70) + self.MainMenu1_img_toolbox.set_pos(30,190) + self.MainMenu1_img_toolbox.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.MainMenu1_img_toolbox.add_event_cb(lambda e: self.img_cb(e, "toolbox"), lv.EVENT.CLICKED, None) + + + # #温度 + self.MainMenu1_img_tem = lv.btn(self.MainMenu1_4) + self.MainMenu1_img_tem.set_size(70, 70) + self.MainMenu1_img_tem.set_pos(140,190) + self.MainMenu1_img_tem.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) + + self.MainMenu1_img_tem.add_event_cb(lambda e: self.img_cb(e, "temperature"), lv.EVENT.CLICKED, None) + + #第五页 + self.MainMenu1_5 = self.MainMenu1.add_tile(4, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + + #微聊 + self.MainMenu1_img_wechat = lv.img(self.MainMenu1_5) + self.MainMenu1_img_wechat.set_size(70, 70) + self.MainMenu1_img_wechat.set_pos(30,60) + self.MainMenu1_img_wechat.set_src("E:/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png") + self.MainMenu1_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu1_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.MainMenu1_img_wechat.add_event_cb(lambda e: self.img_cb(e, "wechat"), lv.EVENT.CLICKED, None) + + + def initialization(self): + pass + def img_cb(self, e, msg): + print("MainMenu2:img_cb:{}".format(msg)) + EventMesh.publish("load_screen", {"screen": "{}".format(msg)}) + + + + +#主菜单风格2,单页 +class MainMenu2(): + NAME = "MainMenu2" + def __init__(self): + print("MainMenu1:__init__") + self.meta = lv.obj() + self.MainMenu2 = lv.tileview(self.meta) + self.MainMenu2.set_scrollbar_mode(0) + self.MainMenu2.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) + #支付宝 + self.MainMenu2_alipay = self.MainMenu2.add_tile(0, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_alipay = lv.img(self.MainMenu2_alipay) + self.MainMenu2_img_alipay.set_size(126, 126) + self.MainMenu2_img_alipay.center() + self.MainMenu2_img_alipay.set_src("E:/static/main_menu/main_menu2/alipay_.jpg") + self.MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_alipay) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("支付宝") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + #拨号盘 + self.MainMenu2_phone = self.MainMenu2.add_tile(1, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_phone = lv.img(self.MainMenu2_phone) + self.MainMenu2_img_phone.set_size(128, 128) + self.MainMenu2_img_phone.center() + self.MainMenu2_img_phone.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg") + self.MainMenu2_img_phone.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_phone.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_phone) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("通话") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #通讯录 + self.MainMenu2_contacts = self.MainMenu2.add_tile(2, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_contacts = lv.img(self.MainMenu2_contacts) + self.MainMenu2_img_contacts.set_size(128, 128) + self.MainMenu2_img_contacts.center() + self.MainMenu2_img_contacts.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg") + self.MainMenu2_img_contacts.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_contacts.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_contacts) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("通讯录") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #心律检测 + self.MainMenu2_heartrate = self.MainMenu2.add_tile(3, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_heartrate = lv.img(self.MainMenu2_heartrate) + self.MainMenu2_img_heartrate.set_size(128, 128) + self.MainMenu2_img_heartrate.center() + self.MainMenu2_img_heartrate.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg") + self.MainMenu2_img_heartrate.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_heartrate.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_heartrate) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("心率") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #血样检测 + self.MainMenu2_spo2 = self.MainMenu2.add_tile(4, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_spo2 = lv.img(self.MainMenu2_spo2) + self.MainMenu2_img_spo2.set_size(128, 128) + self.MainMenu2_img_spo2.center() + self.MainMenu2_img_spo2.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg") + self.MainMenu2_img_spo2.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_spo2.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_spo2) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("血氧") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #工具箱 + self.MainMenu2_toolbox = self.MainMenu2.add_tile(5, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_toolbox = lv.img(self.MainMenu2_toolbox) + self.MainMenu2_img_toolbox.set_size(128, 128) + self.MainMenu2_img_toolbox.center() + self.MainMenu2_img_toolbox.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg") + self.MainMenu2_img_toolbox.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_toolbox) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("工具箱") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #设置 + self.MainMenu2_setting = self.MainMenu2.add_tile(6, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_setting = lv.img(self.MainMenu2_setting) + self.MainMenu2_img_setting.set_size(128, 128) + self.MainMenu2_img_setting.center() + self.MainMenu2_img_setting.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg") + self.MainMenu2_img_setting.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_setting) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("设置") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #体温测量 + self.MainMenu2_temperature = self.MainMenu2.add_tile(7, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_temperature = lv.img(self.MainMenu2_temperature) + self.MainMenu2_img_temperature.set_size(128, 128) + self.MainMenu2_img_temperature.center() + self.MainMenu2_img_temperature.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg") + self.MainMenu2_img_temperature.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_temperature.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_temperature) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("体温") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + #微聊 + self.MainMenu2_wechat = self.MainMenu2.add_tile(8, 0, lv.DIR.LEFT | lv.DIR.RIGHT) + self.MainMenu2_img_wechat = lv.img(self.MainMenu2_wechat) + self.MainMenu2_img_wechat.set_size(128, 128) + self.MainMenu2_img_wechat.center() + self.MainMenu2_img_wechat.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg") + self.MainMenu2_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE) + self.MainMenu2_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) + self.label = lv.label(self.MainMenu2_wechat) + self.label.set_pos(0, 280) + self.label.set_size(240, 40) + self.label.set_text("微聊") + self.label.set_long_mode(lv.label.LONG.WRAP) + self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) + + + + self.MainMenu2_img_phone.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_toolbox.add_event_cb(lambda e: self.img_cb(e, "toolbox"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_setting.add_event_cb(lambda e: self.img_cb(e, "setting"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_heartrate.add_event_cb(lambda e: self.img_cb(e, "heartrate"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_contacts.add_event_cb(lambda e: self.img_cb(e, "contacts"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_wechat.add_event_cb(lambda e: self.img_cb(e, "wechat"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_spo2.add_event_cb(lambda e: self.img_cb(e, "spo2"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_temperature.add_event_cb(lambda e: self.img_cb(e, "temperature"), lv.EVENT.CLICKED, None) + self.MainMenu2_img_alipay.add_event_cb(lambda e: self.img_cb(e, "alipay_open"), lv.EVENT.CLICKED, None) + def initialization(self): + pass + def img_cb(self, e, msg): + print("MainMenu2:img_cb:{}".format(msg)) + EventMesh.publish("load_screen", {"screen": "{}".format(msg)}) + + + +